Files
crm-ms1/lib/smartui/Components/Wizard.php
2026-05-27 11:44:10 -04:00

219 lines
6.4 KiB
PHP

<?php
namespace SmartUI\Components;
use \SmartUI\UI;
use \SmartUI\Util;
class Wizard extends UI {
const WIZARD_BOOTSTRAP = 'bootstrap';
const WIZARD_FUEL = 'fuel';
private $_options_map = array(
'in_widget' => true,
'type' => Wizard::WIZARD_BOOTSTRAP
);
private $_structure = array(
'options' => array(),
'step' => array(),
'content' => array(),
'widget' => null,
'active' => array(),
'title' => '',
'tabl_class' => 'form-wizard',
'id' => ''
);
public function __construct($steps, $options = array()) {
$this->_init_structure($steps, $options);
}
private function _init_structure($steps, $user_options = array()) {
$this->_structure = Util::array_to_object($this->_structure);
$this->_structure->options = Util::set_array_prop_def($this->_options_map, $user_options);
$this->_structure->step = $steps;
$this->_structure->id = Util::create_id(true);
$widget = new Widget();
$widget->options('editbutton', false)
->header('title', '<h2></h2>');
$this->_structure->widget = $widget;
}
public function __get($name) {
if (isset($this->_structure->{$name})) {
return $this->_structure->{$name};
}
SmartUI::err('Undefined structure property: '.$name);
return null;
}
public function __set($name, $value) {
if (isset($this->_structure->{$name})) {
$this->_structure->{$name} = $value;
return;
}
SmartUI::err('Undefined structure property: '.$name);
}
public function __call($name, $args) {
return parent::_call($this, $this->_structure, $name, $args);
}
private function _get_bootstrap_result() {
$structure = $this->_structure;
$steps = Util::get_property_value($structure->step, array(
'if_closure' => function($steps) {
return SmartUI::run_callback($steps, array($this));
},
'if_other' => function($steps) {
SmartUI::err('SmartUI::Wizard::step requires array');
return null;
}
));
if (!is_array($steps)) {
parent::err("SmartUI::Wizard::step requires array");
return null;
}
$li_list = array();
$step_content_list = array();
$has_active = false;
$step = 1;
foreach ($steps as $step_id => $step_prop) {
$step_structure = array(
'content' => isset($structure->content[$step_id]) ? $structure->content[$step_id] : '',
'title' => isset($structure->title[$step_id]) ? $structure->title[$step_id] : '',
'step' => $step,
'active' => isset($structure->active[$step_id]) && $structure->active[$step_id] === true,
);
$new_step_prop = Util::get_clean_structure($step_structure, $step_prop, array($this, $steps, $step_id), 'title');
foreach ($new_step_prop as $step_prop_key => $step_prop_vaue) {
$new_step_prop_value = Util::get_property_value($step_prop_vaue, array(
'if_closure' => function($prop_value) use ($steps) {
return SmartUI::run_callback($prop_value, array($this, $steps));
}
));
$new_step_prop[$step_prop_key] = $new_step_prop_value;
}
$step_content_classes = array();
$step_content_classes[] = 'tab-pane';
$li_classes = array();
$a_classes = array();
$a_attr = array();
if ((!$structure->active && !$has_active) || ($new_step_prop['active'] === true && !$has_active)) {
$li_classes[] = 'active';
$step_content_classes[] = 'active';
$has_active = true;
}
$title = $new_step_prop['title'];
$href = '#'.$step_id;
$a_attr[] = 'data-toggle="tab"';
$class = $li_classes ? ' class="'.implode(' ', $li_classes).'"' : '';
$li_html = '<li'.$class.' data-target="#'.$step_id.'">';
$li_html .= '<a href="'.$href.'" '.($a_classes ? 'class="'.implode(' ', $a_classes).'"' : '').($a_attr ? ' '.implode(' ', $a_attr) : '').'>';
$li_html .= '<span class="step">'.$new_step_prop['step'].'</span> <span class="title">'.$title.'</span>';
$li_html .= '</a>';
$li_html .= '</li>';
$li_list[] = $li_html;
$step_content_html = '<div class="'.implode(' ', $step_content_classes).'" id="'.$step_id.'">';
$step_content_html .= $new_step_prop['content'];
$step_content_html .= '</div>';
$step_content_list[] = $step_content_html;
$step++;
}
$ul_classes = array();
$ul_classes[] = 'bootstrapWizard';
$ul_classes[] = $structure->tabl_class;
$content_classes = array();
$content_classes[] = 'tab-content';
$content_html = '<div class="'.implode(' ', $content_classes).'">';
$content_html .= implode('', $step_content_list);
$content_html .= ' <div class="form-actions">
<div class="row">
<div class="col-sm-12">
<ul class="pager wizard no-margin">
<!--<li class="previous first disabled">
<a href="javascript:void(0);" class="btn btn-lg btn-default"> First </a>
</li>-->
<li class="previous disabled">
<a href="javascript:void(0);" class="btn btn-lg btn-default"> Previous </a>
</li>
<!--<li class="next last">
<a href="javascript:void(0);" class="btn btn-lg btn-primary"> Last </a>
</li>-->
<li class="next">
<a href="javascript:void(0);" class="btn btn-lg txt-color-darken"> Next </a>
</li>
</ul>
</div>
</div>
</div>';
$content_html .= '</div>';
$ul_html = '<div class="form-bootstrapWizard">';
$ul_html .= ' <ul class="'.implode(' ', $ul_classes).'">';
$ul_html .= implode('', $li_list);
$ul_html .= ' </ul>';
$ul_html .= ' <div class="clearfix"></div>';
$ul_html .= '</div>';
$main_content_html = '<div class="row">';
$main_content_html .= ' <div class="col-sm-12" id="'.$structure->id.'">';
$main_content_html .= $ul_html.$content_html;
$main_content_html .= ' </div>';
$main_content_html .= '</div>';
if (isset($structure->options["in_widget"]) && $structure->options["in_widget"]) {
$structure->widget->body("content", $main_content_html);
if ($structure->title) {
$structure->widget->header('title', $structure->title);
}
$result = $structure->widget->print_html(true);
} else $result = $main_content_html;
return $result;
}
private function _get_fuel_result() {
}
public function print_html($return = false) {
switch ($this->_structure->options["type"]) {
case Wizard::WIZARD_BOOTSTRAP:
$result = self::_get_bootstrap_result();
break;
default:
parent::err('SmartUI::Wizard Invalid Wizard Type: wizard "'.$this->_structure->options["type"].'" not found.');
break;
}
if ($return) return $result;
else echo $result;
}
}
?>