Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework Zend框架内的小部件-它们应该去哪里?_Zend Framework_Wordpress_Widget - Fatal编程技术网

Zend framework Zend框架内的小部件-它们应该去哪里?

Zend framework Zend框架内的小部件-它们应该去哪里?,zend-framework,wordpress,widget,Zend Framework,Wordpress,Widget,我使用Zend框架(使用条令作为ORM)已经有一段时间了,并用它做了一些项目 在一些即将到来的项目中,我需要类似Wordpress的小部件。您有一个帖子/页面,它可能看起来像: Subscribe to my newsletter: [subscribe/] View my events [events limit=5 sort=date/] View this page's comments [comments/] 比如说订阅小部件将被Blog::subscribeWidget替换,事件

我使用Zend框架(使用条令作为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),这将处理所有小部件。这里的问题是,如果小部件需要执行一些业务逻辑,比如发布一条新的评论,那么这些逻辑实际上不应该在视图中,是吗

  • 另一个选项是在模型中放置小部件?但他们究竟如何呈现内容以供展示呢

  • 在以下情况下会出现额外的并发症:

  • 假设评论小部件还可以处理发布、删除评论等

  • 对于事件列表,如果我想使用方法2(查看帮助程序)对下一页的事件执行ajax请求,这将如何工作


  • 如果我理解正确,您的小部件将需要它们自己的操作控制器,这是它们获取要显示的数据、解析表单提交等的逻辑所在。在这种情况下,小部件和页面之间的区别在于其呈现方式,即作为HTML片段而不是整个页面;您可以使用来实现这一点


    如果您的小部件包含表单,那么它可能应该使用AJAX将表单数据提交回服务器,这样使用小部件不会导致用户意外地离开页面。您可以通过在小部件的视图和/或操作中使用,将所需的JavaScript注入到包含小部件的页面中。

    我让Richards回答,问题和进一步的用例在我的脑海中酝酿了一段时间,最终找到了解决方案

    我将拥有以下视图帮助程序和方法:

    Content; with methods: render, renderWidgets, renderWidget, renderCommentsWidget (comments). Event; with methods: renderEventsWidget (many events), renderEventWidget (one event) Subscription; with methods: renderSubscribeWidget (subscription form). 内容;使用方法:render、renderWidget、renderWidget、renderCommentsWidget(注释)。 事件方法:renderEventsWidget(多个事件)、renderEventWidget(一个事件) 订阅使用方法:renderSubscribeWidget(订阅表单)。 我的配置文件中将包含:

    app.widgets.comments.helper = content app.widgets.subscribe.helper = subscription app.widgets.events.helper = event app.widgets.comments.helper=内容 app.widgets.subscribe.helper=订阅 app.widgets.events.helper=事件 我还将拥有以下型号:

    Content for use for all pages. Event for use for all events. Subcriber for use for subscriptions to content 用于所有页面的内容。 用于所有事件的事件。 用于订阅内容的Subcriber 在我看来,我会这样做:
    echo$this->content()->render($this->content)

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

    也许稍后我会决定为每个小部件提供一个小部件视图帮助程序,以及单独的视图帮助程序,例如ContentCommentsWidget视图帮助程序。但就目前而言,这只会增加额外的不必要的复杂性

    现在来回答我提到的AJAX问题。比如评论小部件,允许通过ajax发布评论。它只需要在内容控制器中为它提供一个合适的方法。因此,我们也有一个事件和订阅控制器,与视图帮助器相对应。视图辅助对象和控制器之间的交互都将是硬编码的,而不是软编码

    我希望这对其他人有所帮助,而目前的计划是让这个项目成为一个开源项目。所以也许有一天你会看到一切都在起作用

    谢谢


    更新:

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

    • -这是实际的CMS,包含/application/modules/balcms/view/helpers中的小部件,并包含/application/modules/config/application/balcms.yaml中的配置
    • -这是资源库,其中包含位于/lib/Bal/view/helper/widget.php的小部件视图帮助程序

    你好,Richard谢谢你的回复,我非常感谢。我让你的回答、问题和进一步的用例在我的脑海中酝酿了一段时间,最终找到了解决方案。现在回过头来看,这几乎就是你提到的。因此,谢谢,我将在接下来的几分钟内发布详细的解决方案作为另一个答案。我很高兴你发现我的答案很有用。也许你会投票支持它,以帮助我提高一点声誉;)可以。。。当我有足够的代表权投票时!