Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 61 Ответов
  • 4456 Просмотров
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Модуль обратной связи AJAX
« : 26.08.2014, 21:03:48 »
Нашел образец в сети, пытаюсь сделать свою, и в тупике.
Главный:
Спойлер
[свернуть]

Вьюха:
Спойлер
[свернуть]

Хелпер:
Спойлер
[свернуть]

Есс-но, письма не отправляются. Что делаю не так?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #1 : 26.08.2014, 22:03:37 »
первое что делаете не так так это не говорите нам или метод getAjax вообще срабатыват )
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #2 : 26.08.2014, 22:07:35 »
метод getAjax вообще срабатыват )
Не знаю, может и не срабатывает, как узнать?
Это вообще первый опыт аякса
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #3 : 26.08.2014, 22:10:37 »
, может и не срабатывает, как узнать?
Это вообще первый опыт аякса
Ну посмотреть в консоли или нет ошибки..
на крайний случай вставить код в метод getAjax
Код: php
$file = fopen( 'd:/1.txt', 'w' );
fwrite( $file, print_r( $_REQUEST, true ) );
flush();
fclose( $file );
если на диске d появится файл 1.txt с данными того что пришло из $_REQUEST то все ок.
не показали ещё JS функцию которой отправляете AJAX
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #4 : 26.08.2014, 22:15:22 »
js вообще отсутствует, просто кнопка сабмита на форме, и все, в образце ничего более небыло.  :o

Образец - http://www.joomshaper.com/joomla-extensions/quick-contact

На диске d: ничего не появилось, getAjax() не выполняется
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #5 : 26.08.2014, 22:16:47 »
p.s. зачем вы всю форму завернули в echo ?
можно же просто
Код: php
?> 
<form action="<?php echo JRoute::_('index.php'); ?>" method="post" id="contact-us" class="form-vertival" enctype="multipart/form-data">
..
</form>
<?php

2. что это:
$inputs = $input->get('data', array(), 'ARRAY');
foreach ($inputs as $input) {
      if ($input['name'] == 'username') $username = $input['username'];
      if ($input['name'] == 'category') $cat = $input['category'];
      if ($input['name'] == 'msg') $msg = $input['msg'];
      if ($input['name'] == 'email') $useremail = $input['email'];
      if ($input['name'] == 'skype') $userskype = $input['skype'];
      if ($input['name'] == 'phone') $userphone = $input['phone'];
    }
Вы знаете что мало того что у вас все переменные будут пустые так вы ещё зачем то все это в цикл загнали!
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #6 : 26.08.2014, 22:18:35 »
js вообще отсутствует, просто кнопка сабмита на форме, и все, в образце ничего более небыло.  :o

Образец - http://www.joomshaper.com/joomla-extensions/quick-contact

На диске d: ничего не появилось, getAjax() не выполняется
Зачет ) А вы знаете что AJAX расшифровуется как Асинхронный JavaScript и XML ?) Вы хотите AJAX без J?)  ;D
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #7 : 26.08.2014, 22:30:39 »
Вообщем коротко!
Форма у вас должна быть такая с таким JS скриптом, и со такими скрытыми полями:
Код: php
<form action="index.php" method="post" id="formContact">
<input type="text" name="name" value="">
<input type="hidden" name="option" value="com_ajax" />
<input type="hidden" name="module" value="using" />
<input type="hidden" name="format" value="raw" />
<input type="button" value="Отправить" class="send-module-btn" />
<?php echo JHtml::_( 'form.token' ); ?>
</form>
<script type="text/javascript">
jQuery(document).ready(function ($) {
$('.send-module-btn').on('click', function () {
$.ajax({
type: 'POST',
cache: false,
dataType: 'html',
url: $('#formContact').attr('action'),
data: $('#formContact').serializeArray(),
success: function (data) {
alert(data);
}
});
})
})
</script>


Там где <input type="hidden" name="module" value="using" /> вместо using укажите название вашего модуля без приставки mod_

И В методе getAjax уже обрабатывайте данные:
Код: php
public function getAjax(){
if ( !JSession::checkToken() ) exit;
$input = JFactory::getApplication()->input;
echo '<p>' . $input->getString( 'name', '' ). '</p>';
}

вот тут я писал про AJAX в модуле Joomla 3.2
p.s. работает данный метод только для Joomla 3.2+
« Последнее редактирование: 26.08.2014, 22:34:06 от Istaan »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #8 : 26.08.2014, 22:45:59 »
Добился того, что getAjax() выполняется, файл на d: создается )
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #9 : 26.08.2014, 22:57:10 »
Код: php
  public static function getAjax()
  {
    if (!JSession::checkToken()) exit;
/*
$file = fopen( 'd:/1.txt', 'w' );
fwrite( $file, print_r( $_REQUEST, true ) );
flush();
fclose( $file );
*/
    $input = JFactory::getApplication()->input;
    $module = JModuleHelper::getModule('contact_us');
    $params = new JRegistry();
    $params->loadString($module->params);
    $mail = JFactory::getMailer();

    $categories = explode('\r\n', $params->get('cu_categories'));

    $username = $input->getString('username');
    $cat = $input->getString('category');
    $msg = $input->getString('msg');
    $useremail = $input->getString('email');
    $userskype = $input->getString('skype');
    $userphone = $input->getString('phone');

    $workemail = '';
   
    if ($categories) {
      foreach($categories as $category){
        $i = strpos($category,'[');
        $categoryname = substr($category,0,(int)$i);
        $email = substr($category,(int)$i + 1,-1);
        if ($cat == $categoryname) {
          $workemail = $email;
          break;
        }
      }
    }

    $msg = $msg.'\r\n'.
      $username.'\r\n'.
      'E-mail: '.$useremail.'\r\n'.
      'Skype: '.$userskype.'\r\n'.
      'Тел.: '.$userphone;
     
    $mail->setSender(array('', 'MOD_CU_MAIL_SENDNAME'));
    $mail->addRecipient($workemail);
    $mail->setSubject(JText::_('MOD_CU_MAIL_SBJECT'));
    $mail->isHTML(true);
    $mail->Encoding = 'base64';
    $mail->setBody($msg);

    if ($mail->Send())
      {JFactory::getApplication()->enqueueMessage(JText::sprintf('MOD_CU_MAIL_SEND_TRUE', $username ));} else
      {JFactory::getApplication()->enqueueMessage(JText::sprintf('MOD_CU_MAIL_SEND_ERR', $send->__toString()), 'error');}
  }
После выполнения - белый экран
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #10 : 26.08.2014, 23:00:17 »
что это $send->__toString()?)
У вас нет этой переменной  и вы вызываете метод __toString() у несуществующего объекта.. получаете белый экран
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #11 : 26.08.2014, 23:09:22 »
Поправил,
Код: php
    $send = $mail->Send();

    if ($send == true)
не помогло

Убрал checkToken - тоже не помогло
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #12 : 26.08.2014, 23:16:35 »
Включите отображение ошибок, иначе будем тут гадать на кофейной гуще
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #13 : 26.08.2014, 23:18:18 »
Включено! Ошибок нет! В консоли чисто!
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #14 : 26.08.2014, 23:34:00 »
Закомментировал все тело getAjax() - тоже белый экран.

Форма находится внутри меню (последний пункт, только на хосте кнопка не работает - сейчас делаю на локалке), может, это влияет?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #15 : 26.08.2014, 23:41:17 »
Закомментировал все тело getAjax() - тоже белый экран.

Форма находится внутри меню (последний пункт, только на хосте кнопка не работает - сейчас делаю на локалке), может, это влияет?
Включите отображение ошибок!
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #16 : 26.08.2014, 23:46:22 »
Включено! Ошибок нет! В консоли чисто!
Уровень отображения - для разработчика
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #17 : 26.08.2014, 23:50:10 »
Почитал у Вас в блоге о некорректной обработке аяксом модулей с нижним подчеркиванием в имени, из-за этого, возможно?
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #18 : 27.08.2014, 00:11:31 »
Поменял у кнопки-инпута type с submit на button, белый экран пропал. getAjax() выполняется, но письмо не отсылается, ошибок нет, в консоли чисто.
Код: javascript
				data: jQuery('#contact-us').serializeArray(),
