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

    • Сервер Apache 2.4+
    • Тип сервера баз данных MySql/Postgresql/LiteSQL
    • Версия интерпретатора php 8.*.*
    • OC: Widows/Linux
    • Установленные модули (zip,unzip)
    • Библиотеки:
        1. Curl
        2.  XMLWriter
        3. SoapClient (не обязательно)
        4. PDO
        5. Smtp
    • Разрешенные функции
        1. exec
        2. eval

Установка системы

Для установки системы скачайте вашу версию с сайта foton.name и распакуйте архив в директорию вашего сайта.
Перейдите по адресу в строке браузера http{s}://вашсайт/install.php или через консоль php install
Создайте базу данных и укажите ее параметры на данной странице, а также лицензионный ключ, после этого войдите в открытую форму указав везде demo, перейдите в модуль Обновление модулей, и обновите модули до последней версии, также рекомендуем обновить ядро системы в верхней панели, а также в разделе пользователи изменить ваши данные, более безопасно создать нового администратора, зайти под ним и удалить demo администратора. Также рекомендуем создать ваш личный ключ нажав на соответствующий значок в верхней панели РСИ, данный ключ требует синхронизации по времени вашего устройства с вашим сервером.
Установка для LiteSQL - Для установки системы скачайте вашу версию с сайта foton.name и распакуйте архив в директорию вашего сайта.
Удалите лишние файлы pbase.sql,base.sql,install.php откройте файл core/setting/main.php и укажите: "host"=>'localhost';
"sql"=>'lite';
"dbname"=>'foton';
"license"=>'вашалицензия';
Далее перейдите по адресу http{s}://вашсайт/admin/, далее шаги такие же как и для других SQL версий.

Создание одностраничного приложения

В качестве базы данных мы будем использовать mysql.
Мы будем использовать только один метод из ядра:
getlist - для вывода списка элементов таблицы
Директории, которые нам понадобятся для работы:
/app/model/site/
/app/controller/site/
/app/view/site/
/app/view/json/site/
/app/view/xml/site/


       Создаем модель
       
Создаем файл news.php в директории /app/model/site/
Заполняем его следующим содержимым:
       
<?
namespace Model\Site;
class news extends \Foton\Model
{
    public function sections()
    {
        return ["news"=>"Новости"];
    }
    public function name()
    {
        return 'Контент';
    }
}
?>

Запрещаем доступ на операции на разделы для ролей пользователей:

<?
    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 (название раздела)
Внутри директории создаем файл 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 —  удаляет все кроме русских, латинских букв и цифр
      

Перейдем в административную часть сайта в меню должен появится пункт Контент с подразделом Новости, давайте создадим 2 новости с любым содержанием.

Создаем контроллер

Перейдем в каталог /app/controller/site/ и создадим файл news.php
со следующим содержимым:



namespace Controller\Site;
use Modules\Test;
use Modules\Test\Classes;

class news extends Model\Site\news{
	public function newslist(){
		return $this->core->getlist(['table'=>'news']);
	}
	public function json(){
		return $this->core->getlist(['table'=>'news','format'=>'J']);
	}
	public function xml(){
		return $this->core->getlist(['table'=>'news','format'=>'X']);
	}
}

 * первый параметр аргумента метода news – название таблицы, далее в методах json и xml мы добавляем поле format – формат вывода

Создаем представление

Перейдем в каталог /app/view/site/ и создадим файл news_view.tpl
со следующим содержимым:

@for:{$data['newslist'] as $news}

@{news['name']}

@{news['description']}
@:@

Также давайте создадим файл /app/view/json/site/news_view.tpl со следующим содержимым:
@{data['json']}
Также создадим файл /app/view/xml/site/news_view.tpl со следующим содержимым:
@arr{data['xml']}
Теперь перейдем в административную панель и обновим кеш шаблонов нажав на значок обновления шаблонов:




Либо через консоль зайдя в корневую директорию вашего сайта введите команду#: php foton up
Затем давайте перейдем по адресу вашсайт/news/, должен отобразится список опубликованных новостей, стили для страницы вы можете добавить создав файл: /app/view/site/css/news.css, js для страницы вы можете добавить создав файл по адресу: /app/view/site/js/news.js
Также перейдя на страницу  вашсайт/news.json мы увидим отображение наших новостей в json формате.
Перейдя на страницу  вашсайт/news.xml мы увидим отображение наших новостей в xml формате.

Полностью код для тестирования по файлам

Файл /app/model/site/news.php:
     
<?
namespace Model\Site;
class news extends \Foton\Model
{
    public function sections()
    {
        return ["news"=>"Новости"];
    }
    public function name()
    {
        return 'Контент';
    }
    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;
    }
}
?> 

Файл /app/controller/site/news.php:

<?php
namespace Controller\Site;
use Modules\Test;
use Modules\Test\Classes;

class news extends Model\Site\news{
	public function newslist(){
		return $this->core->getlist(['table'=>'news']);
	}
	public function json(){
		return $this->core->getlist(['table'=>'news','format'=>'J']);
	}
	public function xml(){
		return $this->core->getlist(['table'=>'news','format'=>'X']);
	}
}

Файл /app/view/site/news_view.tpl:

@for:{$data['newslist'] as $news}

@{news['name']}

@{news['description']}
@:@

файл /app/view/json/site/news_view.tpl со следующим содержимым:
@{data['json']}

файл /app/view/xml/site/news_view.tpl со следующим содержимым:
@arr{data['xml']}

Просмотреть логи ошибок и предупреждений вы можете в консоли вашего браузера.
Для корректной работы отладки в режиме json необходимо указать дополнительный get параметр, например так: /news.json?format=api_json


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