2012-01-04 25 views
0

我已經創建了一個表單,其中嵌入了另一個表單。我的問題是關於這個嵌入式表單 - 我使用的sfWidgetFormDoctrineChoice小部件的選項multiple設置爲true。這種嵌入形式的配置方法的代碼:Symfony sfWidgetFormDoctrineChoice具有多個選項

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給出:\開發\ WWW \ flow_dms \ LIB \供應商\ symfony的\ LIB \插件\ sfDoctrinePlugin \ LIB \數據庫\ sfDoctrineConnectionProfiler.class.php 上線198

多 - 我知道,爲什麼 - 在symfony中的調試模式下,我可以看到在堆棧跟蹤如下:

在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個小時了,所以也許有人能夠提供一些幫助。

+0

而不是編輯你可以回答的問題可以接受的答案 – Arasu 2012-01-05 15:16:12

回答

0

那麼,我似乎找到了一個解決方案(雖然不是最好的,我猜)。希望對別人有幫助。

最後,經過多次思考,我得出結論,如果問題來自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); 
    } 
    } 

    (...) 

} 

所以,現在如果遇到一個數組,而不是一個單一的值,它只是創建一個臨時的對象,並將其保存爲每個數組的值。

絕對不是一個優雅的解決方案,但它的工作原理(請記住它是爲數據的特定結構編寫的,它只是我的方法的效果,即請參閱調試模式中的錯誤然後嘗試以任何方式糾正它)。

+0

好吧,這似乎並不是一個legti解決方案,它只是一個解決方法。 今天我遇到了與我的模塊相同的問題(我認爲是這樣),但在我的情況下,問題出現在總標準值上。 (父)ForeignKey。 我的模型hast foreignKey B和這個鍵被一個數組()封裝。 這是生病的學說魔法,我不知道問題在哪裏。 – 2012-03-15 09:31:42

+1

是的,這只是一個解決方法,但我還沒有找到任何其他方式來做到這一點。 – XanatosLightfiren 2012-04-17 10:08:51

相關問題