Как да редактирате съществуващ запис в 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


person Alec Walczak    schedule 19.03.2015    source източник


Отговори (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 Query $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');
        }
    }
}
person Alec Walczak    schedule 24.03.2015