使用ZF2和Doctrine从一个窗体更新两个表 [英] Update two tables from one form with ZF2 and Doctrine

查看:166
本文介绍了使用ZF2和Doctrine从一个窗体更新两个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一个教程或示例模块,它使用ZF2和Doctrine连接两个或多个表,创建一个表单,并使用表单输入/更改更新所有表格。 (当查询没有找到要加入的记录时,找到一些包含相关表中的记录的方法的附加功能)。



模式I '试图在ZF2 / Doctrine中复制是这样的:可能有一个成员表和一个 personal_info 表。虽然表之间存在一对一的关系,但我们只需要记录一小部分成员的个人信息,因此为了避免系统负担,我们将只添加匹配的记录到 personal_info 表。我们的表单将包含更新两个表格数据的框:一个手机输入将从成员表和配偶输入将从 personal_info 表中更新记录。



php版本可能按照以下步骤构建表单:1)查询 personal_info 表以确定用户提供的记录是否存在会员ID ; 2)如果不存在,将新记录添加到 personal_info ; 3)创建一个加入表的查询;和4)创建填充有来自查询的数据的表单。用户更新表单触发的操作将有两个步骤:1)更新成员表,2)更新 personal_info table。



在搜索教程和示例时,我没有遇到任何从一个表单更新两个表的内容,或者将缺少的记录添加到



编辑



按照山姆的建议,我有遵循了DoctrineModule中的例子,但是我不能使它工作。我设置了实体,字段集,表单,视图和控制器,但数据不会从数据库传递到呈现的表单并返回。更新表单和创建表单都不会更新数据库;并且不将数据库数据馈送到更新表单元素的值属性。



我知道从数据库中提取数据,因为在url路由器中存在不存在的id会给出错误。我无法分离实体和字段之间,控制器或视图中的fieldsets和表单之间是否存在问题。以下是我的文件:



会员实体:

  php 

命名空间Members \Entity;

使用Doctrine\Common\Collections\ArrayCollection;
使用Doctrine\Common\Collections\Collection;
使用Doctrine\ORM\Mapping作为ORM;
使用Members\Entity\PersonalInfo;

/ **
*会员
*
* @ ORM\Entity
* @ ORM\Table(name =members)
* @property string $ memberFirstName
* @property string $ memberLastName
* @property int $ memberID
* /
class Member
{
/ **
* @ ORM\Id
* @ ORM\Column(type =integer);
* @ ORM\GeneratedValue(strategy =AUTO)
* /
protected $ memberID;

/ **
* @ ORM\Column(type =string)
* /
protected $ memberFirstName;

/ **
* @ ORM\Column(type =string)
* /
protected $ memberLastName;

/ **
* @ ORM\OneToMany(targetEntity =Members\Entity\PersonalInfo,mappedBy =member,cascade = {persist})
* /
protected $ personalInfo;

/ **
*初始化集合
* /
public function __construct()
{
$ this-> personalInfo = new ArrayCollection的();
}

/ **
*获取MemberID
*
* @return integer
* /
public function getMemberID )
{
return $ this-> memberID;
}

/ **
*获取MemberLastName
*
* @return string
* /
public function getMemberLastName( )
{
return $ this-> memberLastName;
}

/ **
*设置MemberLastName
*
* @param string $ memberLastName
* /
public function setMemberLastName($ memberLastName)
{
$ this-> memberLastName = $ memberLastName;

return $ this;
}

/ **
*获取MemberFirstName
*
* @return string
* /
public function getMemberFirstName )
{
return $ this-> memberFirstName;
}

/ **
*设置MemberFirstName
*
* @param string $ memberFirstName
* /
public function setMemberFirstName($ memberFirstName)
{
$ this-> memberFirstName = $ memberFirstName;

return $ this;
}

/ **
* @param Collection $ personalInfo
* /
public function addPersonalInfo(Collection $ personalInfo)
{
foreach($ personalInfo as $ memberPersonalInfo){
$ memberPersonalInfo-> setMember($ this);
$ this-> personalInfo-> add($ memberPersonalInfo);
}
}

