7

フォームの一部のフィールドにコメント/ヒントが必要です。私の考えは、attributeLabels のようにモデルで記述することです。どうすればいいですか?

そして、Gii モデル (および Crud) ジェネレーターが mysql 列のコメントから直接取得することが理想的です。

4

2 に答える 2

13

したがって、ここに2つの質問があります。

  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>

そのため、ハードコードされたヒントを、モデルからのデータが取り込まれた生成された要素に変更しました。

では、2つ目の質問に移ります。

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 コメントを使用する方法と、ハードコードされたステートメントを使用する方法の 2 つがあります。

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.13 から、新しい属性commentが追加CMysqlColumnSchemaされ、parent で定義されていCDbColumnSchemaます。

このコラムのコメント。デフォルト値は空の文字列です。これは、列にコメントが設定されていないことを意味します。Null 値は、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 に答える