如何使用extbase获取和过滤所有引用的FAL文件

时间:2014-11-12 11:09:10

标签: php typo3 extbase typo3-6.2.x

我正在处理扩展程序,该扩展程序显示 sys_file_reference 中引用的所有文件。 还可以根据 sys_file_metadata 中的新自定义属性对每个文件进行分类和过滤。

将所有引用文件作为TYPO3\CMS\Core\Resource\File模型获取和过滤的最佳方式是什么?

TYPO3\CMS\Core\Resource\FileRepository的帮助下,我能够获得包含元数据的File模型。 但是存储库期望总是uid来检索File。到目前为止,我使用我的存储库获取所有引用的文件,并将它们传递给findFileReferenceByUid()方法。

class DocumentRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {

    /**
     * Disables pid constraint
     *
     * @return void
     */
    public function initializeObject() {
        $querySettings = $this->objectManager->create('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
        $querySettings->setRespectStoragePage(FALSE);
        $this->setDefaultQuerySettings($querySettings);
    }

    /**
     * Finds all referenced documents returning them as File modules
     *
     * @return void
     */
    public function findAllReferenced() {
        $fileRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Resource\\FileRepository');
        $query = $this->createQuery();
        $documents = $query->execute();
        $references = array();

        foreach ($documents as $document) {
            $references[] = $fileRepository->findFileReferenceByUid($document->getUid());
        }

        return $references;
    }
}

是否有更简单的方法,我该如何实现过滤器?

更新

现在我绕过extbase并直接使用数据库连接。 TYPO3在内部做了很多。

/**
 * Finds all referenced documents returning them as File models
 *
 * @return array
 */
public function findAllReferenced() {

    $rows = $this->getDatabaseConnection()->exec_SELECTgetRows(
        'sys_file AS sf
            LEFT JOIN tt_content AS ttc ON ttc.header_link=CONCAT("file:", sf.uid)
            LEFT JOIN sys_file_reference AS ref ON sf.uid=ref.uid_local
            LEFT JOIN sys_file_metadata AS meta ON sf.uid=meta.file',
        '((ttc.uid IS NOT NULL AND ttc.hidden = 0 AND ttc.deleted = 0) OR (ref.uid IS NOT NULL AND ref.hidden = 0 AND ref.deleted = 0))',
        'sf.uid'
    );

    $documents = array();

    if (!empty($rows)) {
        foreach ($rows as $row) {
            $documents[] = $this->createDomainObject($row);
        }
    }
    return $documents;
}

0 个答案:

没有答案