/ **
* @param Collection $ personalInfo
* /
public function removePersonalInfo(Collection $ personalInfo)
{
foreach($ personalInfo as $ memberPersonalInfo){
$ memberPersonalInfo-> setMember(null);
$ this-> personalInfo-> removeElement($ memberPersonalInfo);
}
}

/ **
* @return集合
* /
public function getPersonalInfo()
{
return $ this-> personalInfo;
}

}

PersonalInfo Entity:

 <?php 

命名空间Members \Entity;

使用Doctrine\ORM\Mapping作为ORM;
使用Members\Entity\Member;

/ **
*个人信息
*
* @ ORM\Entity
* @ ORM\Table(name =members_personal)
* @property string $ spouse
* @property string $ hobbies
* @property int $ memberID
* @property int $ personalInfoID
* /
PersonalInfo
{
/ **
* @ ORM\Column(type =integer);
* /
protected $ memberID;

/ **
* @ ORM\Id
* @ ORM\Column(type =integer);
* @ ORM\GeneratedValue(strategy =AUTO)
* /
protected $ personalInfoID;

/ **
* @ ORM\ManyToOne(targetEntity =Members\Entity\Member,inversedBy =personalInfo)
* @ ORM\JoinColumn (name =memberID,referencedColumnName =memberID)
* /
protected $ member;

/ **
* @ ORM\Column(type =string)
* /
protected $ spouse;

/ **
* @ ORM\Column(type =string)
* /
protected $ hobbies;


/ **
*获取PersonalInfoID
*
* @return integer
* /
public function getPersonalInfoID()
{
return $ this-> personalInfoID;
}

/ **
*允许null删除关联
*
* @param会员$ member
* /
public function setMember(member $ member = null)
{
$ this-> member = $ member;
}

/ **
* @return会员
* /
public function getMember()
{
return $这 - >构件;
}

/ **
*设置配偶
*
* @param string $ spouse
* /
public function setSpouse($ spouse)
{
$ this-> spouse = $ spouse;
}

/ **
*获取配偶
*
* @return string
* /
public function getSpouse( )
{
return $ this-> spouse;
}

/ **
*设置兴趣
*
* @param string $ hobbies
* /
public function setHobbies($ hobbies)
{
$ this-> hobbies = $ hobbies;
}

/ **
*获取兴趣
*
* @return string
* /
public function getHobbies )
{
return $ this-> hobbies;
}

}

MemberFieldset:

 <?php 

命名空间Members \Form;

使用Members\Entity\Member;
使用Doctrine\Common\Persistence\ObjectManager;
使用DoctrineModule\Stdlib\Hydrator\DoctrineObject作为DoctrineHydrator;
使用Zend\Form\Fieldset;
使用Zend\InputFilter\InputFilterProviderInterface;

class MemberFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct(ObjectManager $ objectManager)
{
parent :: __ construct('member');

$ this-> setHydrator(new DoctrineHydrator($ objectManager,'Members\Entity\Member'))
- > setObject(new Member());

$ this-> add(array(
'type'=>'Zend\Form\Element\Text',
'name'=> 'memberID',
'attributes'=>数组(
'type'=>'hidden',
),
));

$ this-> add(array(
'type'=>'Zend\Form\Element\Text',
'name'=> 'memberLastName',
'attributes'=> array(
'required'=>'required',
'type'=>'text',

'options'=>数组(
'label'=>'姓',
),
));

$ this-> add(array(
'type'=>'Zend\Form\Element\Text',
'name'=> 'memberFirstName',
'attributes'=> array(
'required'=>'required',
'type'=>'text',

'options'=> array(
'label'=>'First Name',
),
));

$ personalInfoFieldset = new PersonalInfoFieldset($ objectManager);
$ this-> add(array(
'type'=>'Zend\Form\Element\Collection',
'name'=>'personalInfo'
'options'=>数组(
'count'=> 1,
'target_element'=> $ personalInfoFieldset

));

}

public function getInputFilterSpecification()
{
return array(
'memberID'=> array(
'required'=> true
),
);
return array(
'memberLastName'=> array(
'required'=> true
),
);
return array(
'memberFirstName'=> array(
'required'=> true
),
);
}

}

PersonalInfoFieldset:

 <?php 

命名空间Members \Form;

使用Members\Entity\PersonalInfo;
使用Doctrine\Common\Persistence\ObjectManager;
使用DoctrineModule\Stdlib\Hydrator\DoctrineObject作为DoctrineHydrator;
使用Zend\Form\Fieldset;
使用Zend\InputFilter\InputFilterProviderInterface;

class PersonalInfoFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct(ObjectManager $ objectManager)
{
parent :: __ construct('personal-info' );

$ this-> setHydrator(new DoctrineHydrator($ objectManager,'Members\Entity\PersonalInfo'))
- > setObject(new PersonalInfo());

$ this-> add(array(
'type'=>'Zend\Form\Element\Text',
'name'=> 'personalInfoID',
'attributes'=>数组(
'type'=>'hidden',
),
));

$ this-> add(array(
'name'=>'spouse',
'type'=>'Zend\Form\Element\\ \\ b
'属性'=>数组(
'required'=>'required',
'type'=>'text',

'options'=> array(
'label'=>'页面标题',
),
));

$ this-> add(array(
'name'=>'hobbies',
'type'=>'Zend\Form\Element\\ \\ b
'属性'=>数组(
'required'=>'required',
'type'=>'text',

'options'=>数组(
'label'=>'页面名称',
),
));

}
public function getInputFilterSpecification()
{
return array(
'personalInfoID'=> array(
'required'= > true
),
);
return array(
'spouse'=> array(
'required'=> true
),
);
return array(
'hobbies'=> array(
'required'=> true
),
);
}

}

CreateMemberForm:

 <?php 

命名空间Members \Form;

使用Doctrine\Common\Persistence\ObjectManager;
使用DoctrineModule\Stdlib\Hydrator\DoctrineObject作为DoctrineHydrator;
使用Zend\Form\Form;

class CreateMemberForm extends Form
{
public function __construct(ObjectManager $ objectManager)
{
parent :: __ construct('update-member-form' );

//该表单将水合​​成员类型的对象
$ this-> setHydrator(new DoctrineHydrator($ objectManager,'Members\Entity\Member'));

//添加用户字段集,并将其设置为基本字段集
$ memberFieldset = new MemberFieldset($ objectManager);
$ memberFieldset-> setUseAsBaseFieldset(true);
$ this-> add($ memberFieldset);

//提交元素
$ this-> setAttribute('method','post');

$ this-> add(array(
'name'=>'memberID',
'attributes'=> array(
'type' ="'hidden',
),
));
$ this-> add(array(
'name'=>'memberLastName',
'attributes'=>数组(
'id'=> memberLastName',
'type'=>'text',
'class'=>'col-lg-10',
),
'options'=> ; array(
'label'=>'Last Name',
'label_attributes'=> array(
'class'=>'col-lg-2 control-col-标签'
),
),
));

$ this-> add(array(
'name'=>'memberFirstName',
'attributes'=> array(
'id' ='memberFirstName',
'type'=>'text',
'class'=>'col-lg-10',
),
'选项'=>数组(
'label'=>'名字',
'label_attributes'=>数组(
'class'=>'col-lg-2 control-col-label'
),
),
));

$ this-> add(array(
'name'=>'spouse',
'attributes'=> array(
'id' ='配偶',
'type'=>'text',
'class'=>'col-lg-10',
),
'选项'=>数组(
'label'=>'配偶',
'label_attributes'=>数组(
'class'=>'col-lg-2控件-col-label'
),
),
));

$ this-> add(array(
'name'=>'submit',
'attributes'=> array(
'id' =''submit',
'type'=>'submit',
'value'=>'Go',
'id'=>'submitbutton',
),
));

//可选择设置您的验证组
}

}

UpdateMemberForm:

 <?php 

命名空间成员\\ \\形成;

使用Doctrine\Common\Persistence\ObjectManager;
使用DoctrineModule\Stdlib\Hydrator\DoctrineObject作为DoctrineHydrator;
使用Zend\Form\Form;

class UpdateMemberForm extends Form
{
public function __construct(ObjectManager $ objectManager)
{
parent :: __ construct('update-member-form' );

//该表单将水合​​成员类型的对象
$ this-> setHydrator(new DoctrineHydrator($ objectManager,'Members\Entity\Member'));

//添加用户字段集,并将其设置为基本字段集
$ memberFieldset = new MemberFieldset($ objectManager);
$ memberFieldset-> setUseAsBaseFieldset(true);
$ this-> add($ memberFieldset);

//提交元素
$ this-> setAttribute('method','post');

$ this-> add(array(
'name'=>'memberID',
'attributes'=> array(
'type' ="'hidden',
),
));
$ this-> add(array(
'name'=>'memberLastName',
'attributes'=>数组(
'id'=> memberLastName',
'type'=>'text',
'class'=>'col-lg-9',
),
'options'=> ; array(
'label'=>'Last Name',
'label_attributes'=> array(
'class'=>'col-lg-2 control-col-标签'
),
),
));

$ this-> add(array(
'name'=>'memberFirstName',
'attributes'=> array(
'id' ='memberFirstName',
'type'=>'text',
'class'=>'col-lg-9',
),
'选项'=>数组(
'label'=>'名字',
'label_attributes'=>数组(
'class'=>'col-lg-2 control-col-label'
),
),
));

$ this-> add(array(
'name'=>'spouse',
'attributes'=> array(
'id' ='配偶',
'type'=>'text',
'class'=>'col-lg-9',
),
'选项'=>数组(
'label'=>'配偶',
'label_attributes'=>数组(
'class'=>'col-lg-2控件-col-label'
),
),
));

$ this-> add(array(
'name'=>'submit',
'attributes'=> array(
'id' =''submit',
'type'=>'submit',
'value'=>'Go',
'id'=>'submitbutton',
),
));

//可选择在此设置验证组
}



}
/ pre>

MemberController:

 <?php 

命名空间Members \Controller;

使用Zend\Mvc\Controller\AbstractActionController;
使用Zend\View\Model\ViewModel;
使用Members\Entity\Member;
使用Members\Form\CreateMemberForm;
使用Members\Form\UpdateMemberForm;
使用Doctrine\ORM\EntityManager;

class MemberController extends AbstractActionController
{
/ **
* @var Doctrine\ORM\EntityManager
* /
protected $ EM;

public function setEntityManager(EntityManager $ em)
{
$ this-> em = $ em;
}

public function getEntityManager()
{
if(null === $ this-> em){
$ this-> em = $ this-> getServiceLocator() - > get('Doctrine\ORM\EntityManager');
}
return $ this-> em;
}

// ... //

public function createAction()
{
//从ServiceManager $获取ObjectManager
$ objectManager = $ this-> getServiceLocator() - > get('Doctrine\ORM\EntityManager');

//创建表单并注入ObjectManager
$ form = new CreateMemberForm($ objectManager);

//创建一个新的空实体并将其绑定到
$ member = new Member();
$ form-> bind($ member);

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

if($ form-> isValid()){
$ objectManager-> persist($ member);
$ objectManager-> flush();
}
}

返回数组('form'=> $ form);
}

public function updateAction()
{
$ memberID =(int)$ this-> getEvent() - > getRouteMatch() - > getParam( 'MEMBERID');
if(!$ memberID){
return $ this-> redirect() - > toRoute('members',array('action'=>'create'));
}
$ member = $ this-> getEntityManager() - > find('Members \Entity\Member',$ memberID);

//从ServiceManager获取您的ObjectManager
$ objectManager = $ this-> getServiceLocator() - > get('Doctrine\ORM\EntityManager');

//创建表单并注入ObjectManager
$ form = new UpdateMemberForm($ objectManager);
$ form-> setBindOnValidate(false);
$ form-> bind($ member);
$ form-> get('submit') - > setAttribute('label','Update');

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

//重定向到成员列表
return $ this-> redirect() - > toRoute('members');
}
}

返回数组(
'memberID'=> $ memberID,
'form'=&$ $ form,
);
}

// ... //

}

