Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
stud

Hook. Помогите с API

Recommended Posts

Всем привет.

Пишу хук. Более-менее полной документации по API ipb 3.x.x не нашел. Может у вас есть?

Нашел прау статей по написанию хуков, но все они уж очень просты.

 

Тащем-то, сейчас нужно просто добавить чекбокс и пару текстовых полей ввода в шаблон создания новой темы на форуме. И сохранить введеные данные в таблицу форумов. Т.е. предварительно добавлю в нужную таблицу своих полей. Затем нужно в админке отобразить ту инфу, которую я сохранил в базу, вот и все :)

 

1)Для паблика получается тип хука должен быть "Skin overloader", да? Вообще, не совсем понимаю, что делает эта опция. Насколько я понял, если хочу что-то свое передать в шаблон, помимо дефолтного, нужно просто перегрузить метод класса, который отвечает за вывод данных топика, добавив то, что нужно (да?) Только до конца не пойму какой класс и какой метод за это отвечает?

skin_topic::topicViewTemplate();

//нет?

 

2)Можно ж и свой класс написать, да? На сколько я понял, в этом случае в конструктор нужно обязательно передать такое:

$this->registry = ipsRegistry::instance();
$this->settings =& $this->registry->fetchSettings();
$this->DB       = ipsRegistry::DB();

Или что-то еще нужно?

Я честно, не до конца понял как работают эти методы. Например, полез в ipsRegistry.php, а там в классе ipsRegistry:

static public function instance()
{
if ( ! self::$instance )
{
	self::$instance = new self();
}

return self::$instance;
}

Жесть! Ну ладно.

ipsRegistry::DB() - ну это скорее всего коннект к базе.

$this->settings =& $this->registry->fetchSettings(); - тоже не очень понял как этот метод работает. Но вроде как все это нужно, если я не расширяю какой-нибудь ихний класс иди не обязательно?

 

3)Мне нужно получить постом то, что пользователь ввел в мои поля. Как это правильно/лучше сделать?

$myVar1 = $this->settings['pole1'];

Так?

 

4)Дописать в таблицу (в свои поля) все это дело. Порылся в стандартных хуках ипб 3.3 но не нашел нужной мне INSERT конструкции. Может знает кто, как он должна выглядеть? Буду ооочень признателен.

 

5)Теперь нужно все это вывести в админке где-то. Вообще не очень представлю как это сделать. Хак для админки можно вообще писать?

Share this post


Link to post
Share on other sites

1)Для паблика получается тип хука должен быть "Skin overloader", да?

Сказать что для паблика не совсем правильно, корректнее - перегружает классы скина (/cache/skin_cache/).

 

который отвечает за вывод данных топика, добавив то, что нужно (да?)

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

 

Пример: скин skin_topic, шаблон ViewSomething с одной входящей переменной $data

 

class my_class_name extends skin_topic
{
	function ViewSomething( $data )
	{
		$data['cust'] = 'my data';

		return parent::ViewSomething( $data );
	}
}

 

Важно, что в этом типе хуке не должно быть меток php - <?php ?>

Его и тип Template hook хорошо описал ritsuka в статье на ibr. У lastdragon-а тоже были статьи по создания хуков.

Это база, которая раскрывает принцип, остальное постигается изучением и разбором рабочих хуков.

 

2)Можно ж и свой класс написать, да?

Можно, смотря для чего. Хотите свой модуль с отдельным функционалом, кидаете /applications/%application%/modules_public/%module%/my_filename.php

 

class public_%application%_%module%_%my_class_name% extends ipsCommand
{
public $registry;

/**
 * Class entry point
 *
 * @param	object		Registry reference
 */
public function doExecute( ipsRegistry $registry )
{

}

 

который будет доступен по адресу

/index.php?app=%application%&module=%module%&section=%my_filename%

 

Я честно, не до конца понял как работают эти методы. Например, полез в ipsRegistry.php, а там в классе ipsRegistry:

Вам в ipsRegistry по большой части делать нечего. Смотрите хуки, и модули из /applications/%application%/modules_public/

 

 

$this->settings =& $this->registry->fetchSettings(); - тоже не очень понял как этот метод работает.

Это получения настроек форума в массиве $this->settings.

 

 

3)Мне нужно получить постом то, что пользователь ввел в мои поля. Как это правильно/лучше сделать?

