Удалить объект из списка дочерних объектов в модели, сняв флажок в Fluid

#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, но я думаю, что для такого простого мышления это «слишком много».