Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

Всем привет.

Пишу хук. Более-менее полной документации по 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)Теперь нужно все это вывести в админке где-то. Вообще не очень представлю как это сделать. Хак для админки можно вообще писать?

Рекомендованные сообщения

Опубликовано:
  • Автор

Оно работает, оно работает!!!

Спасибо, разобрался)

Опубликовано:
  • Автор

У меня еще 1 вопрос по API, думаю, можно тут продолжить.

Нужно в текстовый редактор вывести $что-то.

Делаю по рецепту:

 

$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' );
$editor = new $classToLoad();
$html = $editor->show( 'Post', array(), $что-то );

 

$что-то не выводится никак, что я только не делал. В чем может быть проблема?

 

Ребята, мои извинения, я овощь)

Уже все работает. Удалите этот пост, если что, только не баньте меня.

  • 3 недели спустя...
Опубликовано:
  • Автор

Кто может сказать, где хранить скины для паблик-стороны приложения? Что б не было мешанины в коде секций.

Структура приложения такая, что скины для админ-стороны нужно хранить в skin_cp/ А для паблика не предусмотрена соответствующая папка.

Разработчики говорят, в папке кэш хранить. Но мне в этой теме сказали, вообще, забыть про папку кэш и ничего не хранить в ней.

 

И второй вопрос. Если мне нужно в хуке шаблона добавить что-то свое в цсс файл.

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

$this->registry->output->addToDocumentHead( 'inlinecss', "#aga{ display: none; }" );

Пробую то же самое сделать через тег шаблона. Пишу в шаблоне:

{parse addtohead="#aga{ display: none; }" type="inlinecss"}

Но это выводится просто как текст.

Как мне добавить что-то свое в цсс? Или это можно только вручную прописывать в нужном .цсс через админку?

Опубликовано:

Чем вам встроенная система скинов не нравится? Создайте группу шаблонов и в ней все шаблоны, что нужны, прямо через админку, все нужные кнопки для этого есть. Затем экспортируйте их в xml, если нужна переносимость, и распространяйте в составе приложения. В итоге они будут храниться в базе и кешироваться в папке кеша :)

 

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

Опубликовано:
  • Автор

Ок, я создал свой шаблон через админку, но как мне его подключить в хук или приложение?

$this->registry->output->addContent( $this->registry->output->getTemplate('ololo') );

Уже не работает.

А, стоп, сейчас пойму.

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

Export HTML Templates Into Application Directories ничего не дало. Так и не понял, куда и что именно оно экспортировало.

Опубликовано:
$this->registry->output->getTemplate('группа_шаблона')->имя_шаблона( [$vars] );

  • 1 месяц спустя...
Опубликовано:
  • Автор

Маленький вопрос по Skin Overloader:

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

Я лезу в /cache/skin_cache/cacheid_1/ и просматриваю, какой из шаблонов может отвечать за вывод таблицы с списком топиков.

skin_topic.php отвечает за вывод одного конкретного топика. Не то, что нужно.

skin_forum.php - в нем не нашел "<table id="forum_table"...", значит он тоже отпадает.

Какой файл отвечает за вывод таблицы с списком топиков?

Опубликовано:
Я лезу в /cache/skin_cache/cacheid_1/ и просматриваю, какой из шаблонов может отвечать за вывод таблицы с списком топиков.

Опять 25. Сколько раз надо повторять - нечего там искать что-то. Ищется все совершенно легко и просто в админке, через поиск по шаблонам.

 

Если бы вы использовали поиск там, уже бы нашли, что вам нужен шаблон Forum View (skin_forum) > forumIndexTemplate.

 

Смотрим его переменные:

$forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum=1

 

Составляем хук, перегружающий шаблон skin_forum:

class myclass extends (~extends~) {

 function forumIndexTemplate ($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum=1) {
   //$forum_data['ololo'] = 'lolol';
   return parent::forumIndexTemplate($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum);
 }
}

 

Проблема решена.

 

Заметьте, все это ни разу не открывая папку /cache. В эту папку вообще лазают только бандерлоги (с), если что.

Опубликовано:
  • Автор

Мне стыдно за такой нубский вопрос, но...как в такой конструкции пользоваться бд?

class myclass extends skin_forum(~id~) {

 function forumIndexTemplate ($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum=1) {
   //$forum_data['ololo'] = 'lolol';
   return parent::forumIndexTemplate($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum);
 }
}

 

В конструктор родительского класса передают ipsRegistry $registry, т.е. им уже можно пользоваться, на сколько я понимаю. Но

