如何检查OctoberCMS布局模板中是否存在页面属性

时间:2018-11-09 09:28:46

标签: twig octobercms

在布局中,当页面未定义属性时,使用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部分会引发异常。

检查页面属性是否已定义的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我刚刚找到了一种通过关联数组语法访问属性的方法来解决这种情况。

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

这可以按我预期的那样工作,但是,我不确定这是否是最佳解决方案。

答案 1 :(得分:0)

我找到了比my previous answer更好的解决方案。

使用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。 为避免混淆,我将对Page对象和ViewBag组件都使用__isset()方法。

注意:如果在布局中使用ViewBag,则还应检查viewBag是否存在,因为并非所有页面都实例化ViewBag组件。

{% if viewBag is defined and viewBag.__isset('canonical_url') and viewBag.canonical_url is not empty %}