FEATURE: force history to save even module_settings fields

This commit is contained in:
Michal Kváček
2016-04-01 20:47:55 +02:00
parent 3f03af7e03
commit 811f2162c9
2 changed files with 47 additions and 9 deletions
+12 -2
View File
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin;
use App\Enumerations\ContentStatuses; use App\Enumerations\ContentStatuses;
use App\Enumerations\ModulesHandlerToId; use App\Enumerations\ModulesHandlerToId;
use App\Http\Requests\EditContentRequest; use App\Http\Requests\EditContentRequest;
use App\Http\Requests\Request;
use App\Models\Content; use App\Models\Content;
use App\Models\ContentHistory; use App\Models\ContentHistory;
use App\Models\File; use App\Models\File;
@@ -111,7 +112,8 @@ class EditContent extends Controller
]; ];
// save new values with history // save new values with history
list($revision, $changedColumns) = $page->updateWithHistory($fields, $this->getFields($request, $fields)); $data = self::getFields($request, $fields);
list($revision, $changedColumns) = $page->updateWithHistory($fields, $data);
$changedColumns += call_user_func_array([$page->module_handler, 'edit'], [&$page, $request, $revision]); $changedColumns += call_user_func_array([$page->module_handler, 'edit'], [&$page, $request, $revision]);
@@ -275,7 +277,15 @@ class EditContent extends Controller
])); ]));
} }
private function getFields(EditContentRequest $request, $fields) /**
* Convert object of all request data into array of only wanted fields
*
* @param Request $request
* @param $fields
*
* @return array
*/
public static function getFields(Request $request, $fields)
{ {
$requestData = []; $requestData = [];
+35 -7
View File
@@ -14,10 +14,13 @@ class Content extends Model
public $timestamps = true; public $timestamps = true;
protected $fillable = [ protected $fillable = [
'user_id', 'user_id',
'parent_id',
'module_handler', 'module_handler',
'published_from', 'published_from',
'published_to', 'published_to',
'title_photo', 'title_photo',
'template',
'is_homepage',
'title', 'title',
'url', 'url',
'meta_keywords', 'meta_keywords',
@@ -152,15 +155,31 @@ class Content extends Model
foreach ($fields as $fieldDB => $fieldRequest) { foreach ($fields as $fieldDB => $fieldRequest) {
// ignore non-existing fields // ignore non-existing fields
if ((!isset($this->$fieldDB) && !is_null($this->$fieldDB)) || (!isset($request[$fieldRequest]) && !is_null($request[$fieldRequest]))) { if (!isset($request[$fieldRequest]) && !is_null($request[$fieldRequest])) {
continue; continue;
} }
// remove any whitespaces around real content // if module settings is still JSON, decode it to normal stdClass
if (!is_null($request[$fieldRequest])) if (is_string($this->module_settings)) {
$request[$fieldRequest] = trim($request[$fieldRequest]); $this->module_settings = json_decode($this->module_settings);
}
if (trim($this->$fieldDB) != $request[$fieldRequest]) { // are we editing common settings, or module-specific settings?
if (!in_array($fieldDB, $this->fillable)) {
// this field is not part of "core" content - probably it will be module settings
$commonField = false;
$fieldValue = $this->module_settings->$fieldDB;
} else {
$commonField = true;
$fieldValue = $this->$fieldDB;
}
// remove any whitespaces around real content
if (!is_null($request[$fieldRequest])) {
$request[$fieldRequest] = trim($request[$fieldRequest]);
}
if (trim($fieldValue) != $request[$fieldRequest]) {
// setup history object // setup history object
$history = [ $history = [
@@ -168,7 +187,7 @@ class Content extends Model
'content_id' => $this->id, 'content_id' => $this->id,
'edit_batch' => $revisionId, 'edit_batch' => $revisionId,
'column' => $fieldRequest, 'column' => $fieldRequest,
'old_value' => $this->$fieldDB, 'old_value' => $fieldValue,
'new_value' => $request[$fieldRequest] 'new_value' => $request[$fieldRequest]
]; ];
@@ -176,12 +195,21 @@ class Content extends Model
ContentHistory::create($history); ContentHistory::create($history);
// save change into database // save change into database
$this->$fieldDB = $request[$fieldRequest]; if ($commonField) {
$this->$fieldDB = $request[$fieldRequest];
} else {
$this->module_settings->$fieldDB = $request[$fieldRequest];
}
$changed++; $changed++;
} }
} }
// make JSON from stdClass
if (!is_string($this->module_settings)) {
$this->module_settings = json_encode($this->module_settings);
}
$this->save(); $this->save();
return [$revisionId, $changed]; return [$revisionId, $changed];