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

问题描述 投票:0回答:2

我需要对表单中的某些字段进行评论/提示。我的想法是在模型中描述它,就像属性标签一样。我该怎么办?

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

php yii
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>

就是这样!

Login page

现在我们的登录页面将如下所示,带有来自模型的用户名提示和来自 mySQL 注释的密码提示。


2
投票

从 Yii-1.1.13 开始,一个新属性

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


要通过gii模板执行此操作,您只需将上述代码复制到您的自定义

模型代码模板阅读指南以了解如何完成此操作。

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

© www.soinside.com 2019 - 2024. All rights reserved.