Как проверить, существует ли свойство страницы в шаблоне макета OctoberCMS - PullRequest
0 голосов
/ 09 ноября 2018

В макете проверка свойства страницы с помощью is defined приводит к ошибке, такой как «Вызов неопределенного метода October \ Rain \ Halcyon \ Builder :: meta_description ()», когда страница не определяет свойство.Я ожидаю, что тест будет ложным, а не вызовет исключение.

У меня есть макет, подобный приведенному ниже, проверяющий if this.page.meta_description is defined.

description = "Default layout"

==
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{ this.page.title }}</title>
    {% if this.page.meta_description is defined and this.page.meta_description is not empty %}
          <meta name="description" content="{{ this.page.meta_description }}">
    {% endif %}
    </head>
  <body>
  ...
  </body>
</html>

Если страница, использующая этот макет, определяет свойство meta_description,это делает хорошо.Однако, если страница не определяет его, this.page.meta_description is defined part вызывает исключение.

Как правильно проверить, определено свойство страницы или нет?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я нашел немного лучшее решение, чем мой предыдущий ответ .

Используйте метод Page.__isset(), чтобы проверить, определено ли свойство.

{% if this.page.__isset('meta_description') and this.page.meta_description is not empty %}
  <meta name="description" content="{{ this.page.meta_description }}">
{% endif %}

Причина, по которой я думаю, что это немного лучше, заключается в том, что это можно использовать и с компонентом ViewBag.

Я столкнулся с той же проблемой, используя is defined со свойством ViewBag. Однако решение для доступа к массиву не работало с ViewBag. Чтобы избежать путаницы, я бы использовал метод __isset() как для объектов Page, так и для компонента ViewBag.

Примечание. Если вы используете ViewBag в макете, вам также следует проверить, существует ли viewBag, поскольку не все страницы создают экземпляр компонента ViewBag.

{% if viewBag is defined and viewBag.__isset('canonical_url') and viewBag.canonical_url is not empty %}
0 голосов
/ 09 ноября 2018

Я только что нашел способ разрешить эту ситуацию, используя свойство синтаксиса ассоциативного массива.

{% if this.page['meta_description'] is defined and this.page['meta_description'] is not empty %}
  <meta name="description" content="{{ this.page.meta_description }}">
{% endif %}

Это работает, как я и ожидал, но я не уверен, что это лучшее решение.

...