예제 #1
0
파일: Object.php 프로젝트: schpill/thin
 public function __call($func, $argv)
 {
     $key = sha1('orm' . $this->_token);
     $orm = isAke($this->values, $key, false);
     $key = sha1('model' . $this->_token);
     $dbjson = isAke($this->values, $key, false);
     if (substr($func, 0, 4) == 'link' && false !== $orm) {
         $value = Arrays::first($argv);
         $uncamelizeMethod = Inflector::uncamelize(lcfirst(substr($func, 4)));
         $var = Inflector::lower($uncamelizeMethod);
         if (!empty($var)) {
             $var = setter($var . '_id');
             $this->{$var}($value->id);
             return $this;
         }
     } elseif (substr($func, 0, 3) == 'get') {
         $uncamelizeMethod = Inflector::uncamelize(lcfirst(substr($func, 3)));
         $var = Inflector::lower($uncamelizeMethod);
         if (isset($this->{$var})) {
             if (isset($this->thin_type)) {
                 $type = $this->thin_type;
                 Data::getModel($type);
                 $settings = Arrays::exists($type, Data::$_settings) ? Data::$_settings[$type] : [];
                 if (Arrays::exists('relationships', $settings)) {
                     if (Arrays::exists($var, $settings['relationships'])) {
                         return Data::getById($var, $this->{$var});
                     }
                 }
             }
             if (Arrays::is($this->{$var}) && count($argv) == 1) {
                 $o = new self();
                 $getter = getter(Arrays::first($argv));
                 $o->populate($this->{$var});
                 return $o->{$getter}();
             }
             if ($this->{$var} instanceof Closure) {
                 if (is_callable($this->{$var}) && count($argv)) {
                     return call_user_func_array($this->{$var}, $argv);
                 }
             }
             return count($argv) && is_null($this->{$var}) ? Arrays::first($argv) : $this->{$var};
         } else {
             if (isset($this->db_instance)) {
                 return $this->db_instance->getValue($this, $var);
             }
             if (isset($this->thin_type)) {
                 $type = $this->thin_type;
                 Data::getModel($type);
                 $settings = Arrays::exists($type, Data::$_settings) ? Data::$_settings[$type] : [];
                 $relationships = Arrays::exists('relationships', $settings) ? $settings['relationships'] : [];
                 if (Arrays::exists($var, $relationships) && 's' == $var[strlen($var) - 1]) {
                     if (Arrays::exists($var, $relationships)) {
                         $res = dm(substr($var, 0, -1))->where("{$type} = " . $this->id)->get();
                         $collection = [];
                         if (count($res)) {
                             foreach ($res as $obj) {
                                 array_push($collection, $obj);
                             }
                         }
                         return $collection;
                     }
                 } elseif (Arrays::exists('defaultValues', $settings)) {
                     if (Arrays::is($settings['defaultValues'])) {
                         if (Arrays::exists($this->{$var}, $settings['defaultValues'])) {
                             return $settings['defaultValues'][$this->{$var}];
                         }
                     }
                 }
             }
             if (count($argv) == 1) {
                 return Arrays::first($argv);
             }
             return null;
         }
     } elseif (substr($func, 0, 3) == 'has') {
         $uncamelizeMethod = Inflector::uncamelize(lcfirst(substr($func, 3)));
         $var = Inflector::lower($uncamelizeMethod);
         if (isset($this->{$var})) {
             return !empty($this->{$var});
         } elseif (isset($this->db_instance)) {
             return $this->db_instance->hasValue($this, $var);
         }
     } elseif (substr($func, 0, 3) == 'set') {
         $value = Arrays::first($argv);
         $uncamelizeMethod = Inflector::uncamelize(lcfirst(substr($func, 3)));
         $var = Inflector::lower($uncamelizeMethod);
         if (!empty($var)) {
             if (isset($this->thin_type)) {
                 Data::getModel($this->thin_type);
                 $fields = Arrays::exists($this->thin_type, Data::$_fields) ? Data::$_fields[$this->thin_type] : [];
                 if (!Arrays::exists($var, $fields)) {
                     throw new Exception($var . ' is not defined in the model => ' . $this->thin_type);
                 } else {
                     $settingsField = $fields[$var];
                     if (Arrays::exists('checkValue', $settingsField)) {
                         $functionCheck = $settingsField['checkValue'];
                         $value = $functionCheck($value);
                     }
                     if (is_object($value)) {
                         if (isset($value->thin_type)) {
                             if ($value->thin_type == $var) {
                                 $value = $value->id;
                             }
                         }
                     }
                 }
             }
             $this->{$var} = $value;
             if (!Arrays::in($var, $this->_fields)) {
                 $this->_fields[] = $var;
             }
             if (isset($this->is_thin_object)) {
                 $name = $this->is_thin_object;
                 $objects = Utils::get('thinObjects');
                 $this->values = null;
                 $objects[$name] = $this;
                 Utils::set('thinObjects', $objects);
             }
             if (isset($this->is_app)) {
                 if (true === $this->is_app) {
                     Utils::set('ThinAppContainer', $this);
                 }
             }
         } elseif (isset($this->db_instance)) {
             return $this->db_instance->setValue($this, $var, $value);
         }
         return $this;
     } elseif (substr($func, 0, 3) == 'add') {
         $uncamelizeMethod = Inflector::uncamelize(lcfirst(substr($func, 3)));
         $var = Inflector::lower($uncamelizeMethod) . 's';
         $value = Arrays::first($argv);
         if (!isset($this->{$var})) {
             $this->{$var} = [];
         }
         if (!Arrays::is($this->{$var})) {
             $this->{$var} = [];
         }
         array_push($this->{$var}, $value);
         return $this;
     } elseif (substr($func, 0, 6) == 'remove') {
         $uncamelizeMethod = Inflector::uncamelize(lcfirst(substr($func, 6)));
         $var = Inflector::lower($uncamelizeMethod) . 's';
         $value = Arrays::first($argv);
         if (isset($this->{$var})) {
             if (Arrays::is($this->{$var})) {
                 if (count($this->{$var})) {
                     $remove = false;
                     foreach ($this->{$var} as $key => $tmpValue) {
                         $comp = md5(serialize($value)) == md5(serialize($tmpValue));
                         if (true === $comp) {
                             $remove = true;
                             break;
                         }
                     }
                     if (true === $remove) {
                         unset($this->{$var}[$key]);
                     }
                 }
             }
         }
         return $this;
     }
     if (Arrays::in($func, $this->_fields)) {
         if ($this->{$func} instanceof Closure) {
             return call_user_func_array($this->{$func}, $argv);
         }
     }
     if (Arrays::exists($func, $this->_closures)) {
         if ($this->_closures[$func] instanceof Closure) {
             return call_user_func_array($this->_closures[$func], $argv);
         }
     }
     if (isset($this->_token)) {
         $id = sha1($func . $this->_token);
         if (Arrays::is($this->values)) {
             if (Arrays::exists($id, $this->values)) {
                 return call_user_func_array($this->values[$id], $argv);
             }
         }
     }
     if (true === hasEvent($func)) {
         array_push($argv, $this);
         return fire($func, $argv);
     }
     if (!is_callable($func) || substr($func, 0, 6) !== 'array_' || substr($func, 0, 3) !== 'set' || substr($func, 0, 3) !== 'get' || substr($func, 0, 3) !== 'has' || substr($func, 0, 3) !== 'add' || substr($func, 0, 6) !== 'remove') {
         $callable = strrev(repl('_', '', $func));
         if (!is_callable($callable)) {
             if (method_exists($this, $callable)) {
                 return call_user_func_array(array($this, $callable), $argv);
             }
         } else {
             return call_user_func_array($callable, $argv);
         }
         if (isset($this->thin_litedb)) {
             $closure = isAke($this->thin_litedb->closures, $func);
             if (!empty($closure) && $closure instanceof Closure) {
                 return $closure($this);
             }
         }
         if (isset($this->db_instance)) {
             return $this->db_instance->{$func}($this, $var, $value);
             call_user_func_array(array($this->db_instance, $func), array_merge(array($this), $argv));
         }
         if (false !== $orm) {
             $db = call_user_func_array($orm, []);
             $fields = array_keys($db->map['fields']);
             if (Arrays::in($func, $fields)) {
                 if (!count($argv)) {
                     return $this->{$func};
                 } else {
                     $setter = setter($func);
                     $this->{$setter}(Arrays::first($argv));
                     return $this;
                 }
             }
             $tab = str_split($func);
             $many = false;
             if (Arrays::last($tab) == 's') {
                 array_pop($tab);
                 $table = implode('', $tab);
                 $many = true;
             } else {
                 $table = $func;
             }
             $object = count($argv) == 1 ? Arrays::first($argv) : false;
             $model = model($table);
             return true === $many ? $model->where($db->table . '_id = ' . $this->id)->exec($object) : $model->where($db->table . '_id = ' . $this->id)->first($object);
         }
         if (false !== $dbjson) {
             $db = $this->model()->db();
             $fields = $db->fields();
             $modelMethods = get_class_methods('Dbjson\\Model');
             if (Arrays::in($func, $fields)) {
                 if (!count($argv)) {
                     return $this->{$func};
                 } else {
                     $setter = setter($func);
                     $this->{$setter}(Arrays::first($argv));
                     return $this;
                 }
             }
             if (Arrays::in($func, $modelMethods)) {
                 return call_user_func_array([$this->model(), $func], $argv);
             }
             $tab = str_split($func);
             $many = false;
             if (Arrays::last($tab) == 's') {
                 array_pop($tab);
                 $table = implode('', $tab);
                 $many = true;
             } else {
                 $table = $func;
             }
             $object = count($argv) == 1 ? Arrays::first($argv) : true;
             $model = jdb($db->db, $table);
             return true === $many ? $model->where($db->table . '_id = ' . $this->id)->exec($object) : $model->where($db->table . '_id = ' . $this->id)->first($object);
         }
         return null;
     }
     return call_user_func_array($func, array_merge(array($this->getArrayCopy()), $argv));
 }
