2011-07-04 32 views
1

我在爲NestedSet結構呈現sfWidgetFormDoctrineChoice(複選框集)小部件時遇到困難。sfWidgetFormDoctrineChoice for NestedSet模型

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'] ?> 它只能顯示錶單控件(複選框)對我的層次結構的第一級別的元素。

我找,讓我來遍歷控件的選擇我會遍歷集合的方式實現:

<?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

如果有人關心,我想我發現了一個奇妙的解決方案,它可以讓你遞歸遍歷模板複選框。其背後的想法是,您將'relatedmodel_list'小部件配置爲單個複選框,並在您的模板中多次渲染它(同時遍歷相關模型集合)。

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

我使用sfWidgetFormTree顯示我的nestedSet。如果你真的想以平坦的方式顯示你的樹,不要使用HYDRATE_RECORD_HIERARCHY。

連接的部件是十分便利,你只需要提供一個選擇數組是這樣的:

$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

相關問題