Comment passer une variable d'un module personnalisé à son fichier modèle?

8

J'ai besoin de connaître la méthode la plus simple pour passer une variable d'un module personnalisé à son fichier de modèle. J'ai créé le custom.module et placé custom.tpl.php dans le dossier du module.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {

    $setVar = 'this is custom module';
    return theme('custom', $setVar);    
}

j'ai ajouté une fonction de thème mais cela ne fonctionne pas, quelqu'un peut-il me suggérer ce qui ne va pas avec ce code

function theme_custom($arg) {
  return $arg['output'];
}

function custom_theme() {
  return array(
    'Bluemarine' => array(
        'variables' => 'output',
        'template' => 'Bluemarine',
     ),
  );
}
Kamran Akhter
la source

Réponses:

6

Indépendamment de la version Drupal pour laquelle vous écrivez le module, il y a deux erreurs dans votre code:

  • Vous définissez "Bluemarine" comme fonction de thème, mais ensuite vous appelez theme('custom'), ce qui appelerait la fonction de thème "personnalisé"
  • Si vous définissez "personnalisé" comme une fonction de thème qui utilise un fichier de modèle, elle theme_custom()n'est jamais appelée

Si vous écrivez du code pour Drupal 6, alors le code doit être similaire au suivant. Je suppose que le nom de la fonction de thème est custom.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_theme() {
  return array(
    'custom' => array(
      'arguments' => array('output' => NULL),
      'template' => 'custom',
     ),
  );
}

function custom_page() {
    $output = 'This is a custom module';
    return theme('custom', $output);    
}

function theme_custom($output) {
}

Le fichier modèle aura accès à $output, et à toutes les variables définies template_preprocess_custom(), si votre module l'implémente.

Par exemple, vous pouvez implémenter du code similaire au suivant:

function template_preprocess_custom(&$variables) {
  if ($variables['output'] == 'This is a custom module') {
    $variables['append'] = ' and I wrote it myself.";
  }
}

Avec ce code, le fichier modèle a accès à $outputet $append.

Comme exemple de fonction de thème qui utilise un fichier modèle, vous pouvez regarder theme_node () , qui est défini dans node_theme () , et qui utilise node.tpl.php comme fichier modèle; la fonction de prétraitement implémentée par le module Node pour cette fonction de thème est template_preprocess_node () .

kiamlaluno
la source
Merci Kiam, évidemment manqué le premier commentaire d'OP sur l'utilisation de D6. +1
Laxman13
Merci Kiam, template_preprocess_custom (& $ variables) a fait l'affaire
Kamran Akhter
Maintenant, je veux déplacer tpl vers le dossier du thème, comment puis-je faire cela?
Kamran Akhter
@KamranAkhter C'est une question différente. :-)
kiamlaluno
3

Vous appelez la mauvaise fonction de thème. Au lieu de function theme_customcela devrait l'être function theme_Bluemarine. Vous devez également passer un tableau à la partie variable de hook_theme () . Voir un exemple simple ici .

En utilisant votre exemple (après avoir changé le modèle et la fonction de thème en custom):

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {
  $setVar = 'this is custom module';
  return theme('custom', array('output' => $setVar));
}

function custom_theme() {
  $path = drupal_get_path('module', 'custom');
  return array(
    'custom' => array(
        'variables' => array('output' => null),
        'template' => 'custom',
     ),
  );
}

Maintenant dans custom.tpl.php juste besoin <?php print $output; ?>

Laxman13
la source
Merci pour la réponse, l'exemple que vous avez donné est le module de nœud et j'ai un module non de nœud.J'ai juste besoin d'un moyen de passer une variable au fichier tpl, en utilisant l'aide de drupal 6.plz
Kamran Akhter
Merci pour la réponse, cela me donne l'erreur Aucun fichier ou répertoire tel qu'il attend le fichier custom.tpl.php dans le dossier du module que j'ai déjà dans le code bluemarine sera remplacé par la coutume. Bluemarine est le thème drupal que j'utilise.
Kamran Akhter,
changé le code ci-dessus et en me donnant l'écran blanc blanc que dois-je faire plz help
Kamran Akhter
J'ai changé le code et je le fais travailler sur mon site.
Laxman13
Je viens de copier coller le code ci-dessus mais cela ne fonctionne pas
Kamran Akhter