Example #1
0
 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 '';
     }
 }
Example #2
0
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;
    }
}
Example #3
0
<?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="" />';
};