[RESOLU]Utilisation de la fonction l()

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

J'utilise la fonction l() avec l'option query pour passer un argument via le lien.
Je récupère cet argument via $_GET, ça fonctionne, mais je me demande si en procédant de cette manière, je respecte les standards de programmation pour Drupal.
Si quelqu'un à une info à ce sujet merci de m'en faire part.

Cordialement...

Forum : 
Version de Drupal : 

Hello,

Pour ma part, je fais effectivement un lien en utilisant la fonction l() (ex: l('Cliquez ici', 'mon_lien/ma_variable_get') ) et ce sera mon menu qui va ensuite gerer la variable:

function mon_module_menu() {
$items['mon_lien/ma_variable'] = array(
'title' => 'test',
'description' => 'test.',
'page callback' => 'mon_module_fonction',
'page arguments' => array(1),

);
return $items
}

C'est donc 'page arguments' qui précise que dans cette url (à savoir 'mon_lien/ma_variable') la deuxième partie de l'url est un argument ( sachant qu'une url est divisé en plusieurs partie, délimité par le caractère slash "/" et donc ici 'mon_lien' est la première partie, soit array(0) et 'ma_variable' ma deuxieme partie, soit array(1)).

Ainsi, ta fonction de callback mon_module_fonction devra contenir une variable d'entrée. (ex: mon_module_fonction($var){...} )

Je ne sais pas si c'est drupalien comme utilisation, mais vu que ca fonctionne, je pense que oui :)

Salut, et merci de ta réponse.
Intéressant ta façon de procédé.
Moi après avoir eu du mal à comprendre le truc sur la doc Drupal, je fais ça:

Définir la paire clé/valeur:

$options = array(
             'query' => array(
                    'cle' => $valeur),
             );

Créer le lien:

l(t('mon_texte'),'mon_lien',$options)

Récupérer la paire:

$recup = $_GET['cle'];

Pour être clair, j'affiche une liste de terme qu'un admin peut modifier avec un lien 'Editer' si le lien est cliqué je rappelle la même page mais avec un $form pour éditer le terme.
ca fonctionne aussi donc bon pas de prise de tête ;-)

mouize
Je ne suis pas sur de comprendre le pourquoi de ta méthode :

si tu prends comme chemin "mon_lien"

et que tu pointes sur ta page avec mon_lien/ma_variable

ma variable est automatiquement transmis à ta fonction en tant que premier argument et disponible automatiquement au sein de ta fonction.

du coup si il y a un hook_menu derrière il suffit de transmettre un truc du genre

<?php
l
('mon texte',"mon_chemin/$mavariable")
?>

et celle-ci devient disponible dans la fonction callback si path est défini à "mon_chemin".
enfin je crois !

Pourquoi on ne pourrait pas utiliser une variable directement dans le chemin du lien au fait; quel est l'intérêt de passer par les options?

Je n'ai pas parlé des options dans ma réponse, tu mélanges.

Mais sinon je te rejoins sur le fonctionnement. Dans la fonction l(), tu as dans l'url que tu fourni destination/variable et dans le menu, il faut préciser que l'url possède une variable (d'où le 'page argument' => array(1)), sinon il prendra l'url juste pour une destination normal et ne trouvera pas la page destination/variable.

Enfin, à l'epoque ou j'avais lu le tuto sur le fonctionnement du hook menu, c'était comme ça :p Si maintenant c'est géré automatiquement, tant mieux ^^

re-hello
Pour les options je posais en fait la question à guitarman, j'ai pas précisé :-)
Oui le dispatachage est automatique à ma connaissance et sur drupal 5 : tout ce qui "dépasse" du chemin de base est transformé automatiquement en arguments utilisables par la fonction, mais peut être que tout a changé avec drupal 6 !!

sur drupal 5

par exemple avec
path => 'test',
'callback' => 'test'

puis

function test($name=NULL){
return "hello $name";
}

Chaque partie supplémentaire de l'url devient un argument possible pour la fonction; l'ordre étant le même que celui de l'url. Par contre si j'utilise callback arguments, c'est lui qui passe en premier et pas le premier argument de l'url

si tu te rends à l'adresse test/bibi la fonction retournera
hello "bibi"

Maintenant je suis surement à la rue par rapport aux dernières évolutions :-(

Salut à tous les deux, et merci pour vos réponses instructives.

Pourquoi utiliser les options ?
Bah je débute dans le développement sur Drupal et bien qu'ayant fait du php/mysql il y a quelque temps, je suis loin de maitriser la philosophie Drupal.
Donc ne sachant pas trop comment m'y prendre j'ai regarder la doc en ligne qui parlait d'options pour passer des arguments.
Mais après vous avoir lus et consulté l'excellent 'Pro Drupal Development', ainsi que quelque tutos, j'ai opté pour la solution proposé par nyl auster qui fonctionne bien.
J'ai aussi teste ta version mouize (utilisé dans 'Pro Drupal Development' d'ailleurs),
mais dans mon cas c'est moins efficace parce qu'au premier appel de la fonction la valeur de la variable n'est pas défini. Si je ne précise pas de 'page arguments' le callback ne s'exécute pas, si j'en précise un, j'ai toujours la même valeur. On peut aussi à la place du % utiliser %truc et appeler un fonction truc_to_arg, et là tout fonctionne correctement. Mais bon pourquoi compliqué le code si on peut faire simple.

Il me reste un détail à régler, au premier appel de ma liste, seule la liste apparait, puis quand on clique sur modifier je fais un appel récursif pour afficher le formulaire de modification au dessus de ma liste. Jai essayer de passer l'info à mon formulaire via form_set_value, $form_state mais rien n'y fait. Si vous avez eu le courage de lire jusqu'ici et qu'en plus vous avez un suggestion la prochaine fois que je passe devant une église je vous fait bruler un cierge ;-).
Les dernières lignes du callback pour etre clair.

