0

在 Yii 中使用表单构建器时,有什么方法可以更改验证 javascript 中的 inputID?

我的问题是我在一页上有两个相似的表单(使用一个表单构建器代码)。这是登录表单,使用了两次。首先,在模板中(显示在网站的每个页面上)和第二个 - 相同的表单,用于 /site/login 页面(此页面用于在访问限制等情况下重定向用户)。

这两个表单工作正常,但是 yii 为两个表单的元素生成具有相同 inputID 的验证 javascript,我不知道如何更改它。看一看:

<script type="text/javascript">
/*<![CDATA[*/
jQuery(function($) {
jQuery('a[rel="tooltip"]').tooltip();
jQuery('a[rel="popover"]').popover();
$('#loginForm').yiiactiveform({'attributes':[{'id':'LoginForm_email','inputID':'LoginForm_email','errorID':'LoginForm_email_em_','model':'LoginForm','name':'LoginForm[email]','enableAjaxValidation':true,'inputContainer':'div.control-group'},{'id':'LoginForm_password','inputID':'LoginForm_password','errorID':'LoginForm_password_em_','model':'LoginForm','name':'LoginForm[password]','enableAjaxValidation':true,'inputContainer':'div.control-group'},{'id':'LoginForm_rememberMe','inputID':'LoginForm_rememberMe','errorID':'LoginForm_rememberMe_em_','model':'LoginForm','name':'LoginForm[rememberMe]','enableAjaxValidation':true,'inputContainer':'div.control-group'}]});
$('#quickLoginForm').yiiactiveform({'attributes':[{'id':'LoginForm_email','inputID':'LoginForm_email','errorID':'LoginForm_email_em_','model':'LoginForm','name':'LoginForm[email]','enableAjaxValidation':true,'inputContainer':'div.control-group'},{'id':'LoginForm_password','inputID':'LoginForm_password','errorID':'LoginForm_password_em_','model':'LoginForm','name':'LoginForm[password]','enableAjaxValidation':true,'inputContainer':'div.control-group'},{'id':'LoginForm_rememberMe','inputID':'LoginForm_rememberMe','errorID':'LoginForm_rememberMe_em_','model':'LoginForm','name':'LoginForm[rememberMe]','enableAjaxValidation':true,'inputContainer':'div.control-group'}]});
jQuery('#collapse_0').collapse({'parent':false,'toggle':false});
});
/*]]>*/
</script>

这就是问题所在。我不明白,如何将其更改 'id':'LoginForm_email','inputID':'LoginForm_email', 为: 'id':'quickLoginForm_email','inputID':'quickLoginForm_email', 使验证适用于两种形式。我试图更改表单 ID、表单标题、元素 ID、元素名称 (ofc) 但没有结果。是否可以在不更改表单文件名等的情况下动态更改它?我试图阅读 CActiveForm 源代码,但没有找到输入 ID 的位置。

Ofc 可以不在 /site/login 页面上显示布局表单,但这不是我认为的最佳方式。

4

3 回答 3

1

我们遇到了同样的问题,但是进行了广泛的研究,我们发现 Yii 已经支持更改 InputID 以便您的验证工作。

但是文档还没有完成。

要修复它,我们唯一要做的就是在错误字段中设置 InputID 以对应于您在属性字段中设置的 id。像这样:

<?php echo $form->error($model,'attribute',array('inputID'=>'custom-id')); ?>

Yii 1.1.14 发布后,此更改的文档将可用。与此同时,如果你做我们所做的事情,它应该会起作用。

希望这适用于任何有同样问题的人。

参考:

1 强雪描述如何重现问题。https://github.com/yiisoft/yii/issues/158

2 mdomba 文档提交到 github 存储库。这解释了如何修复您的代码:https ://github.com/yiisoft/yii/commit/65b9bd06e885b96cc08922282b79a9c78484a9bd

于 2013-07-15T18:41:21.117 回答
1

因此,在阅读 Yii 资源 3-4 小时后,让我发布我自己问题的答案。我们要在生成的 javascript 中更改的第一件事是错误 inputID。就像 mashingan 写的,如果你没有使用表单生成器,你可以在 $form->error 中设置。如果您使用的是表单生成器,则可以从 CFormInputElement 类的 errorOptions 属性访问错误选项:

    'elements'=>array(
        'email'=>array(
            'id'=>$this->id.'_email',
            'name'=>$this->id.'[email]',
            'type'=>'text',
            'maxlength'=>32,
            'label'=>false,
            'placeholder'=>'Your email address',            
            'errorOptions'=>array('inputID'=>$this->id.'_email','id'=>$this->id.'_email'),
        ),

请注意,默认情况下,您无法访问此数组中的表单 ID 或其他内容。在构建表单对象时,您必须发送您的 $this->id (或任何您想要的名称)。我用构造函数创建了 MyForm 类,扩展了 CForm:

class MyForm extends CForm
{
public $id;
public function __construct($config, $model = null, $parent = null, $id = null) {
    if($id != null) $this->id = $id;
    parent::__construct($config, $model, $parent);
}

然后我在布局中创建我的表单:

$quickLoginForm = new MyForm('application.views.site.loginForm', $model, null, 'QuickLoginForm');

或者

$loginForm = new MyForm('application.views.site.loginForm', $model, null, 'LoginForm');

上面的示例将允许您在 Yii 生成的验证 javascript 中动态更改 inputID 和 errorID。

现在让我们看看 yii 生成的 JS:

'id':'LoginForm_email','inputID':'QuickLoginForm_email','errorID':'QuickLoginForm_email'

我们已经更改了 inputID 和 errorID,接下来我们必须更改以使我们对两个相同表单的验证工作是“id”。

但是怎么做?文档中没有关于此的信息。让我们看看 CActiveForm->error() 来源:

...
$id=CHtml::activeId($model,$attribute);
...

好的,那么 CHtml::activeId 是做什么的?

public static function activeId($model,$attribute)
{
    return self::getIdByName(self::activeName($model,$attribute));
}

...

public static function activeName($model,$attribute)
{
    $a=$attribute; // because the attribute name may be changed by resolveName
    return self::resolveName($model,$a);
} 

...

public static function resolveName($model,&$attribute)
{
...
    return get_class($model).'['.$attribute.']';
}

真是他妈的天才!他们采用模型名称在生成的 javascript 中使用。不是表单 ID,不是元素名称,它们使用模型类名称!

我不知道,强雪抽了什么,但如果你想让验证javascript在一个页面上为两个相同的表单工作,你必须制作两个相同的模型。

因此,如果我们想在 javascript 中更改 'id',我们必须这样做:

<?php
class QuickLoginForm extends LoginForm
{
}

(LoginForm 是我们的模型)并在生成第二个表单时使用。

$quickLoginModel=new QuickLoginForm;
$quickLoginForm = new MyForm('application.views.site.loginForm', $quickLoginModel, null, 'QuickLoginForm');

恭喜!在进行了两次 hack 之后,我们的验证 javascript 可以在两个相同的表单上工作。我不知道如何谈论代码重用或将 Yii 命名为“可扩展框架”,如果您不能只在一个页面上制作两个登录表单而不像猴子一样在 yii javascript 生成器的源代码周围跳跃。

于 2012-10-05T12:58:06.150 回答
0

这应该有效:

<?php echo $form->textField($model, 'attr', array('id' => 'someId')); ?>
<?php echo $form->error($model, 'attr', array('inputID' => 'someId')); ?>

不要忘记保持input.iderror.inputID相同。

于 2012-10-04T21:29:25.390 回答