Jump to content

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

Featured Replies

Posted
comment_174367

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

Установлен плагин 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
comment_174370

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

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

<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
comment_174372

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

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

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

comment_174373

/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
comment_174374

Я создал тему в которой написал сообщение "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
comment_174375

Пока нашел окончательный вид сообщения в этом файле /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
comment_174376

В общем приходится в функции 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.