我一直在使用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等替换。
现在它已经在过去几周里完成了我的头脑,我到底该怎么办?我想出了以下几个选项:
我可以将小部件放在控制器中,然后像操作一样调用它们。这里的问题是代码可能在控制器之间飞行,而且我已经读过,由于发送的数量很多,所以代价很高。
我可以将小部件放置为视图助手。因此,在视图中,我可以使用$ this-> renderPage($ Page),然后可以访问所有小部件。这里的问题是,如果小部件需要做一些业务逻辑,比如发布一个新的评论,那真的不应该在视图中吗?
另一种选择是在模型中放置小部件吗?但那么他们究竟如何渲染内容以供展示呢?
在以下情况下出现额外的并发症:
说评论小部件也会处理发布,删除评论等。
说明事件列表,如果我想对下一页事件做一个ajax请求,使用方法#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中有一个适当的方法。所以我们也有一个事件和订阅控制器 - 与视图助手相对应。视图助手和控制器之间的交互都将被硬编码,没有任何目的可以进行软编码。
我希望这可以帮助其他人,目前的计划是将所有这些都用作开源项目的项目。所以也许有一天你可以看到一切都在行动。
感谢。
<强>更新强>
您可以在以下存储库中找到这些想法的源代码: