тематический крюк и рендеринг


Я пытаюсь разобраться в функции рендеринга 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'];
}

Я неправильно передаю параметры функции тематизации?

 2
Author: kristian nissen, 2012-03-08

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...
}
 4
Author: Clive, 2012-03-08 22:29:49