update.phtml:

 <?php 
$ title ='更新成员;
$ this-> headTitle($ title);
?>
< h1><?php echo $ this-> escapeHtml($ title); ?>< / H1>

<?php
$ form = $ this-> form;
$ form-> setAttribute('action',
$ this-> url('members',array('action'=>'update','memberID'=> $ this - > MEMBERID)));
$ form-> prepare();

echo $ this-> form() - > openTag($ form);
echo $ this-> formHidden($ form-> get('memberID'));
echo $ this-> formRow($ form-> get('memberFirstName'))。 < br clear ='both'/>;
echo $ this-> formRow($ form-> get('memberLastName'))。 < br clear ='both'/>;
echo $ this-> formRow($ form-> get('spouse'))。 < br clear ='both'/>;
echo $ this-> formInput($ form-> get('submit'));
echo $ this-> form() - > closeTag($ form);


解决方案

这两个表有一个关系,所以父对象仍然会员我假设。考虑到这一点,您仍然必须创建两个 Fieldset 元素。一个匹配成员的结构,另一个匹配 personal_info 的数据。后来作为子字段添加到 MemberFieldset



其实都是这样的, DoctrineObject (Hydrator)应该能够关心ID映射,如果它是一个新的条目。如果是编辑条目,ID数据就在那里。这不是与 DoctrineModule / docs


