gpt4 book ai didi

bundle - 在 Symfony 2 之上构建一个小部件管理器(一页中多个 Controller )

转载 作者:行者123 更新时间:2023-12-02 11:57:22 25 4
gpt4 key购买 nike

用例
我正在 Symfony2 之上开发 CMF。其中一个功能是支持“小部件”:最终用户可以向页面添加小“ block ”或“模块”。示例:

  • 一个小的登录表单
  • 产品列表
  • 一些照片来自画廊
  • 购物车

这个想法是,大多数小部件将链接到正常的完整页面路由/ Controller 。

例如:用户希望在内容页面的侧边栏中列出热门产品。这些项目将链接到 ProductController 的正常/product/{name} 路由。但本例中的列表将是一个小部件。最终用户可以定义它必须放置的位置,例如必须显示多少项目。

“小部件”的行为与常规 Symfony2 Controller 相同,它具有路由、操作、渲染 View 等。有一个 WidgetManager,它有一个包罗万象的路径来加载小部件,配置它们并将它们呈现在正确的位置。

我对 Symfony2 没有太多经验,但我现在已经玩了 3 个多月了。我绝对想继续使用 Symfony2,但需要添加一些魔力来实现我的一些想法。

问题
支持在一个请求中渲染多个 Controller (小部件)的最佳方式是什么?

研究
Symfony 的 TwigExtension“ActionExtension”包含一个“render”方法,其中包含基本思想:

<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>

(文档:http://symfony.com/doc/current/book/templating.html#embedding-controllers)

但它是相当有限的。这种方法的一些问题:

  • 我无法在渲染“小部件”之前对其进行配置(例如: $myWidget->set('show_toolbar', false) ),我不想将所有选项作为 Controller 操作参数传递。
  • 无法使用模板继承。例如,我需要这个来在 de base <HEAD> 中“注入(inject)” Assets 引用(javascript/css)阻止。

我想要什么

我希望以下代码能够工作(这是一个简化的示例):

// Serius\PageBundle\Controller\PageController.php

// executed by a catch-all route
public function indexAction($url) {
// load CMS page, etc

$widgets = $this->loadWidgets($page); // widgets configuration is stored in database
// at this point, $widgets is an array of Controller *instances*
// meaning, they are already constructed and configured

return $this->render("SeriusPageBundle:Page:content.html.twig", array(
'widgets' => $widgets
));
}

Serius\PageBundle\Resources\views\Page\content.html.twig

{% extends 'SeriusPageBundle::layout.html.twig' %}

{% block content %}
{% for widget in widgets %}
<div>
{% render widget %}
<!-- Of course, this doesn't work, I would have to create my own Twig extension -->
</div>
{% endfor %}
{% endblock %}

小部件模板的示例:

{% extends '::base.html.twig' %}
{% block stylesheets %}
My stylesheets
{% endblock %}

{% block body %}
This is a shoppingcart widget!
{% endblock %}

我怎样才能实现这个目标?有人有这样的经验吗?我已经研究过 Symfony CMF 项目,但它对此不支持(据我所知)。

最佳答案

我有类似的事情,我认为这段代码会对你有所帮助。在所选模板中,您将获得带有 block 名称的变量。

public function render()
{
$modules = $this->moduleService->getModules();

foreach($modules as $m){
$templateName = $m->getTemplateName();

$template = $this->twig->loadTemplate($templateName);
$blockNames = $template->getBlockNames();

foreach($blockNames as $b){
if(isset($this->blocks[$b]) == false)
$this->blocks[$b] = '';
$this->blocks[$b] .= $template->renderBlock($b, array('a' => 'aaa', 'b' => 'bbb'));
}

}
$content = $this->twig->render('Admin/index.html.twig',$this->blocks);
return new \Symfony\Component\HttpFoundation\Response($content);
}

关于bundle - 在 Symfony 2 之上构建一个小部件管理器(一页中多个 Controller ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12061555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com