块服务有没有办法获取调用它的页面ID?

问题描述 投票:2回答:2

在我的Symfony 3.3应用程序中,我使用SonataBlockBundle构建了一个块服务。现在我想从块所在的页面中提取其他一些字段值。换句话说,我想做这样的事情:

public function configureSettings(OptionsResolver $resolver)
{
    $pageRepository = $this->doctrine->getRepository('ApplicationSonataPageBundle:Page');

    $pageId = someMagicalMethodCall();

    $page = $repository->findOneBy(['id' => $pageId]);
    $images = $page->getImageUrls;
    $resolver->setDefaults(array(
        'content' => 'Some custom content',
        'images' => $images,
        'template' => 'AppBundle:Block:block_media.html.twig',
    ));
}

这可能吗?如果是这样的话,我会在上面的街区代替someMagicalMethodCall

php symfony doctrine sonata symfony-3.3
2个回答
1
投票

这是可能的,但你需要在你的块中注入额外的服务 - CmsManagerSelector。然后在你的configureSettings中你需要检索正确的经理并从中获取当前的页面实例。例如在你的代码中:

public function configureSettings(OptionsResolver $resolver)
{
    $cmsManager = $this->cmsManagerSelector->retrieve();
    // $page will be the Page object already, no need to call doctrine repository. Reference: https://github.com/sonata-project/SonataPageBundle/blob/3.x/src/CmsManager/BaseCmsPageManager.php#L38
    $page = $cmsManager->getCurrentPage();

    $images = $page->getImageUrls;
    $resolver->setDefaults(array(
        'content' => 'Some custom content',
        'images' => $images,
        'template' => 'AppBundle:Block:block_media.html.twig',
    ));
}

0
投票

感谢Jakub Krawczyk和导师,我找到了这个页面:

Getting instance of container in custom sonata block

...这导致我从execute()方法中获取另一种获取与块相关的页面的方法。所以我现在有以下代码,这对我很有帮助:

public function execute(BlockContextInterface $blockContext, Response $response = null)
{
    $page = $blockContext->getBlock()->getPage();
    $localImages = $page->getImages();
    $imageProvider = $this->provider;
    foreach ($localImages as $key => $image) {
        $publicImages[$key]['url'] = $imageProvider->generatePublicUrl($image, 'reference');
        $publicImages[$key]['name'] = $image->getName();
    }
    $settings = $blockContext->getSettings();
    $settings['images'] = $publicImages;
    return $this->renderResponse($blockContext->getTemplate(), array(
        'block' => $blockContext->getBlock(),
        'settings' => $settings,
    ), $response);
}

再次感谢所有参与者。

© www.soinside.com 2019 - 2024. All rights reserved.