Symfony sfWidgetFormDoctrineChoice с включена множествена опция

Създадох формуляр, в който вградих друг формуляр. Въпросът ми е относно този вграден формуляр - използвам изпълним модул 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 мога да видя следното в проследяването на стека:

в Doctrine_Connection->exec('INSERT INTO stage_has_prerequisites (prerequisite_id, stage_id) VALUES (?, ?)', array(array('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 часа за проблема, така че може би някой може да помогне.


person XanatosLightfiren    schedule 04.01.2012    source източник
comment
Вместо да редактирате въпроса, на който можете да отговорите, можете да приемете отговора   -  person Arasu    schedule 05.01.2012


Отговори (1)


Е, изглежда, че намерих решение (макар и не най-доброто, предполагам). Надяваме се, че ще бъде полезно за някого.

Накрая, след дълго мислене, стигнах до извода, че ако проблемът идва от това, че 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);
    }
  }

  (...)

}

Така че сега, ако срещне масив вместо една стойност, той просто създава временен обект и го записва за всяка от стойностите на този масив.

Не е елегантно решение, определено, но работи (имайте предвид, че е написано за специфичната структура на данните и е просто ефектът от моята методология, а именно Вижте какво не е наред в режима за отстраняване на грешки и след това се опитайте да коригирате По всякакъв възможен начин).

person XanatosLightfiren    schedule 08.01.2012
comment
Е, това не изглежда да е легитимно решение, то е просто заобиколно решение. Днес се сблъсках със същия (мисля така) проблем с един от моите модули, но в моя случай проблемът възниква при обща стандартна стойност. (Родителският) ForeignKey. Моят модел A има ForeignKey B и този ключ се обвива от array(). Това е болна доктринна магия и не знам къде е проблемът. - person Julius F; 15.03.2012
comment
Да, това е просто заобиколно решение, но не намерих друг начин да го направя. - person XanatosLightfiren; 17.04.2012