2010-08-04 90 views
4

我使用Zend_View来模板文本电子邮件内容。但是,我遇到了一个我一直无法解决的问题:如果一行以一个php块(?>)结尾,那么换行符会丢失。使用Zend_View丢失换行符的文本电子邮件模板

有没有人有任何想法我可以解决这个问题?

该应用程序使用Zend框架,但我没有特别的理由使用Zend_View来呈现电子邮件模板(除了它看起来是最简单,最明显的方法),所以如果有替代解决方案,好。

我试过检查原始文本输出,并且换行符完全丢失。没有“\ r”或“\ n”可以看到,所以我没有什么可以替代的。

代码发送电子邮件:

 
$emailView = new Zend_View(); 
$emailView->setScriptPath(realpath (FRONTEND_APPLICATION_PATH .'/../email/')); 
$bodyText = $emailView->render('recruitment-job-alert-text.phtml'); 

// $model = new Model_VacancyDetail(); 
// $model->find(1); 
// $emailView->vacancyDetail = $model; 

$mail = new Zend_Mail(); 
$mail->setSubject('Job Alert: ' . $model->references['vacancy_type']); 
$mail->addTo($fromEmail, $fromName); 
$mail->setFrom($fromEmail, $fromName); 
$mail->setBodyHtml($bodyHtml); 
$mail->setBodyText($bodyText); 
$mail->send(); 

电子邮件模板内容:

 
Title: <?= $this->escape($this->vacancyDetail->references['vacancy_type']) ?> 

Location: <?= $this->vacancyDetail->references['name'] ?> 
Department: <?= $this->vacancyDetail->references['department_name'] ?> 
Require Driving Licence: <?= ($this->vacancyDetail->requireDrivingLicence == 1) ? 'Yes' : 'No' ?> 
Working Hours: <?= $this->vacancyDetail->workingHours ?>. 
Benefits: <?= $this->vacancyDetail->benefits ?>. 
Salary: <?= $this->vacancyDetail->salary ?>. 

Details: 
<?= strip_tags($this->vacancyDetail->description) ?> 

Apply now at http://www.example.com/recruitment 

导致邮件内容的例子:

 
Title: Example Vacancy Type 
Location: Example LocationDepartment: Example DepartmentRequire Driving Licence: YesWorking Hours: 40. 
Benefits: Company car. 
Salary: £15,000pa. 

Details: 
This is an example position. It does not really exist. 
Apply now at http://www.example.com/recruitment 
+0

电子邮件是否显示换行符或者在PHP脚本查看时是否没有文本?即var_dump($ bodyText);死;那么在脚本中查看源代码,是否仍然存在换行符?如果是这样,那么这是邮件的一部分,否则它是zend_view。 – 2010-08-04 13:18:13

+0

在渲染视图之后,它们并不在视图中,但在它们被放入Zend_Mail之前,所以它看起来像是Zend_View或php本身的问题(还没有看到Zend_View如何渲染文件) – AllenJB 2010-08-04 15:48:27

回答

2

我相信这是PHP进食后的换行? >。通常这是一件好事,但我可以明白为什么它在你的情况下很烦人。

你可能需要做这样的事情:

Title: <?= $this->escape($this->vacancyDetail->references['vacancy_type'])."\n" ?> 

Location: <?= $this->vacancyDetail->references['name']."\n" ?> 
Department: <?= $this->vacancyDetail->references['department_name']."\n" ?> 

编辑:

这里有一个参考只是为了确认我不是要疯了:http://www.php.net/manual/en/faq.using.php#faq.using.newlines

为什么这是一个好东西?想像你的邮件模板是:

Title: <?= $this->escape($this->vacancyDetail->references['vacancy_type'])."\n" ?> 

<?php if (!empty($this->vacancyDetail->references['name'])) { ?> 
Location: <?= $this->vacancyDetail->references['name']."\n" ?> 
<?php } ?> 
Departments: 
<?php foreach ($this->vacancyDetail->references['departments'] as $dept) { ?> 
<?=$dept->name."\n"?> 
<?php } ?> 
你不会想每次这实际上是输出(一个问题,我最近在一封电子邮件模板非线之间的几个换行符,以结束这种局面

PHP项目)。

另一种选择是,您可能不会将模板存储在PHP中,只需使用{name},{department_name}或类似的变量进行解析即可。

+0

我宁愿不必使用这种方法。这个项目是其他开发人员将使用的框架,所以我宁愿不要求只适用于特定情况的代码。 如果可能的话,我想在模板文件中使用新行===生成电子邮件中的新行。 坦率地说,我不明白PHP是如何在一个?>之后出现不必要地使用换行符是一件好事(除非它们出现在文件的最后) - 但这应该是一个特例,而不是规则)。 – AllenJB 2010-08-04 16:55:50

+0

我已经根据您的评论将我的答案延长了一点点。我认为这只是大多数时候你很少注意到的那些东西中的一种,但在这种情况下并不理想。有时,当您查看非PHP网站的HTML源代码并查看大量新行时,这就是原因! – 2010-08-04 18:22:18

3

只有3个选项,我相信。

1-做蒂姆建议,并添加额外的 “\ n” 的

2-添加一个空格将结束>:

Title: <?= 'xxx' // NO SPACE here >>> ?> 
Location: <?= 'loc' // SPACE HERE >>> ?> 
Department: <?= 'RIAA' ?> 

结果是:

Title: xxxLocation: loc 
Department: 

3-添加第二个换行符i。E:

Title: <?= 'xxx' // NO EXTRA newline >>> ?> 
Location: <?= 'loc' // EXTRA HERE >>> ?> 

Department: <?= 'RIAA' ?> 

结果是:

Title: xxxLocation: loc 
Department: 

吮吸我知道,但不会有太多其他的事情可以做。你可以告诉其他开发者使用你的系统,这是PHP的一个限制,我相信他们会理解的。

PHP这样做的原因是因为通常PHP用于HTML文件,并且不需要所有会引起的额外换行符,这可能会导致HTML文件出现问题。如果你正在处理直接的文本,你必须准备好实现一些特殊的东西,因为在处理计划文本和脚本语言时会遇到一些怪异的情况。

+0

我的编辑器修剪尾随空格,所以我在行尾使用[Non-breaking space](https://en.wikipedia.org/wiki/Non-breaking_space)。 – nickel715 2016-03-09 10:24:41