【问题标题】:How to input a calculated value after form validation in zf2如何在zf2中的表单验证后输入计算值
【发布时间】:2015-02-03 21:35:42
【问题描述】:

我正在 zf2 中开发一个表单,我想根据用户输入计算一个值,并在表单验证后将其设置在一个字段中。表单中有firstName字段和lastName字段;我想使用经过验证的输入来计算要填充到 fullName 字段中的值。

我假设我想设置这样的值,但还没有找到正确的代码来设置发送到数据库的“元素”:

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);
}

【问题讨论】:

    标签: forms validation doctrine-orm zend-framework2


    【解决方案1】:

    Doctrine 内置的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);
    

    【讨论】:

    • 这适用于我的addAction,但它不适用于我的editAction。为什么会这样?
    • 是的,prepersist 事件仅在实体的初始持久化时触发(它不会在未来更新时触发)。您可能需要仔细阅读文档。 PreUpdate 或 PreFlush 是您正在寻找的。​​span>
    【解决方案2】:

    Foozy 的出色回答提供了适用于添加操作的解决方案,对我的评论的回复将我引导至以下适用于添加和编辑操作的解决方案:

    <?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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多