#typo3 #fluid #extbase
#typo3 #fluid #extbase
Вопрос:
У меня есть две модели Extbase с отношением 1: n. Родительский элемент связан с дочерними объектами через ObjectStorage
.
Чего я хочу добиться: editAction($parent)
который показывает список всех дочерних объектов в виде записей с флажком (установлен по умолчанию). Пользователю разрешено снять любой флажок, отправить форму, и соответствующие дочерние элементы должны быть удалены из родительского отношения.
Что я сделал до сих пор. В fluid я перебираю объекты и выводю флажки следующим образом:
<f:for each="{parent.children}" as="child" iteration="iteration">
<f:form.checkbox property="children.{iteration.index}" value="{child}" />
<label>{child.title}</label>
</f:for>
Это генерирует следующий HTML, который мне кажется подходящим:
<input type="hidden" name="tx_myext_plugin[parent][children][0][__identity]" value="">
<input type="checkbox" name="tx_myext_plugin[parent][children][0][__identity]" value="135" checked="checked">
<label>child0-title</label>
<input type="hidden" name="tx_myext_plugin[parent][children][1][__identity]" value="">
<input type="checkbox" name="tx_myext_plugin[parent][children][1][__identity]" value="136" checked="checked">
<label>child1-title</label>
...
Но когда я снимаю 2-й флажок (uid = 136) и отправляю форму, я получаю следующее исключение
#1297759968: Exception while property mapping at property path "children.1": The identity property "" is no UID.
Что также кажется логичным, потому что есть скрытый ввод, который отправляет пустое значение.
Я думаю, я могу подключиться где-нибудь в MVC-process и просто отфильтровать записи с помощью empty __identity
, но есть ли более элегантный (например, наилучший) способ?
TYPO3 7.6.11
Ответ №1:
В вашем контроллере вы можете создать initialize*Action()
функцию. Там вы можете отфильтровать свои пустые значения, чтобы существовали только значения с идентификатором.
public function initializeSaveAction()
{
if ($this->request->hasArgument('parent')) {
$parent = $this->request->getArgument('parent');
foreach ($parent['children'] as $key => $child) {
if (!$child['__identity']) unset($parent['children'][$key]);
}
$this->request->setArgument('parent', $parent);
}
}
Теперь ваш saveAction
вызывается после initializeSaveAction
и сохраняет только выбранные дочерние объекты.
Комментарии:
1. Да, это то, о чем я думаю, просто хотел узнать, есть ли другие рекомендуемые способы.
2. Насколько я знаю, это самый простой способ. Может быть, вы можете написать propertyMapper, но я думаю, что для такого простого мышления это «слишком много».