2

これは少し奇妙かもしれませんが、説明しようと思います。基本的に、ユーザーを含むテーブルと顧客を含むテーブルがあります。ユーザーは、特定の顧客のデータのみを調べる権限を持っています。そこで、ユーザー ID と顧客 ID を外部キーとして取り、顧客/ユーザー許可ごとに 1 つの行を持つ、ユーザー許可用の別のテーブルを作成することにしました。

管理者が Zend\Form を使用する UserForm というクラスを使用してデータベースに新しいユーザーを追加するとき (参照用に以下に短縮して掲載)、追加するために選択できるボタンとしてフォームの横にすべての顧客も表示したいパーミッションとして。ここで、顧客 ID が選択/選択解除された場合に顧客 ID を追加または削除する JavaScript 配列を用意し、その配列を非表示の値としてフォームに渡し、最後に配列をループして行を配列内の各顧客 ID の権限テーブル、および作成されたユーザー ID も取得します。これが最善の方法かどうかはわかりませんが、私が思いついた最善の方法です。

少なくとも少しは理解できることを願っています。したがって、フォームは 1 つですが、2 つの異なるテーブルに挿入したいと考えています。私の質問は、どうすれば配列を値としてフォームに渡すことができるのでしょうか? また、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');
        }
    }
}
4

1 に答える 1

4

1 つの方法は、フォーム フィールドセットを使用することです。フォームには複数のフィールドセットを含めることができ、各フィールドセットは異なるエンティティにバインドできます。

これらは、エンティティ間に1 対 1 の関係がある場合に役立ちます。

次に、(既に持っている) ユーザー エンティティなどの teo エンティティと、アクセス許可を表す新しいエンティティを作成します。

それぞれに対してフィールド セットを作成し、オブジェクトをフィールド セットにバインドします。(たとえば、UserFieldSet と PermissionFieldset)

フォーム フィールドセットのセクションを確認してください。

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

1対多の関係がある場合、つまり。1 人のユーザーが複数のアクセス許可を持つことができる場合は、フォーム コレクションを確認することをお勧めします。

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

1 対多の関係に新しい行を動的に追加する例もあります。

于 2013-04-25T10:54:45.053 に答える