2017-03-22 2 views
1

現在、私は '添付ファイル'モデルに関連付けられた 'posts'と 'users'モデルを持っています。すべてがCakePHPにどのフォームに隠れた入力を置く必要があるという事実を完全に実行しますモデル私は以下のコードのように、使用するつもりです:CakePHP 3.X Multiple Model association

<?= $this->Form->create($post); ?> 
<fieldset> 
    <legend>Create a new Post</legend> 

    <?php 
     echo $this->Form->input('title'); 
     echo $this->Form->input('content'); 
     echo $this->Form->hidden('attachments.0.model', ['default' => 'Post']); 
     echo $this->Form->control('attachments.0.image_url'); 
     echo $this->Form->hidden('attachments.1.model', ['default' => 'Post']); 
     echo $this->Form->control('attachments.1.image_url'); 
    ?> 
</fieldset> 
<?= $this->Form->button(__('Save Post')); ?> 
<?= $this->Form->end(); ?> 

Attachment.model私は各モデル/コントローラに使用するつもりだケーキを伝える方法はありますか?それともこれは正しい方法ですか?

+0

[関連データの入力を作成](https://book.cakephp.org/3.0/ja/views/helpers/form.html#creating-inputs-for-associated-data)によると、 'echo $ this-> Form-> control( 'tags.0.id');'私は質問を誤解していると思うが、あなたは 'Posts'に関連付けられた' Attachments'を編集しようとしていますか?もしそうなら、私はより良い説明を書くことができます。 – Sevvlor

答えて

1

それぞれのテーブルクラスbeforeSaveおよび/またはbeforeMarshalイベント/コールバックを使用して、現在のテーブル(モデル)に関する添付データを変更すること、つまりテーブル(モデル)名を挿入することができます。

適用する時期によっては、マーシャリング前にのみ使用することができます。beforeMarshalを使用し、保存のみ>使用beforeSave)、またはその両方を使用します。ここで

は無条件にマーシャリングならびに省段階の両方の現在のテーブル名を注入基本的な例です:

use Cake\Datasource\EntityInterface; 
use Cake\Event\Event; 

// ... 

public function beforeMarshal(Event $event, \ArrayObject $data, \ArrayObject $options) 
{ 
    if (isset($data['attachments']) && 
     is_array($data['attachments']) 
    ) { 
     $alias = $this->registryAlias(); 
     foreach ($data['attachments'] as &$attachment) { 
      $attachment['model'] = $alias; 
     } 
    } 
} 

public function beforeSave(Event $event, EntityInterface $entity, \ArrayObject $options) 
{ 
    $attachments = $entity->get('attachments'); 
    if (is_array($attachments)) { 
     $alias = $this->registryAlias(); 
     foreach ($attachments as $attachment) { 
      $attachment->set('model', $alias); 
     } 
    } 
} 

+0

完璧に動作します、ありがとう – noeyeat