$myVar1 = $this->settings['pole1'];

$this->settings - настройки форума. Здесь вам нужен $this->request ($this->request =& $this->registry->fetchRequest()) в котором хранятся очищенные (от xss) $_GET и $_POST параметры.

 

 

Дописать в таблицу (в свои поля) все это дело. Порылся в стандартных хуках ипб 3.3 но не нашел нужной мне INSERT конструкции. Может знает кто, как он должна выглядеть?

Для работы с бд используется свой драйвер $this->DB.

С конструктором запросов можно ознакомится на офф сайте, вообще примеров много.

Для инсерта:

$this->DB->insert( 'my_table_name', array( 'column' => 'value', 'column2' => 'value' ) );

Share this post


Link to post
Share on other sites

Да, точно, плохо искал я.

Поштудировал вот это https://www.invisionpower.com/support/guides/_/advanced-and-developers/

И статью "ritsuka" (про дата хуки только нашел).

Но у меня все равно вопросы остались.

 

1)По поводу модулей.

На стороне паблика можно вот так вывести врапер (или как это еще назвать?) с каким-то своим контентом:

ipsRegistry::getClass('output')->addContent("<h1>ololo</h1>");
ipsRegistry::getClass('output')->sendOutput();

А как то же самое сделать для админки? Ее врапер (верхние меню + боковое левое) и по центру свой контент.

Тут не нашел:

https://www.invisionpower.com/support/guides/_/advanced-and-developers/application/using-skin-templates-r154

https://www.invisionpower.com/support/guides/_/advanced-and-developers/api-methods/outputting-html-r194

 

2)По поводу хуков. Уж очень размыта для меня граница применимости каждого конкретного типа.

  • Template Hook - если мне нужно вывести в какой-то существующий шаблон что-то, помимо дефолтного, да? Но я хоть тресни не понимаю в чем разница между использованием метода getOutput() и replaceOutput().
    И что я еще ни как не могу понять в этом типе хука - неужели он выведет свой результат ТОЛЬКО до или перед какого-нибудь "hook points"? Но это же абалдеть как не очень. А если мне нужно вывести данные в место, где поблизости нету ни одного <if> или <foreach>?
  • Skin Overloaders - по-моему, это абсолютно то же самое, что и Template Hook, передать в шаблон что-то помимо дефолтного, только тут нужно не свой класс писать, а расширять класс группы_скинов и перегружать метод, который называется в честь имени самого шаблона. Но я ведь не правильно понимаю, да?
  • Action Overloaders - фактически - это расширение класа модуля (секции) какого-то приложения, да? Но ведь по сути, все что можно расширить классу для паблика, можно и сделать с помощью Template Hook, да?
  • Data Hooks - на сколько я понял - один из самых удобных и полезных типов хуков. Допустим выбираю postAddTopic и весь мой return выполнится в момент создания нового топика (жмак). Только не понял, что в dataHookLocations.php должно происходить, пример с оф. сайта запутал еще больше.
  • Library Hooks - ну его.

 

Можете пояснить на пальцах, где я не понимаю логики применения конкретного типа хука.

Допустим в моем примере, мне нужно в форму создания новой темы на форуме добавить пару инпутов и сохранить введенное в них в бд. И Template Hook, и Skin Overloaders подходят, по идее.

Share this post


Link to post
Share on other sites

Для админки не знаю, с ней дело не имел. Проанализируйте файлы любого модуля из /%application%/modules_admin/. А лучше возьмите какой нибудь кастомный из /applications_addon/(other|ips)/%application%/modules_admin/

 

Template Hook - вывод в шаблоне по меткам, которые используются в конструкциях if, foreach. . А вот если поблизости нет никакх меток, либо проявляем смекалку и вставляем в шаблоне свою метку (здесь правда тоже не все так просто, в списке появляются только метки "мастер шаблона"), либо используем тип ниже - Skin Overloaders.

https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/template-hooks-r105

 

Skin Overloaders - здесь меток нет, перегружает метод скина. Его пример показан постом выше. Если подробнее интересует область его применения, качаем штук 15 хуков и смотрим как авторы его используют.

На офф сите: https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/skin-overloaders-r61

IPB Hooks: http://www.ipbhooks.ru/?p=125

 

Action Overloaders - да, это расширения модулей из /modules_public/ или admin.

 

Data Hooks - Этот хук переопределяет только конкретно заданные точки. Весь список мест которых можно им захукать - https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/data-hooks-r43

На ибр http://forums.ibresource.ru/index.php?/topic/60861/

 

Library Hooks - для расширения библиотек из директорий /sources/, других классов приложения (прим. skin_cp)

https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/library-hooks-r60

  • Upvote 1

Share this post


Link to post
Share on other sites

Еще кое-что.

Вот тут https://www.invisionpower.com/support/guides/_/advanced-and-developers/application/start-here-creating-an-application-r145 предлагают сделать свой ланг-файл и свой шаблон. Но не очень понятно куда положить их, что бы метод loadLanguageFile и getTemplate увидели их.

Допустим ланг-файл. Пробовал и в modules_admin ложить (на стороне админа делаю) и в кэш/ланг_кэш/1. Без толку.

Может я чего не правильно сделал? Я назвал ланг-файл так: "имяПриложения_admin_lang.php" (так и не понял, имя ланг-файла обязательно должно быть appName_admin(public)_lang или нет?)

Загружаю его так:

$this->lang->loadLanguageFile( array( 'admin_lang' ), 'имяПриложения' );

или так:

ipsRegistry::getClass('class_localization')->loadLanguageFile( array( 'admin_lang' ), 'имяПриложения');

Все правильно? Если да, то куда положить сам ланг-файл?

 

Пардон, это я намудрил.

С ланг-файлами все хорошо, если положить их в кэш/ланг_кэш/1 :)

А вот со скином для админки пока не очень понятно, может разберусь к вечеру)

 

Ага, более-менее понятно. Для админки оно действительно работает:

(Может кому пригодится:))

В секции пишем вот это (как на оф. сайте и рекомендуют):

$html = $this->registry->output->loadTemplate( 'cp_skin_admin1' ); /*cp_skin_admin1.php должен лежать в skin_cp и класс в нем должен называться точно так же!!! В примере про это не пишут почему-то.*/
$this->registry->output->html .= $html->someMethod(); /*тут нужный нам контент*/
$this->registry->output->html_main .= $this->registry->output->global_template->global_frame_wrapper(); /*не очень как понял как он работает, но без него someMethod() не будет подхвачен*/
$this->registry->output->sendOutput(); /*самое интересное. Формирует врапер. Странно то, что на стороне паблика он выводит врапер именно форумный, а на стороне админки он же выводит врапер самой админки. Умный метод*/

Share this post


Link to post
Share on other sites

Не надо ничего класть в кэш. Вообще забудьте про эту папку навсегда. Вам нет туда дороги.

 

Языковые данные могут идти как в составе хука (в нем предусмотрены соответствующие структуры), так и в составе xml-файлов приложения - "xml/(public|admin)_(appname)_language_pack.xml".

 

Впишите в conf_global.php:

define('IN_DEV',IN_ACP?1:0);

 

Перейдите на страницу хуков в АЦ, создайте хук, и затем выберите пункт экспорт. Там будут все возможности по экспорту дополнительных данных: языковые строки, шаблоны, SQL, модули и прочее. Сами эти данные создавайте вручную, так же при влюченном режиме разработчика. У вас будет возможность создавать группы настроек и сами настройки, создавать группы шаблонов и сами шаблоны, создавать модули админки и клиентской части, создавать группы языковых строки и наполнять их. Все через админку.

Share this post


Link to post
Share on other sites

В управлении приложениями только 2 экспорта в режиме IN_DEV. Создали мне information.xml и мойАпп_modules.xml

Языковый файл уже руками создал, делов-то.

В xml/ моего приложения закинул, как вы и сказали, файл admin_мойАпп_language_pack.xml.

в нем, допустим, такое:

<?xml version="1.0" encoding="utf-8"?>
<languageexport>
 <languagegroup>
   <lang>
     <word_app>content</word_app>
     <word_pack>admin_lang</word_pack>
     <word_key>hello_world_title</word_key>
     <word_default>Hello World123</word_default>
   </lang>
 </languageexport>
</languagegroup>

Подключаю его, как говорят на оф. сайте:

ipsRegistry::getClass('class_localization')->loadLanguageFile( array( 'admin_content_language_pack' ), 'content' );

