Как передать переменную из пользовательского модуля в файл шаблона?

8

Мне нужно знать самый простой способ передачи переменной из пользовательского модуля в его файл шаблона. Я создал custom.module и поместил custom.tpl.php в папку модуля.

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

я добавил функцию темы, но она не работает, кто-нибудь может подсказать мне, что не так с этим кодом

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

function custom_theme() {
  return array(
    'Bluemarine' => array(
        'variables' => 'output',
        'template' => 'Bluemarine',
     ),
  );
}
Камран Ахтер
источник

Ответы:

6

Независимо от версии Drupal, для которой вы пишете модуль, в вашем коде есть две ошибки:

  • Вы определяете «Bluemarine» как функцию темы, но затем вызываете theme('custom'), что вызовет «пользовательскую» функцию темы
  • Если вы определяете "custom" как функцию темы, которая использует файл шаблона, то theme_custom()она никогда не вызывается

Если вы пишете код для Drupal 6, то этот код должен быть похож на следующий. Я принимаю предположение, что имя для функции темы 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) {
}

Файл шаблона будет иметь доступ $outputи к любым установленным переменным template_preprocess_custom(), если ваш модуль реализует его.

Например, вы можете реализовать код, подобный следующему:

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

С этим кодом файл шаблона имеет доступ к $outputи $append.

В качестве примера функции темы, которая использует файл шаблона, вы можете посмотреть на theme_node () , которая определена в node_theme () , и которая использует node.tpl.php в качестве файла шаблона; Функция предварительной обработки, реализованная модулем Node для этой функции темы, - это template_preprocess_node () .

киамлалуно
источник
Спасибо Kiam, очевидно пропустил первый комментарий OP об использовании D6. +1
Laxman13
Спасибо Киам, template_preprocess_custom (& $ variable) добились цели
Кямран Ахтер
Теперь я хочу переместить TPL в папку темы, как я могу это сделать?
Камран Ахтер
@KamranAkhter Это другой вопрос. :-)
kiamlaluno
3

Вы вызываете неправильную функцию темы. Вместо function theme_customэтого должно быть function theme_Bluemarine. Вам также нужно передать массив в переменную кусок hook_theme () . Смотрите простой пример здесь .

Используя ваш пример (после изменения шаблона и функции темы 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',
     ),
  );
}

Теперь в custom.tpl.php просто нужно <?php print $output; ?>

Laxman13
источник
Спасибо за ответ, пример, который вы привели, является модулем узла, и у меня не модуль узла. Мне просто нужен способ передать переменную в файл TPL, я использую помощь drupal 6.plz
Kamran Akhter
Спасибо за ответ, он дает мне ошибку. Нет такого файла или каталога, на самом деле он ожидает файл custom.tpl.php в папке модуля, который у меня уже есть, поэтому в коде bluemarine будет заменен на custom. Bluemarine - это тема drupal, которую я использую.
Камран Ахтер
изменил приведенный выше код и дал мне белый пустой экран, что я должен сделать, пожалуйста, помогите
Kamran Akhter
Я изменил код, и он у меня работает на моем сайте.
Laxman13
Я просто копирую и вставляю приведенный выше код, но он не работает
Kamran Akhter