Browse Source

refactored code after feedback

tags/2.0.0-beta
Antonio Ramirez 12 years ago
parent
commit
520e5b954a
  1. 36
      yii/bootstrap/Modal.php
  2. 49
      yii/bootstrap/Widget.php

36
yii/bootstrap/Modal.php

@ -21,10 +21,11 @@ use yii\helpers\ArrayHelper;
* 'id' => 'myModal',
* 'header' => 'Modal Heading',
* 'content' => '<p>One fine body...</p>',
* 'footer' => '//modal/_footer', // we can also use view paths
* 'footer' => 'Modal Footer',
* // if we wish to display a modal button
* 'buttonOptions' => array(
* 'label' => 'Show Modal',
* 'class' => \yii\bootstrap\enum\Button::TYPE_DEFAULT
* 'class' => 'btn btn-primary'
* )
* ));
* ```
@ -139,11 +140,11 @@ class Modal extends Widget
$this->defaultOption('role', 'dialog');
$this->defaultOption('tabindex', '-1');
$this->addOption('class', 'modal');
$this->addOption('class', 'hide');
$this->addClassName('modal');
$this->addClassName('hide');
if ($this->fade)
$this->addOption('class', 'fade');
$this->addClassName('fade');
$this->initPluginOptions();
$this->initPluginEvents();
@ -243,7 +244,7 @@ class Modal extends Widget
echo Html::beginTag('div', array('class'=>'modal-header'));
if ($this->closeText)
echo Html::button($this->closeText, null, null, array('data-dismiss' => 'modal', 'class'=>'close'));
echo $this->renderSection($this->header);
echo $this->header;
echo Html::endTag('div');
}
@ -253,7 +254,7 @@ class Modal extends Widget
public function renderModalBody()
{
echo Html::beginTag('div', array('class'=>'modal-body'));
echo $this->renderSection($this->content);
echo $this->content;
echo Html::endTag('div');
}
@ -264,37 +265,22 @@ class Modal extends Widget
{
echo Html::beginTag('div', array('class'=>'modal-footer'));
echo $this->renderSection($this->footer);
echo $this->footer;
echo Html::endTag('div');
}
/**
* Renders a section. If the section is a view file, the returned string will be the contents of the view file,
* otherwise, it will return the string in the $section variable.
* @param string $section
* @return string
*/
public function renderSection($section)
{
$viewFile = Yii::getAlias($section);
if (is_file($viewFile))
return $this->view->renderFile($viewFile, array(), $this);
return $section;
}
/**
* Registers client scripts
*/
public function registerScript()
{
$id = '#' . ArrayHelper::getValue($this->options, 'id');
// do we render a button? If so, bootstrap will handle its behavior through its
// mark-up, otherwise, register the plugin.
if(empty($this->buttonOptions))
$this->registerPlugin($id, $this->pluginOptions);
$this->registerPlugin('modal', $this->pluginOptions);
// register events
$this->registerEvents($id, $this->events);
$this->registerEvents($this->events);
}
}

49
yii/bootstrap/Widget.php

@ -31,11 +31,6 @@ class Widget extends \yii\base\Widget
public $options = array();
/**
* @var string the widget name (ie. modal, typeahead, tab)
*/
protected $name;
/**
* Initializes the widget.
*/
public function init()
@ -48,11 +43,10 @@ class Widget extends \yii\base\Widget
* Registers plugin events with the API.
* @param string $selector the CSS selector.
* @param string[] $events the JavaScript event configuration (name=>handler).
* @param int $position the position of the JavaScript code.
* @return boolean whether the events were registered.
* @todo To be discussed
*/
protected function registerEvents($selector, $events = array(), $position = View::POS_END)
protected function registerEvents($selector, $events = array())
{
if (empty($events))
return;
@ -63,24 +57,24 @@ class Widget extends \yii\base\Widget
? $handler
: new JsExpression($handler);
$script .= ";jQuery(document).ready(function (){jQuery('{$selector}').on('{$name}', {$handler});});";
$script .= ";jQuery('{$selector}').on('{$name}', {$handler});";
}
if (!empty($script))
$this->view->registerJs($script, array('position' => $position));
$this->view->registerJs($script);
}
/**
* Registers a specific Bootstrap plugin using the given selector and options.
*
* @param string $selector the CSS selector
* @param string $name the name of the javascript widget to initialize
* @param array $options the Javascript options for the plugin
* @param int $position the position of the JavaScript code
*/
public function registerPlugin($selector, $options = array(), $position = View::POS_END)
public function registerPlugin($name, $options = array())
{
$selector = '#' . ArrayHelper::getValue($this->options, 'id');
$options = !empty($options) ? Json::encode($options) : '';
$script = ";jQuery(document).ready(function (){jQuery('{$selector}').{$this->name}({$options});});";
$this->view->registerJs($script, array('position' => $position));
$script = ";jQuery('{$selector}').{$name}({$options});";
$this->view->registerJs($script);
}
/**
@ -89,31 +83,28 @@ class Widget extends \yii\base\Widget
*/
public function registerBundle($responsive = false)
{
$bundle = $responsive ? 'yii/bootstrap' : 'yii/bootstrap-responsive';
$bundle = $responsive ? 'yii/bootstrap-responsive' : 'yii/bootstrap';
$this->view->registerAssetBundle($bundle);
}
/**
* Adds a new option. If the key does not exists, it will create one, if it exists it will append the value
* and also makes sure the uniqueness of them.
* Adds a new class to options. If the class key does not exists, it will create one, if it exists it will append
* the value and also makes sure the uniqueness of them.
*
* @param string $key
* @param mixed $value
* @param string $glue
* @param string $class
* @return array
*/
protected function addOption($key, $value, $glue = ' ')
protected function addClassName($class)
{
if (isset($this->options[$key])) {
if (!is_array($this->options[$key]))
$this->options[$key] = explode($glue, $this->options[$key]);
$this->options[$key][] = $value;
$this->options[$key] = array_unique($this->options[$key]);
$this->options[$key] = implode($glue, $this->options[$key]);
if (isset($this->options['class'])) {
if (!is_array($this->options['class']))
$this->options['class'] = explode(' ', $this->options['class']);
$this->options['class'][] = $class;
$this->options['class'] = array_unique($this->options['class']);
$this->options['class'] = implode(' ', $this->options['class']);
} else
$this->options[$key] = $value;
$this->options['class'] = $class;
return $this->options;
}

Loading…
Cancel
Save