Как редактировать существующую запись в Symfony 1.4 (Propel)

У меня есть строка таблицы, которую я хотел бы, чтобы пользователь мог редактировать, заполняя форму с ее значениями записи (имя таблицы: поставщик), а затем отправляя отредактированные данные.

Я прочитал и перечитал документацию по Symfony 1.4, но у меня возникли проблемы:
1.) Заполнение полей формы существующими данными записи.
2.) Сохранение отредактированной формы.

Форма ниже — это форма, используемая для создания поставщика, которая, как я понимаю, является приемлемой для редактирования существующей записи.

Что касается проблемы № 1, я попытался перенести существующие значения записи (в __construct() действие), а затем установить их в качестве значений по умолчанию с помощью $this->setDefaults который работает заполнение входных данных формы при перенаправлении на форму в действии редактирования но потом форма не работает, когда пользователь пытается перенаправить на форму в действии создания, в котором говорится, что значения по умолчанию не найдены.

Также стоит отметить, что в этом модуле есть несколько форм. У меня нет проблем при создании записей с формами, только редактирование их значений после их создания.

Любое направление или предложения?

Код ниже.

контроллер:

public function executeVendorEdit(sfWebRequest $request)
{
$ind_vendor = VendorPeer::retrieveByPK(($request->getParameter('id')));
$this->form = new VendorCreateForm(array('name' => $ind_vendor));

if ($request->isMethod('post')) {

$this->form->bind($request->getParameter('vendor'));
if ($this->form->isValid()) {
$vendor = $this->form->save();

$this->redirect('catalog/vendorEdit?id=' . $vendor->getId());
}
}
$this->setTemplate('vendorEdit');
}

форма:

class VendorCreateForm extends SmartForm
{
protected $is_authenticated = null;
public function __construct($is_authenticated = false)
{
$this->is_authenticated = $is_authenticated;

parent::__construct();
}

public function setup()
{
$this->setWidgets(array(
'name' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'contact_name' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'contact_email' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'contact_phone' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'address1' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
));

$this->setValidators(array(
'name' => new sfValidatorString(array('required' => true)),
'contact_name' => new sfValidatorString(array('required' => true)),
'contact_email'   => new sfValidatorEmail(array('required' => true)),
'contact_phone' => new sfValidatorString(array('required' => true)),
'address1' => new sfValidatorString(array('required' => true)),
));

$this->widgetSchema->setNameFormat('vendor[%s]');

$this->setDefaults(array(
));

parent::setup();
}
}

Ошибка:

Неустранимая ошибка: вызов неопределенного метода VendorCreateForm :: save () в /projects/fun-project/src/apps/operations/modules/catalog/actions/actions.class.php в строке 72

1

Решение

После большого количества времени и разочарования я решил обе проблемы. Заполнение формы значениями происходит внутри формы. Требуется передать значения поставщика в форму в действии конструкции, а затем установить значения по умолчанию в действии настройки, если существуют значения поставщика: if ($this->vendor),

Обратите внимание $is_authenticated декларация и составление не обязательны (проверьте форму я включил в вопрос).

Форма:

class VendorCreateForm extends SmartForm
{

protected $vendor = null;

public function __construct($vendor = false)
{
$this->vendor = $vendor;

parent::__construct();
}

public function setup()
{
$this->setWidgets(array(
'name' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'contact_name' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'contact_email' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'contact_phone' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
'address1' => new sfWidgetFormInput(array(),
array('class' => 'form-control')),
));

$this->setValidators(array(
'name' => new sfValidatorString(array('required' => true)),
'contact_name' => new sfValidatorString(array('required' => true)),
'contact_email'   => new sfValidatorEmail(array('required' => true)),
'contact_phone' => new sfValidatorString(array('required' => true)),
'address1' => new sfValidatorString(array('required' => true)),
));

$this->widgetSchema->setNameFormat('vendor[%s]');

if ($this->vendor)
{
$this->setDefaults(array(
'name' => $this->vendor->getName(),
'contact_name' => $this->vendor->getContactName(),
'contact_email' => $this->vendor->getContactEmail(),
'contact_phone' => $this->vendor->getContactPhone(),
'address1' => $this->vendor->getAddress1(),
));
}

parent::setup();

}

Правильное сохранение отредактированной формы происходит в контроллере. Правильное действие executeVendorEdit практически идентично моему действию executeVendorCreate с двумя отличиями: 1.) получение текущего объекта с помощью запроса Propel $this->vendor = VendorPeer::retrieveByPK($request->GetParameter('id')) и 2) НЕ объявить новый объект модели, но вместо этого сохранить значения в текущий объект $this->vendor, Код ниже.

контроллер

public function executeVendorEdit(sfWebRequest $request)
{
$this->vendor = VendorPeer::retrieveByPK($request->GetParameter('id'));

$this->form = new VendorCreateForm($this->vendor);

if ($request->isMethod('post')) {

$this->form->bind($request->getParameter('vendor'));
if ($this->form->isValid())
{
$values = $this->form->getValues();

$this->vendor->setName($values['name']);
$this->vendor->setContactName($values['contact_name']);
$this->vendor->setContactEmail($values['contact_email']);
$this->vendor->setContactPhone($values['contact_phone']);
$this->vendor->setAddress1($values['address1']);
$this->vendor->setCreatedTs('now');
$this->vendor->save();

$this->redirect('catalog/vendors');
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]