OctoberCMS. Переменные

Переменные в 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>