false, 'labeled' => false ); private $_structure = array( 'options' => array(), 'content' => '', 'icon' => '', 'type' => '', 'container' => self::BUTTON_CONTAINER_BUTTON, 'size' => self::BUTTON_SIZE_MEDIUM, 'attr' => array(), 'id' => '', 'class' => '', 'dropdown' => array() ); public function __construct($content = '', $type = 'default', $options = array()) { $this->_init_structure($type, $content, $options); } private function _init_structure($type, $content, $user_options) { $this->_structure = Util::array_to_object($this->_structure); $this->_structure->type = $type; $this->_structure->content = $content; $this->_structure->options = Util::set_array_prop_def($this->_options_map, $user_options); } public function __call($name, $args) { return parent::_call($this, $this->_structure, $name, $args); } public function __set($name, $value) { if (isset($this->_structure->{$name})) { $this->_structure->{$name} = $value; return; } parent::err('Undefined structure property: '.$name); } public function __get($name) { if (isset($this->_structure->{$name})) { return $this->_structure->{$name}; } parent::err('Undefined structure property: '.$name); return null; } public function print_html($return = false) { $structure = $this->_structure; $icon = Util::get_property_value($structure->icon, array( 'if_closure' => function($icon) { return Util::run_callback($icon, array($this)); }, 'if_array' => function($icon) { parent::err('parent::Widget::icon requires string.'); return ''; } )); $container = Util::get_property_value($structure->container, array( 'if_closure' => function($container) { return Util::run_callback($container, array($this)); }, 'if_array' => function($container) { parent::err('parent::Widget::container requires string.'); return ''; } )); $content = Util::get_property_value($structure->content, array( 'if_closure' => function($content) { return Util::run_callback($content, array($this)); }, 'if_array' => function($content) { parent::err('parent::Widget::content requires string.'); return ''; } )); $attr = Util::get_property_value($structure->attr, array( 'if_closure' => function($attr) { $callback_return = Util::run_callback($attr, $array($this)); if (is_array($callback_return)) return $callback_return; else return array($callback_return); }, 'if_array' => function($attr) { $attrs = array(); foreach ($attr as $key => $value) { $attrs[] = $key.'="'.$value.'"'; } return $attrs; }, 'if_other' => function($attr) { return array($attr); } )); $class = Util::get_property_value($structure->class, array( "if_closure" => function($class) { return Util::run_callback($class, array($this)); }, "if_array" => function($class) { return implode(' ', $class); } )); $type = Util::get_property_value($structure->type, array( 'if_array' => function($class) { parent::err('parent::Button:type requires string.'); return parent::BUTTON_TYPE_DEFAULT; } )); $classes = array(); // labeled and icon if (trim($icon)) { $icon = ''; if ($structure->options['labeled']) { $classes[] = 'btn-labeled'; $icon = $structure->options['labeled'] ? ''.$icon.'' : $icon; } $content = $icon.' '.$content; } // custom class if ($class) $classes[] = $class; // size $size_class = ''; if ($structure->size) { $size_class = 'btn-'.$structure->size; $classes[] = $size_class; } // disabled $disabled = $structure->options['disabled'] ? 'disabled' : ''; $classes[] = $disabled; $class_htm = $classes ? ' '.implode(' ', $classes) : ''; $result = ''; if ($structure->id) $attr[] = 'id="'.$structure->id.'"'; if ($structure->dropdown) { $dd_prop = array( 'items' => array(), 'multilevel' => false, 'split' => false, 'attr' => array(), 'class' => '', 'id' => '' ); $new_dd_prop = Util::get_clean_structure($dd_prop, $structure->dropdown, array($this), 'items'); if (is_array($new_dd_prop['items'])) { $dropdown_html = parent::print_dropdown($new_dd_prop['items'], array( 'multilevel' => $new_dd_prop['multilevel'], 'class' => $new_dd_prop['class'], 'attr' => $new_dd_prop['attr'], 'id' => $new_dd_prop['id'] ), true); } else { $dropdown_html = $new_dd_prop['items']; } if ($new_dd_prop['split']) { $split_prop = array( 'type' => $type, 'disabled' => false, 'dropup' => false, 'class' => array(), 'attr' => array() ); $new_split_prop = Util::get_clean_structure($split_prop, $new_dd_prop['split'], array($this, $new_dd_prop), 'type'); $split_attrs = array(); if (is_array($new_split_prop['attr'])) { foreach ($new_split_prop['attr'] as $split_attr => $value) { $split_attrs[] = $split_attr.'="'.$value.'"'; } } else { $split_attrs[] = $new_split_prop['attr']; } $split_classes = array(); if (is_array($new_split_prop['class'])) $split_classes[] = implode(' ', $new_split_prop['class']); else $split_classes[] = $new_split_prop['class']; $split_classes[] = $size_class; $split_class_htm = $split_classes ? ' '.implode(' ', $split_classes) : ''; $btn_main = '<'.$container.' class="btn btn-'.$type.$class_htm.'" '.implode(' ', $attr).'>'; $btn_main .= $content; $btn_main .= ''.$container.'>'; $btn_dd = '<'.$container.' class="btn btn-'.$new_split_prop['type'].$split_class_htm.' dropdown-toggle" data-toggle="dropdown" '.implode(' ', $split_attrs).'>'; $btn_dd .= ''; $btn_dd .= ''.$container.'>'; $btn_dd .= $dropdown_html; $result .= '