yii:使用命名空间时只检索表单名称类

时间:2012-06-06 13:44:51

标签: yii

我有一个与此类似的代码来处理表单提交:

use \my-project\web\models\forms\RegisterOrganizationForm;
...
var_dump($_POST);die();
$model=new LoginForm;
if(isset($_POST['LoginForm']))
    $model->attributes=$_POST['LoginForm'];

var_dump的输出是(嗯,只是关于表单值的部分):

  

[ “\我的项目\幅\模型\形式\ LoginForm的”] => array(1){...

正如你所看到的那样添加了命名空间(我没想到这个......),所以,当vardumping时我怎么能得到这样的东西?:

["LoginForm"]=> array(1) {...

Javier

2 个答案:

答案 0 :(得分:1)

首先,在将模型属性设置为表单接收的数据之前调用die()。

其次,您正在var_dump $_POST而不是var_dump $_POST['LoginForm']

如果你想看看从表单发回的内容,你想要使用firebox的firebug工具或chrome中的开发人员工具

,那么你为什么要做一个var_dump?

答案 1 :(得分:1)

我和你有同样的问题。

修补以下文件:

/path/to/yii/framework/web/helpers/CHtml.php

找到方法'resolveName',将其替换为以下内容:

/**
 * Resolves a class name, removing namespaces.
 */
public static function resolveClassName($model){
    return end(explode('\\',get_class($model)));
}

/**
 * Generates input name for a model attribute.
 * Note, the attribute name may be modified after calling this method if the name
 * contains square brackets (mainly used in tabular input) before the real attribute name.
 * @param CModel $model the data model
 * @param string $attribute the attribute
 * @return string the input name
 */
public static function resolveName($model,&$attribute)
{
    if(($pos=strpos($attribute,'['))!==false)
    {
        if($pos!==0)  // e.g. name[a][b]
            return self::resolveClassName($model).'['.substr($attribute,0,$pos).']'.substr($attribute,$pos);
        if(($pos=strrpos($attribute,']'))!==false && $pos!==strlen($attribute)-1)  // e.g. [a][b]name
        {
            $sub=substr($attribute,0,$pos+1);
            $attribute=substr($attribute,$pos+1);
            return self::resolveClassName($model).$sub.'['.$attribute.']';
        }
        if(preg_match('/\](\w+\[.*)$/',$attribute,$matches))
        {
            $name=self::resolveClassName($model).'['.str_replace(']','][',trim(strtr($attribute,array(']['=>']','['=>']')),']')).']';
            $attribute=$matches[1];
            return $name;
        }
    }
    return self::resolveClassName($model).'['.$attribute.']';
}

希望这有帮助!

P.S。对于那些认为这是愚蠢或不必要的人,客户端验证器不起作用,因为你不能使用带有反斜杠的ID选择一个元素(或者至少使用jQuery)