Как мое расширение считывает поля bodytext из tt_content в TYPO3 CMS 7.6?

Я пишу расширение TYPO3 с использованием TYPO3 CMS 7.6.x LTS и Extension Builder. Одной из задач моего расширения является сканирование полей "header" и "bodytext" таблицы tt_content TYPO3; сопоставлять конкретные текстовые шаблоны в "bodytext"; разобрать найденный текст; и поместите полученные данные в таблицу журнала моего расширения вместе с меткой из поля заголовка tt_content.

"Использование внешних источников данных" в разделе "Разработка расширений TYPO3 с помощью Extbase и Fluid" на странице [ https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html ] рассказывает о помещение данных в tt_address с использованием отображения TypoScript. Вместо этого я читаю данные из tt_content и предпочел бы остаться в рамках PHP в расширении.

Используя в качестве примера график из внешнего ключа для внешнего пользователя TYPO3, я добавил вторую модель к модели моего расширения в Extension Builder. Я сделал модель "TtContent" и использовал ее "Настройки объекта домена" для "сопоставления с существующей таблицей", запись которой была "tt_content". Я НЕ вводил значение в поле "расширение с использованием класса модели". Я сделал поле "отношение" в моей модели журнала и провел провод, подключенный из моего поля отношения Log:ttContent к строке заголовка моей модели TtContent. Когда я нажал "Сохранить", Extension Builder ответил: "Конфигурация для таблицы" tt_content "не совместима с extbase. Вы должны настроить ее самостоятельно, если хотите отобразить эту таблицу (Ошибка 606)". Я не понимаю это сообщение об ошибке.

В Extension Builder устанавливаю ли отношение в моей модели журнала к существующему внешнему классу? Если да, какой внешний класс мне использовать? Или я могу сделать модель tt_content в Extension Builder и как-нибудь пройти через эту ошибку 606? Это не должно показаться сложным, потому что я хочу читать из существующей таблицы уже в TYPO3.

1 ответ

Решение

Решение: Создайте модель Extbase и репозиторий, представляющий существующую таблицу tt_content, затем запишите сопоставление свойств TypoScript.

В моделировщике доменов TYPO3 Extension Builder добавьте модель с именем "Content" или какое-либо имя, которое напоминает вам таблицу tt_content. В части "Настройки объекта домена" модели содержимого поместите "tt_content" в поле "Сопоставить с существующей таблицей". Не берите в голову "расширить существующий класс модели", потому что Extbase не имеет такого класса для tt_content.

Также в настройках объекта домена установите тип объекта "Entity", установите флажок "является совокупным корнем" и снимите флажки "добавить удаленное поле", "добавить скрытое поле", "добавить поля времени начала / окончания" и "включить". категоризация "ящиков. Установка типа объекта "сущность" и проверка "является агрегатным корнем?" Поле заставляет Extension Builder создать репозиторий для вашей модели контента.

Добавьте в модель содержимого свойства, представляющие столбцы, к которым вы хотите получить доступ в таблице базы данных tt_content. В моей модели содержимого я добавил только свойства "header" и "bodytext".

Примечание. Вам не нужно добавлять свойства uid или pid TYPO3 в модель содержимого. Эти свойства были расширены из родительского класса \TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject.

Нажмите "Сохранить" в Extension Builder, чтобы сохранить новую модель домена. Вы получите сообщение: "Предупреждение! Конфигурация для таблицы" tt_content "не совместима с extbase. Вы должны настроить ее самостоятельно, если хотите сопоставить эту таблицу (Ошибка 606). Вы все равно хотите сохранить?" Да, все равно сохранить. Extension Builder ответит: "Успех. Расширение было сохранено. Ваше расширение еще не установлено". Выйдите из Extension Builder.

Примечание. Если вы выполните несколько итераций моделирования в Extension Builder, вы можете найти артефакты в конечном коде расширения, оставленные после ваших предыдущих итераций. Extension Builder перезаписывает некоторые области расширения, но оставляет другие области в покое. См. Ссылку на конфигурацию Extension Builder по адресу [ https://docs.typo3.org/typo3cms/extensions/extension_builder/Configuration/Index.html ].

Используйте отображение таблиц Extbase для настройки и, таким образом, доступа к содержимому из таблицы TYPO3 tt_content. Выполните эту настройку с помощью параметров отображения TypoScript "config.tx_extbase.persistence.classes" в файле "typo3conf/ext/yourextensionkey/ext_typoscript_setup.txt". Extension Builder создал этот файл, когда вы сохранили модель своего домена. Это настройка, упомянутая в ошибке 606.

См. Пример кода в разделе "Использование внешних источников данных" по адресу [ https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html ]. Этот пример кода TypoScript определяет сами строки отображения. Вы можете использовать "config.tx_extbase" вместо "plugin.tx_myextension". На следующей странице "Моделирование иерархии классов" по ​​адресу [ https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/5-modeling-the-class-hierarchy.html ] приведен пример кода для "config.tx_extbase"; но это не показывает сами линии отображения.

В моей ситуации я добавил инструкции TypoScript в ext_typoscript_setup.txt, чтобы отобразить столбцы "header" и "bodytext". Я также удалил recordType = Tx_Myextensionkey_Content строка, которую написал Extension Builder, потому что я хочу прочитать уже существующие записи tt_content, а не записи, сделанные моим расширением.

config.tx_extbase{
    persistence{
        classes{

            Mynamespace\Myextensionkey\Domain\Model\Content {
                mapping {
                    tableName = tt_content
                    columns {
                        header.mapOnProperty = header
                        bodytext.mapOnProperty = bodytext
                    }
                }
            }

        }
    }
}

Мое расширение TYPO3 теперь может читать из tt_content.

Примечание. При присвоении значения recordType в ext_typoscript_setup.txt слой персистентности Extbase выполняет поиск этого единственного значения в базовом tt_content.CType колонка. Extbase делает это с помощью своей функции \TYPO3\CMS\Extbase\Configuration\AbstractConfigurationManager getConfiguration() $frameworkConfiguration и своей функции \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapFactory buildDataMapInternal(). На момент написания этой статьи нельзя использовать подстановочный знак, такой как * или же % в вашем значении recordType; и вы не можете дать список значений, таких как text, textmedia,

Другие вопросы по тегам