2013-05-04 72 views
0

我試圖弄清楚爲什麼我的形式試圖插入,而不是更新它的行,但我不知道,這裏的代碼:

//This function is the one that displays the form 
public function executeIndex(sfWebRequest $request) { 

... 

    $evrescrit = new Criteria(); 
    $evrescrit->addSelectColumn(EvaluacionResumenPeer::STATUS); 
    $evrescrit->addSelectColumn(EvaluacionResumenPeer::RELEVANCE); 
    $evrescrit->addSelectColumn(EvaluacionResumenPeer::QUALITY); 
    $evrescrit->addSelectColumn(EvaluacionResumenPeer::COMMENT); 
    $evrescrit->add(EvaluacionResumenPeer::RESUMEN_ID, $this->resumen->getId()); 

    $this->form = new EvaluacionResumenForm(EvaluacionResumenPeer::retrieveByPK($this->resumen->getId()), array('criteria' => $evrescrit)); 
    //$this->form = new EvaluacionResumenForm(EvaluacionResumenPeer::retrieveByPK($this->resumen->getId())); 
} 


//The form, I'm using the Base but unsetting some columns, PK and FK. 
class EvaluacionResumenForm extends BaseEvaluacionResumenForm { 

public function configure() { 
    unset(
      $this['created_at'], $this['updated_at'], $this['evaluador_id'], $this['resumen_id'] 
    ); 
} 

} 


//This is where the form submits 
public function executeEdit(sfWebRequest $request) { 

    $user = $this->getUser()->getGuardUser(); 
    $this->forward404Unless($user); 
    $this->form = new EvaluacionResumenForm(); 

    if ($request->isMethod(sfRequest::POST)) { 
     $this->processEdit($request, $this->form); 
    } 
} 

public function processEdit(sfWebRequest $request, sfForm $form) { 

    $this->form->bind($request->getParameter($form->getName())); 
    //$this->form->bind($request->getPostParameter($request->getPostParameter('status'))); 

    $errors = $this->form->getErrorSchema()->getErrors(); 
    if (count($errors) > 0) { 
     foreach ($errors as $name => $error) { 
      echo $name . ': ' . $error . '<br>'; 
      echo $request->getParameter('evaluacion_resumen[resumen_id]'); 
     } 
    } 

    if ($this->form->isValid()) { 
     $this->form->save(); 
     $this->getUser()->setFlash('notice', 'Sus modificaciones han sido grabadas.'); 
     $this->redirect('@resumenes_asignados'); 
    } 
} 

在模板我用它來呈現形式:

<?php echo $form->renderHiddenFields(); ?> 
<?php echo $form; ?> 

我得到的錯誤,當我提交表單(我從數據庫中的值,並用這種形式進行更新)是這一個:

Unable to execute INSERT statement. [wrapped: SQLSTATE[HY000]: General error: 1452 Cannot add or update a child row: a foreign key constraint fails (`abstracts/evaluacion_resumen`, CONSTRAINT `evaluacion_resumen_FK_1` FOREIGN KEY (`resumen_id`) REFERENCES `resumen` (`id`))] 

我真的不知道爲什麼它試圖插入一個新的行,我需要更新現有的。

謝謝。

回答

1

這是因爲executeEdit()函數中的下面一段代碼。從sfFormPropel

$this->form = new EvaluacionResumenForm(); 

BaseEvaluacionResumenForm繼承。 sfFormPropel將Propel對象作爲其構造函數的第一個參數。如果沒有對象通過(就像你的情況一樣),它將使用getModelName()函數來確定這個表單在你的模型中使用哪個對象並創建一個新對象(見下文)。

// \lib\vendor\....\sfFormPropel.class.php 
public function __construct(BaseObject $object = null, $options = array(), $CSRFSecret = null) 
    { 
    $class = $this->getModelName(); 
    if (is_null($object)) 
    { 
     $this->object = new $class(); 
    } 

所以當形式保存,它的保存新的對象,這就是爲什麼你要插入而不是更新的。

你想要做這樣的事情:

// This is where the form submits 
// Example url, http://mysite.com/moduleName/edit/id/:id 
public function executeEdit(sfWebRequest $request) { 

    $user = $this->getUser()->getGuardUser(); 
    $this->forward404Unless($user); 

    // Get the primary key of the object we want to use or forward 404 
    $this->forward404Unless($id = $request->getParameter('id'), "Required parameter 'id' must be present in request"); 

    // Retrieve the object from the database using the id or forward 404 
    $this->forward404Unless($er = EvaluacionResumenPeer::retrieveByPK($id), sprintf("No object could be retrieved by %s", $id)); 

    $this->form = new EvaluacionResumenForm($er); 

    if ($request->isMethod(sfRequest::POST)) { 
     $this->processEdit($request, $this->form); 
    } 
} 

作爲一個附加的檢查,您可以更改請求的類型在您的表單模板把當對象是不是新象下面這樣。這將確保您不會在編輯操作中意外插入任何新對象。

// apps\appName\modules\moduleName\templates\editSuccess.php 
if (!$form->isNew()): ?> 
    <input type="hidden" name="sf_method" value="PUT" /> 
<?php endif ?> 

然後在您的executeEdit()函數中。如果請求是POST類型,檢查它是否爲PUT,則更改該行。

if ($request->isMethod(sfRequest::PUT)) { 
+0

非常感謝!它像一個魅力。 – MauJFernandez 2013-05-05 23:41:54

相關問題