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

Частично это объяснялось широким спектром уже доступных двигателей и предпочтениями многих разработчиков, которые используют фреймворк. Будучи управляемой интерфейсом, эта цель была достигнута.

Однако мы также решили оставить простой Parser, который у нас всегда был. Однако одна вещь, которая возникла, состояла в том, что, если мы собираемся ее сохранить, она должна быть намного полезнее, чем в предыдущих версиях. Работа над этим приближается к завершению, поэтому выделим некоторые из новых изменений, которые оно приносит.

Больше изменений

Циклическая и переменная подстановки работают так же, как и всегда. Переменные, завернутые в фигурные скобки, будут заменены значением переменной. Вы все еще можете перебирать массивы данных, просто используя открывающие и закрывающие фигурные скобки.

<h1>{blog_title} - {blog_heading}</h1>
{blog_entry}
    <div>
        <h2>{title}</h2>
        <p>{body}{/p}
    </div>
{/blog_entry}

Одно из главных изменений здесь заключается в том, что PHP больше не выполняется при разборе представлений.

Маленькие вещи

Поскольку вы больше не можете использовать какой-либо PHP, вам нужно больше инструментов, чтобы заставить шаблоны работать на вас.

Условная логика

Простая условная логика теперь доступна с тегами if, elseif и else.

{if role=='admin'}
    <h1>Welcome, Admin</h1>
{elseif role=='moderator'}
    <h1>Welcome, Moderator</h1>
{else}
    <h1>Welcome, User</h1>
{endif}

Хотя синтаксис может выглядеть немного чище, он обрабатывается точно так же, как стандартный PHP-условный, и все стандартные правила PHP будут применяться здесь. Вы можете использовать любой из операторов сравнения, как обычно, например ==, ===, ! ==, <,> и т. д.

Без парсера

Если у вас есть раздел шаблона, в котором вы не хотите, чтобы Parser его касался, вы можете сделать это легко, обернув код в теги noparse.

{noparse}
    ... Your un-parsed content lives here ...
{/noparse}

Комментарии

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

{# This is a comment #}


Автоматическое экранирование

Все замены переменных автоматически экранируются для более безопасных видов, что значительно снижает вероятность атак XSS и многое другое. Вы можете выбрать другой экранирующий контекст (html, attr, css или js) в зависимости от того, где появляется переменная. По умолчанию используется html, поэтому большую часть времени вам не нужно ничего делать, чтобы это произошло.

// Defaults to basic HTML escaping
{ some_var }
// Escape within HTML attributes
{ some_var|esc(attr) }
// Escape within Javascript code
{ some_var|esc(js) }
// Escape within CSS style blocks
{ some_var|esc(css) }

Если вы не хотите, чтобы это вообще экранировано, вы можете использовать {! и !} вместо простых фигурных скобок и что одна переменная не будет экранирована.

{! not_escaped_var !}

Этот процесс все еще завершается, поэтому возможно синтаксис может измениться, но это текущий план.

Большие вещи

Эти следующие два предмета приносят достаточную мощность тому, что раньше было почти бессмысленным парсером.

Фильтры

Вы видели намек на это выше, когда речь шла об экранировании, но парсер теперь поддерживает фильтрацию переменной, чтобы повлиять на ее окончательное отображение. Фильтры разделены знаком |.

// Output: FILTERED
{ filtered | upper }
// Output: Filtered
{ FILTERED | title }

Фильтры могут иметь один или несколько параметров для указания параметров.

// Output: 2017-10-03
{ myDate | date(Y-m-d) }

Несколько фильтров могут быть соединены вместе.

// Output: 2018-10-03
{ myDate | date_modify(+1 year) | date(Y-m-d) }

Фильтры обычно работают только с строками, но CodeIgniter по-прежнему будет поставляться с рядом полезных фильтров. И очень просто создавать свои собственные. Встроенные в настоящее время:

  • abs
  • capitalize
  • date
  • date_modify
  • default
  • esc
  • excerpt
  • highlight
  • highlight_code
  • limit_words
  • limit_chars
  • lower
  • nl2br
  • number_format
  • prose
  • round
  • strip_tags
  • title
  • upper

Плагины

Word of Warning: эта функция является концепцией только в это время, и на самом деле реализация еще не началась, но это то, что происходит в моей голове. Синтаксис может измениться.

Плагины - это кивок синтаксиса Expression Engine, который позволяет расширить возможности Parser, чтобы он соответствовал большинству любых потребностей, которые могут возникнуть у вас. Черт, вы, вероятно, могли бы использовать любые недостающие функции, необходимые для механизма шаблонов через плагины.

В принципе, плагины позволяют указать тег псевдонима, из которого можно вызвать функции библиотеки. Они очень похожи по идее View Cells, хотя они могут делать некоторые вещи, которые не могут сделать Cells. На самом деле единственным плагином, который, как ожидается, будет поставляться с каркасом, является функция View Cell.

Это, вероятно, лучше всего имеет смысл с примером. Давайте просто используем функцию View Cell, чтобы продемонстрировать. С помощью ячеек вы можете указать класс / метод для создания и возврата HTML, который отображается в ячейке. Его тег может выглядеть примерно так:

// A Simple version
{ cell: Acme\Blog\Posts::recentPosts }
// With Parameters
{ cell: Acme\Blog\Posts::recentPosts category=codeigniter limit=5 }

Если пакет Acme\Blog нужно сделать немного чище и создать некоторые плагины View, они могут предоставить что-то вроде следующего:

{ blog:recentPosts category=codeigniter limit=5 }

Опять же, весь этот синтаксис плагина является предварительным и может быть изменен, но он подходит.

Надеюсь, этот тип Parser может быть полезен для многих из вас.

Ссылки по теме

Источник: Upgrading the Parser in CodeIgniter 4