修复 TYPO3 11 中的“createQuery() on null”?

问题描述 投票:0回答:1

感谢这个答案我有一个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 上实现这个功能呢?

php typo3 typo3-11.x
1个回答
0
投票

尝试以下操作;

    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();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.