Новости Joomla

Свои типы полей в Joomla.

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note" name="your_note_for_user" label="Заголовок примечания" title="Альтернативный способ для заголовка" description="Текст примечания" class="col-12 alert alert-info" heading="h1" close="true" />

heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён. Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

<field type="systempluginstatus" name="systempluginstatus" addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>

-

type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

<?php // namespace для атрибута addfieldprefix namespace Joomla\Module\Wtquicklinks\Site\Fields; // нельзя напрямую обращаться к этому файлу defined('_JEXEC') or die; // подключаем родительский класс для переопределения use Joomla\CMS\Form\Field\NoteField; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; // имя класса и имя файла точь-в-точь class SystempluginstatusField extends NoteField { protected $type = 'Systempluginstatus'; protected function getLabel() { // если плагин не включён if(PluginHelper::isEnabled('system','wtquicklinks')) { // меняем свойства родительского класса $this->class = 'alert alert-danger w-100'; $this->element['label'] = '⚠️ А-а-а-а!'; $this->element['description'] = 'Плагин не включён!!'; // и просто рендерим его с нашими свойствами return parent::getLabel(); } // А иначе всё хорошо, скрываем поле из виду. $this->parentclass = 'd-none'; return ''; } }

Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

0 Пользователей и 1 Гость просматривают эту тему.
  • 8 Ответов
  • 1030 Просмотров
*

phvsfpgs

  • Захожу иногда
  • 215
  • 8 / 0
  • В погоне за обновлением Joomla и новым проблемам
Кнопка для скачивания
« : 19.08.2018, 20:24:53 »
Тема наверно глобальная, подскажите пожалуйста, существует ли плагин для создания кнопки в которой можно установить таймер и изображение кнопки? Чтоб в панели инструментов появилась функция установить кнопку с ссылкой. (Для разработчиков неплохая идея).

И как это можно реализовать в материале?

Пример:



Пример:

*

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Re: Кнопка для скачивания
« Ответ #1 : 19.08.2018, 20:40:34 »
Так что бы в панель управления была кнопка, на прямую не так просто вывести (только костылями), но если надо в содержимом материала, то это уже куда легче...
Хотя на странице подробностей материала есть также события перед и после основного содержимого материала, туда то и можно выводить.
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

phvsfpgs

  • Захожу иногда
  • 215
  • 8 / 0
  • В погоне за обновлением Joomla и новым проблемам
Re: Кнопка для скачивания
« Ответ #2 : 19.08.2018, 21:12:18 »
Проблема в том, что нужно задержать гостей на 30-60 сек, прежде чем они начнут скачивать. А зарегистрированным будет прямая ссылка без времени.
*

phvsfpgs

  • Захожу иногда
  • 215
  • 8 / 0
  • В погоне за обновлением Joomla и новым проблемам
Re: Кнопка для скачивания
« Ответ #3 : 20.08.2018, 04:49:05 »
Это сделано, каким то скриптом который вставляется в материал, при нажатии на кнопку идёт время и появляется ссылка, как можно это осуществить, чтоб не вставлять постоянно этот код, ну и опять же разделить гость и зарегистрированый? Ну или приблизить косметически как выше на скриншоте.

Код
<html>
 
<head></head>
 
<body>
    <div>
        <span style="color: #000; font-size: 100%; font-weight: bold;"></span>
        <input id="btn1" class='btn' type="button" value="Click" onclick="startTimer()" seconds="10" />
    </div>
    <div>
        <span style="color: #000; font-size: 100%; font-weight: bold;"></span>
        <input id="btn2" class='btn' type="button" value="Click" onclick="startTimer()" seconds="12" />
    </div>
    <script>
 
 
    Date.prototype.addSeconds = function(h) {
        this.setTime(this.getTime() + (h * 1000));
        return this;
    };
 
 
    Number.prototype.zpad = function() {
        return this.toString().length == 1 ? '0' + this : this.toString();
    };
 
 
    function calc_timer(secs) {
        var timer_obj = new Date().addSeconds(secs);
        var sec_diff = (timer_obj - new Date()) / 1000;
        var h = Math.floor(sec_diff / 3600);
        var m = Math.floor((sec_diff - h * 3600) / 60);
        var s = Math.round(sec_diff - h * 3600 - m * 60);
 
        return [h, m, s];
    }
 
 
    function set_text(e, h, m, s) {
        e.innerHTML = h.zpad() + ":" + m.zpad() + ":" + s.zpad();
    }
 
 
    for (var e of document.getElementsByClassName('btn')) {
        var [hours, minutes, seconds] = calc_timer(Number(e.getAttribute("seconds")));
        set_text(e.previousElementSibling, hours, minutes, seconds);
 
        e.onclick = function() {
            startTimer(this.previousElementSibling, hours, minutes, seconds);
        }
    }
 
 
    function startTimer(e, h = hours, m = minutes, s = seconds) {
 
        if (s == 0) {
            if (m == 0) {
                if (h == 0) {
                    e.nextElementSibling.style.display = "none";
                    e.innerHTML = '<a href="http://programm.ho.ua/feedback.php">link</a>';
                    return;
                }
                h--;
                m = 1;
            }
            m--;
            s = 59;
        } else s--;
 
        set_text(e, h, m, s);
        setTimeout(function() {
            startTimer(e, h, m, s);
        }, 1000);
    }
    </script>
