protected function column_value(Dao $dao, $name, $value) { if ($value === null) { return null; } try { switch ($dao->prop_anon($name, 'type')) { case 'boolean': return (int) $value; } } catch (\Exception $e) { } return parent::column_value($dao, $name, $value); }
/** * create table * @module org.rhaco.store.db.Dbc * @param org.rhaco.store.db.Dao $dao */ public function create_table_sql(\org\rhaco\store\db\Dao $dao) { $quote = function ($name) { return '`' . $name . '`'; }; $to_column_type = function ($dao, $type, $name) use($quote) { switch ($type) { case '': case 'mixed': case 'string': return $quote($name) . ' varchar(' . $dao->prop_anon($name, 'max', 255) . ')'; case 'alnum': case 'text': return $quote($name) . ($dao->prop_anon($name, 'max') !== null ? ' varchar(' . $dao->prop_anon($name, 'max') . ')' : ' text'); case 'number': return $quote($name) . ' ' . ($dao->prop_anon($name, 'decimal_places') !== null ? sprintf('numeric(%d,%d)', 26 - $dao->prop_anon($name, 'decimal_places'), $dao->prop_anon($name, 'decimal_places')) : 'double'); case 'serial': return $quote($name) . ' int auto_increment'; case 'boolean': return $quote($name) . ' int(1)'; case 'timestamp': return $quote($name) . ' timestamp'; case 'date': return $quote($name) . ' date'; case 'time': return $quote($name) . ' int'; case 'intdate': case 'integer': return $quote($name) . ' int'; case 'email': return $quote($name) . ' varchar(255)'; case 'choice': return $quote($name) . ' varchar(255)'; default: throw new \InvalidArgumentException('undefined type `' . $type . '`'); } }; $columndef = $primary = array(); $sql = 'create table ' . $quote($dao->table()) . '(' . PHP_EOL; foreach ($dao->props(false) as $prop_name => $v) { if ($this->create_table_prop_cond($dao, $prop_name)) { $column_str = ' ' . $to_column_type($dao, $dao->prop_anon($prop_name, 'type'), $prop_name) . ' null '; $columndef[] = $column_str; if ($dao->prop_anon($prop_name, 'primary') === true || $dao->prop_anon($prop_name, 'type') == 'serial') { $primary[] = $quote($prop_name); } } } $sql .= implode(',' . PHP_EOL, $columndef) . PHP_EOL; if (!empty($primary)) { $sql .= ' ,primary key ( ' . implode(',', $primary) . ' ) ' . PHP_EOL; } $sql .= ' ) engine = InnoDB character set utf8 collate utf8_general_ci;' . PHP_EOL; return $sql; }
protected function create_table_prop_cond(\org\rhaco\store\db\Dao $dao, $prop_name) { return $dao->prop_anon($prop_name, 'extra') !== true && $dao->prop_anon($prop_name, 'cond') === null; }
public function filter(\org\rhaco\store\db\Dao $obj, $name) { if ($obj->prop_anon($name, 'master') !== null) { $options = array(); $options[] = '<option value=""></option>'; $master = $obj->prop_anon($name, 'master'); if (!empty($master)) { $master = str_replace('.', "\\", $master); if ($master[0] !== "\\") { $master = "\\" . $master; } $r = new \ReflectionClass($master); $mo = $r->newInstanceArgs(); $primarys = $mo->primary_columns(); if (sizeof($primarys) != 1) { return sprintf('<input name="%s" type="text" />', $name); } foreach ($primarys as $primary) { break; } $pri = $primary->name(); foreach ($master::find() as $dao) { $options[] = sprintf('<option value="%s">%s</option>', $dao->{$pri}(), (string) $dao); } } return sprintf('<select name="%s">%s</select>', $name, implode('', $options)); } else { $type = $obj->prop_anon($name, 'type'); switch ($type) { case 'boolean': $options = array(); $options[] = '<option value=""></option>'; foreach (array('true', 'false') as $choice) { $options[] = sprintf('<option value="%s">%s</option>', $choice, $choice); } return sprintf('<select name="search_%s_%s">%s</select>', $type, $name, implode('', $options)); case 'choice': $options = array(); $options[] = '<option value=""></option>'; foreach ($obj->prop_anon($name, 'choices') as $v) { $options[] = sprintf('<option value="%s">%s</option>', $v, $v); } return sprintf('<select name="search_%s_%s">%s</select>', $type, $name, implode('', $options)); case 'timestamp': case 'date': return sprintf('<input name="search_%s_from_%s" type="text" class="span2" />', $type, $name) . ' : ' . sprintf('<input name="search_%s_to_%s" type="text" class="span2" />', $type, $name); default: return sprintf('<input name="search_%s_%s" type="text" />', $type, $name); } } }