В файле /core/etting/dev.php вы можете найти основные настройки типов запросов
<?php
$arr['typeFormat'] = [
"function"=>[
"mvc"=>[
"tpl"=>"/app/view/[dir]/[name].tpl",
"php"=>"/app/view/[dir]/[name].php",
"api"=>"/system/api/tpl/[dir]/[name].php"
],
"modul"=>[
"view"=>"/dev/modul/[name]/index.php",
"modul"=>"/dev/modul/[name]/[method]/index.php"
],
"widget"=>[
"view"=>"/dev/widget/".$arr['sitedir']."/[name]/index/template.php",
"style"=>"/dev/widget/".$arr['sitedir']."/[name]/index/style.php",
"script"=>"/dev/widget/".$arr['sitedir']."/[name]/index/script.php"
],
"micro"=>[
"tpl"=>"/dev/service/micro/[name]/return/index.tpl",
"setting"=>"/dev/service/micro/[name]/setting.json"
],
"face"=>[
"view"=>"/app/face/".$arr['admindir']."/tpl/[name].tpl",
"method"=>"/app/face/".$arr['admindir']."/tpl/[name]/[method].tpl"
],
"tpl"=>[
"view"=>"/app/type/".$arr['sitedir']."/tpl/[name].php"
],
"tplfront"=>[
"style"=>"/app/type/".$arr['sitedir']."/css/[name].css",
"script"=>"/app/type/".$arr['sitedir']."/js/[name].js"
],
"ajax"=>[
"ajax"=>"/dev/modul/[name]/ajax.php",
"view"=>"/dev/modul/[name]/ajax/[method].php"
],
"ajaxadmin"=>[
"ajax"=>"/app/ajax/".$arr['admindir']."/[name].php",
"view"=>"/app/ajax/".$arr['admindir']."/".$arr['admindir']."/[name]/[method]/index.php"
],
"ajaxsite"=>[
"ajax"=>"/app/ajax/".$arr['sitedir']."/[name].php",
"view"=>"/app/ajax/".$arr['sitedir']."/".$arr['sitedir']."/[name]/[method]/index.php"
]
],
"admin"=>[
"modul",
"face",
"ajax",
"ajaxadmin",
],
"boot"=>[
"mvc"=>[
"Controller",
"Model"
],
"modul"=>"ModulController",
"widget"=>"Widget",
"micro"=>"Micro",
"face"=>"Faces",
"tpl"=>"Tpl",
"tplfront"=>"Tpl",
"ajax"=>"Ajax",
"ajaxadmin"=>"Ajaxadmin",
"ajaxsite"=>"Ajaxsite"
],
"front"=>[
"mvc"=>[
"css"=>["/app/view/[dir]/css/style.css","/app/view/[dir]/css/[page].css","/app/view/[dir]/css/[head].css","/app/view/[dir]/css/[foot].css"],
"js"=>["/app/view/[dir]/js/jquery.js","/app/view/[dir]/js/script.js","/app/view/[dir]/js/[page].js","/app/view/[dir]/js/[foot].js"]
],
"modul"=>[
"css"=>["/dev/modul/[page]/css/style.css","/dev/modul/[page]/css/face.css"],
"js"=>["/app/view/".$arr['admindir']."/js/jquery.js","/dev/modul/[page]/js/face.js","/dev/modul/[page]/js/script.js"]
],
"face"=>[
"css"=>["/app/view/".$arr['admindir']."/css/style.css","/app/view/".$arr['admindir']."/css/[head].css","/app/view/".$arr['admindir']."/css/[foot].css","/app/face/".$arr['admindir']."/css/[page].css"],
"js"=>["/app/view/".$arr['admindir']."/js/jquery.js","/app/view/".$arr['admindir']."/js/script.js","/app/view/".$arr['admindir']."/js/[head].js","/app/view/".$arr['admindir']."/js/[foot].js","/app/face/".$arr['admindir']."/js/[page].js"]
]
],
"recurse"=>[
"ajaxadmin",
"ajaxsite"
],
"autoload"=>[
"mvc"=>[
"Controller"=>"app/controller/[name].php",
"Model"=>"app/model/[name].php"
],
"modul"=>[
"ModulController"=>"dev/modul/[name]/controller.php",
"ModulModel"=>"dev/modul/[name]/model.php"
],
"widget"=>[
"Widget"=>"dev/widget/".$arr['sitedir']."/[name]/index.php"
],
"micro"=>[
"Micro"=>"dev/service/micro/[name]/return/class.php"
],
"face"=>[
"Faces"=>"app/face/".$arr['admindir']."/php/[name].php"
],
"tpl"=>[
"Tpl"=>"app/type/".$arr['sitedir']."/php/[name].php"
],
"ajax"=>[
"Ajax"=>"dev/modul/[name]/ajax.php"
],
"ajaxadmin"=>[
"Ajaxadmin"=>"app/ajax/".$arr['admindir']."/[name].php"
],
"ajaxsite"=>[
"Ajaxsite"=>"app/ajax/".$arr['sitedir']."/[name].php"
]
]
];Ключ function содержит пути к файлам методов по ключам типов запроса, пути к css,js,php файлам
Ключ admin содержит список значений типов запросов, если тип запроса включен в список, доступ к данному типу будет открыт только для авторизованных в админ панели пользователей
Ключ boot содержит namespace типов запросов
Ключ front содержит списки массивов данных содержащих пути подключения front-end файлов
Ключ recurse содержит типы запросов, в которых может работать вложенность методов и последовательный вызов в текучем интерфейсе как
<?php
$this->core->view()->ajaxsite->test->test2->test3->end();Ключ autoload содержит список с ключами являющимися типами запросов и значениями как список с ключами namespace типов запросов и значениями путями к файлам с соответствующими классами
После добавления своего типа в настройки необходимо добавить файл с определением класса типа запроса по пути /core/foton/view/type/ваштип.php
Вот пример файла для ajax запросов сайта
<?
namespace Foton\View\Type;
final class Ajaxsite{
public function appclass($class,$name){
$arr = explode('\\',$name);
$method = array_pop($arr);
$class = ucfirst($class);
foreach($arr as $item){
$class.= '\\'.ucfirst($item);
}
$class = str_replace('Ajaxsite','Ajaxsite\Site',$class);
return $class;
}
public function datareturn(\Foton\View $view,$obj,$nameSpace){
$arr = explode('\\',$view->page);
$name = array_pop($arr);
if(method_exists($obj,$name)){
if(empty($view->attr)){
$view->data = $obj->$name();
}
else{
$view->data = $obj->$name(...array_values($view->attr));
}
return $view;
}
echo 'Метода не существует';
}
public function render(\Foton\View\Render $render){
$page = $render->view->page;
if($render->init->setting('ajaxsite')){
//переопределяем формат вывода объекта new Format
$render->init->format = 'ajaxsite';
$render->init->wrapper = 'page';
$render->init->page($page);
//подключаем языковые файлы
$render->init->lang();
}
return $render;
}
}Класс обязательно должен быть финализирован, чтобы не было возможности создания дубликата объетка
Также класс должен содержать основные методы:
Создадим пример типа запроса
<?php
$arr['typeFormat'] = [
"function" => [
"mvc" => [
// ...
],
"report" => [ // <-- новый тип
"view" => "/app/report/[dir]/[name].php",
"tpl" => "/app/report/[dir]/[name].tpl"
],
// остальные типы...
],
"admin" => [
// ...
"report", // <-- разрешаем доступ только в админке (если нужно)
],
"boot" => [
// ...
"report" => "Report", // <-- имя класса (без namespace), будет сопоставлено с Foton\View\Type\Report
],
"front" => [
// можно добавить css/js, если отчётам нужны свои стили/скрипты
"report" => [
"css" => ["/app/report/[dir]/css/style.css"],
"js" => ["/app/report/[dir]/js/script.js"]
]
],
"recurse" => [
// если нужна вложенность методов, добавляем сюда
// "report",
],
"autoload" => [
"report" => [
"Report" => "app/report/type/[name].php" // путь к файлу класса типа
]
]
];Создаем файл типа запроса report
<?php
namespace Foton\View\Type;
final class Report
{
/**
* Формирует namespace из URL типа запроса.
* В простом случае можно возвращать тот же класс или модифицировать его.
*/
public function appclass($class, $name)
{
// Для отчётов можно использовать отдельный неймспейс, например:
$arr = explode('\\', $name);
$method = array_pop($arr);
$class = ucfirst($class);
foreach ($arr as $item) {
$class .= '\\' . ucfirst($item);
}
return $class;
}
/**
* Получает данные из метода контроллера и кладёт в $view->data.
*/
public function datareturn(\Foton\View $view, $obj, $nameSpace)
{
$pageParts = explode('\\', $view->page);
$name = array_pop($pageParts);
if (method_exists($obj, $name)) {
if (empty($view->attr)) {
$view->data = $obj->$name();
} else {
$view->data = $obj->$name(...array_values($view->attr));
}
return $view;
}
echo 'Метода не существует';
return $view;
}
/**
* Настраивает формат вывода, обёртку, страницу, языки и т.п.
*/
public function render(\Foton\View\Render $render)
{
$page = $render->view->page;
if ($render->init->setting('report')) {
// Устанавливаем формат вывода специально для отчётов
$render->init->format = 'report';
$render->init->wrapper = 'page';
// Инициализируем страницу
$render->init->page($page);
// Подключаем языковые файлы
$render->init->lang();
}
return $render;
}
}Теперь создаем файл класса Report app/report/type/[name].php
И файл представления /app/report/[dir]/[name].tpl
Добавим содеримое класса
<?php
namespace Report;
class Sales
{
// Метод, который будет вызван при обращении к report-типу
public function summary($month=null)
{
global $FG;
if($month!=null){
return $month;
}
return $FG->get()->month;
}
}И представление для типа запроса
<h1>Отчёт по продажам за @{data['summary'] }</h1> <p>Можно добавить как пример Итого: @{data['total'] }</p> <ul> Можно добавить как пример for:{$data['items'] as $item} <li>@{item['name'])}: @{item['amount'] }</li> @:@ </ul>
Теперь мы можем вызвать наш тип запроса в коде
<?php
$this->core->view()->report->sales->summary->end(['month'=>'2024-09']);Или через запрос в url /sales/summary.report?month=2024-09