2011-07-04 3 views
1

NestedSet 구조의 sfWidgetFormDoctrineChoice (체크 박스 세트) 위젯 렌더링에 어려움이 있습니다.NestedSet 모델의 sfWidgetFormDoctrineChoice

class ModelForm extends BaseModelForm 
{ 
    public function configure() 
    { 
     $this->setWidget('relatedmodel_list', new sfWidgetFormDoctrineChoice(array(
     'expanded' => true, 
     'multiple' => true, 
     'model' => 'Relatedmodel', 
     'table_method' => 'fetchTree' 
    ))); 
    } 
} 
class RelatedmodelTable extends Doctrine_Table 
{ 
    /** 
    * Gets tree elements in one query (one root only) 
    */ 
    public function fetchTree() 
    { 
    $q = $this->createQuery('m') 
     ->addOrderBy('m.lft'); 

    $tree = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD_HIERARCHY); 

    return $tree; 
    } 
} 

지금, 나는 그냥 이런 형태로 렌더링하는 경우 : <?php echo $form['relatedmodel_list'] ?> 를 그것은 것입니다 내 계층 구조의 첫 번째 수준 요소 만 표시 형태의 위젯 (체크 박스).

나는 나 위젯의 선택 내가 수집을 반복 할 방법을 반복 할 수 있도록 구현을 찾고 있어요 : 내 nestedSet을 표시 sfWidgetFormTree을 사용하고

<?php foreach ($form['relatedmodel_list'] as $widget): ?> 
    <?php echo $widget->render() ?> 
    <?php foreach ($widget->getChildren() as $child_widget): ?> 
    <?php echo $child_widget->render() ?> 
    <?php endforeach; ?> 
<?php endforeach; ?> 

답변

0

, 나는 당신이 반복적으로 템플릿의 체크 박스를 반복 할 수있는 멋진 해결책을 찾을 생각을 . 그 배경은 '관련 모델 목록'위젯을 단일 체크 박스로 구성하고 템플릿에서 여러 번 렌더링하는 것입니다 (관련 모델 컬렉션을 반복하면서).

class ModelForm extends BaseBookForm 
{ 
    public function configure() 
    { 
    $this->setWidget('relatedmodel_list', new myWidgetFormInputCheckbox()); 
    } 
} 

이제 확인란의 이름과 값 속성이 올바르지 않습니다. 이것은 매우 쉽게 고정 할 수 있습니다

class myWidgetFormInputCheckbox extends sfWidgetFormInputCheckbox 
{ 
    public function render($name, $value = null, $attributes = array(), $errors = array()) 
    { 
    //fix value checking 
    if (in_array($attributes['value'], (array)$value)) 
    { 
     $attributes['checked'] = 'checked'; 
    } 
    //fix name for multiple 
    $name = $name . "[]"; 

    return parent::render($name, null, $attributes, $errors); 
    } 
} 

이제 우리는 재귀 적으로 템플릿에 우리의 양식 위젯을 렌더링 할 수 있습니다

//_form.php 
<ul> 
    // Model::getRelatedTree() is proxy to Relatedmodel::fetchTree() 
    <?php include_partial('node', array('node' => $form->getObject()->getRelatedTree(), 'form' => $form)) ?> 
</ul> 

//_node.php 
<?php foreach ($node as $item): ?> 
<li> 
    <?php echo $form['pages_list']->render(array('value'=>$item->id)) ?> 
    <?php echo $form['pages_list']->renderLabel((string)$item) ?> 
    <?php if (isset($item['__children']) && count($item['__children']) > 0): ?> 
    <ul> 
    <?php include_partial('node', array('node' => $item['__children'], 'form' => $form)) ?> 
    </ul> 
    <?php endif; ?> 
</li> 
<?php endforeach; ?> 
0

. 평평한 방향으로 트리를 표시하려면 HYDRATE_RECORD_HIERARCHY를 사용하지 마십시오.

링크 위젯은 매우 convinient이다

, 당신은 단지 이런 선택의 배열을 제공해야합니다 : 사람이 걱정하는 경우

$choices = array(
    1=> array('label'=>'test', 'children'=>array(
     2=> array('label'=>'test2', 'children'=> array(
     3=> array('label'=>'test3'), 
     4=> array('label'=>'hans') 
    )), 
     5=> array('label'=>'wurst') 
    )), 
    6=>array('label'=>'letzter') 
); 
+0

난 정말 하나의 명령에 내 양식을 렌더링하고 싶지 않아요. 옵션과 자녀를 반복해야합니다. – Dziamid

관련 문제