Результаты фильтра TYPO3 Extbase TCA MM-отношений по определенной на сайте константе "newRecordStoragePid" - PullRequest
0 голосов
/ 20 декабря 2018

TLDR: у меня есть две модели с MM-отношениями с разными StoragePids, определенными с помощью констант в моем шаблоне.Я не знаю, как отфильтровать результаты при запросе моих данных относительно моих сконфигурированных storagePids для моей связанной модели.

Длинная версия: в моей установке с несколькими сайтами TYPO3 у меня есть две модели: «Person» и «PersonalInformation»,Эти модели имеют отношение MM, определенное через TCA.«Персона» содержит все общие данные, хранящиеся в глобальном RecordStore.«PersonalInformation» содержит редактируемые данные, т.е. изображения, которые можно редактировать для каждого сайта отдельно.Эти данные хранятся в отдельных RecordStores для каждого сайта.

Это означает, что в каждом шаблоне сайта-> Константы, которые я определил extension-storagePid, т.е.: $ plugin.tx_myext.persistence.storagePid = 1на всех сайтах одинаково, чтобы иметь возможность доступа к одному и тому же RecordStore с каждого сайта.

RecordStore для «PersonalInformation» должен быть разным для каждого сайта.Так что мой setup.txt моего расширения выглядит так:

   persistence {
        storagePid = {$plugin.tx_myext.persistence.storagePid},
                     {$plugin.tx_tx_myext.persistence.personalInformationStoragePid}
        classes {
          TYPO3\T3myext\Domain\Model\PersonalInformation {
            newRecordStoragePid = {$plugin.tx_myext.persistence.personalInformationStoragePid}
          }
        }
    }

И в моем шаблоне корневого сайта в разделе Константы я определил plugin.tx_myext.persistence.personalInformationStoragePid для каждого сайта отдельно.

Мой TCA MM-Отношение, определенное для PersonalInformation:

   'person' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_person',
        'config' => array(
            'type' => 'select',
            'renderType' => 'selectMultipleSideBySide',
            'foreign_table' => 'tx_myext_domain_model_person',
            'foreign_table_where' => 'AND 1=1 ORDER BY last_name ASC',
            'MM' => 'tx_myext_person_personalinformation_mm',
            'size' => 10,
            'autoSizeMax' => 30,
            'maxitems' => 1,
            'minitems' => 0,
            'multiple' => 0,
        ),
    ),

Мое отношение TCA, определенное для персоны:

    'personalinformation' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_person.personalinformation',
        'config' => array(
            'type' => 'none',
            'readonly' => 1,
            'foreign_table' => 'tx_myext_domain_model_personalinformation',
            'MM_opposite_field' => 'personalinformation',
            'MM' => 'tx_myext_person_personalinformation_mm',
            'foreign_table_where' => 'AND tx_myext_domain_model_personalinformation.pid=###The-PID-defined-in-my-site-Const-for-personalInformationStoragePid###'
        ),
    ),

Если я var_dump моей персоны во внешнем интерфейсе, все Person.PersonaИнформация о всех хранилищах записей.Но мне показывать только PersonalInformation Records текущего сайта.

1 Ответ

0 голосов
/ 20 декабря 2018

Поле в модели всегда возвращает все отношения, независимо от pid хранилища.foreign_table_where в TCA предназначен только для бэкэнда, поэтому для внешнего интерфейса это ничего не изменит.

Если вы хотите получать отношения только из определенного pid, существует несколько решений:

  1. Отфильтруйте это самостоятельно, либо в своем шаблоне, модели или контроллере.Просто зациклите отношения и проверьте pid.Этот вариант самый простой, но он будет медленным, если у вас много связей.
  2. Выберите записи PersonalInformation отдельно в вашем контроллере, используя PersonalInformationRepository с функцией findByPerson.Это будет соответствовать storagePid, установленному в TypoScript.Это будет хорошо работать, если вам нужна информация только для 1 человека.Если вам это нужно для нескольких человек на 1 странице (например, в виде списка), вы можете сделать это с помощью пользовательской функции getPersonalInformation в вашей модели Person.Если он не кэширован, он также может быть медленным для списков (в зависимости от количества записей).
  3. Использование полностью настраиваемого запроса с использованием QueryBuilder (https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html). Таким образом, вы можете сделать это в 1 запросе с помощьюприсоединяется.

Какое наилучшее решение зависит от вашей конкретной ситуации и количества записей.

...