Php load template files

Ещё раз о шаблонах

Рано или поздно девелоперу, создающему сайты статусом выше «сайт-визитка», приходится сталкиваться с таким понятием как «шаблоны» или «шаблонизация» визуального представления (не шаблоны проектирования). Что это такое? Механизм шаблонов позволяет отделять визуальное представление веб-приложения (по-скольку работаю только с веб-приложениями, то и рассуждать буду в этом контексте) от бизнес-логики таким образом, чтобы при изменении, например, внутренней логики попутно не приходилось переделывать всю html-верстку. На этом поприще уже давно существует несколько отдельно стоящих флагманских решений, позволяющих создавать довольно гибкие приложения в плане разделения труда дизайнеров-верстальщиков и программистов, а также предотвращать запутанность кода в больших приложениях. Описывать все их нет смысла. Это уже сделано до меня и не один раз. Помимо этого, почти каждая CMS и фрэймворк имеет собственные решения для отделения логики приложения от логики представления.

Конечно, когда речь идет о проекте в десятки тысяч строк кода, когда у заказчика есть возможность нанять и программиста, и верстальщика, то и функционал шаблонов будет только пользой для всех участников проекта. Но когда разработчик в простецкий сайт в 3 страницы начинает втуливать Smarty, это ИМХО уже перебор. В таких случаях я люблю вспоминать выражение Джорджа Шлоснейгла из его замечательной книги «Профессиональное программирование на PHP» – «попытка убить муху молтком».

Действительно, встраивая все тот же Smarty в весьма простой по функционалу сайт, разработчик попросту тратит время. А время, как известно, — деньги. Да и в большинстве случаев заказчику безразлично на каком шаблонизаторе будет работать его сайт. Заказчик больше печется о затраченном времени.

Что же делать, если сайт не «визитка», но и не второй Amazon? Лично я считаю, что в этом случае оптимальное решение проблемы — воспользоваться своей самописной системой шаблонов, весь функционал которой, заточен только для решения узкого круга задач, необходимых для текущего ресурса. Впоследствии вы, возможно, выведите свою «формулу» универсального шаблонизатора с неким минимальным набором функций, расширяемую по мере необходимости в отдельно взятом проекте.

Может показаться, что автор сей статьи весьма скептически относится к Smarty и другим шаблонизаторам. Это не так. Я довольно долго работал с проектом, в котором роль шаблонизатора выполнял все тот же Smarty. И хочу заметить, мне весьма понравилось использование этой системы шаблонов в контексте обширного по функционалу проекта.

  • Возможность назначать переменные шаблону
  • Отдельное пространство имен переменных для отдельно взятого html-шаблона
  • Возможность использования одного шаблона для общего каркаса страницы во избежание повторения конструкций вида require ‘header.tpl’;… require ‘footer.tpl’; в каждом файле
  • Проект является интернет-магазином или социальным сообществом
  • 10-20 типов страниц. Подчеркиваю — НЕ страниц, а типов страниц. Например: страница описания товара. Т.е. html-шаблон для этого типа страниц будет один, но самих страниц, когда каталог заполнится контентом будет много
Читайте также:  Page 130 php to

Рассмотрим простейший класс, который состоит всего из трех методов.

_tmpl = $filename; > public function assign($name, $value) < $this->_vars[$name] = $value; > public function render() < if (count($this->_vars) > 0) < extract($this->_vars); > $tmplPath ; if (file_exists($tmplPath)) < require $tmplPath; >else < throw new Exception("Шаблон _tmpl> не найден"); > > > 

Давайте рассмотрим пример с применением этого класса. Создадим следующую структуру каталогов:

/wwwroot
|
— /classes
| — Template.php
— /templates
| — Main.tpl
| — Catalog.tpl
| — Product.tpl
| — Index.tpl
| — 404.tpl
|— index.php

 

Страница описания продукта №

 

Это главная страница сайта

