Optionally send email notifications to set emails
This commit is contained in:
		
							parent
							
								
									e64ba59404
								
							
						
					
					
						commit
						15df3e7edc
					
				
					 5 changed files with 240 additions and 3 deletions
				
			
		|  | @ -59,11 +59,14 @@ When the plugin is installed and enabled, the `Comments` menu will appear in the | ||||||
| 
 | 
 | ||||||
| Further improvements to the comments visualization will be added in the next releases. | Further improvements to the comments visualization will be added in the next releases. | ||||||
| 
 | 
 | ||||||
|  | # Email notifications | ||||||
|  | 
 | ||||||
|  | Upon receiving a comment, if `enable_email_notifications` is enabled, the Comments plugin will send an email to the `notifications_email_to` address set in the plugin options. | ||||||
|  | 
 | ||||||
| # Things still missing | # Things still missing | ||||||
| 
 | 
 | ||||||
| - Add language file | - Add language file | ||||||
| - Allow to delete comments from the Admin Plugin | - Allow to delete comments from the Admin Plugin | ||||||
| - Email the comment to the site admins (default to all with admin.super, could be configured) |  | ||||||
| - Allow some pages to disable adding comments | - Allow some pages to disable adding comments | ||||||
| - Ability to see all comments of a page in the Admin Plugin | - Ability to see all comments of a page in the Admin Plugin | ||||||
| - Ability to reply to a comment from the Admin Plugin | - Ability to reply to a comment from the Admin Plugin | ||||||
|  |  | ||||||
							
								
								
									
										36
									
								
								comments.php
									
										
									
									
									
								
							
							
						
						
									
										36
									
								
								comments.php
									
										
									
									
									
								
							|  | @ -6,9 +6,10 @@ use Grav\Common\Grav; | ||||||
| use Grav\Common\Page\Page; | use Grav\Common\Page\Page; | ||||||
| use Grav\Common\Page\Pages; | use Grav\Common\Page\Pages; | ||||||
| use Grav\Common\Plugin; | use Grav\Common\Plugin; | ||||||
|  | use Grav\Common\Filesystem\RecursiveFolderFilterIterator; | ||||||
|  | use Grav\Common\User\User; | ||||||
| use RocketTheme\Toolbox\File\File; | use RocketTheme\Toolbox\File\File; | ||||||
| use RocketTheme\Toolbox\Event\Event; | use RocketTheme\Toolbox\Event\Event; | ||||||
| use Grav\Common\Filesystem\RecursiveFolderFilterIterator; |  | ||||||
| use Symfony\Component\Yaml\Yaml; | use Symfony\Component\Yaml\Yaml; | ||||||
| 
 | 
 | ||||||
| class CommentsPlugin extends Plugin | class CommentsPlugin extends Plugin | ||||||
|  | @ -127,9 +128,42 @@ class CommentsPlugin extends Plugin | ||||||
| 
 | 
 | ||||||
|         $file->save(Yaml::dump($data)); |         $file->save(Yaml::dump($data)); | ||||||
| 
 | 
 | ||||||
|  |         if (isset($this->grav['Email']) && $this->grav['config']->get('plugins.comments.enable_email_notifications')) { | ||||||
|  |             $this->sendEmailNotification(array( | ||||||
|  |                 'title' => $title, | ||||||
|  |                 'comment' => array( | ||||||
|  |                     'text' => $text, | ||||||
|  |                     'date' => gmdate('D, d M Y H:i:s', time()), | ||||||
|  |                     'author' => $name, | ||||||
|  |                     'email' => $email | ||||||
|  |                 ) | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         exit(); |         exit(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private function sendEmailNotification($comment) { | ||||||
|  |         /** @var Language $l */ | ||||||
|  |         $l = $this->grav['language']; | ||||||
|  | 
 | ||||||
|  |         $sitename = $this->grav['config']->get('site.title', 'Website'); | ||||||
|  |         $from = $this->grav['config']->get('plugins.email.from', 'noreply@getgrav.org'); | ||||||
|  |         $to = $this->grav['config']->get('plugins.email.email'); | ||||||
|  | 
 | ||||||
|  |         $subject = $l->translate(['PLUGIN_COMMENTS.NEW_COMMENT_EMAIL_SUBJECT', $sitename]); | ||||||
|  |         $content = $l->translate(['PLUGIN_COMMENTS.NEW_COMMENT_EMAIL_BODY', $sitename, $comment['title'], $comment['comment']['text'], $comment['comment']['author'], $comment['comment']['email']]); | ||||||
|  | 
 | ||||||
|  |         $twig = $this->grav['twig']; | ||||||
|  |         $body = $twig->processTemplate('email/base.html.twig', ['content' => $content]); | ||||||
|  | 
 | ||||||
|  |         $message = $this->grav['Email']->message($subject, $body, 'text/html') | ||||||
|  |             ->setFrom($from) | ||||||
|  |             ->setTo($to); | ||||||
|  | 
 | ||||||
|  |         $sent = $this->grav['Email']->send($message); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     private function getFilesOrderedByModifiedDate($path = '') { |     private function getFilesOrderedByModifiedDate($path = '') { | ||||||
|         $files = []; |         $files = []; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,3 +2,5 @@ enabled: true | ||||||
| use_captcha: false | use_captcha: false | ||||||
| recatpcha_site_key: '' | recatpcha_site_key: '' | ||||||
| recatpcha_secret: '' | recatpcha_secret: '' | ||||||
|  | enable_email_notifications: true | ||||||
|  | notifications_email_to: 'copesc@gmail.com' | ||||||
|  | @ -1,3 +1,7 @@ | ||||||
| en: | en: | ||||||
|   PLUGIN_COMMENTS: |   PLUGIN_COMMENTS: | ||||||
|     COMMENTS: Comments |     COMMENTS: Comments | ||||||
|  |     EMAIL_NOT_CONFIGURED: Email not configured | ||||||
|  |     NEW_COMMENT_EMAIL_SUBJECT: 'New comment on %1$s' | ||||||
|  |     NEW_COMMENT_EMAIL_BODY: '<p>A new comment was made on %1$s by %3$s (%4$s).</p><p>Post: %2$s</p><p>Text: %5$s</p>' | ||||||
|  |     EMAIL_FOOTER: '' | ||||||
|  |  | ||||||
							
								
								
									
										194
									
								
								templates/email/base.html.twig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								templates/email/base.html.twig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,194 @@ | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||||||
|  | <html xmlns="http://www.w3.org/1999/xhtml"> | ||||||
|  | <head> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||||
|  |     <title>Comments Email Template</title> | ||||||
|  |     <style> | ||||||
|  |         /* ------------------------------------- | ||||||
|  |                 GLOBAL | ||||||
|  |         ------------------------------------- */ | ||||||
|  |         * { | ||||||
|  |             margin: 0; | ||||||
|  |             padding: 0; | ||||||
|  |             font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; | ||||||
|  |             font-size: 100%; | ||||||
|  |             line-height: 1.6; | ||||||
|  |         } | ||||||
|  |         img { | ||||||
|  |             max-width: 100%; | ||||||
|  |         } | ||||||
|  |         body { | ||||||
|  |             -webkit-font-smoothing: antialiased; | ||||||
|  |             -webkit-text-size-adjust: none; | ||||||
|  |             width: 100%!important; | ||||||
|  |             height: 100%; | ||||||
|  |         } | ||||||
|  |         /* ------------------------------------- | ||||||
|  |                 ELEMENTS | ||||||
|  |         ------------------------------------- */ | ||||||
|  |         a { | ||||||
|  |             color: #348eda; | ||||||
|  |         } | ||||||
|  |         .btn-primary { | ||||||
|  |             text-decoration: none; | ||||||
|  |             color: #FFF; | ||||||
|  |             background-color: #348eda; | ||||||
|  |             border: solid #348eda; | ||||||
|  |             border-width: 10px 20px; | ||||||
|  |             line-height: 2; | ||||||
|  |             font-weight: bold; | ||||||
|  |             margin-right: 10px; | ||||||
|  |             text-align: center; | ||||||
|  |             cursor: pointer; | ||||||
|  |             display: inline-block; | ||||||
|  |             border-radius: 25px; | ||||||
|  |         } | ||||||
|  |         .btn-secondary { | ||||||
|  |             text-decoration: none; | ||||||
|  |             color: #FFF; | ||||||
|  |             background-color: #aaa; | ||||||
|  |             border: solid #aaa; | ||||||
|  |             border-width: 10px 20px; | ||||||
|  |             line-height: 2; | ||||||
|  |             font-weight: bold; | ||||||
|  |             margin-right: 10px; | ||||||
|  |             text-align: center; | ||||||
|  |             cursor: pointer; | ||||||
|  |             display: inline-block; | ||||||
|  |             border-radius: 25px; | ||||||
|  |         } | ||||||
|  |         .last { | ||||||
|  |             margin-bottom: 0; | ||||||
|  |         } | ||||||
|  |         .first { | ||||||
|  |             margin-top: 0; | ||||||
|  |         } | ||||||
|  |         .padding { | ||||||
|  |             padding: 10px 0; | ||||||
|  |         } | ||||||
|  |         /* ------------------------------------- | ||||||
|  |                 BODY | ||||||
|  |         ------------------------------------- */ | ||||||
|  |         table.body-wrap { | ||||||
|  |             width: 100%; | ||||||
|  |             padding: 20px; | ||||||
|  |         } | ||||||
|  |         table.body-wrap .container { | ||||||
|  |             border: 1px solid #f0f0f0; | ||||||
|  |         } | ||||||
|  |         /* ------------------------------------- | ||||||
|  |                 FOOTER | ||||||
|  |         ------------------------------------- */ | ||||||
|  |         table.footer-wrap { | ||||||
|  |             width: 100%; | ||||||
|  |             clear: both!important; | ||||||
|  |         } | ||||||
|  |         .footer-wrap .container p { | ||||||
|  |             font-size: 12px; | ||||||
|  |             color: #666; | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         table.footer-wrap a { | ||||||
|  |             color: #999; | ||||||
|  |         } | ||||||
|  |         /* ------------------------------------- | ||||||
|  |                 TYPOGRAPHY | ||||||
|  |         ------------------------------------- */ | ||||||
|  |         h1, h2, h3 { | ||||||
|  |             font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; | ||||||
|  |             color: #000; | ||||||
|  |             margin: 40px 0 10px; | ||||||
|  |             line-height: 1.2; | ||||||
|  |             font-weight: 200; | ||||||
|  |         } | ||||||
|  |         h1 { | ||||||
|  |             font-size: 36px; | ||||||
|  |         } | ||||||
|  |         h2 { | ||||||
|  |             font-size: 28px; | ||||||
|  |         } | ||||||
|  |         h3 { | ||||||
|  |             font-size: 22px; | ||||||
|  |         } | ||||||
|  |         p, ul, ol { | ||||||
|  |             margin-bottom: 10px; | ||||||
|  |             font-weight: normal; | ||||||
|  |             font-size: 14px; | ||||||
|  |         } | ||||||
|  |         ul li, ol li { | ||||||
|  |             margin-left: 5px; | ||||||
|  |             list-style-position: inside; | ||||||
|  |         } | ||||||
|  |         /* --------------------------------------------------- | ||||||
|  |                 RESPONSIVENESS | ||||||
|  |                 Nuke it from orbit. It's the only way to be sure. | ||||||
|  |         ------------------------------------------------------ */ | ||||||
|  |         /* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */ | ||||||
|  |         .container { | ||||||
|  |             display: block!important; | ||||||
|  |             max-width: 600px!important; | ||||||
|  |             margin: 0 auto!important; /* makes it centered */ | ||||||
|  |             clear: both!important; | ||||||
|  |         } | ||||||
|  |         /* Set the padding on the td rather than the div for Outlook compatibility */ | ||||||
|  |         .body-wrap .container { | ||||||
|  |             padding: 20px; | ||||||
|  |         } | ||||||
|  |         /* This should also be a block element, so that it will fill 100% of the .container */ | ||||||
|  |         .content { | ||||||
|  |             max-width: 600px; | ||||||
|  |             margin: 0 auto; | ||||||
|  |             display: block; | ||||||
|  |         } | ||||||
|  |         /* Let's make sure tables in the content area are 100% wide */ | ||||||
|  |         .content table { | ||||||
|  |             width: 100%; | ||||||
|  |         } | ||||||
|  |     </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
|  | <body bgcolor="#f6f6f6"> | ||||||
|  | 
 | ||||||
|  | <!-- body --> | ||||||
|  | <table class="body-wrap" bgcolor="#f6f6f6"> | ||||||
|  |     <tr> | ||||||
|  |         <td></td> | ||||||
|  |         <td class="container" bgcolor="#FFFFFF"> | ||||||
|  |             <div class="content"> | ||||||
|  |                 <table> | ||||||
|  |                     <tr> | ||||||
|  |                         <td> | ||||||
|  |                             {{ content }} | ||||||
|  |                         </td> | ||||||
|  |                     </tr> | ||||||
|  |                 </table> | ||||||
|  |             </div> | ||||||
|  |         </td> | ||||||
|  |         <td></td> | ||||||
|  |     </tr> | ||||||
|  | </table> | ||||||
|  | <!-- /body --> | ||||||
|  | 
 | ||||||
|  | <!-- footer --> | ||||||
|  | <table class="footer-wrap"> | ||||||
|  |     <tr> | ||||||
|  |         <td></td> | ||||||
|  |         <td class="container"> | ||||||
|  |             <div class="content"> | ||||||
|  |                 <table> | ||||||
|  |                     <tr> | ||||||
|  |                         <td align="center"> | ||||||
|  |                             {{ 'PLUGIN_COMMENTS.EMAIL_FOOTER'|tu }} | ||||||
|  |                         </td> | ||||||
|  |                     </tr> | ||||||
|  |                 </table> | ||||||
|  |             </div> | ||||||
|  |         </td> | ||||||
|  |         <td></td> | ||||||
|  |     </tr> | ||||||
|  | </table> | ||||||
|  | <!-- /footer --> | ||||||
|  | 
 | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue