2010-04-28 423 views
11

Soy nuevo en CodeIgniter y acabo de descubrir las dificultades con el método GET de pasar variables a través de la URL (por ejemplo, domain.com/page.php?var1=1 & var2 = 2).CodeIgniter: Pasar variables a través de URL - alternativas a usar GET

Entiendo que un enfoque es pasar las variables en los segmentos de URI, pero todavía no he descubierto cómo hacerlo, ya que parece crear la expectativa de tener una función en el controlador nombrado como el segmento de URI específico ????

De todos modos En lugar de usar GET, he decidido usar POST adaptando un botón de envío (disfrazado como un enlace) con las variables en los campos de entrada ocultos. He creado la siguiente solución que parece funcionar bien, pero me pregunto si estoy en el camino correcto o si hay una manera más fácil de pasar variables a través de un enlace dentro de CodeIgniter.

He creado la clase siguiente en application/libraries/

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class C_variables { 

function variables_via_link($action, $link_text, $style, $link_data) { 
    $attributes = array('style' => 'margin:0; padding:0; display: inline;'); 
    echo form_open($action, $attributes); 
    $attributes = array('class' => $style, 'name' => 'link'); 
    echo form_submit($attributes, $link_text); 
    foreach ($link_data as $key => $value){ 
     echo form_hidden($key, $value); 
    } 
    echo form_close(); 
} 
} 
?> 

Con el siguiente CSS:

/* 
SUBMIT BUTTON AS LINK 
adapted from thread: http://forums.digitalpoint.com/showthread.php?t=403667 
Cross browser support (apparently). 
*/ 
.submit_as_link { 
background: transparent; 
border-top: 0; 
border-right: 0; 
border-bottom: 1px solid #00F; 
border-left: 0; 
color: #00F; 
display: inline; 
margin: 0; 
padding: 0; 
    cursor: hand /* Added to show hand when hovering */ 
} 

*:first-child+html .submit_as_link { /* hack needed for IE 7 */ 
border-bottom: 0; 
text-decoration: underline; 
} 

* html .submit_as_link { /* hack needed for IE 5/6 */ 
border-bottom: 0; 
text-decoration: underline; 
} 

Enlace entonces ha creado usando el siguiente código en la vista:

<?php 
$link = new C_variables; 
$link_data=array('var1' => 1, 'var2' => 2); 
$link ->variables_via_link('destination_page', 'here is a link!', 
'submit_as_link', $link_data); 
?> 

Gracias por su ayuda ...

Respuesta

34

Para ser sincero, crear un formulario para realizar el trabajo de hipervínculos es un poco semántico, no no.

Codeigniter por defecto elimina por completo cualquier parámetro $ _GET. Así que sin habilitar las cadenas de consulta en la configuración, no se puede hacer lo siguiente:

http://my-domain.com/script/?param=1&param2=foo

Para un principiante, direcciones URL basadas segmento son un poco de una curva de aprendizaje, pero pronto tiene sentido. Un buen ejemplo de producción de cómo funcionan las URL basadas en segmentos en la práctica es Stack Overflow.

Así que si quería copiar página de vista de la pregunta de desbordamiento de la pila con el siguiente URL en CodeIgniter:

http://stackoverflow.com/questions/2728978/codeigniter-passing-variables-via-url-alternatives-to-using-get 

En su controlador por defecto crear el siguiente método:

public function questions() 
{ 
    $question_id = $this->uri->segment(2); 

    // now do something with our question_id 
} 

El tercer segmento (pregunta título slug) es efectivamente ignorado. Pero se puede agarrar con lo siguiente:

$question_title = $this->uri->segment(3); 

Más información aquí: http://ellislab.com/codeigniter/user-guide/libraries/uri.html

Si no te gusta la idea de tener que nombrar a un método en el controlador con el primer segmento URI. Puede crear una ruta personalizada en la configuración de sus rutas.

