Framework foton
Инструмент для профессиональной разработки web приложений
Модели и миграции


<?
namespace Model\Site;
class названиемодели extends \Foton\Model
{
    public function name(){
        return 'описание'; //описание модели    
    }
    
    public function sections(){
        $arr = array('таблица'=>'описание'); //массив таблиц модели с описанием
        return $arr;
    }

    public function таблица_chmod(){
        return [1,2]; //разрешаем только этим ролям вывод таблиц в меню и просмотр
    }

    public function blocking(){
        $arr = [
            'all' =>[2],
            'update'=>[1,2],
            'insert'=>[2],
            'delete'=>[1],
            'select'=>[2]
        ];
        return $arr;
    }

    // для всех разделов
    public function blockingnews(){
        $arr = [
            'all' =>[2],
            'update'=>[2],
            'insert'=>[2],
            'delete'=>[2],
            'select'=>[2]
        ];
        return $arr;
    }

    // или для конкретной таблицы news
    // роли пользователей можно посмотреть на странице /lists/users/role
    public function interfaces(){
        $arr = [
            "news(название таблицы)" => [
                "field" => ["id", "name", "href", "description","img","status"],//название полей в базе
                "name" => ["id", "Название", "Ссылка", "Описание","Фото","Статус"],//Название полей при выводе           
                "format_select"=>["hidden","input","html","translit:name","img:img","checkbox"],//**название типов данных для вывода
                "format" => ["int", "text", "text", "text", "text", "text"],//*форматы полей в базе
                "delete" => "deleteFotonElement",//название поля для удаления элемента
                "key" => "id"//поле для инкремента таблицы
            ]
        ];
        return $arr;
    }
}

* Для mysql:
'text'=>'text(64300) NOT NULL',
'int'=>'int(70) NOT NULL',
'date'=>'DATE NOT NULL',
'bit'=>'BIT NOT NULL',
'poly'=>'POLYGON NOT NULL',
'real'=>'REAL NOT NULL',
'time'=>'TIME NOT NULL',
'medium'=>'mediumtext NOT NULL'
** все типы данных вы можете посмотреть по ссылке: вашдомен/lists/html/html в поле «Код»

В директории /app/model/site/events мы можем создать директорию по названию модели
А внутри директории создаем файл по названию таблицы, например news.php 

<?
namespace Model\Site\Events\news;
class news
{
    public function before_update($arr){
        $arr['event'] = [
            'require' => ['name'=>'alert','href'=>'alert'], //выведет alert если поле не заполнено *
            'is' => ['href'=>['abc09','fields']], //выполнит проверку на соответствие только лат. буквы и числа в поле href **
            'valid' => ['name'=>'input'], //заменит все содержимое методом валидации input***
            'update' => ['name'=>'test'], //обновит значение поле  name на test
            'text' => 'Не заполнено поле [name]', //что выводить в тексте предупреждения обязательного поля
            'textis' => 'Формат поля [name] должен быть [validate]' //что выводить в тексте предупреждения неправильного формата поля
        ];
        return $arr;
    } 
    
    public function after_update($arr){	// меняем данные после обновления
        return $arr;
    }   

    public function before_insert($arr){ // меняем данные перед добавлением
	    $arr['event'] = 
            [
                'require' => ['name'=>'alert','href'=>'alert'],//*
                'is' => ['href'=>['abc09','alert']], //**
                'text' => 'Не заполнено поле [name]'
        	];
        return $arr;
    }

    public function before_get($arr){ // меняем данные перед выводом
        return $arr;
    }
}


* Методы обработки предупреждений находятся в классе dev/notice.php
alert,log,fields
** значениями массива могут быть:
number — проверяет является ли числом
abc09 —  проверяет содержит ли только русские, латинские буквы и цифры
***значениями массива могут быть:
html — эквивалент htmlspecialchars
input — максимально безопасный способ, убирает все теги и использует html
decode — декодирует html
encode — кодирует html
number — удаляет все кроме цифр
text — удаляет все кроме русских, латинских букв и пробелов
tags — удаляет html теги
abc09 —  удаляет все кроме русских, латинских букв и цифр


