From 7614450fa7e19e962d6c984dad1823cd2125a83c Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Fri, 24 May 2013 02:41:00 +0400 Subject: [PATCH] jQuery UI menu widget --- framework/yii/jui/Menu.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 framework/yii/jui/Menu.php diff --git a/framework/yii/jui/Menu.php b/framework/yii/jui/Menu.php new file mode 100644 index 0000000..0a84acf --- /dev/null +++ b/framework/yii/jui/Menu.php @@ -0,0 +1,86 @@ + + * @since 2.0 + */ +class Menu extends \yii\widgets\Menu +{ + /** + * @var array the options for the underlying jQuery UI widget. + * Please refer to the corresponding jQuery UI widget Web page for possible options. + * For example, [this page](http://api.jqueryui.com/accordion/) shows + * how to use the "Accordion" widget and the supported options (e.g. "header"). + */ + public $clientOptions = array(); + /** + * @var array the event handlers for the underlying jQuery UI widget. + * Please refer to the corresponding jQuery UI widget Web page for possible events. + * For example, [this page](http://api.jqueryui.com/accordion/) shows + * how to use the "Accordion" widget and the supported events (e.g. "create"). + */ + public $clientEvents = array(); + + + /** + * Initializes the widget. + * If you override this method, make sure you call the parent implementation first. + */ + public function init() + { + parent::init(); + if (!isset($this->options['id'])) { + $this->options['id'] = $this->getId(); + } + } + + /** + * Renders the widget. + */ + public function run() + { + parent::run(); + $this->registerWidget('menu'); + } + + /** + * Registers a specific jQuery UI widget and the related events + * @param string $name the name of the jQuery UI widget + */ + protected function registerWidget($name) + { + $id = $this->options['id']; + $view = $this->getView(); + $view->registerAssetBundle("yii/jui/$name"); + $view->registerAssetBundle(Widget::$theme . "/$name"); + + if ($this->clientOptions !== false) { + $options = empty($this->clientOptions) ? '' : Json::encode($this->clientOptions); + $js = "jQuery('#$id').$name($options);"; + $view->registerJs($js); + } + + if (!empty($this->clientEvents)) { + $js = array(); + foreach ($this->clientEvents as $event => $handler) { + $js[] = "jQuery('#$id').on('$name$event', $handler);"; + } + $view->registerJs(implode("\n", $js)); + } + } +}