Drupal: передача пользовательской переменной из пользовательского модуля в мой шаблон

Я понимаю, что этот вопрос был задан, но я либо просто не понимаю, либо предыдущие ответы не применимы (или я не понимаю, как их применять) к моим обстоятельствам. Вот оно:

У меня есть пользовательский модуль с именем:

«мой_модуль» в /sites/all/modules/custom/my_module

У меня есть файл модуля:

/сайты/все/модули/пользовательский/мой_модуль/мой_модуль.модуль

У меня есть имя шаблона страницы "page-mypage", которого НЕТ в моем модуле:

/sites/all/themes/mytheme/pages/page-mypath-mypage.tpl.php

Для этого я сделал хук-меню:

$items['mypath/mypage'] = array(
    'title'         => 'My Page!',
    'page callback'         => 'my_module_mypage',
    'page arguments'    => array(1,2),
    'access callback'   => true,
    'type'          => MENU_CALLBACK,
);

В функции я создаю некоторый контент следующим образом:

function my_module_mypage($x, $y) {
    $output = "foo AND bar!";
    return $output;
}

В шаблоне (опять же НЕ в папке моего модуля, а в подпапке "страницы" ТЕМЫ) у меня есть:

<?php print $content ?>

Когда я перехожу на http://mysite/mypath/mypage, я получаю "foo AND bar!"

Теперь вопрос. Мне нужна новая переменная, определенная в my_module_mypage(), с именем '$moar_content'. Я хочу вывести $moar_content на моей странице-mypath-mypage.tpl.php. Мне нужно сделать это только для этого модуля и для этого шаблона. Мне не нужно это для всей темы, поэтому я не думаю, что использование 'template.php' mytheme уместно.

Я думаю, что мне нужно использовать какую-то предварительную обработку, но все, что я пытаюсь сделать, терпит неудачу, и все, что я читаю, кажется, лишено какого-то волшебного ингредиента.

Мои мысли были такими:

function my_module_preprocess_page_mypath_mypage(&$variables) {
    $variables['moar_content'] = 'OATMEAL';
}

or

function my_module_preprocess_my_module_mypage(&$variables) {
    $variables['moar_content'] = 'OATMEAL';
}

или что-то. Я почти уверен, что я на правильном пути, но я натыкаюсь на кирпичную стену.


person Spanky    schedule 07.10.2011    source источник
comment
Сильно зависит от того, какую версию Drupal вы используете — 6 или 7?   -  person Clive    schedule 07.10.2011
comment
Drupal 6. Извините, я должен был упомянуть об этом заранее.   -  person Spanky    schedule 08.10.2011


Ответы (1)


Чтобы выполнить эту работу, вы должны следовать лучшим практикам Drupal, предположим, что вы используете D6, поэтому вы можете вставить некоторые переменные в свой шаблон следующим образом:

// You menu path is good
$items['mypath/mypage'] = array(
    'title' => 'My Page!',
    'page callback' => 'my_module_mypage',
    'page arguments' => array(1,2),
    'access callback' => true,
    'type' => MENU_CALLBACK,
);

Во-вторых, мы определяем хук темы для нашей страницы.

// We define here a new theme file for your your page
// Your theme file must be located in your module's folder
// you can use a subfolder to group all your module's theme files
// E.g : themes/my-module-theme.tpl.php
// Note that in theme files, we change _ by -
function my_module_theme() {
    return array(
        'my_module_theme' => array( // Keep that name in your mind
            'template' => 'my_module_theme',
                'arguments' => array(
                'my_var' => NULL,
                'my_var2' => NULL,
            ),
        )
    );
}

Теперь мы можем создать файл "my-module-theme.tpl.php" в корневой папке нашего модуля и вставить что-то вроде "foo AND bar!" Вернемся к нашему my_module.module, обратный вызов должен быть примерно таким:

function my_module_mypage($x, $y) {
    // $x and $y are optionnal, so this is the first manner
    // to inject variables into your theme's file
    $output = theme("my_module_theme", $x, $y);
    return $output;
}

Также вы можете использовать хук предварительной обработки для вставки переменных

// The hook must be named like this : template_preprocess_NAME_OF_THEME_FILE
// where NAME_OF_THEME_FILE is the name that you kept in your mind ;)
function template_preprocess_my_module_theme(&$variables) {
    // Do some job
    $var1 = 'Foobar';

    // So in "my-module-theme.tpl.php", $my_var1 will print Foobar
    $variables['my_var1'] = $var1;
}
person Nabil SADKI    schedule 07.10.2011
comment
Мои шаблоны страниц не находятся в каталоге моего модуля. Они находятся в темах/mytheme/pages. Многие из них. К сожалению, это то, что было передано мне, поэтому мне приходится работать с ним. - person Spanky; 08.10.2011
comment
Извините, но этот ответ не отвечает на мой вопрос. Это ответ, который я могу найти везде. Если бы я следовал этим инструкциям, у меня был бы шаблон в папке моего модуля, который я все еще не мог бы отобразить в контексте моего шаблона страницы в /sites/all/themes/mytheme/pages/page-mypage. tpl.php — Так что я все еще застрял. Однако, спасибо :) - person Spanky; 12.10.2011