PHPFusion\QuantumFields::create_fields PHP Метод

create_fields() приватный Метод

Field Creation
private create_fields ( $data, $type = 'dynamics' )
    private function create_fields($data, $type = 'dynamics')
    {
        global $aidlink;
        // Build a field Attr
        $field_attr = '';
        if ($type == 'dynamics') {
            $field_attr = $this->dynamics_fieldinfo($data['field_type'], $data['field_default']);
        } elseif ($type == 'module') {
            $field_attr = $this->user_field_dbinfo;
        }
        $max_order = dbresult(dbquery("SELECT MAX(field_order) FROM " . $this->field_db . " WHERE field_cat='" . $data['field_cat'] . "'"), 0) + 1;
        if ($data['field_order'] == 0 or $data['field_order'] > $max_order) {
            $data['field_order'] = $max_order;
        }
        if (self::validate_field($data['field_id'])) {
            if ($this->debug) {
                print_p('Update mode');
            }
            // update
            // Alter $this->field_db table - change and modify column.
            $old_record = dbquery("SELECT uf.*, cat.field_cat_id, cat.field_parent, cat.field_cat_order, root.field_cat_db, root.field_cat_index\n\t\t\t\t\t\t\t\t\tFROM " . $this->field_db . " uf\n\t\t\t\t\t\t\t\t\tLEFT JOIN " . $this->category_db . " cat ON (cat.field_cat_id = uf.field_cat)\n\t\t\t\t\t\t\t\t\tLEFT JOIN " . $this->category_db . " root ON (cat.field_parent = root.field_cat_id)\n\t\t\t\t\t\t\t\t\tWHERE uf.field_id='" . $data['field_id'] . "'");
            // old database.
            if (dbrows($old_record) > 0) {
                // got old field cat
                $oldRows = dbarray($old_record);
                $old_table = $oldRows['field_cat_db'] ? DB_PREFIX . $oldRows['field_cat_db'] : DB_USERS;
                // this was old database
                $old_table_columns = fieldgenerator($old_table);
                // Get current updated field_cat - to compare new cat_db and old cat_db
                $new_result = dbquery("\n\t\t\t\tSELECT cat.field_cat_id, cat.field_cat_name, cat.field_parent, cat.field_cat_order,\n\t\t\t\troot.field_cat_db, root.field_cat_index\n                FROM " . $this->category_db . " cat\n\t\t\t\tLEFT JOIN " . $this->category_db . " root on cat.field_parent = root.field_cat_id\n\t\t\t\tWHERE cat.field_cat_id='" . intval($data['field_cat']) . "'\n\t\t\t\t");
                $newRows = array();
                if (dbrows($new_result) > 0) {
                    $newRows = dbarray($new_result);
                    $new_table = $newRows['field_cat_db'] ? DB_PREFIX . $newRows['field_cat_db'] : DB_USERS;
                } else {
                    $new_table = DB_USERS;
                }
                if ($this->debug) {
                    print_p("Old table information -");
                    print_p($oldRows);
                    print_p("New table information -");
                    print_p($newRows);
                }
                if ($data['field_cat'] !== $oldRows['field_cat']) {
                    // old and new mismatch - move to another category
                    if ($this->debug) {
                        print_p("Fork No.1 - Update Field on a different table");
                    }
                    // drop the old one if target database aren't the same.
                    // @todo: Improvements: need to move the whole column along with data instead of just dropping and creating new
                    if ($new_table !== $old_table) {
                        print_p($old_table);
                        $new_table_columns = fieldgenerator($new_table);
                        if (!$this->debug) {
                            if (!in_array($data['field_name'], $new_table_columns)) {
                                // this is new database check, if not exist, then add the column
                                //self::add_column($new_table, $data['field_name'], $field_attr);
                                self::move_column($old_table, $new_table, $data['field_name']);
                                self::drop_column($old_table, $oldRows['field_name']);
                                if (\defender::safe()) {
                                    // sort the fields. if 2, greater than 2 all +1 on the new category
                                    dbquery("UPDATE " . $this->field_db . " SET field_order=field_order+1 WHERE field_order >= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                                    // since change table. fix all which is greater than link order.
                                    dbquery("UPDATE " . $this->field_db . " SET field_order=field_order-1 WHERE field_order >= '" . $oldRows['field_order'] . "' AND field_cat='" . $oldRows['field_cat'] . "'");
                                }
                            } else {
                                \defender::stop();
                                addNotice("danger", "Column conflict. There are columns on " . $old_table . " existed in " . $new_table);
                            }
                        } else {
                            // DEBUG MODE
                            if (!in_array($data['field_name'], $new_table_columns)) {
                                print_p("Move " . $data['field_name'] . " from " . $old_table . " to " . $new_table);
                                print_p("Dropping column " . $oldRows['field_name'] . " on " . $old_table);
                                print_p("UPDATE " . $this->field_db . " SET field_order=field_order+1 WHERE field_order >= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                                // since change table. fix all which is greater than link order.
                                print_p("UPDATE " . $this->field_db . " SET field_order=field_order-1 WHERE field_order >= '" . $oldRows['field_order'] . "' AND field_cat='" . $oldRows['field_cat'] . "'");
                            } else {
                                print_p("Column conflict. There are columns on " . $old_table . " existed in " . $new_table);
                            }
                        }
                    } else {
                        if (\defender::safe()) {
                            dbquery("UPDATE " . $this->field_db . " SET field_order=field_order+1 WHERE field_order >= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                            dbquery("UPDATE " . $this->field_db . " SET field_order=field_order-1 WHERE field_order >= '" . $oldRows['field_order'] . "' AND field_cat='" . $oldRows['field_cat'] . "'");
                        }
                    }
                } else {
                    // same table.
                    // check if same title.
                    // if not same, change column name.
                    if ($this->debug) {
                        print_p("Fork No.2 - Update Field on the same table");
                    }
                    if ($data['field_name'] !== $oldRows['field_name']) {
                        // not same as old record on dbcolumn
                        // Check for possible duplicates in the new field name
                        if (!in_array($data['field_name'], $old_table_columns)) {
                            if (!$this->debug) {
                                self::rename_column($old_table, $oldRows['field_name'], $data['field_name'], $field_attr);
                            } else {
                                print_p("Renaming column " . $oldRows['field_name'] . " on " . $old_table . " to " . $data['field_name'] . " with attributes of " . $field_attr);
                            }
                        } else {
                            \defender::stop();
                            addNotice('danger', sprintf($this->locale['fields_0104'], "({$new_table})"));
                        }
                    }
                    if (!$this->debug) {
                        if (\defender::safe()) {
                            // make ordering of the same table.
                            if ($data['field_order'] > $oldRows['field_order']) {
                                dbquery("UPDATE " . $this->field_db . " SET field_order=field_order-1 WHERE field_order > " . $oldRows['field_order'] . " AND field_order <= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                            } elseif ($data['field_order'] < $oldRows['field_order']) {
                                dbquery("UPDATE " . $this->field_db . " SET field_order=field_order+1 WHERE field_order < " . $oldRows['field_order'] . " AND field_order >= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                            }
                        }
                    } else {
                        print_p("Old field order is " . $oldRows['field_order']);
                        print_p("New field order is " . $data['field_order']);
                        if ($data['field_order'] > $oldRows['field_order']) {
                            print_p("UPDATE " . $this->field_db . " SET field_order=field_order-1 WHERE field_order > '" . $oldRows['field_order'] . "' AND field_order <= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                        } else {
                            print_p("UPDATE " . $this->field_db . " SET field_order=field_order+1 WHERE field_order < '" . $oldRows['field_order'] . "' AND field_order >= '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                        }
                    }
                }
                if (!$this->debug) {
                    if (\defender::safe()) {
                        dbquery_insert($this->field_db, $data, 'update');
                        addNotice('success', $this->locale['field_0203']);
                        redirect(FUSION_SELF . $aidlink);
                    }
                } else {
                    print_p($data);
                }
            } else {
                \defender::stop();
                addNotice('danger', $this->locale['fields_0105']);
            }
        } else {
            if ($this->debug) {
                print_p('Save Mode');
            }
            // Alter $this->field_db table - add column.
            $cresult = dbquery("SELECT cat.field_cat_id, cat.field_parent, cat.field_cat_order, root.field_cat_db, root.field_cat_index\n\t\t\t\t\t\t\t\tFROM " . $this->category_db . " cat\n\t\t\t\t\t\t\t\tLEFT JOIN " . $this->category_db . " root ON (cat.field_parent = root.field_cat_id)\n\t\t\t\t\t\t\t\tWHERE cat.field_cat_id='" . $data['field_cat'] . "'");
            if (dbrows($cresult) > 0) {
                $cat_data = dbarray($cresult);
                $new_table = $cat_data['field_cat_db'] ? DB_PREFIX . $cat_data['field_cat_db'] : DB_USERS;
                $field_arrays = fieldgenerator($new_table);
                if (!in_array($data['field_name'], $field_arrays)) {
                    // safe to execute alter.
                    if (!$this->debug && !empty($data['field_name'])) {
                        self::add_column($new_table, $data['field_name'], $field_attr);
                    } else {
                        if ($this->debug) {
                            print_p("ALTER TABLE " . $new_table . " ADD " . $data['field_name'] . " " . $field_attr);
                        }
                    }
                } else {
                    \defender::stop();
                    addNotice('danger', $this->locale['fields_0106']);
                }
                // ordering
                if (!$this->debug) {
                    if (\defender::safe()) {
                        dbquery("UPDATE " . $this->field_db . " SET field_order=field_order+1 WHERE field_order > '" . $data['field_order'] . "' AND field_cat='" . $data['field_cat'] . "'");
                        dbquery_insert($this->field_db, $data, 'save');
                        addNotice('success', $this->locale['field_0204']);
                        redirect(FUSION_SELF . $aidlink);
                    }
                } else {
                    print_p($data);
                }
            } else {
                \defender::stop();
                addNotice('danger', $this->locale['fields_0107']);
            }
        }
    }