Условные обозначения SilverStripe в шаблонах

#if-statement #conditional #silverstripe

#оператор if #условные операторы #silverstripe

Вопрос:

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

Код, который я использую, является:

 <% if ClassName != BusinessPage || ClassName != BusinessSubPage %>
    ... some code here
<% end_if %>
  

Это не работает, поскольку оператор if передается на всех типах страниц и запускается код в операторе if.

Если я сокращу код только до одного типа страницы, это даст ожидаемые результаты для типа страницы:

 <% if ClassName != BusinessPage %>
    ... some code here
<% end_if %>  
  

Есть ли какая-то неожиданная проблема с использованием ClassName в качестве условия в операторе if, о котором мне нужно знать, что объяснило бы мои проблемы?

Ответ №1:

Ваша логика оператора if не совсем верна. То, что вы хотите, это использовать amp;amp; ( AND ) вместо || ( OR ):

 <% if $ClassName != "BusinessPage" amp;amp; $ClassName != "BusinessSubPage" %>
  

Вот логическая таблица, показывающая результаты трех разных имен классов.

 $ClassName      | $CN != BusinessPage | $CN != BusinessSubPage | OR    | AND   |
----------------|---------------------|------------------------|-------|-------|
ABC             | true                | true                   | true  | true  |
BusinessPage    | false               | true                   | true  | false |
BusinessSubPage | true                | false                  | true  | false |
  

OR Столбец показывает, что независимо от того, какой ClassName результат всегда является истинным. Вот почему оператор if всегда передавался.

Ответ №2:

Альтернативой является помещение логики в Page_Controller . Это упрощает чтение шаблонов, когда логика усложняется.

Page.php

 public function BusinessTemplate() {
  return in_array($this->ClassName, array('BusinessPage', 'BusinessSubPage'));
}
  

Page.ss

 <% if not $BusinessTemplate %>
  enter code here
<% end_if %>