php - 什么在 SilverStripe 表单中生成 .holder-required 类

标签 php forms validation silverstripe

我正在 SilverStripe 中构建联系表单。

在测试验证时,如果我将必填字段留空并点击提交,这些输入字段将添加一个 .holder-required 类。即使我重新加载页面,它们也不会消失。 (实际上,错误消息 *** is required 也会在重新加载后保留在那里。我只是停止显示消息)。

我搜索了整个项目文件夹,但没有一个文件包含 holder-required

.holder-required 类从何而来?

最佳答案

你找不到holder-required的原因是因为它在技术上不存在于SilverStripe代码库中,它实际上是一个由两个字符串连接在一起的类。

FormField 中,有一个名为 "extraClass" which adds these classes to the field 的函数.

下面是 FormField 类的代码片段:

public function extraClass() {
    $classes = array();

    $classes[] = $this->Type();

    if($this->extraClasses) {
        $classes = array_merge(
            $classes,
            array_values($this->extraClasses)
        );
    }

    if(!$this->Title()) {
        $classes[] = 'nolabel';
    }

    // Allow custom styling of any element in the container based on validation errors,
    // e.g. red borders on input tags.
    //
    // CSS class needs to be different from the one rendered through {@link FieldHolder()}.
    if($this->Message()) {
        $classes[] .= 'holder-' . $this->MessageType();
    }

    return implode(' ', $classes);
}

这告诉我们,对于出现在字段中的消息,它将附加 holder-{Whatever_Your_Message_Type_Is} 作为一个额外的类。


$this->Message() 在页面重新加载后仍会设置的原因是错误信息实际上已保存到该表单的 session 中。

下面是a snippet from the Form class这就是调用 FormField::setError() 的函数,该函数在表单字段上设置消息属性。

public function setupFormErrors() {
    $errorInfo = Session::get("FormInfo.{$this->FormName()}");

    if(isset($errorInfo['errors']) && is_array($errorInfo['errors'])) {
        foreach($errorInfo['errors'] as $error) {
            $field = $this->fields->dataFieldByName($error['fieldName']);

            if(!$field) {
                $errorInfo['message'] = $error['message'];
                $errorInfo['type'] = $error['messageType'];
            } else {
                $field->setError($error['message'], $error['messageType']);
            }
        }

        // load data in from previous submission upon error
        if(isset($errorInfo['data'])) $this->loadDataFrom($errorInfo['data']);
    }

    if(isset($errorInfo['message']) && isset($errorInfo['type'])) {
        $this->setMessage($errorInfo['message'], $errorInfo['type']);
    }

    return $this;
}

我浏览了更多 Form code ,它应该在呈现表单后清除错误。表单类有两个函数部分,clearMessageresetValidation .

函数clearMessage在通过forTemplate渲染表单模板时被调用。在整个 SilverStripe CMS 或框架代码库中,我没有看到 resetValidation 函数的任何用法。

如果在您的情况下消息未清除,您可能需要在代码中调用其中一个或另一个。

关于php - 什么在 SilverStripe 表单中生成 .holder-required 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574997/

相关文章:

forms - 带有条件/分支问题的 jQuery Mobile 站点示例

asp.net - 验证 ASP.NET 中的查询字符串

javascript - 如何比较javascript中的唯一时间?

javascript - 如果选择单选按钮,则需要填写多个文本字段以验证表单

php - 将特定字符转换为法语字母

php - 如何将 PHP 常量插入到 SQL 查询中?

html - Perl - 将用户输入的 cgi 表单数据传递给 perl 程序,然后将其放入 mysql 数据库

php - .css 和 .js 在被 HTML 调用时返回错误 500,但在新选项卡中打开时不会

php - 在 HTML/PHP 中显示/隐藏 div

html - 如何在没有 JS 或 JQUERY 的情况下创建具有摇晃效果的登录表单?