想要在ZF2中使用一个表单插入两个表

时间:2013-04-25 10:37:43

标签: php forms zend-framework2

这可能有点奇怪,但我会试着解释一下。基本上我有一个包含用户的表和一个包含客户的表。用户有权查看仅某些客户的数据。所以我想我会为用户权限创建一个单独的表,将用户ID和客户ID作为外键,并且每个客户/用户权限都有一行。

当管理员使用一个名为UserForm的类(在下面作为参考标注缩短以供参考)使用Zend \ Form将新用户添加到数据库时,我还希望将表单旁边的所有客户显示为可以选择的按钮要添加为权限。现在,我想我会通过一个JavaScript数组来添加或删除客户ID,如果它们被选中/取消选择,然后将该数组作为隐藏值传递给表单,最后循环遍历数组,插入一行进入数组中每个客户ID的权限表,以及获取的用户ID。我不确定这是否是最佳方式,但这是我能想到的最好方法。

希望这至少是可以理解的。所以,我有一个表单,但我想插入两个不同的表。我想,我的问题是如何将数组作为值传递给表单?当调用saveUser()方法时,我如何不仅插入users表,还插入权限表(我也将在下面发布)。另外,这是一种非常奇怪的做法,我不必要地处理这种困难吗?我很想知道是否有更简单的方法。

我的UserForm类:

namespace Admin\Form;
use Zend\Form\Form;

class UserForm extends Form
{
public function __construct($name = null)
{
    parent::__construct('user');
    $this->setAttribute('method', 'post');
    $this->add(array(
        'name' => 'userId',
        'attributes' => array(
            'type'  => 'Hidden',
        ),
    ));

    $this->add(array(
        'name' => 'activated',
        'attributes' => array(
            'value' => 1,
            'type'  => 'Hidden',
        ),
    ));
    $this->add(array(
        'name' => 'username',
        'attributes' => array(
            'type'  => 'text',
        ),
        'options' => array(
            'label' => 'Username:',
        ),
    ));
    $this->add(array(
        'name' => 'firstname',
        'attributes' => array(
            'type'  => 'text',
        ),
        'options' => array(
            'label' => 'First name:',
        ),
    ));
    $this->add(array(
        'name' => 'lastname',
        'attributes' => array(
            'type'  => 'text',
        ),
        'options' => array(
            'label' => 'Last name:',
        ),
    ));
    $this->add(array(
        'name' => 'submit',
        'attributes' => array(
            'type'  => 'submit',
            'value' => 'Go',
            'id' => 'submitbutton',
        ),
    ));

}

}

我的saveUser()方法

public function saveUser(User $user)
{
    $data = array(
        'firstname'     => $user->firstname,
        'lastname'      => $user->lastname,
        'username'      => $user->username,
        'activated'     => $user->activated,
    );

    $userId = (int)$user->userId;
    if ($userId == 0) {
        $this->tableGateway->insert($data);
    } else {
        if ($this->getUser($userId)) {
            $this->tableGateway->update($data, array('userId' => $userId));
        } else {
            throw new \Exception('User ID does not exist');
        }
    }
}

1 个答案:

答案 0 :(得分:4)

一种方法是使用表单字段集。表单可以有多个Fieldsets,每个Fieldset可以绑定到不同的实体。

当实体

之间存在一对一关系时,这些功能非常有用

然后,您将创建teo实体,例如用户实体(就像您已有的那样)和一个代表您的权限的新实体。

您可以为每个创建一个Feildset,并将对象绑定到字段集。 (例如,UserFieldSet和PermissionFieldset)

结帐表格字段集部分:

http://zf2.readthedocs.org/en/latest/modules/zend.form.advanced-use-of-forms.html

如果您有一对多关系,即。一个用户可以拥有多个权限,那么您最好查看表单集合:

http://zf2.readthedocs.org/en/latest/modules/zend.form.collections.html

还有一个为一对多关系动态添加新行的示例。