2012-10-04 31 views
0

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

我的问题是,我有一个页面上有两个类似的窗体(使用一个表单生成器代码)。 它是登录表单,使用两次。 首先,在模板中(显示在网站的每个页面上)和第二个 - 在/ site/login页面中使用的相同表单(该页面用于在访问restritions等情况下重定向用户)。

这两种形式工作正常,但yii生成验证的JavaScript与两个窗体的元素相同的inputID,我不知道如何改变它。 看一看:

<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页面上显示布局表单,但这不是我想的最好的方式。

回答

0

这应该工作:

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

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

+0

不幸的是,它不适用于Form Builder http://www.yiiframework.com/doc/guide/1.1/en/form.builder – splattru

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。

现在让我们看看由警予产生了JS:

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

我们已经改变inputID和ErrorID中,我们必须改变,以使我们的验证工作有两个相同的形式下一件事情就是“身份证”。

但是如何?文档中没有关于此的信息。 让我们看看CActiveForm->错误()来源:

... 
$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中,我们必须做出这样的:

<?php 
class QuickLoginForm extends LoginForm 
{ 
} 

(LoginForm的是我们的模型),并产生第二表单时使用英寸

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

恭喜! 做了两个黑客后,我们得到了我们的验证JavaScript工作的两种相同的形式。 我不知道怎么说代码重用或者将Yii命名为“可扩展框架”,如果你不能在一个页面上创建两个登录表单而不像yii javascript生成器的源代码那样跳跃。

+0

你总是可以发布[问题](https://github.com/yiisoft/yii/issues) –

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

相关问题