yii2bsduallistbox.php
<?php
/**
* This class is used to embed FullCalendar JQuery Plugin to my Yii2 Projects
* @copyright Frenzel GmbH - www.frenzel.net
* @link http://www.frenzel.net
* @author Philipp Frenzel <philipp@frenzel.net>
*
*/
namespace net\frenzel\yii2bsduallistbox;
use Yii;
use yii\base\Model;
use yii\web\View;
use yii\helpers\Html;
use yii\helpers\Json;
use yii\web\JsExpression;
use yii\widgets\InputWidget as elWidget;
class yii2bsduallistbox extends elWidget
{
/**
* @var array listbox items
*/
public $items = [];
/**
* @var string|array selected items
*/
public $selection;
/**
* @var array options the HTML attributes (name-value pairs) for the field container tag.
* The values will be HTML-encoded using [[Html::encode()]].
* If a value is null, the corresponding attribute will not be rendered.
*/
public $options = [
'class' => 'yii2bsduallistbox',
];
/**
* @var array clientOptions the HTML attributes for the widget container tag.
*/
public $clientOptions = [];
/**
* Holds an array of Event Objects
* @var array events of yii2fullcalendar\models\Event
* @todo add the event class and write docs
**/
public $events = [];
/**
* Will hold an url to json formatted events!
* @var url to json service
*/
public $ajaxEvents = NULL;
/**
* the text that will be displayed on changing the pages
* @var string
*/
public $loading = 'Loading ...';
/**
* internal marker for the name of the plugin
* @var string
*/
private $_pluginName = 'yii2bsduallistbox';
/**
* The javascript function to us as en eventRender callback
* @var string the javascript code that implements the eventRender function
*/
public $eventRender = "";
/**
* The javascript function to us as en eventAfterRender callback
* @var string the javascript code that implements the eventAfterRender function
*/
public $eventAfterRender = "";
/**
* The javascript function to us as en eventAfterAllRender callback
* @var string the javascript code that implements the eventAfterAllRender function
*/
public $eventAfterAllRender = "";
/**
* Initializes the widget.
* If you override this method, make sure you call the parent implementation first.
*/
public function init()
{
//checks for the element id
if (!isset($this->options['id'])) {
$this->options['id'] = $this->getId();
}
parent::init();
}
/**
* Renders the widget.
*/
public function run()
{
$this->registerClientScript();
Html::addCssClass($this->options, 'form-control');
$this->options['data-plugin-name'] = $this->_pluginName;
$this->options['multiple'] = true;
if ($this->hasModel()) {
return Html::activeListBox($this->model, $this->attribute, $this->items, $this->options);
} else {
return Html::listBox($this->name, $this->selection, $this->items, $this->options);
}
}
/**
* Registers the FullCalendar javascript assets and builds the requiered js for the widget and the related events
*/
protected function registerClientScript()
{
$view = $this->getView();
/** @var \yii\web\AssetBundle $assetClass */
$assets = CoreAsset::register($view);
$id = (array_key_exists('id', $this->options)) ? $this->options['id'] : Html::getInputId($this->model, $this->attribute);
$js = array();
$cleanOptions = $this->getClientOptions();
$js[] = "jQuery('#$id').bootstrapDualListbox($cleanOptions);";
$view->registerJs(implode("\n", $js),View::POS_READY);
}
/**
* @return array the options for the text field
*/
protected function getClientOptions()
{
$id = $this->options['id'];
$options['loading'] = new JsExpression("function(isLoading, view ) {
jQuery('#{$id}').find('.fc-loading').toggle(isLoading);
}");
$options = array_merge($options, $this->clientOptions);
return Json::encode($options);
}
}