$this->lang->words['hello_world_title'];

- так юзаю эту строку.

Что-то явно не то делаю, ибо не работает.

 

Разобрался как создавть языковые конструкции через админку. Удобно. Но все равно не работает.

Значит я или не правильно подключаю (выше написал как подключаю) либо не правильно использую сам ключ;

$this->lang->words['hello_world_title'];

 

Все равно что-то не так с админкой. Значит как я делал:

Создал "myapplication_admin_lang.php" закинул его в cache/lang_cache/master_lang/

В админке в разделе "языки" выбрал свое приложение, импортировал его, мне сказали что этот мой файл занесен в базу (кажется).

Далее по-добавлял новых строк через админку. Снова выбрал свое приложение, нажал "экспорт".

В xml/ моего приложения создался соответсвующий файл НО, в нем нету абсолютно ничего того, что я добавлял в админке, в нем только тот ключ, который был изначально у меня в "myapplication_admin_lang.php". Что-то не так.

 

И еще, никак не соображу. Мне нужно в одном хуке добавить инпутов в шаблон отправки новой темы и что б по жмаку "отправить" записать в базу введенное в мои инпуты. Мне нужен и Skin Overloader и Action Overloader получается?

Share this post


Link to post
Share on other sites

@stud, все равно пока не сможете написать такой сложный хук. Слишком много специфических моментов, которые требуют много практики. Я бы вам посоветовал взять уже готовые хуки, тот же Архар-а кастомных полей и учится по нему. Вы сейчас собрались не просто хук а целое приложение написать.

 

Мне нужно в одном хуке добавить инпутов в шаблон отправки новой темы и что б по жмаку "отправить" записать в базу введенное в мои инпуты. Мне нужен и Skin Overloader и Action Overloader получается?

Да. Skin Overloader можно заменить на Template Hook, или просто вручную добавить свои инпуты в шаблоне. Вместо Action Overloader также можно использовать Data Hooks, если я правильно понял задачу.

Share this post


Link to post
Share on other sites
Я бы вам посоветовал взять уже готовые хуки, тот же Архар-а кастомных полей и учится по нему

Я бы с удовольствием, но сейчас проблемы с лицензией (у меня не нуллед ипб, нет!) и я не могу ничего скачать с ихнего оф. сайта.

 

Вы сейчас собрались не просто хук а целое приложение написать.

Ну да :)

stud, все равно пока не сможете написать такой сложный хук. Слишком много специфических моментов, и требует много практики.

Ну почему же. Это ведь простой элемент любой цмс: принять постом данные со стороны паблика, записать их в бд, и отобразить на стороне админа. Я такое писал на Silex без проблем :)

Неужели из-за API ипб это становится такой трудной задачей?

В любом случае, у меня нету выбора. Если я не напишу это приложение - будет плохо.

 

Да. Skin Overloader можно заменить на Template Hook, или просто вручную добавить свои инпуты в шаблоне. Вместо Action Overloader также можно использовать Data Hooks, если я правильно понял задачу.

Ну да, только я имел ввиду, можно ли И вставку своих инпутов, И отправку моих данных по сабмиту (как раз и думал про Data Hook (postAddTopic) только как в нем еще и инпуты приклеить куда надо?) реализовать в каком-то одном типе хука?

Или это в любом случае будут 2 разных по типу хука, подключенных к моему приложению?

Share this post


Link to post
Share on other sites

Один хук может совмещать разные типы - Файл1, Файл2, ФайлN, где под каждый файл выбираете свой тип.

 

Я бы с удовольствием, но сейчас проблемы с лицензией (у меня не нуллед ипб, нет!) и я не могу ничего скачать с ихнего оф. сайта.

http://forums.ibresource.ru/index.php?/topic/59168/

 

Ну почему же. Это ведь простой элемент любой цмс: принять постом данные со стороны паблика, записать их в бд, и отобразить на стороне админа. Я такое писал на Silex без проблем

Задача то может и простая, сложность состоит в ее внедрение в кмс. Для ипб требуются хорошие знания ООП и в особенности классов и методов форума. Считайте что здесь вы работаете с фреймворком. Поэтому на первый взгляд легкие задачки на практике оказываются не такими простыми, особенно когда впервые пишите дополнение.

Share this post


Link to post
Share on other sites

