howardeagle / yii2-inline-widgets-behavior
Allows to render widgets in page content in Yii2 Framework based projects
Installs: 1 444
Dependents: 2
Suggesters: 0
Security: 0
Stars: 3
Watchers: 4
Forks: 9
Type:yii2-extension
Requires
- yiisoft/yii2: *
This package is not auto-updated.
Last update: 2024-11-06 14:18:26 UTC
README
Allows to render widgets in page content in Yii2 Framework based projects
Install
Either run
$ php composer.phar require --prefer-dist outOFFspace/Yii2-inline-widgets-behavior "*"
or add
"outOFFspace/Yii2-inline-widgets-behavior": "*"
~~~
to the `require` section of your `composer.json file`.
Usage example
-------------
### Add a allowed widgets list into `config/main.php`:
```php
return [
// ...
'params' => [
// ...
'runtimeWidgets'=> [
'common\widgets\LastPosts',
]
]
]
```
### Create widgets:
```php
class LastPostsWidget extends Widget
{
public $tpl = 'default';
public function run()
{
$posts = Post::find()->published()->all();
return $this->render('LastPosts/' . $this->tpl, [
'posts' => $posts,
]);
}
}
```
### Attach the behavior to a main controller:
```php
use howard\behaviors\iwb\InlineWidgetsBehavior;
class DefaultController extends Controller
{
public function behaviors()
{
return [
'InlineWidgetsBehavior' => [
'class'=> InlineWidgetsBehavior::className(),
'namespace'=> 'common\components\widgets', // default namespace (optional)
'widgets'=> \Yii::$app->params['runtimeWidgets'],
'startBlock'=> '[*',
'endBlock'=> '*]',
],
];
}
}
```
### You can define a global classname suffix like 'Widget':
```php
class DefaultController extends Controller
{
public function behaviors()
{
return [
'InlineWidgetsBehavior' => [
'class' => InlineWidgetsBehavior::className(),
'widgets' => \Yii::$app->params['runtimeWidgets'],
'classSuffix' => 'Widget',
],
];
}
}
```
for using short names 'LastPosts' instead of 'LastPostsWidget' :
```php
return [
// ...
'params' => [
// ...
'runtimeWidgets' => [
'ContactsForm',
'Comments',
'common\widgets\LastPosts',
]
]
}
```
For insert widgets in content you can use string of this format in your text:
~~~
<startBlock><WidgetName>[|<attribute>=<value>[;<attribute>=<value>]]<endBlock>
~~~
For rendering widgets in any View you must call `Controller::decodeWidgets()` method for model HTML content.
### For example:
```php
<?php $model->text = '
<h2>Lorem ipsum</h2>
<h2>Latest posts</h2>
<p>[*LastPosts*]</p>
<h2>Latest posts (with parameters)</h2>
<p>[*LastPosts|tpl=small*]</p>
<h2>Latest posts (with inner caching)</h2>
<p>[*LastPosts|tpl=small;cache=300*]</p>
<p>Dolor...</p>
'; ?>
<h1><?= Html::encode($model->title); ?></h1>
<?= $this->context->decodeWidgets($model->text); ?>
```
to have an access to the model from widgets just specify the 'model' variable in `Controller::decodeWidgets()` method:
```php
<?= $this->context->decodeWidgets($model->text, $model); ?>
```