Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

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

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Достать topicID и forumID в коде parser.php

Всем привет. Ковыряюсь в коде форума. Нужно достать ID топика и форума куда пользователь отправляет сообщение. Встраиваю функцию в parser.php. Функции нужны эти два идентификатора что бы слать сообщение через api в ту же тему, в которую пользователь шлёт своё. А в идеальном варианте ещё и ID пользователя, который шлёт сообщение может пригодиться.

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

Для API - $post->setAuthor( 1 ) определяет от какого пользователя будет публиковаться пост.

  • Автор

Я просто воткнул кусок кода в parser.php в функцию editortohtml . Если в посте есть кубики, то $editor просто чистится и преобразуется в сообщение о кубах. Если я кидаю кубики от пользователя, сообщение редактируется и нормально поститься от его же имени. Мне нужно от другого пользователя запостить сообщение. Я втыкаю в конец функции

		define('IPS_ENFORCE_ACCESS', true);
		require_once( 'initdata.php' );
		require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
		require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );

		$registry = ipsRegistry::instance();
		$registry->init();

		$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php', 'classPost', 'forums' );
		$post = new $classToLoad( $registry );

		$post->setForumID( $this->request['f'] ); 
		$post->setTopicID($this->request['t']);
		$post->setAuthor(3);
		$post->setPostContent(implode("", $answer));

		if($post->addReply()) {
		} else {
		$editor = $post->_postErrors;
		}

 

но при таком раскладе отправка поста тупо виснет и всё. Может я что не так делаю? Вернее я почти наверняка не так что то делаю. Подскажите пожалуйста.

Изменено пользователем lifespirit

Это подключение ядра, которое вам очевидно не нужно

           define('IPS_ENFORCE_ACCESS', true);
           require_once( 'initdata.php' );
           require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
           require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );

           $registry = ipsRegistry::instance();
           $registry->init();

Ниже по коду $registry заменить на $this->registry

И у вас очень интересно получается. Вы вставили вызов API в котором обрабатываются ббкоды (а setPostContent вызовет парсер ббкодов), в метод который эти ббкоды обрабатывает, и снова запустит ваш код. Попахивает рекурсией.

  • Автор

Убрал то, что вы указали. Получилось:

		$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php', 'classPost', 'forums' );
		$post = new $classToLoad( $this->registry );

		$post->setForumID( $this->request['f'] ); 
		$post->setTopicID($this->request['t']);
		$post->setAuthor(3);
		$post->setPostContent(implode("", $answer));

		if($post->addReply()) {
		} else {
		$editor = $post->_postErrors;
		}

Отправка сообщения по прежнему висит. Может действительно рекурсия, хотя весь мною написанный код не работает если в тексте сообщения нету кубов, так что условие для рекурсии не выполнено. Может можно как то сменить id пользователя-отправителя сообщения непосредственно из парсера и дальше протолкнуть сообщение в $editor, только уже от другого пользователя?

Имхо, логически вы не правильно делаете. Нужно перед вставкой в БД обработать пост, вырезать и сохранить нужный текст. После вставке основного сообщения, не в парсере ббкодов, запустить обработку спарсеных данных если таковы имеются. Для этого есть хуки, разные dataHookPoint и тд.

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

 

написанный код не работает если в тексте сообщения нету кубов

Возможно, но в примере этого не видно.

  • Автор

Я пресмотрел задачу и теперь просто чищу пост если в нём есть кубики и вместо него публикую пост с брошенными кубиками от другого юзера. Спасибо за подсказку. Посмотрю хуки.

  • Автор

Пробую набросать хук. В настройках использую "Хук данных", "Post Data". Подскажите пожалуйста как получить данные для обработки. Они сами загружаются при вызове хука в переменную какой то определённой функции? Пока что отправка сообщения просто виснет. Вот файл хука: https://yadi.sk/d/w89xLdz9braNb .

public function handleData($insert)

$insert будет содержать массив данных поста - print_r( $insert );

 

$dsize = [6, 8, 12, 6, 8, 12, 100];

Такая форма записи появилась в php начиная с версии 5.4. Пока лучше массивы создавать по старому через array()

  • Автор

В общем я немного не понимаю. =( Выключаю хук, всё ок. Включаю хук, даже если в нём только:

 

<?php
class dice {
public function __construct();
{

}

public function handleData($insert){
	print_r $insert;
	return $insert;
}
}
?>

отправка сообщений сразу наглухо виснет. Отладка форума включена на 3 уровень и в логах пустота. Из parser.php я всё рукописное убрал сразу как только начал копать в сторону хука.

отправка сообщений сразу наглухо виснет.

Вы скорее всего отправляете через аджакс (быстрый ответ), а для него print_r $insert; уже является недопустимым. Если хотите дебажить отправляйте из расширенной формы.

 

    public function __construct();

; - не нужно

 

print_r $insert;

Для print_r нужно указывать скобки.

  • Автор

Всё. Победа. Я победил этот хук. Как экспортировать хук не нашёл так что от рабочая версия php для 3.4.x: https://yadi.sk/d/4J7VMu9xbsQq6

 

Копируете файл в папку hooks в корне вашего форума и настраиваете DataHook с функцией postAddReply на этот файл. Вин.

 

siv1987, большое спасибо. Теперь пару дней отдыха и буду переделывать text editor, но это уже будет другая тема на форуме.

 

P.S.

Предварительно надо поправить в файле id юзера, от которого будут поститься кубы и адреса для картинок результатов бросков (если у вас та же система). Ну и если у вас другая система бросков (а у вас она почти наверняка другая, потому что тут система настольных стар ворсов), надо немного поправить cube.php. Если нужны подсказки или есть вопросы по файлу, пишите.

Как экспортировать хук не нашёл

В ./conf_global.php включить режим разработчика

 

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

В свойства хука появится экспорт.

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

Аккаунт

Навигация

Поиск

Поиск

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

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