Zend Framework中的小部件 - 它们应该去哪里?

时间:2009-10-04 07:55:17

标签: zend-framework wordpress widget

我一直在使用Zend Framework(使用Doctrine作为ORM)已经有一段时间了,并用它完成了一些项目。

在一些即将开展的项目中,我需要使用类似于Wordpress如何操作的小部件。你有一个帖子/页面,看起来像:

Subscribe to my newsletter:
[subscribe/]

View my events
[events limit=5 sort=date/]

View this page's comments
[comments/]

在哪里说订阅小部件将被Blog :: subscribeWidget替换,并且事件可以用Events :: eventsWidget等替换。

现在它已经在过去几周里完成了我的头脑,我到底该怎么办?我想出了以下几个选项:

  1. 我可以将小部件放在控制器中,然后像操作一样调用它们。这里的问题是代码可能在控制器之间飞行,而且我已经读过,由于发送的数量很多,所以代价很高。

  2. 我可以将小部件放置为视图助手。因此,在视图中,我可以使用$ this-> renderPage($ Page),然后可以访问所有小部件。这里的问题是,如果小部件需要做一些业务逻辑,比如发布一个新的评论,那真的不应该在视图中吗?

  3. 另一种选择是在模型中放置小部件吗?但那么他们究竟如何渲染内容以供展示呢?

  4. 在以下情况下出现额外的并发症:

    1. 说评论小部件也会处理发布,删除评论等。

    2. 说明事件列表,如果我想对下一页事件做一个ajax请求,使用方法#2(查看助手)这将如何工作?

2 个答案:

答案 0 :(得分:5)

如果我理解你的正确,你的小部件将需要他们自己的动作控制器,这是他们提取数据的逻辑,解析表单提交等应该去。在这种情况下,窗口小部件和页面之间的区别在于它是如何呈现的,即作为HTML片段而不是整个页面;您可以使用Action View Helper来实现此目的。

如果您的窗口小部件包含表单,则应该使用AJAX将表单数据提交回服务器,这样使用窗口小部件不会导致用户意外离开页面。您可以使用小部件视图和/或操作中的Head Script Helper将所需的JavaScript注入您已包含小部件的页面。

答案 1 :(得分:0)

我离开了理查兹的回复,问题和进一步的使用案例在我的大脑中煮了一段时间,最终找到了解决方案。

我将有以下视图帮助器和方法:

Content; with methods: render, renderWidgets, renderWidget, renderCommentsWidget (comments).
Event; with methods: renderEventsWidget (many events), renderEventWidget (one event)
Subscription; with methods: renderSubscribeWidget (subscription form).

我将在我的配置文件中:

app.widgets.comments.helper = content
app.widgets.subscribe.helper = subscription
app.widgets.events.helper = event

我还将拥有以下模型:

Content for use for all pages.
Event for use for all events.
Subcriber for use for subscriptions to content

所以在我看来我会做这样的事情: echo $this->content()->render($this->Content)

然后,

Content :: render()将执行任何内容呈现,然后通过传递给Content :: renderWidgets()来执行小部件的呈现。在这里,我们将使用app.widgets的配置将widget bbcode标记链接到它的相应视图助手(使用命名约定'render'.ucfirst($ tag)。'Widget')。因此,例如,Content :: renderCommentsWidget()将继续呈现注释。

也许稍后我将决定拥有一个Widget View Helper,以及每个小部件的单独视图助手,例如。 ContentCommentsWidget查看助手。但是现在这只会增加额外的不必要的复杂性。

现在回答我提到的AJAX问题。对评论小部件说,允许通过ajax发布评论。它只是在Content Controller中有一个适当的方法。所以我们也有一个事件和订阅控制器 - 与视图助手相对应。视图助手和控制器之间的交互都将被硬编码,没有任何目的可以进行软编码。

我希望这可以帮助其他人,目前的计划是将所有这些都用作开源项目的项目。所以也许有一天你可以看到一切都在行动。

感谢。


<强>更新

您可以在以下存储库中找到这些想法的源代码:

  • BalCMS - 这是包含/ application / modules / balcms / view / helpers中小部件的实际CMS,包含/application/modules/config/application/balcms.yaml中的配置
  • BalPHP - 这是包含/lib/Bal/View/Helper/Widget.php
  • 中的小部件视图助手的资源库