Иконка ресурса

Дневник новичка-3. Пишем плагин вместе

Дневник новичка-3. Пишем плагин вместе

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#1
Всем привет, к сожалению статья достаточно большая получилась...

Поэтому в первый пост я выложу пдф статьи, а следующие посты буду по частям её размещать ! ;)

Тут лимит на число знаков и картинок ! :(
 

Вложения

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#2
ЧАСТЬ 1:

Ну-что готовы, к долгой-долгой статье, в этой статье не будет ничего мега-сложного, как в прочем и во всех моих статьях, надеюсь других качеств моего творчества никто и не заметит, гы-гы…

В конце статье, кто осилит прочитать до конца ждёт сюрприз-няшка, ну-да ладно хватит наверное, пора переходит к делу, ибо всегда приятно посидеть попиздеть, чем заниматься делом !

Итак что нас ждёт в этой статье:

1)Рассмотрим тему ООП:Создадим свой класс, метод и обработчик события;

2)Рассмотрим шаблоны XenForo, создадим шаблон своего плагина, создадим css и т.д.;

3)Сделаем свои настройки в админке XenForo.

Ладно, для начало напишим ТЗ, своего учебного плагина:

Плагин учебный и не должен-быть сложным, я назвал этот плагин «Информационная панель», т.е. небольшая панелька с какой-то информацией, которая будет встраиваться в любую часть форума.

upload_2015-5-7_14-48-34.png

Итак ТЗ:

1.Плагин должен иметь свои настройки в админке, а именно:

1.1.Включить/выключить;

1.2.Расположение: В верху над темами, внизу под темами, в сайдбаре (Это справа на главной…).

1.3.Пользователь в админке должен менять информационный текст панели…

Пока всё для учёбы хватит:

Ну-что приступим к реализации:

1)Создадим своё дополнение в режиме разработки, как это сделать написано в первой части цикла:

upload_2015-5-7_14-49-10.png

Добавлю ещё кое-что:


Код установки, это например если плагин требует какие-то свои таблицы в базе или ещё что-то… Код установки, туда прописываем свой класс и метод, далее наверное видели в плагинах файл Install.php, там уже прописываются обработчики и т.д., можете посмотреть как реализовано, в данном плагине нам не нужно, но может в следующих статьях рассмотрю эту тему…

Код удаления тоже самое, по сути можем делать свои действия при установки/удаления плагина, но в данном случае вполне достаточно стандартных средств XenForo для установки/удаления нашего плагина ! ;)

2)Итак создали дополнение, теперь давайте сделаем настройки нашего плагина в админке:

-«Настройки»-«Добавить группу настроек»:

upload_2015-5-7_14-49-49.png


Незабываем указать наше дополнение…

Далее он должен появится в «Настройках», заходим туда:

upload_2015-5-7_14-50-10.png

Далее «Добавить настройку» и добавляем нужные кнопочки и настройки….

upload_2015-5-7_14-50-26.png

Нет желания всё расписывать, рассмотрим одну настройку в качестве примера, как остальные сделаны можете глянуть в плагине, или то-что сделанно из коробке, нажимая «Редактировать»
upload_2015-5-7_14-50-43.png


Итак рассмотрим опцию «Позиция», это три «радиокнопки»: На верху, В низу, В сайдбаре:

upload_2015-5-7_14-51-0.png

Пропишите понятный ID: По нему мы будем «обращаться» к данной опции…

Что-бы плагин-был «Мультиязычным» можно использовать фразы, пример:

Параметры формата:

Код:
top={xen:phrase Info_Panel_Top}
Info_Panel_Top– Это фраза, её нужно создать:

Внешний вид->Фразы->Создать фразу:

upload_2015-5-7_14-51-18.png

Дополнение своё и так со всеми фразами, короче в этоге получаем так:

upload_2015-5-7_14-51-35.png
 
Последнее редактирование:

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#3
ЧАСТЬ 2:


3)Итак хорошо, если с этим разобрались, то идём дальше…

Теперь разберёмся со структурой папок, нашего плагина:

В XenForo все плагины располагаются в папке library, обычно первая папка это название организации/автора, далее папка уже название плагина, сделаем так-же:

upload_2015-5-7_14-53-38.png

Тут извращаться с названиями не надо, что-бы не было проблем, в данном случае:

XOleg– Название автора; Panel-Название плагина…

Можно уже сразу создать файл Index.php, пока пустой, придётся немного покодить, но чуть позже… Оставим это на самое вкусное ! ;)

4)Хорошо, если всё понятно и все части освоили переходим к следующему пункту, а именно давайте сделаем шаблон нашей панели и его css, зачем ?

