Symfony自定义表单类型与资源。

3

我已经在Symfony2中创建了一个自定义表单类型,这个表单类型有自己的模板,现在工作得很好。

该表单类型还需要一些客户端javascript代码以实现良好的交互体验。我希望使用与渲染widget相同的模板将此JavaScript添加到页面中,手动完成这个过程会有些繁琐。虽然可以在每个页面上手动添加JavaScript,但最好能够自动完成。

由于jquery仅在body底部加载,因此无法将javascript直接添加在元素之前或之后。

我尝试使用“主模板”中定义的块(它被命名为block_javascript),以便将自定义JavaScript添加到页面的页脚,但是似乎表单的呈现方式略有不同,该块无法使用。

我使用Assetic准备和返回资源。

是否有一种方法可以在呈现表单widget时使用主模板中的块?


我真的真的不这么认为,但是看一下这个bundle https://github.com/genemu/GenemuFormBundle,它提供了一个额外的`form_javascripts`函数,你可以用它来渲染表单的js。 - user2268997
这个函数很有趣,但我认为它与我正在使用的Assetic不兼容(但在问题中没有提到,现在已更新问题)。我感觉要让它以一种好的方式工作需要大量的额外代码。手动在页面上添加js+css似乎更简单,并且留下更多的空间来处理那些需要稍微不同的异常情况。 - DoppyNL
1个回答

0

我还没有考虑所有的后果或者它是否可行,但是这里有一个可以解决你的问题的想法:使用事件分发器。

  • 一个用于添加资源的事件
  • 一个持有要使用并订阅上述事件的资产列表的服务
  • 一个Twig扩展,使用上述服务使得模板中的资源可访问
  • 在你的表单类型的buildView()函数中使用正确的参数触发事件
  • 在你的布局模板中使用Twig扩展

理论上应该可以工作。


这确实可以行得通,不仅在理论上,而且在现实中也是如此。虽然我不太喜欢将信息存储在服务中,但我可以缩小服务的范围,但它仍然很混乱。它也与 assetic 不兼容(或者我漏掉了什么)。我忘记在原问题中提到 assetic 了,现在已经更新了。 - DoppyNL
如果服务注册了一个命名为AssetReference(例如“dynamic_assets”)到AssetCollection,则应该使用Assetic进行工作。然后,您应该在模板中使用'@dynamic_assets'来引用它。 - Yassine Guedidi
玩了一段时间后,我决定不使用这个解决方案,而是采用手动方法。如果一个表单需要javascript,你需要通过站点范围的javascript或单页javascript手动将其包含在页面中。这是因为灵活性和防止自动添加javascript引起的问题。总有那么一个例外。但是,如果你真的想自动添加javascript,这似乎是可行的方式。尽管你仍然会在你的服务中留下数据。 - DoppyNL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接