Как использовать переменные PHP в моем шаблоне ExpressionEngine для подсчета?

#php #templates #expressionengine

#php #шаблоны #expressionengine

Вопрос:

Хокай, итак. Вот мой встроенный шаблон, охлаждающий:

 <? $i=0; ?>

{exp:channel:entries 
    channel="products" 
    dynamic="no" 
    entry_id="{embed:ids}"
}

    <? $i  ; ?>

    {exp:playa:parents 
        field_id="25" 
        limit="1"
    }

        <!-- product -->

        {if no_parents}
            <? $i--; ?>
        {/if}

    {/exp:playa:parents}

    {if no_results}
        No results!
    {/if}

{/exp:channel:entries}

<? if ($i === 0 ) { echo 'No products found!'; } ?>
  

Логика, которую я имел для этой $i переменной, заключалась в том, чтобы получить точное представление о том, были ли выведены какие-либо результаты. «Результат» в этом смысле относится к тому, что выводится с помощью Playa.

exp_channel_entries Тест no_results запускается только в том случае, если {embed:ids} он пуст или встроенные идентификаторы не соответствуют записям в канале. Если entries метод возвращает записи, но ни один из результатов не имеет родительской записи, ничего не выводится — и мне нужен был способ определить это, и я подумал: «Хм, PHP должен уметь это делать, верно?»

Желаемый результат заключается в том, что 'No products found!' вывод выводится, когда $i = 0 , но по какой-то причине, $i всегда 0 независимо от того, какие записи выводятся.

О, и прежде чем вы спросите: ДА, PHP действительно включен. Пример: ниже, {embed:ids} = 41|78|79|80|81|87|106 . Когда установлено значение OUTPUT, теги PHP просто печатаются в исходном коде:

 <? $i=0; ?>
<? $i  ; ?>
<!-- product -->
<? $i  ; ?>
<!-- product -->
<? $i  ; ?>
<!-- product -->
<? $i  ; ?>
<!-- product -->
<? $i  ; ?>
<? $i--; ?>
<? $i  ; ?>
<!-- product -->
<? if ($i === 0 ) { echo 'No products found!'; } ?>
  

Если я переключаю синтаксический анализ PHP на ВВОД, теги обрабатываются, но $i = 0 каждый раз.

Я добавил echo $i; после $i=0 , $i , и $i-- . Если PHP настроен на ВЫВОД, как и раньше, операторы просто выводятся в исходном коде страницы. Если для PHP установлено значение INPUT, я получаю эту строку значений: 0 1 1 1 1 1 01

Итак, мои вопросы к вам, сообщество StackOverflow:
1) Почему PHP в режиме ВЫВОДА просто выводит теги PHP без их обработки?
2) Как я могу вести подсчет количества выводимых родительских продуктов?

Ответ №1:

Я не могу сказать вам, почему ваш PHP не анализируется при переключении на вывод (никогда не видел такого раньше), но я думаю, что есть более простой способ сделать это:

 {exp:query sql="SELECT child_entry_id FROM exp_playa_relationships WHERE parent_field_id = 25 AND child_entry_id IN({embed:ids})"}
    {exp:playa:parents field_id="25" entry_id="{child_entry_id}" limit="1"}
    <!-- product -->
    {/exp:playa:parents}
    {if no_results}<p>No products found!</p>{/if}
{/exp:query}
  

Этот запрос вернет только идентификаторы записей, у которых действительно есть родители. Единственное, что вам нужно будет сделать, это изменить переданную ids вставку с использования каналов на запятые.

Вы также можете попробовать это:

 {exp:channel:entries channel="products" entry_id="0{exp:query sql="SELECT parent_entry_id FROM exp_playa_relationships WHERE parent_field_id = 25 AND child_entry_id IN({embed:ids})"}|{parent_entry_id}{/exp:query}" dynamic="no"}
    <!-- product -->
    {if no_results}<p>No products found!</p>{/if}
{/exp:channel:entries}
  

Ответ №2:

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

Мои проблемы были решены с —

  1. Добавление полных начальных тегов php (с помощью php)
  2. Удалите все фигурные скобки и перейдите к альтернативному синтаксису

     foreach(items as item):
    
        ...
    
    endforeach;
      
  3. Изменение разрешений для файла на 755.

  4. Изменение владельца группы файла на веб-пользователя по умолчанию

  5. Удаление всех записей диспетчера шаблонов (если это не сработает, просто отредактируйте файл в самом диспетчере шаблонов)

Надеюсь, это поможет.