Jump to content

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


Налик

Recommended Posts

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

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

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

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

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

Link to comment
Share on other sites

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

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

<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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

/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 ) );
			}
		}
	}

 

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Ваша ссылка была автоматически строена.   Отображать как обычную ссылку

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...