Yii:模型属性的注释/提示

zuu*_*ups 5 yii

我需要在表单中的某些字段中添加注释/提示.我的想法是在模型中描述它,就像attributeLabels一样.我该怎么做?

如果Gii Model(和Crud)生成器直接从mysql列的注释中获取它,那么它将是理想的

小智 10

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

  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 -->
Run Code Online (Sandbox Code Playgroud)

让我们通过向模型添加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];
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,我们已将提示文本从视图移动到模型中,并添加了一种访问它的方法.

现在,回来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>
Run Code Online (Sandbox Code Playgroud)

所以现在我们已经将硬编码的提示更改为使用模型中的数据填充的生成元素.

现在,继续讨论第二个问题.

从mySQL评论中获取提示

不幸的是,我并不熟悉Gii,知道如何从mySQL注释中自动生成提示.但是,将mySQL注释数据放入模型中相当容易.

为此,我们可以使用以下mySQL查询

SHOW FULL COLUMNS FROM `tbl_user`
Run Code Online (Sandbox Code Playgroud)

所以我们将注释添加到密码字段中

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>.';
Run Code Online (Sandbox Code Playgroud)

然后我们添加代码将其提取到我们的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 );
    }
Run Code Online (Sandbox Code Playgroud)

我们现在有两种方法可以通过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>
Run Code Online (Sandbox Code Playgroud)

就是这样!

登录页面

现在,我们的登录页面将如下所示,其中包含模型中的用户名提示和mySQL注释中的密码提示.