예제 #2
0
파일: Cms.php 프로젝트: schpill/thin
 public static function makeForm($name)
 {
     $html = '';
     $db = dm('adminform');
     $db2 = dm('adminformfield');
     $res = $db->where('name = ' . $name)->get();
     if (count($res)) {
         $form = $db->first($res);
         $html .= '<form class="form-horizontal" action="' . URLSITE . static::__($form->getPage()->getUrl()) . '" id="form_' . Inflector::lower($name) . '" method="post">';
         $html .= Form::hidden('cms_form', $form->getId(), array('id' => 'cms_form'));
         $fields = $db2->where('adminform = ' . $form->getId())->order('hierarchy')->get();
         if (count($fields)) {
             foreach ($fields as $field) {
                 $true = getBool('true');
                 $fieldName = $field->getName();
                 $label = static::__($field->getLabel());
                 $type = $field->getAdminformfieldtype()->getValue();
                 $value = static::__($field->getDefault());
                 $required = $field->getRequired() == $true->getId();
                 if (empty($value)) {
                     $value = null;
                 }
                 switch ($type) {
                     case 'hidden':
                         $html .= Form::hidden($fieldName, $value, array('id' => $fieldName));
                         break;
                     case 'select':
                         $options = explode("\n", $value);
                         $tab = array();
                         foreach ($options as $row) {
                             list($key, $val) = explode('##', $row, 2);
                             $tab[$key] = $val;
                         }
                         $html .= Form::select($fieldName, $tab, null, array('id' => $fieldName, 'required' => $required), $label);
                         break;
                     case 'password':
                         $html .= Form::password($fieldName, array('id' => $fieldName, 'required' => $required), $label);
                         break;
                     default:
                         $html .= Form::$type($fieldName, $value, array('id' => $fieldName, 'required' => $required), $label);
                 }
             }
         }
         $html .= '<div class="control-group" id="control-group-submit"><label for="submit" class="control-label labelrequired">&nbsp;</label><div class="control-group" id="control-group-submit" style="position: relative; left: 20px;">' . Form::submit(static::__($form->getButton())) . '</div></div>';
     }
     return $html;
 }