/** * Буферизация вывода. * Все, что будет выводиться echo-м или print-ом, будет попадать в буфер, а не в браузер пользователю. */ ob_start(); // Подключаем шаблонизатор require dirname(__FILE__).'/classes/Template.php'; // Производим проверку маршрутизации и включаем необходимые шаблоны // Если не один из шаблонов не найден, отправляем клиенту код ошибки и показываем шаблон 404.tpl // Если маршрут не задан, выводим главную страницу if (isset($_GET['route']) && $_GET['route'] == 'catalog') < $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); > else if ($_GET['route']) && $_GET['route'] == 'product') < $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); > else if (!isset($_GET['route'])) < $tmpl = new Template('Index'); $tmpl->render(); > else < header("HTTP/1.0 404 Not Found"); $tmpl = new Template('404'); $tmpl->render(); > // Получаем содержимое буфера $content = ob_get_clean(); // Инициализируем шаблон каркаса страницы и выводим ранее сгенерированное содержимое $tmpl = new Template('Main'); $tmpl->assign('content', $content); $tmpl->render(); 

Как видно из примера, содержимое страниц catalog и product изменяется в зависимости от значения $_GET[‘ID’]. Т.о. мы получили два типа шаблонов и неограниченное количество страниц, генерируемых приложением из этих шаблонов.

Вывод: не стремитесь во всех проектах, которыми вы занимаетесь, использовать навороченные библиотеки шаблонизаторов, предоставляющих большое обилие всевозможных инструментов, в большинстве случаев не используемых в должном объеме. Лучше всего написать свое решение, которое поможет сэкономить время, системные ресурсы, а главное — нервы останутся в порядке.

Источник

load_template() – подключает PHP-файл с доступом к среде WordPress

Функция по сути подключает любой PHP-файл с доступной в нём средой WordPress, а также глобальными переменными $posts , $post , $wp_did_header , $wp_query , $wp_rewrite , $wpdb , $wp_version , $wp , $id , $comment , $user_ID .

Кроме того, массив $wp_query->query_vars , если существует, будет разобран на отдельные переменные php-функцией extract() . То есть $wp_query->query_vars[ ‘param1’ ] превратится в $param1 . Подробнее во втором примере. И ещё кое-что, параметр поиска $wp_query->query_vars[ ‘s’ ] также будет очищен функцией esc_attr().

Если вам интересно лучше разбираться, как устроены файлы тем в WordPress и как работает их иерархия, то рекомендую посмотреть этот видеоурок.

Функция сама по себе ничего не возвращает.

load_template( $_template_file, $require_once = true, $args = array() )

Параметры

  • true – в этом случае файл будет подключаться PHP-функцией require_once() ,
  • false – будет подключаться функцией require() .

Пример 1. Подключаем файл из той же директории

В этом примере предположим, что мы используем функцию load_template() в каком-либо файле, находщемся в папке с темой. И подключим другой файл, который находится в этой же папке.

load_template( dirname( __FILE__ ) . '/true-template.php' );

Попробуем сделать то же самое, но при помощи магической константы __DIR__ .

load_template( __DIR__ . '/true-template.php' );

Пробуем сделать то же самое, но при помощи функции get_stylesheet_directory().

load_template( get_stylesheet_directory() . '/true-template.php' );

Пример 2. Подключаем файл и передаём в него параметры

Способ 1. Передав новый аргумент в параметры запроса

В этом примере мы как раз-таки записываем произвольную переменную в массив $wp_query->query_vars , который при подключении файла будет разобран на отдельные переменные.

set_query_var( 'true_variable', 'Привет, файл' ); load_template( $template );

Вставляем этот код внутри подключаемого файла шаблона:

// выведет "Привет, файл" echo $true_variable; // элемент массива $wp_query->query_vars[ 'true_variable' ] превратился в переменную $true_variable

Способ 2. Используя массив $args

Этот аргумент функции появился только в версии WordPress 5.5, поэтому раньше приходилось довольствоваться первым способом.

load_template( $template, true, array( 'true_variable' => 'Привет, файл' ) );

Вставляем этот код внутри подключаемого файла шаблона:

// выведет "Привет, файл" echo $args[ 'true_variable' ];

Пример 3. Проверяем, что файл существует

Дело в том, что функция loa d_template() сразу же закидывает путь, который мы передаём в неё, в функции require() или require_once() , которые, в отключие от include() и include_once() будут выдавать PHP-ошибку 500 при попытке подключения несуществующего файла.

