Вызов функции PHP из шаблона Twig
у меня есть функция в моем контроллере, которая возвращает массив сущностей, поэтому в моем шаблоне twig я делаю это, чтобы перебирать элементы:
{% for groupName, entity in items %}
<ul>
<ul>
{% for element in entity %}
<li>{{ element.getLabel }}</li>
<li><input type="text" name="detail[{{ element.getId }}]" id="pd_{{ element.getId }}" /><input type="text" name="price[{{ element.getId }}]" id="pd_price_{{ element.getId }}" /><input type="text" name="stock[{{ element.getId }}]" id="pd_stock_{{ element.getId }}" /></li>
{% endfor %}
</ul>
</ul>
{% endfor %}
в моем контроллере у меня также есть эта функция PHP:
private function DetailCombination($arr, $level, &$result, $curr = array()) {
for ($i = 0; $i < count($arr); $i++) {
$new = array_merge($curr, array($arr[$i]));
if ($level == 1) {
sort($new);
if (!in_array($new, $result)) {
$result[] = $new;
}
} else {
combinations($arr, $level - 1, $result, $new);
}
}
}
Я могу назвать это так:
for ($i = 0; $i < count($arr); $i++) {
$this->DetailCombination($arr, $i + 1, $result);
}
// TEST
foreach ($result as $arr) {
echo join(" ", $arr) . '<br>';
}
возможен доступ к функции PHP из шаблона Twig, чтобы получить все возможные комбинации элементов в сущности? Как?
** обновление **
эта функция это возвращает объекты, обработанные после шаблона Twig:
private function getVariations($category_id) {
$items = array();
$em = $this->getDoctrine()->getManager();
$entityCategory = $em->getRepository('CategoryBundle:Category')->find($category_id);
foreach ($entityCategory->getProductDetails() as $entity) {
if ($entity->getToProduct() == 1) {
foreach ($entity->getDetailGroup() as $group) {
if (!array_key_exists($group->getName(), $items)) {
$items [$group->getName()] = array();
}
$items [$group->getName()] [] = $entity;
}
}
}
return $items;
}
7 ответов
невозможно получить доступ к любой функции PHP внутри Twig напрямую.
Что вы можете сделать, это написать расширение Twig. Общей структурой является написание сервиса с некоторыми функциями полезности, напишите расширение Twig в качестве моста для доступа к сервису из twig. Расширение Twig будет использовать сервис и ваш контроллер также может использовать сервис.
посмотреть: http://symfony.com/doc/current/cookbook/templating/twig_extension.html
Ура.
уже есть расширение Twig, которое позволяет вызывать PHP-функции, формирующие ваши шаблоны Twig, такие как:
Hi, I am unique: {{ uniqid() }}.
And {{ floor(7.7) }} is floor of 7.7.
официальные репозитории расширений.
вы можете проверить вашу полностью определенную функцию
$arr = get_defined_functions();
print_r($arr);
это даст вам массив всех функций, если ваша функция существует в нем, вы можете использовать ее как:
{{ user.myfunction({{parameter}}) }}
хотя я согласен с комментариями о передаче переменных от вашего контроллера, вы также можете зарегистрировать неопределенные функции при настройке среды twig
$twig->registerUndefinedFunctionCallback(function ($name) {
// security
$allowed = false;
switch ($name) {
// example of calling a wordpress function
case 'get_admin_page_title':
$allowed = true;
break;
}
if ($allowed && function_exists($name)) {
return new Twig_Function_Function($name);
}
return false;
});
не пытались вызвать функцию на объекте в качестве исходного вопроса
Я удивлен, что кодовый ответ еще не опубликован, это один лайнер.
вы могли бы просто {{ categeory_id | getVariations }}
это однострочный:
$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations'));
Я знаю, что это старый нить. Но с symfony 3.3 я сделал следующее:
{{ render(controller(
'AppBundle\Controller\yourController::yourAction'
)) }}
Если вы действительно знаете, что вы делаете, и вы не возражаете против злых путей, это только дополнительное расширение Twig вы когда-нибудь понадобится:
function evilEvalPhp($eval, $args = null)
{
$result = null;
eval($eval);
return $result;
}