Yii の組み込み UI コンポーネントを紹介する前に、まずコンポーネントをカスタマイズする方法を紹介します。これは、CWidget の init() メソッドと run() メソッドをオーバーロードすることによる、CWidget の使用法を理解するのにも役立ちます。
class MyWidget extends CWidget{public function init(){// 此方法会被 CController::beginWidget() 调用} public function run(){// 此方法会被 CController::endWidget() 调用}}
この例では、CInputWidget を拡張することによって値範囲入力 UI コンポーネント RangeInputField を定義します。これにより、ユーザーは 2 つの数値を入力して値範囲を定義できるようになります。 CInputWidget は CModel の使用または変数の直接使用をサポートしており、RangeInputField もこの伝統を保持しています。
RangeInputField は 3 セットのプロパティを定義します。
$attributeFromと$attributeToはCModelで使用されており、CHtmlのactiveXXXメソッドを使うと、activeXXXでテキストボックスのラベルとテキストボックスを自動生成することができます。
プロパティ $nameFrom、$nameTo、$valueFrom、$valueTo プログラマはテキスト ボックスのラベルを自分で定義できます。
Yii アプリケーションのデフォルトのディレクトリ構造によれば、新しく作成された RangeInputField は protected/components ディレクトリに配置されるので、 protected/components/RangeInputField.php を作成します
class RangeInputField extends CInputWidget{public $attributeFrom;public $attributeTo; public $nameFrom;public $nameTo; public $valueFrom;public $valueTo; function run(){if($this->hasModel()){ echo CHtml::activeTextField($this->model, $this->attributeFrom);echo ' -> '; echo CHtml::activeTextField($this->model, $this->attributeTo);}else{echo CHtml::textField($this->nameFrom,$this->valueFrom); echo ' -> ';echo CHtml::textField($this->nameTo,$this->valueTo);}} /*** @return boolean whether this widget * is associated with a data model.*/ protected function hasModel(){return $this->model instanceof CModel&& $this->attributeFrom!==null&& $this->attributeTo!==null;}}
このようにして、新しい UI コンポーネント RangeInputField がカスタマイズされ、リロードのみ run メソッドの代わりに、init は親クラスのメソッドを使用します。
これで、新しく作成したカスタム UI コンポーネント RangeInputField をテストできるようになります。この UI コンポーネントを使用するには、FormModel (CModel を使用) メソッドを使用します。
protected/models の下に RangeFrom.php を作成します
class RangeForm extends CFormModel{public $from;public $to; function rules(){return array(array('from,to','numerical','integerOnly' =>true), array('from','compare','compareAttribute'=>'to','operator'=> '<=','skipOnError' => true),);}}
次に、デフォルトのコントローラーのデフォルトメソッドである、protected/controllers/siteController.php の actionIndex メソッドを変更します。
public function actionIndex(){$success=false;$model=new RangeForm(); if(!emptyempty($_POST['RangeForm'])){$model->attributes=$_POST['RangeForm'];if($model->validate()) $success=true; } $this->render('index', array('model' => $model,'success' => $success,));}
対応する View を作成します
Success! beginWidget('CActiveForm'); ?> errorSummary($model); ?> widget('RangeInputField',array('model'=>$model,'attributeFrom' => 'from','attributeTo' => 'to',)) ?>endWidget(); ?>
この例を実行します
上記は、PHP 開発フレームワーク Yii Framework チュートリアル (10) UI コンポーネント カスタム コンポーネントの内容です。さらに関連する内容については、PHP に注目してください。中国語のウェブサイト (www.php .cn)!