2013-09-06 2 views
19

У меня есть функция в моем контроллере, который возвращает массив сущностей, так в моем шаблоне веточки я делаю это для перебора элементов:Вызова PHP функция из шаблона 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 удовольствия ction из шаблона Twig, чтобы получить все возможные комбинации элементов в сущности? Как?

** UPDATE **

Это функция, которая возвращает объекты обрабатываются после того, как с помощью 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; 
} 
+1

Почему вы не обрабатывать его удар справа в контроллере и отправить как '$' деталей и '$ combinations' к виду? –

+0

@ManuelGutierrez Я пытаюсь, но не знаю, как это сделать, любые идеи по этому поводу? – Reynier

+0

просто получите '$ items' из базы данных, как обычно, затем передайте ее на функцию' DetailCombination() 'на контроллере, сохраните ее на другой переменной' $ комбинаций' и передайте оба представления, все эти шаги будут одна и та же функция контроллера. –

ответ

17

Его не возможно получить доступ к любой функции PHP внутри Twig непосредственно.

Что вы можете сделать, это написать расширение Twig. Общая структура заключается в написании службы с некоторыми полезными функциями, написать расширение Twig в качестве моста для доступа к службе с ветки. Расширение Twig будет использовать сервис, и ваш контроллер также может использовать эту услугу.

Взгляните: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Приветствия.

8

Существует уже расширение Twig, что позволяет вызвать PHP функции образуют шаблоны Twig, как:

Hi, I am unique: {{ uniqid() }}. 

And {{ floor(7.7) }} is floor of 7.7. 

Смотреть официальный extension repository.

1

Вы можете проверить все определенную функцию

$arr = get_defined_functions(); 
print_r($arr); 

это даст вам множество всех функций, если ваша функция существует в нем вы можете использовать его как:

{{ user.myfunction({{parameter}}) }} 
2

Хотя я согласен с комментариями о передаче в переменных с вашего контроллера вы также можете зарегистрировать неопределенные функции при настройке среды твинга

$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; 
    }); 

Это из Twig recipe page

Не пробовал вызова функции на объекте, как исходный вопрос просил

1

Принятый ответ от createproblem является правильным. Но если вы действительно знаете, что вы делаете, и вы не против злых путей, это единственное дополнительное расширение Twig вам когда-нибудь понадобится:

function evilEvalPhp($eval, $args = null) 
{ 
    $result = null; 
    eval($eval); 
    return $result; 
} 

P.S. Единственная причина использовать Twig вместо PHP в качестве шаблона языка: бесконечная скука!

+0

Вы ошибаетесь в своем ответе, ответ createproblems НЕ вызывает никаких проблем с безопасностью, таких как код PHP, который вы публикуете здесь. Вы также ошибаетесь в отношении не по теме сообщения Twig. Я даже не представляю, как некоторые люди в наши дни все еще старомодны, разрушая свой проект, используя PHP в качестве шаблонов для моделирования. Это уже давно выросло из этого и является одним из лучших способов сделать абсолютно ужасный код. – John

+0

John, почему кто-нибудь подумает, что PHP-код на уровне представления создаст ужасный код? Это ложь. Посмотрите, например. в средстве просмотра-представления по умолчанию в Zend Framkework 1 и 2 (https://framework.zend.com/manual/2.4/en/modules/zend.view.php-renderer.scripts.html) или в Wordpress и т. д. Мой php код не вне темы, поскольку он позволяет вызывать функцию PHP из шаблона Twig! – solarbaypilot

1

Я удивлен, что ответ на этот вопрос уже не отправлен, это один лайнер.

Вы можете просто {{ categeory_id | getVariations }}

Это один вкладыш:

$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations')); 
0

Я знаю, что это старый нить. Но с Symfony 3.3 Я сделал это:

{{ render(controller(
    'AppBundle\\Controller\\yourController::yourAction' 
)) }} 

Symfony docs

Смежные вопросы