/** * Add one field to the table, allowing to specify the desired order * If it's not specified, then the field is added at the end * @param xmldb_field $field * @param xmldb_object $after * @return xmldb_field */ public function addField($field, $after = null) { // Detect duplicates first if ($this->getField($field->getName())) { throw new coding_exception('Duplicate field ' . $field->getName() . ' specified in table ' . $this->getName()); } // Calculate the previous and next fields $prevfield = null; $nextfield = null; if (!$after) { $allfields = $this->getFields(); if (!empty($allfields)) { end($allfields); $prevfield = $allfields[key($allfields)]; } } else { $prevfield = $this->getField($after); } if ($prevfield && $prevfield->getNext()) { $nextfield = $this->getField($prevfield->getNext()); } // Set current field previous and next attributes if ($prevfield) { $field->setPrevious($prevfield->getName()); $prevfield->setNext($field->getName()); } if ($nextfield) { $field->setNext($nextfield->getName()); $nextfield->setPrevious($field->getName()); } // Some more attributes $field->setLoaded(true); $field->setChanged(true); // Add the new field $this->fields[] = $field; // Reorder the field $this->orderFields($this->fields); // Recalculate the hash $this->calculateHash(true); // We have one new field, so the table has changed $this->setChanged(true); return $field; }
/** * xmldb_hotpot_fix_previous_field * * @param xxx $dbman * @param xmldb_table $table * @param xmldb_field $field (passed by reference) * @return void, but may update $field->previous */ function xmldb_hotpot_fix_previous_field($dbman, $table, &$field) { $previous = $field->getPrevious(); if (empty($previous) || $dbman->field_exists($table, $previous)) { // $previous field exists - do nothing } else { // $previous field does not exist, so remove it $field->setPrevious(null); } }