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



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

Для самостоятельной работы с миграциями используйте
use Foton\Module\Face\BasicOperation;

create($table,$interfaces) 
Передается название таблицы и массив таблицы из метода интерфейса модели
Метод создает таблицу с указанными в методе интерфейса полями, если таблица уже существует выведет false

add($table,$arr)
Передается название таблицы и массив ['название поля'=>'тип поля']
Добавляет поле в таблицу

delete($table,$arr)
Передается название таблицы и массив ['название поля'=>'тип поля']
Удаляет поле из таблицы

rename($table,$arr)
Передается название таблицы и массив ['старое название поля'=>'новое название поля']
Переименовывает поле в таблице

altertype($table,$arr)
Передается название таблицы и массив ['название поля'=>['старый формат'=>'новый формат']]
Меняет формат поля в таблице

Для работы с CRUD  методами используйте
use Foton\Module\App\Admin для административной части
use Foton\Module\App\Site для публичной части сайта

update($table,$arr,$where) - обновляет данные из массива $arr по условию $where

insert($table = null,$arr = null,$key='id') - добавляет данные в таблицу из массива $arr, $key - ключ таблицы

create($table = null,$arr = [],$key='id') - добавляет поля в таблицу из массива $arr, $key - ключ таблицы

delete($table = null, $where = []) - удаляет данные из таблицы по условию $where

getlist($arr) - выводит данные из таблицы аналогично $this->core->getlist()

count($arr) - выводит количество записей из тадлицы, содержит ключи table - имя таблицы и where - условие выборки (необязательное)



Расширенные методы для работы с таблицей


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

© Copyright 2026 Разработано на Framework Foton
Продукт зарегистрирован в Роспатенте