Made definition of columns based on objects

This commit is contained in:
2019-05-29 17:55:30 +02:00
parent 8dbbb4d245
commit d93a02e779
10 changed files with 291 additions and 125 deletions

View File

@@ -6,12 +6,9 @@ use Joomla\CMS\Factory;
// No direct access.
defined('_JEXEC') or die;
class AssociatedObjectUnsavedException extends Exception
{}
abstract class AbstractCommonClubsModel
{
// TODO Adddata validator
// TODO Add data validator
// TODO Make setting of values attribute fail in case of problems
// FIXME Add Joins in select statements
@@ -103,10 +100,9 @@ abstract class AbstractCommonClubsModel
$db = Factory::getDbo();
$q = $db->getQuery(true);
foreach($attribs as $k => $v)
foreach($attribs as $a)
{
$rawColName = isset($v['col']) ? $v['col'] : $k;
$q->select($q->qn($rawColName, $k));
$a->select($q);
}
$q->from($factory->getTableName());
$q->where("id = {$this->id}");
@@ -123,22 +119,10 @@ abstract class AbstractCommonClubsModel
private function packExternalReferencesAsKeys($vals)
{
foreach($this->getFactory()->getAttributes() as $k => $v)
foreach($this->getFactory()->getAttributes() as $a)
{
if($v['type'] !== 'ref')
continue;
if(is_null($vals[$k]))
continue;
$id = $vals[$k]->getId();
if($id === 'new')
{
throw new AssociatedObjectUnsavedException();
}
$vals[$k] = $id;
$alias = $a->getAlias();
$vals[$alias] = $a->packValue($vals[$alias]);
}
return $vals;
@@ -146,64 +130,20 @@ abstract class AbstractCommonClubsModel
private function unpackExternalReferencesFromKeys($vals)
{
foreach($this->getFactory()->getAttributes() as $k => $v)
foreach($this->getFactory()->getAttributes() as $a)
{
if(empty($v['type']) || $v['type'] !== 'ref')
continue;
if(empty($v['ref']))
throw new Exception('External reference of unknown class found.');
if(empty($vals[$k]))
continue;
$vals[$k] = $this->loadExternalReferenceAsObject($v['ref'], $vals[$k]);
$alias = $a->getAlias();
$vals[$alias] = $a->unpackValue($vals[$alias]);
}
return $vals;
}
private function loadExternalReferenceAsObject($className, $value)
{
if(is_string($value) && preg_match('/^[0-9]+$/', $value))
$value = (int) $value;
if(! is_int($value))
throw new Exception('Reference with non-integer value');
$factoryName = $this->getFactoryNameOfClass($className);
$factory = new $factoryName();
return $factory->loadById($value);
}
private const CLASSNAME_MAP = array(
);
/**
* @todo This must be done better and more cleanly
* @param string $className
* @return AbstractCommonClubsModelFactory
*/
private function getFactoryNameOfClass($className)
{
if(empty(self::CLASSNAME_MAP[$className]))
{
$parts = array();
if(preg_match('/^CommonClubsModel(.*)/', $className, $parts))
{
return "CommonClubsModelFactory{$parts[1]}";
}
throw new Exception("Unknown mapping of class $className");
}
return self::CLASSNAME_MAP[$className];
}
/**
*
* @param array $rawData
* @param array $attribs
* @param AbstractCommonClubsModelColumn[] $attribs
* @param JDatabaseQuery $q
* @return string[]|number[]|NULL[]
*/
@@ -211,38 +151,10 @@ abstract class AbstractCommonClubsModel
{
$quotedData = array();
foreach($attribs as $k => $v)
foreach($attribs as $a)
{
if(empty($v['type']))
$v['type'] = 'string';
if($rawData[$k] === NULL)
{
$quotedData[$k] = 'NULL';
continue;
}
switch($v['type'])
{
case 'string':
$quotedData[$k] = $q->q($rawData[$k]);
break;
case 'int':
$quotedData[$k] = (int) $rawData[$k];
break;
case 'float':
$quotedData[$k] = (float) $rawData[$k];
break;
case 'ref':
if($v['ref'] === null)
$quotedData[$k] = 'NULL';
else
$quotedData[$k] = $rawData[$k]->getId();
break;
}
$alias = $a->getAlias();
$quotedData[$alias] = $a->getQuotedValue($q, $rawData[$alias]);
}
return $quotedData;
@@ -277,7 +189,7 @@ abstract class AbstractCommonClubsModel
/**
*
* @param array $attribs
* @param AbstractCommonClubsModelColumn[] $attribs
* @param AbstractCommonClubsModelFactory $factory
* @param JDatabaseQuery $q
*/
@@ -286,9 +198,9 @@ abstract class AbstractCommonClubsModel
$q->insert($factory->getTableName());
$dbcols = array();
foreach($attribs as $k => $v)
foreach($attribs as $a)
{
$dbcols[] = isset($v['col']) ? $v['col'] : $k;
$dbcols[] = $a->getColumn();
}
$q->columns($q->qn($dbcols));
@@ -310,7 +222,7 @@ abstract class AbstractCommonClubsModel
/**
*
* @param array $attribs
* @param AbstractCommonClubsModelColumn[] $attribs
* @param AbstractCommonClubsModelFactory $factory
* @param JDatabaseQuery $q
*/
@@ -319,8 +231,8 @@ abstract class AbstractCommonClubsModel
$q->update($factory->getTableName());
$dbcols = array();
foreach($attribs as $k => $v)
$dbcols[] = isset($v['col']) ? $v['col'] : $k;
foreach($attribs as $a)
$dbcols[] = $a->getColumn();
$quotedData = $this->getQuotedData($attribs, $q);