public function get($name, $mutilang = false) { if ($this->_options['queryready'] == false) { $this->fetch_data_now(); } if (isset($this->_future_data[$name])) { return $this->_future_data[$name]; } if ($mutilang && doitClass::$instance->lang != '' && doitClass::$instance->lang != '') { if (isset($this->_data[$this->_cursor]) && isset($this->_data[$this->_cursor][doitClass::$instance->lang . '_' . $name]) && $this->_data[$this->_cursor][doitClass::$instance->lang . '_' . $name] != '') { return $this->get(doitClass::$instance->lang . '_' . $name); } } if (isset($this->_data[$this->_cursor])) { //Item.title //Получение одного свойства if (isset($this->_data[$this->_cursor][$name])) { if (isset($this->_data[$this->_cursor]['admin_options']) && $this->_data[$this->_cursor]['admin_options'] != '' && $this->_safe_mode === false) { $admin_options = unserialize($this->_data[$this->_cursor]['admin_options']); if (isset($admin_options[$name])) { return preg_replace_callback('/\\<img\\ssrc=\\"\\/cms\\/external\\/tiny_mce\\/plugins\\/mymodules\\/module\\.php\\?([\\@\\-\\_0-9a-zA-Z\\&]+)\\=([\\-\\_0-9a-zA-Z\\&]+)\\".[^\\>]*\\>/', create_function('$matches', 'if(isset(d()->plugins[str_replace("@","#",$matches[1])])){return d()->call(str_replace("@","#",$matches[1]),array($matches[2]));};return "";'), $this->_data[$this->_cursor][$name]); } } return $this->_data[$this->_cursor][$name]; } if (!in_array($name, doitClass::$instance->datapool['_known_fields'][$this->_options['table']])) { //Item.user //Получение связанного объекта $_is_column_exists = false; if (isset($this->_data[$this->_cursor][$name . '_id'])) { $_is_column_exists = true; } else { //Проверка на факт наличия столбца $name.'_id' $columns = $this->columns(); if ($columns !== false) { $columns = array_flip($columns); //TODO: возможно, array_keys будет быстрее if (isset($columns[$name . '_id'])) { $_is_column_exists = true; } } } if ($_is_column_exists == true) { if (!isset($this->_objects_cache[$name])) { /* кеш собранных массивов */ $ids_array = array(); foreach ($this->_data as $key => $value) { if (!empty($value[$name . '_id'])) { $ids_array[$value[$name . '_id']] = true; } } $ids_array = array_keys($ids_array); $this->_objects_cache[$name] = activerecord_factory_from_table(ActiveRecord::one_to_plural($name))->order('')->where(' ' . DB_FIELD_DEL . id . DB_FIELD_DEL . ' IN (?)', $ids_array); } $cursor_key = $this->_objects_cache[$name]->get_cursor_key_by_id($this->_data[$this->_cursor][$name . '_id'], true); if ($cursor_key === false) { $trash = clone $this->_objects_cache[$name]; return $trash->limit('0')->where('false'); } return $this->_objects_cache[$name][$cursor_key]; } //Item.users //1. Поиск альтернативных подходящих столбцов //TODO: удалить позже $foundedfield = false; //ищем поле item_id в таблице users //??щем таблицу с названием $name (например, users) $columns = $this->columns($name); if ($columns === false && $name == 'template') { return ''; //template - ключевое частозапрашиваемое поле, данный оборот ускорит работу } /* DEPRECATED - лишние запросы if ($columns===false) { $_tmpael = activerecord_factory_from_table($this->_options["table"]); return $_tmpael->find_by('url',$name); } */ //при запросе users возможны несколько случаев //Четрые варианта: 1. есть И user_id, 2. и (3. или) users_to_groups, 4. только вспомогательная таблица //При запросе users_over_memberships преобразуем $name в users $over_position = strpos($name, '_over_'); if ($over_position !== false) { $over_method = substr($name, $over_position + 6); $name = substr($name, 0, $over_position); $_tmpael = activerecord_factory_from_table($name); $second_table_column = ActiveRecord::plural_to_one(strtolower($name)) . '_id'; //Проверка на факт наличия таблицы users_to_groups $ids_array = $this->{$over_method}->select($second_table_column)->to_array; $ids = array(); foreach ($ids_array as $key => $value) { $ids[] = $value[$second_table_column]; } return $_tmpael->where("`id` IN (?)", $ids); } else { $many_to_many_table = $this->calc_many_to_many_table_name($name, $this->_options['table']); $many_to_many_table_columns = $this->columns($many_to_many_table); } if (strpos($name, ' ') !== false) { return ''; } foreach ($columns as $key => $value) { if ($value == $this->_options['plural_to_one'] . "_id") { $_tmpael = activerecord_factory_from_table($name); //Проверка на факт наличия таблицы users_to_groups if ($many_to_many_table_columns != false) { $many_to_many_table_columns = array_flip($many_to_many_table_columns); $first_table_column = $this->_options['plural_to_one'] . "_id"; //group_id $second_table_column = ActiveRecord::plural_to_one(strtolower($name)) . '_id'; //user_id if (isset($many_to_many_table_columns[$first_table_column]) && isset($many_to_many_table_columns[$second_table_column])) { //Таблица users_to_groups существует, и нужные столбцы есть в наличии return $_tmpael->where($this->_options['plural_to_one'] . "_id = ? OR `id` IN (SELECT {$second_table_column} FROM " . et($many_to_many_table) . " WHERE {$first_table_column} = ?)", $this->_data[$this->_cursor]['id'], $this->_data[$this->_cursor]['id']); } } return $_tmpael->where($this->_options['plural_to_one'] . "_id = ?", $this->_data[$this->_cursor]['id']); } } //Третий вариант: есть только users_to_groups $_tmpael = activerecord_factory_from_table($name); //Проверка на факт наличия таблицы users_to_groups if ($many_to_many_table_columns != false) { $many_to_many_table_columns = array_flip($many_to_many_table_columns); $first_table_column = $this->_options['plural_to_one'] . "_id"; //group_id $second_table_column = ActiveRecord::plural_to_one(strtolower($name)) . '_id'; //user_id if (isset($many_to_many_table_columns[$first_table_column]) && isset($many_to_many_table_columns[$second_table_column])) { //Таблица users_to_groups существует, и нужные столбцы есть в наличии $cache_ids = activerecord_factory_from_table($many_to_many_table)->select($second_table_column)->where("{$first_table_column} = ?", $this->_data[$this->_cursor]['id'])->fast_all_of($second_table_column); return $_tmpael->where("`id` IN (?)", $cache_ids); //Медленный вариант уходит в Лету return $_tmpael->where("`id` IN (SELECT {$second_table_column} FROM " . et($many_to_many_table) . " WHERE {$first_table_column} = ?)", $this->_data[$this->_cursor]['id']); } } } return ''; } else { //Item.ramambaharum_mambu_rum return ''; } }
function admin_save_data($params) { if (!iam_allow(url(3))) { return 'Вам запрещён доступ к этому разделу.'; } //TODO: Новое API для добавление новых элементов в базу данных; $elemid = url(4); $scenario = 0; if (isset($_POST['_scenario']) && $_POST['_scenario'] == 'add') { $scenario = 2; } if (isset($_POST['_scenario']) && $_POST['_scenario'] == 'edit') { $scenario = 1; } $orig_params = $params; $iterations = array(); if (isset($_POST['_enable_multiple']) && $_POST['_enable_multiple'] == '1' && url(4) == 'add') { $images = explode(';', $params['image']); foreach ($images as $image) { $params_row = $orig_params; $params_row['image'] = $image; $iterations[] = $params_row; } } else { $iterations[0] = $params; } //FIXME: костыль foreach ($iterations as $params) { $elemid = url(4); if ($elemid == 'add') { if (substr(url(3), -8) == '__fields' && isset($params['field_name']) && $params['field_name'] != '') { if (!preg_match('/^[a-z]+[a-z0-9_]+$/', $params['field_name'])) { d()->_field_name_error_situation = true; d()->_field_name_error = 'Поле должно начинаться с буквы, содержать только латинские буквы и цифры.'; return d()->view(); } if (strlen($params['field_name']) > 75) { d()->_field_name_error_situation = true; d()->_field_name_error = 'Длина поля должна быть менее 80 символов.'; return d()->view(); } if (substr($params['field_name'], 0, 8) == 'deleted_') { d()->_field_name_error_situation = true; d()->_field_name_error = 'Поле не должно начинаться с deleted_ во избежания проблем в будущем.'; return d()->view(); } //Проверка на уже существующий столбец в базе данных полей (метаинформации) if (count(d()->db->query('select * from ' . et(url(3)) . ' where field_name = ' . e($params['field_name']))->fetchAll()) != 0) { d()->_field_name_error_situation = true; d()->_field_name_error = 'Такое поле уже есть.'; return d()->view(); } //Проверка на существование поля в искомой таблице $tablename = substr(url(3), 0, -8); $res = d()->db->query('select * from ' . et($tablename) . ' limit 0'); for ($i = 0; $i < $res->columnCount(); $i++) { $col = $res->getColumnMeta($i); $columns[] = $col['name']; } $columns = array_flip($columns); if (isset($columns[$params['field_name']])) { d()->_field_name_error_situation = true; d()->_field_name_error = 'Вы не можете управлять этим полем.'; return d()->view(); } } } if ($elemid == 'add' || $scenario == '2') { // $params['sort']=$elemid; //Добавление элементов - делаем малой кровью - предварительно создаём строку в таблице $model = activerecord_factory_from_table(et(url(3)), '_safe')->new; $model->save(); //d()->db->exec("insert into `".et(url(3))."` () values ()"); $elemid = $model->insert_id; } if ($scenario == '1') { //Добавление элементов - делаем малой кровью - предварительно создаём строку в таблице $result = d()->db->query("select * from `" . et(url(3)) . "` where `url` = " . e(url(4)) . ""); if ($result) { $line = $result->fetch(); $elemid = $line['id']; } else { // d()->db->exec("insert into `".et(url(3))."` () values ()"); // $elemid=d()->db->lastInsertId(); $model = activerecord_factory_from_table(et(url(3)), '_safe')->new; $model->save(); $elemid = $model->insert_id; } } if (substr(url(3), -8) == '__fields' && url(4) == 'add' && (!isset($params['field_name']) || $params['field_name'] == '')) { $params['field_name'] = 'field' . $elemid; } //FIXME: костыль if (isset($params['url'])) { if ($params['url'] == '') { $params['url'] = to_o(url(3)) . $elemid; } if (substr($params['url'], 0, 1) == '/') { $params['url'] = substr($params['url'], 1); } //$params['url']=str_replace('/','_',$params['url']); } /* $result_str="update `".et(url(3))."` set "; */ $i = 0; $options_field = array(); foreach ($params as $key => $value) { if (preg_match('/\\<img\\ssrc=\\"\\/cms\\/external\\/tiny_mce\\/plugins\\/mymodules\\/module\\.php\\?[\\@\\-\\_0-9a-z\\=A-Z\\&]+\\".[^\\>]*\\>/', $value)) { $options_field[$key] = 1; } } if (count($options_field) != 0) { $params['admin_options'] = serialize($options_field); } else { $params['admin_options'] = ''; } $model = activerecord_factory_from_table(et(url(3)), '_safe')->find($elemid); foreach ($params as $field_name => $value) { $model->{$field_name} = $value; } $model->save(); if (substr(url(3), -8) == '__fields' && url(4) == 'add') { //Добавление столбца в таблицу $tablename = substr(url(3), 0, -8); d()->Scaffold->create_field($tablename, $params['field_name']); } } /* //Устаревший вариант, комментарий будет удалён в ближайших версиях //todo: обеспечить в API foreach($params as $key=>$value) { $i++; if (substr($key,-3)=='_id' && $value == '') { $result_str.=" `" . $key . "`= NULL "; } else { $result_str.=" `" . $key . "`= ".e($value)." "; } if ($i<count($params)) $result_str.=' , '; } $result_str.=" where `id`=".(int)($elemid); $not_reqursy=0; doitClass::$instance->db->exec($result_str); $error_code=doitClass::$instance->db->errorInfo(); $error_code=$error_code[1]; if (1054 == $error_code) { $_res=doitClass::$instance->db->query('SHOW COLUMNS FROM `'.et(url(3)).'`'); $list_of_existing_columns=array(); foreach ($_res->fetchAll(PDO::FETCH_NUM) as $_tmpline) { $list_of_existing_columns[] = $_tmpline[0]; } foreach($params as $value=>$key){ if(!in_array($value,$list_of_existing_columns)){ doitClass::$instance->Scaffold->create_field(et(url(3)),$value); } } doitClass::$instance->db->exec($result_str); } */ if (isset($_POST['_save_and_add'])) { print ' <script> parent.$(".js-iframe-flyer").css("top","20%"); setTimeout(function(){ parent.$(".js-iframe-flyer").css("top","-50%"); },2000); parent.$(".admin_edit_form").removeAttr("target"); </script>'; exit; } if ($_POST['admin_command_redirect_close'] == 'yes') { $tableortype = url(3); if (isset($_GET['type']) && $_GET['type'] != '') { $tableortype = to_p($_GET['type']); } if (isset($_GET['fields']) && $_GET['fields'] != '') { $tableortype = $_GET['fields']; } d()->load_and_parse_ini_file('app/fields/' . $tableortype . '.ini'); if (isset(d()->admin['urlredirect']) && url(4) != 'add') { return "<script> window.opener.document.location.href='" . d()->admin['urlredirect'] . h($params['url']) . "';window.open('','_self','');window.close();</script>"; } else { return "<script> window.opener.document.location.href=window.opener.document.location.href;window.open('','_self','');window.close();</script>"; } } else { header('Location: ' . $_POST['_http_referer']); exit; } }
<?php d()->as_title = function ($value, $field, $object) { if (substr($field, -3) == '_id') { $table = ActiveRecord::one_to_plural(substr($field, 0, -3)); $result = activerecord_factory_from_table($table)->find($value)->select('title'); if ($result->is_empty) { return ''; } return $result->title; } return ''; }; d()->as_object_title = function ($value, $field, $object) { if (substr($field, -3) == '_id') { return $object[substr($field, 0, -3)]['title']; } return ''; }; d()->as_fast_title = function ($value, $field, $object) { if (substr($field, -3) == '_id') { return $object[substr($field, 0, -3)]['title']; } return ''; }; d()->as_preview = function ($value, $field, $object) { if ($value == '') { return ''; } return '<img src="' . d()->preview(array($value, '100', '100')) . '" alt="" />'; };