I am looking for a tutorial or example module that uses ZF2 and Doctrine to join two or more tables, creates a form, and updates all tables with form input/changes. (It would be an added bonus to find something that includes a method to add records in associated tables when the query doesn’t find records to join.)

The pattern I’m trying to replicate in ZF2/Doctrine is something like this: perhaps there is a members table and a personal_info table. While there is a one-to-one relationship between the tables, we’ll only need to log personal information for a fraction of the members, so to avoid burdening the system we will only add matching records to the personal_info table as needed. Our form will include boxes to update data from both tables: a phone input would update a record from the members table and a spouse input would update a record from the personal_info table.

A php version might follow these steps to construct the form: 1) query the personal_info table to determine whether a record exists for a user-supplied member id; 2) if it doesn’t exist, add a new record to personal_info; 3) create a query joining the tables; and 4) create a form populated with data from the query. The action triggered by a user’s update of the form would have two steps: 1) update the members table, and 2) update the personal_info table.

In searching for tutorials and examples, I haven’t come across anything that updates two tables from one form or that adds a missing record to a joined table when needed.

EDIT:

Following Sam's suggestion, I have followed the examples in the DoctrineModule but I can’t make it work. I’ve set up the Entities, Fieldsets, Forms, Views and Controller, but data doesn’t get passed from the database to the rendered form and back. Neither the update form nor the create form will update the database; and database data is not fed to the value attributes of the update form elements.

I know that data is extracted from the database because putting a non-existent id in the url router gives an error. I can't isolate whether there is a problem between the entities and the fieldsets, between the fieldsets and the forms, in the controller or in the view(s). Here are my files:

Member Entity:

<?php

namespace Members\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Members\Entity\PersonalInfo;

/**
 * Members
 *
 * @ORM\Entity
 * @ORM\Table(name="members")
 * @property string $memberFirstName
 * @property string $memberLastName
 * @property int $memberID
 */
