Как создать свой модуль?

    Введение

    Начиная с версии Screen Squid 1.15 появилась возможность расширить функциональность Screen Squid добавляя новые возможности и использовать их в рамках "одного окна". Здесь изложена информация о том, как добавить новый модуль и в качестве примера, будет написан модуль "Hello World" на PHP.

    Среда разработки

    Для того, чтобы начать разрабатывать модуль, вам понадобится:

    • установленный интерпретатор PHP > 5.3 версии;
    • любое удобное средство для написания кода(например Geany, Atom, Блокнот или другое);
    • развернутый на веб-сервере дистрибутив Screen Squid >= 1.15 версии.

    Состав модуля

    Модуль обязательно состоит из файлов:

    Наименование Описание
    1 index.php Фронтенд для пользователя. Здесь необходимо отображать какой-либо текст и/или функционал, который пользователь увидит нажав на название модуля на странице "Менеджер модулей".
    2 module.php Здесь описывается класс модуля с необходимыми функциями и процедурами.

    Важное замечание: придумав название модуля, например HelloWorld, вы должны создать каталог HelloWorld в директории /screensquid/modules.

    Важное замечание 2: Название класса должно точно совпадать с названием каталога в котором размещен модуль. Например, в каталоге HelloWorld, в файле module.php, класс должен быть объявлен так - class HelloWorld . Название регистрозависимо.

    Можно создавать дополнительные файлы, например, если они нужны для навигации по разным страницам модуля. В некоторых модулях мы добавляем скрипты на Perl, которые используются в бэкэнде, например, для подсчёта трафика по алиасу в модуле Quotas. Другими словами, вы можете создать сколько угодно файлов в каталоге, на любых языках программирования если они необходимы вашему модулю.

    Обязательные функции класса

    При создании класса модуля, обязательно наличие следующих функций:

    Наименование функции Описание
    1 __construct Конструктор модуля, вызывается при создании экземпляра объекта в index.php модуля. Рекомендуется здесь создавать подключение к базе данных и языковые файлы модуля.
    2 GetDesc Возвращает описание модуля. Например, "Модуль HelloWorld, который ничего не делает".
    3 Install Производит необходимые действия для установки модуля. Вызывается из интерфейса менеджера модулей нажатием ссылки "Установить". После успешной установки, перезагрузите страницу. Вы увидите название вашего модуля раскрыв список "Менеджер модулей" в главном меню.
    4 Uninstall Производит необходимые действия для удаления модуля. Вызывается из интерфейса менеджера модулей нажатием ссылки "Удалить"

    Чтобы Screen Squid "узнал" о том, что модуль установлен, необходимо занести информацию в таблицу scsq_modules. Пример SQL запроса для добавления модуля в таблицу:

    INSERT INTO scsq_modules (name,link) VALUES ('HelloWorld','modules/HelloWorld/index.php');";
    

    Итак, пишем код

    module.php

    <?php
    
    
    class HelloWorld
    {

    function __construct($variables){ //
    $this->vars = $variables;
    include_once(''.$this->vars['root_dir'].'/lib/functions/function.database.php');
    include_once(''.$this->vars['root_dir'].'/lib/functions/function.reportmisc.php');
    if (file_exists("langs/".$this->vars['language']))
    include("langs/".$this->vars['language']); #подтянем файл языка если это возможно
    else
    include("langs/en"); #если перевода на язык нет, то по умолчанию тянем английский.

    if (file_exists("../../lang/".$this->vars['language']))
    include("../../lang/".$this->vars['language']); #подтянем глобальный файл языка
    $this->lang = $_lang;
    }

    function GetDesc()
    {
    return "Это модуль Hello World, который ничего не делает!";
    }

    function Install()
    {

    #если модуль уже есть, то вернемся.
    if(doQueryExistsModule($this->vars,'HelloWorld')>0) {
    echo "<script language=javascript>alert('Module already installed')</script>";
    return;
    }

    $UpdateModules = "
    INSERT INTO scsq_modules (name,link) VALUES ('ExportRep','modules/HelloWorld/index.php');";

    doQuery($this->vars, $UpdateModules) or die ("Can`t update module table");



    echo "<script language=javascript>alert('".$this->lang['stINSTALLED']."')</script>";
    }
    function Uninstall()
    {

    $UpdateModules = "
    DELETE FROM scsq_modules where name = 'HelloWorld';";

    doQuery($this->vars, $UpdateModules) or die ("Can`t update module table");

    echo "<script language=javascript>alert('".$this->lang['stUNINSTALLED']."')</script>";

    }


    }
    ?>
    

    index.php

    <?php 
    
    include("../../config.php");
    #если нет авторизации, сразу выходим
    if ((!isset($_COOKIE['loggedAdm'])or($_COOKIE['loggedAdm']==0))
    and (file_exists("".$globalSS['root_dir']."/modules/PrivateAuth/pass"))
    and (!file_exists("".$globalSS['root_dir']."/modules/PrivateAuth/hash"))
    )
    {
    header("Location: ".$globalSS['root_http']."/modules/PrivateAuth/login.php"); exit();
    }

    $language=$globalSS['language'];

    include("module.php");
    include_once("../../lang/$language");

    if (file_exists("langs/".$language))
    include("langs/".$language); #подтянем файл языка если это возможно
    else
    include("langs/en"); #если перевода на язык нет, то по умолчанию тянем английский.

    include_once(''.$globalSS['root_dir'].'/lib/functions/function.misc.php');
    include_once(''.$globalSS['root_dir'].'/lib/functions/function.database.php');

    if(isset($_GET['srv']))
    $srv=$_GET['srv'];
    else
    $srv=0;


    $header='<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <!-- The themes file -->
    <link rel="stylesheet" type="text/css" href="'.$globalSS['root_http'].'/themes/'.$globalSS['globaltheme'].'/global.css"/>



    </head>
    <body>
    ';

    echo $header;



    if(isset($_GET['date']))
    $querydate=$_GET['date'];
    else
    $querydate=date("d-m-Y");

    if(isset($_GET['date2']))
    $querydate2=$_GET['date2'];
    else
    $querydate2="";

    //Создадим экземпляр класса
    $HelloWorld_ex = new HelloWorld($globalSS);


    echo "<h2>Модуль Hello World</h2><br />";
    $start=microtime(true);
    echo "<p>Добро пожаловать в модуль HelloWorld который ничего не делает.</p>";

    //visual part
    ?>




    $end=microtime(true);

    $runtime=$end - $start;

    echo "<br /><br /><font size=2>".$_lang['stEXECUTIONTIME']." ".round($runtime,3)." ".$_lang['stSECONDS']."</font><br />";

    echo $_lang['stCREATORS'];

    $newdate=strtotime(date("d-m-Y"))-86400;
    $newdate=date("d-m-Y",$newdate);



    ?>
    <form name=fastdateswitch_form>
    <input type="hidden" name=date_field_hidden value="<?php echo $newdate; ?>">
    <input type="hidden" name=dom_field_hidden value="<?php echo 'day'; ?>">
    <input type="hidden" name=group_field_hidden value="<?php echo $currentgroupid; ?>">
    <input type="hidden" name=groupname_field_hidden value="<?php echo $currentgroup; ?>">
    <input type="hidden" name=typeid_field_hidden value="<?php echo $typeid; ?>">
    </form>
    </body>
    </html>
    
    

    После создания этих двух файлов, ваш первый модуль для Screen Squid готов. Вы можете начать дополнять их необходимым вам функционалом.

    Мультиязыковая поддержка

    В файле index.php подключается главный конфигурационный файл config.php, где есть параметр $language. Вы можете использовать его для того, чтобы осуществить мультиязыковую поддержку в своём модуле. Создайте каталог langs в директории с модулем и положите туда массив переменных $_lang. Примером файла может служить основные языковые файлы, которые размещены в каталоге screensquid/lang. После того, как вы создали эти файлы, подключите их через директиву include. Имеет смысл давать языковым файлам смысловую окраску вида - ru - русский, en - английский и так далее.

    Идеи, баги, вопросы?

    Сообщи нам t.me/screensquid