私は私のローカル開発環境でテストするためにウォッチドッグにメールを記録しようとしています。
function MYMODULE_mail_alter(&$message) {
// First: Prevent the mail from being sent.
$message['send'] = FALSE;
// Next: Log the mail so it can be debugged if necessary
ksm($message);
$logemail = $message['subject'] .'\nThe following email was not sent: \n<pre>Subject:<br>' . $message['subject'] . '<br>Body:<br>' . $message['body'][0] . '</pre>';
watchdog('MYMODULE', '@logemail', array('@logemail' => $logemail), WATCHDOG_ALERT);
}
ただし、これによりMessageの値が得られ、改行がなく、HTMLを無視します<br>
および\n
:
Patrick K, new members for the week of April 23\nThe following email was not sent: \n<pre>Subject:<br>Patrick K, new members for the week of April 23<br>Body:<br><p>Dear Patrick K,</p> <p>We haven't seen you in awhile. Hundreds of people have joined since you last logged in.</p> <p><a href="">Log in now and say hello to our newest members!</a></p></pre>
ウォッチドッグメッセージで改行とHTMLをレンダリングするにはどうすればよいですか?
ただし、これにより、改行がなく、HTMLの
<br>
および\n
を無視するMessageの値が得られます。
同様にそれは:)
HTMLメッセージを<pre>
タグで囲みました。このタグの役割は、すべてをリテラルテキストとして保持することです。これにより、ブラウザはメッセージをHTMLとして解釈しません。修正するには、<pre>
タグを削除するだけです。電子メールのコンテンツがユーザーから送信された可能性がある場合は、許可されたタグの適切なリストを使用して、まず filter_xss()
を実行し、ログメッセージを表示するときの痛みを回避します。
同時に、\n
はHTMLのエスケープ文字ではないため、文字どおりに扱われ、テキストとしてレンダリングされます。これはPHPのエスケープ文字ですが、ブラウザーは複数の空白文字を単一のスペースに折りたたむため、ここでの結果には影響しません。
PHPのnl2br
を使用して、\n
を<br>
に自動的に変換することができますが、メッセージの内容が動的である場合、リテラル文字列を使用しているため、改行が必要な場合は、明示的に<br>
ではなく\n
を使用することもできます。
これは基本的な作業例です:
$message = [
'subject' => 'test subject',
'body' => ['<div class="test">some content<br />On a new line</div>'],
];
$allowed_tags = array('div', 'a', 'table', 'br', 'etc...');
$output = '!subject <br />The following email was not sent: <br />Subject:<br />!subject<br />Body:<br />!body';
$args = array('!subject' => filter_xss($message['subject'], $allowed_tags), '!body' => filter_xss($message['body'][0], $allowed_tags));
watchdog('MYMODULE', $output, $args, WATCHDOG_ALERT);
ウォッチドッグメッセージのリストビューではHTMLが取り除かれているため、最初の!subject
とnot sent:
の後にスペースがないと、一部のメッセージが一緒に実行され、一目で読みにくくなることに注意してください。
以下でお試し頂けますか?.
watchdog("my_module", '<pre>' . print_r( $my_array_or_object, true) . '</pre>');