Made definition of columns based on objects
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user