Yii 1.1代码生成器gii(booster gii)模板修改
2015-12-17 16:43
661 查看
Yii默认的 <h1>部分都是英文,这是因为模板文件中类似如下:
即 $label 是从类的名字转换而来,同时显示为复数,这对于英文是有意义的,但对于中文,根本没有单复数的概念,而且页面中应该显示中文。如果每个地方都手动修改,不仅麻烦,而且一旦数据表结构变动需要重新生成原型,会造成前功尽弃。
考虑在模型类中增加一个静态字段或常量,用它代替作为模型的中文名(扩展开来说是本地语言的名字)。为了做得更彻底些,连模型的生成模板也修改掉。尽管用表的注释来作为中文名也是可能的,但似乎Yii本身并没有提供从表的元数据获取表的注释的代码(获取字段列的注释是本身实现的),如果大范围动yii/gii代码就显得不划算了,因此考虑最小切入点。
修改 framework/gii/generators/model/templates/default/model.php的代码:
修改crud模板protected/extensions/Booster/gii/bootstrap/templates/default/index.php的代码如下:
如此处理,默认生成的代码和原来一模一样,而如果我们在模型生成之后修改类常量的值,然后再生成crud代码,$label就都是中文了。这样做的问题是需要记住:必须在生成模型之后及时修改常量的值。有没有一种更彻底的做法,避免模型重新生成后重新修改常量的值?
把前述模型模板的代码修改成:
然后,如果项目配置文件main.php中包含了参数信息:
那么类Pcpoint将自动带有常量LOCAL_LANGUAGE_MODEL_NAME,并且值为“普查点”。如果项目配置文件中未指定,则沿用yii给出的名称。
所以,完整的方案是:
1、修改模型模板model.php(见前述)
2、修改crud模板index.php、create.php、_form.php、update.php、view.php、admin.php中$label部分,并将Create、List、Manage、View等字样修改为中文(包括菜单、导航条、标题、提交按钮、链接显示名、表单必需字段提示、高级搜索提示)
3、从查看页点击删除的英文问题(此问题应当属于2、,因为在view.php文件菜单部分,无非在该行很后面不容发现需要修改)和日期选择控件的英文问题
我们在项目中配置语言为zh_cn,所以,对 TbDatePicker组件的初始化函数进行fix(注意该组件的js语言文件对应的简体中文后缀是zh-CN.js):
TbDatePicker的默认后缀文字也是英文的,虽然可以通过设置widgetOptions修改它,但为了省事,我们直接从Booster/gii/bootstrap/BootstrapCode.php修改它:
另外,TbDatePicker选择后显示的是 yyyy年mm月dd日,而提交后的数据也是如此,这样的数据是不能不能被date类型的mysql字段接受的,可以使用的办法是在控制器的
语句前面添加正规化的语句,如将非数字替换为-,然后去掉首尾的-:
$label = $this->pluralize($this->class2name($this->modelClass)); echo "\$this->breadcrumbs=array( '$label', );\n"; ?>$this->menu=array( array('label'=>'Create <?php echo $this->modelClass; ?>','url'=>array('create')), array('label'=>'Manage <?php echo $this->modelClass; ?>','url'=>array('admin')), ); ?> <h1><?php echo $label; ?></h1>
即 $label 是从类的名字转换而来,同时显示为复数,这对于英文是有意义的,但对于中文,根本没有单复数的概念,而且页面中应该显示中文。如果每个地方都手动修改,不仅麻烦,而且一旦数据表结构变动需要重新生成原型,会造成前功尽弃。
考虑在模型类中增加一个静态字段或常量,用它代替作为模型的中文名(扩展开来说是本地语言的名字)。为了做得更彻底些,连模型的生成模板也修改掉。尽管用表的注释来作为中文名也是可能的,但似乎Yii本身并没有提供从表的元数据获取表的注释的代码(获取字段列的注释是本身实现的),如果大范围动yii/gii代码就显得不划算了,因此考虑最小切入点。
修改 framework/gii/generators/model/templates/default/model.php的代码:
class <?php echo $modelClass; ?>extends <?php echo $this->baseClass."\n"; ?>{ const LOCAL_LANGUAGE_MODEL_NAME = '<?php echo $this->pluralize($this->class2name($modelClass)); ?>';
修改crud模板protected/extensions/Booster/gii/bootstrap/templates/default/index.php的代码如下:
<?php echo "<?php\n"; $className = $this->modelClass; $label = $className::LOCAL_LANGUAGE_MODEL_NAME ;//$this->pluralize($this->class2name($this->modelClass));
如此处理,默认生成的代码和原来一模一样,而如果我们在模型生成之后修改类常量的值,然后再生成crud代码,$label就都是中文了。这样做的问题是需要记住:必须在生成模型之后及时修改常量的值。有没有一种更彻底的做法,避免模型重新生成后重新修改常量的值?
把前述模型模板的代码修改成:
const LOCAL_LANGUAGE_MODEL_NAME = '<?php echo isset(Yii::app()->params['localLanguageModelNames']["$modelClass"]) ? Yii::app()->params['localLanguageModelNames']["$modelClass"] : $this->pluralize($this->class2name($modelClass)); ?>';
然后,如果项目配置文件main.php中包含了参数信息:
'params'=>array( // this is used in contact page 'adminEmail'=>'webmaster@example.com', 'localLanguageModelNames' => array( 'Pcpoint' => '普查点', ), ),
那么类Pcpoint将自动带有常量LOCAL_LANGUAGE_MODEL_NAME,并且值为“普查点”。如果项目配置文件中未指定,则沿用yii给出的名称。
所以,完整的方案是:
1、修改模型模板model.php(见前述)
2、修改crud模板index.php、create.php、_form.php、update.php、view.php、admin.php中$label部分,并将Create、List、Manage、View等字样修改为中文(包括菜单、导航条、标题、提交按钮、链接显示名、表单必需字段提示、高级搜索提示)
3、从查看页点击删除的英文问题(此问题应当属于2、,因为在view.php文件菜单部分,无非在该行很后面不容发现需要修改)和日期选择控件的英文问题
我们在项目中配置语言为zh_cn,所以,对 TbDatePicker组件的初始化函数进行fix(注意该组件的js语言文件对应的简体中文后缀是zh-CN.js):
public function init() { $this->htmlOptions['type'] = 'text'; $this->htmlOptions['autocomplete'] = 'off'; if (!isset($this->options['language'])) { $languageInfo = explode('_', Yii::app()->getLanguage()); if($languageInfo[0] == 'zh') { $this->options['language'] = 'zh-'.strtoupper($languageInfo[1]); } else $this->options['language'] = substr(Yii::app()->getLanguage(), 0, 2); } parent::init(); }
TbDatePicker的默认后缀文字也是英文的,虽然可以通过设置widgetOptions修改它,但为了省事,我们直接从Booster/gii/bootstrap/BootstrapCode.php修改它:
if($column->dbType == 'date') { return "\$form->datePickerGroup(\$model,'{$column->name}',array('widgetOptions'=>array('options'=>array(),'htmlOptions'=>array('class'=>'span5')), 'prepend'=>'<i class=\"glyphicon glyphicon-calendar\"></i>', 'append'=>'从弹出框选择日期或直接输入年月日(yyyy-mm-dd或yyyy/mm/dd).'))";
另外,TbDatePicker选择后显示的是 yyyy年mm月dd日,而提交后的数据也是如此,这样的数据是不能不能被date类型的mysql字段接受的,可以使用的办法是在控制器的
$model->attributes = $_POST['PcpointHead'];
语句前面添加正规化的语句,如将非数字替换为-,然后去掉首尾的-:
$_POST['PcpointHead']['mktbltime'] = trim(preg_replace('/\D+/', '-', $_POST['PcpointHead']['mktbltime']), '-');
相关文章推荐
- php7 and php 5 安装 使用 测试
- 用户数据表用一张和两张的区别
- PHP数据库统计时间戳按天分组输出数据
- php \r \n 和 <br/> \t
- 简介WordPress中用于获取首页和站点链接的PHP函数
- php 返回json中文乱码
- PHPUnit测试私有属性和方法
- php屏蔽错误消息
- 如何批量添加和删除SMTP地址
- PHP验证XML格式是否正确
- PHP将JSON转为XML
- PHP附件下载中文名称乱码的解决方法
- PHP去除重复的数组数据
- PHP中9大缓存技术
- WordPress中获取页面链接和标题的相关PHP函数用法解析
- php备份数据库的原理和方法
- php反射
- php编程规范
- php提交post数组参数实例分析
- php安装包制作