Posted 8 ноября, 20213 yr 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>'; Теперь когда я в теме оставлю сообщение под хайдом все ок, на почту приходит уведомление о том, что сообщение скрыто. Но когда я создаю новую тему с сообщением под хайдом, то пользователю приходит сообщение снова открытое. Можете подсказать в каком месте идет отправка уведомлений при создании новой темы?
8 ноября, 20213 yr 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 Собственно вот уведомления которые приходят на почту: При создании нового топика. При написание сообщения в уже созданном топике.
8 ноября, 20213 yr Author comment_174372 Respected вопрос немного другой. Мне нужно узнать где генерируется отправка уведомлений на Email при создании топика Наверное зря я в целом завел речь о плагине. Задача в том, чтобы найти файл и функцию из которой отправляется уведомление при создании нового контента)
8 ноября, 20213 yr 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 ) ); } } }
8 ноября, 20213 yr 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 Возможно при создании топика текст сообщения подставляется из какого-то другого файла?
8 ноября, 20213 yr 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, в каком месте берется само сообщение.
8 ноября, 20213 yr 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.