0

我想在 extbase/fluid 中创建某种站点地图(基于页面树)。我已将pages表格加载到模型中:

config.tx_extbase.persistence.classes.Tx_MyExt_Domain_Model_Page.mapping.tableName = pages

我已经创建了一个控制器和存储库,但是卡在了可以将子页面作为关系加载到我的模型中的部分上。

例如:

$page = $this->pageRepository->findByPid($rootPid);

返回我的根页面。但是如何扩展我可以使用的$page->getSubpages()模型$page->getNestedPages()

我是否必须在我的模型中创建某种查询?或者我是否必须使用现有功能(如对象存储)来解决这个问题,如何解决?

我尝试了很多东西,但可以简单地弄清楚这应该如何工作。

4

2 回答 2

1

您必须覆盖您的 findByPid 存储库方法并添加

public function findByPid($pid) {
    $querySettings = $this->objectManager->create('Tx_Extbase_Persistence_Typo3QuerySettings');
    $querySettings->setRespectStoragePage(FALSE);
    $this->setDefaultQuerySettings($querySettings);
    $query = $this->createQuery();
    $query->matching($query->equals('pid', $pid));
    $pages = $query->execute();
    return $pages;
}

获取所有页面。比您可以编写自己的 getSubpages-method 之类的

function getSubpages($currentPid) {
    $subpages = $this->pagesRepository->findByPid($currentPid);
    if (count($subpages) > 0) {
        $i = 0;
        foreach($subpages as $subpage) {
            $subpageUid = $subpage->getUid();
            $subpageArray[$i]['page'] = $subpage;
            $subpageArray[$i]['subpages'] = $this->getSubpages($subpageUid);
            $i++;
        }
    } else {
        $subpageArray = Array();
    }
    return $subpageArray;
}

我没有测试这种方法,但它看起来像这样来获取所有子页面。

于 2013-01-12T10:00:08.370 回答
0

我想知道我找不到返回完整页面树的typo3方法:(所以我写了一个小函数(你可以在extbase扩展中使用),肯定不是最好或最快的方法,但易于扩展或定制 ;)

首先你需要一个 PageRepository 的实例

$this->t3pageRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Page\\PageRepository');

this->t3pageRepository->init();

进行初始化,以设置一些基本配置,例如“WHERE deletet = 0 AND hidden = 0 ...”

然后使用此函数,您将获得一个包含页面数据和子页面的数组。我实现了最多三个级别的 yust:

 function getPageTree($pid,$deep=2){
    $fields = '*';
    $sortField = 'sorting';
    $pages = $this->t3pageRepository->getMenu($pid,$fields,$sortField);
    if($deep>=1){
        foreach($pages as &$page) {
            $subPages1 = $this->t3pageRepository->getMenu($page['uid'],$fields,$sortField);
            if(count($subPages1)>0){
                if($deep>=2){
                    foreach($subPages1 as &$subPage1){
                        $subPages2 = $this->t3pageRepository->getMenu($subPage1['uid'],$fields,$sortField);
                        if(count($subPages2>0)){
                            $subPage1['subpages'] = $subPages2;
                        }
                    }
                }
                $page['subpages'] = $subPages1;
            }
        }
    }
    return $pages;
}
于 2014-09-30T07:37:21.640 回答