我需要通过电子邮件向所有用户发送cakePHP 2中的每日产品列表。
我有以下代码来获取所有用户的电子邮件。
$users = $this->User->find('all', array('fields' => array('email')));
foreach ($users as $user) {
$this->Email->reset();
$this->Email->from = '<no-reply@test.com.au>';
$this->Email->to = $user['email'];
$this->Email->subject = "Daily Products" ;
$this->Email->sendAs = 'html';
$this->Email->send();
}
现在我明白我可以使用html模板并解析它的值,但我真的需要在实际视图中使用foreach循环并发送产品表。
最佳做法是什么?在控制器或视图中使用cakePHP代码来获取产品?
由于
答案 0 :(得分:2)
最佳做法是使用shell发送电子邮件。为避免内存不足,您应该以块的形式而不是所有内容同时阅读用户及其产品。
在foreach循环中,您需要获取每个用户的数据并将其设置为()它将在html模板中可用的任何其他变量,然后您可以在那里渲染所有产品。
以下是来自处理数据的shell的一些(缩短的)代码:
public function main() {
$this->loop();
}
public function loop() {
try {
while (true) {
if (!$this->poll()) {
$this->out(__('Nothing more to process, sleeping...'));
sleep($this->sleep);
}
}
} catch (Exception $e) {
$this->out($e->getMessage());
$this->log($e->getMessage(), 'processing');
}
}
public function poll() {
$this->out('Polling...');
$result = $this->Model->getFirstUnprocessed();
if ($result === false) {
return false;
}
// do something with the result here
return true;
}
这应该足以让你有个主意。要以块的形式读取用户,您需要在find()选项中增加偏移量。在我的情况下,我只检查是否有未经处理的记录,如果是,我处理并等待片刻进行下一次尝试。
答案 1 :(得分:1)
电子邮件的“视图”实际上是一个元素。它在Views / Elements / email下。 html
和text
有2个文件夹,两者都用于保存各自的模板。
你可以在那里做你的foreach,然后确保在控制器中设置布局:
$this->Email->sendAs = 'html'; // Can also be 'text' or 'both' (for multipart).
$this->Email->layout = 'foo'; // Would include Views/Elements/email/html/foo.ctp
虽然自CakePHP 2.0以来不推荐使用Email组件,但您应该使用CakeEmail组件。有关如何使用该功能的详细信息,请参阅the book。