Контактная форма CakePHP 2.1 в Element не будет отправляться

У меня есть две контактные формы в моем приложении CakePHP — одна с собственным контроллером, моделью и представлением, а другая — в элементе, к которому можно получить доступ как к «быстрой» контактной форме из нижнего колонтитула каждой страницы сайта.

Код для обеих форм одинаков. Элемент предназначен для доступа к контроллеру и модели, которые использует другая форма. Однако элемент не отправляет данные и не отправляет электронное письмо, в то время как обычная страница работает нормально.

Вот код MVC для обычной формы, которая работает:

<!-- Model: Model/Contact.php -->

<?php
class Contact extends AppModel {
    var $name = 'Contacts';
    public $useTable = false;  // Not using the database, of course.

    var $validate = array(
        'name' => array(
            'rule' => '/.+/',
            'allowEmpty' => false,
            'required' => true,
        ),
        'email' => array(
            'allowEmpty' => false,
            'required' => true,
        )
    );

    function schema() {
        return array (
            'name' => array('type' => 'string', 'length' => 60, 'class' => 'contact input'),
            'email' => array('type' => 'string', 'length' => 60, 'class' => 'contact input'),
            'message' => array('type' => 'text', 'length' => 2000, 'class' => 'contact input'),
        );
    }

}
?>

<!-- Controller: Controller/ContactsController.php -->

class ContactsController extends AppController
{
    var $name = 'Contacts';
    /* var $uses = 'Contact'; */
    var $helpers = array('Html', 'Form', 'Js');
    var $components = array('Email', 'Session');

    public function index() {
        if(isset($this->data['Contact'])) {
            $userEmail = $this->data['Contact']['email'];
            $userMessage = $this->data['Contact']['message'];

            $email = new CakeEmail();
            $email->from(array($userEmail));
            $email->to('[email protected]');
            $email->subject('Website Contact Form Submission');
            $email->send($userMessage);

            if ($email->send($userMessage)) {
                $this->Session->setFlash('Thank you for contacting us');
            } 
            else {
                $this->Session->setFlash('Mail Not Sent');
            }

        }
    }

    public function contact() {
        if(isset($this->data['Contact'])) {
            $userEmail = $this->data['Contact']['email'];
            $userMessage = $this->data['Contact']['message'];

            $email = new CakeEmail();
            $email->from(array($userEmail));
            $email->to('[email protected]');
            $email->subject('Website Contact Form Submission');
            $email->send($userMessage);

            if ($email->send($userMessage)) {
                $this->Session->setFlash('Thank you for contacting us');
            //  $this->redirect(array('controller' => 'pages', 'action' => 'index'));
            } 
            else {
                $this->Session->setFlash('Mail Not Sent');
            }

        }
    }

}
?>

<!-- View: Views/Contacts/index.ctp -->

<? 
$main = 'contact';
$title = 'quick contact';
?>
<div style="border-bottom: solid 1px #ccc;">
    <h1 style="position:relative; float:left;"><?php echo $main; ?></h1>
    <h2 style="position:relative;float:left;margin-top:15px; color: #869c38">&nbsp; &bull;&nbsp; <?php echo $title;?></h2>
    <br><br>&nbsp; &nbsp; 
</div>
<div class="clear"><br></div>
<div id="interior-page">
    <?php

    echo $this->Form->create('Contact');
    echo $this->Form->input('name', array('default' => 'name (required)', 'onfocus' => 'clearDefault(this)'));
    echo $this->Form->input('email', array('default' => 'email (required)', 'onfocus' => 'clearDefault(this)'));
    echo $this->Form->input('message', array('default' => 'message', 'onfocus' => 'clearDefault(this)'));
    echo $this->Form->submit();
    echo $this->Form->end();
    ?>
</div>

А вот представление НЕ работающей формы быстрой связи, расположенной в элементе, отображаемом в нижнем колонтитуле макета по умолчанию:

<?php

echo $this->Form->create('Contact');
echo $this->Form->input('name', array('default' => 'name (required)', 'onfocus' => 'clearDefault(this)'));
echo $this->Form->input('email', array('default' => 'email (required)', 'onfocus' => 'clearDefault(this)'));
echo $this->Form->input('message', array('default' => 'message', 'onfocus' => 'clearDefault(this)'));
echo $this->Form->submit();
echo $this->Form->end();

?>

Я пробовал разные способы изменения действия формы, но не мог этого понять.


person deewilcox    schedule 26.04.2012    source источник
comment
Чтобы создать форму для модели контактов, вам нужно убедиться, что вы установили ее через $uses или $loadModel на любой странице, которую вы хотите использовать... в вашем случае это, вероятно, AppController, так как он находится на каждую страницу. (Если это исправит, я напишу это как ответ)   -  person Dave    schedule 27.04.2012
comment
Кроме того, вам нужно будет указать, куда должна отправляться форма.   -  person Dave    schedule 27.04.2012
comment
@Dave - Спасибо за предложение. Я пробовал добавлять App::uses('Contact', 'Model'); и App::uses('ContactModel','Model'); к AppController, но, похоже, это не имело значения.   -  person deewilcox    schedule 27.04.2012
comment
брось это $name. ваш код - хороший пример, почему бы его не использовать. Вы также можете просто определить $_schema, не нужно создавать для него собственный метод. См. dereuromark.de/2011/12/ 15/tools-plugin-part-2-contact-form для подробностей   -  person mark    schedule 20.02.2013


Ответы (3)


Обычно торт «автоматически» создает действие формы в зависимости от того, откуда вы его вызываете, например. при вызове из представления Views/Contacts/index.ctp действие будет установлено в /contacts/index. В случае с элементом Cake не может догадаться, что вы пытаетесь сделать, поэтому вам нужно установить действие вручную:

$this->Form->create('Contact', array('action' => 'index'));

Или установите полный URL-адрес в качестве альтернативы:

$this->Form->create('Contact', array('url' => '/contacts/index'));
person Oldskool    schedule 26.04.2012
comment
В итоге я использовал первый вариант с эхом (echo $this->Form->create('Contact', array('action' => 'index'));), и это сработало. Спасибо большое! - person deewilcox; 27.04.2012

Убедитесь, что вы включили модель Contact для использования на каждой странице, необходимой для создания этой формы. В вашем случае, поскольку он находится в вашем макете, это, вероятно, означает, что вы должны поместить его в свой AppController, чтобы каждая страница имела к нему доступ.

Вам также необходимо указать, куда должна отправляться форма:

echo $this->Form->create('Contact', array(
        'url' => array('controller'=>'contacts', 'action'=>'contact')
    )
);

Не примечание — последние две строки можно объединить:

echo $this->Form->end('Submit');

Это создает кнопку отправки с текстом «Отправить», а также закрывает форму.

person Dave    schedule 26.04.2012
comment
Спасибо за совет по объединению последних двух строк. Я согласился — нужно сделать модель контактов доступной с любой страницы, но я не понял, как заставить ее работать. Не повезло с App::uses в AppController. - person deewilcox; 27.04.2012

Спасибо за это! Это мне очень помогло.

Просто быстро, вы отправляете электронное письмо дважды.

Однажды здесь:

$ электронная почта-> отправить ($ userMessage);

И снова здесь:

если ($ электронная почта-> отправить ($ userMessage))

Первый экземпляр ($email->send($userMessage)) не нужен.

Ваше здоровье

person Kingsley    schedule 20.02.2013