Помощь со встроенными формами BaseFormDoctrine - PullRequest
2 голосов
/ 31 августа 2010

У меня есть следующие блоки кода:

class MerchantStoreForm extends sfForm
{
  public function configure()
  {
    $this->disableCSRFProtection();

    $this->setWidgets(array(
          'brand_id' => new sfWidgetFormDoctrineChoice(array('label'=> 'Store Brand','model'=>'Brand','add_empty'=>'-Select Brand-','method'=>'getName','key_method'=>'getId','order_by'=>array('name','asc'))),
          'newbrand'    => new sfWidgetFormInputCheckbox(array('label' => 'New'),array('value'=>'Y'))
    ));

    $this->setValidators(array(
        'newbrand' => new sfValidatorString(array('required'=>false)),          
        'brand_id'  => new sfValidatorDoctrineChoice(array('model'=>'Brand'))
    ));

     $brand = new Brand();
    $brand_form = new BrandForm();
    $brand_form->widgetSchema['name']->setAttribute('style','display:none');
    $this->embedForm('brand', $brand_form);

    $this->getWidgetSchema()->setNameFormat('store[%s]');
  }

  public function execute()
  { 
   $form_values = $this->getValues();

    if($form_values['newbrand'])
    {
        $brand_form = $this->getEmbeddedForm('brand');
        $brand_form->save();
        $brand = $brand_form->getObject();
    }
    else
    {
        $brand = doctrine::getTable('Brand')->findOneById($form_values['brand_id']);
    }

    return $brand->getId();
  }
}

Два вопроса:

1) Магия $ brand_form-> save () не работает для меня. Я получаю 500 внутреннюю ошибку сервера sfValidatorErrorSchema, указывающую на следующий фрагмент кода в моем symfony-файле BaseBrandForm.class.php:

...
$this->widgetSchema->setNameFormat('brand[%s]');
$this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
...

Вместо этого это работает вместо:

        $brand_form->updateObject($form_values['brand']);
        $brand_form->getObject()->save();

Почему это?

2) Почему я получаю неопределенную ошибку метода при вызове метода get для объекта встроенной формы BaseFormDoctrine: вернуть $ brand-> getId ();

Заранее спасибо за помощь.

Sharmil

1 Ответ

1 голос
/ 01 сентября 2010

1) BrandForm выдает исключение, потому что у него нет значений.Классы, которые расширяют sfFormObject, плохо воспроизводятся, когда встроены непосредственно в необъектные формы (например, sfForm).

Что делает MerchantStoreForm?В зависимости от ситуации, он, вероятно, должен расширяться sfFormObject, или BrandForm должна быть формой верхнего уровня.Если это невозможно, вам нужно написать добавить метод сохранения в MerchantStoreForm, который вызывает updateObject и save.Чтобы лучше понять, что происходит, ознакомьтесь с логикой, которая имеет место в sfFormObject - это стоит знать, особенно если вы используете встроенные формы.

2) Здесь нет никакой подсказки.Я бы посмотрел, к чему на самом деле относится $ brand.Если это запись и эта запись имеет поле id, нет причины, которая не должна работать.

...