2010-08-04 55 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