$template = __DIR__ . '/true-template.php'; if( file_exists( $template ) ) { load_template( $template ); }

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Источник

load_template() │ WP 1.5.0

Подключает указанный файл в PHP, с помощью require_once. Используется, чтобы быть уверенным, что среда WordPress уже установлена в момент подключения файла. Функция также устанавливает глобальные переменные: $posts , $post , $wp_did_header , $wp_query , $wp_rewrite , $wpdb , $wp_version , $wp , $id , $comment , $user_ID .

Хуки из функции

Возвращает

Использование

load_template( $_template_file, $require_once, $args );

$_template_file(cтрока) (обязательный) Серверный путь до файла, который нужно подключить. $require_once(логический) true — будет подключать файл с помощью require_once, false — с помощью require.

Если подключение файла происходит внутри цикла и этот параметр указан в true , то первый элемент цикла отобразиться корректно, а следующие элементы выведутся как копии 1 элемента.

По умолчанию: true $args(массив) (С WP 5.5) Дополнительные параметры для подключаемого файла. Используйте переменную $args в подключаемом файле.
По умолчанию: array()

Примеры

#1 Подключение файла-шаблона в плагине, с возможностью его изменить в теме

Предположим мы создаем плагин и в нем нам нужно указать файл шаблона, который будет использоваться в теме. Логично, что для разных тем файл шаблона будет разный и нам нужно оставить возможность изменять файл шаблона из темы. Для этого мы подключим нужный там файл, только в том случае, если он не определен в теме:

if ( $overridden_template = locate_template('some-template.php') ) < // locate_template() вернет путь до файла, если дочер. или родит. тема имеет такой файл load_template( $overridden_template ); >else < // если файл не найден в теме или доч. теме, загружаем файл из каталога 'templates' плагина load_template( dirname( __FILE__ ) . '/templates/some-template.php' ); >

Заметки

  • Global. Массив. $posts
  • Global. WP_Post. $post Global post object.
  • Global. true|false. $wp_did_header
  • Global. WP_Query. $wp_query WordPress Query object.
  • Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
  • Global. wpdb. $wpdb WordPress database abstraction object.
  • Global. Строка. $wp_version
  • Global. WP. $wp Current WordPress environment instance.
  • Global. int. $id
  • Global. WP_Comment. $comment Global comment object.
  • Global. int. $user_ID

Список изменений

Код load_template() load template WP 6.2.2

function load_template( $_template_file, $load_once = true, $args = array() ) < global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID; if ( is_array( $wp_query->query_vars ) ) < /* * This use of extract() cannot be removed. There are many possible ways that * templates could depend on variables that it creates existing, and no way to * detect and deprecate it. * * Passing the EXTR_SKIP flag is the safest option, ensuring globals and * function variables cannot be overwritten. */ // phpcs:ignore WordPress.PHP.DontExtract.extract_extract extract( $wp_query->query_vars, EXTR_SKIP ); > if ( isset( $s ) ) < $s = esc_attr( $s ); >/** * Fires before a template file is loaded. * * @since 6.1.0 * * @param string $_template_file The full path to the template file. * @param bool $load_once Whether to require_once or require. * @param array $args Additional arguments passed to the template. */ do_action( 'wp_before_load_template', $_template_file, $load_once, $args ); if ( $load_once ) < require_once $_template_file; >else < require $_template_file; >/** * Fires after a template file is loaded. * * @since 6.1.0 * * @param string $_template_file The full path to the template file. * @param bool $load_once Whether to require_once or require. * @param array $args Additional arguments passed to the template. */ do_action( 'wp_after_load_template', $_template_file, $load_once, $args ); >

Cвязанные функции

Подключение файлов темы

  • comments_template()
  • get_footer()
  • get_header()
  • get_parent_theme_file_path()
  • get_parent_theme_file_uri()
  • get_search_form()
  • get_sidebar()
  • get_stylesheet_directory()
  • get_stylesheet_directory_uri()
  • get_stylesheet_uri()
  • get_template_directory()
  • get_template_directory_uri()
  • get_template_part()
  • get_theme_file_path()
  • get_theme_file_uri()
  • get_theme_root_uri()
  • is_page_template()
  • locate_template()

Источник

Оцените статью