id = $id;
$this->title = $title;
}
public function text($id, $name, $value = null)
{
return $this->addItem('text', $id, $name)->set('value', $value);
}
public function checkbox($id, $name, $label, $checked = null)
{
$checkbox = $this->addItem('checkbox', $id, $name)->set('label', $label);
return $checkbox;
}
public function select($id, $name, $callback)
{
$item = $this->addItem('select', $id, $name);
$select = new OptionFormSelect($id);
call_user_func($callback, $select);
$item->set('view', $select);
return $select;
}
public function textarea($id, $name, $callback)
{
$item = $this->addItem('textarea', $id, $name);
$textarea = new OptionFormTextarea($id);
call_user_func($callback, $textarea);
$item->set('view', $textarea);
return $textarea;
}
public function group($id, $name, $callback)
{
$item = $this->addItem('group', $id, $name);
$group = new OptionFormGroup($id);
call_user_func($callback, $group);
$item->set('view', $group);
return $item;
}
public function addItem($type, $id, $name)
{
$item = new OptionFormItem($id, $name, $type);
$this->items[] = $item;
return $item;
}
public function hint($hint_content)
{
$this->hint = view('vendor.option-form.hint')->with('hint', $hint_content)->render();
return $this;
}
public function addMessage($msg, $type = "info")
{
$this->messages[] = "
$msg
";
}
public function handle($callback = null)
{
if (Arr::get($_POST, 'option') == $this->id) {
if (!is_null($callback)) {
call_user_func($callback, $this);
}
foreach ($this->items as $item) {
if ($item->type == "checkbox" && !isset($_POST[$item->id])) {
// preset value for checkboxes which are not checked
$_POST[$item->id] = "0";
}
if (Str::is('*[*]', $item->id))
continue;
if ($_POST[$item->id] != option($item->id, null, false)) {
Option::set($item->id, $_POST[$item->id]);
}
}
session()->flash($this->id.'.status', 'success');
}
return $this;
}
public function always($callback)
{
$this->alwaysCallback = $callback;
return $this;
}
public function render()
{
if (!is_null($this->alwaysCallback)) {
call_user_func($this->alwaysCallback, $this);
}
foreach ($this->items as $item) {
$id = $item->id;
if (!$value = $item->get('value')) {
preg_match('/(.*)\[(.*)\]/', $id, $matches);
if (isset($matches[2])) {
$option = @unserialize(option($matches[1]));
$value = Arr::get($option, $matches[2]);
} else {
$value = option($item->id);
}
}
switch ($item->type) {
case 'text':
$view = view('vendor.option-form.text')->with(compact('id', 'value'));
break;
case 'checkbox':
$view = view('vendor.option-form.checkbox')->with([
'id' => $id,
'label' => $item->get('label'),
'checked' => (bool) $value
]);
break;
case 'select':
case 'textarea':
case 'group':
$view = $item->get('view')->render();
break;
}
$item->setContent($view->render());
}
return view('vendor.option-form.main')->with(get_object_vars($this))->render();
}
}
class OptionFormItem
{
public $id;
public $type;
public $title;
protected $data;
protected $hint;
protected $content;
public function __construct($id, $title, $type = "")
{
$this->id = $id;
$this->type = $type;
$this->title = $title;
}
public function hint($hint_content)
{
$this->hint = view('vendor.option-form.hint')->with('hint', $hint_content)->render();
return $this;
}
public function setContent($content)
{
$this->content = $content;
return $this;
}
public function set($key, $value)
{
$this->data[$key] = $value;
return $this;
}
public function get($key)
{
return Arr::get($this->data, $key);
}
public function render()
{
return view('vendor.option-form.item')->with([
'title' => $this->title,
'content' => $this->content,
'hint' => $this->hint
]);
}
}
class OptionFormSelect
{
protected $id;
protected $items;
protected $selected = null;
public function __construct($id)
{
$this->id = $id;
}
public function add($id, $name)
{
$this->items[] = [$id, $name];
}
public function setSelected($id)
{
$this->selected = $id;
}
public function render()
{
if (is_null($this->selected)) {
$this->selected = option($this->id);
}
return view('vendor.option-form.select')->with([
'id' => $this->id,
'items' => $this->items,
'selected' => $this->selected
]);
}
}
class OptionFormTextarea
{
protected $id;
protected $value;
protected $rows = 3;
protected $description = "";
public function __construct($id)
{
$this->id = $id;
}
public function setContent($content)
{
$this->value = $content;
}
public function setRows($rows)
{
$this->rows = $rows;
}
public function setDescription($description)
{
$this->description = $description;
}
public function render()
{
if (is_null($this->value)) {
$this->value = option($this->id);
}
return view('vendor.option-form.textarea')->with([
'rows' => $this->rows,
'id' => $this->id,
'value' => $this->value,
'description' => $this->description
]);
}
}
class OptionFormGroup
{
protected $id;
protected $items = [];
public function __construct($id)
{
$this->id = $id;
}
public function text($id, $value = null)
{
$this->items[] = ['type' => 'text', 'id' => $id, 'value' => $value];
}
public function addon($value)
{
$this->items[] = ['type' => 'addon', 'id' => null, 'value' => $value];
}
public function render()
{
$rendered = [];
foreach ($this->items as $item) {
if ($item['id'] && is_null($item['value'])) {
$item['value'] = option($item['id'], null, false);
}
$rendered[] = view('vendor.option-form.'.$item['type'])->withId($item['id'])->withValue($item['value']);
}
return view('vendor.option-form.group')->with('items', $rendered);
}
}