#drupal
#drupal
Вопрос:
я использую пользовательский модуль для создания содержимого моей домашней страницы на example.com/frontpage .
в модуле я запускаю запрос, который получает нужные мне данные в виде массива. когда я возвращаю theme(‘страница’, $my_array), я получаю «домашнюю страницу внутри домашней страницы», то есть логотип drupal по умолчанию и название сайта отображаются во второй раз в области основного содержимого.
каков наилучший способ добиться этого, создать определенный tpl.php файл, содержимое которого должно быть … ?
я понимаю, что это очень общий вопрос, но за 2 часа проб и чтения руководств я продвинулся совсем не очень далеко…
Спасибо
Ответ №1:
Если я правильно понимаю ваш вопрос, все, что вам нужно сделать, это вернуть содержимое, не прогоняя его theme_page
. theme_page
берет ваш контент и помещает его в шаблон сайта, поэтому вызов его вручную в вашем случае дублирует шаблон.
Альтернативным решением является то, чтобы функция обратного вызова вашей страницы ничего не возвращала, вместо этого печатая выходные данные theme_page
. Если функция обратного вызова не возвращает текст, шаблон сайта не включается автоматически.
<?php
function mymodule_menu() {
$items = array();
$items['option1'] = array(
'title' => 'Front page option #1',
'access arguments' => array('access content'),
'page callback' => 'mymodule_option1',
'type' => MENU_CALLBACK,
);
$items['option2'] = array(
'title' => 'Front page option #2',
'access arguments' => array('access content'),
'page callback' => 'mymodule_option2',
'type' => MENU_CALLBACK,
);
return $items;
}
function mymodule_option1() {
// build HTML content here
return $content;
}
function mymodule_option2() {
// build HTML content here
print theme('page', $content);
return null;
}
Комментарии:
1. вариант 1 работает, не понял, что имя переменной должно быть $ content. теперь я вижу Array на своей домашней странице. итак, мне нужно создать полный html-код внутри функции mymodule_option1? разве вы не имели в виду поместить php в html, а не html в php?
2. Если вы хотите сделать его по-настоящему Drupalish, вам следует создать функцию темы, которая создает фактический HTML, в то время как обратный вызов меню выполняет логику. Это то, что делают модули contrib, чтобы сделать возможным переопределение их выходных данных. Однако при одноразовом использовании пользовательского модуля сайта это не так важно. В остальном, хороший ответ 1
3. stef, имя переменной не обязательно должно быть $content, оно может быть любым. Это должна быть строка, а не массив, поэтому вам может потребоваться использовать что-то вроде
implode
, чтобы преобразовать ваш массив в строку.
Ответ №2:
Возможно, у вас лучше получается с «представлениями», чем с пользовательским модулем, но запрос на домашнюю страницу действительно странный, представления должны быть лучше, чем пользовательский модуль для такого рода вещей.
Если у вас есть своя тема (или вы готовы ее создать), вы можете использовать page-front.tpl.php (как описано здесь)
Комментарии:
1. целую вечность пытался с коллегой использовать, не работает. мне нужна некоторая логика if else внутри представления, которая невозможна.
2. у меня действительно есть своя тема, сейчас я ее рассмотрю. спасибо за ссылку
Ответ №3:
Что находится в вашем файле шаблона? Возможно ли, что эти элементы отображаются дважды, потому что они включаются дважды, то есть один раз в вашу тему page.tpl.php и снова в $content
переменной (которая, похоже, генерируется вашим модулем)?
Многие файлы шаблонов имеют следующую структуру:
print $head;
print $logo, $search, $navbar, $messages;
print $content;
print $footer, $closure;
Если theme('page', $my_array)
отвечает за создание $content
переменной и $content
уже включает в себя $logo
и друзей, они будут отображаться дважды.
Первый шаг, который я бы предпринял в этом случае, — это реализовать hook_preprocess_page()
в моей теме template.php файл и выполнить несколько dsm()
вызовов (если у вас установлен модуль devel — что вам и следует) или print_r()
‘s , чтобы точно увидеть, что попадает в шаблон страницы.
HTH