TYPO3 Extbase: Как отобразить дерево страниц из моей модели?

Я хочу создать какую-то карту сайта в 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()?

Должен ли я создавать какой-то запрос внутри моей модели? Или мне нужно решить это с помощью существующих функций (например, хранилища объектов) и как?

Я пробовал много вещей, но могу просто понять, как это должно работать.


person Arek van Schaijk    schedule 24.10.2012    source источник


Ответы (2)


вам нужно перезаписать метод репозитория 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, например

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;
}

я не тестировал этот метод, но он выглядит так, чтобы получить все подстраницы.

person freshp    schedule 12.01.2013

интересно, что я не смог найти метод typo3, который возвращает полное дерево страниц :( Поэтому я пишу небольшую функцию (вы можете использовать в расширении extbase), конечно, не лучший или быстрый способ, но легко расширяемый или настроить ;)

сначала вам нужен экземпляр PageRepository

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

this->t3pageRepository->init();

сделайте инициализацию, чтобы установить некоторые базовые настройки, например "ГДЕ удалить = 0 И скрыть = 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;
}
person trayan.dev    schedule 30.09.2014