TYPO3 Extbase JsonView FAL

#json #controller #typo3 #extbase

#json #контроллер #typo3 #extbase

Вопрос:

Это мое действие контроллера:

 public function jsonAction()
{
    $this->view->setVariablesToRender(array('produkte'));
    $this->view->setConfiguration(
        array(
            'produkte' => array(
                '_descendAll' => array(
                    'only' => array('titel', 'beschreibung', 'bild', 'download', 'categories'),
                    '_descend' => array(
                        'bild' => array(),
                        'download' => array(),
                        'categories' => array(),
                    )
                )
            )
        )
    );

    $this->view->assign('produkte', $this->produktRepository->findAll());
}
  

и я получаю очень красивую JSON-строку. К сожалению, я получаю только PID и UID для содержащихся файлов (FAL). Как я могу получить полный объект или, по крайней мере, путь к содержащимся файлам?

 /**
 * Returns the bild
 *
 * @return TYPO3CMSExtbaseDomainModelFileReference $bild
 */
public function getBild()
{
    return $this->bild;
}

/**
 * Returns the download
 *
 * @return TYPO3CMSExtbaseDomainModelFileReference $download
 */
public function getDownload()
{
    return $this->download;
}
  

Комментарии:

1. Можете ли вы поделиться соответствующими частями модели продукта?

2. хорошо, отредактируйте выше. Надеюсь, это правильная часть.

3. Я подозреваю, что это связано с тем фактом, что свойства объектов file и file reference не являются свойствами реального объекта, а хранятся в виде лениво загруженного ассоциативного массива ( properties я думаю, с именем). JsonView Обрабатывает только те, которые он может получить путем вызова get_object_vars (через вызов getGettablePropertyNames() ), который использует get_object_vars . Попробуйте вывести свойство properties , может быть, это поможет? Не уверен, правильно ли это.

Ответ №1:

Попробуйте перейти к originalResource из FileReference и выставить publicUrl :

 $this->view->setConfiguration(
    array(
        'produkte' => array(
            '_descendAll' => array(
                'only' => array('titel', 'beschreibung', 'bild', 'download', 'categories'),
                '_descend' => array(
                    'download' => array(
                        '_descendAll' => array(
                            '_only' => array('originalResource');
                            '_descend' => array(
                                'originalResource' => array(
                                    '_only' => array('publicUrl');
                                );
                            );
                        );
                    ),
                )
            )
        )
    )
);
  

Комментарии:

1. Спасибо, я попробую. Но, к сожалению, эффекта нет. Только PID и UID.

2. Пожалуйста, выполните a DebuggerUtility:var_dump для a Produkt (возможно, для этой цели отключен JsonView), например, отладьте первый элемент ( $this->produktRepository->findAll()->getFirst() ) и посмотрите, работает ли там свойство originalResource

Ответ №2:

Это originalResource частично вычисляемое свойство, при вызове метода получения объект будет извлечен автоматически — вот как это реализовано в FileReference модели Extbase.

 /**
 * @return TYPO3CMSCoreResourceFileReference
 */
public function getOriginalResource()
{
    if ($this->originalResource === null) {
        $this->originalResource = TYPO3CMSCoreResourceResourceFactory::getInstance()->getFileReferenceObject($this->getUid());
    }

    return $this->originalResource;
}
  

Однако, пожалуйста, убедитесь, что вы правильно указали конфигурацию представления JSON. Все свойства, связанные с элементом управления, являются префиксами с подчеркиванием _ — в приведенных выше примерах кода оно должно быть _only вместо only . Допустимыми именами элементов управления являются _only , _exclude , _descend , _descendAll , _exposeObjectIdentifier , _exposedObjectIdentifierKey , _exposeClassName .

Более подробную информацию можно найти в документации по потоку, которая по-прежнему актуальна для JsonView CMS in TYPO3.

Ответ №3:

Попробуйте использовать TYPO3CMSExtbasePersistenceObjectStorage<TYPO3CMSExtbaseDomainModelFileReference> вместо TYPO3CMSExtbaseDomainModelFileReference для ваших свойств FAL в вашей модели. Мне не нужно больше одного файла, но после того, как я изменил это, я получаю publicUrl.