Перейти к содержимому
Русский язык для Invision Community 5

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

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.