感谢这个答案我有一个viewhelper,它获取与文件引用相关的一组类别,这在TYPO3 10,PHP 7.4中运行良好。
迁移到 TYPO3 11、PHP 8.1 后,现在会抛出错误:
503 Call to a member function createQuery() on null
namespace myvendor\myext\ViewHelpers;
use TYPO3\CMS\Core\Resource\FileReference;
use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
/**
*
* @package TYPO3
* @subpackage myext
* @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 2 or later
* @author Marcus Biesioroff [email protected]>
*
* ViewHelper for listing file's categories
*
* Usage:
* {namespace toolbox=myvendor\myext\ViewHelpers}
* or in ext_tables.php:
* $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['myext'] = ['myvendor\myext\ViewHelpers'];
*
* <cvh:fileCategories file="{file}" />
* or
* {cvh:fileCategories(file: file)}
*/
class FileCategoriesViewHelper extends AbstractViewHelper
{
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository
* @TYPO3\CMS\Extbase\Annotation\Inject
*/
protected $categoryRepository ;
public function initializeArguments()
{
parent::initializeArguments();
$this->registerArgument('file', 'mixed', 'File');
}
public function render()
{
/** @var FileReference $fileRef */
$fileRef = $this->arguments['file'];
$file = $fileRef;//->getOriginalFile();
$uid = $file->getUid();
/** @var QueryResult $res */
$res = $this->getCategories($uid);
return $res->toArray();
}
private function getCategories($uid)
{
$query = $this->categoryRepository->createQuery();
$sql = "SELECT sys_category.* FROM sys_category
INNER JOIN sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid AND sys_category_record_mm.fieldname = 'categories' AND sys_category_record_mm.tablenames = 'sys_file_metadata'
INNER JOIN sys_file_metadata ON sys_category_record_mm.uid_foreign = sys_file_metadata.uid
WHERE sys_file_metadata.file = '" . (int)$uid . "'
AND sys_category.deleted = 0
ORDER BY sys_category_record_mm.sorting_foreign ASC";
return $query->statement($sql)->execute();
}
}
我尝试制作
protected $categoryRepository = '';
但使用字符串而不是 null 会给出相同的错误。那么我怎样才能在 TYPO3 11 上实现这个功能呢?
尝试以下操作;
namespace myvendor\myext\ViewHelpers;
use TYPO3\CMS\Core\Resource\FileReference;
use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
/**
*
* @package TYPO3
* @subpackage myext
* @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 2 or later
* @author Marcus Biesioroff [email protected]>
*
* ViewHelper for listing file's categories
*
* Usage:
* {namespace toolbox=myvendor\myext\ViewHelpers}
* or in ext_tables.php:
* $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['myext'] = ['myvendor\myext\ViewHelpers'];
*
* <cvh:fileCategories file="{file}" />
* or
* {cvh:fileCategories(file: file)}
*/
class FileCategoriesViewHelper extends AbstractViewHelper
{
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository
* @TYPO3\CMS\Extbase\Annotation\Inject
*/
public function __construct(protected readonly UserRepository $categoryRepository)
{}
public function initializeArguments()
{
parent::initializeArguments();
$this->registerArgument('file', 'mixed', 'File');
}
public function render()
{
/** @var FileReference $fileRef */
$fileRef = $this->arguments['file'];
$file = $fileRef;//->getOriginalFile();
$uid = $file->getUid();
/** @var QueryResult $res */
$res = $this->getCategories($uid);
return $res->toArray();
}
private function getCategories($uid)
{
$query = $this->categoryRepository->createQuery();
$sql = "SELECT sys_category.* FROM sys_category
INNER JOIN sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid AND sys_category_record_mm.fieldname = 'categories' AND sys_category_record_mm.tablenames = 'sys_file_metadata'
INNER JOIN sys_file_metadata ON sys_category_record_mm.uid_foreign = sys_file_metadata.uid
WHERE sys_file_metadata.file = '" . (int)$uid . "'
AND sys_category.deleted = 0
ORDER BY sys_category_record_mm.sorting_foreign ASC";
return $query->statement($sql)->execute();
}
}