sintonia/airtime_mvc/library/propel/contrib/pat/patForms/Definition.php

123 lines
2.7 KiB
PHP

<?
class patForms_Definition {
private $data = array();
public function __construct($name, $autoValidate = '') {
$this->data['name'] = $name;
$this->data['mtime'] = time();
if ($autoValidate) {
$this->data['autoValidate'] = $autoValidate;
}
}
static public function create($conf) {
// TODO
}
public function __get($name) {
if (isset($this->data[$name])) {
return $this->data[$name];
}
}
// TODO change protocol to addElement(array $element)
public function addElement($name, $type, $attributes = array(), $rules = array()) {
if (is_array($type)) {
extract($type);
}
$this->data['elements'][$name]['name'] = $name;
$this->data['elements'][$name]['type'] = $type;
foreach ($attributes as $key => $value) {
$value = $this->cast($value);
$this->data['elements'][$name]['attributes'][$key] = $value;
}
foreach ($rules as $key => $rule) {
$this->data['elements'][$name]['rules'][$key] = $rule;
}
}
public function load($filename) {
$data = $this->read($filename);
foreach ($data as $key => $value) {
if ($key == 'elements') {
foreach ($value as $name => $element) {
$this->addElement($name, $element);
}
} else {
$this->data[$key] = $this->cast($value);
}
}
}
public function save($filename) {
$this->write($filename, $this->data);
}
protected function read($filename) {
$xml = file_get_contents($filename);
$unserializer = new XML_Unserializer();
$unserializer->unserialize($xml);
return $unserializer->getUnserializedData();
}
protected function write($filename, $data) {
$serializer = new XML_Serializer(array (
'addDecl' => true,
'encoding' => 'ISO-8859-1',
'indent' => ' ',
'rootName' => 'form',
'defaultTagName' => 'tag'
));
$serializer->serialize($data);
$xml = $serializer->getSerializedData();
$fp = fopen($filename, 'w+');
fputs($fp, $xml);
fclose($fp);
}
protected function cast($value) {
return $value;
// seems as if patForms_Element(s) are broken here
// e.g. in patForms_Element_Text::serializeHtmlDefault()
// at line 245 if ( $this->attributes['display'] == 'no' )
// will result to true if the display attribute is set
// to (php boolean) true
// so casting the 'true'/'false' and 'yes'/'no' values
// would break intended behaviour here
if (is_array($value) OR is_bool($value)) {
return $value;
}
if ($value === 'true') {
return true;
}
if ($value === 'false') {
return false;
}
if (preg_match('/^[+-]?[0-9]+$/', $value)) {
settype($value, 'int');
return $value;
}
if (preg_match('/^[+-]?[0-9]*\.[0-9]+$/', $value)) {
settype($value, 'double');
return $value;
}
return $value;
}
}