2015-02-03 2 views
1

Я разрабатываю форму в zf2, и я хочу рассчитать значение, основанное на пользовательском вводе, и установить его в поле после проверки формы. В форме есть поле firstName и поле lastName; и я хочу использовать проверенный ввод для вычисления значения для заполнения в поле fullName.Как ввести вычисленное значение после проверки формы в zf2

Я предполагаю, что я хочу, чтобы установить значение что-то вроде этого, но не нашли правильный код для установки «элемент», который отправляется в базу данных:

public function addAction() 
{ 
    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
    $form = new AddMemberForm($objectManager); 
    $member = new Member(); 
    $form->bind($member); 

    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $form->setData($request->getPost()); 
     if ($form->isValid()) { 

     // develop full name string and populate the field 
     $calculatedName = $_POST['firstName'] . " " . $_POST['lastName']; 
     $member->setValue('memberFullName', $calculatedName); 

     $this->getEntityManager()->persist($member); 
     $this->getEntityManager()->flush(); 
     return $this->redirect()->toRoute('admin-members'); 
     } 
    } 

    return array('form' => $form); 
} 

ответ

0

Foozy «s отличный ответ обеспечивает решение, которое работает для добавления действия, и ответ на мой комментарий направил меня к следующему решению, что работает как для добавления, так и для редактирования:

<?php 
/** 
* Member Entity 
*/ 
namespace YourNamespace\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\ORM\Event\PreFlushEventArgs; 

/** 
* @ORM\Table(name="members") 
* @ORM\Entity 
*/ 
class Member 
{ 
    // After all of your entity properies, getters and setters... Put the method below 

    /** 
    * Calculate full name on pre flush. 
    * 
    * @ORM\PreFlush 
    * @return void 
    */ 
    public function onPreFlush(PreFlushEventArgs $args) 
    { 
     $this->memberFullName = $this->getFirstName().' '.$this->getLastName(); 
    } 
} 
1

Доктрина встроенный Lifecycle Callbacks являются отлично подходит для обработки такого требования, и я настоятельно рекомендую их использовать.

Вам просто нужно правильно аннотировать объект.

Например:

<?php 
/** 
* Member Entity 
*/ 
namespace YourNamespace\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* @ORM\Table(name="members") 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class Member 
{ 
    // After all of your entity properies, getters and setters... Put the method below 

    /** 
    * Calculate full name on pre persist. 
    * 
    * @ORM\PrePersist 
    * @return void 
    */ 
    public function onPrePersist(LifecycleEventArgs $args) 
    { 
     $this->memberFullName = $this->getFirstName().' '.$this->getLastName(); 
    } 
} 

С таким образом, memberFullName свойства объекта будет автоматически заполняется с использованием первой и фамилии на уровень лица только перед тем сохраняющиеся.

Теперь вы можете удалить строки ниже от ваших действий:

// Remove this lines 
$calculatedName = $_POST['firstName'] . " " . $_POST['lastName']; 
$member->setValue('memberFullName', $calculatedName); 
+0

Это работает для моего 'addAction', но это не работает в моем' editAction'. Почему это так? – jcropp

+0

Да, событие preersist запускается только при первоначальном сохранении объекта (оно не запускается при будущих обновлениях). Вы можете внимательно прочитать документацию. PreUpdate или PreFlush - это то, что вы ищете. – edigu

Смежные вопросы