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

Внешние модули отличаются тем, что могут иметь рабочий интерфейс для взаимодействия с пользователем.
Внешние модули хранятся в директории /modul
Структура внешнего модуля
Внешний модуль хранится в директории с названием модуля.
Назовем модуль module
Создадим папку
/dev/modul/module
Структура папки
css – папка со стилями модуля, все файлы в корне этой директории подключаются автоматически при инициализации модуля
js - папка со скриптами модуля, все файлы в корне этой директории подключаются автоматически при инициализации модуля
item – директория содержит страницы модуля
ajax.php — ajax методы модуля
controller.php — контроллер модуля
model.php — модель модуля
index.php — главный файл модуля
install._! - файл инициализации, если он есть, значит модуль активен, если нет, значит модуль выключен, либо удален в зависимости от настроек модели модуля.
ajax.php — содержит одноименный класс, по названию файла
и наследуется от контроллера.

<?
namespace Ajax;
class module  extends \ModulController\module{


}?>

Создадим метод method1

<?
namespace Ajax;
class module extends \ModulController\module{
    public function method1(){
        echo 'Метод 1';
    }
}?>

Теперь при выполнении аякс запроса, например в файле /modul/module/js/script.js

$.ajax({ 
    type: "POST",
    url: "/module/method1.ajax",
        success: function(data){
        console.log(data);
        }
});


Или при переходе в браузере на страницу /module/method1.ajax
мы получим  - Метод 1
Также вы можете создать представления метода ajax создав файл /dev/modul/module/ajax/method1.php
И вывести туда ваше содержимое, обращаясь к return метода через $data.

Внимание!!! Метод, как и Модуль инициализируется только для авторизованных пользователей с определенными правами.

controller.php — содержит одноименный класс, по названию файла
и наследуется от модели.

<?
namespace ModulController;
class module extends \ModulModel\module{


}?>

Создадим метод post1

<?
namespace ModulController;
class module  extends \ModulModel\module{
	public function post1(){
		global $FG;
		if(isset($FG->post()->num)){
			return  $this->number($FG->post()->num);
		}
	}
}?>

model.php — содержит одноименный класс, по названию файла
и наследуется от модели ядра.

<?
namespace ModulModel;
class module extends \Foton\Model{


}?>


Создадим метод number

<?
namespace ModulModel;
class module extends \Foton\Model{
	public function number($text=null){
		if(i$text!=null){
			return  $this->core->isValidate->number($text);
		}
		else{
			return $this->core->log('Ошибка, не  указана сигнатура');
		}
	}
}
?>

Теперь при передаче данных POST $_POST['num'] например из файла index.php в переменной $data['post1'] будет содержаться числовое значение преданного post параметра.
Методы модели модуля:

<?
public function name(){
    return 'Мой модуль'; //метод передает название модуля           
}
public function modul_chmod(){
    return ['1,2']; //метод передает список ролей пользователей, для которых данный модуль будет активным
}
public function version(){
	return '1'; //версия вашего модуля целое или дробное число, например 1.5
}
public function version_up(){
	return array("host"=>"(ваш url)","date"=>array('массив данных при обновлении'));
}

public function install(){
	$connect=array("index"=>array("host"=>"(ваш 	url)","method"=>"post","date"=>array('массив данных при инсталляции'))); //записываем данные ответа в переменную $data["index"] 
	return $connect;
}

после инициализации install был произведен запрос на наш url c post данным из массива "date", результат ответа записался в $data["index"] 
далее сам метод инсталляции  install_m

<?
public function install_m ($data=null) {
	global $FS;
	file_put_contents($FS->path."/modul/modul/index.php",$data["index"]);
	//здесь мы можем выполнять любые действия с нашим массивом $data, в 	данном случае мы записываем данные $data["index"] в файл 
}
public function up(){
	$connect=array("index"=>array("host"=>"(ваш url)","method"=>"post","date"=>array('массив данных при инсталляции'))); // записываем данные ответа в переменную $data["index"] 
	return $connect;
}

после инициализации up был произведен запрос на наш url c post данным из массива "data", результат ответа записался в $data["index"], отличие от метода install только в вызове, данный метод вызывается при обновлении модуля, а не при его инсталляции. Обновление доступно через модуль обновлений только при условии, что версия модуля на вашем сервере больше чем версия на сервере клиента.

public function up_m ($data=null) {
	global $FS;
	file_put_contents($FS->path."/modul/modul/index.php",$data["index"]);
	//здесь мы можем выполнять любые действия с нашим массивом $data, в 	данном случае мы записываем данные $data["index"] в файл, тем самым 	обновляя его
}
public function del(){
	$connect=array("index"=>array("host"=>"(ваш url)","method"=>"post","date"=>array('массив данных при инсталляции'))); // 	записываем данные ответа в переменную $data["index"] 
	return $connect;
}

после инициализации del был произведен запрос на наш url c post данным из массива "date", результат ответа записался в $data["index"], отличие от метода install только в вызове, данный метод вызывается при удалении модуля, а не при его инсталляции. Удаление доступно только для установленных модулей, при удалении в корне модуля автоматически удаляется файл install._! Также удаление не означает полное удаление модуля, вы можете просто изменить данные, либо закрыть доступ, главное при условии, что вы оставляете ваш модуль соблюдать правила пустого шаблона модуля, для работоспособности всей системы.

public function del_m ($data=null) {
	global $FS;
	$file = new Foton\Module\File();
	unlink($FS->path."/modul/modul/index.php");
	$this->core->log('Файл /modul/modul/index.php удален');
	//Вот так делать нельзя, ваш модуль будет неполным
	//1. Вариант: вы удаляете весь модуль полностью 
	$filedirDelete($FS->path."/modul/modul”);
	$this->core->log('Модуль modul удален');
	//и пользователю нужно будет скачать ваш модуль снова
	//2. Вариант: вы очищаете файл index.php
	file_put_contents($FS->path."/modul/modul/index.php",””);
	$this->core->log('Файл /modul/modul/index.php удален');
}

Структура пустого шаблона модуля для корректной работы системы
/dev/modul/module
Структура папки
css – папка со стилями модуля, все файлы в корне этой директории подключаются автоматически при инициализации модуля
js - папка со скриптами модуля, все файлы в корне этой директории подключаются автоматически при инициализации модуля
вы можете создать директорию submodule – это будет ваш подмодуль,  в модуле мы можем обратится к нему в строке браузера так: /module/submodule.modul
css – папка со стилями подмодуля
js - папка со скриптами подмодуля
ajax.php — ajax методы подмодуля
index.php — главный файл подмодуля
ajax.php — содержит одноименный класс, по названию файла
и наследуется от контроллера.

<?php
namespace Ajax\module;
class submodule extends \Foton\Model
{ 
	public function test(){
		global $FS;
		return $FS->path;
	}
}?>


Создаем файл /dev/modul/module/submodule/ajax/test.php
И вывести туда 
<? echo $data[‘test’];?>
ЧПУ вашего модуля /module.modul
подмодуля /module/submodule.modul
Ajax запроса субмодуля
/module/submodule/test.ajax
© Copyright 2026 Разработано на Framework Foton
Продукт зарегистрирован в Роспатенте