function to_p($one) { return ActiveRecord::one_to_plural($one); }
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 ''; } }
<?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="" />'; };