$output .=drupal_get_form('modif_service_form');
$output .= theme('table', $header, $rows);
return $output;

Encore merci et à+

EDIT : attention, je code sur drupal 5 et pas le 6

Hello
Je ne sais pas si je peux t'aider, je débute aussi avec le framework. Si je saisis bien tu veux transmettre des informations pour prépeuplé ton formulaire?
Il me semble que drupal_get_form peut prendre des arguments : si on met un objet node, il préremplit automatiquement ton formulaire il me semble; dans le cas où ton formulaire est celui d'un node avec ou sans champs CCK.

Sinon voici un petit exemple d'un truc que je fais dans ce genre :
mon formulaire : il prend en argument l'id d'un node qui m'intéresse
$liste_partage=liste_partage($nid) : cette fonction va chercher dans la base de données les infos correspondants à cet id.

<?php
function update_partage_form($nid){
  
$liste_partage=liste_partage($nid);
   
$form['names'] = array(
     
'#type' => 'textfield',
       
'#title' => 'Partager ce livre avec',
       
'#description' => 'Entrez une liste de membre séparés par une virgule',
    
'#default_value' => $liste_partage['autocomplete'],
       
'#required' => TRUE,
       
'#autocomplete_path' => 'publication_user/autocomplete', //chemin menant à la fonction autocomplete
       
'#maxlength' => 500,
  );
 
//transmettre le nid pour la fonction submit
  
$form['nid_livre'] = array(
     
'#type' => 'textfield',
    
'#value' => $nid,
    
'#access' => FALSE
   
);
 
$form['submit'] = array(
    
'#type' => 'submit',
       
'#value' => 'Enregistrer ces modifications'
 
);
 return
$form;
}
?>

mon appel à drupal_get_form ressemble à ça

<?php
$output
.=drupal_get_form('update_partage_form', arg(1));
?>

et ma fonction appelée "liste partage" ressemble à ça

<?php
function liste_partage($nid){
//récupérer les membres avec qui ce livre est partagé
$sql="SELECT * FROM {content_field_membres_autorises} ma JOIN {node} n ON ma.nid=n.nid JOIN {users} u ON ma.field_membres_autorises_uid=u.uid WHERE ma.nid=%d";
$resultat=db_query($sql, $nid);
bla blabla...
return
"un array qui contient toutes les valeurs qui m'intéressent"
?>

y'a peut être mieux comme méthode mais ça fonctionne

Re,

Edit : Nyl a super bien résumé :)

Pour revenir à ce que tu dis au début, il suffit d'initialiser l'argument de la fonction de callback a Null

function mon_module_fonctioncallback($ma_variable='NULL'){ .... }

OK les gars, j'avais bien essayé un truc dans ce style mais si je fais:

$output .=drupal_get_form('modif_service_form', $var);

si je fais un echo ici il me retourne array au lieu du contenu de ma variable.

function modif_service_form($var) {
    echo $var;

De fait avec la version 6.x il faut d'abord passer le form_state comme ça:

function modif_service_form($form_state, $var) {
    echo $var;

et la ça marche nickel !
a+