/**
* @param \Jarves\Configuration\Object $object
* @param \SimpleXMLElement $objectTable
*
* @return \SimpleXMLElement
*
* @throws \Jarves\Exceptions\ModelBuildException
*/
protected function getXmlTable(Object $object, \SimpleXMLElement $objectTable = null)
{
if (!$objectTable) {
$objectTable = new \SimpleXMLElement('<table />');
//simplexml_load_string('<database></database>');
}
if (!$object->getTable()) {
throw new ModelBuildException(sprintf('The object `%s` has no table defined', $object->getId()));
}
$objectTable['name'] = $object->getTable();
$objectTable['phpName'] = ucfirst($object->getId());
if ($object->isCrossRef()) {
$objectTable['isCrossRef'] = 'true';
}
$columnsDefined = array();
if (!$object->getFields()) {
throw new ModelBuildException(sprintf('The object `%s` has no fields defined', $object->getId()));
}
foreach ($object->getFields() as $field) {
if ($columns = $field->getFieldType()->getColumns()) {
foreach ($columns as $column) {
$name = Tools::camelcase2Underscore($column->getName());
//column exist?
$eColumns = $objectTable->xpath('column[@name =\'' . $name . '\']');
if ($eColumns) {
$newCol = current($eColumns);
if ($newCol['custom'] == true) {
continue;
}
} else {
$newCol = $objectTable->addChild('column');
}
$columnsDefined[] = $name;
$this->setupColumnAttributes($column, $newCol);
if ($field->isRequired()) {
$newCol['required'] = 'true';
}
if ($field->isPrimaryKey()) {
$newCol['primaryKey'] = 'true';
}
if ($field->isAutoIncrement()) {
$newCol['autoIncrement'] = 'true';
}
}
}
}
if ($relations = $object->getRelations()) {
foreach ($relations as $relation) {
$this->addRelation($object, $relation, $objectTable);
}
}
if ($object->isNested()) {
$behaviors = $objectTable->xpath('behavior[@name=\'nested_set\']');
if ($behaviors) {
$behavior = current($behaviors);
} else {
$behavior = $objectTable->addChild('behavior');
}
if (!$behavior['custom']) {
$behavior['name'] = 'nested_set';
$parameters = ['left_column' => 'lft', 'right_column' => 'rgt', 'level_column' => 'lvl'];
if ($object->getNestedRootAsObject()) {
$parameters['use_scope'] = 'true';
$parameters['scope_column'] = Tools::camelcase2Underscore($object->getNestedRootObjectField());
}
foreach ($parameters as $k => $v) {
$parameter = $behavior->addChild('parameter');
$parameter['name'] = $k;
$parameter['value'] = $v;
}
}
}
if ($object['workspace']) {
$behaviors = $objectTable->xpath('behavior[@name=\'Jarves\\Propel\\Behavior\\WorkspaceBehavior\']');
if ($behaviors) {
$behavior = current($behaviors);
} else {
$behavior = $objectTable->addChild('behavior');
}
$behavior['name'] = 'Jarves\\Propel\\Behavior\\WorkspaceBehavior';
}
$vendors = $objectTable->xpath('vendor[@type=\'mysql\']');
if ($vendors) {
foreach ($vendors as $k => $v) {
unset($vendors[$k][0]);
}
}
$vendor = $objectTable->addChild('vendor');
$vendor['type'] = 'mysql';
$params = $vendor->xpath('parameter[@name=\'Charset\']');
if ($params) {
$param = current($params);
} else {
$param = $vendor->addChild('parameter');
}
$param['name'] = 'Charset';
$param['value'] = 'utf8';
return $objectTable;
// $dom = new \DOMDocument;
// $dom->preserveWhiteSpace = false;
// $dom->loadXML($xml->asXML());
// $dom->formatOutput = true;
//
// $xml = $dom->saveXML();
// $prefix = '<?xml version="1.0"? >';
// if (0 === strpos($xml, $prefix)) {
// $xml = substr($xml, strlen($prefix));
// }
//
// return trim($xml);
}