sfWidgetFormDoctrineChoice для модели NestedSet - PullRequest
1 голос
/ 04 июля 2011

Я испытываю трудности при рендеринге виджета sfWidgetFormDoctrineChoice (набор флажков) для структуры 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; ?>

Ответы [ 2 ]

0 голосов
/ 08 июля 2011

Если кому-то все равно, я думаю, я нашел замечательное решение, которое позволяет рекурсивно перебирать флажки в шаблоне. Идея заключается в том, что вы настраиваете виджет «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 голосов
/ 04 июля 2011

Я использую 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')
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...