#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
для aProdukt
(возможно, для этой цели отключен 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.