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

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']), '-');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值