2014-11-05 35 views
2

我去看看Symfony的擴展Twig函數form_widget實際上是如何工作的。我期待在symfony/src/Symfony/Bridge/Twig/Extension/FormExtension.php中找到該功能。它被添加到功能列表中:`form_widget()`Twig函數的代碼在哪裏?

public function getFunctions() 
{ 
    return array(

... 
     new \Twig_SimpleFunction('form_widget', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))), 

... 
    ); 
} 

但是沒有可調用的列表(即第二個參數爲空)。那麼在Twig模板中使用form_widget(a_form_element)時會調用哪些代碼?

+0

你有沒有想過這個?尋找它自己作爲表格窗口小部件的出發點我想創建 – Andy 2016-02-23 21:21:06

回答

2

我的答案有點晚了,但我碰巧調查了同樣的問題。這是我發現的:

當您使用form_widget()時調用的代碼是在編譯模板時直接由SearchAndRenderBlockNode類生成的。編譯好的模板代碼然後調用Symfony\Component\Form\FormRenderer::searchAndRenderBlock(),找到合適的Twig塊,並提供上下文並進行渲染。

+0

感謝您對舊問題的跟進。真的很高興終於明白「魔法」是如何運作的。 – dnagirl 2016-06-14 13:51:52

0

我不承認那裏的名字空間。或者那個代碼。

礦是Symfony的\橋\嫩枝\延期\ FormExtension.php

它使用的Symfony \橋\嫩枝\節點\ SearchAndRenderBlockNode

+0

我編輯了指向正確源代碼的鏈接,但兩個地方的代碼都是相同的。無論如何,'Twig_SimpleFunction'需要3個參數:第一個是在Twig模板中應該被識別爲函數名的字符串,第二個是運行的實際PHP函數,第三個是要傳遞的選項數組到PHP函數。 'SearchAndRenderBlockNode'是一個選項。我想知道在Twig模板中使用'form_widget()'時會調用哪些PHP函數。 – dnagirl 2014-11-05 18:43:14

0

你可以找到它在FrameworkBundle/Resources/views/Form/form_widget.html.php或者等值的模板Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

+0

我不在尋找模板代碼。我正在尋找將表單傳遞給模板代碼的代碼。 – dnagirl 2014-11-10 11:44:27

相關問題