Этот шаблон мы и будем «Встраивать» в зависимости от настроек…

Итак:

Внешний вид ->Шаблоны -> Создать шиблон:

upload_2015-5-7_14-54-12.png


Указываем своё дополнение и код:

Код:
<xen:require css="Info_Panel_maintemplate.css" />
<p class="Info_Panel">
    <xen:include template="Info_Panel_text" />
</p>
<xen:requirecss="Info_Panel_maintemplate.css" /> -Этот шаблон css мы создадим, там будет форма нашей панели, цвет и т.д.

<xen:includetemplate="Info_Panel_text" /> - Это небольшой костыль, чисто с учебной целью, мы этот шаблон тоже создадим, тут как понятно будет текст…

Теперь создадим css:

upload_2015-5-7_14-54-56.png

Код:
 .Info_Panel
{
    border: 1px solid @primaryDark;
    text-align: center;
    padding: 6px;
    background-color: #1faee9;
}
Тут всё по стандарту css…


Теперь создадим шаблон текста:

upload_2015-5-7_14-55-39.png


Немного стыдно за такой костыль, но лень было что-то придумывать:

{$xenOptions.Info_Panel_Text} – Просто вытаскиваем «Текст» из настроек в админке… ;)

А вообще в XenForo очень мощный язык шаблона, можно делать ветвления, можно определять группы пользователей и самих пользователей, можно "вытаскивать" настройки из админки, можно даже встраивать php, всё в ваших руках…

5)Если всё понятно, осталось самое вкусное – Это уже наш любимый коденг:

Итак как я уже сказал у XenForoуже много «Событий» на дефолте:

Разработка->События:

upload_2015-5-7_14-56-2.png

Каждое событие документировано в админке, можете попереводить…

Нас интересует на данном этапе «Обработчики событий», кликаем туда и создаём свой обработчик:

upload_2015-5-7_14-56-19.png

В данном случае будем использовать универсальное событие template_hook, обратите внимание на описание в админке !

Это событие есть не только в XenForo, а и в других движках, по сути оно при отображении нужной части форума будет встраивать наш шаблон (Который мы создали в админке) в зависимости от настроек разумеется:

Обратите внимание на графу «Выполнить обработчик», у меня:

XOleg_Panel_Index– Это нечто иное, как XOleg/Panel/Index.php– Это ОЧЕНЬ важно ! ;)

Метод PanelEvent– мы закодим… :)

6)Если разобрались, самое время открыть наш Index.php:

PHP:
class XOleg_Panel_Index //Наш класс панели
{
     //Обработчик события TemplateHook (PanelEvent)
    public static function PanelEvent($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
    {
        $options = XenForo_Application::get('options'); //Получаем список опций

        if ($options->Info_Panel_Enabled == 1) //Если панель включена, то...
        {
            if ($options->Info_Panel_Position == 'top') //Если отображать "На верху"
            {
                $Info_Panel_case = 'ad_above_top_breadcrumb';
            } else if ($options->Info_Panel_Position == 'bottom') //Если отображать "Внизу"
            {
                $Info_Panel_case = 'ad_below_bottom_breadcrumb';
            } else //Если отображать "В сайдбаре"
            {
                $Info_Panel_case = 'ad_sidebar_bottom';
            }

              switch ($hookName)
              {
                  case $Info_Panel_case:
                      $Info_Panel_contents = $template->create('Info_Panel_maintemplate', $template->getParams()); //Это для отображения в зависимости от опций плагина...
                      $contents = $Info_Panel_contents .  $contents;
                      break;
              } // end switch
        }
    }
}
В общем код прокомментировал, немного остановлюсь здесь:

PanelEvent– Это обработчик, его мы закодим ;)

PHP:
switch ($hookName)
{
    case $Info_Panel_case:
        $Info_Panel_contents = $template->create('Info_Panel_maintemplate', $template->getParams()); //Это для отображения в зависимости от опций плагина...
        $contents = $Info_Panel_contents .  $contents;
        break;
} // end switch
$hookName – Это отображение части форума и в зависимости от настроек (переменной $Info_Panel_case), будет встраиваться наш шаблон 'Info_Panel_maintemplate'.

Вроде всё, деалаем экспорт xml и передаём плагин заказчику, вместе с нужными файлами !

Удачи ! ;)
 
Последнее редактирование:

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#4
А для чего было создавать этот отдельный шаблон?Ты хотел привести какой-то пример этим?
Ведь можно было просто вставить
Да, тут дело в том что я пытался охватить в этой статьи много тем, но понял свою ошибку, что лучше постепенно охватывать темы...

