Prepared work of models to be useful with basic attributes

This commit is contained in:
2019-05-22 14:03:18 +02:00
parent fd0a0f7f4d
commit cb6068bfd6
2 changed files with 123 additions and 17 deletions

View File

@@ -8,8 +8,12 @@ defined('_JEXEC') or die;
abstract class AbstractCommonClubsModel
{
protected $id; // TODO private possible?
protected $new;
// TODO Adddata validator
// TODO Make setting of values attribute fail in case of problems
// FIXME Add Joins in select statements
private $id;
private $new;
public function getId()
{
@@ -98,7 +102,73 @@ abstract class AbstractCommonClubsModel
$db->setQuery($q);
$db->execute();
$this->values = $db->loadAssoc();
$values = $db->loadAssoc();
$values = $this->unpackExternalReferencesFromKeys($values);
$this->values = $values;
}
private function packExternalReferencesAsKeys($vals)
{
foreach($this->getFactory()->getAttributes() as $k => $v)
{
if($v['type'] !== 'ref')
continue;
$vals[$k] = $vals[$k]->getId();
}
return $vals;
}
private function unpackExternalReferencesFromKeys($vals)
{
foreach($this->getFactory()->getAttributes() as $k => $v)
{
if($v['type'] !== 'ref')
continue;
if(empty($v['ref']))
throw new Exception('External reference of unknown class found.');
$vals[$k] = $this->loadExternalReferenceAsObject($v['ref'], $vals[$k]);
}
return $vals;
}
private function loadExternalReferenceAsObject($className, $value)
{
if(! is_int($value))
throw new Exception('Reference with non-integer value');
$factory = $this->getFactoryOfClass($className);
return $factory->loadById($value);
}
private static const CLASSNAME_MAP = array(
);
/**
* @todo This must be done better and more cleanly
* @param string $className
* @return AbstractCommonClubsModelFactory
*/
private function getFactoryOfClass($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];
}
/**
@@ -146,12 +216,12 @@ abstract class AbstractCommonClubsModel
return $quotedData;
}
protected function filterRawData($values)
protected function filterDatabaseRawData($values)
{
return $values;
}
protected function filterQuotedData($quoted)
protected function filterDatabaseQuotedData($quoted)
{
return $quoted;
}
@@ -165,10 +235,10 @@ abstract class AbstractCommonClubsModel
private function getQuotedData($attribs, $q)
{
$rawData = $this->getValues();
$rawData = $this->filterRawData($rawData);
$rawData = $this->filterDatabaseRawData($rawData);
$quotedData = $this->quoteData($rawData, $attribs, $q);
$quotedData = $this->filterQuotedData($quotedData);
$quotedData = $this->filterDatabaseQuotedData($quotedData);
return $quotedData;
}
@@ -239,14 +309,47 @@ abstract class AbstractCommonClubsModel
$db->transactionCommit();
}
/**
*
* @param AbstractCommonClubsModelFactory $factory
* @param string $colName
*/
protected function fetchAssociatedElements($factory, $colName)
{
$condition = "main.$colName = {$this->id}";
return $factory->loadElements($condition);
}
protected function filterPackData($values)
{
return $values;
}
protected function filterUnpackData($values)
{
return $values;
}
public function pack()
{
// TODO
$vals = $this->getValues();
$vals = $this->packExternalReferencesAsKeys($vals);
$vals = $this->filterPackData($vals);
$json = json_encode($vals);
return urldecode($json);
}
public function unpack($str)
{
// TODO
$json = urlencode($str);
$data = json_decode($json, true);
$vals = $this->unpackExternalReferencesFromKeys($data);
$vals = $this->filterUnpackData($vals);
$this->setValues($vals);
}
}