@slavabars
Веб программист

Как в Twig вывести вывод метода класса?

Есть 2 бд:
salon: id name city_id
city: id, name

Циклом выводу имена салонов и ид города
{% for salonTables in salonTable %}
{ salonTables.name|escape }}
{{ salonTables.cityId|escape }}
{% endfor %}


Получаю имя города так
\AppBundle\Entity\City::getNameFromId(salonTables.cityId)

Как вы вести имя города в twig? Конструкция типа
{% for salonTables in salonTable %}
{ salonTables.name|escape }}
{{ \AppBundle\Entity\City::getNameFromId(salonTables.cityId) }}
{% endfor %}


Возвращает ошибку
Unexpected character "\" in salon/index.html.twig at line 151
  • Вопрос задан
  • 2910 просмотров
Решения вопроса 1
@jaxel
На сколько я знаю в твиге нельзя использовать статичные методы классов.
Могу предложить 2 варианта:
1) Создать свой экстеншен для твига, и использовать его на переменной как фильтр
{{ salonTables.cityId|cityNameFromId }}
2) Передавать в шаблон экземпляр класса City и использовать метод уже из него.
{{ city.nameFromId(salonTables.cityId) }}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
lexxpavlov
@lexxpavlov
Программист, преподаватель
Запустить статический метод класса можно вызовом через объект этого класса:
class Test {
    private $x = 10;

    public static function getSTatic() {
        return 'static';
    }
    public function getNormal() {
        return 'normal ' . $this->x;
    }
}

Теперь в контроллере нужно создать объект этого класса и передать в шаблон:
{{ test.normal }}
{{ test.static }}

В вашем случае можно вызвать вот так: {{ city.nameFromId(salonTables.cityId)) }}, где city - объект класса City.

Но вообще-то у вас лучше переделать всё полностью. Судя по тегу Symfony в вопросе, вы пользуетесь фреймворком Symfony2. Тогда вам вообще не стоит писать статические методы для получения записей, воспользуйтесь доктриной.
1) В шаблоне неправильно обращаться к базе данных, правильно подготовить все нужные данные в контроллере и передать их в шаблон:
class SalonController extends Controller
{
    /**
     * @Route("/salon/{id}")
     * @Template
     */
    public function salonAction($id)
    {
        $salons = $this->getDoctrine()->getRepository('AppBundle:City')->findBy(array('cityId' => $id));

        return array('salons' => $salons);
    }
}

2) твиг сам экранирует вывод, делать |escape не обязательно
3) не стоит добавлять слово table в имя сущности, гораздо лучше писать их вот так:
{% for salon in salons %}
{ salon.name }}
{{ salon.cityId }}
{% endfor %}
Ответ написан
Комментировать
keltanas
@keltanas
Software Developer
\AppBundle\Entity\City::getNameFromId(salonTables.cityId)

Что-то мне подсказывает, что он и так использует доктрину... в качестве AR...
Ответ написан
Комментировать
Astrolit
@Astrolit
надумано: умён, хитер, характер отсутствует
вот не нахожу решение для класса моя переменная php $value.vec_dl принимает три варианта: up, down, none
<i class="fa fa-opencart  {{ value.vec_dl }} "></i>
в twig не работает?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы