В настоящее время у меня есть модели ‘posts’ и ‘users’, связанные с моделью ‘attachments’, все отлично работает, за исключением того, что мне нужно поместить скрытый ввод в каждую форму, сообщая CakePHP, какую модель я собираюсь использовать, как код ниже:
<?= $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(); ?>
Есть ли способ сообщить Cake, какой Attachment.model я собираюсь использовать для каждой модели / контроллера? Или это правильный способ сделать это?
Вы можете использовать соответствующие классы таблицы 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);
}
}
}
Смотрите также
Других решений пока нет …