Имхо, ТС слишком мечется из стороны в сторону. Начал про хуки, я пишу, как делать хук - тут же ответ - "я делаю приложение". При этом постоянные попытки что-то ИЗОБРЕСТИ там, где есть документация. Первейшая ошибка всех говнокодеров же. Не нужно ничего изобретать свое - все давно изобретено. По всем моментам есть документация и готовые приложения. Не обязательно сторонние - все системные приложения IPS полностью отвечают той же схеме.

 

Возьмите мод из 3-го поста этой темы и внимательно его изучите. Возьмите, например, приложение календарь (оно попроще) и изучите и его. Сделайте все по аналогии. Только и всего.

Share this post


Link to post
Share on other sites

Спасибо, почитал, местами не все очевидно, но всё равно спасибо.

 

Имхо, ТС слишком мечется из стороны в сторону. Начал про хуки, я пишу, как делать хук - тут же ответ - "я делаю приложение". При этом постоянные попытки что-то ИЗОБРЕСТИ там, где есть документация. Первейшая ошибка всех говнокодеров же. Не нужно ничего изобретать свое - все давно изобретено. По всем моментам есть документация и готовые приложения. Не обязательно сторонние - все системные приложения IPS полностью отвечают той же схеме.

Ок, не спрашивать больше про приложения и ничего не писать(изобретать) самому.

Мне не все понятно из документации. Например, Data Hook. Я прочитал вашу статью про позы и вот эту: https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/data-hooks-r43

Просмотрел 1 хук который Data (в моем ипб таких больше нету). В календаре есть, засунутые в приложение, но я с ним еще не разобрался до конца.

Всё равно я не понял до конца, как этот тип хука работает.

 

Вот исходя из вашей статьи, можно написать такое, или не правильно?

<?php

class myclass
{
   protected $registry;
   protected $DB;

   public function __construct (ipsRegistry $registry)
   {
       $this->registry = $registry;
       $this->DB       = $this->registry->DB();
   }

   public function handleData ($data)
   {
       $this->DB->do_insert('my_table_name', array( 'column1' => $data ));
       return true;
   }
}

 

А куда мне теперь подключить этот класс, что бы передать в него нужную мне дату?

На оф. сайте приводят такой пример использования:

$toInsert = array( 'col' => 'value', 'other_col' => 123 );

IPSLib::doDataHooks( $toInsert, 'myappPreInsert' );

$this->DB->insert( 'my_table', $toInsert );

 

Не понял куда это вставлять, ведь явно не в секции паблика или админа приложения. В шаблон и делать там поинт myappPreInsert, бред какой-то.

Не понятно, зачем тут вообще приложение, если мне, допустим, нужен просто хук, срабатывающий при сабмите в нужном месте?

Где вызывать мой handleData(), что бы подставить в него нужную мне дату?

Я не нашел этого в документации. Может я конечно очень туплю, но мне не очевидны вышеперечисленные моменты.

Share this post


Link to post
Share on other sites
А куда мне теперь подключить этот класс, что бы передать в него нужную мне дату?

 

Никуда. Он сам вызовится в указанных моментов (Data Hook).

 

postAddReply (Add Reply)

This is called by classPost::addReply() right before a record is inserted into the posts table. The data sent is what will be inserted.

Share this post


Link to post
Share on other sites

Еще раз внимательно прочитал мануал и еще больше запутался:

1)"This class should contain one method called handleData() which will receive one parameter, the value of which will be dependant on the hook point you are using (see above). You should return this array with any changes you want to make"

 

Получается как-то так надо, если я хочу дописать свое значение в массив идущий в таблицу топиков

    public function handleData ($data)
   {
       $data['ololo'] = $this->request['ololo'];
       return $data;
   }

Но это явно бред. И не понятно, где мне указать поле, в которое я хочу дописать свое $data['ololo']?

Ниже в документации пишут, что не надо ничего делать с принимаемым массивом:

"Note that your hook does not need modify the data array".

Вообще не понятно.

 

2)"Any application can generate new data hook points by including a file called dataHookLocations.php..."

Я абсолютно не понимаю, что тут происходит. Сами же пишут, что этот тип хука сработает сам по себе (допустим при нажатии "запостить тему"). Тут же пишут, что можно непосредственно вызывать эти хуки в коде. Это как?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...