$this->registry = $registry;
$this->DB = $this->registry->DB();

Call to a member function DB() on a non-object

Опубликовано:

попробуйте без

 

$this->registry = $registry;

или

 

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

Опубликовано:
  • Автор

Все равно, в конструкции

 

class myclass extends skin_forum(~id~) {
   protected $registry;
   protected $DB;

   public function forumIndexTemplate($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum=1) {

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



       $new = $this->DB->build( array(
                                       'select' => 'tid, title, starter_name, start_date, title_seo, on_main',
                                       'from' => 'topics',
                                       'where' => 'on_main = 1'
                               ));

       ...

 

из бд всегда приходит null, как только не пробовал

Опубликовано:

Класс набора заблонов расширяет класс skinMaster, который уже имеет в своем составе все необходимое:

 

/**
* Skin master class. Allows shared methods between skins
*/
class skinMaster
{
public function __construct( ipsRegistry $registry )
{
	/* Make object */
	$this->registry   =  $registry;
	$this->DB         =  $this->registry->DB();
	$this->settings   =& $this->registry->fetchSettings();
	$this->request    =& $this->registry->fetchRequest();
	$this->lang       =  $this->registry->getClass('class_localization');
	$this->member     =  $this->registry->member();
	$this->memberData =& $this->registry->member()->fetchMemberData();
	$this->cache      =  $this->registry->cache();
	$this->caches     =& $this->registry->cache()->fetchCaches();
}

 

Т.е. вы можете сразу же использовать все вышеперечисленные классы и массивы напрямую из общего пространства класса:

class myclass extends skin_forum(~id~) {
function forumIndexTemplate ($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum=1) {
	$this->DB->build( array( 'select' => '*',
		'from'   => 'forums' ) );
	$this->DB->execute();		
	while( $row = $this->DB->fetch() )
	{
		$forums[] = $row;
	}
	echo $this->settings['board_name'];
	print_r($this->memberData);
	print_r($forums); die;
	return parent::forumIndexTemplate($forum_data, $announce_data, $topic_data, $other_data, $multi_mod_data, $sub_forum_data, $footer_filter, $active_user_data, $mod_data, $inforum);
}
}

 

Вы никогда не учились и не умеете в PHP, правда? :)

Опубликовано:
  • Автор

Как же я затупил. У меня ошибка в самом запросе была, только сейчас ее увидел. И да, я совсем забыл про execute()

 

Вы никогда не учились

Вы абсолютно правы, я никогда не учился. Я даже школу бросил в 5 классе. Я ненавидел свою школьную учительницу по математике. Когда я спрашивал ее что-то, что не понимал, она всегда говорила мне: "вот смотри, я знаю, а ты не знаешь, ты сейчас чувствуешь мое превосходство, ведь чувствуешь?". Мне казалось, что она так повышает свое чсв. Замечательный человек, бездонный в своем профессионализме.

 

и не умеете в PHP, правда?

И в PHP я совершенно не умею. Я просто мимо проходил.

Опубликовано:
Мне казалось, что она так повышает свое чсв.

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

 

И в PHP я совершенно не умею. Я просто мимо проходил.

Как бы вам так сказать... Временами у меня бывают короткие отрезки свободного времени, и я не ленюсь подробно расписывать вам "PHP для нубов". Но вообще вот так не зная языка браться за подобные задачи - несколько излишне самонадеянно. Вам бы основы PHP сначала подучить. Иначе получается, что вы задаете на форуме IPB вопросы по основам PHP, что, согласитесь, несколько не адресно, а значит, мало кому здесь интересно.

  • 2 месяца спустя...
Опубликовано:

Template Hook - вывод в шаблоне по меткам, которые используются в конструкциях if, foreach. <if test="metka:|:condition"></if>. А вот если поблизости нет никакх меток, либо проявляем смекалку и вставляем в шаблоне свою метку (здесь правда тоже не все так просто, в списке появляются только метки "мастер шаблона").

Есть готовый модуль с хуком. Модуль отображаеться на главной форума, я хочу этот же модуль разместить на главной Unreal Portal. Могу ли я просто в настройках хука "Добавить файл" к нужному шаблону?

Но понятное дело что там нет меток:

16ceb852fa7dt.jpg

 

Добавил метку:

<if test="condition">content</if>

По мануалу: https://www.invisionpower.com/support/guides/_/advanced-and-developers/hooks/template-hooks-r105

0b351bba7e7bt.jpg

 

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

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.