. * */ namespace OCA\News\Db; abstract class Entity { public $id; private $tableName; private $updatedFields; public function __construct($tableName){ $this->updatedFields = array(); $this->tableName = '*dbprefix*' . $tableName; } /** * Each time a setter is called, push the part after set * into an array: for instance setId will save Id in the * updated fields array so it can be easily used to create the * getter method */ public function __call($methodName, $args){ // setters if(strpos($methodName, 'set') === 0){ $attr = lcfirst( substr($methodName, 3) ); // setters should only work for existing attributes if(property_exists($this, $attr)){ $this->markFieldUpdated($attr); $this->$attr = $args[0]; } else { throw new \BadFunctionCallException($attr . ' is not a valid attribute'); } // getters } elseif(strpos($methodName, 'get') === 0) { $attr = lcfirst( substr($methodName, 3) ); // getters should only work for existing attributes if(property_exists($this, $attr)){ return $this->$attr; } else { throw new \BadFunctionCallException($attr . ' is not a valid attribute'); } } else { throw new \BadFunctionCallException($methodName . ' does not exist'); } } /** * Mark am attribute as updated * @param string $attribute the name of the attribute */ protected function markFieldUpdated($attribute){ $this->updatedFields[$attribute] = true; } /** * Transform a database columnname to a property * @param string $columnName the name of the column * @return string the property name */ public function columnToProperty($columnName){ $parts = explode('_', $columnName); $property = null; foreach($parts as $part){ if($property === null){ $property = $part; } else { $property .= ucfirst($part); } } return $property; } /** * Transform a property to a database column name * @param string $property the name of the property * @return string the column name */ public function propertyToColumn($property){ $parts = preg_split('/(?=[A-Z])/', $property); $column = null; foreach($parts as $part){ if($column === null){ $column = $part; } else { $column .= '_' . lcfirst($part); } } return $column; } /** * @return array array of updated fields for update query */ public function getUpdatedFields(){ return $this->updatedFields; } /** * Maps the keys of the row array to the attributes * @param array $row the row to map onto the entity */ public function fromRow(array $row){ foreach($row as $key => $value){ $prop = $this->columnToProperty($key); $this->$prop = $value; } } /** * @return string the table name */ public function getTableName(){ return $this->tableName; } }