web-dev-qa-db-de.com

CodeIgniter: Variablen über URL übergeben - Alternativen zur Verwendung von GET

Ich bin neu bei CodeIgniter und habe gerade die Schwierigkeiten bei der Übergabe von Variablen über die URL mit der GET-Methode entdeckt (z. B. domain.com/page.php?var1=1&var2=2).

Ich gehe davon aus, dass ein Ansatz darin besteht, die Variablen in den URI-Segmenten zu übergeben, aber noch nicht ganz geklärt ist, wie dies zu tun ist, da dies die Erwartung zu schaffen scheint, dass eine Funktion in dem Controller als das spezifische URI-Segment bezeichnet wird.

Anstelle von GET habe ich mich entschieden, POST zu verwenden, indem ich einen als Link getarnten Submit-Button mit den Variablen in verborgenen Eingabefeldern anpasse. Ich habe die folgende Lösung erstellt, die gut funktioniert, aber frage mich, ob ich hier auf dem richtigen Weg bin oder ob es einfacher ist, Variablen über einen Link in CodeIgniter zu übergeben.

Ich habe die folgende Klasse in application/libraries erstellt /

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

Mit folgendem 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;
}

Verknüpfen Sie den Link dann mit folgendem Code in der VIEW:

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

Danke für Ihre Hilfe...

10
John Durrant

Um ehrlich zu sein, ist das Erstellen eines Formulars für die Ausführung von Hyperlinks ein bisschen semantisch nein.

Standardmäßig entfernt Codeigniter alle $ _GET-Parameter vollständig. Ohne die Abfragezeichenfolgen in der Konfiguration zu aktivieren, können Sie Folgendes nicht tun:

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

Für Anfänger sind segmentbasierte URLs zwar eine Lernkurve, machen aber bald Sinn. Ein gutes Produktionsbeispiel für die praktische Funktionsweise von segmentbasierten URLs ist Stack Overflow!

Wenn Sie die Frage-Ansichtsseite von Stack Overflow mit der folgenden URL in Codeigniter kopieren möchten:

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

Erstellen Sie in Ihrem Standardcontroller die folgende Methode:

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

  // now do something with our question_id
}

Das dritte Segment (Fragentitel-Slug) wird effektiv ignoriert. Aber Sie könnten es mit dem folgenden greifen:

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

Mehr Informationen hier: https://codeigniter.com/user_guide/libraries/uri.html

Wenn Ihnen die Idee nicht gefällt, dass Sie eine Methode in Ihrem Controller mit dem ersten URI-Segment benennen müssen. Sie können in Ihrer Routenkonfiguration eine benutzerdefinierte Route erstellen.

Stellen Sie sich vor, Sie erstellen einen Controller mit dem Namen questions_controller.php und verfügen über eine Methode mit dem Namen show_question_by_id(). Um den URI im /questions/1234/some-text-here-Stil beizubehalten, ihn aber mit der obigen Controller/Methode zu behandeln, können Sie die folgende Route erstellen:

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

Mehr Informationen hier: https://codeigniter.com/user_guide/general/routing.html

Wenn Sie eine unendliche Anzahl von Parametern in Ihrer URL haben möchten oder nicht wissen, welche Parameter Sie erwarten, z. mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123

Sie können diese mithilfe der URI-Methode $this->uri->uri_to_assoc(1) in ein assoziatives Array aufteilen, um Folgendes zu erhalten:

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

Sie könnten dann genau so vorgehen, als würden Sie das $ _GET-Array verwenden. Sie können diesen Ansatz dann mit benutzerdefinierten Routen kombinieren, um Ihnen praktisch jede gewünschte URI- und Anwendungsstruktur zu geben. Sie erhalten auch den Vorteil, dass jeder Parameter und jedes Segment automatisch bereinigt wurde. Es ist eine kleine Lernkurve und kann anfangs wie zusätzliche Arbeit erscheinen, ist jedoch ziemlich flexibel und hilft Ihnen, eine gut strukturierte Anwendung zu erstellen.

33
rbaker86

Warum veröffentlichen Sie Ihr CSS, wenn Sie mit Query Strings kämpfen?

Wahnsinn.

Sie können den Zugriff auf die Abfragezeichenfolge in CodeIgniter auf verschiedene Weise neu erstellen. 

uri_to_assoc ()

Erstens gibt es die wunderbaren assoziativen URI-Segmente.

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

Mit dem folgenden Code können Sie auf diese beiden Werte zugreifen:

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

Dies ist natürlich ein Ersatz für Abfragezeichenfolgen, aber wenn Sie dies tun können, tun Sie es.

parse_str ()

Wenn Sie globalen Code wie einen Hook oder MY_Controller haben, können Sie $ _GET mit dem folgenden Einzeiler erneut auffüllen:

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

REQUEST_URI

Setzen Sie Ihre $ config ["uri_protocol"] auf "REQUEST_URI" und aktivieren Sie die Abfragezeichenfolgen weiter unten. REQUEST_URI funktioniert nicht auf allen Servern, daher ist dies nicht die perfekteste Methode, auch wenn dies die einfachste ist.

10
Phil Sturgeon

Ich benutze das und es funktioniert:

zuerst setzen Sie Ihre Variablen wie folgt in die Abfragezeichenfolge:

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

in mycontroler erhalte ich Parameter auf diese Weise:

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