将页面变量获取到Sonata树枝模板

时间:2019-09-13 08:30:26

标签: php symfony sonata

使用奏鸣曲模板时,PageBundle中的各个页面用于扩展page.site.layout模板,然后可以使用细枝标准块系统将其放置在您喜欢的位置。但是,我发现页面变量在我的页面上未定义,并且试图了解页面变量如何到达它们。

在多个模板中放置了var_dump'ed页面变量,但无法找到它在哪里,我尝试使用Google谷歌搜索,但没有发现任何有趣的东西。

{% extends page.site.layout %}

我希望默认情况下每个奏鸣曲页面中的页面变量对我来说都是可用的,我不确定是否需要从奏鸣曲中传递页面,我以为它是由奏鸣曲处理的?

1 个答案:

答案 0 :(得分:0)

希望这会有所帮助,我是这样做的。

页面帮助服务

namespace App\Service;

use Sonata\PageBundle\CmsManager\CmsManagerSelectorInterface;
use Sonata\PageBundle\Model\PageInterface;
use Sonata\PageBundle\Page\TemplateManagerInterface;

class PageHelper
{
    private $cmsSelector;
    private $templateManager;

    public function __construct(
        CmsManagerSelectorInterface $cmsSelector,
        TemplateManagerInterface $templateManager
    ) {
        $this->cmsSelector = $cmsSelector;
        $this->templateManager = $templateManager;
    }

    public function getCurrentPage(): ?PageInterface
    {
        $page = $this->cmsSelector->retrieve()->getCurrentPage();
        if ($page instanceof \Sonata\PageBundle\Model\SnapshotPageProxy) {
            $page = $page->getPage();
        }

        return $page;
    }

    public function getTemplatePath(PageInterface $page): ?string
    {
        $template = $this->templateManager->get($page->getTemplateCode());
        if (null !== $template) {
            return $template->getPath();
        }

        return null;
    }
}

Twig 扩展程序,用于获取(页面的)当前页面或模板:

namespace App\Service;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;

class TwigPageExtension extends AbstractExtension
{
    private $pageHelper;

    public function __construct(PageHelper $pageHelper)
    {
        $this->pageHelper = $pageHelper;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('current_page', function () {
                return $this->pageHelper->getCurrentPage();
            }),
            new TwigFunction('current_page_template_path', function () {
                return $this->pageHelper->getTemplatePath($this->pageHelper->getCurrentPage());
            }),
        ];
    }
}