Перейти к публикации
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. Во первых, лист меток берется из мастер-шаблона. Поэтому в списке выборе меток, файрбугом или оперой драгонфлай, добавляем в селекте свою метку http://s005.radikal.ru/i209/1210/f2/2b250ffa4c7e.png

2. Во вторых, выше я указал формат условия с меткой - -

 

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

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

При добавлении значения:

 <if test="myHookPoint:|:1=1"></if>

Страница не грузиться...

Можете немного "по нубски" разтолковать? :)

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

Опечатка. Конечно, правильно так

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

Опечатка. конечно, правильно так <if test="myHookPoint:|:1==1"></if>

Да даже беру, к приемру, код со своего шаблона GlobalTamplate:

				<if test="hasHeaderAd:|:$items['adHeaderCode']">
				<div class='ipsAd'>{$items['adHeaderCode']}</div>
			</if>

В списке хука этого шаблона есть точка hasHeaderAd. Добавляю этот же код в другой шаблон - точки нет! Как понять эту систему? :)

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

Добавляю этот же код в другой шаблон - точки нет! Как понять эту систему?

 

@freeman, как она может быть в другом в шаблоне если ее там нету? Перечитайте еще раз пост выше, метки в списке берутся из мастер шаблона, а то что вы свои кастомные добавляете, неважно какие и откуда, они не выводится.

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

@freeman, как она может быть в другом в шаблоне если ее там нету? Перечитайте еще раз пост выше, метки в списке берутся из мастер шаблона, а то что вы свои кастомные добавляете, неважно какие и откуда, они не выводится.

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

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

не подскажете где почитать инфу о мастер-шаблонах.

Зачем? Как в два клика добавить метку в списке я показал выше.

 

https://www.invisionpower.com/support/guides/_/advanced-and-developers/miscellaneous/developers-mode-r147

в бд это скин с template_master_key root или template_set_id 0 http://ipbnet.ru/topic/296-pozicionirovanie-hukov/

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

Не буду плодить тем, так как вопросы у меня очень нубские специфические, никому они больше не будут полезны, поэтому продолжу свою старую тему.

Мне нужно просто инкрементить числовое значение topics.

По логике должно быть так

$this->DB->update( 'forums', array( 'topics' => 'topics + 1' ), 'id=100500' );

Но что-то оно ничего не инкрементит)

Как мне быть?

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

Обновление с полями таблицы делается еще с двумя параметрами

 

$this->DB->update( 'forums', 'topics=topics+1', 'id=100500', true, true );

 

 * @param	string		 Table name
 * @param	mixed		 Array of field => values, or pre-formatted "SET" clause
 * @param	string		 [Optional] Where clause
 * @param	boolean		[Optional] Run on shutdown
 * @param	boolean		[Optional] $set is already pre-formatted

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

Хм, что-то все-равно не инкрементит.

Только строго получается задать кол-во топиков. Так обновляет:

$this->DB->update( 'forums', 'topics=22', 'id=100500');

 

 

$this->DB->update( 'forums', 'topics=topics+1', 'id=100500', true, true );

Так не прибавляет 1 к topics

 

Но все-равно, спасибо за наводку

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

Запрос выполняется в shutdown режиме, то есть после выполнения скрипта. Обновление вы увидите при следующем запуске скрипта. Либо поставьте третий параметр в false.

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

Эмм, что-то никак, вообще никак.

Что-то ихний апи не очень упрощает взаимодействие с бд. Действие, которое делается простым запросом меньше чем за минуту (UPDETE forums SET topics = topics + 1 WHERE id = 100500) невозмжно реализовать через ихний апи.

Ну или у меня очень кривые руки)

Либо поставьте третий параметр в false

Дык, третий параметр - это ж WHERE...

Если вы про четвертый параметр - то если его в false, а пятый в труе - то так нельзя.

 

Из документации:

or it can be a specific preformatted set clause to pass to the query ( id=id+1 ). If you pass a pre-formatted clause to use in the query, be sure to set the last parameter, $preformatted, to true

Но ведь я так и делаю, я выставляю последний парамаетр в труе ($preformatted который)

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

Только что проверил, запрос отлично работает как и в shutdown так и в нормальном режиме.

 

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

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

 

Дык, третий параметр - это ж WHERE...

Пардон, четвертый.

 

Если вы про четвертый параметр - то если его в false, а пятый в труе - то так нельзя.

Почему нельзя? Можно.

 

Но ведь я так и делаю, я выставляю последний парамаетр в труе

Значит запрос составили неправильно. Смотрите внимательно что обновляете, и на условие.

Опубликовано:
  • Автор
Почему нельзя? Можно.

Дык "Возникла ошибка при работе с базой данных". Какая именно ошибка, апи мне не говорит

 

Запрос пишу такой:

$this->DB->update( 'forums', array( 'topics' => 'topics+1' ), "id=16", true, true);

Если убрать два последних труе и задать обновление топиков жестко (но мне так не надо, это чисто для теста, работает ли запрос), т.е. так:

$this->DB->update( 'forums', array( 'topics' => '22' ), "id=16");

То все работает, значение в topics обновляется.

 

Но какие тут могут быть проблемы?

1) 'forums' - у меня в бд 100% есть такая таблица. Хотя все действия происходят с таблицей ibf_forums, как я понял (там вообще у них всё как-то запутано. Всех таблиц по 2 экземпляра. Одни с префиксом ibf_ вторые без. Если в запросах через ихний апи указывать имена таблиц с префиксом - то выскакивает ошибка, короче, мистика, непонятно зачем это, но суть в том, что в этом аргументе у меня все правильно (ведь правильно ж?)

 

2) array( 'topics' => 'topics+1' ) - тут не может быть ошибки, поле topics у меня есть в ibf_forums

 

3)id=16 - у меня 100% в таблице ibf_forums есть запись с id равным 16

 

4)ну и 2 труе в конце, хотя...мне shutdown режим абсолютно не нужен. Как я понял, по документации последний, 5 аргумент обязательно должен быть тру, для инкремента значения. Но если 4 параметр в фалсе, а 5 в труе - то "Возникла ошибка при работе с базой данных"

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

Дык "Возникла ошибка при работе с базой данных". Какая именно ошибка, апи мне не говорит

А в логах посмотреть?

 

Запрос пишу такой:

По моему в pre-formatted не пишется в виде массива, а как обычная строка. Там же указано - Mixed value

 

Но если 4 параметр в фалсе, а 5 в труе - то "Возникла ошибка при работе с базой данных"

Это потому что вы в pre-formatted для обновления задаете массив.

 

mySQL query error: UPDATE ibf_forums SET Array WHERE id=1

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

Сейчас на странице 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.