0

データベースに格納される前にデータを処理する CakePHP 動作を作成したいと考えています。

たとえば、投稿に次のようなフォームを追加します。

// Post title
echo $this->Form->input('title',['value'=>'aaa']);
// Post has many Photos (names)
echo $this->Form->input('photos.0.name',['value'=>'zzz']);
echo $this->Form->input('photos.1.name',['value'=>'hhh']);
echo $this->Form->input('photos.2.name',['value'=>'fff']);

投稿コントローラー:

public function add()
{
    $post = $this->Posts->newEntity();
    if ($this->request->is('post')) {
        $post = $this->Posts->patchEntity($post, $this->request->data);

        if ($this->Posts->save($post)) {
            $this->Flash->success(__('The post has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The post could not be saved. Please, try again.'));
        }
    }
    $this->set(compact('post'));
    $this->set('_serialize', ['post']);
}

フォームからのデータはデータベースに適切に保存されます。

次に、新しいビヘイビア (MyBehavoir など) をベイクし、PhotosTable にアタッチします。3つの「名前」フィールドすべてを取得し、それらを処理したい. ucfirst メソッドで変換し、データベースに格納するために送り返します。

public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
    $data['name'] = ucfirst($data['name']);
    debug($data);
}
 // debug return three outputs for every field

object(ArrayObject) {
    name => 'Zzz' // Hhh, Fff
}

ただし、最初の結果 (Zzz) のみが保存されます。

Behavior で処理した後にすべてのフィールドを保存するにはどうすればよいですか?

また、

public function beforeSave(Event $event, Entity $entity)
{   
    debug($entity);
    return true;
}

デバッグは最初のフィールドからのデータのみを表示します

object(App\Model\Entity\Photo) {

    'name' => 'Zzz',
    'post_id' => (int) 486,
    ...
4

1 に答える 1

1

これはbeforeMarshall関数の誤用です。あなたがしなければならないことは、Entity Mutator メソッドを使用して、永続化する前に必要に応じてプロパティを設定することです。

のようなメソッドを作成することにより、エンティティが永続化される前に名前を変更できますprotected function _setName()PhotoEntity

Entity Mutators の詳細については、本 を参照してください。

于 2015-10-07T15:29:59.997 に答える