Yii에 내장된 UI 구성 요소를 소개하기 전에 먼저 구성 요소를 사용자 정의하는 방법을 소개하겠습니다. 이는 CWidget의 사용법을 이해하는 데에도 도움이 됩니다.
class MyWidget extends CWidget{public function init(){// 此方法会被 CController::beginWidget() 调用} public function run(){// 此方法会被 CController::endWidget() 调用}}
이 예제는 CInputWidget을 확장하여 값 범위 입력 UI 구성 요소인 RangeInputField를 정의합니다. 이를 통해 사용자는 두 개의 숫자를 입력하여 값 범위를 정의할 수 있습니다. CInputWidget은 CModel 사용이나 변수 직접 사용을 지원하며 RangeInputField도 이러한 전통을 유지합니다.
RangeInputField는 세 가지 속성 세트를 정의합니다.
$attributeFrom 및 $attributeTo는 CModel에서 사용되며 CHtml의 activeXXX 메서드를 사용하면 activeXXX가 자동으로 텍스트 상자 레이블과 텍스트 상자를 생성할 수 있습니다.
$nameFrom, $nameTo, $valueFrom, $valueTo 속성 프로그래머는 텍스트 상자의 레이블을 직접 정의할 수 있습니다.
Yii 애플리케이션의 기본 디렉토리 구조에 따라 새로 생성된 RangeInputField는 protected/comComponents 디렉토리에 위치하므로 protected/comComponents/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를 테스트할 수 있습니다. FormModel(CModel 사용) 메서드를 사용하여 이 UI 구성 요소를 사용합니다.
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)를 참고해주세요!