在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页面上显示布局表单,但这不是我认为最好的方式。
答案 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/1582 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.id
和error.inputID
相同。