zoukankan      html  css  js  c++  java
  • Yii框架2.0的小部件

    小部件是视图里的可重用单元。

    小部件是在视图中使用的,但是可能需要使用控制器传给他的模型,比如在渲染表单的时候。比如一般的时间拾取器就可以直接砸视图里加入如下代码就可以:

    <?php
    use yiijuiDatePicker;
    ?>
    <?= DatePicker::widget(['name' => 'date']) ?>

    如果用到model 就大致是这样的:

    <?php
    use yiijuiDatePicker;
    ?>
    <?= DatePicker::widget([
        'model' => $model,
        'attribute' => 'from_date',
        'language' => 'ru',
        'clientOptions' => [
            'dateFormat' => 'yy-mm-dd',
        ],
    ]) ?>

    一些小部件可在[[yiiaseWidget::begin()]] 和 [[yiiaseWidget::end()]] 调用中使用数据内容。比如ActiveForm 小组件就是这样使用的。

    <?php
    use yiiwidgetsActiveForm;
    use yiihelpersHtml;
    ?>
    
    <?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(); ?>

    和调用 [[yiiaseWidget::widget()]] 返回渲染结果不同, 调用 [[yiiaseWidget::begin()]] 方法返回一个可组建小部件内容的小部件实例。

    创建小部件:

    继承 yiiaseWidget 并实现 init 和 run方法就可以创建一个小部件。

    1、创建一个像上面提到的时间选择器那样可以直接输出的小部件:

    namespace appcomponents;
    
    use yiiaseWidget;
    use yiihelpersHtml;
    
    class HelloWidget extends Widget {
        public $message;
    
        public function init() {
            parent::init();
            if(null == $this->message) {
                $this->message = 'Hello World';
            }
        }
    
        public function run() {
            return Html::encode($this->message);
        }
    }

    在模板中使用的代码是:

    <?php
    use appcomponentsHelloWidget;
    ?>
    <?= HelloWidget::widget(['message'=>'This is a HelloWidget!'])?>

    2、如果要创建一个用 begin 和 end 中使用的小部件:

    amespace appcomponents;
    
    use yiiaseWidget;
    use yiihelpersHtml;
    
    class HelloWidget extends Widget {
        public $message;
    
        public function init() {
            parent::init();
            ob_start();
        }
    
        public function field() {
            return Html::encode('这个是实例调用的方法!');
        }
    
        public function run() {
            $this->message = ob_get_clean();
            return Html::encode($this->message);
        }
    }

    模板里调用是这样的:

    <?php
    use yiihelpersHtml;
    use appcomponentsHelloWidget;
    ?>
    
    <?php echo Html::encode($message);?><br />
    <?php $hello = HelloWidget::begin();?>
        这次使用的事begin 和 end方法。
        <?= $hello->field();?>
    <?php HelloWidget::end();?>

    有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个视图文件, 然后调用[[yiiaseWidget::render()]]方法渲染该视图文件,小部件的视图文件默认存储在WidgetPath/views目录,WidgetPath代表小部件类文件所在的目录。 假如上述示例小部件类文件在@app/components下,会渲染@app/components/views/hello.php视图文件。 You may override 可以覆盖[[yiiaseWidget::getViewPath()]]方法自定义视图文件所在路径。

    public function run(){
        return $this->render('hello');
    }

    最后提点应该注意的:

    • 创建小部件时仍需要遵循MVC模式,通常逻辑代码在小部件类,展示内容在视图中。
    • 小部件设计时应是独立的,也就是说使用一个小部件时候,可以直接丢弃它而不需要额外的处理。 但是当小部件需要外部资源如CSS, JavaScript, 图片等会比较棘手, 幸运的时候Yii提供 资源包 来解决这个问题。
    • 当一个小部件只包含视图代码,它和视图很相似, 实际上,在这种情况下,唯一的区别是小部件是可以重用类,视图只是应用中使用的普通PHP脚本。
  • 相关阅读:
    HashMap与ArrayList的相互嵌套
    Mysql与Oracle 的对比
    什么是子查询
    创建存储过程
    cmd 快捷键
    navicat 快捷键
    Mysql的数据类型 6种
    Mysql与Oracle 的使用区别
    怎样修复ie浏览器
    Linux官方内置Bash中新发现一个非常严重安全漏洞
  • 原文地址:https://www.cnblogs.com/wayne173/p/4398648.html
Copyright © 2011-2022 走看看