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']);
}
}
}