2015-01-22 1 views
0

내 응용 프로그램에는 클래스 A와 B가 있습니다. 클래스 A의 개체는 클래스 B의 많은 개체를 소유하고 있습니다.하나의 속성에 대해 프로토 타입 위젯 템플릿을 사용자 정의하려면 어떻게해야합니까?

이 개체를 편집하려면 복합 양식이 있어야합니다. 외부 양식은 오브젝트 A의 특성을 편집하고 내부 양식은 B의 모든 소유 인스턴스를 편집합니다.이 부속 양식은 항목을 표 행으로 표시해야합니다. 테이블 자체는 외부 양식에 의해 정의됩니다.

내 프로젝트에서 PHP 템플릿 엔진을 사용하고 있습니다. 지금까지 필자는 B 형의 객체를 편집하기 위해 템플릿 위젯을 덮어 썼습니다. B의 모든 인스턴스를 보유하고있는 A의 속성은 양식에 collection으로 렌더링됩니다. 이것은 다음과 같은 템플릿이 렌더링되는 의미 : collection_widget.html.php -> form_widget_compound.html.php -> form_rows.html.php -> form_row.html.php -의> my_custom_template_widget.html.php

그러나 일부를 이 템플릿은 렌더링중인 템플릿을 둘러싸는 태그를 추가하여 테이블 레이아웃을 파괴합니다. _formForA_propertyB_widget.html.php를 생성하고 거기에 모든 것을 수동으로 렌더링하여이 속성에 대한 템플릿을 덮어 쓰면이 문제를 해결할 수있었습니다.

지금 문제는이 컬렉션에 개체를 추가 할 수 있어야한다는 것입니다. Symfony에서 제공하는 프로토 타입 기능을 사용하여이 작업을 수행하려고합니다. 그러나 프로토 타입은 덮어 쓰여진 템플릿을 사용하여 만들지 않은 것 같습니다 (물론 컬렉션이 아니고 단일 행이 아니기 때문에). 대신 form_row.html.php를 사용하여 만듭니다. _formForA_propertyB_form.html.php를 작성하여이 덮어 쓰기를 시도했지만 아무런 차이가 없습니다.

이 특정 속성에 대한 프로토 타입 템플릿을 어떻게 덮어 쓸 수 있습니까?

본질적으로이 질문은 How to customize the data-prototype attribute in Symfony 2 forms과 매우 비슷하지만이 것은 PHP를 템플릿 엔진으로 사용하는 것과 같습니다. 다른 질문에 대한 답변은 PHP 엔진에서 사용할 수없는 TWIG 템플릿 엔진의 기능을 사용합니다.

조회수/EditA.html.php :

<table data-prototype="<?php echo $view->escape($view['form']->row($form['collectionOfB']->vars['prototype'])) ?>"> 
    <thead> 
    <tr> 
     <th>Description</th> 
     <th>Prop1</th> 
     <th>Prop2</th> 
    </tr> 
    </thead> 

    <tbody> 
     <?php echo $view['form']->widget($form['collectionOfB']) ?> 
    </tbody> 
</table> 

조회수/양식/_objectA_collectionOfB_widget.html.php :

<?php foreach ($form as $child) : ?> 
    <?php echo $view['form']->widget($child) ?> 
<?php endforeach; ?> 


샘플 코드는 문제를 설명하기 위해 조회수/형식/objectB_widget.html.php :

<tr> 
    <td><?php echo $view['form']->widget($form['description']) ?> 
     <?php echo $view['form']->errors($form['description']) ?></td> 
    <td><?php echo $view['form']->widget($form['prop1']) ?> 
     <?php echo $view['form']->errors($form['prop1']) ?></td> 
    <td><?php echo $view['form']->widget($form['prop2']) ?> 
     <?php echo $view['form']->errors($form['prop2']) ?></td> 
</tr> 

나는 형태가 제대로 렌더링됩니다 만,이 프로토 타입, 말했듯이 :

<div> 
    <label class="required" >__name__label__</label> 
    <tr> 
    <!-- snip more code here --> 
    </tr> 
</div> 

당신이 내가 그것을 것 같은 원하지 않는 모두의 labeldiv을 포함하고 있음을 알 수 테이블을 파괴하라.

답변

0

대답은 내가 생각했던 것보다 간단하다는 것이 밝혀졌습니다. 전체 행을 렌더링하는 대신 (즉, div을 포함하는 form_row.html.php 템플릿을 렌더링) 위젯 만 렌더링해야합니다.

은 기본적으로 당신이 할 필요가

$view->escape($view['form']->widget($form['collectionOfB']->vars['prototype'])) 

$view->escape($view['form']->row($form['collectionOfB']->vars['prototype'])) 

교체입니다