Symfony:从表单保存中排除空值

时间:2011-07-10 22:01:52

标签: forms symfony1 doctrine symfony-1.4

我在产品和属性之间有很多关系。我在我的产品表单中使用embedRelation()来编辑产品及其属性。属性包括导致我的问题的图像。每次保存表单时,即使没有上传文件,也会更新updated_at列以查找文件属性。

因此,我想在保存表单时排除空属性。

我正在使用Symfony 1.4和Doctrine 1.2。

我在我的ProductForm.class.php中正在考虑这样的事情,但我需要一些关于如何使其工作的输入。

谢谢

class ProductForm extends BaseProductForm
{
  public function configure()
  {
        unset($this['created_at'], $this['updated_at'], $this['id'], $this['slug']);

        $this->embedRelation('ProductProperties');
  }

    public function saveEmbeddedForms($con = null, $forms = null)
    {
      if (null === $forms)
      {
        $properties = $this->getValue('ProductProperties');
        $forms = $this->embeddedForms;

        foreach($properties as $p)
        {
            // If property value is empty, unset from $forms['ProductProperties']
        }
        }
    }

}

2 个答案:

答案 0 :(得分:0)

我最终避免使用Symfony的表单并保存模型而不是保存表单。使用嵌入表单时可以更容易。 http://arialdomartini.wordpress.com/2011/04/01/how-to-kill-symfony%E2%80%99s-forms-and-live-well/

答案 1 :(得分:0)

通过检查发布的值是否为文件来解决它,如果filename和value_delete都为null,则从数组中取消设置。这可能不是最好的做法,但它现在有效。

基于http://www.symfony-project.org/more-with-symfony/1_4/en/06-Advanced-Forms

的解决方案
    class ProductPropertyValidatorSchema extends sfValidatorSchema
    {
      protected function configure($options = array(), $messages = array())
      {
            // N0thing to configure
      }

      protected function doClean($values)
      {
        $errorSchema = new sfValidatorErrorSchema($this);

        foreach($values as $key => $value)
        {
          $errorSchemaLocal = new sfValidatorErrorSchema($this);

                if(array_key_exists('value_delete', $values))
                {
                    if(!$value && !$values['value_delete'])
                    {
                        unset($values[$key]);
                    }
                }

          // Some error for this embedded-form
          if (count($errorSchemaLocal))
          {
            $errorSchema->addError($errorSchemaLocal, (string) $key);
          }
        }

        // Throws the error for the main form
        if (count($errorSchema))
        {
          throw new sfValidatorErrorSchema($this, $errorSchema);
        }

        return $values;
      }
    }