Как Drupal 7 отображает страницу? - PullRequest
8 голосов
/ 22 февраля 2011

Как Drupal 7 отображает страницу?Что это эквивалентно системе представления MVC.

Когда дело доходит до рендеринга конечной HTML-страницы для запроса, большинство PHP-фреймворков (на основе MVC), с которыми я работал, используют подход, в котором PHP-файл макета / страницы верхнего уровня устанавливает основныеструктуры документа, а затем рендерит наши различные подвиды с помощью включений или методов рендеринга.

//Simplified version
Page.phtml
    Head.phtml
    Body.phtml
        Banner.phtml
        Topnav.phtml
        Left.phtml
        Content.phtml
        Footer.phtml

Я немного запутался относительно того, как это воспринимает Drupal.Я читаю через Pro Drupal Development, и он начинается на аналогичной территории с page.tpl.php.Тем не менее, он закрывает глаза на то, как движок тем (это правильный термин?) Вводит различные части PHP на эту страницу (не критика, книга использует подход, отличающийся от моего пути).

Кроме того, темы Drupal 7, похоже, не имеют файла page.tpl.php, поэтому неясно (для меня), откуда берется скелет страницы.Кроме того, из того, что я прочитал, похоже, что речь идет о «блоках», но мне не ясно, составляют ли «блоки» всю страницу или блоки используются в темах выборочно.

Итак,Работая с концепциями высокого уровня (или получить настолько подробный, как вам хотелось бы), как Drupal 7 отображает страницу?

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

Ответы [ 3 ]

10 голосов
/ 22 февраля 2011

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

Во-первых, модуль (вот почему существует system.module для всех этих вещей, которые толькомодуль может сделать то же самое, что реализация hook_menu ()) должна определить, что определенная функция / шаблон темы существует, объявив его в hook_theme ()

Говоря об этом, есть две разные вещикоторый можно использовать.Функция темы, которая является функцией с префиксом theme_.Часто используется для небольших элементов страницы с более сложной логикой / PHP, например theme_table () .И шаблон, который представляет собой файл с tpl.php, например page.tpl.php

Чтобы использовать функцию / шаблон темы, вы можете либо вызвать theme () вот так:

$output = theme('table', array('rows' => $rows, 'header' => $header));

Или вы можете использовать новую, так называемую вещь для рендеринга массива.Это в основном массив данных + информация, какую тему использовать:

$output = array(
  '#theme' => 'table',
  '#rows' => $rows,
  '#header' => $header,
);

Второй вариант предпочтительнее, поскольку он означает, что он будет тематически как можно позже, и другие модули могут изменить его в хуках.Результат будет точно таким же, drupal_render () затем будет вызывать самой theme () во время окончательного рендеринга.

Когда вызывается theme (), он ищет используемую функцию / файл, проверяет, имеет ли онбыла переопределена используемая тема, если есть так называемые шаблонные предложения, а затем использует их.

Чтобы переопределить функцию темы в теме, скопируйте ее в файл template.php и замените «theme_» на «yourthemename_», если это файл tpl.php, скопируйте его в свой каталог.

Теперь окончательный процесс рендеринга в основном состоит в создании большого массива $ page, который представляет собой массив для рендеринга (некоторая документация по этому вопросу находится в hook_page_alter () и затем вызывается drupal_render () на нем.

Глобальная структура иерархии страниц / шаблонов (которая не жестко закодирована, а передается через все, что находится в $ page) выглядит примерно так:

html.php.tpl
  head.php.tpl
  page.php.tpl
    multiple regions
      multiple blocks

Почти все в Drupal 7 является блоком, включая фактический контент, который обычно является узлом. Тема определяет, какие области он имеет, и затем вы можете назначать ему блоки в пользовательском интерфейсе.

4 голосов
/ 22 февраля 2011

Пытаясь понять, как шаблоны сочетаются друг с другом, лучший инструмент, который я нашел, - это Модуль разработчика тем .Он работает немного как Firebug и позволяет щелкать по областям страницы, чтобы увидеть функции темы или файлы шаблонов, которые используются для различных частей страницы, а также « Предложения », которые можно использовать для переопределение их.

Шаблоны могут соединяться друг с другом различными способами.Drupal делает некоторые предположения о том, как они будут вложены, что отражено в переменных по умолчанию, которые доступны в файлах шаблонов.Тем не менее, как шаблон подсказки , так и доступные переменные внутри них могут быть изменены.

Насколько я понимаю, page.tpl.php был заменен на html.tpl.php в Drupal 7.

Лучшее описание, которое я слышал для "Blocks", - это то, что вы используете.для отображения контента, который будет повторно использоваться в различных областях сайта.Чаще всего используются боковые панели, такие как списки «Недавно обновленные страницы» или «Кто сейчас на сайте».

2 голосов
/ 22 февраля 2011

Попробуйте взглянуть на презентацию о том, как страницы построены на Drupal 7 от drupalcon, на http://sf2010.drupal.org/conference/sessions/page-render-drill-down-drupal-7, особенно через 5 минут после запуска (05:10). Извините, я не могу уточнить здесь детали, потому что я все еще смотрю это сам. И постарайся это понять. ;)

[Update]

После просмотра презентации вот мой быстрый вывод о том, как drupal 7 отображает страницу:

Вместо общего подхода, который вы упоминаете в своем вопросе

где PHP-файл макета / страницы верхнего уровня устанавливает базовую структуру документа, а затем визуализирует наши различные подвиды через включает или просмотреть методы рендеринга

Drupal рендерит страницу с помощью метода рендеринга, подобного этому

  1. самозагрузка
  2. menu_execute_active_handler
  3. page_callback
  4. delivery_callback
  5. hook_page_alter ()
  6. drupal_render ($ страница)

Тем не менее, это затуманивает, как тема двигатель (это правильный термин?) получает различные части PHP в этом страница (не критика, книга принимая подход, который отличается от путь, по которому я иду).

что различные части обслуживаются, начиная с рендеринга потока номер 3 (page_callback) до потока номер 6 (drupal_render ($ page)), где его начало возвращать массив друпал-рендеринг-массива, а затем последний в вашей теме, который вы можете использовать переменная $ page (подается из drupal_render ($ page)) для рендеринга, т.е. содержимого drupal.

...