тематический крюк и рендеринг
Я пытаюсь разобраться в функции рендеринга drupal 7(), но есть кое-что, чего я не могу понять.
Источник данных, который я хочу отобразить, выглядит следующим образом:
Array
(
[id] => 3315539862007
[name] => Some Name
[picture] => some-facebook-image.jpg
[link] => http://www.facebook.com/some-page
Я передаю его в блок $['содержимое'] вот так (я также пытался изменить "#дети" на "#элемент", но безуспешно):
$block['content'] = array(
'#theme' => 'opengraph_company',
'#children' => $data
);
Но внутри моей пользовательской функции тематизации передаваемые данные выглядят действительно странно
function theme_opengraph_company($variables) {
$element = $variables['element'];
return 'hello';
}
Если я отлажу переменные $ внутри функция тематизации Я получаю что-то вроде этого
Array
(
[element] => Array
(
[#theme] => opengraph_company
[#children] => Array
(
[id] => 3315539862007
[name] => Some Name
Что для меня выглядит действительно странно. Функция MYMODULE_theme выглядит следующим образом
function opengraph_theme() {
return array(
'opengraph_company' => array(
'render element' => 'element',
),
);
}
Я бы ожидал, что доступ к данным, основанным на функции тематизации, будет проще, что-то вроде
function theme_opengraph_company($variables) {
$element = $variables['element'];
return $element['name'];
}
Я неправильно передаю параметры функции тематизации?
1 answers
При использовании render element
элемент, к которому вы применяете тему, передается в функцию темы в массиве $vars
... индекс в массиве будет соответствовать тому, что вы задали render element
в вашей функции темы, которая в данном случае является элементом; следовательно, элемент, который вы попросили передать API темы, доступен в $vars['element']
, который является точной копией исходного элемента визуализации.
Чтобы получить эффект, который вы ищете, вы обычно используете variables
вместо render element
:
function opengraph_theme() {
return array(
'opengraph_company' => array(
'variables' => array(
'id' => 0,
'name' => '',
'picture' => '',
'link' => ''
),
),
);
}
Затем вы бы построили свой элемент визуализации следующим образом:
$block['content'] = array(
'#theme' => 'opengraph_company',
'#id' => 123,
'#name' => 'Name',
'#picture' => 'Picture',
'#link' => 'Link'
);
Или, если вы хотите использовать свой текущий массив $data
, вы можете передать его непосредственно в функцию темы:
$block['content'] = array(
'#markup' => theme('opengraph_company', $data)
);
Имейте в виду, что с помощью этого второго метода любые модули, хуки которых могут быть запущены после вашего, больше не получат возможности изменить вывод темы, так как вы преобразуете ее в строку.
Однако, используя любой из этих методов, при запуске функции темы у вас будет доступ к переменным следующим образом:
function theme_opengraph_company(&$vars) {
$id = $vars['id'];
$name = $vars['name'];
// etc...
}