Jump to content
View in the app

A better way to browse. Learn more.

IPBMafia.ru - поддержка 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.

Отправка уведомлений

Featured Replies

Posted

Здравствуйте.

Установлен плагин Hide with conditions, допиленный на разные условия. 

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

Проблема начинается когда пользователю подписанному на тебя приходит уведомления на почту с содержимым скрытого сообщения. И соответственно сообщение видно. Хотя должно быть скрыто.

Я нашел файл из которого отправляется уведомление о создании нового сообщения /forum/system/Notification/Notification.php

И допилил его следующим образом (Все скрытые сообщения содержат класс hideContent) и если этот текст найден в сообщении вместо него показывается текст, что сообщение скрыто.

//Скрыть содержимое хайда
if(stripos($this->emailParams[0]->post, 'hideContent') !== false) 
   $this->emailParams[0]->post = '<p style="font-style: italic; color: gray; ">'.($language == 2 ? 'Посетите сайт, чтобы прочитать скрытый текст.' : 'Visit the site to read the hidden text.').'</p>';
				

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

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

Можете подсказать в каком месте идет отправка уведомлений при создании новой темы?

  • Author

На разные условия, во вложении скрин :) 

В сообщении можно скрывать часть текста в блок и ставить условия видимости. Скрытый блок оборачивается в 

<div class="hideContent"></div>

При отправки уведомлений на почту я проверяю наличие текста hideContent и заменяю сообщение :) 

Как уже сказал, проблема в том, что при создании нового топика я не пойму откуда берется сообщение. 

Я отдебажил весь файл /forum/system/Notification/Notification.php и вижу, что уведомления формируются в функции

public function send( $sentTo = array() )

и отправляются через функцию

protected function sendEmails( $emails, $emailRecipients )

Данные об отправляемом сообщении находятся в переменной $emails

И когда я отвечаю в топике, то вижу в этой переменной текст сообщения.

Но когда я создаю топик, текста сообщения в этой переменной нет, хотя есть название топика.

В общем я не могу найти место откуда берется сообщение при создании топика. 

 

 

 

Respected 

221101204533.png

411108204906.png

311108204832.png

Собственно вот уведомления которые приходят на почту: 

  • При создании нового топика.
  • При написание сообщения в уже созданном топике.

newTopic.png

Reply_topic.png

  • Author

Respected вопрос немного другой. Мне нужно узнать где генерируется отправка уведомлений на Email при создании топика :) 

Наверное зря я в целом завел речь о плагине. 

Задача в том, чтобы найти файл и функцию из которой отправляется уведомление при создании нового контента)

/system/Notification/Notification.php

/**
	 * Send emails
	 *
	 * @param	array 	$emails				Emails to send
	 * @param	array 	$emailRecipients	Email recipients
	 * @return	void
	 */
	protected function sendEmails( $emails, $emailRecipients )
	{
		foreach ( $emails as $languageId => $email )
		{
			if ( !empty( $emailRecipients[ $languageId ] ) )
			{
				$email->mergeAndSend( $emailRecipients[ $languageId ], NULL, NULL, array(), \IPS\Lang::load( $languageId ) );
			}
		}
	}

 

  • Author

Я создал тему в которой написал сообщение "wwwwwwwwwww". 

Потом я ответил в этой же теме, так же написал сообщение "wwwwwwwwwww".

 

/system/Notification/Notification.php

	/**
	 * Send emails
	 *
	 * @param	array 	$emails				Emails to send
	 * @param	array 	$emailRecipients	Email recipients
	 * @return	void
	 */
	protected function sendEmails( $emails, $emailRecipients )
	{
    	//Лог
		$text = print_r($emails,true);
        $text = date("d.m.Y H:i:s").' '.$_SERVER['REMOTE_ADDR'].' '.$text.PHP_EOL.PHP_EOL;
		if (!file_exists($_SERVER['DOCUMENT_ROOT']."/forum/error/")) { mkdir($_SERVER['DOCUMENT_ROOT']."/forum/error/", 0777, true); } 
        file_put_contents($_SERVER['DOCUMENT_ROOT']."/forum/error/logs.txt", $text, FILE_APPEND);
		foreach ( $emails as $languageId => $email )
		{
			if ( !empty( $emailRecipients[ $languageId ] ) )
			{
				$email->mergeAndSend( $emailRecipients[ $languageId ], NULL, NULL, array(), \IPS\Lang::load( $languageId ) );
			}
		}
	}

 

