123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- <?php
- /**
- * Created by PhpStorm.
- * Author: ljt
- * DateTime: 2016/11/4 14:15
- * Description:
- */
- namespace backend\widgets\iconpicker;
- use yii\helpers\ArrayHelper;
- use yii\helpers\Html;
- use yii\helpers\Json;
- use yii\web\JsExpression;
- use yii\widgets\InputWidget;
- class IconPickerWidget extends InputWidget
- {
- /**
- * @var string $iconset - one of allowed variants
- * glyphicon|ionicon|fontawesome|weathericon|mapicon|octicon|typicon|elusiveicon|materialdesign
- */
- public $iconset = 'fontawesome';
- /**
- * @var array $pickerOptions additional html options for picker button
- */
- public $pickerOptions = ['class' => 'btn btn-default btn-sm'];
- /**
- * @var array $containerOptions additional html options for container
- */
- public $containerOptions = [];
- /**
- * @var array $clientOptions - iconpicker options
- * (will be merged with defaultOptions @see getDefaultOptions() , so you can set only overrides)
- * @see http://victor-valencia.github.io/bootstrap-iconpicker/
- **/
- public $clientOptions
- = [
- 'rows' => 5,
- 'columns' => 10,
- 'placement' => 'right',
- 'align' => 'center',
- 'arrowClass' => 'btn-primary',
- 'header' => true,
- 'footer' => true,
- 'labelHeader' => '{0} / {1}',
- 'labelFooter' => '{0} - {1}:[{2}]',
- 'search' => true,
- 'searchText' => 'Search icon',
- 'selectedClass' => 'btn-warning',
- 'unselectedClass' => 'btn-default',
- ];
- /**
- * @var JsExpression $onSelectIconCallback
- * @example
- * onSelectIconCallback=>new JsExpression('function(e){
- * var icon = e.icon;
- * icon = "some "+icon;
- * $('#target').val(icon);
- * }'),
- */
- public $onSelectIconCallback;
- /**
- * @var
- */
- private $_id;
- /**
- * @var string
- */
- private $_default = '';
- /**
- *
- */
- public function init()
- {
- if (!isset($this->options['id']) && !$this->hasModel()) {
- $this->options['id'] = 'iconpicker_' . $this->getId();
- }
- parent::init();
- $this->_id = $this->options['id'];
- if ($this->hasModel() && !empty($this->model->{$this->attribute})) {
- $this->_default = $this->pickerOptions['data-icon'] = $this->model->{$this->attribute};
- }
- if (!$this->hasModel() && !empty($this->value)) {
- $this->_default = $this->pickerOptions['data-icon'] = $this->value;
- }
- if (!isset($this->pickerOptions['id'])) {
- $this->pickerOptions['id'] = $this->_id . '_jspicker';
- }
- $this->clientOptions = ArrayHelper::merge($this->getDefaultOptions(), $this->clientOptions);
- $this->registerAssets();
- }
- /**
- * Default js-plugin options
- *
- * @return array
- **/
- protected function getDefaultOptions()
- {
- return [
- 'iconset' => $this->iconset,
- 'rows' => 5,
- 'columns' => 10,
- 'placement' => 'right',
- 'align' => 'center',
- 'arrowClass' => 'btn-primary',
- 'header' => true,
- 'footer' => true,
- 'labelHeader' => '{0} / {1}',
- 'labelFooter' => '{0} - {1}:[{2}]',
- 'search' => true,
- 'searchText' => 'SEARCH_ICON',
- 'selectedClass' => 'btn-warning',
- 'unselectedClass' => 'btn-default',
- ];
- }
- /**
- * Registers the needed assets
- */
- public function registerAssets()
- {
- $view = $this->getView();
- $targetId = $this->_id;
- $iconPickerId = $this->pickerOptions['id'];
- IconPickerAsset::register($this->view);
- $this->clientOptions = ArrayHelper::merge($this->clientOptions, [
- 'icon' => $this->_default,
- ]);
- $this->clientOptions = Json::encode($this->clientOptions);
- $js[] = <<<JS
- $("#{$iconPickerId}").iconpicker({$this->clientOptions});
- JS;
- $callback = null;
- if (!empty($this->onSelectIconCallback)) {
- $callback = $this->onSelectIconCallback instanceof JsExpression
- ? $this->onSelectIconCallback->__toString()
- : $this->onSelectIconCallback;
- }
- $js[] = ($callback)
- ? <<<JS
- $("#{$iconPickerId}").on('change', function(e) {
- var callback = {$callback};
- callback(e);
- });
- JS
- :
- <<<JS
- $("#{$iconPickerId}").on('change', function(e) {
- $('#$targetId').val(e.icon);
- });
- JS;
- $view->registerJs(implode("\n", $js));
- }
- /**
- * @return string bootstrap-picker button with hiddenInput field where we put selected value
- */
- public function run()
- {
- if ($this->hasModel()) {
- $inp = Html::activeHiddenInput($this->model, $this->attribute, $this->options);
- } else {
- $inp = Html::hiddenInput($this->name, $this->value, $this->options);
- }
- $picker = Html::button('CHOOSE_ICON', $this->pickerOptions);
- return Html::tag('div', $picker . $inp, $this->containerOptions);
- }
- }
|