We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

Проблема с View

Столкнулся с какой-то не понятной багой (или фичей?)... Мне надо отправить письмо пользователю после окончания регистрации на сайте. Сделал следующее:

  1. Создал класс-обертку для Swift Mailer: https://gist.github.com/aktuba/7503437
  2. Пытаюсь отправить письмо. Облегченный вариант кода: https://gist.github.com/aktuba/7504097

Как результат, ожидаю что отправится письмо и появится (в данном, упрощенном, случае) страница регистрации. Письмо уходит, но после появляется просто белая страница, даже layout-а нет.

Подскажите, plz, как победить эту багу/фичу... 2-й день как головой об стену (



8.1k

Может, здесь

    HTTP::redirect($this->url->getBasePath());


10.2k

Не, это я забыл удалить. Поправил (https://gist.github.com/aktuba/7504097). Проблема в том, что если делать $view->setDI($this->_di) - view приложения перестает работать, а если не делать - новый view не рендерит (



10.2k

Победил проблему, но... Вот он минус компилируемого фреймворка. Решение: убрать регистрацию движка рендеринга ($view->registerEngines(array('.php' => 'Phalcon\Mvc\View\Engine\Php'));). Все. После этого работает нормально все. Минус: не могу даже посмотреть, почему так. И не знаю, как это поправить (. Пока что переименовал расширения у всех вьюх на .phtml, но это не удобно (

Хорошо что проблема уже решена, есть вариант class Mail сделать наследуемым от \Phalcon\Mvc\User\Component, тогда в нём будут сразу доступны все сервисы из $di как $this->view или $this->getDi()->get('view'). И использовать вывод шаблона через уже зарегистрированный сервис представлений. Сам код в sendView тогда сведётся к:

list($controller, $action) = explode('/', $view);
return $this->getDi()->get('view')->getRenderer($controller, $action, $data);

Проблема может быть во второй регистрации view.



10.2k

Не, так не пойдет. У view приложения свои настройки (layout, например), а у mail-класса должны быть свои (вообще без layout, например). Но, есть вопрос. Если наследоваться от Component, в конструктор класса попадет DI? Если нет - какой смысл наследоваться тогда?

Там в методе можно определить свои дополнительные параметры https://docs.phalcon.io/en/latest/reference/views.html#id1 :

echo $view->getRender('products', 'list',
    array(
        "someProducts" => $products,
        "someFeatureEnabled" => true
    ),
    function($view) {
        //Set any extra options here
        $view->setViewsDir("../app/views/");
        $view->setRenderLevel(Phalcon\Mvc\View::LEVEL_LAYOUT);
    }
);

Если наследоваться то да, в конструкторе уже должны быть все сервисы из DI. Пример из реального сайта, ранее в $di был определён сервис config ( $di->setShared('config' , $config) ) :

class Seo extends \Phalcon\Mvc\User\Component
{

    /** @var array */
    protected $_data = array();
    protected $_tags = array();

    function __construct()
    {
        $this->_data = [ '%host_name%' => $this->config->seo->title ];
    }
....

@aktuba , еще есть упрощенный компонент представлений с облегченным синтаксисом ( Phalcon\Mvc\View\Simple ), использование его, возможно, в качестве редера для писем будет тоже неплохим вариантом https://docs.phalcon.io/en/latest/reference/views.html#id2



10.2k

А дополнительные параметры используются временно или меняют основные? В принципе, хороший вариант, переделаю, проверю. По поводу Simple - не вижу смысла, не решает проблему. А проблема в том, что хочется для шаблонов использовать расширение .php, а не .phtml.



10.2k

Да, так получается значительно проще и красивее: https://gist.github.com/aktuba/7529487

Отличное решение, сможешь оформить в виде библиотеки? У Phalcon нет своего класса работы с почтой, готовое решение очень бы порадовало сообщество ;)

используются временно или меняют основные? не могу сказать точно, но с большей вероятностью используются временно, для этого конкретного метода.



10.2k

Уже проверил - только временно меняются, как я понял. Завтра попробую собрать все в кучу и выложить на гитхаб.



10.2k

При создании либы возникла проблема - отправляются по 2 письма. В рабочем приложении только одно, а вот в тестовом два... Почему - пока не могу понять, поэтому:

  1. Код все либы здесь: https://gist.github.com/aktuba/7541241
  2. Пример использования:
$di->set('mailer', function(){
    return new \Phalcon\Mail\Mail(array(
        'swift' => __DIR__.'/../vendor/Swift-5.0.1/lib',
        'from'      => '[email protected]',
        'transport' => 'native', //native|smtp|sendmail
        'options'   => array(
            'host'       => 'smtp.gmail.com',
            'port'       => '465',
            'encryption' => 'ssl',
            'username'   => 'username',
            'password'   => 'password',
        ),
    ));
});
$this->mailer->sendView('[email protected]', 'test subject', 'email/test');


10.2k

Очень похоже, что проблема с настройкой локальной машины или библиотекой Swift. Если в контроллере сделать

require_once __DIR__.'/../../../vendor/Swift-5.0.1/lib/swift_required.php';
$swift = \Swift_Mailer::newInstance(\Swift_MailTransport::newInstance());
$message = \Swift_Message::newInstance('test', 'test mail', false, 'utf-8');
$message->setTo('[email protected]');
$message->setFrom('[email protected]');
$swift->send($message);

то все-равно отправляется по 2 письма (

Спасибо за готовое решение!

расскажи когда узнаешь что с дублями писем ;)



10.2k

Проблему не нашел, но... Взял пару проектов с github, подключил к ним mailer и отправил письма. Вроде хорошо работает. Единственное, шаблоны только в .phtml.

Мы вот такое решение запилили, код ларавел 4 адаптировали для работы Фальконе https://github.com/vanchelo/phalcon-mailer

А тем временем есть готовое решение с интегрированным Swift. Используется в примере от разработчиков: Vokuro. см. https://github.com/phalcon/vokuro/tree/master/app/library/Mail

Я видел это решение) Но мне больше понравилась реализация в ларавел



318

Очень похоже, что проблема с настройкой локальной машины или библиотекой Swift. Если в контроллере сделать

require_once __DIR__.'/../../../vendor/Swift-5.0.1/lib/swift_required.php';
$swift = \Swift_Mailer::newInstance(\Swift_MailTransport::newInstance());
$message = \Swift_Message::newInstance('test', 'test mail', false, 'utf-8');
$message->setTo('[email protected]');
$message->setFrom('[email protected]');
$swift->send($message);

то все-равно отправляется по 2 письма (

скорей всего где то устанавливается

$message->cc('[email protected]');
$message->bcc('[email protected]');