class Member
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $memberID;

    /**
     * @ORM\Column(type="string")
     */
    protected $memberFirstName;

    /**
     * @ORM\Column(type="string")
     */
    protected $memberLastName;

    /**
     * @ORM\OneToMany(targetEntity="Members\Entity\PersonalInfo", mappedBy="member", cascade={"persist"})
     */
    protected $personalInfo;

    /**
     * initialize collections
     */
    public function __construct()
    {
        $this->personalInfo = new ArrayCollection();
    }

     /**
     * Get MemberID
     *
     * @return integer
     */
    public function getMemberID()
    {
        return $this->memberID;
    }

    /**
     * Get MemberLastName
     *
     * @return string
     */
    public function getMemberLastName()
    {
        return $this->memberLastName;
    }

    /**
     * Set MemberLastName
     *
     * @param string $memberLastName
     */
    public function setMemberLastName($memberLastName)
    {
        $this->memberLastName = $memberLastName;

        return $this;
    }

    /**
     * Get MemberFirstName
     *
     * @return string
     */
    public function getMemberFirstName()
    {
        return $this->memberFirstName;
    }

    /**
     * Set MemberFirstName
     *
     * @param string $memberFirstName
     */
    public function setMemberFirstName($memberFirstName)
    {
        $this->memberFirstName = $memberFirstName;

        return $this;
    }

    /**
     * @param Collection $personalInfo
     */
    public function addPersonalInfo(Collection $personalInfo)
    {
        foreach ($personalInfo as $memberPersonalInfo) {
            $memberPersonalInfo->setMember($this);
            $this->personalInfo->add($memberPersonalInfo);
        }
    }

    /**
     * @param Collection $personalInfo
     */
    public function removePersonalInfo(Collection $personalInfo)
    {
        foreach ($personalInfo as $memberPersonalInfo) {
            $memberPersonalInfo->setMember(null);
            $this->personalInfo->removeElement($memberPersonalInfo);
        }
    }

    /**
     * @return Collection
     */
    public function getPersonalInfo()
    {
        return $this->personalInfo;
    }

}

PersonalInfo Entity:

<?php

namespace Members\Entity;

use Doctrine\ORM\Mapping as ORM;
use Members\Entity\Member;

/**
 * Personal Info
 *
 * @ORM\Entity
 * @ORM\Table(name="members_personal")
 * @property string $spouse
 * @property string $hobbies
 * @property int $memberID
 * @property int $personalInfoID
 */
class PersonalInfo
{
    /**
     * @ORM\Column(type="integer");
     */
    protected $memberID;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $personalInfoID;

    /**
     * @ORM\ManyToOne(targetEntity="Members\Entity\Member", inversedBy="personalInfo")
     * @ORM\JoinColumn(name="memberID", referencedColumnName="memberID")
     */
    protected $member;

    /**
     * @ORM\Column(type="string")
     */
    protected $spouse;

    /**
     * @ORM\Column(type="string")
     */
    protected $hobbies;


     /**
     * Get PersonalInfoID
     *
     * @return integer
     */
    public function getPersonalInfoID()
    {
        return $this->personalInfoID;
    }

    /**
     * Allow null to remove association
     *
     * @param Member $member
     */
    public function setMember(Member $member = null)
    {
        $this->member = $member;
    }

    /**
     * @return Member
     */
    public function getMember()
    {
        return $this->member;
    }

    /**
     * Set Spouse
     *
     * @param string $spouse
     */
    public function setSpouse($spouse)
    {
        $this->spouse = $spouse;
    }

    /**
     * Get Spouse
     *
     * @return string
     */
    public function getSpouse()
    {
        return $this->spouse;
    }

    /**
     * Set Hobbies
     *
     * @param  string  $hobbies
     */
    public function setHobbies($hobbies)
    {
        $this->hobbies = $hobbies;
    }

    /**
     * Get Hobbies
     *
     * @return string
     */
    public function getHobbies()
    {
        return $this->hobbies;
    }

}

MemberFieldset:

<?php

namespace Members\Form;

use Members\Entity\Member;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class MemberFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('member');

        $this->setHydrator(new DoctrineHydrator($objectManager, 'Members\Entity\Member'))
             ->setObject(new Member());

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'memberID',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'memberLastName',
            'attributes' => array(
                'required' => 'required',
                'type'  => 'text',
            ),
            'options' => array(
                'label' => 'Last Name',
            ),
        ));

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'memberFirstName',
            'attributes' => array(
                'required' => 'required',
                'type'  => 'text',
            ),
            'options' => array(
                'label' => 'First Name',
            ),
        ));

        $personalInfoFieldset = new PersonalInfoFieldset($objectManager);
        $this->add(array(
            'type'    => 'Zend\Form\Element\Collection',
            'name'    => 'personalInfo',
            'options' => array(
                'count'           => 1,
                'target_element' => $personalInfoFieldset
            )
        ));

    }

    public function getInputFilterSpecification()
    {
        return array(
            'memberID' => array(
                'required' => true
            ),
        );
        return array(
            'memberLastName' => array(
                'required' => true
            ),
        );
        return array(
            'memberFirstName' => array(
                'required' => true
            ),
        );
    }

}

