我需要对表单中的某些字段进行评论/提示。我的想法是在模型中描述它,就像属性标签一样。我该怎么办?
如果 Gii 模型(和 Crud)生成器能够直接从 mysql 专栏的评论中获取它,那就太理想了
所以我在这里看到两个问题:
显示模型提示
这是由
login.php
生成的默认
Yiic
文件的稍微修改版本
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'login-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<div class="row">
<?php echo $form->labelEx($model,'username'); ?>
<?php echo $form->textField($model,'username'); ?>
<?php echo $form->error($model,'username'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'password'); ?>
<?php echo $form->passwordField($model,'password'); ?>
<?php echo $form->error($model,'password'); ?>
<p class="hint">
Hint: You may login with <kbd>demo</kbd>/<kbd>demo</kbd> or <kbd>admin</kbd>/<kbd>admin</kbd>.
</p>
</div>
<div class="row rememberMe">
<?php echo $form->checkBox($model,'rememberMe'); ?>
<?php echo $form->label($model,'rememberMe'); ?>
<?php echo $form->error($model,'rememberMe'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Login'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
让我们通过向
attributeHints()
模型添加 getHint()
方法和 LoginForm.php
方法来将该密码提示移至模型中。
/**
* Declares attribute hints.
*/
public function attributeHints()
{
return array(
'password'=>'Hint: You may login with <kbd>demo</kbd>/<kbd>demo</kbd> or <kbd>admin</kbd>/<kbd>admin</kbd>.',
);
}
/**
* Return a hint
*/
public function getHint( $attribute )
{
$hints = $this->attributeHints();
return $hints[$attribute];
}
如您所见,我们已将提示文本从视图移至模型中,并添加了访问它的方法。
现在,回到
login.php
,让我们根据模型中的数据添加提示标签。
<div class="row">
<?php echo $form->labelEx($model,'password'); ?>
<?php echo $form->passwordField($model,'password'); ?>
<?php echo $form->error($model,'password'); ?>
<?php echo CHtml::tag('p', array('class'=>'hint'), $model->getHint('password')); ?>
</div>
现在我们已将硬编码提示更改为填充有模型数据的生成元素。
现在,继续第二个问题。
从 mySQL 注释中获取提示
不幸的是,我对 Gii 不够熟悉,不知道如何从 mySQL 注释自动生成提示。然而,将 mySQL 评论数据输入模型相当容易。
为此,我们可以使用以下 mySQL 查询
SHOW FULL COLUMNS FROM `tbl_user`
所以让我们将注释添加到密码字段
ALTER TABLE `tbl_user`
CHANGE `password` `password` VARCHAR( 256 )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL
COMMENT 'Hint: You may login with <kbd>demo</kbd>/<kbd>demo</kbd> or <kbd>admin</kbd>/<kbd>admin</kbd>.';
让我们添加代码以将其获取到我们的
attributeHints()
方法中。
/**
* Declares attribute hints.
*/
public function attributeHints()
{
$columns= Yii::app()->db->createCommand('SHOW FULL COLUMNS FROM `tbl_user`')->queryAll();
$comments=array();
foreach($columns as $column){
if( isset( $column['Comment'] ) )
{
$comments[ $column['Field'] ] = $column['Comment'];
}
}
//Add any hardcoded hints here
$hints = array(
'username'=>'Enter username above',
);
//Return merged array
return array_merge( $comments, $hints );
}
我们现在有两种方式来设置注释,通过 mySQL 注释或通过硬编码语句。
让我们快速更新我们的
login.php
文件以包含这两种类型的提示。
<div class="row">
<?php echo $form->labelEx($model,'username'); ?>
<?php echo $form->textField($model,'username'); ?>
<?php echo $form->error($model,'username'); ?>
<?php echo CHtml::tag('p', array('class'=>'hint'), $model->getHint('username')); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'password'); ?>
<?php echo $form->passwordField($model,'password'); ?>
<?php echo $form->error($model,'password'); ?>
<?php echo CHtml::tag('p', array('class'=>'hint'), $model->getHint('password')); ?>
</div>
就是这样!
现在我们的登录页面将如下所示,带有来自模型的用户名提示和来自 mySQL 注释的密码提示。
comment
已添加到 CMysqlColumnSchema
中,该属性在父级 CDbColumnSchema
中定义:
本专栏评论。默认值为空字符串,这意味着尚未为该列设置注释。空值意味着 RDBMS 根本不支持列注释 (SQLite),或者框架尚不支持活动 RDBMS 的注释检索。
所以我们可以用它来访问评论。有点像这样:
$modelObject->tableSchema->columns['column_name']->comment
// or if you are doing this within your model use
$this->tableSchema->columns['column_name']->comment
请注意,当构造任何 tableSchema
模型时,或者即使使用 静态模型
时,
CActiveRecord
已经设置,因此当我们访问该属性时,不会执行新的查询。
class MyModel extends CActiveRecord {
// hints array will store the hints
public $hints=array();
public function init() {
parent::init();
$this->hints=self::initHints($this);
}
public static function initHints($model) {
$comments=array();
foreach ($model->tableSchema->columns as $aColumn){
if(!empty($aColumn->comment))
$comments["$aColumn->name"]=$aColumn->comment;
}
return $comments;
}
public static function model($className=__CLASS__) {
$model=parent::model($className);
$model->hints=self::initHints($model);
return $model;
}
}
现在您可以通过以下方式访问提示:
$model = new MyModel;
$single_column_hint=$model->hints['column_name'];
$model = MyModel::model();
$single_column_hint=$model->hints['column_name'];
模型代码模板,阅读指南以了解如何完成此操作。
我建议将代码放在自定义基类中,您可以从中派生活动记录。