Оператор twig if не работает для extends

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

Вместо создания маршрутов POST и GET я хотел бы использовать оператор if в шаблоне TWIG, но он не работает; домашняя страница всегда загружается

Пробовал false и 'false'

вот мой itemListing.html.twig

{% if ajax == false %}

   {% extends 'homepage.html.twig' %}

{% endif %}

{% block content %}

    {% for item in items %}

         code

    {% endfor %}

{% endblock %}

и код PHP

return $this->render('itemSearch/itemListing.html.twig',[
    'ajax' => true,
]);

Возможно, я неправильно понимаю, но вы, кажется, отправляете ajax => false, а затем в своем шаблоне веточки вы проверяете if ajax == false, который, конечно же, будет иметь значение true, поэтому ваша домашняя страница загрузится. Может быть, вы хотите проверить, правда ли это, а не ложь?

Dirk Scholten 10.08.2018 16:55

извините, просто плохой пример, я обновлю вопрос, у меня только один с true и один с false в моем контроллере в зависимости от того, ajax это или нет

Sam 10.08.2018 16:58

Разве тег extends не должен быть первым тегом в шаблоне? И тогда вы можете переопределить / отобразить родительские блоки в соответствии с вашим условием if.

Elbarto 10.08.2018 17:01

@Elbarto, расширение - это именно то, чего я хочу избежать, если это ajax, остальное всегда должно отображаться, но мне, вероятно, придется поместить теги block в оператор if, поскольку они могут существовать только с расширением, я думаю

Sam 10.08.2018 17:09

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

john Smith 10.08.2018 17:12

Это моя точка зрения, вы можете просто расширить шаблон, несмотря ни на что, а затем в своем операторе if перечислить все блоки с их содержимым, чтобы удалить любой контент, просто напишите пустой блок, и если вы хотите, чтобы родительский блок был { {parent ()}} внутри блока

Elbarto 10.08.2018 17:12

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

Sam 10.08.2018 17:18
0
7
306
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

проверьте динамическое наследование extend
или условное наследование, вы можете сделать что-то вроде этого:

{% extends ajax ? "minimum.html" : "base.html" %}

похоже, работает для else, но мне ничего не нужно в первом утверждении. Я пробовал {% extends ajax ? "" : "homepage.html.twig" %}, но получаю ошибку на ajax true. Можем ли мы обойти это?

Sam 10.08.2018 17:32

Не очень красиво, но я только что создал dummy.html.twig с одним блоком веточки, и он работает. {% extends ajax ? "dummy.html.twig" : "homepage.html.twig" %} опять же, не очень. Можно ли сделать ваше выражение без первого аргумента?

Sam 10.08.2018 17:47

красивый подход, на мой взгляд, не будет разделяться на уровне шаблона, который вы должны различать на уровне контроллера или даже маршрутизации, как я сказал в своем комментарии, но пока он работает ... ;-)

john Smith 10.08.2018 17:49

ИМО, все другие методы дифференциации создают больше кода, а также ненужные дубликаты. Если вы сделаете больше маршрутов, у вас будет больше методов и больше шаблонов, и если у вас будет больше шаблонов; ну ... у вас есть больше шаблонов ... Я думаю, что это недостаток TWIG на данный момент, но я новичок в symfony ... Twig должен позволять легко опционально extends

Sam 10.08.2018 18:01

Другие вопросы по теме