2010-04-28 12 views
11

Sono nuovo di CodeIgniter e ho appena scoperto le difficoltà utilizzando il metodo GET di passare le variabili tramite l'URL (ad esempio domain.com/page.php?var1=1 & var2 = 2).CodeIgniter: passaggio di variabili tramite URL - alternative all'utilizzo di GET

Io capisco che un approccio è quello di passare le variabili nei segmenti URI ma non hanno ancora capito come farlo ancora come sembra creare l'aspettativa di avere una funzione nel controller chiamata come segmento URI specifico ????

In ogni caso, invece di utilizzare GET, ho deciso di utilizzare il POST adattando un pulsante di invio (mascherato come collegamento) con le variabili nei campi di input nascosti. Ho creato la seguente soluzione che sembra funzionare bene, ma mi chiedo se sono sulla strada giusta qui o se c'è un modo più semplice per passare le variabili tramite un collegamento all'interno di CodeIgniter?

ho creato la seguente classe di applicazioni/librerie/

<?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 il seguente 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; 
} 

link quindi creato utilizzando il seguente codice nella visualizzazione:

<?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); 
?> 

Grazie per il vostro aiuto ...

risposta

34

Per essere onesti, creare un modulo per eseguire il lavoro di collegamenti ipertestuali è un po 'un semantico no no.

Il codice di default elimina completamente i parametri $ _GET. Quindi, senza consentendo stringhe di query nella configurazione, non è possibile effettuare le seguenti operazioni:

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

Per un principiante, URL segmento base sono un po 'di una curva di apprendimento, ma ben presto dare un senso. Un buon esempio di produzione di come funzionano gli URL basati sui segmenti è Stack Overflow!

Quindi, se si voleva copiare pagina di visualizzazione domanda di Stack Overflow con il seguente URL in CodeIgniter:

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

Nel vostro controller di default creare il seguente metodo:

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

    // now do something with our question_id 
} 

Il terzo segmento (domanda titolo slug) viene effettivamente ignorato. Ma si potrebbe afferrare con la seguente:

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

Maggiori informazioni qui: http://ellislab.com/codeigniter/user-guide/libraries/uri.html

Se non ti piace l'idea di dover nominare un metodo nel controller con il primo segmento URI. È possibile creare un percorso personalizzato nella configurazione dei percorsi.

Quindi, immaginate di creare un controller chiamato questions_controller.php e di avere un metodo chiamato show_question_by_id().Per mantenere l'URI /questions/1234/some-text-here stile, ma gestirlo con il controller/metodo di cui sopra, è possibile creare il seguente percorso:

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

Maggiori informazioni qui: http://ellislab.com/codeigniter/user-guide/general/routing.html

Se si desidera avere un numero infinito di parametri il tuo URL, o non sai quali parametri aspettarti ad es mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123

È possibile dividere questi in un array associativo utilizzando il metodo URI $this->uri->uri_to_assoc(1) ottenere le seguenti:

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

si potrebbe quindi gestire questo esattamente come se si stesse utilizzando l'array $ _GET. È quindi possibile combinare questo approccio, con percorsi personalizzati per fornire praticamente qualsiasi URI e struttura dell'applicazione che ti piace. Ottieni anche il vantaggio che ogni parametro e segmento sono stati automaticamente ripuliti. È un po 'una curva di apprendimento e può sembrare un lavoro extra, ma in realtà è piuttosto flessibile e ti aiuta a creare un'applicazione ben strutturata.

+0

Grazie, questo è il tipo di aiuto che stavo cercando, anche se penso che potrebbe volerci un po 'di tempo per capire come usare correttamente i segmenti URI. –

+1

è una buona soluzione accademica. Ma twitter, ebay e altri continuano a usare get. Anche ottenere è uno standard (sì, in effetti è un protocollo HTTP!). Quindi tutte le discussioni non hanno alcun senso. Il verbo HTTP GET non è supportato da Codeigniter, che rende il framework un po 'inutilizzabile, dando il fatto che si tratta di un framework http. Buona soluzione, ma non è per il web. –

10

Perché mai stai postando il tuo CSS se stai lottando con le stringhe di query?

Follia.

In ogni caso, è possibile ricreare l'accesso alla stringa di query in diversi modi in CodeIgniter.

uri_to_assoc()

primo luogo vi sono le meravigliose segmenti associativi URI.

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

È possibile utilizzare il seguente codice per accedere a questi due valori:

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

Questo naturalmente è un sostituto per stringhe di query, ma se si può usare questo lo fa

parse_str()

Se si dispone di codice globale come un gancio o MY_Controller si può ripopolare $ _GET con il seguente one-liner:

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

REQUEST_URI

Imposta $ config ['uri_protocol'] su "REQUEST_URI" e abilita le stringhe di query più in basso. REQUEST_URI non funzionerà su tutti i server, quindi questo non è il metodo più perfetto anche se è il più semplice.

+3

Grazie per il tuo aiuto, anche se non vedo da dove arrivi il commento di 'Madness'?!? Il mio post riguarda lo stile di una casella di invio per apparire come collegamento, sembrava abbastanza ragionevole includere il CSS ... Alcuni di noi potrebbero essere meno esperti in termini di codifica, ma non necessariamente pazzi ... –

+0

styling la casella di invio? Sei sicuro di essere sulla giusta Q e un sito? –

+1

Calmati John, divertiti un po '. Il post è stato di aiuto? –

0

Io uso questa e funziona:

prima si mette il variabili stringa di query come questa:

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

in mycontroler ricevo parametri in questo modo:

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