7ответ(ов) в теме
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
1
10:48

Доброго времени суток.

После длительного тестинга заказчик изъявил желание "видеть" индикацию о новых сообщениях в старых чатах и о вновь созданных чатах без перегрузки страницы.
Так сказать своего рода мини-пуши 🙂

Логика тут понятна - надо переодически AJAX-ом "дергать" сайт на предмет онных событий.

И как всегда проше наставления в какую сторону копать? Что дергать, не изобретая велосипед?

0
Вова (Otshelnik-Fm)
не в сети 31 минута
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18654
2
10:51

Старый чат (private message) не поддерживается. По нему никакой информации не дадим.

0
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
3
11:09

Хм... За месяц все так кардинально изменилось?

P.S.

...старых чатах и о вновь созданных чатах...

Под "чат" имеется в виду "диалог" 🙂
Старый - уже существующий, ну а "вновь созданный" - значит новый, с одной репликой.

0
Андрей CS
не в сети 3 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16928
4
11:46

для получения новых сообщений используйте функцию rcl_chat_noread_messages_amount($user_id)
эта функция также получит сообщения и из "новых" чатов, если обработать полученный массив должным образом, то можно отделить сообщения из "новых" чатов и из "старых"

0
Андрей CS
не в сети 3 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16928
5
12:11

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

0
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
6
16:24

Благодярю, Андрей.

Решил не заморочиваться - пошел через функции темы.
Цель была достигнута - и слава богу. 🙂

В кратце решение:
добавляем URL AJAX обработчика для фронт-офиса:

/**
 * [updatemes_add_ajaxdata          FRONT-OFFICE: Add in head AJAX-handler URL]
 * @return [string]                 [Print HTML code]
 */
function updatemes_add_ajaxdata() {
	if ( is_user_logged_in() ) {
		$variables = array (
				'url' => admin_url( 'admin-ajax.php' ),
				'is_mobile' => wp_is_mobile()
			);
		echo '<script type="text/javascript">var messajax = ' . json_encode( $variables ) . ';</script>';
	}
}
add_action( 'wp_head', 'updatemes_add_ajaxdata' );

Добавляем в footer сам AJAX запрос и обрабатывающие скрипты:

/**
 * [my_action_javascript            FRONT-OFFICE: Add in footer AJAX-script]
 * @return [string]                 [Print HTML code]
 */
function my_action_javascript() {
	if ( is_user_logged_in() ) {
		echo <<<EOT
			<!-- unit is in function -->
			<script type="text/javascript" >
				jQuery( document ).ready( function($) {
					var pause = 5000,
						timerId = setInterval( function() {
							var data = {
								action: 'mess_control'
							};
							jQuery.post( messajax.url, data, function( response ) {
								// тут вставляем свои скрипты для изменения DOM модели
							});
					}, pause);
				});
			</script>
EOT;
	}
}
add_action('wp_footer', 'my_action_javascript', 99);

Добавляем функцию-обработчик JSON ответа:

/**
 * [updatemes_message_control       FRONT-OFFICE: ]
 * @param  [number] $user_id        [Current user ID]
 * @return [string]                 [AJAX response]
 */
function updatemes_message_control() {
	global $wpdb, $table_prefix;
	$user_ID = get_current_user_id();

	// запрос к DB надо переписать под свои условия: ниже только образец - не стоит его бездумно копировать
	$query = $wpdb->get_results(
		"SELECT 'user_info' AS type, `user_id` AS user_id, `meta_key` AS meta_key, "
		. "CONVERT(`meta_value` USING utf8) AS description "
		. "FROM `" . $table_prefix . "usermeta` "
		. "WHERE (`meta_key` = 'first_name' OR `meta_key` = 'last_name' OR `meta_key` = 'rcl_avatar' OR `meta_key` = 'ulogin_photo') "
		. "AND (`user_id` "
			. "IN ( "
				. "SELECT `user_id` "
				. "FROM  `" . $table_prefix . "rcl_chat_messages` "
				. "WHERE `private_key` = '" . $user_ID . "' "
				. "AND `message_status` = '0')) "
		. "UNION "
		. "SELECT 'messages' AS type, `user_id` AS user_id, `message_id` AS meta_key, "
		. "CONVERT(`message_content` USING utf8) AS description "
		. "FROM `" . $table_prefix . "rcl_chat_messages` "
		. "WHERE `private_key` = '" . $user_ID . "' "
		. "AND `message_status` = '0'"
	);

	foreach ( $query as $key => $value ) {
		
		// здесь, при необходимости, переформатируем полученный массив данных
		// в приведенном образце запроса все данные приходят отдельными объектами и здесь
		// набор объектов копвертируется в корректный массив:
		$mess[$value->user_id][$value->type][$value->meta_key] = $value->description;
	}

	if( is_array( $mess ) ) {
		$res = array();
		foreach ( $mess as $key => $value ) {
			// здесь формируем структуру возвращаемой JSON строки
			// в моем случае это готовый HTML код POP-Up блока 
		}
	}

	$whatever = json_encode( $res );
	echo $whatever;
	wp_die();
}
add_action( 'wp_ajax_mess_control', 'updatemes_message_control' );

Результат реализации:

Вы не можете просматривать опубликованные ссылки

P.S. Это только пример реализации - "тупое копирование" не принесет никакого результат.

0
Андрей CS
не в сети 3 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16928
7
16:33

Необходимые данные для js скрипта можно получать из уже существующего объекта Rcl:
Rcl.ajaxurl
Rcl.mobile

Кроме того, вы можете дополнять объект своими данными, а затем их использовать:

add_filter('rcl_init_js_variables','rcl_init_js_my_variables',10);
function rcl_init_js_my_variables($data){
    $data['any_variable'] = 1;
    return $data;
}

а вообще, было бы полезно оформить все это в дополнение и распространять через каталог дополнений, думаю, было бы востребовано.

0
Тема закрыта. Публикация новых сообщений запрещена.