Entonces, imagine que crea un controlador llamado questions_controller.php, y tiene un método llamado show_question_by_id().Para mantener el URI /questions/1234/some-text-here estilo pero manejarlo con el controlador/método anterior, se puede crear la siguiente ruta:

$route['question/(:num)'] = "questions_controller/show_question_by_id/$1"; 

Más información aquí: http://ellislab.com/codeigniter/user-guide/general/routing.html

Si usted desea tener un número infinito de parámetros en su URL, o no sabe qué parámetros esperar, por ejemplo mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123

Se puede dividir estos en una matriz asociativa utilizando el método URI $this->uri->uri_to_assoc(1) para obtener lo siguiente:

[array] 
(
    'param1' => '12' 
    'param2' => 'foo' 
    'param3' => 'bar' 
    'param3' => 'baz' 
    'another-param' => 'xyz-123' 
) 

entonces se podría manejar esto exactamente como si estuviera usando el array $ _GET. A continuación, puede combinar este enfoque con rutas personalizadas para proporcionar prácticamente cualquier URI y estructura de aplicación que desee. También obtiene la ventaja de que cada parámetro y segmento se ha limpiado automáticamente. Es un poco una curva de aprendizaje, y puede parecer un trabajo extra para empezar, pero en realidad es bastante flexible y te ayuda a construir una aplicación bien estructurada.

+0

Gracias, este es el tipo de ayuda que estaba buscando, aunque creo que puede tomar un poco de tiempo darme cuenta de cómo usar los segmentos de URI correctamente. –

+1

es una buena solución académica. Pero Twitter, eBay y otros siguen usando get. También obtener es un estándar (sí, de hecho es protocolo HTTP!). Por lo tanto, todas esas discusiones no tienen sentido. El verbo HTTP GET no es compatible con Codeigniter, lo que hace que el marco sea algo inutilizable, dando el hecho de que es un marco http. Buena solución, pero no es para la web. –

10

¿Por qué publicas tu CSS si estás luchando con Query Strings?

Locura.

De todos modos, puede volver a crear acceso a la cadena de consulta de varias maneras en CodeIgniter.

uri_to_assoc()

En primer lugar hay los maravillosos segmentos asociativos URI.

Ejemplo URL: http://example.com/controller/method/name/value/name2/value2

Usted puede utilizar el siguiente código para acceder a estos dos valores:

$get = $this->uri->uri_to_assoc(); 
echo $get['name']; // value 
echo $get['name2']; // value2 

Por supuesto, esto es un sustituto de las cadenas de consulta, pero si se puede utilizar esto hazlo

parse_str()

Si tiene código global como un gancho o MY_Controller se puede volver a poblar $ _GET con la siguiente de una sola línea:

parse_str($_SERVER['QUERY_STRING', $_GET'); 

REQUEST_URI

Establezca su $ config ['uri_protocol'] en "REQUEST_URI" y habilite las cadenas de consulta más abajo. REQUEST_URI no funcionará en todos los servidores, por lo que este no es el método más perfecto, aunque es el más fácil.

+3

Gracias por su ayuda, aunque no veo de dónde vienes con el comentario 'Madness'?!? Mi publicación trata sobre el diseño de un cuadro de envío para que aparezca como un enlace, parecía bastante sensato incluir el CSS ... Algunos de nosotros podríamos tener menos experiencia en términos de codificación, pero no necesariamente enojados ... –

+0

diseñando el cuadro de envío? ¿Estás seguro de que estás en el sitio correcto Q y A? –

+1

Cálmate John, solo divirtiéndote un poco. ¿El mensaje fue de ayuda? –

0

utilizo este y funciona:

primero se ponen las variables en la cadena de consulta como esta:

redirect('mycontroler/senddata/'.$name.'/'.$email); 

en mycontroler recibo parámetros de esta manera:

public function senddata($name,$email) 
{} 
Cuestiones relacionadas