ZF2原则:使用表单中其他实体的数据

时间:2014-07-04 15:51:39

标签: php zend-framework doctrine-orm zend-framework2 zend-form

在ZF2中,我有一个表格,用于编辑数据库中表格的数据。我想将另一个表格中的字段添加到表单中,我该怎么办?

该表名为 UserProfile ,实体类如下所示:

namespace UpvUser\Entity;

use Doctrine\ORM\Mapping as ORM; 
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface;  
use Zend\InputFilter\InputFilterInterface; 

/**
* User Profile
*
* @ORM\Entity
* @ORM\Table(name="userprofile")
* @property int $userId
* @property string $title
* @property string $firstName
* @property string $lastName
and so on...
*/

class UserProfile
{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer");
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    public $userId;
    /**
    * @ORM\Column(type="string")
    */
    public $title;
    /**
    * @ORM\Column(type="string")
    */
    public $firstName;
    /**
    * @ORM\Column(type="string")
    */
and so on including getters/setters and input filters...

UserProfileForm类如下所示:

namespace UpvUser\Form;

use Zend\Form\Form;
use Zend\I18n\Translator\Translator;

class UserProfileForm extends Form
{
    public function __construct($name = null)
    {
        parent::__construct('userprofile');               // The name of the form
        $this->setAttribute('method', 'post');
        $this->add(array(
            'name' => 'userId',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));        
        $this->add(array(
            'name' => 'title',
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
        $this->add(array(
            'name' => 'firstName',
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
// and so on...

并且在控制器的editAction()中:

$user = $this->getEntityManager()->find('UpvUser\Entity\UserProfile', $userId);

$form  = new UserProfileForm();
$form->bind($user);
$form->get('submit')->setAttribute('value', 'LANG_BTN_EDIT');

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

    if ($form->isValid()) {
        $this->getEntityManager()->flush();

        return $this->redirect()->toRoute('upv-user', array('action' => 'overview'));           // Redirect to list of albums
    }
 }

 return array(
     'userId' => $userId,
     'form' => $form,
 );

我想 $ form-> bind($ user)使用 $ user 对象中的数据填充表单,但如何附加其他数据,例如用户的电子邮件地址,存储在名为用户的另一个表中(具有相应的结构和实体类),列电子邮件,与 userprofile.userid 具有相同的 id ?我试图从UserProfile实体类中获取另一个表的getter,但实体管理器仅在控制器中可用,而不在Entity类中!或者我应该在控制器中执行此操作并以某种方式将缺少的数据附加到 $ user 对象(但我想我应该在模型中而不是在控制器中创建它) ?或者我拥有来定义两个表之间的外键,即使用户ID相同(但我不允许更改用户表,它也被用作其他人的共享资源)?

非常感谢您的信息

1 个答案:

答案 0 :(得分:0)

你可以使用Fieldsets来做 - 只需为第二个实体创建一个自己的Fieldset(注意 setObject()调用),并确保设置的名称与实体中定义的名称相同class(parent :: __ construct())。示例:'user' - >是您的引用/关联实体属性(从那里您需要'外部'数据) - 抱歉,我无法更好地解释它。

class UserDataFieldset extends Fieldset {

    public function __construct(ObjectManager $objectManager){

        parent::__construct('user');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new UserData());

        $this->add(array(
            'name' => 'email',
            'attributes' => array(
                'type'  => 'text',
            ),
        ));

        // etc....
    }
}

在表单中,您可以像普通表单元素一样添加它:

class UserProfileForm extends Form
{
    public function __construct(ObjectManager $objectManager, $name = null)
    {
        // etc..

        $this->add(new UserDataFieldset($objectManager));
    }
}

这应该足够了。