Microweber\Providers\Content\ContentManagerCrud::save PHP Метод

save() публичный Метод

public save ( $data, $delete_the_cache = true )
    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;
    }