Pergunta

Eu tenho uma ação que está renderizando algum conteúdo por meio de um layout.

Na verdade, quero enviar esta saída em um email. Qual é a melhor maneira de conseguir isso na estrutura de Zend?

Eu sei que preciso usar o Zend_Mail componente para enviar o email, mas não estou claro sobre como anexar a saída da minha ação a Zend_Mail.

Fiz algumas leituras sobre o ajudante de ação do Contextwitch, e acho que isso pode ser apropriado, mas ainda não estou convencido.

Ainda sou novo no Zend Framework. Estou acostumado a usar técnicas como buffer de saída para capturar a saída, o que acho que não é a maneira correta de fazer isso no Zend.

Foi útil?

Solução

Do seu controlador:

// do this if you're not using the default layout
$this->_helper->layout()->disableLayout();

$this->view->data = $items;

$htmlString = $this->view->render('foo/bar.phtml');

Se você está fazendo isso em uma classe que não é uma instância de zend_controller_action, pode ter que criar uma instância de um zend_view primeiro, para fazer isso:

$view = new Zend_view();

// you have to explicitly define the path to the template you're using
$view->setScriptPath(array($pathToTemplate)); 

$view->data = $data;

$htmlString = $view->render('foo/bar.phtml');

Outras dicas

public static function sendMail($data = array(), $template = ''){
    $html = new Zend_View();
    $html->setScriptPath(APPLICATION_PATH . '/modules/default/views');

    // assign valeues
    if(count($data['Assigni'])){
        foreach($data['Assigni'] as $assign){
            $html->assign($assign['key'], $assign['value']);
        }
    }        
    // create mail object
    $mail = new Zend_Mail('utf-8');

    // render view //'scripts/newsletter/emailtemplate.phtml'
    $bodyText = $html->render($template);

    $mail->addTo($data['To']);
    $mail->setSubject($data['Subject']);
    $mail->setFrom($data['From'], $data['FromName']);
    $mail->setBodyHtml($bodyText);
    $mail->send();
}

Ao despachar a ação, você pode capturar o evento no método PostDispatch () do plug -in, que pode adicionar dinamicamente à pilha da ação desejada. Em que você recebe o conteúdo de resposta por

//in action
//...some php code
Zend_Controller_Front::getInstance()->registerPlugin(new My_Plugin());
//in plugin
$htmlCode = $this->_response->getBody();

Não posso lhe dar uma resposta super detalhada, mas se você deseja a saída completa (incluindo o layout), acho que você deseja escrever sua função de e-mail como ajudante de ação e inseri-lo no gancho do pós-patch do zend_controller_action- > Dispatch () Loop.

Ver http://nethands.de/download/zenddispatch_en.pdf Para a visão geral do processo de envio da Estrutura Zend Full.

Se você não precisar do layout incluído no seu conteúdo de email, poderá fazer isso em muitos pontos, inclusive pelo uso de um comutador de contexto, como mencionado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top