Вертикальный шардинг
               
Вертикальный шардинг позволяет обращаться к разным базам данных для хранения и модификации отдельных таблиц, базы данных могут находится на разных серверах.
Для того, чтобы на вашем проекте начал работу вертикальный шардинг необходимо создать базу данных на текущем, либо на другом сервере и перенести в нее стандартные таблицы, которые устанавливаются по умолчанию при установке системы, это необходимо для обработки типов данных в выводе интерфейсов системы.
После этого в файле /dev/sharding.php напишите следующий код:

<?
$arr =
[
    "site"=>
    [
        "html.mvc"=>
        [
            'host' =>'ваш хост',
            "dbname"=>'ваша база',
            "login"=>'ваш логин',
            "pass"=>'ваш пароль'
        ]
    ],
    "admin"=>
    [
        "interface([^/]+)/html"=>
        [
            'host' =>'ваш хост',
            "dbname"=>'ваша база',
            "login"=>'ваш логин',
            "pass"=>'ваш пароль'
        ]
    ]
];

site – массив для публичной части, admin — массив для административной части и содержит он в ключах шаблоны регулярных выражений.
Вместо  html.mvc  - мы пишем название представления и формат представления. Все элементы массива необязательные, здесь вы можете указать любые ключи суперглобального массива и на данной странице они будут переопределены, либо появятся.
Тоже самое касается административной части, только здесь вы указываете путь как в строке браузера от домена без слеша, и можете использовать регулярные выражения, так как обработка подключений к вашей таблице часто бывает специфичной. Теперь все таблицы в модели html будут созданы в новой базе и выводится в публичную часть будут именно из нее.

Горизонтальный шардинг
Для включения горизонтального шардирования для таблицы достаточно добавить ее в настройки /core/setting/main.php 
Например. Если мы хотим, чтобы  таблица   catalog была разбита на партиции по 50 строк и система работала с ними как с единой таблицей нам нужно раскомментировать настройку и добавить настройку в массив для нашей таблицы:
'sharding'=>['catalog'=>50],
Затем через консоль один раз необходимо выполнить 2 команды
php foton shard create  - создаст новый индекс
php foton shard index    - переиндексирует таблицы

CLI Foton

php foton replication import serv1(без указания обновит все) - полностью обновляет текущую базу из настроек /dev/sharding.php servers
php foton replication export serv1(без указания обновит все) - полностью обновляет базы из настроек /dev/sharding.php servers к текущей базе
php foton shard create  - создаст новый индекс
php foton shard index  - переиндексирует таблицы
php foton shard backward table  - откатит индексацию таблицы  table
php foton shard clear table  - очистит партиции таблицы  table
php foton shard upindex table - обновит индексы таблицы
php foton migrate action -   запустит все необработанные миграции
php foton migrate diff info -  покажет все миграции модели info
php foton migrate rollback -    откатит все миграции
php foton migrate type -  вывод типов данных
php foton migrate add info test altertype name int,text  -  создаст миграцию модели info таблице test изменения типа поля name на тип text, типы вы можете посмотреть используя команду php foton migrate type или же в файле /core/setting/custom.php в массиве orm→ваша система хранения данных, также доступны drop,create,add,delete,rename,down,up
php foton migrate add info test  drop – удалит все миграции таблицы test
php foton migrate add info test  create – создаст таблицу  test
php foton migrate add info test add name text – создаст поле name в таблице  test с форматом text
php foton migrate add info test delete name -  удалит поле name в таблице test
php foton migrate add info test rename name newname - переименует поле name в поле newname в таблице test
php foton migrate add info test up – создаст кастомную миграцию для исполнения для таблицы test
php foton migrate add info test down – создаст кастомную миграцию для отката up для таблицы test, файл перед миграцией можно 
отредактировать в директории /system/migrations/site(директория вашего сайта)
php foton migrate addr info test altertype  -  создаст rollback модели info таблице test изменения типа, таже доступны drop,create,add,delete,rename,down,up
php foton migrate addrollback info test  -  создаст общий rollback для таблицы test
php foton migrate migrate info test  -  создаст общую миграцию для таблицы test
php foton migrate create test interfaces  -  создаст таблицу test и rollback

