Встроенные записи плагина Typo3 в контроллере внешнего интерфейса - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать расширение Typo3, используя extbase, и наткнулся на проблему.Пока что я сделал следующее: я создал плагин, редактируемый через flexform для бэкэнда.Плагин позволяет динамически изменять некоторые поля, поэтому flexform использует встроенные записи, которые могут быть успешно сохранены в базе данных в своей собственной таблице tx_jwfrontendusermanager_editorfields .Pid для записей таблицы такой же, как и для объекта содержимого, к которому они присоединены, а дополнительное поле в таблице содержит идентификатор объекта содержимого.Бэкэнд пока работает отлично, я могу без проблем создавать / редактировать / удалять встроенные записи для объектов содержимого.

К сожалению, я не могу понять, как получить доступ к встроенным записям вActionController во внешнем интерфейсе, и я не могу найти никакой документации о том, как это сделать.Может ли кто-нибудь указать мне правильное направление?

Что я пробовал до сих пор:

Первый (примитивный) подход: доступ к встроенному полю flexform, как и к любому другому полю из формы.Это просто возвращает число «7».Очевидно, он не предназначен для такого использования.

Второй подход: я создал Model / Repository для таблицы EditorFields и сопоставил класс Model с таблицей, используя Typoscript.Само отображение работает нормально.К сожалению, я не могу выбрать только записи, которые связаны с текущим объектом контента.Вызов Repository-> findAll () возвращает пустой массив.Я отладил SQL-запрос для команды findAll и обнаружил три проблемы:

  1. Фильтры запросов по полю tx_jwfrontendusermanager_editorfield . pid , ноиспользуя неправильный идентификатор страницы.Используется pid, который я выбрал в поле «Record Storage Page» плагина, а не объект содержимого.

  2. Запрос не фильтрует идентификатор объекта содержимого, нобудет отображать все записи для всех объектов содержимого на странице.

  3. Запрос фильтрует по дополнительному

    `tx_jwfrontendusermanager_editorfield`.`type` = "\Jw301\JwFrontendusermanager\Domain\Model\EditorField"
    

    , который не имеет никакого смысла, так как ни один издля записей в поле type установлено что-то вроде этого.Тип используется бэкэндом для различения разных видов записей.Таким образом, запрос никогда не будет иметь никаких результатов.

Итак, как это можно изменить так, чтобы Репозитарий находил правильные записи?Является ли это даже правильным подходом?

Третий подход: так как подход с репозиторием не был успешным, я попытался получить записи самостоятельно, создав собственный запрос SQL.В целом это работает, но у меня все еще есть проблемы с фильтрацией нужных мне записей.Я могу легко получить идентификатор текущей страницы, используя

$GLOBALS['TSFE']->page['uid']

Но, похоже, нет способа получить идентификатор объекта содержимого в ActionController.Я нашел много интернет-источников, которые сказали, что я должен использовать

$cObj = $this->configurationManager->getContentObject();
$cObj->data['uid']

из ActionController для доступа к текущему идентификатору объекта контента, но для меня это не сработало.Я пробовал это в каждом ActionController в моем проекте, но поля uid там никогда не было.Полученный $ cObj имеет тип ContentObjectRenderer , но массив data всегда пуст.

Как получить доступ кuid объекта содержимого из ActionController?

Спасибо за любую помощь или подсказки, которые ведут меня в правильном направлении.

...