【问题标题】:SilverStripe: Rendering a userforms page type in a template loopSilverStripe:在模板循环中呈现用户表单页面类型
【发布时间】:2015-08-04 22:26:30
【问题描述】:

使用 SilverStripe 3.1 我已经布置了一个 FrontPage 页面类型,该页面类型循环通过其子项以生成一个大而高的滚动页面。它有各种不同的页面类型,我通过添加到 Page 类来动态创建它们的控制器来访问它们的模板:

class Page extends SiteTree {

    .....

    function RenderAsChild($templateName = null) {
        if(!$templateName) $templateName = $this->ClassName;
        if(!$this->pageController){
            $class = $this->ClassName . "_Controller";
            $this->pageController = new $class($this);
        }
        return $this->pageController->renderForHolderPage($templateName);
    }

在控制器中:

class Page_Controller extends ContentController {

....

    function renderForHolderPage($templateName = null) {
        if(!$templateName) $templateName = $this->ClassName;
        return $this->renderWith(array($templateName));
    }

通过这种方式,我可以轻松地呈现页面并管理它们的模板和特殊功能,同时在模板中仍然以相同的方式处理它们,例如:

    <% loop $Children %>
        <% if $ClassName = 'FancyPage' %>
            $RenderAsChild
......

问题是我想以这种方式使用用户表单扩展,但在循环或控件中的模板中,它只显示为页面。它似乎对表单或 UserDefinedForm 对象一无所知。

有没有办法让用户表单在模板中呈现为子级?

【问题讨论】:

标签: php forms templates silverstripe


【解决方案1】:

做了一个快速而肮脏的测试,它似乎只有在你有的时候才能工作

$Form 

在主题文件中

它不会替换 $UserDefinedForm,因为它没有使用 index() 调用渲染,据我所知,该 index() 具有替换 $UserDefinedForm 位所需的脚本。

【讨论】:

  • 实际上我所做的是创建了一个名为 BasicPage.ss 的单独页面模板,并使用上面的方法强制 Page 类呈现到该模板。那行得通,但并不是所有的 javascript 部分都包含在内,这告诉我我仍然做错了。
  • 您现在可以手动将这些 js 包含添加到您的主模板 github.com/silverstripe/silverstripe-userforms/blob/master/code/…
  • 为什么缺少 javascripts:我们只是缺少了模板上 SS 呈现数据的必要位置或更合理的东西:因为控制器渲染是我在没有正确逻辑顺序的情况下调用的: init / index 它不会做所有必要的位
  • 我很确定这一切都是正确的。子类和重写 init() 函数与 is_a('UserDefinedForm') 之类的测试以及包含上面链接的 js FinBoWa 的组合可以工作。不过,我还没有完全测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2019-11-13
  • 1970-01-01
  • 2018-07-14
  • 2013-09-27
相关资源
最近更新 更多