【问题标题】:symfony 1.4 doctrine Form Bindsymfony 1.4 教义表单绑定
【发布时间】:2011-03-12 07:37:14
【问题描述】:

也许是简单的问题,我只是错过了一些东西。

我有 2 个具有 3 个相同字段(名称/类型)的表。

occurrenceoccurrence_queue

Schema

Occurrence:
  tableName: occurrence
  columns:
    id: {the usual}
    date: {type: date}
    start_time: {type: time}
    end_time: {type: time}
    eid: {a forign key}
OccurrenceQueue:
  tableName: occurrence_queue
  columns:
    id: <-Same As Above->
    occurrence_id: {the usual}
    date: <-Same As Above->
    start_time: <-Same As Above->
    end_time: <-Same As Above->

然后我有一个基于 Occurrence 构建的模块,即学说:generate-module app *name* Occurrence

在这个模块中,我加载了一组事件,非常标准,所以这里是复杂的部分。我想要做的是从Occurrence 加载3 个公共字段,但是当我保存表单时,我希望它保存到OccurrenceQueue 表而不是Occurrence 表。

这样的形式:

DATE: *date picker*
Start Time: HH:MM
End Time: HH:MM

这是我失败的尝试:

public function executeEdit(sfWebRequest $request)
{
  $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));

  $this->forward404Unless($occurrence = Doctrine_Core::getTable('Occurrence')->find(array($request->getParameter('id'))), sprintf('Object occurrence does not exist (%s).', $request->getParameter('id')));

  $request->setParameter('occurrence_id',$occurrence->getId());

  $occurrenceQForm = new OccurrenceQueueForm($occurrenceQueue());

  $occurrenceQForm->bind($request->getParameter($occurrenceQForm->getName(),$request->getFiles($occurrenceQForm->getName()));

  if($occurrenceQForm->isValid())
  {
    $occurrenceQForm->save();
    $this->redirect("happyness");
  }
}

这永远不会验证。我假设,因为字段和验证是相同的,它会是全金的,什么不是,事实并非如此。那么问题来了,我该如何完成这个任务呢?最终的想法是OccurrenceQueue表将用于更新Occurrence表。

马哈洛的帮助!

【问题讨论】:

  • 另外我试过这个代码:$SRQ = new OccurrenceQueue(); $SRQ-&gt;setOccurrencesId($phpc_occurrences-&gt;getOccid()); $SRQ-&gt;setStarttime($request-&gt;getPostParameter('starttime')); $SRQ-&gt;setEndtime($request-&gt;getPostParameter('starttime')); $SRQ-&gt;setStartdate($request-&gt;getPostParameter('startdate')); $OQForm = new OccurrenceQueueForm($SRQ); $OQForm-&gt;save();
  • $occurrenceQForm-&gt;bind($request-&gt;getParameter($occurrenceQForm-&gt;getName(),$request-&gt;getFiles($occurrenceQForm-&gt;getName())); 应该是$occurrenceQForm-&gt;bind($request-&gt;getParameter($occurrenceQForm-&gt;getName()),$request-&gt;getFiles($occurrenceQForm-&gt;getName());,不是吗?
  • 你能准确地说“从不验证”是什么意思吗(有错误消息吗?)你能把var_dump($request-&gt;getParameter($occurrenceQForm-&gt;getName()))显示的内容也放上去吗?
  • @greg0ire 是的,有语法错误,这是伪代码不是实际的,我的意思是 isValid() 返回 False,这就是为什么... var_dump 返回:Null ...现在至少我知道为什么它失败了,但我不知道为什么我的请求为空......?
  • @greg0ire 但是来自 $request->getParameter($occurrenceForm->getName()) 的 var_dump 是:array(3) { ["startdate"]=&gt; array(3) { ["month"]=&gt; string(1) "3" ["day"]=&gt; string(2) "20" ["year"]=&gt; string(4) "2011" } ["starttime"]=&gt; array(2) { ["hour"]=&gt; string(2) "20" ["minute"]=&gt; string(1) "0" } ["endtime"]=&gt; array(2) { ["hour"]=&gt; string(2) "21" ["minute"]=&gt; string(1) "0" } }

标签: forms symfony1 doctrine bind validation


【解决方案1】:

问题是表单从不绑定ocurrence_id。使用 sfForm 时,它使用 nameFormat($form->getName() 部分)来生成该字段的名称,因此您可以这样尝试:

public function executeEdit(sfWebRequest $request)
{
  ...
  $occurrenceQForm = new OccurrenceQueueForm($occurrenceQueue());

  $values = $request->getParameter($occurrenceQForm->getName());
  $values['occurrence_id'] = $ocurrence->getId();
  $occurrenceQForm->bind($values,$request->getFiles($occurrenceQForm->getName()));
  ...
}

这不是最好的方法,但它会起作用。我真正要做的是将 Ocurrence by 参数传递给 OcurrenceQForm,如下所示:

public function executeEdit(sfWebRequest $request)
{
  ...
  $occurrenceQForm = new OccurrenceQueueForm($occurrenceQueue(), array('ocurrence' => $ocurrence));
  ...
}

在您的 OccurrenceForm 中:

public function OccurrenceQueueForm extends ...{
    public function configure()
    {
        ...
        if($this->getOption('ocurrence') != null){
            $this->setDefault('occurrence_id', $ocurrence->getId());
        }
        ...
   }
}

【讨论】:

  • 也许我关注的是错误的问题,如何创建一个新表单,向表单添加值然后保存它?这就是我想做的一切......
  • 好吧,对于误导性的结构和设置,我很抱歉,我显然误解了很多 :-) 解决方案很简单:停止尝试保存 FORM 只是保存模型.... $occurrenceQueue-&gt;setXXX($form-&gt;getValue('desiredVal')); $$occurrenceQueue-&gt;save(); 这很完美,可以满足我的要求
  • sfForm 和学说形式的区别。我的建议是,如果您使用的是模型表单,请使用教义表单并始终尝试将表单登录保持在表单中,避免控制器中的表单逻辑。照你说的做,但你错过了教条形式的优点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多