DevCraft - Разработка приложений

Приветствую!

Это новый и обновлённый сайт maxim-harder.de! Если вы были зарегистрированы на старом сайте, то восстановите свой пароль на сайте!

Создай свой аккаунт!

Информация по использованию

Подключаем сам файл с функционалом. Он содержит все нужные нам функции для управления и создания всех строк. Весь функционал базируется на Semantic UI.
Помним, только для версий DLE выше/равно 13
php:
include_once (DLEPlugins::Check(ENGINE_DIR . '/inc/maharder/assets/functions.php'));
А теперь сами функции.
php:
$cssfiles[]
Чтобы подключить свои стили, достаточно просто добавить файл в массив: $cssfiles[] = "путь_до_файла_или_ссылка";
php:
$jsfiles[]
Действуем так-же, как и со стилями.

Если модуль использует другой язык, можно указать переменную $mh_mod_lang.
Пример: $mh_mod_lang = "de";
По умолчанию: ru
Для этого вам следует скопировать папку ru в /languages/MaHarder/ и переименовать под свой язык. Так, чтобы в конечном итоге было так /languages/MaHarder/my_lang.
В переменной указываем значение my_lang.

Функция impFiles(массив, тип):
Применяется для встраивания скриптов в шаблон сайта. Принимает массив и значение массива.
Пример: impFiles($cssfiles, 'css');
Для типа принимаются значения css и js.

Функция boxes(массив):
Функция создания табов. Обязательна, если нужно отображать информацию в разных табах.
001.png
Сам массив может называться как угодно. Но он должен быть следующего формата:
php:
$boxList = [
    'start' => [
        'name' => "Основные функции",
        'icon' => "home icon",
    ],
    'cron' => [
        'name' => "Настройки крона",
        'icon' => "clock outline icon",
    ],
    'telegram' => [
        'name' => "Настройка бота",
        'icon' => "universal access icon",
    ],
    'templates' => [
        'name' => "Шаблоны",
        'icon' => "pencil alternate icon",
    ],
    'message' => [
        'name' => "Отправить сообщение",
        'icon' => "pen square icon",
    ],
    'author' => [
        'name' => "Автор",
        'icon' => "user circle icon",
    ],
];
Т.е. структура такая:
PHP:
$boxList = [
    'nazvanie_taba' => [
        'name' => "Заголовок",
        'icon' => "Иконки",
    ]
];
nazvanie_taba - Это уникальное название и оно должно быть на латинице. К нему подключается ещё один массив с информацией о табе.
name - Заголовок таба.
icon - Класс иконки. Сойдёт любой класс иконки.
Чтобы вывести их, достаточно прописать boxes($list);

Функция segment(название, содержимое, первый ли таб):
Данная функция выводит всё содержимое на странице для определённого таба. Это одна из самых главных функций.
Название - Уникальное название таба. Указываем название аналогично табу. Т.е. к каждому табу свой сегмент содержания.
Содержимое - Массив данных, который передаётся. Особых настроек к нему не нужно, достаточно простого array.
Первый ли таб - Значение по умолчанию false. Указываем, если сегмент является первым, значение true. Иначе пропускаем. Или не задаём.
Пример: segment('my_name', $list); или segment('my_name', $list, true);

Функция segmentTable(название, содержимое, первый ли таб):
Аналогично segment. Вместо div добавит таблицу. Единственная разница.

Функция addInput(название, содержимое, заглушка, теги, тип):
Функция возвращает строчку input с указанными параметрами
005.png 006.png 007.png
Название - Уникальное название и именование строки ввода. Оно будет так-же сохранено в массиве конфигурации и будет ключом для вывода данных. $massive['название']
Содержимое - Указывается значение из конфигурации. $massive['название']
Заглушка - Иначе - placeholder для пустой строки.
Теги - По умолчанию стоит значение FALSE. Если указать TRUE, то содержимое будет вводится по подобию тегов. Запятая будет разделять значения. Можно не указывать.
Тип - У input есть множество разных типов. Смотри справку здесь. По умолчанию: text
Пример
: addInput('my_name', $list['my_name']) или addInput('my_name', $list['my_name'], true) или addInput('my_name', $list['my_name'], false, 'number')

