フォームの一部のフィールドにコメント/ヒントが必要です。私の考えは、attributeLabels のようにモデルで記述することです。どうすればいいですか?
そして、Gii モデル (および Crud) ジェネレーターが mysql 列のコメントから直接取得することが理想的です。
フォームの一部のフィールドにコメント/ヒントが必要です。私の考えは、attributeLabels のようにモデルで記述することです。どうすればいいですか?
そして、Gii モデル (および Crud) ジェネレーターが mysql 列のコメントから直接取得することが理想的です。
したがって、ここに2つの質問があります。
モデルからのヒントの表示
これは、によって生成されたデフォルト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 コメントからのパスワードのヒントがあります。
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 テンプレートを使用してこれを行うには、上記のコードをカスタムモデル コード テンプレートにコピーするだけです。ガイドを読んで、これを行う方法を確認してください。
アクティブなレコードを派生できるカスタム基本クラスにコードを含めることをお勧めします。