Да это пример как можно инклудить шаблоны, для чего это, можете посмотреть в моём плагине "Донат Интеркассы", уже запилил бетку.. ;)

И какие преимущества в твоём варианте создания аддона с использованием обработчика и классов (я понимаю,что это в учебных целях)?Тоже самое ведь можно сделать и через модификацию шаблонов и $xenOptions
Вообще я не ханжа и не сторонник, какого-то там "Эллегантного коденга", понятно что задача может иметь несколько решений и каждый использует что ему ближе, но тем не менее уметь использовать "События", делать "Обработчики" событий, создавать свои классы очень важно:

Вот пример если нужно делать какую-то обработку данных, тут уже обычной модификацией шаблонов не получится сделать...

Понятно что в том демо-плагине это не нужно, важно было просто понять как это делать, дальше уже можно применять при необходимости...

Также я привёл всего одно событие это template_hook, в XenForo их десятки и при необходимости нужно уметь ими воспользоваться, можно также создавать свои события !

Кстати в том-же плагине "Донат Интеркассы", я использую обработку данный в php, файл Interkassa_Donate.php, там обработка:Создание цифровой подписи платежа + генерация платёжной формы...

При этом никакой интеграции с XenForo, т.е. в данном случае никакие события не использую и т.д. ! ;)

В общем-то тоже как одно из решений ! :)
 

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#5
Для учебных примеров,инклуд шаблонов проще показывать на простых примерах,со всякими кнопочками,блоками,радио...которые нужно всунуть куда-нибудь.Это да.
Вот во вложении хуки, хуки полезны что например можно делать кастомизированное отображение...:)

При помощи модификации шаблонов проблемотично это сделать, короче хуки это вещь нужная ! ;)
 

Вложения

SrDEN

Местный
Сообщения
115
Симпатии
109
Баллы
43
#6
На днях тоже решил попробовать написать свой первый плагин, и столкнулся с трудностью. Как в список настроек добавить подгрузку списка всех разделов форума, чтоб в последующем выбранный массив я мог подставлять в шаблон форума?
 

SOUL

АдминкА
Администратор
Сообщения
6.560
Симпатии
9.825
Баллы
266
#7
На днях тоже решил попробовать написать свой первый плагин, и столкнулся с трудностью. Как в список настроек добавить подгрузку списка всех разделов форума, чтоб в последующем выбранный массив я мог подставлять в шаблон форума?
Я то ли вопроса не поняла или от незнания не могу понять суть вопроса.

Может, Олег подскажет...

А ты попробуй задать более развернуто вопрос с наглядными скринами и описанием того, что ты делаешь и цели, которую нужно достичь. Так быстрей, мне кажется, всё разрешится.
 

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#8
Как в список настроек добавить подгрузку списка всех разделов форума
В список настроек чего ? Что-то тоже не понимаю, плагина ?

$options = XenForo_Application::get('options'); //Получаем список опций

Заюзать потом можно так:

$options->ID_Настроки в админке...

Или вопрос всё-же в другом, вообще эти настроки можно просмотреть как сделано на дефолте, либо в других плагина в режиме разработчика...

Кнопочка "Редактировать"
 

SrDEN

Местный
Сообщения
115
Симпатии
109
Баллы
43
#9
В список настроек чего ? Что-то тоже не понимаю, плагина ?

$options = XenForo_Application::get('options'); //Получаем список опций

Заюзать потом можно так:

$options->ID_Настроки в админке...
Принцип работы плагина такой:
1. Захожу в настройки плагина, выбираю нужные разделы, а в шаблоне вставлено условие
Код:
<xen:if is="in_array({$thread.node_id}, array(ID-разделов))">
//Тут выводится мой код
<xen:else />
//Тут выводится код по умолчанию
</xen:if>
2. В следствии чего мой код выводится только в выбранных разделах.


Для этого нужно добавить настройку, которая данный список будет подгружать.
Или вопрос всё-же в другом, вообще эти настроки можно просмотреть как сделано на дефолте, либо в других плагина в режиме разработчика...

Кнопочка "Редактировать"
В дефолтных плагинах подобного функционала не нашел, по этому и решил спросить :)
 
Последнее редактирование:

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#10
Принцип работы плагина такой:
1. Захожу в настройки плагина, выбираю нужные разделы, а в шаблоне вставлено условие
А теперь понятно, к сожалению что-бы в настройках админки сделать такую опцию, нужно немного попотеть, т.е. у XenForo есть шаблоны админки, в режиме разработчика:

upload_2015-5-21_13-37-42.png

Нужно разбираться с шаблоном, далее как-то получать массив всех разделов и выводить в нужный шаблон...