ORM Foton
step 1 ($tb — название таблицы)
create($tb=null) – создание таблицы
insert($tb=null) – запись в таблицу
table($tb=null,$f=null) – вывод из таблицы, $f (fields) – поля для вывода, если не указан выводятся все поля
d($tb=null) — удаление записи
trun($tb=null) — очистка таблицы
up($tb=null,$p=null) — обновление таблицы, $p строка запроса типа «поле='значение',поле='значение'»
drop($tb=null) – удаление таблицы

step 2 ($p – название поля)
where($w=null,$and=null,$group=null) выборка значений (условие если)
$w – строка типа «поле=значение» или массив array(“поле“=>”значение“)
ключ может содержать маску:
array(“!id“=>5) – id!=5
array(“>p“=>5,”<s”=>7) – p>5 и s <7
array(“%text“=>'слово') – text содержит 'слово'
array(“^text“=>'слово') – text начинается с  'слово'
array(“$text“=>'слово') – text заканчивается 'слово'
array(“!text“=>'слово') – text не содержит 'слово'
$and – и,или, по умолчанию «и»
$group – 1 вместо where выражение закрывается в скобки (поле1=2 and поле2='text'), используется только вместе с where(),orf(),andf()
2 -  вместо where выражение остается без изменений, используется только вместе с where(),orf(),andf()
where() - добавляет в запрос WHERE
andf() - добавляет в запрос AND
orf() - добавляет в запрос OR

join($arr) – оператор JOIN (выполняет сравнение на соответствие условию между таблицами)
$arr – array('table1', //1 таблица
array('field1','field2'), // поля 1 таблицы поддерживает маски как в where- (!,<,>)
'table2', //2 таблица
array('field1','field2'), //поля 2 таблицы
'L'); //необязательное
I – inner join (по умолчанию)
L – left join
R – right join
O – outher join
C – cross join
F – full join
пример: array('role',array('id'),'user_inc',array('id'),'L');
return $this->core->table('role')->join($arr)->eq();

like($wp=null,$w=null) — более быстрый поиск like, 
$wp – массив значений полей, либо строка с значением,
$w – массив полей, либо строка с полем

whereArr($wp=null,$w=null) - более быстрый поиск =, 
$wp – массив значений полей, либо строка с значением,
$w – массив полей, либо строка с полем
insert_arr($arr=null) – массив значений для записи array('поле'=>'значение')
field($name,$value) – добавляет создание поля, работают все поля из настроек $FS→orm[драйвер] 
*драйвер orm может быть lite,mysql,pgsql

key($p=null) — создает первичный ключ
limit($f=null,$limit=null,$prev=null) - сортировка DESC
$f – строка поле сортировки,
$limit – количество записей
$prev – номер записи с которой начать

limita($f=null,$limit=null,$prev=null) - сортировка ASC
$f – строка поле сортировки,
$limit – количество записей
$prev – номер записи с которой начать

lim($limit=null,$prev=null) сортировка DESC
$limit – количество записей
$prev – номер записи с которой начать

sorts($sp=null,$s=null)
$sp – поле сортировки
$s – сортировка asc или desc

one($p=null)
$p – поле сортировки, выводит одно значение, сортировка DESC
group($f=null)
группирует, $f – поле по которому произойдет группировка

