ZF2 - 单一形式的多个实体

时间:2015-01-07 13:40:20

标签: doctrine-orm zend-framework2

我正在制作购物结帐页面,该页面要求:

  1. OrderPerson
  2. PersonAddress(交付)
  3. 订单(注释,时间等,并非所有项目都在目前的表格上以保持简单)
  4. 我或多或少知道如何把它放在一起,但它需要一些整理。

    我的表单如下:Checkout Form

    为了使表单能够很好地协同工作,我设置了一个包含OrderPerson,PersonAddress和Order Fieldsets的CheckoutForm:

    <?php
    namespace MyCart\Form;
    
    use Zend\Form\Element;
    use Zend\Form\Fieldset;
    use Zend\Form\Form;
    use Zend\InputFilter\InputFilterInterface;
    
    class CheckoutForm extends Form
    {
    
        public function __construct(
            InputFilterInterface $orderFilter,
            InputFilterInterface $orderPersonFilter,
            InputFilterInterface $personAddressFilter,
            $name = null,
            $options = array()
        ) {
            parent::__construct('checkout', $options);
    
            $this->orderFilter = $orderFilter;
            $this->orderPersonFilter = $orderPersonFilter;
            $this->personAddressFilter = $personAddressFilter;
        }
    
        public function init()
        {
            $this->add(
                [
                    'name' => 'csrfcheck',
                    'type' => 'csrf'
                ]
            );
    
            $this->add(
                [
                    'name' => 'order',
                    'type' => OrderFieldset::class,
                    'options' => [
                        'use_as_base_fieldset' => true
                    ]
                ]
            );
    
            $this->add(
                [
                    'name' => 'order-person',
                    'type' => OrderPersonFieldset::class,
                    'options' => [
                        'use_as_base_fieldset' => true
                    ]
                ]
            );
    
            $this->add(
                [
                    'name' => 'person-address',
                    'type' => PersonAddressFieldset::class,
                    'options' => [
                        'use_as_base_fieldset' => true
                    ]
                ]
            );
    
            $this->add(
                [
                    'name'       => 'submit',
                    'type'       => 'submit',
                    'attributes' => [
                        'value' => 'Update',
                        'class' => 'form-element'
                    ]
                ]
            );
    
            $this->getInputFilter()->add($this->orderFilter, 'order');
            $this->getInputFilter()->add($this->orderPersonFilter, 'order-person');
            $this->getInputFilter()->add($this->personAddressFilter, 'person-address');
    
        }
    }
    

    Checkout表格有一个工厂:

    <?php
    namespace MyCart\Form\Factory;
    
    use MyCart\Form\CheckoutForm;
    use MyCart\InputFilter\OrderFilter;
    use MyCart\InputFilter\OrderPersonFilter;
    use MyCart\InputFilter\PersonAddressFilter;
    use Zend\ServiceManager\FactoryInterface;
    use Zend\ServiceManager\ServiceLocatorInterface;
    
    class CheckoutFormFactory implements FactoryInterface
    {
        /**
         * Create service
         *
         * @param ServiceLocatorInterface $serviceLocator
         * @return mixed
         */
        public function createService(ServiceLocatorInterface $serviceLocator)
        {
            $inputFilter =  $serviceLocator->getServiceLocator()->get('InputFilterManager');
    
            return new CheckoutForm(
                $inputFilter->get(OrderFilter::class),
                $inputFilter->get(OrderPersonFilter::class),
                $inputFilter->get(PersonAddressFilter::class)
            );
        }
    }
    

    如您所见,Checkout Form引用了三个输入过滤器,它们都以相同的方式构建。我在这里有OrderPerson字段集作为参考:

    <?php
    namespace MyCart\Form;
    
    use Doctrine\Common\Persistence\ObjectManager;
    use DoctrineModule\Stdlib\Hydrator\DoctrineObject;
    use MyCart\Entity\OrderPerson;
    use Zend\Form\Element;
    use Zend\Form\Fieldset;
    
    class OrderPersonFieldset extends Fieldset
    {
        /**
         * @var \Doctrine\Common\Persistence\ObjectManager
         * @access protected
         */
        protected $objectManager;
    
        /**
         * @param ObjectManager $objectManager
         * @param OrderPerson $orderPrototype
         * @param null $name
         * @param array $options
         */
        public function __construct(
            ObjectManager   $objectManager,
            OrderPerson     $orderPrototype,
            $name           = null,
            $options        = array()
        ) {
            parent::__construct($name, $options);
    
            $this->objectManager = $objectManager;
            $this->setHydrator(new DoctrineObject($objectManager));
            $this->setObject($orderPrototype);
        }
    
        public function init()
        {
    
            $this->add(
                [
                    'name'       => 'id',
                    'type'       => 'hidden',
                ]
            );
    
            $this->add(
                [
                    'name'       => 'rbu_user_id',
                    'type'       => 'hidden',
                ]
            );
    
            $this->add(
                [
                    'type' => 'text',
                    'name' => 'email',
                    'attributes' => [
                        'class'     => 'form-control',
                        'required' => 'required',
                    ],
                    'options' => [
                        'label'  => 'Email Address',
                        'instructions' => 'Please enter your email address',
                    ],
                ]
            );
    
            //etc...
    
    
    
    
        }
    } 
    

    在执行表单时调用CheckoutController,这是我不知道该做什么或如何保存各种对象的地方,这是我到目前为止所做的:

    public function indexAction()
        {
            //Pre check stuff here
    
            //Start the form processing
            $prg = $this->prg();
    
            if ($prg instanceof Response) {
    
                return $prg;
    
            } elseif ($prg === false) {
    
                //If logged in
                if ( $this->authService->hasIdentity()) {
    
                    //Update the OrderPerson entity
                    $user_id = $this->identity()->getId();
                    $userObject = $this->userService->find($user_id);
                    $orderPersonEntity = new OrderPerson();
                    $orderPersonEntity->setRbuUser($userObject);
                    $orderPersonEntity->setFirstname($userObject->getFirstname());
                    $orderPersonEntity->setSurname($userObject->getSurname());
                    $this->checkoutForm->bind($orderPersonEntity);
    
                    //Update the person address entity
                    $personAddress = new PersonAddress();
                    $personAddress->setAddress1($userObject->getAddress1());
                    $personAddress->setAddress2($userObject->getAddress2());
                    $this->checkoutForm->bind($personAddress);
    
                    //Update the order entity
    
                }
    
                return new ViewModel(
                    array(
                        'cart' => $cart,
                        'form' => $this->checkoutForm
                    )
                );
    
            }
    
            $this->checkoutForm->setData($prg);
    
            if (!$this->checkoutForm->isValid()) {
                return new ViewModel(
                    array(
                        'cart' => $cart,
                        'form' => $this->checkoutForm
                    )
                );
            }
    
    
    
            $checkoutObject = $this->checkoutForm->getData();
    
            die(var_dump($checkoutObject));
    

    将结果转储到此处仅输出人员地址对象:

    object(MyCart\Entity\PersonAddress)[1177]
      private 'id' => null
      private 'address1' => string 'xx' (length=2)
      private 'address2' => string 'xx' (length=2)
      private 'region' => null
      private 'postCode' => string 'xx' (length=2)
      private 'city' => string 'xx' (length=2)
      private 'country' => string 'xx' (length=2)
      private 'created' => null
      private 'modified' => null
      private 'orderPerson' => null
    

    所以我的问题很简单,这是正确的思考,我如何完成这一点,以便我可以一次性保存这三个实体?

0 个答案:

没有答案
相关问题