您的位置:首页 > 编程语言 > PHP开发

Yii 1.1代码生成器gii(booster gii)模板修改

2015-12-17 16:43 661 查看
Yii默认的 <h1>部分都是英文,这是因为模板文件中类似如下:

$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-ddyyyy/mm/dd.'))";


另外,TbDatePicker选择后显示的是 yyyy年mm月dd日,而提交后的数据也是如此,这样的数据是不能不能被date类型的mysql字段接受的,可以使用的办法是在控制器的

$model->attributes = $_POST['PcpointHead'];


语句前面添加正规化的语句,如将非数字替换为-,然后去掉首尾的-:

$_POST['PcpointHead']['mktbltime'] = trim(preg_replace('/\D+/', '-',
$_POST['PcpointHead']['mktbltime']), '-');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: