/**
* @param \Jarves\Configuration\Object $objectDefinition
* @param Configs $configs
* @return bool
*/
protected function defineCrossObject(Object $objectDefinition, Configs $configs)
{
$changed = false;
$bundle = $objectDefinition->getBundle();
$foreignObjectDefinition = $configs->getObject($this->getFieldDefinition()->getObject());
$possibleObjectName = ucfirst($objectDefinition->getId()) . ucfirst($foreignObjectDefinition->getId());
$possibleObjectKey = $bundle->getName() . '/' . $possibleObjectName;
if (!($crossObjectKey = $this->getFieldDefinition()->getObjectRelationCrossObjectKey())) {
$crossObjectKey = $possibleObjectKey;
}
$crossObject = $configs->getObject($crossObjectKey);
if (!$crossObject) {
if (!($crossObject = $configs->getObject($possibleObjectKey))) {
$crossObject = new Object(null, $objectDefinition->getJarves());
$crossObject->setId($possibleObjectName);
$crossObject->setSearchable(false);
$crossObject->setAutoCrud(false);
$crossObject->setExcludeFromREST(true);
$crossObject->setTable($objectDefinition->getTable() . '_' . Tools::camelcase2Underscore($foreignObjectDefinition->getId()));
$changed = true;
}
}
if (!$crossObject->isCrossRef()) {
$crossObject->setCrossRef(true);
$changed = true;
}
$leftFieldName = $this->getFieldDefinition()->getObjectRefRelationName() ?: $objectDefinition->getId();
if (!$crossObject->getField($leftFieldName)) {
$leftObjectField = new Field(null, $objectDefinition->getJarves());
$leftObjectField->setId($leftFieldName);
$leftObjectField->setType('object');
$leftObjectField->setObject($objectDefinition->getKey());
$leftObjectField->setObjectRelation(AbstractStorage::ONE_TO_ONE);
$leftObjectField->setPrimaryKey(true);
$crossObject->addField($leftObjectField);
$changed = true;
}
if (!$crossObject->getField($this->getFieldDefinition()->getId())) {
$rightObjectField = new Field(null, $objectDefinition->getJarves());
$rightObjectField->setId($this->getFieldDefinition()->getId());
$rightObjectField->setType('object');
$rightObjectField->setObject($foreignObjectDefinition->getKey());
$rightObjectField->setObjectRelation(AbstractStorage::ONE_TO_ONE);
$rightObjectField->setPrimaryKey(true);
$crossObject->addField($rightObjectField);
$changed = true;
}
if (!$crossObject->getBundle()) {
//we created a new object
$bundle->addObject($crossObject);
}
return $changed;
}