PersonalInfoFieldset:

<?php

namespace Members\Form;

use Members\Entity\PersonalInfo;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class PersonalInfoFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('personal-info');

        $this->setHydrator(new DoctrineHydrator($objectManager, 'Members\Entity\PersonalInfo'))
             ->setObject(new PersonalInfo());

        $this->add(array(
            'type' => 'Zend\Form\Element\Text',
            'name' => 'personalInfoID',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));

        $this->add(array(
            'name' => 'spouse',
            'type' => 'Zend\Form\Element\Text',
            'attributes' => array(
                'required' => 'required',
                'type'  => 'text',
            ),
            'options' => array(
                'label' => 'Page Title',
            ),
        ));

        $this->add(array(
            'name' => 'hobbies',
            'type' => 'Zend\Form\Element\Text',
            'attributes' => array(
                'required' => 'required',
                'type'  => 'text',
            ),
            'options' => array(
                'label' => 'Page Name',
            ),
        ));

    }
    public function getInputFilterSpecification()
    {
        return array(
            'personalInfoID' => array(
                'required' => true
            ),
        );
        return array(
            'spouse' => array(
                'required' => true
            ),
        );
        return array(
            'hobbies' => array(
                'required' => true
            ),
        );
    }

}

CreateMemberForm:

<?php

namespace Members\Form;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;

class CreateMemberForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('update-member-form');

        // The form will hydrate an object of type "Member"
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Members\Entity\Member'));

        // Add the user fieldset, and set it as the base fieldset
        $memberFieldset = new MemberFieldset($objectManager);
        $memberFieldset->setUseAsBaseFieldset(true);
        $this->add($memberFieldset);

        // submit elements
        $this->setAttribute('method', 'post');

        $this->add(array(
            'name' => 'memberID',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));
        $this->add(array(
            'name' => 'memberLastName',
            'attributes' => array(
                'id'  => 'memberLastName',
                'type'  => 'text',
                'class' => 'col-lg-10',
            ),
            'options' => array(
                'label' => 'Last Name',
                'label_attributes' => array(
                    'class'  => 'col-lg-2 control-col-label'
                ),
            ),
        ));

        $this->add(array(
            'name' => 'memberFirstName',
            'attributes' => array(
                'id'  => 'memberFirstName',
                'type'  => 'text',
                'class' => 'col-lg-10',
            ),
            'options' => array(
                'label' => 'First Name',
                'label_attributes' => array(
                    'class'  => 'col-lg-2 control-col-label'
                ),
            ),
        ));

        $this->add(array(
            'name' => 'spouse',
            'attributes' => array(
                'id'  => 'spouse',
                'type'  => 'text',
                'class' => 'col-lg-10',
            ),
            'options' => array(
                'label' => 'Spouse',
                'label_attributes' => array(
                    'class'  => 'col-lg-2 control-col-label'
                ),
            ),
        ));

        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'id'  => 'submit',
                'type'  => 'submit',
                'value' => 'Go',
                'id' => 'submitbutton',
            ),
        ));

        // Optionally set your validation group here
    }

}

UpdateMemberForm:

<?php

namespace Members\Form;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;

class UpdateMemberForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('update-member-form');

        // The form will hydrate an object of type "Member"
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Members\Entity\Member'));

        // Add the user fieldset, and set it as the base fieldset
        $memberFieldset = new MemberFieldset($objectManager);
        $memberFieldset->setUseAsBaseFieldset(true);
        $this->add($memberFieldset);

        // submit elements
        $this->setAttribute('method', 'post');

        $this->add(array(
            'name' => 'memberID',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));
        $this->add(array(
            'name' => 'memberLastName',
            'attributes' => array(
                'id'  => 'memberLastName',
                'type'  => 'text',
                'class' => 'col-lg-9',
            ),
            'options' => array(
                'label' => 'Last Name',
                'label_attributes' => array(
                    'class'  => 'col-lg-2 control-col-label'
                ),
            ),
        ));

        $this->add(array(
            'name' => 'memberFirstName',
            'attributes' => array(
                'id'  => 'memberFirstName',
                'type'  => 'text',
                'class' => 'col-lg-9',
            ),
            'options' => array(
                'label' => 'First Name',
                'label_attributes' => array(
                    'class'  => 'col-lg-2 control-col-label'
                ),
            ),
        ));

        $this->add(array(
            'name' => 'spouse',
            'attributes' => array(
                'id'  => 'spouse',
                'type'  => 'text',
                'class' => 'col-lg-9',
            ),
            'options' => array(
                'label' => 'Spouse',
                'label_attributes' => array(
                    'class'  => 'col-lg-2 control-col-label'
                ),
            ),
        ));

        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'id'  => 'submit',
                'type'  => 'submit',
                'value' => 'Go',
                'id' => 'submitbutton',
            ),
        ));

        // Optionally set your validation group here
    }



}

MemberController:

<?php

namespace Members\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Members\Entity\Member;
use Members\Form\CreateMemberForm;
use Members\Form\UpdateMemberForm;
use Doctrine\ORM\EntityManager;

class MemberController extends AbstractActionController
{
    /**
     * @var Doctrine\ORM\EntityManager
     */
    protected $em;

    public function setEntityManager(EntityManager $em)
    {
        $this->em = $em;
    }

    public function getEntityManager()
    {
        if (null === $this->em) {
            $this->em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        }
        return $this->em;
    }

    // ... //

    public function createAction()
    {
        // Get ObjectManager from the ServiceManager
        $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');

        // Create the form and inject the ObjectManager
        $form = new CreateMemberForm($objectManager);

        // Create a new, empty entity and bind it to the form
        $member = new Member();
        $form->bind($member);

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

            if ($form->isValid()) {
                $objectManager->persist($member);
                $objectManager->flush();
            }
        }

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

    public function updateAction()
    {
        $memberID = (int)$this->getEvent()->getRouteMatch()->getParam('memberID');
        if (!$memberID) {
            return $this->redirect()->toRoute('members', array('action'=>'create'));
        }
        $member = $this->getEntityManager()->find('Members\Entity\Member', $memberID);

        // Get your ObjectManager from the ServiceManager
        $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');

        // Create the form and inject the ObjectManager
        $form = new UpdateMemberForm($objectManager);
        $form->setBindOnValidate(false);
        $form->bind($member);
        $form->get('submit')->setAttribute('label', 'Update');

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

                // Redirect to list of members
                return $this->redirect()->toRoute('members');
            }
        }

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

    // ... //

}

update.phtml:

<?php
$title = 'Update Member';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>

<?php
$form = $this->form;
$form->setAttribute('action', 
    $this->url('members', array('action' => 'update', 'memberID'=>$this->memberID)));
$form->prepare();

echo $this->form()->openTag($form);
echo $this->formHidden($form->get('memberID'));
echo $this->formRow($form->get('memberFirstName')) . "<br clear='both'/>";
echo $this->formRow($form->get('memberLastName')) . "<br clear='both'/>";
echo $this->formRow($form->get('spouse')) . "<br clear='both'/>";
echo $this->formInput($form->get('submit'));
echo $this->form()->closeTag($form);

解决方案

The two tables have a relationship so the parent object is still member I assume. With this in mind you still have to create two Fieldset elements. One that matches the structure for a member and the other one that matches the data for personal_info. The later being added as a sub-fieldset onto the MemberFieldset.

That's actually all there is to it, the DoctrineObject (Hydrator) should be able to take care about the ID mapping if it's a new entry. If it's an edit-entry the ID data is there anyways. It's not really that different of a deal than the examples given by the DoctrineModule /docs.

这篇关于使用ZF2和Doctrine从一个窗体更新两个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