2017-03-22 205 views
1

目前我有一個'貼子'和'用戶'模型關聯到'附件'模型,一切工作完全勝任,因爲我需要把每個窗體的隱藏輸入告訴CakePHP模型我要去使用,就像下面的代碼:CakePHP 3.X多個模型關聯

<?= $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/en/views/helpers/form.html#creating-inputs-for-associated-data),您可以創建輸入相關數據如下:'echo $ this-> Form-> control('tags.0.id');'儘管我認爲我誤解了這個問題。您正在嘗試編輯與「Posts」關聯的「附件」?如果是這樣,我可以寫一個更好的解釋。 – 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