Переменные в PHP секции
Как ни странно, в php секции можно задавать перменные в хуках onStart
и onEnd
, которые в дальнейшем можно использовать twig разметке.
url = "/"
==
function onStart()
{
$this['tyapk'] = "Hello world!";
}
==
<h3>{{ tyapk }}</h3>
Или чуть сложнее
url = "/blog"
==
use Acme\Blog\Classes\Post;
function onStart()
{
$this['posts'] = Post::orderBy('created_at', 'desc')->get();
}
==
<h2>Latest posts</h2>
<ul>
{% for post in posts %}
<h3>{{ post.title }}</h3>
{{ post.content }}
{% endfor %}
</ul>
Стоит отметить, что CMS во время обработки страницы конвертирует PHP секцию в класс, поэтому доступно только написание функций и использование других классов с помощью ключевого слова use
.
В качестве основного способа задания новых переменных используется синтаксис массива для доступа к $this, хотя для упрощения может использоваться синтаксис объекта, но только для чтения , например:
// Запись через массив
$this['tyapk'] = 'bar';
// Чтение через массив
echo $this['tyapk'];
// Чтение через объект
echo $this->tyapk;
Переменные по-умолчанию
Наибольший интерес представляют page и param.
Переменные CMS страницы (this.page)
Переменные изменяются в PHP секции или Компоненте через $this->page
:
function onEnd()
{
$this->page->title = 'A different page title';
}
После они могут использоваться при разметке страницы, используя this.page
.
<p>Заголовок страницы: {{ this.page.title }}</p>
Свойство this.page
возвращает объект класса Cms\Classes\Page и имеет следующие свойства, большинство из которых задаётся в административной части сайта:
- layout — название шаблона
- id — идентификатор (для файла
home/index.htm
идентификатор будетhome-index
) - title — заголовок
- description — описание
- meta_title — метазаголовок (SEO)
- meta_description — метаописание (SEO)
- hidden — флаг скрытой страницы (доступны только авторизованным пользователям административной части)
- fileName — название файла с расширением
- baseFileName — название файла без расширения
Перменные маршрута страницы (this.param)
Доступ к URL-параметрами страницы
В этом примере показано, как получить доступ к параметру tab
в URL-адресе страницы.
url = "/account/:tab"
==
{% if this.param.tab == 'details' %}
<p>Here are all your details</p>
{% elseif this.param.tab == 'history' %}
<p>You are viewing a blast from the past</p>
{% endif %}
Если имя параметра также является переменной, то может использоваться синтаксис массива.
url = "/account/:post_id"
==
{% set name = 'post_id' %}
<p>The post ID is: {{ this.param[name] }}</p>
Компоненты
Компоненты участвуют в событиях жизненного цикла страницы, перекрывая метод onRun
в классе компонентов. Контроллер CMS выполняет этот метод каждый раз, когда загружается страница или шаблон. Внутри метода могут вставляться переменные в среду Twig через свойство page
:
class SomeComponent extends ComponentBase
{
...
public function onRun()
{
// This code will be executed when the page or layout is
// loaded and the component is attached to it.
$this->page['tyapk-in-component'] = 'hello'; // Inject some variable to the page
}
...
}
Приминение на странице:
url = "/"
[SomeComponent]
==
<h3>{{ tyapk-in-component }}</h3>
Исходя из практики, в компонентах очень часто используется такой шаблон:
class RelatedPosts extends ComponentBase
{
public $postPage;
...
protected function prepareVars()
{
$this->postPage = $this->page['postPage'] = $this->property('postPage');
}
public function onRun()
{
$this->prepareVars();
...
}
}
Тогда переменная доступна через сам компонент и через страницу.
Компонент ViewBag
В OctoberCMS есть специальный компонент ViewBag
, который можно использовать на любой странице или любом шаблон. Он позволяет определять специальные свойства и получать к ним доступ внутри twig разметки как к переменным. Хорошим примером использования является определение активного элемента меню внутри страницы:
title = "About"
url = "/about.html"
layout = "default"
[viewBag]
activeMenu = "about"
==
<p>Page content...</p>
Любое свойство, определенное в ViewBag
компоненте, становится доступным внутри страницы, макета или partial через использование viewBag
(с маленькой буквы) переменной. Например, в этом макете активный класс добавляется к элементу списка, если viewBag.activeMenu
значение имеет значение about:
description = "Default layout"
==
[...]
<!-- Main navigation -->
<ul>
<li class="{{ viewBag.activeMenu == 'about' ? 'active' }}">About</li>
[...]
</ul>
Компонент ViewBag
скрыт в административной части сайта и редактируется через правку файла текстовым редактором. Компонент может использоваться для обмена данными между плагинами.
Backend контроллеры
Для передачи данных в представления используйтся свойство контроллера $vars
$this->vars['backend'] = 'tyapk';
Переменные, переданные с помощью $vars
свойства, доступны непосредственно в вашем представлении (не twig):
<p>Значение переменной backend: <?= $backend ?></p>