0

一个多星期以来,我一直在尝试任何空闲的机会来使这个电子邮件表格起作用。它基于似乎是更早版本的 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 文件,以便于安装和测试,如果有人想玩那么远。

4

1 回答 1

0

不确定你是否已经让它工作了,但最近我通过创建我的第一个模块来尝试同样的事情,并且最初很挣扎。

我可以在您的代码中看到以下需要更正的几件事:-您的 case 语句中的第一个文件(即 mod_contact.php)用于变量“c_send”,您正在寻找要在表单提交时发送的值“true”,但您是在 default_tmpl 中发送值“send”。您需要将字符串与“send”进行比较,或者从 default_tmpl 发送值“true”。- 在标签中完全跳过动作部分返回到 mod_contact.php。

希望有帮助。

于 2014-02-11T12:53:30.077 回答