PageRenderTime 41ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/docs/guide-zh-CN/structure-widgets.md

https://gitlab.com/brucealdridge/yii2
Markdown | 180 lines | 134 code | 46 blank | 0 comment | 0 complexity | 2aeaa33c77e0fa78baf2521f35dbe914 MD5 | raw file
  1. 小部件
  2. =======
  3. 小部件是在 [视图](structure-views.md) 中使用的可重用单元使用面向对象方式创建复杂和可配置用户界面单元
  4. 例如日期选择器小部件可生成一个精致的允许用户选择日期的日期选择器
  5. 你只需要在视图中插入如下代码
  6. ```php
  7. <?php
  8. use yii\jui\DatePicker;
  9. ?>
  10. <?= DatePicker::widget(['name' => 'date']) ?>
  11. ```
  12. Yii提供许多优秀的小部件比如[[yii\widgets\ActiveForm|active form]], [yii\widgets\Menu|menu]],
  13. [jQuery UI widgets](widget-jui.md), [Twitter Bootstrap widgets](widget-bootstrap.md)
  14. 接下来介绍小部件的基本知识如果你想了解某个小部件请参考对应的类API文档
  15. ## 使用小部件 <span id="using-widgets"></span>
  16. 小部件基本上在[views](structure-views.md)中使用在视图中可调用 [[yii\base\Widget::widget()]] 方法使用小部件
  17. 该方法使用 [配置](concept-configurations.md) 数组初始化小部件并返回小部件渲染后的结果
  18. 例如如下代码插入一个日期选择器小部件它配置为使用俄罗斯语输入框内容为`$model``from_date`属性值
  19. ```php
  20. <?php
  21. use yii\jui\DatePicker;
  22. ?>
  23. <?= DatePicker::widget([
  24. 'model' => $model,
  25. 'attribute' => 'from_date',
  26. 'language' => 'ru',
  27. 'clientOptions' => [
  28. 'dateFormat' => 'yy-mm-dd',
  29. ],
  30. ]) ?>
  31. ```
  32. 一些小部件可在[[yii\base\Widget::begin()]] [[yii\base\Widget::end()]] 调用中使用数据内容Some widgets can take a block of content which should be enclosed between the invocation of
  33. 例如如下代码使用[[yii\widgets\ActiveForm]]小部件生成一个登录表单
  34. 小部件会在`begin()` 和0 `end()`执行处分别生成`<form>`的开始标签和结束标签中间的任何代码也会被渲染
  35. ```php
  36. <?php
  37. use yii\widgets\ActiveForm;
  38. use yii\helpers\Html;
  39. ?>
  40. <?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
  41. <?= $form->field($model, 'username') ?>
  42. <?= $form->field($model, 'password')->passwordInput() ?>
  43. <div class="form-group">
  44. <?= Html::submitButton('Login') ?>
  45. </div>
  46. <?php ActiveForm::end(); ?>
  47. ```
  48. 注意和调用 [[yii\base\Widget::widget()]] 返回渲染结果不同
  49. 调用 [[yii\base\Widget::begin()]] 方法返回一个可组建小部件内容的小部件实例
  50. ## 创建小部件 <span id="creating-widgets"></span>
  51. ## Creating Widgets <span id="creating-widgets"></span>
  52. 继承 [[yii\base\Widget]] 类并覆盖 [[yii\base\Widget::init()]] /
  53. [[yii\base\Widget::run()]] 方法可创建小部件通常`init()` 方法处理小部件属性
  54. `run()` 方法包含小部件生成渲染结果的代码
  55. 渲染结果可在`run()`方法中直接"echoed"输出或以字符串返回
  56. 如下代码中`HelloWidget`编码并显示赋给`message` 属性的值
  57. 如果属性没有被赋值默认会显示"Hello World"
  58. ```php
  59. namespace app\components;
  60. use yii\base\Widget;
  61. use yii\helpers\Html;
  62. class HelloWidget extends Widget
  63. {
  64. public $message;
  65. public function init()
  66. {
  67. parent::init();
  68. if ($this->message === null) {
  69. $this->message = 'Hello World';
  70. }
  71. }
  72. public function run()
  73. {
  74. return Html::encode($this->message);
  75. }
  76. }
  77. ```
  78. 使用这个小部件只需在视图中简单使用如下代码:
  79. ```php
  80. <?php
  81. use app\components\HelloWidget;
  82. ?>
  83. <?= HelloWidget::widget(['message' => 'Good morning']) ?>
  84. ```
  85. 以下是另一种可在`begin()` `end()`调用中使用的`HelloWidget`HTML编码内容然后显示
  86. ```php
  87. namespace app\components;
  88. use yii\base\Widget;
  89. use yii\helpers\Html;
  90. class HelloWidget extends Widget
  91. {
  92. public function init()
  93. {
  94. parent::init();
  95. ob_start();
  96. }
  97. public function run()
  98. {
  99. $content = ob_get_clean();
  100. return Html::encode($content);
  101. }
  102. }
  103. ```
  104. 如上所示PHP输出缓冲在`init()`启动所有在`init()` `run()`方法之间的输出内容都会被获取并在`run()`处理和返回
  105. > 补充: 当你调用 [[yii\base\Widget::begin()]] 时会创建一个新的小部件实例并在构造结束时调用`init()`方法
  106. `end()`时会调用`run()`方法并输出返回结果
  107. 如下代码显示如何使用这种 `HelloWidget`:
  108. ```php
  109. <?php
  110. use app\components\HelloWidget;
  111. ?>
  112. <?php HelloWidget::begin(); ?>
  113. content that may contain <tag>'s
  114. <?php HelloWidget::end(); ?>
  115. ```
  116. 有时小部件需要渲染很多内容一种更好的办法是将内容放入一个[视图](structure-views.md)文件
  117. 然后调用[[yii\base\Widget::render()]]方法渲染该视图文件例如
  118. ```php
  119. public function run()
  120. {
  121. return $this->render('hello');
  122. }
  123. ```
  124. 小部件的视图文件默认存储在`WidgetPath/views`目录`WidgetPath`代表小部件类文件所在的目录
  125. 假如上述示例小部件类文件在`@app/components`会渲染`@app/components/views/hello.php`视图文件 You may override
  126. 可以覆盖[[yii\base\Widget::getViewPath()]]方法自定义视图文件所在路径
  127. ## 最佳实践 <span id="best-practices"></span>
  128. 小部件是面向对象方式来重用视图代码
  129. 创建小部件时仍需要遵循MVC模式通常逻辑代码在小部件类展示内容在[视图](structure-views.md)
  130. 小部件设计时应是独立的也就是说使用一个小部件时候可以直接丢弃它而不需要额外的处理
  131. 但是当小部件需要外部资源如CSS, JavaScript, 图片等会比较棘手
  132. 幸运的时候Yii提供 [资源包](structure-asset-bundles.md) 来解决这个问题
  133. 当一个小部件只包含视图代码它和[视图](structure-views.md)很相似
  134. 实际上在这种情况下唯一的区别是小部件是可以重用类视图只是应用中使用的普通PHP脚本