Typo3 如何使extbase扩展从插件识别存储页面?

Typo3 如何使extbase扩展从插件识别存储页面?,typo3,extbase,typo3-6.1.x,Typo3,Extbase,Typo3 6.1.x,在TYPO3 6.1.7上使用扩展生成器构建的extbase扩展中,我没有通过Typoscript设置任何storagePid 但我在插件中设置了“记录存储页面”: 我希望它现在只能从这个页面获取记录。 但它没有,它只是返回该表中的所有项 如何让扩展识别插件中的设置? 或者(如果它应该开箱即用)我如何找出它为什么不这样做?将以下代码添加到您的存储库中 namespace <Vendor>\<Extkey>\Domain\Repository; class Exampl

在TYPO3 6.1.7上使用扩展生成器构建的extbase扩展中,我没有通过Typoscript设置任何storagePid

但我在插件中设置了“记录存储页面”:

我希望它现在只能从这个页面获取记录。 但它没有,它只是返回该表中的所有项

如何让扩展识别插件中的设置?
或者(如果它应该开箱即用)我如何找出它为什么不这样做?

将以下代码添加到您的存储库中

namespace <Vendor>\<Extkey>\Domain\Repository;

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

    // Example for repository wide settings
    public function initializeObject() {
        /** @var $defaultQuerySettings \TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings */
        $defaultQuerySettings = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
        // add the pid constraint
        $defaultQuerySettings->setRespectStoragePage(TRUE);
}

    // Example for a function setup changing query settings
    public function findSomething() {
        $query = $this->createQuery();
        // add the pid constraint
        $query->getQuerySettings()->setRespectStoragePage(TRUE);
        // the same functions as shown in initializeObject can be applied.
        return $query->execute();
    }
}
namespace\\Domain\Repository;
类ExampleRepository扩展\TYPO3\CMS\Extbase\Persistence\Repository{
//存储库范围的设置示例
公共函数初始化对象(){
/**@var$defaultQuerySettings\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings*/
$defaultQuerySettings=$this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
//添加pid约束
$defaultQuerySettings->setreservestoragepage(TRUE);
}
//更改查询设置的函数设置示例
公共函数findSomething(){
$query=$this->createQuery();
//添加pid约束
$query->getQuerySettings()->setreservestoragepage(TRUE);
//可以应用initializeObject中所示的相同函数。
返回$query->execute();
}
}
您将在本页找到更多信息

实际上,我修改了MVC控制器,以根据实际页面实现记录过滤(storagePid==page.id)。。看起来是这样的:

use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class MyMVCController extends ActionController {
protected function initializeAction() {
    parent::initializeAction();
    //fallback to current pid if no storagePid is defined
    $configuration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
    if (empty($configuration['persistence']['storagePid'])) {
        $currentPid['persistence']['storagePid'] = GeneralUtility::_GP('id');
        $this->configurationManager->setConfiguration(array_merge($configuration, $currentPid));
    }
[..]
我使用了解决方案并修改了storagePid的值,因为我开发了一个后端模块。 他的典型例子对我不起作用。。 还有一个有趣的话题

但是我仍然没有把所有的联系都记在心里。。想回到symfony xD吗

编辑:对于回购查询的修改,本文看起来也很有趣:

当我的扩展前端插件(TYPO3 7.6.4)拒绝使用插件的“页面”字段(“记录存储页面”)时,我做了大量研究,因此我想分享我的发现:

我的扩展名是“tx_dhsnews”,我的插件名是“infobox”

  • SetPrerectStoragePage必须设置为true(默认值):$query->SetPrerectStoragePage(true)

  • 在打字脚本设置中,插件特定的storagePidplugin.tx\u dhsnews\u infobox.persistence.storagePid必须完全不存在!不是具有空值的事件!否则将不尊重“页面”字段

  • 就这些。Extensions Builder刚刚创建了一个打字脚本设置,将特定插件“infobox”的storagePid设置为nothing。这导致插件不尊重“页面”字段

    将storagePid设置在扩展级别(例如“tx_dhsnews..persistence.storagePid”)没有问题,该值将与“pages”(“记录存储页面”)中给定的值合并,但一旦特定于插件的tx_[extension]\u[plugin].persistence.storagePid存在于键入脚本中,它将否决所有其他内容


    希望这能帮助某人节省一些时间和精力

    谢谢Stefano!我想我的页面树中有一些混乱的设置,重新创建整个页面很有帮助,即使没有设置页面(TRUE)。我想我理解正确了,如果没有,请纠正我:默认情况下应该尊重存储页面;您的代码只是为了强制执行它?是的,正如您在设置类(typo3/sysext/extbase/Classes/Persistence/Generic/Typo3QuerySettings.php)中看到的,这应该是默认设置。不知何故(某些扩展更改了它),您需要为存储库显式地设置它
    protected$reservestoragepage=TRUE是的,删除
    持久性。storagePid
    行真的让我省心了,谢谢:太好了!在类型3 8中仍然有相同的行为。但我发现这有一个很大的缺点。如果不在插件中定义StoragePage,插件将找不到任何内容!因此,没有违约或至少“给我所有”的行为。