Перейти к публикации
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.

Достать 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);

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

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

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