Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Contacts/src/Controller/ContactsController.php
<?php

namespace Croogo\Contacts\Controller;

use
Cake\Core\Configure;
use
Cake\Mailer\Email;
use
Croogo\Contacts\Model\Entity\Message;
use
Croogo\Core\Croogo;

/**
 * Class ContactsController
 */
class ContactsController extends AppController
{

    public function
initialize()
    {
       
parent::initialize();

       
$this->_loadCroogoComponents([
           
'Akismet',
           
'Recaptcha' => [
               
'actions' => ['view']
            ]
        ]);
    }

   
/**
     * View
     *
     * @param string $alias
     * @return \Cake\Http\Response|void
     * @throws NotFoundException
     */
   
public function view($alias = null)
    {
        if (!
$alias) {
           
$alias = 'contact';
        }
       
$contact = $this->Contacts->find()
            ->
where([
               
'alias' => $alias,
               
'status' => 1,
            ])
            ->
firstOrFail();

       
$continue = true;
        if (!
$contact->message_status) {
           
$continue = false;
        }
       
$message = $this->Contacts->Messages->newEntity();
        if (
$this->getRequest()->is('post') && $continue === true) {
           
$message = $this->Contacts->Messages->patchEntity($message, $this->getRequest()->data);
           
$message->contact_id = $contact->id;
           
Croogo::dispatchEvent('Controller.Contacts.beforeMessage', $this);

           
$continue = $this->_spamProtection($continue, $contact, $message);
           
$continue = $this->_captcha($continue, $contact, $message);
           
$continue = $this->_validation($continue, $contact, $message);
           
$continue = $this->_sendEmail($continue, $contact, $message);
           
$this->set(compact('continue'));

            if (
$continue === true) {
               
$this->Contacts->Messages->save($message);
               
Croogo::dispatchEvent('Controller.Contacts.afterMessage', $this);
               
$this->Flash->success(__d('croogo', 'Your message has been received...'));

                return
$this->redirect($this->referer());
            }
        }

       
$this->Croogo->viewFallback([
           
'view_' . $contact->id,
           
'view_' . $contact->alias,
        ]);
       
$this->set('contact', $contact);
       
$this->set('message', $message);
    }

   
/**
     * Validation
     *
     * @param bool $continue
     * @param array $contact
     * @return bool
     * @access protected
     */
   
protected function _validation($continue, $contact, Message $message)
    {
        if (
$message->errors() || $continue === false) {
            return
false;
        }

        if (
$contact->message_archive && !$this->Contacts->Messages->save($message)) {
            return
false;
        }

        return
$continue;
    }

   
/**
     * Spam protection
     *
     * @param bool $continue
     * @param array $contact
     * @return bool
     * @access protected
     */
   
protected function _spamProtection($continue, $contact, Message $message)
    {
        if (!
$contact->message_spam_protection || $continue === false) {
            return
$continue;
        }
       
$this->Akismet->setCommentAuthor($message->name);
       
$this->Akismet->setCommentAuthorEmail($message->email);
       
$this->Akismet->setCommentContent($message->body);
        if (
$this->Akismet->isCommentSpam()) {
           
$this->Flash->error(__d('croogo', 'Sorry, the message appears to be spam.'));

            return
false;
        }

        return
true;
    }

   
/**
     * Captcha
     *
     * @param bool $continue
     * @param array $contact
     * @return bool
     * @access protected
     */
   
protected function _captcha($continue, $contact, Message $message)
    {
        if (!
$contact->message_captcha || $continue === false) {
            return
$continue;
        }

        if (!
$this->Recaptcha->verify()) {
           
$this->Flash->error(__d('croogo', 'Invalid captcha entry'));

            return
false;
        }

        return
true;
    }

   
/**
     * Send Email
     *
     * @param bool $continue
     * @param array $contact
     * @return bool
     * @access protected
     */
   
protected function _sendEmail($continue, $contact, Message $message)
    {
        if (!
$contact->message_notify || $continue === false) {
            return
$continue;
        }

       
$email = new Email();
       
$siteTitle = Configure::read('Site.title');
        try {
           
$email->from($message->email)
                ->
to($contact->email)
                ->
subject(__d('croogo', '[%s] %s', $siteTitle, $contact->title))
                ->
template('Croogo/Contacts.contact')
                ->
viewVars([
                   
'contact' => $contact,
                   
'message' => $message,
                ]);
            if (
$this->viewBuilder()->getTheme()) {
               
$email->theme($this->viewBuilder()->getTheme());
            }
            if (!
$email->send()) {
               
$continue = false;
            }
        } catch (
SocketException $e) {
           
$this->log(sprintf('Error sending contact notification: %s', $e->getMessage()));
           
$continue = false;
        }

        return
$continue;
    }
}