【问题标题】:TYPO3 Extbase: Access to external data sources (Typo3 "pages" table)TYPO3 Extbase:访问外部数据源(Typo3“页面”表)
【发布时间】:2013-06-17 05:22:26
【问题描述】:

我实际上正在为我的页面树和内容元素的 xml 导出编写扩展。 通过以下示例,我在我的 Page 模型上映射了typo3“pages”表:

# typo3conf/ext/my_publisher/Configuration/TypoScript/setup.txt
# Module configuration
module.tx_mypublisher.persistence.classes {
  Tx_MyPublisher_Domain_Model_Page {
    mapping {
      tableName = pages
      recordType = Tx_MyPublisher_Domain_Model_Page
      columns {
        uid.mapOnProperty =         uid
        pid.mapOnProperty =         pid
        sorting.mapOnProperty =     sorting
        deleted.mapOnProperty =     deleted
        title.mapOnProperty =       title
        is_siteroot.mapOnProperty = is_siteroot
      }
    }
  }
}

现在我想检索控制器中的页面...

$pages = $this->pageRepository->findAll();

这个函数为我提供了我的模型表的结果,到目前为止它是空的。 所以我认为我的存储库中需要一些“初始化”方法来填充我的模型表, 但直到现在我还没有办法解决这个问题。

有没有人解决这个问题的方法?

我使用 Typo3 6.1.1。

对不起,我知道这不是最好的英语

【问题讨论】:

    标签: php typo3 extbase typo3-6.1.x


    【解决方案1】:

    首先:从您的映射中删除 recordType = Tx_MyPublisher_Domain_Model_Page,这会导致您的存储库仅包含作为您的页面创建的记录,并且我假设您想要获取 any em> 页。从字面上看,它包括您的语句的条件,例如(取决于 TCA 设置AND record_type = 'Tx_MyPublisher_Domain_Model_Page'...

    第二:确保在所有查询中storagePidIGNORED,如果您通过 TypoScript 强制使用一些storagePid,您将只获得给定页面的子页面。 . 最简单的方法是在整个仓库中避免storagePid,将此方法添加到您的PageRepository

    public function initializeObject() {
        $this->defaultQuerySettings = $this->objectManager->create('Tx_Extbase_Persistence_Typo3QuerySettings');
        $this->defaultQuerySettings->setRespectStoragePage(FALSE);
    }
    

    第三:使用this tip 来检查pages 表的查询,这不太方便,但这是找出你的repo 没有获得所需数据的最快方法(只需复制声明并将其粘贴到您最喜欢的 DB GUI)。

    最好将其粘贴到您的问题中,以便我们查看问题所在

    如果调试语句中有AND pages.pid = ?之类的问号,当然需要将它们替换为所需的值AND pages.pid = 123

    【讨论】:

      【解决方案2】:

      我认为您需要设置一个 storagePid,因为您的 findAll-query 依赖于此。

      # TS
      plugin.tx_yourext {
          persistence {
              storagePid = {$plugin.tx_yourext.persistence.storagePid}
          }
      }
      
      # Or in query
      $query->getQuerySettings()->setStoragePageIds(array($yourId);
      

      在您的情况下,它可能是 0 或您想要开始导出的任何页面。但这只会为您提供以 storagePid 作为其 uid 的页面的子页面。如果要导出整个页面树,则需要一个递归函数。此外,您还必须了解内容元素和页面之间的关系。

      【讨论】:

      • 好的,我在 TS 中将 storagePid 设置为 0,然后设置为 2(这是我的根页面)但是在这两种情况下,都没有发生任何事情。在 TCA 中是否还有其他需要配置的内容?或者我需要在存储库中使用什么函数来从 pages 表中获取数据?
      • 您使用的是后端模块吗? TypoScript 在那里不起作用。在这种情况下,您必须使用配置管理器,或者只需在您的存储库中设置您的存储 pid。
      • 啊,好的,我使用后端模块...但是 tableMapping 在那里工作?
      • 我已经完成了 $frameworkConfiguration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT);但是 TypoScript 看起来不错!我配置的所有东西都可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2013-07-29
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多