Yii Framework formbuilder - 有没有办法在验证javascript中更改inputID?

时间:2012-10-04 20:42:01

标签: javascript validation frameworks yii formbuilder

在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源代码,但我没有找到inputID的位置。

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

3 个答案:

答案 0 :(得分:1)

因此,在阅读Yii资源3-4小时后,让我回答我自己的问题。 我们想要在生成的javascript中更改的第一件事是错误inputID。 就像mashingan写的那样,如果你没有使用表单构建器,你可以设置$ form-&gt;错误。 如果您正在使用表单构建器,则可以从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-&gt; 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-&gt; 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,不是元素名称,它们使用模型类名!

我不知道,Qiang Xue有什么吸烟,但是如果你想在一个页面上为两个相同的表格进行验证javascript,你必须制作两个相同的模型。

所以,我们想在javascript中更改'id',我们必须这样做:

<?php
class QuickLoginForm extends LoginForm
{
}

(LoginForm是我们的模型)并在生成第二种形式时使用。

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

恭喜! 制作了两个黑客后,我们的验证javascript工作了两个相同的形式。 我不知道如何谈论代码重用或者命名Yii“extandable framework”,如果你不能在一个页面上制作两个登录表单而不像yii javascript生成器的源代码那样像猴子一样跳跃。

答案 1 :(得分: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

答案 2 :(得分:0)

这应该有效:

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

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