7

我需要对表单中的某些字段进行评论/提示。我的想法是用模型来描述它,就像attributeLabels一样。我该怎么做?

如果 Gii 模型(和 Crud)生成器直接从 mysql 专栏的评论中获取它,那将是理想的

4

2 回答 2

13

所以我在这里看到两个问题:

  1. 在模型中描述提示并在表单上显示。
  2. 从 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 注释的密码提示。

于 2012-09-07T17:00:00.057 回答
2

从 Yii-1.1.13comment开始,添加了一个新属性 ,CMysqlColumnSchema定义在 parent 中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'];

要通过 gii 模板执行此操作,您只需将上述代码复制到您的自定义模型代码模板中,阅读指南以了解如何完成此操作。

我建议将代码放在自定义基类中,您可以从中派生活动记录。

于 2013-01-26T20:02:18.847 回答