Я-же предлагаю как вариант решения проще (Если подойдёт конечно):

1)Сделать вот такое поле:

upload_2015-5-21_13-39-47.png

Это будет массив нужных разделов:

upload_2015-5-21_13-40-34.png

Далее уже можно проэксплуатировать так:

Код:
        <xen:if is="{$xenOptions.openfire_livesearch_forum_id}"/>
            Мой код !!!
        </xen:if>
Это как вариант, если есть другие предложения высказывайте, я тоже учусь... :)
 

SrDEN

Местный
Сообщения
115
Симпатии
109
Баллы
43
#11
Спасибо, тоже о таком варианте думал, но оставил вариант на крайний случай, хотел по красивее :)
 

SOUL

АдминкА
Администратор
Сообщения
6.560
Симпатии
9.825
Баллы
266
#12
Я знаю, что Георгий Шевченко на днях экспериментировал с шаблонами админки, и у него были очень интересные результаты. Я попрошу, чтобы он поделился своим опытом в этом вопросе, думаю, он не должен отказать Girl_Wink789
 

SrDEN

Местный
Сообщения
115
Симпатии
109
Баллы
43
#13
Далее уже можно проэксплуатировать так:

Код:
        <xen:if is="{$xenOptions.openfire_livesearch_forum_id}"/>
            Мой код !!!
        </xen:if>
Это как вариант, если есть другие предложения высказывайте, я тоже учусь... :)
Вчера добрался до кодинга, всё бы хорошо, но если в in_array засовывать строку, то работать не будет:
PHP:
// Не будет корректно работать:
$str = '31,33,7';
if(in_array(7, array($str)))
{
    echo "yes";
}
else
{
    echo "no";
}

// Будет работать
$str = '31,33,7';
$strArr = explode(',',$str);
print_r($strArr);
if(in_array(7, $strArr))
{
    echo "yes";
}
else
{
    echo "no";
}
То есть, пример работать не будет:
Код:
in_array({$thread.node_id}, array({$xenOptions.openfire_livesearch_forum_id}))
нужно {$xenOptions.openfire_livesearch_forum_id} эксплодировать и уже полученный массив скармливать функции, и по этому вопрос, сталкивался ли кто с таким, есть ли у ксен что-то вроде xen:explode для преобразования строки в массив или какое-нить другое изящное решения без инклудов :)
 

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#14
Вчера добрался до кодинга, всё бы хорошо, но если в in_array засовывать строку, то работать не будет:
Хе а я наоборот немного подзабросил кодинг, вот почитай может подойдёт решение:


Пожалуйста, Войдите или Зарегистрируйтесь для просмотра скрытого текста.



К сожалению-да explode в XenForo нет ! :(

Ну и ещё как создавать опцию в виде массива:


Пожалуйста, Войдите или Зарегистрируйтесь для просмотра скрытого текста.

 

Георгий Шевченко

[GX] Разработчик
Разработчик
Сообщения
71
Симпатии
128
Баллы
33
#15
На днях тоже решил попробовать написать свой первый плагин, и столкнулся с трудностью. Как в список настроек добавить подгрузку списка всех разделов форума, чтоб в последующем выбранный массив я мог подставлять в шаблон форума?
При создании соответствующей настройки аддона в панели управления используйте следующие опции:

Edit Format: PHP Callback
Format Parameters:
Код:
XenForo_Option_NodeChooser::renderSelect
Результат будет такой:
renderSelect.png
 

SrDEN

Местный
Сообщения
115
Симпатии
109
Баллы
43
#16
При создании соответствующей настройки аддона в панели управления используйте следующие опции:

Edit Format: PHP Callback
Format Parameters:
Код:
XenForo_Option_NodeChooser::renderSelect
Результат будет такой:
Посмотреть вложение 1030
Спасибо, я уже тоже нарыл подобное решение в этом аддоне:

Пожалуйста, Войдите или Зарегистрируйтесь для просмотра скрытого текста.



Только нужно будет свой класс написать и шаблон, но это уже халява :)
 

Alice

Пользователь
Сообщения
6
Симпатии
0
Баллы
1
#17
these complicate all this, in my opinion one can find simple to do!
 

MAX3000

Пользователь
Сообщения
10
Симпатии
4
Баллы
3
#19
А программ, на подобии DreamWeaver или плагинов, еще не придумали? Вроде движек популярный.
 

X-Oleg

Местный
Сообщения
588
Симпатии
618
Баллы
93
#20
А программ, на подобии DreamWeaver или плагинов, еще не придумали? Вроде движек популярный.
Можно подключать к зенду или PHPStorm, может позже напишу как, есть ролик ! ;)
 
Вверх Снизу