. */ namespace Volkszaehler\Model; use Volkszaehler\Util; use Volkszaehler\Model; /** * Property entity * * @author Steffen Vogel * @package default * * @Entity * @Table(name="properties") */ class Property { /** * @Id * @Column(type="smallint", nullable=false) * @GeneratedValue(strategy="AUTO") * * @todo wait until DDC-117 is fixed (PKs on FKs) */ protected $id; /** @Column(type="string", nullable=false) */ protected $name; /** @Column(type="string", nullable=false) */ protected $value; /** @ManyToOne(targetEntity="Entity", inversedBy="properties") */ protected $entity; /** * Property definition * * Used to validate * * @var Model\PropertyDefinition */ protected $definition; /** * Constructor * * @param string $key * @param string $value */ public function __construct($name, $value) { $this->definition = Model\PropertyDefinition::get($name); $this->setName($name); $this->setValue($value); } /* * Setter & Getter */ public function getName() { return $this->name; } public function getValue() { return $this->value; } public function setValue($value) { if (!$this->definition->validate($value)) { throw new \Exception('invalid property value'); $this->value = $value; } } /** * * @param string $name * @todo validation */ protected function setName($name) { $this->name = $name; } } class PropertyDefinition extends Util\JSONDefinition { /** One of: string, numeric, multiple */ public $type; /** * Regex pattern to match if type == string * * @var string */ protected $pattern; /** * Minimal value if type == numeric * Required string length if type == string * * @var integer|float */ protected $min; /** * Maximal value if type == numeric * Allowed string length if type == string * * @var integer|float */ protected $max; /** * List of possible choices if type == multiple * (type as in javascript: 1.2 => numeric, "test" => string) * * @var array */ protected $choices = array(); /** * File containing the JSON definitons * * @var string */ const FILE = '/share/properties.json'; /** * Validate value according to $this->type * * @param mixed $value * @return boolean */ public function validate($value) { switch ($this->type) { case 'string': $invalid = !is_string($value); $invalid |= isset($this->pattern) && !preg_match($this->pattern, $value); $invalid |= isset($this->min) && strlen($value) < $this->min; $invalid |= isset($this->max) && strlen($value) > $this->max; break; case 'numeric': $invalid = !is_numeric($value); $invalid |= isset($this->min) && $value < $this->min; $invalid |= isset($this->max) && $value > $this->max; break; case 'multiple': $invalid = !in_array($value, $this->choices, TRUE); break; default: throw new \Exception('unknown property type'); } return !$invalid; } } ?>