Функция addCheckbox(название, значение):
Функция возвращает чекбокс, флажок.
003.png 004.png
Название - Уникальное название и именование строки ввода. Оно будет так-же сохранено в массиве конфигурации и будет ключом для вывода данных. $massive['название']
Значение - Указывается выбранное значение. Должно принимать значение формата true/false.
Пример: addCheckbox('название', ($list['название'] == 1) ? true : false)

Функция saveButton(надпись):
Выводит кнопку сохранения в любом месте.
008.png
Надпись - значение не обязательное, но можно заменить на любое вместо "Сохранить"
Пример: saveButton("Отправить")

Функция addTextarea(название, значение, заглушка):
Функция по возвращению текстового поля.
009.png
Название - Уникальное название и именование строки ввода. Оно будет так-же сохранено в массиве конфигурации и будет ключом для вывода данных. $massive['название']
Содержимое - Указывается значение из конфигурации. $massive['название']
Заглушка - Иначе - placeholder для пустого поля.
Пример: addTextarea("text", $massive['text'], "Содержимое заглушки")

Функция addSelect(название, значение, заглушка, выбрано):
Функция по возвращению выпадающего списка.
002.png
Название - Уникальное название и именование строки ввода. Оно будет так-же сохранено в массиве конфигурации и будет ключом для вывода данных. $massive['название']
Значение - Значения для списка, должны быть указаны в массиве.
PHP:
array('name' => 'value', 'name2' = 'value 2')
Заглушка - Иначе - placeholder для пустого поля.
Выбрано - Указывается значение из конфигурации. $massive['название']
Пример: addSelect("name", array('pos1' => "Позиция 1", 'pos2' => "Позиция 2"), "Сделайте выбор", $massive['name'])

Функция addChosenSelect(название, значение, выбрано):
Функция по возвращению выпадающего списка с множественным выбором.
010.png
Название - Уникальное название и именование строки ввода. Оно будет так-же сохранено в массиве конфигурации и будет ключом для вывода данных. $massive['название']
Значение - Значения для списка, должны быть указаны в массиве.
PHP:
array('name' => 'value', 'name2' = 'value 2')
Либо значение должно быть cats. Таким образом выведет все категории сайта.
Выбрано - Указывается значение из конфигурации. $massive['название']
Пример: addSelect("name", array('pos1' => "Позиция 1", 'pos2' => "Позиция 2"), $massive['name']) или addSelect("name", cats, $massive['name'])

Функция segRow(заголовок, описание, действие, идентификатор):
Функция по возврату строки содержимого всего сегмента.
011.png
Заголовок - Выводит заголовок строки жирным текстом.
Описание - Мелким шрифтом выводит описание строки.
Действие - Одна из функций. Список, флажок, строка ...
Идентификатор - Необязательный параметр. Для того, чтобы при нажатии на заголовок подсвечивалось нужное поле. Т.е. идентификатор должен соответствовать названию функции.
Пример: segRow("Заголовок", "Описание заголовка", addInput('my_name', $list['my_name']), 'my_name')

Функция formMessage (идентификатор, заголовок, сообщение, показать):
Внимание!
Кандидат на выбывание

Функция по возврату уведомления или ошибок для формы.
012.png
Идентификатор - Уникальное название уведомления.
Заголовок - Заголовок в жирном тексте
Сообщение - Сообщение.
Показать - По умолчанию значение false. Принимается значение типа boolean.
Пример: formMessage ("test", "Ошибочка", "Описание ошибочки", true)

Функция addList (список = ""):
Внимание!
Кандидат на выбывание