Step 3
query() - выполняет запрос к базе данных
q() - выполняет запрос prepare – результат объект orm
forq($field_key,$field_value) - выполняет запрос результат массив значений, ключи поля таблицы, и номера, то есть структура  вида array(0=>array(0=>1,id=>1,1=>text,name=>text)); 
Аргументы метода являются необязательными,
$field_key — строка(поле таблицы)
$field_value — строка или массив(поле или поля таблицы)
если они указаны, то выводится массив с ключами значениями поля $field_key и значениями равными значениям поля $field_value, если $field_value является массивом, то значением поля $field_key будет массив значений.
eq() - выводит строку запроса (для тестирования)
cq($echo=null) — выполняет создание таблицы с полями в формате InnoDB, кодировка utf8
c($count=null,$param=array()) - выводит количество затронутых строк в запросе:
$count - если указана переменная не null будет выполнен метод fetchColumn(), если не указана или null rowCount() 
$param - если $param = ['S'=>true] - экранирование " не будет выполнено, 
используется в основном для поиска в сериализованных или json данных


Основные методы работы с базой данных

Методы для работы с базой расположены в файлах mysql,pgsql,litesql для соответствующих систем хранения данных в директории /core/foton/module/orm

selectDB($table=null,$attr=null,$attr2=null,$echo=null)
$table — таблица
$attr — поле таблицы в условии WHERE
$attr2 — значение поля таблицы в условии WHERE
$echo — поля для вывода через ; или одно поле
Выводит массив данных значений полей таблицы

update($table=null,$arr=null,$where=null)
$table — таблица
$arr — Массив данных для обновление [поле=>значение]
$where — строка условия WHERE

del($table = null, $where)
Удаляет данные из таблицу по условию $where,
$table - таблица
$where — массив
[поле=>значение],[поле2=>значение],[(маска)поле3=>значение]
Маска может принимать следующие значения:
= - проверка равно или нет
> - проверка меньше
< - проверка больше
! - не равно
% - содержит значение

ins($table = null, $arr = null,$where = null)
Добавляет данные в таблицу $table из массива $arr по условию $where

fieldTable($table=null,$field=null)
$table — таблица
$field — поля для вывода
Выводит все строки полей таблицы

tableList()
Выводит названия всех таблиц

is($table=null) 
$table — таблица
Проверяет есть ли таблица, возвращает true в случае успеха или false, если таблица не найдена

Работа с типами полей и полями таблицы

alter($arr)
$arr['key'],$arr['type'],$arr['table']
Меняет тип поля key на type

delete($arr)
$arr['field'],$arr['table']
Удаляет поле field в таблице table

altertype($arr)
$arr['field'],$arr['type'],$arr['table']
изменяет типы полей field на типы в массиве type таблицы table

rename($arr)
$arr['table'],$arr['oldfield'],$arr['newfield']
переименовывает столбец с oldfield на newfield

add($arr)
$arr['key'],$arr['type'],$arr['table']
Добавляет поле key с типом type

tableField($table)
$table — таблица
Выводит все поля таблицы   

siteDump($dump = null, $arrNoDel = null)
$dump – если true сохранит, иначе выведет ошибку 
$arrNoDel – массив таблиц, которые не нужно записывать в файл
Создается бекап сайта с  базой данных и сохраняет их в архив по пути 
$FS->backup

sqlDumpFile($file=null,$tableNo=null)
$file – путь к файлу, куда будет загружен дамп базы
$tableNo – массив таблиц, которые не нужно записывать в файл
Создается бекап  базы данных 

fileInsert($file=null)
выполняет запись в базу данных из файла
$file – путь к файлу дампа базы данных

copyTable($table1,$table2)
Копирует таблицу $table1 в таблицу $table2 без переноса данных

copyDateTable($table1,$table2)
Переносит данные из таблицы $table1 в таблицу $table2

renameTable($table1,$table2)
Переименовывает таблицу $table1 в $table2

selectId($table = null, $field = null, $id = null)
Выводит поля массива $field из таблицы $table записи с id==$id

tableSortWhere($valtables=null,$id="id",$sort='DESC',$ceil='0',$w1=null,$w2=null)
Выводит данные из таблицы
$valtables — название таблицы
$id – поле сортировки
$sort — тип сортировки
$ceil — если 0, сортируется как текст, если 1 как цифры
$w1 – поле проверки
$w2 – проверяемое значение для поля
© Copyright 2026 Разработано на Framework Foton
Продукт зарегистрирован в Роспатенте