Налик Posted November 8, 2021 Share Posted November 8, 2021 Здравствуйте. Установлен плагин 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>'; Теперь когда я в теме оставлю сообщение под хайдом все ок, на почту приходит уведомление о том, что сообщение скрыто. Но когда я создаю новую тему с сообщением под хайдом, то пользователю приходит сообщение снова открытое. Можете подсказать в каком месте идет отправка уведомлений при создании новой темы? Quote Link to comment Share on other sites More sharing options...
Respected Posted November 8, 2021 Share Posted November 8, 2021 Что это за допиленный плагин? Quote Link to comment Share on other sites More sharing options...
Налик Posted November 8, 2021 Author Share Posted November 8, 2021 На разные условия, во вложении скрин В сообщении можно скрывать часть текста в блок и ставить условия видимости. Скрытый блок оборачивается в <div class="hideContent"></div> При отправки уведомлений на почту я проверяю наличие текста hideContent и заменяю сообщение Как уже сказал, проблема в том, что при создании нового топика я не пойму откуда берется сообщение. Я отдебажил весь файл /forum/system/Notification/Notification.php и вижу, что уведомления формируются в функции public function send( $sentTo = array() ) и отправляются через функцию protected function sendEmails( $emails, $emailRecipients ) Данные об отправляемом сообщении находятся в переменной $emails И когда я отвечаю в топике, то вижу в этой переменной текст сообщения. Но когда я создаю топик, текста сообщения в этой переменной нет, хотя есть название топика. В общем я не могу найти место откуда берется сообщение при создании топика. Respected Собственно вот уведомления которые приходят на почту: При создании нового топика. При написание сообщения в уже созданном топике. Quote Link to comment Share on other sites More sharing options...
Respected Posted November 8, 2021 Share Posted November 8, 2021 Так обратись к разработчику плагина. Quote Link to comment Share on other sites More sharing options...
Налик Posted November 8, 2021 Author Share Posted November 8, 2021 Respected вопрос немного другой. Мне нужно узнать где генерируется отправка уведомлений на Email при создании топика Наверное зря я в целом завел речь о плагине. Задача в том, чтобы найти файл и функцию из которой отправляется уведомление при создании нового контента) Quote Link to comment Share on other sites More sharing options...
Respected Posted November 8, 2021 Share Posted November 8, 2021 /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 ) ); } } } Quote Link to comment Share on other sites More sharing options...
Налик Posted November 8, 2021 Author Share Posted November 8, 2021 Я создал тему в которой написал сообщение "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 Возможно при создании топика текст сообщения подставляется из какого-то другого файла? Quote Link to comment Share on other sites More sharing options...
Налик Posted November 8, 2021 Author Share Posted November 8, 2021 Пока нашел окончательный вид сообщения в этом файле /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, в каком месте берется само сообщение. Quote Link to comment Share on other sites More sharing options...
Налик Posted November 8, 2021 Author Share Posted November 8, 2021 В общем приходится в функции mergeAndSend заменять содержимое переменной $htmlContent. Решение очень корявое, но я не знаток IPS. Нашел - написал костыль Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.