Symfony sfWidgetFormDoctrineChoice с несколькими опциями на - PullRequest
0 голосов
/ 04 января 2012

Я создал форму, в которую я вставил другую форму.Мой вопрос об этой встроенной форме - я использую виджет sfWidgetFormDoctrineChoice с параметром множественного набора, установленным в значение true.Код для метода конфигурации этой встроенной формы:

public function configure()
  {
    unset($this['prerequisite_id']);
    $this->setWidget('prerequisite_id', new sfWidgetFormDoctrineChoice(array(
        'model' => 'Stage',
        'query' => Doctrine_Query::create()->select('s.id, s.name')->from('Stage s')->where('s.workflow_id = ?', $this->getOption('workflow_id') ),
        'multiple' => true
    )));

    $this->setValidator('prerequisite_id', new sfValidatorDoctrineChoice(array(
        'model' => 'Stage',
        'multiple' => true,
        'query' => Doctrine_Query::create()->select('s.id, s.name')->from('Stage s')->where('s.workflow_id = ?', $this->getOption('workflow_id') ),
        'column' => 'id'
    )));
  }

Я удалил поле prerequisite_id, потому что оно включено в базовую форму, но я хочу, чтобы оно было множественным выбором.Теперь, когда я добавил валидатор, кажется, что все работает (он проходит валидацию), но, похоже, возникают проблемы с сохранением записей, если отправлено более одного выбора.

Я получаю это предупреждение PHP после того, какотправка формы:

Предупреждение: strlen () ожидает, что параметр 1 будет строкой, массив представлен в D: \ Development \ www \ flow_dms \ lib \ vendor \ symfony \ lib \ plugins \ sfDoctrinePlugin \ lib\ database \ sfDoctrineConnectionProfiler.class.php в строке 198

и более - я знаю, почему - в режиме отладки Symfony я вижу следующее в трассировке стека:

at Doctrine_Connection-> exec ('INSERT INTO stage_has_prerequisites (prerequisite_id, stage_id) VALUES (?,?)', массив (массив ('12 ',' 79 '),' 103 '))

Итак, что делает Symfony - отправляет в Doctrine массив вариантов выбора - и, как я вижу в запросе отладки sql, Doctrine не может правильно отобразить запрос.

Есть идеи, как это исправить?Мне нужно было бы сгенерировать два запроса для двух вариантов:

INSERT INTO stage_has_prerequisites (prerequisite_id, stage_id) VALUES (12, 103);
INSERT INTO stage_has_prerequisites (prerequisite_id, stage_id) VALUES (79, 103);

stage_id всегда одинаков (я имею в виду, что он устанавливается вне этой формы формой, в которую он встроен).

Я уже потратил 4 часа на решение этой проблемы, поэтому, возможно, кто-то сможет оказать некоторую помощь.

1 Ответ

0 голосов
/ 08 января 2012

Ну, кажется, я нашел решение (хотя, я думаю, не самое лучшее).Надеюсь, это кому-нибудь пригодится.

Наконец, после долгих раздумий я пришел к выводу, что если проблема возникает из-за невозможности сохранения записи Doctrine_Record, если он встречает массив вместо одного значения,тогда самым простым решением было бы переписать метод save() для Doctrine_Record.И вот что я сделал:

class StageHasPrerequisites extends BaseStageHasPrerequisites
{
  public function save(Doctrine_Connection $conn = null)
  {
    if( is_array( $this->getPrerequisiteId() ) )
    {
      foreach( $this->getPrerequisiteId() as $prerequisite_id )
      {
        $obj = new StageHasPrerequisites();
        $obj->setPrerequisiteId( $prerequisite_id );
        $obj->setStageId( $this->getStageId() );
        $obj->save();
      }
    }
    else
    {
      parent::save($conn);
    }
  }

  (...)

}

Так что теперь, если он встречает массив вместо одного значения, он просто создает временный объект и сохраняет его для каждого из значений этого массива.

Определенно, это не элегантное решение, но оно работает (имейте в виду, что оно написано для конкретной структуры данных, и это просто результат моей методологии, а именно См. Что не так в отладкеРежим и затем попытайтесь исправить это любым возможным способом ).

...