success: function (data) {
alert(data);
}
data - пустая строка, что там должно быть?
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #19 : 27.08.2014, 00:39:26 »
Подчистил код getAjax() и письма стали отправляться. Вот только в тело письма не могу вставить перенос строки:
Код: php
    $msg = $msg.'<br />'.
      $username.'<br />'.
      'E-mail: '.$useremail.'<br />'.
      'Skype: '.$userskype.'<br />'.
      'Тел.: '.$userphone;
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #21 : 27.08.2014, 17:07:36 »
Код: php
    $msg = $msg.'\r\n'.
      $username.'\r\n'.
      'E-mail: '.$useremail.'\r\n'.
      'Skype: '.$userskype.'\r\n'.
      'Тел.: '.$userphone;
Не работает перенос, весь текст в одну строку. Если оставить только \n, то тоже не работает.
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Модуль обратной связи AJAX
« Ответ #22 : 27.08.2014, 17:29:37 »
Странно. У нас в одном из плагинов работает вот такое:

Код: php
// Prepare email body.
$body = "
" . JText::_('PLG_SYSTEM_JMB_COPYLETTERS_EMAIL_BODY_FROM'). ": " . $name . " <" . $email . ">\n
" . JText::_('PLG_SYSTEM_JMB_COPYLETTERS_EMAIL_BODY_TO'). ": " . $contact->name . " <" . $contact->email_to_old . ">\n
" . JText::_('PLG_SYSTEM_JMB_COPYLETTERS_EMAIL_BODY_SUBJECT'). ": " . $data['contact_subject'] . "\n
" . JText::_('PLG_SYSTEM_JMB_COPYLETTERS_EMAIL_BODY_MESSAGE'). ":\r\n\r\n" . stripslashes($body);
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #23 : 27.08.2014, 17:33:50 »
Так у Вас кавычки закрываются на следующей строке! Можно и так, конечно, работает, но почему не работает, если кавычки закрывать на той же строке?
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Модуль обратной связи AJAX
« Ответ #24 : 27.08.2014, 17:38:06 »
Ааа, так у Вас одинарные кавычки:
Цитировать
Простейший способ определить строку - это заключить ее в одинарные кавычки (символ ').

Чтобы использовать одинарную кавычку внутри строки, проэкранируйте ее обратной косой чертой (\). Если необходимо написать саму обратную косую черту, продублируйте ее (\\). Все остальные случаи применения обратной косой черты будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как \r или \n, они будут выведены как есть вместо какого-либо особого поведения.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #25 : 27.08.2014, 17:40:28 »
Да, с двойными работает как надо, недосмотрел, спс.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #26 : 27.08.2014, 23:14:13 »
Код: javascript
	jQuery(document).ready(function($) {
jQuery('#cu-submit').on('click', function () {
jQuery.ajax({
type: 'POST',
cache: false,
dataType: 'text/html',
url: jQuery('#contact-us').attr('action'),
data: jQuery('#contact-us').serializeArray(),
success: function (data) {
alert(data);
}
});
});
});
Вопрос: success в какой момент выполняется: сразу после вызова getAjax() или ждет завершения getAjax() и потом выполняется? Как проверить?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #27 : 27.08.2014, 23:18:46 »
success выполняется после того как получен ответ от сервера! То есть после того как выполнен метод getAjax()
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Модуль обратной связи AJAX
« Ответ #28 : 27.08.2014, 23:19:39 »
т.е. на момент выполнения success письмо уже отправлено? спс
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Модуль обратной связи AJAX
« Ответ #29 : 27.08.2014, 23:25:51 »
т.е. на момент выполнения success письмо уже отправлено?
Да!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как создать модуль с использованием php?

Автор nartan

Ответов: 23
Просмотров: 3514
Последний ответ 11.08.2017, 10:54:08
от Никoлaй
СЕСИЯ при AJAX запросе к php файлу

Автор avantyrist

Ответов: 15
Просмотров: 2649
Последний ответ 20.12.2015, 14:13:43
от robert
[Решено] Русский язык в AJAX.php

Автор Hishchnik

Ответов: 15
Просмотров: 1887
Последний ответ 10.06.2014, 19:03:34
от Hishchnik
Погода по IP посетителя сайта. Модуль для Joomla 1.5, 2.5, 3.*, 4, 5 и так далее

Автор rishard

Ответов: 11
Просмотров: 4169
Последний ответ 02.05.2014, 20:07:58
от era
AJAX + Joomla

Автор scripter

Ответов: 3
Просмотров: 1109
Последний ответ 28.04.2014, 16:52:57
от Shustry