예제 #3
0
파일: Helper.php 프로젝트: noikiy/inovi
 function cms_objects($collection, $array = false)
 {
     $coll = array();
     $q = dm('collection');
     $res = $q->where('name = ' . $collection)->get();
     if (count($res)) {
         $row = $q->first($res);
         $q = dm('object');
         $objects = $q->where('collection = ' . $row->getId())->get();
         if (count($objects)) {
             foreach ($objects as $object) {
                 $objectLng = Cms::lng($object->getValue());
                 $ini = parse_ini_string($objectLng, true);
                 if (true === $array) {
                     array_push($coll, $ini);
                 } else {
                     $obj = new cmsObj();
                     $obj->populate($ini);
                     array_push($coll, $obj);
                 }
             }
         }
     }
     return $coll;
 }
예제 #4
0
파일: Data.php 프로젝트: schpill/thin
 public static function store($type, $flat, $key = null)
 {
     $settings = Arrays::exists($type, static::$_settings) ? static::$_settings[$type] : static::defaultConfig($type);
     $hook = Arrays::exists('store', $settings) ? $settings['store'] : null;
     static::_hook($hook, func_get_args(), 'before');
     $checkTuple = Arrays::exists('checkTuple', $settings) ? $settings['checkTuple'] : null;
     $indexes = Arrays::exists('indexes', $settings) ? $settings['indexes'] : null;
     if (Arrays::exists('beforeStore', $settings)) {
         $settings['beforeDelete']($type, $flat);
     }
     static::event($type);
     $dir = static::checkDir($type);
     $object = new $type();
     $flat = static::_sanitize($flat);
     $object->populate($flat);
     $serialize = static::serialize($object);
     $edit = !is_null($key);
     $add = !$edit;
     if (true === $add) {
         $key = static::makeKey($type);
     }
     $versionFile = STORAGE_PATH . DS . 'data' . DS . $dir . DS . 'versions' . DS . $key . '_' . Timer::getMS() . '.data';
     if (true === $edit) {
         $oldFile = STORAGE_PATH . DS . 'data' . DS . $dir . DS . 'read' . DS . $key . '.data';
         $oldObject = static::getIt($type, $oldFile);
         if (count($indexes)) {
             foreach ($indexes as $indexField => $indexInfo) {
                 static::indexRemove($indexField, $indexInfo, static::getObject($oldFile));
             }
         }
         if (File::exists($oldFile)) {
             File::delete($oldFile);
         }
     }
     if (!empty($checkTuple)) {
         if (is_string($checkTuple)) {
             $db = dm($type);
             $res = $db->where($checkTuple . ' = ' . $flat[$checkTuple])->get();
         }
         if (Arrays::is($checkTuple)) {
             $query = '';
             foreach ($checkTuple as $ct) {
                 $query .= $ct . ' = ' . $flat[$ct] . ' && ';
             }
             $query = substr($query, 0, -4);
             $tabConditions = explode(' && ', $query);
             $init = true;
             foreach ($tabConditions as $cond) {
                 $db = dm($type);
                 $res = $db->where($cond)->sub();
                 if (true === $init) {
                     $init = false;
                     $results = $res;
                 } else {
                     $results = array_intersect($results, $res);
                 }
             }
             $db = dm($type);
             $res = $db->get($results);
         }
         if (count($res)) {
             $row = $db->first($res);
             static::_hook($hook, array("thin_type" => $type) + $flat, 'after');
             return $row;
         }
     }
     $file = repl(DS . 'versions' . DS, DS . 'write' . DS, $versionFile);
     File::delete($file);
     File::put($file, $serialize);
     $fields = Arrays::exists($type, static::$_fields) ? static::$_fields[$type] : static::noConfigFields($type);
     $versioning = false;
     if (count($fields)) {
         foreach ($fields as $field => $info) {
             $val = $object->{$field};
             if (empty($val)) {
                 if (!Arrays::exists('canBeNull', $info)) {
                     if (!Arrays::exists('default', $info)) {
                         static::_hook($hook, func_get_args(), 'after');
                         throw new Exception('The field ' . $field . ' cannot be null.');
                     } else {
                         $object->{$field} = $info['default'];
                     }
                 }
             } else {
                 if (Arrays::exists('sha1', $info)) {
                     if (!preg_match('/^[0-9a-f]{40}$/i', $val) || strlen($val) != 40) {
                         $object->{$field} = sha1($val);
                     }
                 } elseif (Arrays::exists('md5', $info)) {
                     if (!preg_match('/^[0-9a-f]{32}$/i', $val) || strlen($val) != 32) {
                         $object->{$field} = md5($val);
                     }
                 }
             }
         }
     }
     if (Arrays::exists('versioning', $settings)) {
         $versioning = $settings['versioning'];
     }
     if (false !== $versioning) {
         File::put($versionFile, $serialize);
     }
     if (count($indexes)) {
         $thisObject = static::getById($type, $object->getId());
         foreach ($indexes as $indexField => $indexInfo) {
             static::indexCreate($indexField, $indexInfo, $thisObject);
         }
         static::commit();
     }
     if (Arrays::exists('afterStore', $settings)) {
         if ($settings['afterStore'] instanceof \Closure) {
             $settings['afterStore']($type, $flat);
         }
     }
     static::_hook($hook, func_get_args(), 'after');
     static::emptyCache($type);
     return $object;
 }