gpt4 book ai didi

php - 我如何检测表单是否有任何要呈现的元素?

转载 作者:可可西里 更新时间:2023-11-01 01:16:06 25 4
gpt4 key购买 nike

假设我正在使用 Symfony Form Component呈现一个只有两个字段(用户名和电子邮件)的简单表单

我正在用 form_row() 渲染这两个字段添加自定义 css,然后调用 form_widget()渲染其余元素(另一个选项是 form_rest() )我正在寻找的是一种预先检查是否 form_widget() 的方法将打印或不打印任何对象,以便在有额外字段的情况下添加自定义 html。我的做法是这样的:

//app/form/index.html.twig
{# Other template code #}
...
{# Rendering form: #}
{{ form_start(form) }}

{{ form_row(form.username) }}
{{ form_row(form.email) }}

{% set form_rendered = form_widget(form) %}
{% if form_rendered %}
<h3>Other fields</h3>
{{ form_rendered | raw }}
{% endif %}

{{ form_end(form) }}
{# End form #}
...
{# Other template code #}

然而,我对此并不满意。有没有更好的办法?

编辑:当使用 CSRF 保护(默认激活)时,之前的代码将始终打印 <h3>Other fields</h3> ,因为表单有一个额外的隐藏字段用于我们没有打印的 token 。我们需要用 {{ form_row(form._token) }} 在某处渲染它.

最佳答案

通过检查 src/Symfony/Component/Form/FormView.php 中的代码,我发现了一个完全符合我要求的函数。

//src/Symfony/Component/Form/FormView.php

/**
* Returns whether the view was already rendered.
*
* @return bool Whether this view's widget is rendered
*/
public function isRendered()
{
$hasChildren = 0 < count($this->children);

if (true === $this->rendered || !$hasChildren) {
return $this->rendered;
}

if ($hasChildren) {
foreach ($this->children as $child) {
if (!$child->isRendered()) {
return false;
}
}

return $this->rendered = true;
}

return false;
}

现在可以在模板中使用该函数了:

{% if not form.isRendered() %}
<h3>Other fields</h3>
{{ form_widget(form) }}
{% endif %}

关于php - 我如何检测表单是否有任何要呈现的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38639680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com