</body>
 
</html>
*

rkron

  • Захожу иногда
  • 316
  • 7 / 0
Re: Кнопка для скачивания
« Ответ #4 : 20.08.2018, 07:04:17 »
Это сделано, каким то скриптом который вставляется в материал, при нажатии на кнопку идёт время и появляется ссылка, как можно это осуществить, чтоб не вставлять постоянно этот код, ну и опять же разделить гость и зарегистрированый? Ну или приблизить косметически как выше на скриншоте.

Код
<html>
 
<head></head>
 
<body>
    <div>
        <span style="color: #000; font-size: 100%; font-weight: bold;"></span>
        <input id="btn1" class='btn' type="button" value="Click" onclick="startTimer()" seconds="10" />
    </div>
    <div>
        <span style="color: #000; font-size: 100%; font-weight: bold;"></span>
        <input id="btn2" class='btn' type="button" value="Click" onclick="startTimer()" seconds="12" />
    </div>
    <script>
 
 
    Date.prototype.addSeconds = function(h) {
        this.setTime(this.getTime() + (h * 1000));
        return this;
    };
 
 
    Number.prototype.zpad = function() {
        return this.toString().length == 1 ? '0' + this : this.toString();
    };
 
 
    function calc_timer(secs) {
        var timer_obj = new Date().addSeconds(secs);
        var sec_diff = (timer_obj - new Date()) / 1000;
        var h = Math.floor(sec_diff / 3600);
        var m = Math.floor((sec_diff - h * 3600) / 60);
        var s = Math.round(sec_diff - h * 3600 - m * 60);
 
        return [h, m, s];
    }
 
 
    function set_text(e, h, m, s) {
        e.innerHTML = h.zpad() + ":" + m.zpad() + ":" + s.zpad();
    }
 
 
    for (var e of document.getElementsByClassName('btn')) {
        var [hours, minutes, seconds] = calc_timer(Number(e.getAttribute("seconds")));
        set_text(e.previousElementSibling, hours, minutes, seconds);
 
        e.onclick = function() {
            startTimer(this.previousElementSibling, hours, minutes, seconds);
        }
    }
 
 
    function startTimer(e, h = hours, m = minutes, s = seconds) {
 
        if (s == 0) {
            if (m == 0) {
                if (h == 0) {
                    e.nextElementSibling.style.display = "none";
                    e.innerHTML = '<a href="http://programm.ho.ua/feedback.php">link</a>';
                    return;
                }
                h--;
                m = 1;
            }
            m--;
            s = 59;
        } else s--;
 
        set_text(e, h, m, s);
        setTimeout(function() {
            startTimer(e, h, m, s);
        }, 1000);
    }
    </script>
</body>
 
</html>

Это делается плагином
*

phvsfpgs

  • Захожу иногда
  • 215
  • 8 / 0
  • В погоне за обновлением Joomla и новым проблемам
Re: Кнопка для скачивания
« Ответ #5 : 20.08.2018, 07:55:54 »
Найти бы этот плагин
*

rkron

  • Захожу иногда
  • 316
  • 7 / 0
Re: Кнопка для скачивания
« Ответ #6 : 20.08.2018, 10:40:57 »
Найти бы этот плагин
Можно написать
*

phvsfpgs

  • Захожу иногда
  • 215
  • 8 / 0
  • В погоне за обновлением Joomla и новым проблемам
Re: Кнопка для скачивания
« Ответ #7 : 20.08.2018, 18:32:48 »
Можно написать

Он уже написан добрым человеком beliyadm, вот только как его сделать в плагин или модуль, я не знаю. Вот его работа: Кнопка для скачивания

Как эту систему вставлять в материал, с разными ссылками? И разделить гостей от зарегистрированых.
*

rkron

  • Захожу иногда
  • 316
  • 7 / 0
Re: Кнопка для скачивания
« Ответ #8 : 20.08.2018, 18:49:59 »
Он уже написан добрым человеком beliyadm, вот только как его сделать в плагин или модуль, я не знаю. Вот его работа: Кнопка для скачивания

Как эту систему вставлять в материал, с разными ссылками? И разделить гостей от зарегистрированых.
Этого мало. Нужна кнопка вставки ссылки в редактор и сам плагин с проверкой пользователей и выводом ссылки. Кнопку я уже наваял, плагин я думаю, завтра допишу 
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Менеджер шаблонов: не работают кнопка "Сохранить" "Закрыть" и тд

Автор darkghost

Ответов: 2
Просмотров: 721
Последний ответ 22.11.2021, 21:14:11
от darkghost
Кнопка читать далее + свой текст

Автор robotwerder

Ответов: 4
Просмотров: 802
Последний ответ 16.02.2021, 13:21:08
от robotwerder
Как добавить документ pdf c возможностью скачивания на главную страницу сайта?

Автор Yulya_ivanova

Ответов: 1
Просмотров: 503
Последний ответ 28.12.2020, 11:11:05
от Yulya_ivanova
Исчезает кнопка с dropdown в Uikit

Автор pvi1

Ответов: 13
Просмотров: 2106
Последний ответ 19.11.2020, 11:10:28
от kremisa
Кнопка заказать

Автор Haren

Ответов: 2
Просмотров: 731
Последний ответ 18.02.2019, 10:57:01
от wishlight