【问题标题】:sfWidgetFormDoctrineChoice for NestedSet modelNestedSet 模型的 sfWidgetFormDoctrineChoice
【发布时间】:2011-07-04 12:47:18
【问题描述】:

我在为 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'] ?> 它只会为我的层次结构的第一级元素显示表单小部件(复选框)。

我正在寻找一种实现,它允许我以迭代集合的方式迭代小部件的选择:

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

【问题讨论】:

    标签: symfony1 doctrine symfony-1.4 symfony-forms doctrine-1.2


    【解决方案1】:

    我正在使用sfWidgetFormTree 来显示我的嵌套集。如果您真的想以平面方式显示树,请不要使用 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')
      );
    

    【讨论】:

    • 我真的不想在一个命令中呈现我的表单。我需要遍历选项及其子项。
    【解决方案2】:

    如果有人关心,我想我找到了一个很棒的解决方案,它允许您递归地遍历模板中的复选框。它背后的想法是您将“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; ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多