Содержимое файлов в случае ответа в топике и в случае создания нового топика отличаются. 

В случае ответа - файл Reply, видно отправляемое сообщение "wwwwwwwwwww"

[_data:protected] => Array
                                (
                                    [topic_id] => 2923
                                    [post_date] => 1636395890
                                    [author_id] => 1
                                    [author_name] => Nalik
                                    [post] => <p>
	wwwwwwwwwww
</p>
                                    [ip_address] => **.**.**.**
                                    [new_topic] => 0
                                    [queued] => 0
                                    [post_bwoptions] => 0
                                    [pid] => 18704
                                    [append_edit] => 0
                                    [edit_time] => 
                                    [edit_name] => 
                                    [post_key] => 0
                                    [post_htmlstate] => 0
                                    [post_edit_reason] => 
                                    [pdelete_time] => 0
                                    [post_field_int] => 0
                                    [post_field_t1] => 
                                    [post_field_t2] => 
                                    [nbpinned] => 0
                                )

В случае создания топика - файл NewTopic нет информации об отправляемом сообщении. 

NewTopic.txt Reply.txt

Возможно при создании топика текст сообщения подставляется из какого-то другого файла?

  • Author

Пока нашел окончательный вид сообщения в этом файле /forum/system/Email/Email.php, функция 

	/**
	 * Merge and Send
	 *
	 * @param	array			$recipients			Array where the keys are the email addresses to send to and the values are an array of variables to replace
	 * @param	mixed			$fromEmail			The email address to send from. If NULL, default setting is used. NOTE: This should always be a site-controlled domin. Some services like Sparkpost require the domain to be validated.
	 * @param	mixed			$fromName			The name the email should appear from. If NULL, default setting is used
	 * @param	array			$additionalHeaders	Additional headers to send. Merge tags can be used like in content.
	 * @param	\IPS\Lang		$language			The language the email content should be in
	 * @return	int				Number of successful sends
	 */
	public function mergeAndSend( $recipients, $fromEmail = NULL, $fromName = NULL, $additionalHeaders = array(), \IPS\Lang $language )
	{
		$return = 0;

		/* Get the current locale, and then set the language's locale so datetime formatting in templates is correct for this language */
		$currentLocale = setlocale( LC_ALL, '0' );
		$language->setLocale();
		
		foreach ( $recipients as $address => $vars )
		{
			$member = \IPS\Member::load( $address, 'email' );
			$subject = $this->compileSubject( $member, $language );
			$htmlContent = $this->compileContent( 'html', $member, $language );
			$plaintextContent = $this->compileContent( 'plaintext', $member, $language );
			$_additionalHeaders = $additionalHeaders;
                
			foreach ( $vars as $k => $v )
			{
				$language->parseEmail( $v );

				$htmlContent = str_replace( "*|{$k}|*", $v, $htmlContent );
				$plaintextContent = str_replace( "*|{$k}|*", $v, $plaintextContent );
				$subject = str_replace( "*|{$k}|*", $v, $subject );
					
				foreach ( $_additionalHeaders as $headerKey => $headerValue )
				{
					$_additionalHeaders[ $headerKey ] = str_replace( "*|{$k}|*", $v, $headerValue );
				}
			}
						
			if ( static::buildFromContent( $subject, $htmlContent, $plaintextContent, $this->type, FALSE )->send( $address, array(), array(), $fromEmail, $fromName, $_additionalHeaders ) )
			{
				$return++;
			}
		}

		/* Now restore the locale we started with */
		\IPS\Lang::restoreLocale( $currentLocale );
		
		return $return;
	}

Но пока еще не разобрался как формируется $htmlContent, в каком месте берется само сообщение. 

  • Author

В общем приходится в функции mergeAndSend заменять содержимое переменной $htmlContent.

Решение очень корявое, но я не знаток IPS. Нашел - написал костыль :) 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.

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.