【发布时间】:2013-09-14 04:07:19
【问题描述】:
一个多星期以来,我一直在尝试利用任何空闲机会使此电子邮件表单正常工作。它基于似乎是更早版本的 Joomla 的网络教程,因为它的大部分语言似乎已被取代。我已经相应地更改了一些位,但可能遗漏了一些相当明显的部分,因为我可能对此有点不了解,但我决心把它做好!
我将其编写为一个模块,因此我可以在 Joomla 页面上的任何位置使用 {loadmodule contact} 调用它。
表单正确加载到页面上,除非我进行了某些更改并引入了 HTTP 内部服务器错误 (500),但没有进一步解释。
如果我像教程一样将表单操作保留为“index.php”,它会在没有电子邮件的情况下完成 Joomla 站点的索引页面。如果我按照此处的其他教程或答案的建议采取行动,它会清除表单,但似乎需要一两分钟来处理那里的内容 - 但仍然没有电子邮件。
Joomla 安装或它的电子邮件功能没有任何问题 - 这是一个有两个页面的全新安装,并且已经过测试,可以正确发送用户确认电子邮件。
我对 PHP 很生疏,大部分时间都在逐个字符地检查这个字符并搜索命令以确保它们正确,所以它可能是我刚刚错过的一些简单的东西。我可能也有整个事情的逻辑错误,但它似乎对我来说是正确的。
很少有关于从头开始在线编写这种类型的东西 - 大多数讨论都涉及或最终建议预先编写的模块或组件,它们都不够干净或简单,或者能够满足易用性如上所述调用它。
好的,到此为止。该模块名为 mod_contact,具有以下基本 PHP 文件。
<?php
defined('_JEXEC') or die('Direct Access to this location is not permitted.');
$document =& JFactory::GetDocument();
$document->addStyleSheet(JURI::base() . 'modules/mod_contact/css/contact.css');
$document->addScript(JURI::base() . 'modules/mod_contact/js/contact.js');
$jinput = JFactory::getApplication()->input;
$c_send = JRequest::getVar('c_send', 'false');
switch($c_send){
case 'true':
$c_name = $jinput->get('c_name', 'No Name');
$c_email = $jinput->get('c_email', 'No Email Address');
$c_telephone = $jinput->get('c_telephone', 'No Telephone Number');
$c_message = $jinput->get('c_message', 'No Message');
$c_send = ModContactHelper::SendMail($c_send, $c_name, $c_email, $c_telephone, $c_message);
if($c_send !== true) {
echo 'Error Sending Email: ' . $c_send->message;
require(JModuleHelper::getLayoutPath('mod_contact',
'confirmation_tmpl'));
break;
default:
require(JModuleHelper::getLayoutPath('mod_contact',
'default_tmpl'));
}
?>
该模块有一个 helper.php 文件来处理邮件,它旨在为 $c_send 返回一个值“true”,这会导致模板从“默认”更改为“确认”。我还没有看到它显示确认模板 - 最好的办法就是清除表格。
这里是 helper.php 文件。
<?php
defined('_JEXEC') or die('Direct access to this location is not permitted.');
class ModContactHelper {
public function SendMail($c_send, $c_name, $c_email, $c_telephone, $c_message) {
# Fetch Joomla Email Configuration
$config = JFactory::getConfig();
# Fetch JMail (Global Mail Object) through the JFactory Object.
$mailer = JFactory::getMailer();
# Set Sender to Name and Email Address from Contact Form
$mailer->setSender($c_email, $c_name);
# Set Subject Line
$mailer->setSubject('Message from Website Contact Form');
# Set Recipient to the Site Email Address, as defined in Joomla
$c_recipient = $config->getValue('config.mailfrom');
$mailer->addRecipient($c_recipient);
# Set Email Content
$c_body = "The following email was submitted via the Website Contact Form.<br />";
$c_body.= "<br />
$c_body.= "Name: ".$c_name."<br />";
$c_body.= "Email Address: ".$c_email."<br />";
$c_body.= "Contact Number: ".$c_telephone."<br />";
$c_body.= "<br />";
$c_body.= "Message: ".$c_message."<br />";
$mailer->setBody($c_body);
$mailer->IsHTML(true);
$c_send =& $mailer->Send();
return $c_send;
}
}
?>
我尝试将一些变量(例如收件人的电子邮件地址)换成一个电子邮件地址,但仍然没有成功。
最后,这里是默认模板 - default_tmpl.php。我已将操作留作参考。
<?php
defined('_JEXEC') or die('Direct Access to this location is not permitted.');
?>
<div id="mod_contact">
<form action="index.php" method="post" id="c_form">
<input name="c_send" type="hidden" value="send"/>
<p><label for "name">Name</label><input name="c_name" type="text" id="c_name" size="30"/></p>
<p><label for "email">Email Address</label><input name="c_email" type="text" id="c_email" size="30"/></p>
<p><label for "telephone">Telephone Number</label><input name="c_telephone" type="text" id="c_telephone" size="30"/></p>
<p>
<label for "question">How can I help?</label><textarea name="c_message" cols="60" rows="10" class="c_message"></textarea></p>
<p class="submit"><input type="submit" value="Submit"/></p>
</form>
</div>
非常感谢任何人能够提供的任何帮助。如果需要,我可以将完整的模块作为 ZIP 文件提供,以便于安装和测试,如果有人想玩那么远。
【问题讨论】: