web-dev-qa-db-fra.com

CodeIgniter: Passage de variables via une URL - alternatives à l'utilisation de GET

CodeIgniter est nouveau pour moi et je viens de découvrir les difficultés rencontrées avec la méthode GET pour transmettre des variables via l’URL (par exemple, domain.com/page.php?var1=1&var2=2).

Je suppose qu'une approche consiste à passer les variables dans les segments d'URI mais je n'ai pas encore compris comment le faire, car cela semble créer l'attente d'une fonction dans le contrôleur nommée comme le segment d'URI spécifique ????

Quoi qu'il en soit Au lieu d'utiliser GET, j'ai décidé d'utiliser POST en adaptant un bouton d'envoi (déguisé en lien) avec les variables dans les champs de saisie masqués. J'ai créé la solution suivante qui semble bien fonctionner, mais je me demande si je suis sur la bonne voie ou s'il existe un moyen plus simple de passer des variables via un lien dans CodeIgniter?

J'ai créé la classe suivante dans 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();
 }
}
?>

Avec le CSS suivant:

/* 
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;
}

Le lien a ensuite été créé à l'aide du code suivant dans la vue:

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

Merci de votre aide...

10
John Durrant

Pour être honnête, créer un formulaire pour effectuer le travail des hyperliens est un peu un non sémantique.

Par défaut, Codeigniter supprime complètement les paramètres $ _GET. Donc, sans activer les chaînes de requête dans la configuration, vous ne pouvez pas faire ce qui suit:

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

Pour un débutant, les URL basées sur les segments constituent un peu une courbe d’apprentissage, mais ont tout de suite un sens. Un bon exemple de production du fonctionnement pratique des URL de segment est le débordement de pile!

Donc, si vous voulez copier la page de vue des questions de Stack Overflow avec l'URL suivante dans codeigniter:

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

Dans votre contrôleur par défaut, créez la méthode suivante:

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

  // now do something with our question_id
}

Le troisième segment (slug title question) est effectivement ignoré. Mais vous pouvez le saisir avec ce qui suit:

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

Plus d'informations ici: https://codeigniter.com/user_guide/libraries/uri.html

Si vous n'aimez pas l'idée de devoir nommer une méthode dans votre contrôleur avec le premier segment d'URI. Vous pouvez créer un itinéraire personnalisé dans la configuration de vos itinéraires.

Alors, imaginez que vous créez un contrôleur appelé questions_controller.php et que vous utilisiez une méthode appelée show_question_by_id(). Pour conserver l'URI de style /questions/1234/some-text-here tout en le manipulant avec le contrôleur/la méthode ci-dessus, vous pouvez créer l'itinéraire suivant:

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

Plus d'informations ici: https://codeigniter.com/user_guide/general/routing.html

Si vous souhaitez avoir un nombre infini de paramètres dans votre URL ou ne savez pas quels paramètres vous attendre, par exemple. mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123

Vous pouvez les scinder en un tableau associatif à l'aide de la méthode $this->uri->uri_to_assoc(1) URI pour obtenir les éléments suivants:

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

Vous pouvez alors gérer cela exactement comme si vous utilisiez le tableau $ _GET. Vous pouvez ensuite combiner cette approche avec des itinéraires personnalisés pour vous donner pratiquement n'importe quel URI et structure d'application que vous aimez. Vous bénéficiez également du fait que chaque paramètre et chaque segment ont été nettoyés automatiquement. C'est un peu une courbe d'apprentissage, et peut sembler un travail supplémentaire pour commencer, mais est en fait assez flexible et vous aide à construire une application bien structurée.

33
rbaker86

Pourquoi diable publiez-vous votre CSS si vous vous débattez avec Query Strings?

La démence.

Quoi qu'il en soit, vous pouvez recréer l'accès à la chaîne de requête de plusieurs manières dans CodeIgniter. 

uri_to_assoc ()

Il y a tout d'abord les merveilleux segments d'URI associatifs.

Exemple d'URL: http://example.com/controller/method/name/value/name2/value2

Vous pouvez utiliser le code suivant pour accéder à ces deux valeurs:

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

Ceci, bien sûr, remplace les chaînes de requête, mais si vous pouvez l'utiliser, faites-le.

parse_str ()

Si vous avez un code global comme un crochet ou MY_Controller , vous pouvez re-peupler $ _GET avec la ligne suivante:

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

REQUEST_URI

Définissez votre $ config ['uri_protocol'] sur "REQUEST_URI" et activez les chaînes de requête plus bas. REQUEST_URI ne fonctionnera pas sur tous les serveurs, ce n'est donc pas la méthode la plus parfaite, même si c'est la plus simple.

10
Phil Sturgeon

J'utilise ceci et ça marche:

d'abord, vous mettez vos variables dans la chaîne de requête comme ceci:

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

dans mycontroler, je reçois les paramètres de cette façon:

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