public function save($data, $delete_the_cache = true)
{
if (is_string($data)) {
$data = parse_params($data);
}
$mw_global_content_memory = array();
$adm = $this->app->user_manager->is_admin();
$table = $this->tables['content'];
$table_data = $this->tables['content_data'];
$checks = mw_var('FORCE_SAVE_CONTENT');
$orig_data = $data;
$stop = false;
if ($stop == true) {
return array('error' => 'You are not logged in as admin to save content!');
}
$cats_modified = false;
if (!empty($data)) {
if (!isset($data['id'])) {
$data['id'] = 0;
}
if ($data['id'] == 0 and !isset($data['is_active'])) {
$data['is_active'] = 1;
}
$this->app->event_manager->trigger('content.before.save', $data);
if (intval($data['id']) == 0) {
if (isset($data['subtype']) and $data['subtype'] == 'post' and !isset($data['content_type'])) {
$data['subtype'] = 'post';
$data['content_type'] = 'post';
}
if (!isset($data['subtype'])) {
$data['subtype'] = 'post';
}
if (!isset($data['content_type'])) {
$data['content_type'] = 'post';
}
}
}
if (isset($data['content_url']) and !isset($data['url'])) {
$data['url'] = $data['content_url'];
}
if (!isset($data['parent']) and isset($data['content_parent'])) {
$data['parent'] = $data['content_parent'];
}
if (isset($data['parent'])) {
$data['parent'] = intval($data['parent']);
}
if (isset($data['is_active'])) {
if ($data['is_active'] === 'y') {
$data['is_active'] = 1;
} elseif ($data['is_active'] === 'n') {
$data['is_active'] = 0;
}
}
$data_to_save = $data;
if (!isset($data['title']) and isset($data['content_title'])) {
$data['title'] = $data['content_title'];
}
if (isset($data['title'])) {
$data['title'] = strip_tags($data['title']);
$data['title'] = htmlspecialchars($data['title'], ENT_QUOTES, 'UTF-8');
$data_to_save['title'] = $data['title'];
}
if (!isset($data['url']) and intval($data['id']) != 0) {
$q = $this->get_by_id($data_to_save['id']);
$thetitle = $q['title'];
$q = $q['url'];
$theurl = $q;
} else {
if (isset($data['url'])) {
$theurl = $data['url'];
} else {
$theurl = $data['title'];
}
$thetitle = $data['title'];
}
if (isset($data['id']) and intval($data['id']) == 0) {
if (!isset($data['is_deleted']) or $data['is_deleted'] == '') {
$data_to_save['is_deleted'] = 0;
} else {
$data_to_save['is_deleted'] = $data['is_deleted'];
}
if (!isset($data['title']) or $data['title'] == '') {
$data['title'] = 'New page';
if (isset($data['content_type']) and $data['content_type'] != 'page') {
$data['title'] = 'New ' . $data['content_type'];
if (isset($data['subtype']) and $data['subtype'] != 'page' and $data['subtype'] != 'post' and $data['subtype'] != 'static' and $data['subtype'] != 'dynamic') {
$data['title'] = 'New ' . $data['subtype'];
}
}
$data_to_save['title'] = $data['title'];
}
}
if (isset($data['url']) == false or $data['url'] == '') {
if (isset($data['title']) != false and intval($data['id']) == 0) {
$data['url'] = $this->app->url_manager->slug($data['title']);
if ($data['url'] == '') {
$data['url'] = date('Y-M-d-His');
}
}
}
$url_changed = false;
if (isset($data['url']) != false and is_string($data['url'])) {
$search_weird_chars = array('%E2%80%99', '%E2%80%99', '%E2%80%98', '%E2%80%9C', '%E2%80%9D');
$str = $data['url'];
$good[] = 9;
#tab
$good[] = 10;
#nl
$good[] = 13;
#cr
for ($a = 32; $a < 127; ++$a) {
$good[] = $a;
}
$newstr = '';
$len = strlen($str);
for ($b = 0; $b < $len + 1; ++$b) {
if (isset($str[$b]) and in_array(ord($str[$b]), $good)) {
$newstr .= $str[$b];
}
}
$newstr = str_replace('--', '-', $newstr);
$newstr = str_replace('--', '-', $newstr);
if ($newstr == '-' or $newstr == '--') {
$newstr = 'post-' . date('YmdHis');
}
$data['url'] = $newstr;
$url_changed = true;
$data_to_save['url'] = $data['url'];
}
if (isset($data['category']) or isset($data['categories'])) {
$cats_modified = true;
}
$table_cats = $this->tables['categories'];
if (isset($data_to_save['title']) and $data_to_save['title'] != '' and (!isset($data['url']) or trim($data['url']) == '')) {
$data['url'] = $this->app->url_manager->slug($data_to_save['title']);
}
if (isset($data['url']) and $data['url'] != false) {
if (trim($data['url']) == '') {
$data['url'] = $this->app->url_manager->slug($data['title']);
}
$data['url'] = $this->app->database_manager->escape_string($data['url']);
$date123 = date('YmdHis');
$get = array();
$get['url'] = $data['url'];
$get['single'] = true;
$q = $this->get($get);
if (!empty($q)) {
if ($data['id'] != $q['id']) {
$orig_slug = $data['url'];
$slug = $data['url'];
$count = 1;
while ($this->get_by_url($slug, true)) {
$slug = $orig_slug . '-' . $count++;
}
$data['url'] = $slug;
$data_to_save['url'] = $data['url'];
}
}
if (isset($data_to_save['url']) and strval($data_to_save['url']) == '' and isset($data_to_save['quick_save']) == false) {
$data_to_save['url'] = $data_to_save['url'] . '-' . $date123;
}
if (isset($data_to_save['title']) and strval($data_to_save['title']) == '' and isset($data_to_save['quick_save']) == false) {
$data_to_save['title'] = 'post-' . $date123;
}
if (isset($data_to_save['url']) and strval($data_to_save['url']) == '' and isset($data_to_save['quick_save']) == false) {
$data_to_save['url'] = strtolower(reduce_double_slashes($data['url']));
}
}
if (isset($data_to_save['url']) and is_string($data_to_save['url'])) {
if ($data_to_save['url'] == '') {
$data_to_save['url'] = date('Y-M-d-His');
}
$data_to_save['url'] = str_replace(site_url(), '', $data_to_save['url']);
}
if (isset($data['created_at'])) {
$data_to_save['created_at'] = $data['created_at'];
}
if (isset($data['updated_at'])) {
$data_to_save['updated_at'] = $data['updated_at'];
}
$data_to_save_options = array();
if (isset($data_to_save['is_home']) and $data_to_save['is_home'] == 'y') {
$data_to_save['is_home'] = 1;
} elseif (isset($data_to_save['is_home']) and $data_to_save['is_home'] == 'n') {
$data_to_save['is_home'] = 0;
}
if (isset($data_to_save['is_shop']) and $data_to_save['is_shop'] === 'y') {
$data_to_save['is_shop'] = 1;
} elseif (isset($data_to_save['is_shop']) and $data_to_save['is_shop'] === 'n') {
$data_to_save['is_shop'] = 0;
}
if (isset($data_to_save['require_login']) and $data_to_save['require_login'] === 'y') {
$data_to_save['require_login'] = 1;
} elseif (isset($data_to_save['require_login']) and $data_to_save['require_login'] === 'n') {
$data_to_save['require_login'] = 0;
}
if (isset($data_to_save['is_home']) and $data_to_save['is_home'] == 1) {
$data_to_save['is_home'] = strval($data_to_save['is_home']);
if ($adm == true) {
$q = Content::where('is_home', 1)->update(array('is_home' => 0));
} else {
$data_to_save['is_home'] = 0;
}
//
}
if (isset($data_to_save['content_type']) and strval($data_to_save['content_type']) == 'post') {
if (isset($data_to_save['subtype']) and strval($data_to_save['subtype']) == 'static') {
$data_to_save['subtype'] = 'post';
} elseif (isset($data_to_save['subtype']) and strval($data_to_save['subtype']) == 'dynamic') {
$data_to_save['subtype'] = 'post';
}
}
if (isset($data_to_save['subtype']) and strval($data_to_save['subtype']) == 'dynamic') {
$check_ex = false;
if (isset($data_to_save['subtype_value']) and trim($data_to_save['subtype_value']) != '' and intval($data_to_save['subtype_value']) > 0) {
$check_ex = $this->app->category_manager->get_by_id(intval($data_to_save['subtype_value']));
}
if ($check_ex == false) {
if (isset($data_to_save['id']) and intval(trim($data_to_save['id'])) > 0) {
$test2 = $this->app->category_manager->get('data_type=category&rel_type=content&rel_id=' . intval($data_to_save['id']));
if (isset($test2[0])) {
$check_ex = $test2[0];
$data_to_save['subtype_value'] = $test2[0]['id'];
}
}
unset($data_to_save['subtype_value']);
}
}
$par_page = false;
if (isset($data_to_save['content_type']) and strval($data_to_save['content_type']) == 'post') {
if (isset($data_to_save['parent']) and intval($data_to_save['parent']) > 0) {
$par_page = $this->get_by_id($data_to_save['parent']);
}
if (is_array($par_page)) {
$change_to_dynamic = true;
if (isset($data_to_save['is_home']) and $data_to_save['is_home'] == 1) {
$change_to_dynamic = false;
}
if ($change_to_dynamic == true and $par_page['subtype'] == 'static') {
$par_page_new = array();
$par_page_new['id'] = $par_page['id'];
$par_page_new['subtype'] = 'dynamic';
$par_page_new = $this->app->database_manager->save($table, $par_page_new);
$cats_modified = true;
}
if (!isset($data_to_save['categories'])) {
$data_to_save['categories'] = '';
}
if (is_string($data_to_save['categories']) and isset($par_page['subtype_value']) and intval($par_page['subtype_value']) != 0) {
$data_to_save['categories'] = $data_to_save['categories'] . ', ' . intval($par_page['subtype_value']);
}
}
$c1 = false;
if (isset($data_to_save['category']) and !isset($data_to_save['categories'])) {
$data_to_save['categories'] = $data_to_save['category'];
}
if (isset($data_to_save['categories']) and $par_page == false) {
if (is_string($data_to_save['categories'])) {
$c1 = explode(',', $data_to_save['categories']);
if (is_array($c1)) {
foreach ($c1 as $item) {
$item = intval($item);
if ($item > 0) {
$cont_cat = $this->get('limit=1&content_type=page&subtype_value=' . $item);
if (isset($cont_cat[0]) and is_array($cont_cat[0])) {
$cont_cat = $cont_cat[0];
if (isset($cont_cat['subtype_value']) and intval($cont_cat['subtype_value']) > 0) {
$data_to_save['parent'] = $cont_cat['id'];
break;
}
}
}
}
}
}
}
}
$allow_remote_images_download = false;
if ($adm == true and isset($data['download_remote_images']) and $data['download_remote_images'] != false) {
$allow_remote_images_download = true;
}
if (isset($data_to_save['content'])) {
if (trim($data_to_save['content']) == '' or $data_to_save['content'] == false) {
$data_to_save['content'] = null;
} else {
if ($allow_remote_images_download) {
$data_to_save['content'] = $this->app->content_manager_helpers->download_remote_images_from_text($data_to_save['content']);
}
$data_to_save['content'] = $this->app->parser->make_tags($data_to_save['content']);
}
}
if (!isset($data_to_save['updated_at'])) {
$data_to_save['updated_at'] = date('Y-m-d H:i:s');
}
if (isset($data_to_save['id']) and intval($data_to_save['id']) == 0 or !isset($data_to_save['id'])) {
if (!isset($data_to_save['position']) or intval($data_to_save['position']) == 0) {
$pos_params = array();
$pos_params['table'] = 'content';
if (isset($data_to_save['content_type']) and strval($data_to_save['content_type']) == 'page') {
$pos_params['content_type'] = $data_to_save['content_type'];
$pos_params['min'] = 'position';
} else {
$pos_params['max'] = 'position';
}
$get_max_pos = $this->app->database_manager->get($pos_params);
if (is_null($get_max_pos)) {
$data_to_save['position'] = 1;
} elseif (is_int($get_max_pos) or is_string($get_max_pos)) {
if (isset($data_to_save['content_type']) and strval($data_to_save['content_type']) == 'page') {
$data_to_save['position'] = intval($get_max_pos) - 1;
} else {
$data_to_save['position'] = intval($get_max_pos) + 1;
}
}
}
$data_to_save['posted_at'] = $data_to_save['updated_at'];
}
$cats_modified = true;
if (isset($data_to_save['url']) and $data_to_save['url'] == $this->app->url_manager->site()) {
unset($data_to_save['url']);
}
$data_to_save['allow_html'] = true;
$this->no_cache = true;
//clean some fields
if (isset($data_to_save['custom_field_type']) and isset($data_to_save['value'])) {
unset($data_to_save['custom_field_type']);
unset($data_to_save['value']);
}
if (isset($data_to_save['custom_field_help_text'])) {
unset($data_to_save['custom_field_help_text']);
unset($data_to_save['custom_field_help_text']);
}
if (isset($data_to_save['custom_field_is_active'])) {
unset($data_to_save['custom_field_is_active']);
}
if (isset($data_to_save['name'])) {
unset($data_to_save['name']);
}
if (isset($data_to_save['values'])) {
unset($data_to_save['values']);
}
if (isset($data_to_save['value'])) {
unset($data_to_save['value']);
}
if (isset($data_to_save['title'])) {
$url_changed = true;
}
$data_to_save['table'] = $table;
$data_fields = array();
if (!empty($orig_data)) {
$data_str = 'data_';
$data_str_l = strlen($data_str);
foreach ($orig_data as $k => $v) {
if (is_string($k)) {
if (strlen($k) > $data_str_l) {
$rest = substr($k, 0, $data_str_l);
$left = substr($k, $data_str_l, strlen($k));
if ($rest == $data_str) {
if (!isset($data_to_save['data_fields'])) {
$data_to_save['data_fields'] = array();
}
$data_to_save['data_fields'][$left] = $v;
}
}
}
}
}
if (isset($data_to_save['parent']) and $data_to_save['parent'] != 0) {
if (isset($data_to_save['id']) and $data_to_save['id'] != 0) {
if ($data_to_save['parent'] == $data_to_save['id']) {
$data_to_save['parent'] = 0;
}
}
}
$data_to_save = $this->map_params_to_schema($data_to_save);
//dd($data_to_save);
$save = $this->app->database_manager->extended_save($table, $data_to_save);
/* SQLITE FIX */
if ($adm == true) {
if (isset($data_to_save['is_home'])) {
$q = Content::where('id', $save)->update(array('is_home' => intval($data_to_save['is_home'])));
}
if (isset($data_to_save['is_shop'])) {
$q = Content::where('id', $save)->update(array('is_shop' => intval($data_to_save['is_shop'])));
}
if (isset($data_to_save['require_login'])) {
$q = Content::where('id', $save)->update(array('require_login' => intval($data_to_save['require_login'])));
}
}
/* END SQLITE FIX */
$id = $save;
if (isset($data_to_save['parent']) and $data_to_save['parent'] != 0) {
$upd_posted = array();
$upd_posted['posted_at'] = $data_to_save['updated_at'];
$upd_posted['id'] = $data_to_save['parent'];
$save_posted = $this->app->database_manager->save($table, $upd_posted);
}
$after_save = $data_to_save;
$after_save['id'] = $id;
$this->app->event_manager->trigger('content.after.save', $after_save);
$this->app->cache_manager->delete('content/' . $save);
$this->app->cache_manager->delete('content_fields/global');
if ($url_changed != false) {
$this->app->cache_manager->delete('menus');
$this->app->cache_manager->delete('categories');
}
if (!isset($data_to_save['images']) and isset($data_to_save['pictures'])) {
$data_to_save['images'] = $data_to_save['pictures'];
}
if (isset($data_to_save['images']) and is_string($data_to_save['images'])) {
$data_to_save['images'] = explode(',', $data_to_save['images']);
}
if (isset($data_to_save['images']) and is_array($data_to_save['images']) and !empty($data_to_save['images'])) {
$images_to_save = $data_to_save['images'];
foreach ($images_to_save as $image_to_save) {
if (is_string($image_to_save)) {
$image_to_save = trim($image_to_save);
if ($image_to_save != '') {
$save_media = array();
$save_media['content_id'] = $id;
$save_media['filename'] = $image_to_save;
$check = $this->app->media_manager->get($save_media);
$save_media['media_type'] = 'picture';
if ($allow_remote_images_download) {
$save_media['allow_remote_download'] = true;
}
if ($check == false) {
$this->app->media_manager->save($save_media);
}
}
} elseif (is_array($image_to_save) and !empty($image_to_save)) {
$save_media = $image_to_save;
$save_media['content_id'] = $id;
if ($allow_remote_images_download) {
$save_media['allow_remote_download'] = true;
}
$this->app->media_manager->save($save_media);
}
}
}
$custom_field_table = $this->tables['custom_fields'];
$custom_field_table = $this->app->database_manager->real_table_name($custom_field_table);
$sid = $this->app->user_manager->session_id();
$media_table = $this->tables['media'];
$media_table = $this->app->database_manager->real_table_name($media_table);
if ($sid != false and $sid != '' and $id != false) {
DB::transaction(function () use($sid, $id) {
DB::table($this->tables['custom_fields'])->whereSessionId($sid)->where(function ($query) {
$query->whereRelId(0)->orWhere('rel_id', null)->orWhere('rel_id', '0');
})->whereRelType('content')->update(['rel_type' => 'content', 'rel_id' => $id]);
DB::table($this->tables['media'])->whereSessionId($sid)->where(function ($query) {
$query->whereRelId(0)->orWhere('rel_id', null)->orWhere('rel_id', '0');
})->whereRelType('content')->update(['rel_type' => 'content', 'rel_id' => $id]);
});
}
$this->app->cache_manager->delete('custom_fields');
$this->app->cache_manager->delete('custom_fields_values');
$this->app->cache_manager->delete('media/global');
if (isset($data_to_save['parent']) and intval($data_to_save['parent']) != 0) {
$this->app->cache_manager->delete('content' . DIRECTORY_SEPARATOR . intval($data_to_save['parent']));
}
if (isset($data_to_save['id']) and intval($data_to_save['id']) != 0) {
$this->app->cache_manager->delete('content' . DIRECTORY_SEPARATOR . intval($data_to_save['id']));
}
$this->app->cache_manager->delete('content' . DIRECTORY_SEPARATOR . 'global');
$this->app->cache_manager->delete('content' . DIRECTORY_SEPARATOR . '0');
$this->app->cache_manager->delete('content_fields/global');
$this->app->cache_manager->delete('content');
$this->app->cache_manager->delete('categories/global');
$this->app->cache_manager->delete('categories_items/global');
if ($cats_modified != false) {
if (isset($c1) and is_array($c1)) {
foreach ($c1 as $item) {
$item = intval($item);
if ($item > 0) {
$this->app->cache_manager->delete('categories/' . $item);
}
}
}
}
// event_trigger('mw_save_content', $save);
return $id;
}