Typo3 - как добавить пользовательское поле в объединенную коллекцию? - PullRequest
2 голосов
/ 28 июня 2019

Проблема

Существует Расширение, назовем его ProjectExams, которое показывает список экзаменов.Существует структура с контроллером, моделью, репозиторием моделей, таблицами и шаблоном.Все работает, используя Extbase для извлечения коллекций данных (привязки отложенной загрузки моделей).

У нас есть два запроса:
* обход привязок и извлечение коллекции с использованием только одного «необработанного» SQL-запроса с объединениями вDB;
* вернуть в View (Template) массив без элементов объектов

Фон и код

Коллекция моделей представляет список экзаменов.Помимо UID, Title, Description и остальных полей, которые находятся в таблице MySQL «domain_model_exams», файл шаблона должен также указывать местоположение (город) для каждого экзамена.Затем ModelRepository использует метод «findExamsByDate», вызываемый контроллером, в котором запрашивается реализация этого единственного «необработанного» SQL-запроса.

Код контроллера

public function listAction($success = null, $message = '')
{
    // here some code, not related to the issue

    $examStartFrom = $_POST['exams']['examStartFrom'] ?? null;
    $examStartTo   = $_POST['exams']['examStartTo'] ?? null;
    $dateBoundary = new DateBoundary($examStartFrom, $examStartTo);

    $isAdmin = ($role === User::USER_TYPES_EXAMINER_ADMIN && $dateBoundary->isValid());

    $exams = $this->examRepository->findExamsByDate(
            $dateBoundary->getFromDate(),
            $dateBoundary->getToDate(),
            $isAdmin
        );

    // here some code, not related to the issue

    $this->view->assign('exams', $exams);

    // here some code, not related to the issue
}

Шаблон (просмотр) ожидает переменную exams.city

В *Файл 1023 * Model , у нас есть защищенный var $city с функциями set и get

ModelRepository code

/**
 * Get all exams within a certain time frame
 *
 * @param \DateTime $from
 * @param \DateTime $to
 * @param bool      $isAdmin
 *
 * @return QueryResultInterface|array|Exam[]
 *
 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
 */
 public function findExamsByDate(\DateTime $from, \DateTime $to, bool $isAdmin = false)
 {
    $whereConditions = []; 
    $query = $this->createQuery();

    // here some lines with where conditions related to time frame
    if ($from instanceof \DateTime) {
        $whereConditions[] = 's.course_start >= ' . $from->getTimestamp();
    }

    if ($to instanceof \DateTime) {
        $whereConditions[] = 's.course_start <= ' . $to->getTimestamp();
    }

    $query->statement(sprintf('
        SELECT s.*, a.place as city
         FROM domain_model_exams AS s
           LEFT JOIN domain_model_address AS a ON s.address_id = a.uid
         WHERE %1$s
         ORDER BY s.course_start ASC
    ', implode(' AND ', $whereConditions)));

    return $query->execute();
}

Results

Используя \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($exams);, мы получаем этот объект:

TYPO3\CMS\Extbase\Persistence\Generic\QueryResultprototypeobject (762 items)
   0 => Domain\Model\Examprototypepersistent entity (uid=5, pid=568)
      title => protected 'The mighty title for this exam' (xx chars)
      descriptionText => protected '' (0 chars)
      courseStart => protectedDateTimeprototypeobject (2014-12-05T09:00:00+00:00, 1417770000)
      courseEnd => protectedDateTimeprototypeobject (2014-12-07T11:30:00+00:00, 1417951800)
      .
      . other fields
      .
      city => protected NULL
      .
      . other fields
      .

Мы ожидаем, что city => protected 'Frankfurt am Main' (17 chars) не NULL, потому что мы получаем это, когда SQL-запрос выполняется к базе данных.

1 Ответ

1 голос
/ 28 июня 2019

Решение

  1. удалить из Модели свойство и получить-установить функции, относящиеся к этому полю 'город';в нашем конкретном случае:
/**
 * @var \Domain\Repository\AddressRepository
 */
Typo3 расширение используется для того, чтобы иметь определенный файл конфигурации, используемый для пользовательских конфигураций модели, например добавить новое настраиваемое поле /Exams/Configuration/TCA/domain_model_exam.php В этом файлев массиве return мы должны добавить новый элемент, который содержит конкретную конфигурацию для этого нового поля:
return call_user_func(function ($_EXTKEY) {
    // some other settings
    return [
        'ctrl' => [
            // other fields
            'city' => 'city',
            // more fields
        ],
        'interface' => [
            'showRecordFieldList' => 'field_a, field_b, city, field_n',
        ],
        'types' => [
            '1' => ['showitem' => 'field_a, field_b, city, field_n'],
        ],
        'columns' => [    
            'city' => [
                'exclude' => 1,
                'label' => 'LLL:EXT:exams/Resources/Private/Language/locallang_db.xlf:domain_model_exam.city',
                'config' => [
                    'type' => 'input',
                    'size' => 30,
                    'eval' => 'trim'
                ],
          ],
    ];
}, 'seminars');

Любое другое лучшее решение для этих конкретных запросов будетвысоко ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...