Функция возвращает простой список
13.png
Список - Простой массив
Пример: addList (array("test", "test2", "test 212")

Функция author(тип):
Функция возврата информации об авторе.
014.png
Для этой функции нужны два массива дополнительно: $author и $changes.
$author должен содержать:
php:
$author = [
    'name' => "Maxim Harder",
    'site' => "https://maxim-harder.de",
    'social' => [
        'Telegram' => "https://t.me/MaHarder",
        'E-Mail' => "info@maxim-harder.de",
    ],
];
$changesдолжен содержать:
php:
$changes = [
    '1.4' => [
        'Добавлена поддержка SOCKS5 прокси.'
    ],
    '1.3.3' => [
        'Небольшой фикс со стилями.',
        'Ещё один пункт',
    ],
];
Тип - может иметь следующие значения: name, social, changes
  • name - Вывод имени автора и его сайт
  • social - Вывод типы связи
  • changes - Вывод изменений версий
Пример: author('name')

Функция messageOut(заголовок, сообщение, кнопки, тип):
Похожа на formMessage, однако используется для уведомления после сохранения или изменения содержимого.
015.png
Заголовок - Указываем заголовок оповещения
Сообщение - Указываем содержимое оповещения
Кнопки - Указываем кнопки в массиве.
PHP:
array('ссылка' => "Название ссылки")
Тип - Класс уведомления. По умолчанию info. Подробнее о классах и сообщениях тут.
Пример: messageOut("Всё хорошо", "Сохранение были сохранены", array('ссылка' => "Название ссылки"), 'success')

Функция getXfields(идентификатор, тип):
Функция возврата доп. полей из определённой новости или пользователя.
Идентификатор - ID новости или пользователя
Тип - По умолчанию post. Можно выбрать либо post, либо user.
Если запрос не прошёл - возвратит значение false.
Пример: getXfields(55, $type = "post")

Функция loadXfields(тип):
Функция по возврату всех доп. полей для новостей или пользователей.
Тип - По умолчанию post. Можно выбрать либо post, либо user.
Пример:
loadXfields()

Функция addDocItem (значок, заголовок, подзаголовок, содержимое):
Функция по возврату содержимого окна/вкладки в документации.
016.png
Значок - Любой класс иконки.
Заголовок - Текст заголовка.
Подзаголовок - Текст подзаголовка.
Содержимое - Содержимое всей вкладки.

Пример: addDocItem ('home icon', 'Заголовок', 'Небольшое описание', $content)

Функция stepByStep (позиции, тип):
Функция по возврату списка.
017.png
Позиции - Массив с содержимым
Тип - По умолчанию ol. Можно использовать ul или ol.
Пример: stepByStep (array("soderhimoe", "содержимое", "ещё что-то"), $type = "li")

Функция docMenu(позиции):
Аналог boxes() для документаций.
018.png

Функция docBoxes (название, позиции, первый):
Аналог segment(). Упаковывает содержимое addDocItem().
016.png

Функция docPage (первая колонка, вторая колонка, ссылка на faq, ссылка на ресурс):
Функция компилирует меню и содержимое документации. Конечная функция, которая отображает всё.
019.png
Первая колонка - Колонка для меню, управляющая содержимым.
Вторая колонка - Колонка для самих вкладок. Тут содержится содержимое.
Ссылка на faq - Ссылка на обновляемую документацию, которая находится либо на сайте автора, либо где указал сам автор.
Ссылка на ресурс - Ссылка на новость/ресурс, где опубликован сам модуль
Пример: docPage($menu,$content, "https://", "https://");

Функция getUsers():
Возвращает в массиве всех пользователей в виде id => Имя пользователя.

Функция getCategories (идентификатор новости, ссылка):
Функция возвращает все категории определённой новости.
Идентификатор новости - ID новости
Ссылка - По умолчанию false. Если true, то возвращает категории в виде ссылок.

Функция createTable(тело, заголовок, подвал):
Функция возвращает таблицу.
Тело - Это массив для для tbody.
Массив должен быть таким:
PHP:
array(
    array("Первое значение", "Второе значение"),
    array("Первое значение второй строки", "Второе значение второй строки"),
)
Заголовок - Для thead. Можно упустить.
Массив должен быть таким:
PHP:
array( "ID", "Сервис", "Канал", "Действие")
Подвал - Для tfoot. Можно упустить. Содержимое должно быть таким:
PHP:
$footer = <<<HTML
    <td></td>
    <td>Настройки</td>
    <td>Новый шаблон</td>
    <td>Пагинация</td>
HTML;
Класс pagination:
Класс для создания пагинации для списка.
Создаём новую переменную: $pageNav = new pagination();
Прописываем параметры: $pageNav->getLinks( всего новостей, кол-во новостей на страницу, начать фильтровать новости с определённой новости, кол-во страниц в навигационной панели, название переменной в адресной строке );

Пример использования:
PHP:
// Выставляем кол-во сообщений на страницу
// Если из переменной $xfinf['pages'] ничего нельзя взять, то берём из конфигурации движка
$list = $xfinf['pages'] ? $xfinf['pages'] : $config['news_number'];
// Откуда начинаем отсчёт новостей
// Если параметр page в адресной строке отсутствует или равен 1, то отсчёт начнётся с 0
// А так-же выставляем до какой новости брать из базы данных
// Если параметр page больше 1, то отсчёт начнёт идти со значения page умноженное на кол-во новостей на страницу
// То же самое случается и с ограничением
if(!intval($_GET['page']) || $_GET['page'] == 1) {
    $steps = intval($list);
    $start = 0;
} else {
    $steps = $_GET['page']*intval($list);
    $start = (intval($_GET['page'])-1)*$list;
}

// Запрашиваем общее количество строк из базы данных
$result_count = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_xfieldinform" );

// Подключаем класс пагинации
$pageNav = new pagination();

// Задаём параметры
// $result_count['count'] = сколько всего строк в базе данных (кол-во новостей всего)
// $list = поскольку новостей отображать на страницу
// $start = с какой новости начинать формировать список (это не ID новости)
// 5 = сколько страниц отображать в панели пагинации
// page - параметр, который отвечает за страницы
$pageNav->getLinks( $result_count['count'], $list, $start, 5, 'page');


Примеры использования сегмента:
php:
// Оформляем заголовки и переключатели табов/вкладок
$boxList = [
    'start' => [
        'name' => "Основные функции",
        'icon' => "home icon",
    ],
    'author' => [
        'name' => "Автор",
        'icon' => "user circle icon",
    ],
];

// Выводим эти заголовки
boxes($boxList);

// Формируем блоки для отображения данных
$blockstart = [
    segRow("Включить модуль?", "Включает и выключает модуль", addCheckbox('onof', ($telebot['onof'] == 1) ? true : false), 'onof'),
    segRow("Укажите зависимость", "Укажите поле, от чего будет зависеть отправка уведомления в телеграм.<br>Если это поле в dle_post или dle_post_extra, то впишите <b>post</b>:field|value.<br>Если это значение зависит от доп. поля, то укажите <b>xf</b>:field|value.<br>Как уже понятно, то вместо field вписываем название поля, а вместо value - значение, которое будет влиять на выборку<br>Пример:<br>- xf:telegraminform|1<br>- post:allow_main|1<br>Т.е., при этих значениях в канале телеграма появится информация", addInput('field', $telebot['field'], "Укажите зависимость"), 'field'),
    segRow("Метод подключения", "Для file_get_contents - нужна поддержка <b>allow_url_fopen</b><br>Для cUrl нужна поддержка <b>curl</b><br><br>" . $checkMethod, formMessage('method', $methods, 'Метод подключение', $telebot['method']), 'method'),
    segRow("Включить прокси?", "Включает и выключает прокси", addCheckbox('proxy', ($telebot['proxy'] == 1) ? true : false), 'proxy'),
    segRow("Тип прокси", "Позволяет выбрать тип прокси для подключения. SOCKS5 проски работают ТОЛЬКО с cUrl!", addSelect('proxytype', array('http' => "http(s)", 'socks' => "socks5"), 'Тип прокси', $telebot['proxytype']), 'proxytype'),
    segRow("Укажите IP-Адрес", "Укажите IP-адрес прокси сервера", addInput('proxyip', $telebot['proxyip'], "Укажите IP-адрес"), 'proxyip'),
    segRow("Укажите IP-порт", "Укажите IP-порт прокси сервера", addInput('proxyport', $telebot['proxyport'], "Укажите IP-порт"), 'proxyport'),
    segRow("Нужна ли авторизация?", "Если для проски нужны данные авторизации - включаем ", addCheckbox('proxyauth', ($telebot['proxyauth'] == 1) ? true : false), 'proxyauth'),
    segRow("Укажите пользователя", "Укажите пользователя для прокси сервера", addInput('proxyuser', $telebot['proxyuser'], "Пользователь прокси"), 'proxyuser'),
    segRow("Укажите пароль", "Укажите пароль для прокси сервера", addInput('proxypass', $telebot['proxypass'], "Пароль пользователя"), 'proxypass'),
];

$blockauthor = [
    segRow("Автор", "", author('name')),
    segRow("Документация", "Инструкции по установке, использованию, обновлению...", "<a href=\"{$doc_link}\">{$doc_link}</a>"),
    segRow("Связь", "", author('social')),
    segRow("Версия модуля", "", $version),
    segRow("Изменения", "", author('changes')),
];

// Отображаем наш "конструктор"
// Блок старт должен отображаться в самом начале
segment('start', $blockstart, true);
segment('author', $blockauthor);

// Выводим кнопку сохранения
saveButton();
Пример вывода списка:
php:
// Создаём заголовк таблицы
$head = [
    "",
    "Название",
    "Значение",
    "Получатель",
    ""
];

// Формируем подвал таблицы
$footer = <<<HTML
    <td></td>
    <td colspan="4">
HTML;
// Подключаем пагинацию
if($result_count['count'] > $list) {
    if(!$_GET['page']) $nowPage = 1;
    else $nowPage = $_GET['page'];
    $pageNav = new pagination();
    $footer .= $pageNav->getLinks( $result_count['count'], $list, $start, 5, 'page');
} else {
    $footer .= "";
}
$footer .= "</td>";

// Создаём содержимое таблицы
$body = array();
$db->query("SELECT * FROM " . PREFIX . "_xfieldinform LIMIT $start,$steps");
$all_temps = $db->num_rows();

while ($row = $db->get_array()) {
    $xf_id = intval($row['xf_id']);
    if(!$xf_id) break;

    // Временная строка данных
    $temp = array();
    // Массив с действиями
    $todo = array();
    
    $todo[] = "<div class=\"ui icon top left pointing dropdown button actionButton\"><i class=\"icon settings\"></i><div class=\"menu\">";
    $todo[] = "<a href='{$adminlink}&do=template&action=edit&id={$xf_id}' class=\"item\"><i class=\"edit icon\"></i> Изменить</a>";
    $todo[] = "<a href='{$adminlink}&do=template&action=delete&id={$xf_id}' class=\"item\"><i class=\"delete icon\"></i> Удалить</a>";
    $todo[] = "</div></div>";
    $todo_butons = implode("", $todo);
    unset($todo);
    
    $temp[] = "#{$xf_id}";
    $temp[] = "{$row['name']}";
    $temp[] = "{$row['value']}";
    $temp[] = "{$row['email']}";
    $temp[] = $todo_butons;
    
    $body[] = $temp;
    unset($temp);

}

// Отображаем таблицу на странице
segmentTable("table", createTable($body, $head, $footer), true);
Пример создания страницы документации:
php:
// Создаём ссылки для документации и на продукт на странице автора
$helplink = "https://help.maxim-harder.de/forum/31-telegram-posting/";
$sitelink = "https://maxim-harder.de/dle/71-telegram-posting.html";

// Создаём кнопки навигации
$boxList = [
    'install' => [
        'name' => "Установка",
        'icon' => "tasks icon",
    ],
    'changelog' => [
        'name' => "Изменения",
        'icon' => "sitemap icon",
    ]
];

// Собираем этот список в одну переменную
$columnOne = docMenu($boxList);

// Формируем блоки с содержимым
$install = [
    addDocItem(
        'list ol icon',
        'Установка',
        "Обновляемая документация всегда <a href=\"{$helplink}\" target=\"_blank\">здесь  <i class=\"external alternate icon\"></i></a>",
        stepByStep(array(
            "Установите <b>модуль</b> в админпанеле <a href=\"{$config['http_home_url']}{$config['admin_path']}?mod=plugins\" target=\"_blank\">через систему плагинов  <i class=\"external alternate icon\"></i></a>",
            "Открываем <b>/cron.php</b> и ищем <pre class=\"prettyprint linenums\">\$allow_cron = 0;</pre> и меняем значение на <pre class=\"prettyprint linenums\">\$allow_cron = 1;</pre>",
            "Ищем в <b>/cron.php</b> <pre class=\"prettyprint linenums\">} elseif(\$cronmode == \"antivirus\") {</pre> и ставим выше <pre class=\"prettyprint linenums\">} elseif(\$cronmode == \"telegram\") {
            include_once (DLEPlugins::Check(ENGINE_DIR . \"/ajax/maharder/telegram/cronadd.php\"));
            die (\"done\");
</pre>"
        ))
    ),
];

$changelog = [
    addDocItem(
        'sitemap icon',
        'Изменения в версиях',
        "Обновляемая документация всегда <a href=\"{$helplink}\" target=\"_blank\">здесь  <i class=\"external alternate icon\"></i></a>",
        author('changes')
    ),
];

// Собираем все конструкции блоков воедино
$columnTwo = docBoxes('install', $install, true);
$columnTwo .= docBoxes('changelog', $changelog);

// Отображаем всё на странице
docPage($columnOne, $columnTwo);

Верх