위젯은 객체 지향 접근 방식을 사용하여 복잡하고 구성 가능한 사용자 인터페이스 단위를 만들기 위해 뷰에서 사용되는 재사용 가능한 단위입니다. 예를 들어, 날짜 선택기 위젯은 사용자가 날짜를 선택할 수 있는 우아한 날짜 선택기를 생성할 수 있습니다. 뷰에 다음 코드만 삽입하면 됩니다.
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget(['name' => 'date']) ?>
Yii는 [ [yiiwidgetsActiveForm|활성 양식]], [yiiwidgetsMenu|메뉴]], jQuery UI 위젯, Twitter Bootstrap 위젯. 다음으로 위젯에 대한 기본 지식을 소개하겠습니다. 특정 위젯에 대해 더 자세히 알고 싶다면 해당 클래스 API 문서를 참고하세요.
위젯 사용
뷰에서는 기본적으로 위젯이 사용되며, 뷰에서 [[yiibaseWidget::widget()]] 메소드를 호출하여 위젯을 사용할 수 있습니다. 이 메소드는 구성 배열을 사용하여 위젯을 초기화하고 위젯이 렌더링된 결과를 반환합니다. 예를 들어 다음 코드는 러시아어를 사용하도록 구성된 날짜 선택기 위젯을 삽입하고 입력 상자 내용은 $model의 from_date 속성 값입니다.
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget([ 'model' => $model, 'attribute' => 'from_date', 'language' => 'ru', 'clientOptions' => [ 'dateFormat' => 'yy-mm-dd', ],]) ?>
일부 위젯은 [[yiibaseWidget::begin()]] 및 [[yiibaseWidget::end()]] 호출에서 데이터 콘텐츠를 사용할 수 있습니다. 일부 위젯은 호출 사이에 포함되어야 하는 콘텐츠 블록을 사용할 수 있습니다. 예를 들어 다음 코드는 [[yiiwidgetsActiveForm]] 위젯을 사용하여 로그인 양식을 생성합니다. 그 사이의 모든 코드도 렌더링됩니다.
<?php use yii\widgets\ActiveForm; use yii\helpers\Html; ?> <?php $form = ActiveForm::begin(['id' => 'login-form']); ?> <?= $form->field($model, 'username') ?> <?= $form->field($model, 'password')->passwordInput() ?> <div class="form-group"> <?= Html::submitButton('Login') ?> </div><?php ActiveForm::end(); ?>
[[yiibaseWidget::widget()]]을 호출하여 반환되는 렌더링 결과가 다르다는 점에 유의하세요. [[yiibaseWidget::begin()]] 메서드를 호출하면 조립할 수 있는 위젯 인스턴스가 반환됩니다. 위젯 콘텐츠.
위젯 만들기
[[yiibaseWidget]] 클래스를 상속하고 [[yiibaseWidget::init()]] 및/또는 [[yiibaseWidget::run()]] 메서드를 재정의하여 다음을 수행합니다. 위젯을 만듭니다. 일반적으로 init() 메서드는 위젯 속성을 처리하고 run() 메서드에는 위젯이 렌더링 결과를 생성하는 코드가 포함되어 있습니다. 렌더링 결과는 run() 메서드에서 직접 "반향" 출력되거나 문자열로 반환될 수 있습니다.
다음 코드의 HelloWidget은 메시지 속성에 할당된 값을 인코딩하여 표시합니다. 속성에 값이 할당되지 않으면 기본적으로 "Hello World"가 표시됩니다.
namespace app\components; use yii\base\Widget; use yii\helpers\Html; class HelloWidget extends Widget{ public $message; public function init() { parent::init(); if ($this->message === null) { $this->message = 'Hello World'; } } public function run() { return Html::encode($this->message); }}
이 위젯을 사용하려면 뷰에서 다음 코드를 사용하세요.
<?php use app\components\HelloWidget; ?> <?= HelloWidget::widget(['message' => 'Good morning']) ?>
다음은 start() 및 end()에서 HelloWidget을 호출하는 데 사용할 수 있는 또 다른 코드입니다. 을 클릭하면 HTML로 인코딩된 콘텐츠가 표시됩니다.
namespace app\components; use yii\base\Widget; use yii\helpers\Html; class HelloWidget extends Widget{ public function init() { parent::init(); ob_start(); } public function run() { $content = ob_get_clean(); return Html::encode($content); }}
위와 같이 PHP 출력 버퍼링은 init()에서 시작되고 init()와 run() 메서드 사이의 모든 출력 내용을 가져와 처리하고 run()에서 반환합니다.
보충: [[yiibaseWidget::begin()]]을 호출하면 새 위젯 인스턴스가 생성되고 생성이 끝나면 init() 메서드가 호출됩니다. end() ) 메서드에서 호출하고 반환 결과를 출력합니다.
다음 코드는 이 HelloWidget을 사용하는 방법을 보여줍니다.
<?php use app\components\HelloWidget; ?> <?php HelloWidget::begin(); ?> content that may contain <tag>'s <?php HelloWidget::end(); ?>
때때로 위젯이 많은 콘텐츠를 렌더링해야 할 경우, 더 좋은 방법은 콘텐츠를 보기 파일에 넣는 것입니다. 그런 다음 [ [yiibaseWidget::render()]] 메서드를 호출하면 보기 파일이 렌더링됩니다. 예:
public function run(){ return $this->render('hello');}
위젯의 보기 파일은 기본적으로 WidgetPath/views 디렉터리에 저장되며 WidgetPath 위젯 클래스 파일이 위치한 디렉토리를 나타냅니다. 위 예제 위젯 클래스 파일이 @app/comComponents 아래에 있으면 @app/comComponents/views/hello.php 뷰 파일이 렌더링됩니다. [[yiibaseWidget::getViewPath()]] 메서드를 재정의하여 뷰 파일의 경로를 맞춤설정할 수 있습니다.
모범 사례
위젯은 뷰 코드를 재사용하는 객체 지향 방법입니다.
위젯을 생성할 때는 여전히 MVC 패턴을 따라야 합니다. 일반적으로 로직 코드는 위젯 클래스에 있고 표시 콘텐츠는 뷰에 있습니다.
위젯은 독립적으로 설계되어야 합니다. 즉, 위젯을 사용할 때 추가 처리 없이 바로 삭제할 수 있습니다. 하지만 위젯에 CSS, JavaScript, 이미지 등과 같은 외부 리소스가 필요한 경우 까다로울 수 있습니다. 다행히 Yii는 이 문제를 해결하기 위한 리소스 패키지를 제공합니다.
위젯에 뷰 코드만 포함된 경우 뷰와 매우 유사합니다. 실제로 이 경우 유일한 차이점은 위젯은 재사용 가능한 클래스이고 뷰는 사용되는 일반 PHP 스크립트라는 것입니다. 응용 프로그램에서.