【问题标题】:How do I render (get HTML of) a form object in Agile Toolkit?如何在 Agile Toolkit 中呈现(获取 HTML)表单对象?
【发布时间】:2017-04-08 22:30:08
【问题描述】:

我正在使用 PHP 框架 Agile Toolkit 版本 4.3.2(目前最新)。我在一个扩展默认 Page 类的页面上。

假设我有一个像这样的表单对象:

$form = $this->add('Form');
$form->addField('text', 'name', 'Name');
$form->addSubmit('Save');

如何获取表单对象的 HTML?我想将表单的 HTML 发送到另一个模板部分,例如:

$this->template->trySetHTML('Content', $form);

如果我使用 HTML 代码而不是 $form 对象,上面的函数可以工作。

但在这种情况下,当我刷新页面时,HTML 会出现一个字符串而不是表单,例如:Object Form(22f8a7bc__ancedsearch_form)

我试过:$form->render()$form->getHTML() 但这些功能不起作用。

那么请告诉我,如何在敏捷工具包中渲染对象?如何获取对象的 HTML 代码。

编辑

我正在扩展网格布局。对于每一列,我添加了一个搜索过滤选项。我扩展了 Grid_Advanced.php 以便能够对其进行自定义。在每一列的表头(列名)下方,我插入了一个带有输入的表单(我正在发送列名字段):

$header_col->trySetHTML('advance_search_filter', $form_html);

$form_html 是从扩展 atk4/lib/Filter.php 的文件返回的(类似于 quicksearch)。快速搜索会自动将 html 添加到网格中,但在我的情况下,我需要将它添加到表的头部,在列名之后。这就是我试图获取表单的 HTML 的原因。

在这个文件中,我的 init 函数看起来像:

public function init()
{
        parent::init();
        $this->addClass('grid-extended-search atk-box ui-widget ui-widget-content');
        $this->default_controller = 'Controller_..._MVCForm';
        $this->template->trySet('fieldset', 'atk-row');

        $this->bs = $this->addSubmit('Search');

        $this->save = $this->bs;
}

但这并没有返回任何内容,所以我创建了一个函数来返回模板的 HTML。但是表单是空的,所以我重新创建了字段(这很糟糕):

    $m = $this->view->model
    foreach($this->fields as $f) {
            $field = $this->view->columns[$f];

            if($m->hasField($f)) {
                if($field['type'] == 'text') {
                    $field_html = $this->addField('line', $f, $field['descr']);
                    $form_html .= $field_html->getInput();
                }
                $this->template->setHTML('Content', $form_html);
            }
        }

有什么想法吗?为什么表格是空的?我使用 addField 将字段添加到现有字段,但字段可能存在。我不知道如何获取它们,以获取现有表单的 HTML。

【问题讨论】:

    标签: php atk4 agiletoolkit


    【解决方案1】:

    对于大多数视图:

    $html = $view->getHTML();
    

    但是对于表单来说可能会更棘手。

    在您描述的解决方案中(编辑后),您似乎并不真正需要表单的所有功能

    获取单个字段的 HTML:

    $field->getInput();
    

    这将为您提供可以放置在列标题中的“输入”元素。您还可以使用“Form_Plain”将您的 GRID 包装在 <form> 标记中。

    不过,您需要手动处理提交。

    【讨论】:

    • $form->getHTML();返回这些空的 html 标签:
    • 我编辑了我的原始问题,请参阅“编辑”下方的详细信息。
    • 查看您的代码 - 为什么不简单地在您的网格标题中添加“字段”? Field 有一个方法“getInput()”,你可以用它把它插入到列的标题中。您可以在 Form_Plain 中手动包装 Grid 并使用 GET 等方式提交。
    • 我找到了您也建议的解决方案并且它有效。我添加了一个字段,并且能够使用 getInput 方法获取 HTML。我会将赏金奖励给你,你的解决方案对我有用,我希望它将来也能帮助其他人。附言- 来自agiletoolkit.org/contact 页面的联系表格不起作用(有一个 SMTP 错误 - “应用程序错误:SMTP 错误:无法验证”):)
    • @Pascut,谢谢。我目前正在努力改进敏捷框架并将其变成下一代 UI 工具包。也许您想提供一些建议。如果有兴趣,请在 gitter 中打个招呼。感谢赏金,我会更新我的答案。
    猜你喜欢
    • 2018-06-13
    • 2020-07-02
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2018-08-31
    • 2015-10-08
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多