From d07f439c117a970b21b3129e3f381718e381fa45 Mon Sep 17 00:00:00 2001 From: Butschster Date: Thu, 18 Feb 2016 23:46:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D0=B8=D0=BD=D1=82=D0=B0=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Произведен рефакторинг кода, внесено много изменений, переработаны классы Column и FormItem, они стале более гибкими, исправлено множество недочетов При выводе списка в виде таблицы, добавлена возможность задавать ширину столбца. Добавлен новый тип поля FormItem::wysiwyg, который позволяет подключить средствами KodiCMS редактор текста --- src/ColumnFilters/Date.php | 4 + src/ColumnFilters/Range.php | 1 + src/ColumnFilters/Select.php | 6 + src/ColumnFilters/Text.php | 3 + src/Columns/Column/Action.php | 18 ++- src/Columns/Column/BaseColumn.php | 69 ++++++++- src/Columns/Column/Checkbox.php | 21 ++- src/Columns/Column/ColumnHeader.php | 2 +- src/Columns/Column/Control.php | 19 ++- src/Columns/Column/Count.php | 19 ++- src/Columns/Column/Custom.php | 19 ++- src/Columns/Column/DateTime.php | 18 ++- src/Columns/Column/Email.php | 14 +- src/Columns/Column/Filter.php | 21 ++- src/Columns/Column/Image.php | 10 +- src/Columns/Column/Link.php | 48 ++++-- src/Columns/Column/Lists.php | 17 ++- src/Columns/Column/NamedColumn.php | 2 + src/Columns/Column/Order.php | 15 +- src/Columns/Column/String.php | 19 ++- src/Columns/Column/Url.php | 19 ++- src/Display/DisplayDatatables.php | 3 + src/Display/DisplayDatatablesAsync.php | 44 ++++-- src/Display/DisplayTab.php | 2 +- src/Display/DisplayTable.php | 11 ++ src/Display/DisplayTree.php | 1 + src/Filter/FilterBase.php | 1 + src/Filter/FilterRelated.php | 6 +- src/Form/FormDefault.php | 29 ++-- src/FormItems/BaseDateTime.php | 2 + src/FormItems/BaseFormItem.php | 5 + src/FormItems/CKEditor.php | 42 ++++-- src/FormItems/Checkbox.php | 6 +- src/FormItems/Columns.php | 39 +++-- src/FormItems/Custom.php | 1 + src/FormItems/Date.php | 5 - src/FormItems/File.php | 5 - src/FormItems/FormItem.php | 1 + src/FormItems/Hidden.php | 5 +- src/FormItems/Image.php | 9 +- src/FormItems/Images.php | 5 +- src/FormItems/MultiSelect.php | 6 +- src/FormItems/NamedFormItem.php | 16 ++ src/FormItems/Password.php | 4 - src/FormItems/Radio.php | 4 - src/FormItems/Select.php | 6 +- src/FormItems/Text.php | 4 - src/FormItems/TextAddon.php | 5 - src/FormItems/Textarea.php | 6 +- src/FormItems/Time.php | 5 - src/FormItems/Timestamp.php | 5 - src/FormItems/Wysiwyg.php | 140 ++++++++++++++++++ src/Providers/FormItemServiceProvider.php | 1 + src/SleepingOwlModels/User.php | 21 +-- .../views/default/column/action.blade.php | 2 +- .../views/default/column/checkbox.blade.php | 2 +- .../views/default/column/control.blade.php | 2 +- .../views/default/column/count.blade.php | 2 +- .../views/default/column/custom.blade.php | 2 +- .../views/default/column/datetime.blade.php | 2 +- .../views/default/column/email.blade.php | 2 +- .../views/default/column/filter.blade.php | 5 +- .../views/default/column/header.blade.php | 4 +- .../views/default/column/image.blade.php | 2 +- .../views/default/column/link.blade.php | 4 +- .../views/default/column/lists.blade.php | 2 +- .../views/default/column/order.blade.php | 2 +- .../views/default/column/string.blade.php | 2 +- .../views/default/column/url.blade.php | 6 +- src/resources/views/default/content.blade.php | 2 +- .../views/default/display/table.blade.php | 6 +- .../views/default/formitem/wysiwyg.blade.php | 23 +++ 72 files changed, 651 insertions(+), 230 deletions(-) create mode 100644 src/FormItems/Wysiwyg.php create mode 100644 src/resources/views/default/formitem/wysiwyg.blade.php diff --git a/src/ColumnFilters/Date.php b/src/ColumnFilters/Date.php index 7afdc2b..9f35488 100644 --- a/src/ColumnFilters/Date.php +++ b/src/ColumnFilters/Date.php @@ -120,9 +120,11 @@ public function getWidth() public function setWidth($width) { intval($width); + if ($width < 0) { $width = 0; } + $this->width = (int) $width; return $this; @@ -169,6 +171,7 @@ public function apply( if (empty($search)) { return; } + try { $time = Carbon::createFromFormat($this->getFormat(), $search); } catch (Exception $e) { @@ -178,6 +181,7 @@ public function apply( return; } } + $time = $time->format($this->getSearchFormat()); $name = $column->getName(); if ($repository->hasColumn($name)) { diff --git a/src/ColumnFilters/Range.php b/src/ColumnFilters/Range.php index b105228..3d0b8e8 100644 --- a/src/ColumnFilters/Range.php +++ b/src/ColumnFilters/Range.php @@ -110,6 +110,7 @@ public function apply( if (! empty($from)) { $this->getFrom()->apply($repository, $column, $query, $from, $fullSearch, '>='); } + if (! empty($to)) { $this->getTo()->apply($repository, $column, $query, $to, $fullSearch, '<='); } diff --git a/src/ColumnFilters/Select.php b/src/ColumnFilters/Select.php index cf91743..2e184fe 100644 --- a/src/ColumnFilters/Select.php +++ b/src/ColumnFilters/Select.php @@ -109,6 +109,7 @@ public function getOptions() if (! is_null($this->getModel()) and ! is_null($this->getDisplay())) { $this->loadOptions(); } + $options = $this->options; asort($options); @@ -179,14 +180,17 @@ public function apply( if ($search === '') { return; } + if ($this->getFilterField()) { $query->where($this->getFilterField(), '=', $search); return; } + if ($operator == 'like') { $search = '%'.$search.'%'; } + $name = $column->getName(); if ($repository->hasColumn($name)) { $query->where($name, $operator, $search); @@ -205,9 +209,11 @@ protected function loadOptions() $repository = new BaseRepository($this->getModel()); $key = $repository->getModel()->getKeyName(); $options = $repository->query()->get()->lists($this->getDisplay(), $key); + if ($options instanceof Collection) { $options = $options->all(); } + $options = array_unique($options); $this->setOptions($options); } diff --git a/src/ColumnFilters/Text.php b/src/ColumnFilters/Text.php index ede2f72..f8e9f4c 100644 --- a/src/ColumnFilters/Text.php +++ b/src/ColumnFilters/Text.php @@ -59,10 +59,13 @@ public function apply( if (empty($search)) { return; } + if ($operator == 'like') { $search = '%'.$search.'%'; } + $name = $column->getName(); + if ($repository->hasColumn($name)) { $query->where($name, $operator, $search); } elseif (strpos($name, '.') !== false) { diff --git a/src/Columns/Column/Action.php b/src/Columns/Column/Action.php index 62047b4..1712f98 100644 --- a/src/Columns/Column/Action.php +++ b/src/Columns/Column/Action.php @@ -43,6 +43,11 @@ class Action extends NamedColumn implements ColumnActionInterface */ protected $url; + /** + * @var string + */ + protected $view = 'column.action'; + /** * @param string $name */ @@ -50,6 +55,8 @@ public function __construct($name) { parent::__construct($name); $this->setOrderable(false); + + $this->setAttribute('class', 'row-action'); } /** @@ -148,19 +155,15 @@ public function setValue($value) return $this; } - /** - * Render action button. - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory - */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.action', [ + return parent::toArray() + [ 'icon' => $this->icon(), 'style' => $this->style(), 'value' => $this->value(), 'target' => $this->target(), 'url' => $this->url(), - ]); + ]; } /** @@ -172,6 +175,7 @@ public function getUrl() if (is_callable($this->url)) { return call_user_func($this->url, $this->getModel()); } + if (! is_null($this->getModel())) { return strtr($this->url, [':id' => $this->getModel()->getKey()]); } diff --git a/src/Columns/Column/BaseColumn.php b/src/Columns/Column/BaseColumn.php index 2caf841..c472fba 100644 --- a/src/Columns/Column/BaseColumn.php +++ b/src/Columns/Column/BaseColumn.php @@ -4,35 +4,49 @@ use Meta; use Illuminate\Database\Eloquent\Model; +use KodiCMS\Support\Traits\HtmlAttributes; +use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Support\Renderable; use KodiCMS\SleepingOwlAdmin\Model\ModelConfiguration; use KodiCMS\SleepingOwlAdmin\Interfaces\ColumnInterface; -abstract class BaseColumn implements Renderable, ColumnInterface +abstract class BaseColumn implements Renderable, ColumnInterface, Arrayable { + use HtmlAttributes; + /** * Column header. + * * @var ColumnHeader */ protected $header; /** * Model instance currently rendering. + * * @var Model */ protected $model; /** * Column appendant. + * * @var ColumnInterface */ protected $append; /** - * @var + * Column width. + * + * @var string */ protected $width = null; + /** + * @var string + */ + protected $view; + public function __construct() { $this->header = new ColumnHeader; @@ -74,6 +88,27 @@ public function setWidth($width) return $this; } + /** + * @return string + */ + public function getView() + { + if (is_null($this->view)) { + $reflect = new \ReflectionClass($this); + $this->view = 'column.'.strtolower($reflect->getShortName()); + } + + return $this->view; + } + + /** + * @param string $view + */ + public function setView($view) + { + $this->view = $view; + } + /** * @return ColumnInterface */ @@ -111,6 +146,7 @@ public function setModel(Model $model) { $this->model = $model; $append = $this->getAppend(); + if (! is_null($append) && ($append instanceof ColumnInterface)) { $append->setModel($model); } @@ -136,7 +172,7 @@ protected function getModelConfiguration() */ public function setLabel($title) { - $this->header->setTitle($title); + $this->getHeader()->setTitle($title); return $this; } @@ -148,7 +184,7 @@ public function setLabel($title) */ public function setOrderable($orderable) { - $this->header->setOrderable($orderable); + $this->getHeader()->setOrderable($orderable); return $this; } @@ -159,7 +195,19 @@ public function setOrderable($orderable) */ public function isOrderable() { - return $this->header()->isOrderable(); + return $this->getHeader()->isOrderable(); + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return [ + 'attributes' => $this->getAttributes() + ]; } /** @@ -169,4 +217,15 @@ public function __toString() { return (string) $this->render(); } + + /** + * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + */ + public function render() + { + return app('sleeping_owl.template')->view( + $this->getView(), + $this->toArray() + ); + } } diff --git a/src/Columns/Column/Checkbox.php b/src/Columns/Column/Checkbox.php index 2fd8f3c..79491b1 100644 --- a/src/Columns/Column/Checkbox.php +++ b/src/Columns/Column/Checkbox.php @@ -2,22 +2,33 @@ namespace KodiCMS\SleepingOwlAdmin\Columns\Column; +use Form; + class Checkbox extends BaseColumn { + /** + * @var string + */ + protected $view = 'column.checkbox'; + public function __construct() { parent::__construct(); - $this->setLabel(''); + $this->setLabel( + Form::checkbox(null, 1, ['class' => 'adminCheckboxAll'] + )); + $this->setOrderable(false); + $this->setAttribute('class', 'row-checkbox'); } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.checkbox', [ + return parent::toArray() + [ 'value' => $this->getModel()->getKey(), - ]); + ]; } } diff --git a/src/Columns/Column/ColumnHeader.php b/src/Columns/Column/ColumnHeader.php index d1b0063..1bef28d 100644 --- a/src/Columns/Column/ColumnHeader.php +++ b/src/Columns/Column/ColumnHeader.php @@ -61,7 +61,7 @@ public function render() { return app('sleeping_owl.template')->view('column.header', [ 'title' => $this->getTitle(), - 'orderable' => $this->isOrderable(), + 'orderable' => $this->isOrderable() ? 'true' : 'false', ]); } diff --git a/src/Columns/Column/Control.php b/src/Columns/Column/Control.php index 1a95e1b..544ce4f 100644 --- a/src/Columns/Column/Control.php +++ b/src/Columns/Column/Control.php @@ -5,10 +5,9 @@ class Control extends BaseColumn { /** - * Column view. * @var string */ - protected $view = 'control'; + protected $view = 'column.control'; /** * @var string @@ -19,6 +18,8 @@ public function __construct() { parent::__construct(); $this->setOrderable(false); + + $this->setAttribute('class', 'row-control'); } /** @@ -31,6 +32,7 @@ protected function getModelKey() /** * Check if instance supports soft-deletes and trashed. + * * @return bool */ protected function isTrashed() @@ -44,6 +46,7 @@ protected function isTrashed() /** * Check if instance editable. + * * @return bool */ protected function isEditable() @@ -62,6 +65,7 @@ protected function getEditUrl() /** * Check if instance is deletable. + * * @return bool */ protected function isDeletable() @@ -71,6 +75,7 @@ protected function isDeletable() /** * Get instance delete url. + * * @return string */ protected function getDeleteUrl() @@ -80,6 +85,7 @@ protected function getDeleteUrl() /** * Check if instance is restorable. + * * @return bool */ protected function isRestorable() @@ -89,6 +95,7 @@ protected function isRestorable() /** * Get instance restore url. + * * @return string */ protected function getRestoreUrl() @@ -97,17 +104,17 @@ protected function getRestoreUrl() } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.'.$this->view, [ + return parent::toArray() + [ 'editable' => $this->isEditable(), 'editUrl' => $this->getEditUrl(), 'deletable' => $this->isDeletable(), 'deleteUrl' => $this->getDeleteUrl(), 'restorable' => $this->isRestorable(), 'restoreUrl' => $this->getRestoreUrl(), - ]); + ]; } } diff --git a/src/Columns/Column/Count.php b/src/Columns/Column/Count.php index cf46f5d..8bc99b8 100644 --- a/src/Columns/Column/Count.php +++ b/src/Columns/Column/Count.php @@ -5,13 +5,24 @@ class Count extends NamedColumn { /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @var string */ - public function render() + protected $view = 'column.count'; + + public function __construct($name) + { + parent::__construct($name); + $this->setAttribute('class', 'row-count'); + } + + /** + * @return array + */ + public function toArray() { - return app('sleeping_owl.template')->view('column.count', [ + return parent::toArray() + [ 'value' => count($this->getModelValue()), 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/Custom.php b/src/Columns/Column/Custom.php index 443c6eb..9cfeac6 100644 --- a/src/Columns/Column/Custom.php +++ b/src/Columns/Column/Custom.php @@ -12,6 +12,17 @@ class Custom extends BaseColumn */ protected $callback; + /** + * @var string + */ + protected $view = 'column.custom'; + + public function __construct() + { + parent::__construct(); + $this->setAttribute('class', 'row-custom'); + } + /** * @return Closure */ @@ -50,14 +61,14 @@ protected function getValue(Model $model) } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array * @throws \Exception */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.custom', [ + return parent::toArray() + [ 'value' => $this->getValue($this->getModel()), 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/DateTime.php b/src/Columns/Column/DateTime.php index acbb2ea..dd80990 100644 --- a/src/Columns/Column/DateTime.php +++ b/src/Columns/Column/DateTime.php @@ -12,6 +12,12 @@ class DateTime extends NamedColumn */ protected $format; + public function __construct($name) + { + parent::__construct($name); + $this->setAttribute('class', 'row-control'); + } + /** * @return string */ @@ -35,21 +41,25 @@ public function setFormat($format) /** * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory */ - public function render() + public function toArray() { - $value = $this->getModelValue(); + $value = $this->getModelValue(); $originalValue = $value; + if (! is_null($value)) { if (! $value instanceof Carbon) { $value = Carbon::parse($value); } + $value = $value->format($this->getFormat()); } - return app('sleeping_owl.template')->view('column.datetime', [ + $this->setAttribute('data-order', $originalValue); + + return parent::toArray() + [ 'value' => $value, 'originalValue' => $originalValue, 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/Email.php b/src/Columns/Column/Email.php index 5f7fbaf..b335743 100644 --- a/src/Columns/Column/Email.php +++ b/src/Columns/Column/Email.php @@ -4,14 +4,20 @@ class Email extends NamedColumn { + public function __construct($name) + { + parent::__construct($name); + $this->setAttribute('class', 'row-email'); + } + /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.email', [ + return parent::toArray() + [ 'value' => $this->getModelValue(), 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/Filter.php b/src/Columns/Column/Filter.php index 0e79c24..dc9c785 100644 --- a/src/Columns/Column/Filter.php +++ b/src/Columns/Column/Filter.php @@ -16,6 +16,12 @@ class Filter extends NamedColumn */ protected $field; + public function __construct($name) + { + parent::__construct($name); + $this->setAttribute('class', 'row-filter'); + } + /** * @return string */ @@ -81,14 +87,15 @@ protected function isSelf() } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.filter', [ - 'isSelf' => $this->isSelf(), - 'url' => $this->getUrl(), - 'value' => $this->getValue($this->getModel(), $this->getField()), - ]); + return parent::toArray() + [ + 'icon' => $this->isSelf() ? 'fa-filter' : 'fa-arrow-circle-o-right', + 'title' => $this->isSelf() ? trans('sleepingowl::core.table.filter') : trans('sleepingowl::core.table.filter-goto'), + 'url' => $this->getUrl(), + 'value' => $this->getValue($this->getModel(), $this->getField()), + ]; } } diff --git a/src/Columns/Column/Image.php b/src/Columns/Column/Image.php index 7ba471a..176a391 100644 --- a/src/Columns/Column/Image.php +++ b/src/Columns/Column/Image.php @@ -11,21 +11,23 @@ public function __construct($name) { parent::__construct($name); $this->setOrderable(false); + + $this->setAttribute('class', 'row-image'); } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { $value = $this->getModelValue(); if (! empty($value) && (strpos($value, '://') === false)) { $value = asset($value); } - return app('sleeping_owl.template')->view('column.image', [ + return parent::toArray() + [ 'value' => $value, 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/Link.php b/src/Columns/Column/Link.php index 0f76238..b5d6fd9 100644 --- a/src/Columns/Column/Link.php +++ b/src/Columns/Column/Link.php @@ -2,22 +2,48 @@ namespace KodiCMS\SleepingOwlAdmin\Columns\Column; -use KodiCMS\Support\Traits\HtmlAttributes; - class Link extends NamedColumn { - use HtmlAttributes; + /** + * @var array + */ + protected $linkAttributes = []; + + /** + * @param $name + */ + public function __construct($name) + { + parent::__construct($name); + $this->setAttribute('class', 'row-link'); + } + + /** + * @return array + */ + public function getLinkAttributes() + { + return $this->linkAttributes; + } + + /** + * @param array $linkAttributes + */ + public function setLinkAttributes(array $linkAttributes) + { + $this->linkAttributes = $linkAttributes; + } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.link', [ - 'value' => $this->getModelValue(), - 'link' => $this->getModelConfiguration()->getEditUrl($this->getModel()->getKey()), - 'append' => $this->getAppend(), - 'attributes' => $this->getAttributes(), - ]); + return parent::toArray() + [ + 'value' => $this->getModelValue(), + 'link' => $this->getModelConfiguration()->getEditUrl($this->getModel()->getKey()), + 'append' => $this->getAppend(), + 'linkAttributes' => $this->getLinkAttributes() + ]; } } diff --git a/src/Columns/Column/Lists.php b/src/Columns/Column/Lists.php index b0f0a4d..4d39465 100644 --- a/src/Columns/Column/Lists.php +++ b/src/Columns/Column/Lists.php @@ -5,13 +5,22 @@ class Lists extends NamedColumn { /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @param $name */ - public function render() + public function __construct($name) { - return app('sleeping_owl.template')->view('column.lists', [ + parent::__construct($name); + $this->setAttribute('class', 'row-lists'); + } + + /** + * @return array + */ + public function toArray() + { + return parent::toArray() + [ 'values' => $this->getModelValue(), 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/NamedColumn.php b/src/Columns/Column/NamedColumn.php index 53bf264..64f89b4 100644 --- a/src/Columns/Column/NamedColumn.php +++ b/src/Columns/Column/NamedColumn.php @@ -63,11 +63,13 @@ protected function getValueFromObject($instance, $name) { $parts = explode('.', $name); $part = array_shift($parts); + if ($instance instanceof Collection) { $instance = $instance->lists($part); } else { $instance = $instance->{$part}; } + if (! empty($parts) && ! is_null($instance)) { return $this->getValueFromObject($instance, implode('.', $parts)); } diff --git a/src/Columns/Column/Order.php b/src/Columns/Column/Order.php index 6d3e9d3..7ba0c0f 100644 --- a/src/Columns/Column/Order.php +++ b/src/Columns/Column/Order.php @@ -21,6 +21,7 @@ function ($model, $id) { return back(); }, ]); + Route::post('{adminModel}/{adminModelId}/down', [ 'as' => 'admin.model.move-down', function ($model, $id) { @@ -32,6 +33,12 @@ function ($model, $id) { ]); } + public function __construct() + { + parent::__construct(); + $this->setAttribute('class', 'row-order'); + } + /** * Get order value from instance. * @return int @@ -93,15 +100,15 @@ protected function moveDownUrl() } /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return array */ - public function render() + public function toArray() { - return app('sleeping_owl.template')->view('column.order', [ + return parent::toArray() + [ 'movableUp' => $this->movableUp(), 'moveUpUrl' => $this->moveUpUrl(), 'movableDown' => $this->movableDown(), 'moveDownUrl' => $this->moveDownUrl(), - ]); + ]; } } diff --git a/src/Columns/Column/String.php b/src/Columns/Column/String.php index 1e9c067..00dc84b 100644 --- a/src/Columns/Column/String.php +++ b/src/Columns/Column/String.php @@ -5,13 +5,24 @@ class String extends NamedColumn { /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * String constructor. + * + * @param $name */ - public function render() + public function __construct($name) { - return app('sleeping_owl.template')->view('column.string', [ + parent::__construct($name); + $this->setAttribute('class', 'row-string'); + } + + /** + * @return array + */ + public function toArray() + { + return parent::toArray() + [ 'value' => $this->getModelValue(), 'append' => $this->getAppend(), - ]); + ]; } } diff --git a/src/Columns/Column/Url.php b/src/Columns/Column/Url.php index 7dea5cb..2859406 100644 --- a/src/Columns/Column/Url.php +++ b/src/Columns/Column/Url.php @@ -5,12 +5,23 @@ class Url extends NamedColumn { /** - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * String constructor. + * + * @param $name */ - public function render() + public function __construct($name) { - return app('sleeping_owl.template')->view('column.url', [ + parent::__construct($name); + $this->setAttribute('class', 'row-url'); + } + + /** + * @return array + */ + public function toArray() + { + return parent::toArray() + [ 'url' => $this->getModelValue(), - ]); + ]; } } diff --git a/src/Display/DisplayDatatables.php b/src/Display/DisplayDatatables.php index 24cd260..2849481 100644 --- a/src/Display/DisplayDatatables.php +++ b/src/Display/DisplayDatatables.php @@ -58,6 +58,7 @@ public function setOrder($order) if (! is_array($order)) { $order = func_get_args(); } + $this->order = $order; return $this; @@ -81,6 +82,7 @@ public function setColumnFilters($columnFilters) if (! is_array($columnFilters)) { $columnFilters = func_get_args(); } + $this->columnFilters = $columnFilters; return $this; @@ -104,6 +106,7 @@ public function setAttributes($attributes) if (! is_array($attributes)) { $attributes = func_get_args(); } + $this->attributes = $attributes; return $this; diff --git a/src/Display/DisplayDatatablesAsync.php b/src/Display/DisplayDatatablesAsync.php index bcbee1a..42db909 100644 --- a/src/Display/DisplayDatatablesAsync.php +++ b/src/Display/DisplayDatatablesAsync.php @@ -2,6 +2,8 @@ namespace KodiCMS\SleepingOwlAdmin\Display; +use Illuminate\Database\Query\Builder; +use Illuminate\Support\Collection; use Input; use Route; use KodiCMS\SleepingOwlAdmin\Columns\Column\String; @@ -15,8 +17,7 @@ class DisplayDatatablesAsync extends DisplayDatatables implements WithRoutesInte */ public static function registerRoutes() { - Route::get('{adminModel}/async/{adminDisplayName?}', [ - 'as' => 'admin.model.async', + Route::get('{adminModel}/async/{adminDisplayName?}', ['as' => 'admin.model.async', function ($model, $name = null) { $display = $model->display(); if ($display instanceof DisplayTabbed) { @@ -61,6 +62,12 @@ protected static function findDatatablesAsyncByName(DisplayTabbed $display, $nam */ protected $distinct; + /** + * DisplayDatatablesAsync constructor. + * + * @param string|null $name + * @param string|null $distinct + */ public function __construct($name = null, $distinct = null) { $this->setName($name); @@ -130,15 +137,20 @@ public function renderAsync() { $query = $this->getRepository()->getQuery(); $totalCount = $query->count(); + $filteredCount = 0; + if (! is_null($this->distinct)) { $filteredCount = $query->distinct()->count($this->getDistinct()); } + $this->modifyQuery($query); $this->applySearch($query); $this->applyColumnSearch($query); + if (is_null($this->distinct)) { $filteredCount = $query->count(); } + $this->applyOrders($query); $this->applyOffset($query); $collection = $query->get(); @@ -155,9 +167,11 @@ protected function applyOffset($query) { $offset = Input::get('start', 0); $limit = Input::get('length', 10); + if ($limit == -1) { return; } + $query->offset($offset)->limit($limit); } @@ -169,10 +183,12 @@ protected function applyOffset($query) protected function applyOrders($query) { $orders = Input::get('order', []); + foreach ($orders as $order) { $columnIndex = $order['column']; $orderDirection = $order['dir']; $column = $this->allColumns()[$columnIndex]; + if ($column instanceof NamedColumn && $column->isOrderable()) { $name = $column->name(); $query->orderBy($name, $orderDirection); @@ -183,14 +199,15 @@ protected function applyOrders($query) /** * Apply search to the query. * - * @param $query + * @param Builder $query */ - protected function applySearch($query) + protected function applySearch(Builder $query) { $search = Input::get('search.value'); if (is_null($search)) { return; } + $query->where(function ($query) use ($search) { $columns = $this->columns(); foreach ($columns as $column) { @@ -204,14 +221,20 @@ protected function applySearch($query) }); } - protected function applyColumnSearch($query) + /** + * @param Builder $query + */ + protected function applyColumnSearch(Builder $query) { $queryColumns = Input::get('columns', []); + foreach ($queryColumns as $index => $queryColumn) { + $search = array_get($queryColumn, 'search.value'); $fullSearch = array_get($queryColumn, 'search'); $column = array_get($this->columns(), $index); $columnFilter = array_get($this->columnFilters(), $index); + if (! is_null($columnFilter)) { $columnFilter->apply($this->repository, $column, $query, $search, $fullSearch); } @@ -221,26 +244,29 @@ protected function applyColumnSearch($query) /** * Convert collection to the datatables structure. * - * @param $collection - * @param $totalCount - * @param $filteredCount + * @param array|Collection $collection + * @param int $totalCount + * @param int $filteredCount * * @return array */ - protected function prepareDatatablesStructure($collection, $totalCount, $filteredCount) + protected function prepareDatatablesStructure(Collection $collection, $totalCount, $filteredCount) { $columns = $this->allColumns(); + $result = []; $result['draw'] = Input::get('draw', 0); $result['recordsTotal'] = $totalCount; $result['recordsFiltered'] = $filteredCount; $result['data'] = []; + foreach ($collection as $instance) { $_row = []; foreach ($columns as $column) { $column->setInstance($instance); $_row[] = (string) $column; } + $result['data'][] = $_row; } diff --git a/src/Display/DisplayTab.php b/src/Display/DisplayTab.php index a3987bc..485f27e 100644 --- a/src/Display/DisplayTab.php +++ b/src/Display/DisplayTab.php @@ -125,7 +125,7 @@ public function setIcon($icon) } /** - * @return DisplayInterface + * @return DisplayInterface|FormInterface */ public function getContent() { diff --git a/src/Display/DisplayTable.php b/src/Display/DisplayTable.php index dd6f478..62fa1f1 100644 --- a/src/Display/DisplayTable.php +++ b/src/Display/DisplayTable.php @@ -151,6 +151,7 @@ public function setWith($with) if (! is_array($with)) { $with = func_get_args(); } + $this->with = $with; return $this; @@ -182,6 +183,7 @@ public function setFilters($filters) if (! is_array($filters)) { $filters = func_get_args(); } + $this->filters = $filters; return $this; @@ -217,6 +219,7 @@ public function setScopes($scopes) if (! is_array($scopes)) { $scopes = func_get_args(); } + $this->scopes = $scopes; return $this; @@ -252,6 +255,7 @@ public function setActiveFilters($activeFilters) if (! is_array($activeFilters)) { $activeFilters = func_get_args(); } + $this->activeFilters = $activeFilters; return $this; @@ -343,6 +347,7 @@ public function setActions($actions) if (! is_array($actions)) { $actions = func_get_args(); } + $this->actions = $actions; return $this; @@ -420,20 +425,24 @@ protected function initializeAction() $action = Input::get('_action'); $id = Input::get('_id'); $ids = Input::get('_ids'); + if (! is_null($action) && (! is_null($id) || ! is_null($ids))) { $columns = array_merge($this->getColumns(), $this->getActions()); foreach ($columns as $column) { if (! $column instanceof NamedColumnInterface) { continue; } + if ($column->getName() == $action) { $param = null; + if (! is_null($id)) { $param = $this->getRepository()->find($id); } else { $ids = explode(',', $ids); $param = $this->getRepository()->findMany($ids); } + $column->call($param); } } @@ -443,6 +452,7 @@ protected function initializeAction() protected function initializeFilters() { $this->initializeAction(); + foreach ($this->getFilters() as $filter) { $filter->initialize(); if ($filter->isActive()) { @@ -465,6 +475,7 @@ protected function modifyQuery(Builder $query) ], $scope); } } + $this->apply($query); foreach ($this->getActiveFilters() as $filter) { $filter->apply($query); diff --git a/src/Display/DisplayTree.php b/src/Display/DisplayTree.php index 18bc13a..274ddd4 100644 --- a/src/Display/DisplayTree.php +++ b/src/Display/DisplayTree.php @@ -207,6 +207,7 @@ public function setWith($with) if (! is_array($with)) { $with = func_get_args(); } + $this->with = $with; return $this; diff --git a/src/Filter/FilterBase.php b/src/Filter/FilterBase.php index 12249d0..073c986 100644 --- a/src/Filter/FilterBase.php +++ b/src/Filter/FilterBase.php @@ -197,6 +197,7 @@ public function getValue($default = null) if (is_null($this->value)) { $this->value = Input::get($this->getAlias(), $default); } + $params = $this->getOperatorParams(); $method = $params['method']; switch ($method) { diff --git a/src/Filter/FilterRelated.php b/src/Filter/FilterRelated.php index 4478d4c..da4ca0a 100644 --- a/src/Filter/FilterRelated.php +++ b/src/Filter/FilterRelated.php @@ -57,6 +57,7 @@ public function setModel($model) if (! class_exists($model)) { throw new Exception("Class model [$model] not found"); } + $this->model = $model; return $this; @@ -82,15 +83,16 @@ public function getTitle() protected function getDisplayField() { $model = $this->getModel(); + if (is_null($model)) { throw new Exception('Specify model for filter: '.$this->getName()); } + try { $modelObject = app($model)->findOrFail($this->getValue()); return $modelObject->{$this->getDisplay()}; - } catch (ModelNotFoundException $e) { - } + } catch (ModelNotFoundException $e) {} return; } diff --git a/src/Form/FormDefault.php b/src/Form/FormDefault.php index 18bac2d..9a234c4 100644 --- a/src/Form/FormDefault.php +++ b/src/Form/FormDefault.php @@ -2,6 +2,7 @@ namespace KodiCMS\SleepingOwlAdmin\Form; +use Illuminate\Support\Collection; use URL; use Input; use Validator; @@ -72,8 +73,10 @@ public function initialize() if ($this->initialized) { return; } + $this->initialized = true; $this->repository = new BaseRepository($this->class); + $this->setModelObject(app($this->class)); $this->initializeItems(); } @@ -139,7 +142,7 @@ public function setClass($class) } /** - * @return FormItemInterface[] + * @return Collection[] */ public function getItems() { @@ -156,7 +159,8 @@ public function setItems($items) if (! is_array($items)) { $items = func_get_args(); } - $this->items = $items; + + $this->items = collect($items); return $this; } @@ -177,8 +181,8 @@ public function getModelObject() public function setModelObject(Model $modelObject) { $this->modelObject = $modelObject; - $items = $this->getItems(); - array_walk_recursive($items, function ($item) { + + $this->getItems()->each(function($item) { if ($item instanceof FormItemInterface) { $item->setModel($this->modelObject); } @@ -219,12 +223,13 @@ public function save(ModelConfiguration $model) if ($this->getModel() != $model) { return; } - $items = $this->getItems(); - array_walk_recursive($items, function ($item) { + + $this->getItems()->each(function($item) { if ($item instanceof FormItemInterface) { $item->save(); } }); + $this->getModelObject()->save(); } @@ -238,18 +243,21 @@ public function validate(ModelConfiguration $model) if ($this->getModel() != $model) { return; } + $rules = []; - $items = $this->getItems(); - array_walk_recursive($items, function ($item) use (&$rules) { + + $this->getItems()->each(function($item) use (&$rules) { if ($item instanceof FormItemInterface) { $rules += $item->getValidationRules(); } }); + $data = Input::all(); $verifier = app('validation.presence'); $verifier->setConnection($this->getModelObject()->getConnectionName()); $validator = Validator::make($data, $rules); $validator->setPresenceVerifier($verifier); + if ($validator->fails()) { return $validator; } @@ -262,7 +270,7 @@ public function validate(ModelConfiguration $model) */ public function render() { - return app('sleeping_owl.template')->view('form.'.$this->view, $this->getParams()); + return app('sleeping_owl.template')->view('form.'.$this->getView(), $this->getParams()); } /** @@ -299,7 +307,8 @@ public function getParams() protected function initializeItems() { $items = $this->getItems(); - array_walk_recursive($items, function ($item) { + + $this->getItems()->each(function($item) { if ($item instanceof FormItemInterface) { $item->initialize(); } diff --git a/src/FormItems/BaseDateTime.php b/src/FormItems/BaseDateTime.php index 5bdc876..41cf0ae 100644 --- a/src/FormItems/BaseDateTime.php +++ b/src/FormItems/BaseDateTime.php @@ -50,6 +50,7 @@ public function getValue() if (empty($value)) { $value = null; } + if (! is_null($value)) { try { $time = Carbon::parse($value); @@ -60,6 +61,7 @@ public function getValue() return; } } + $value = $time->format($this->getFormat()); } diff --git a/src/FormItems/BaseFormItem.php b/src/FormItems/BaseFormItem.php index f9edf71..9bea4b1 100644 --- a/src/FormItems/BaseFormItem.php +++ b/src/FormItems/BaseFormItem.php @@ -35,6 +35,11 @@ public function initialize() */ public function getView() { + if (is_null($this->view)) { + $reflect = new \ReflectionClass($this); + $this->view = strtolower($reflect->getShortName()); + } + return $this->view; } diff --git a/src/FormItems/CKEditor.php b/src/FormItems/CKEditor.php index 1edc94d..8575210 100644 --- a/src/FormItems/CKEditor.php +++ b/src/FormItems/CKEditor.php @@ -12,21 +12,28 @@ class CKEditor extends NamedFormItem implements WithRoutesInterface { + /** + * @var array + */ + protected static $allowedExtensions = [ + 'bmp', + 'gif', + 'jpg', + 'jpeg', + 'png', + ]; + public static function registerRoutes() { Route::get('assets/images/all', function () { return static::getAll(); }); + Route::post('assets/images/upload', function () { return static::postUpload(); }); } - /** - * @var string - */ - protected $view = 'ckeditor'; - /** * @return array */ @@ -75,13 +82,7 @@ protected static function postUpload() { $path = config('sleeping_owl.imagesUploadDirectory').'/'; $upload_dir = public_path($path); - $allowedExtensions = [ - 'bmp', - 'gif', - 'jpg', - 'jpeg', - 'png', - ]; + $maxsize = 2000; $maxwidth = 9000; $maxheight = 8000; @@ -92,21 +93,28 @@ protected static function postUpload() $extension = null; $width = 0; $height = 0; + try { if (is_null($file)) { $errors[] = trans('sleepingowl::core.ckeditor.upload.error.common'); throw new Exception; } + $extension = $file->guessClientExtension(); - if (! in_array($extension, $allowedExtensions)) { + + if (! in_array($extension, static::allowedExtensions)) { $errors[] = trans('sleepingowl::core.ckeditor.upload.error.wrong_extension', ['file' => $file->getClientOriginalName()]); throw new Exception; } + if ($file->getSize() > $maxsize * 1000) { + $errors[] = trans('sleepingowl::core.ckeditor.upload.error.filesize_limit', ['size' => $maxsize]); } + list($width, $height) = getimagesize($file); + if ($width > $maxwidth || $height > $maxheight) { $errors[] = trans('sleepingowl::core.ckeditor.upload.error.imagesize_max_limit', [ 'width' => $width, @@ -115,6 +123,7 @@ protected static function postUpload() 'maxheight' => $maxheight, ]); } + if ($width < $minwidth || $height < $minheight) { $errors[] = trans('sleepingowl::core.ckeditor.upload.error.imagesize_min_limit', [ 'width' => $width, @@ -123,20 +132,23 @@ protected static function postUpload() 'minheight' => $minheight, ]); } - } catch (Exception $e) { - } + } catch (Exception $e) {} + if (! empty($errors)) { return ''; } + $finalFilename = $file->getClientOriginalName(); $file = $file->move($upload_dir, $finalFilename); $CKEditorFuncNum = Input::get('CKEditorFuncNum'); $url = asset($path.$finalFilename); + $message = trans('sleepingowl::core.ckeditor.upload.success', [ 'size' => number_format($file->getSize() / 1024, 3, '.', ''), 'width' => $width, 'height' => $height, ]); + $result = "window.parent.CKEDITOR.tools.callFunction($CKEditorFuncNum, '$url', '$message')"; return ''; diff --git a/src/FormItems/Checkbox.php b/src/FormItems/Checkbox.php index 5548c3b..297f877 100644 --- a/src/FormItems/Checkbox.php +++ b/src/FormItems/Checkbox.php @@ -6,17 +6,13 @@ class Checkbox extends NamedFormItem { - /** - * @var string - */ - protected $view = 'checkbox'; - public function save() { $name = $this->getName(); if (! Input::has($name)) { Input::merge([$name => 0]); } + parent::save(); } } diff --git a/src/FormItems/Columns.php b/src/FormItems/Columns.php index dfb500a..7478dc5 100644 --- a/src/FormItems/Columns.php +++ b/src/FormItems/Columns.php @@ -4,24 +4,26 @@ use Closure; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Collection; use KodiCMS\SleepingOwlAdmin\Interfaces\FormItemInterface; class Columns extends BaseFormItem { /** - * @var string + * @var Collection */ - protected $view = 'columns'; + protected $columns; - /** - * @var array - */ - protected $columns = []; + public function __construct() + { + $this->columns = new Collection(); + } public function initialize() { parent::initialize(); - $this->all(function ($item) { + + $this->applyCallbackToItems(function (FormItemInterface $item) { $item->initialize(); }); } @@ -35,13 +37,22 @@ public function getColumns() } /** - * @param array $columns + * @param Collection $columns * * @return $this */ - public function setColumns(array $columns) + public function setColumns(Collection $columns) + { + $this->columns = collect($columns); + + return $this; + } + + public function addColumn(Closure $callback) { - $this->columns = $columns; + $this->columns->push( + new Collection($callback()) + ); return $this; } @@ -54,7 +65,8 @@ public function setColumns(array $columns) public function setModel(Model $model) { parent::setModel($model); - $this->all(function ($item) use ($model) { + + $this->applyCallbackToItems(function (FormItemInterface $item) use ($model) { $item->setModel($model); }); @@ -91,7 +103,8 @@ public function getValidationRules() public function save() { parent::save(); - $this->all(function ($item) { + + $this->applyCallbackToItems(function (FormItemInterface $item) { $item->save(); }); } @@ -99,7 +112,7 @@ public function save() /** * @param Closure $callback */ - protected function all(Closure $callback) + protected function applyCallbackToItems(Closure $callback) { foreach ($this->getColumns() as $columnItems) { foreach ($columnItems as $item) { diff --git a/src/FormItems/Custom.php b/src/FormItems/Custom.php index c2dddbf..cc09e94 100644 --- a/src/FormItems/Custom.php +++ b/src/FormItems/Custom.php @@ -71,6 +71,7 @@ public function render() public function save() { $callback = $this->getCallback(); + if (is_callable($callback)) { call_user_func($callback, $this->getModel()); } diff --git a/src/FormItems/Date.php b/src/FormItems/Date.php index 23f51f3..ba9df1a 100644 --- a/src/FormItems/Date.php +++ b/src/FormItems/Date.php @@ -4,11 +4,6 @@ class Date extends BaseDateTime { - /** - * @var string - */ - protected $view = 'date'; - /** * @var string */ diff --git a/src/FormItems/File.php b/src/FormItems/File.php index 558e3eb..1a45d90 100644 --- a/src/FormItems/File.php +++ b/src/FormItems/File.php @@ -4,11 +4,6 @@ class File extends Image { - /** - * @var string - */ - protected $view = 'file'; - /** * @var string */ diff --git a/src/FormItems/FormItem.php b/src/FormItems/FormItem.php index b735d2a..61408e0 100644 --- a/src/FormItems/FormItem.php +++ b/src/FormItems/FormItem.php @@ -25,6 +25,7 @@ * @method static \KodiCMS\SleepingOwlAdmin\FormItems\CKEditor ckeditor($name, $label = null) * @method static \KodiCMS\SleepingOwlAdmin\FormItems\Textarea textarea($name, $label = null) * @method static \KodiCMS\SleepingOwlAdmin\FormItems\Radio radio($name, $label = null) + * @method static \KodiCMS\SleepingOwlAdmin\FormItems\Wysiwyg wysiwyg($name, $label = null) */ class FormItem extends AliasBinder { diff --git a/src/FormItems/Hidden.php b/src/FormItems/Hidden.php index fcec323..c38e628 100644 --- a/src/FormItems/Hidden.php +++ b/src/FormItems/Hidden.php @@ -4,8 +4,5 @@ class Hidden extends NamedFormItem { - /** - * @var string - */ - protected $view = 'hidden'; + } diff --git a/src/FormItems/Image.php b/src/FormItems/Image.php index 4bbc678..de3f7ac 100644 --- a/src/FormItems/Image.php +++ b/src/FormItems/Image.php @@ -10,11 +10,6 @@ class Image extends NamedFormItem implements WithRoutesInterface { - /** - * @var string - */ - protected $view = 'image'; - /** * @var string */ @@ -22,13 +17,13 @@ class Image extends NamedFormItem implements WithRoutesInterface public static function registerRoutes() { - Route::post('formitems/image/'.static::$route, [ - 'as' => 'admin.formitems.image.'.static::$route, + Route::post('formitems/image/'.static::$route, ['as' => 'admin.formitems.image.'.static::$route, function () { $validator = Validator::make(Input::all(), static::uploadValidationRules()); if ($validator->fails()) { return Response::make($validator->errors()->get('file'), 400); } + $file = Input::file('file'); $filename = md5(time().$file->getClientOriginalName()).'.'.$file->getClientOriginalExtension(); $path = config('sleeping_owl.imagesUploadDirectory'); diff --git a/src/FormItems/Images.php b/src/FormItems/Images.php index ccd104e..fddc703 100644 --- a/src/FormItems/Images.php +++ b/src/FormItems/Images.php @@ -7,8 +7,6 @@ class Images extends Image { - protected $view = 'images'; - public function initialize() { Meta::loadPackage(get_class()); @@ -18,11 +16,13 @@ public function save() { $name = $this->getName(); $value = Input::get($name, ''); + if (! empty($value)) { $value = explode(',', $value); } else { $value = []; } + Input::merge([$name => $value]); parent::save(); } @@ -36,6 +36,7 @@ public function value() if (is_null($value)) { $value = []; } + if (is_string($value)) { $value = preg_split('/,/', $value, -1, PREG_SPLIT_NO_EMPTY); } diff --git a/src/FormItems/MultiSelect.php b/src/FormItems/MultiSelect.php index 285f68d..8256706 100644 --- a/src/FormItems/MultiSelect.php +++ b/src/FormItems/MultiSelect.php @@ -7,11 +7,6 @@ class MultiSelect extends Select { - /** - * @var string - */ - protected $view = 'multiselect'; - /** * @return string */ @@ -30,6 +25,7 @@ public function getValue() if ($value instanceof Collection && $value->count() > 0) { $value = $value->lists($value->first()->getKeyName()); } + if ($value instanceof Collection) { $value = $value->toArray(); } diff --git a/src/FormItems/NamedFormItem.php b/src/FormItems/NamedFormItem.php index ef2bcfd..4d33c71 100644 --- a/src/FormItems/NamedFormItem.php +++ b/src/FormItems/NamedFormItem.php @@ -50,6 +50,7 @@ public function __construct($path, $label = null) $this->setLabel($label); $parts = explode('.', $path); $this->setPath($path); + if (count($parts) > 1) { $this->setName($parts[0].'['.implode('][', array_slice($parts, 1)).']'); $this->setAttribute(implode('.', array_slice(explode('.', $path), -1, 1))); @@ -208,10 +209,12 @@ public function getValue() if (! is_null($value = old($this->getPath()))) { return $value; } + $input = Input::all(); if (($value = array_get($input, $this->getPath())) !== null) { return $value; } + if (! is_null($model) && ! is_null($value = $model->getAttribute($this->getAttribute()))) { return $value; } @@ -227,8 +230,10 @@ public function getValidationRules() $rules = parent::getValidationRules(); array_walk($rules, function (&$item) { $model = $this->getModel(); + if ($item == '_unique') { $table = $model->getTable(); + $item = 'unique:'.$table.','.$this->getAttribute(); if ($model->exists()) { $item .= ','.$model->getKey(); @@ -277,11 +282,22 @@ public function getParams() public function save() { $attribute = $this->getAttribute(); + if (Input::get($this->getPath()) === null) { $value = null; } else { $value = $this->getValue(); } + + $this->setValue($attribute, $value); + } + + /** + * @param string $attribute + * @param mixed $value + */ + protected function setValue($attribute, $value) + { $this->getModel()->setAttribute($attribute, $value); } } diff --git a/src/FormItems/Password.php b/src/FormItems/Password.php index 3ac5fa9..709cae3 100644 --- a/src/FormItems/Password.php +++ b/src/FormItems/Password.php @@ -4,8 +4,4 @@ class Password extends NamedFormItem { - /** - * @var string - */ - protected $view = 'password'; } diff --git a/src/FormItems/Radio.php b/src/FormItems/Radio.php index c6752d5..81f6408 100644 --- a/src/FormItems/Radio.php +++ b/src/FormItems/Radio.php @@ -4,8 +4,4 @@ class Radio extends Select { - /** - * @var string - */ - protected $view = 'radio'; } diff --git a/src/FormItems/Select.php b/src/FormItems/Select.php index fef26b8..b7388bb 100644 --- a/src/FormItems/Select.php +++ b/src/FormItems/Select.php @@ -8,11 +8,6 @@ class Select extends NamedFormItem { - /** - * @var string - */ - protected $view = 'select'; - /** * @var Model */ @@ -81,6 +76,7 @@ public function getOptions() if (! is_null($this->getModelForOptions()) && ! is_null($this->getDisplay())) { $this->loadOptions(); } + $options = $this->options; asort($options); diff --git a/src/FormItems/Text.php b/src/FormItems/Text.php index af9ead5..c14557e 100644 --- a/src/FormItems/Text.php +++ b/src/FormItems/Text.php @@ -4,8 +4,4 @@ class Text extends NamedFormItem { - /** - * @var string - */ - protected $view = 'text'; } diff --git a/src/FormItems/TextAddon.php b/src/FormItems/TextAddon.php index 93a1cc7..d0aa70e 100644 --- a/src/FormItems/TextAddon.php +++ b/src/FormItems/TextAddon.php @@ -4,11 +4,6 @@ class TextAddon extends NamedFormItem { - /** - * @var string - */ - protected $view = 'textaddon'; - /** * @var string */ diff --git a/src/FormItems/Textarea.php b/src/FormItems/Textarea.php index 9db42f5..7ea0609 100644 --- a/src/FormItems/Textarea.php +++ b/src/FormItems/Textarea.php @@ -4,11 +4,6 @@ class Textarea extends NamedFormItem { - /** - * @var string - */ - protected $view = 'textarea'; - /** * @var int */ @@ -33,6 +28,7 @@ public function setRows($rows) if ($rows < 1) { $rows = 1; } + $this->rows = $rows; return $this; diff --git a/src/FormItems/Time.php b/src/FormItems/Time.php index 6113010..39d4dd0 100644 --- a/src/FormItems/Time.php +++ b/src/FormItems/Time.php @@ -4,11 +4,6 @@ class Time extends BaseDateTime { - /** - * @var string - */ - protected $view = 'time'; - /** * @var string */ diff --git a/src/FormItems/Timestamp.php b/src/FormItems/Timestamp.php index 88b53b7..bb70583 100644 --- a/src/FormItems/Timestamp.php +++ b/src/FormItems/Timestamp.php @@ -4,11 +4,6 @@ class Timestamp extends BaseDateTime { - /** - * @var string - */ - protected $view = 'timestamp'; - /** * @var string */ diff --git a/src/FormItems/Wysiwyg.php b/src/FormItems/Wysiwyg.php new file mode 100644 index 0000000..9295482 --- /dev/null +++ b/src/FormItems/Wysiwyg.php @@ -0,0 +1,140 @@ +