Основной курс по Joomla
0 Пользователей и 1 Гость просматривают эту тему.
  • 10 Ответов
  • 405 Просмотров
*

Modis

  • Осваиваюсь на форуме
  • ***
  • 81
  • 0
Всем привет. У меня на сайте при покупке генерируются ключи для программ. Нанимал фрилансера и он мне сделал, чтобы в письмо, отправляемое покупателю, вкладывался xml-файл. У меня была версия ЖШ 4.6. Недавно пришлось делать обновление до версии ЖШ 4.16 и естественно файл к письму перестал прикладываться.
Я проштудировал файлы старой версии и нашел это решение в файле /com_jshopping/models/checkout.php. В методе sendOrderEmail было добавлено следующее:
Код: php
//send mail client
if ($order->email){
$mailer = JFactory::getMailer();
$mailer->setSender(array($mailfrom, $fromname));
$mailer->addRecipient($order->email);
$mailer->setSubject( sprintf(_JSHOP_NEW_ORDER, $order->order_number, $order->f_name." ".$order->l_name));
$mailer->setBody($message_client);

$user = JFactory::getUser();
$file = tempnam(sys_get_temp_dir(), '');
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$root = $doc->createElement('ActiveKeys');
$root->setAttribute('UserLogin', $user->username);
$root->setAttribute('check', 'mpak');
foreach ($order->products as $prod) {
$el = $doc->createElement('key');
$el->setAttribute('Name', $prod->attributes_values[2]);
$el->setAttribute('AvailCad', $prod->attributes_values[1]);
$el->setAttribute('ActiveKey', $prod->product_hash);
$root->appendChild($el);
}
$doc->appendChild($root);
$xmlData = $doc->saveXML();
file_put_contents($file, $xmlData);
if ($order->order_status == 6) {
error_reporting(E_ALL);
$mailer->addAttachment($file, "{$user->username}_ModPlus ActiveKeys.xml");
}
if ($pdfsend && $jshopConfig->order_send_pdf_client){
$mailer->addAttachment($jshopConfig->pdf_orders_path."/".$order->pdf_file);
}
$mailer->isHTML(true);
$send = $mailer->Send();
}
После обновления ЖШ многое было "разнесено" по методам и разным файлам. Полазив по ним я нашел вроде то, что нужно в файле /com_jshopping/models/ordermail.php и перенес туда добавление файла:
Код: php
public function sendMail($type, $recipient, $message, $vendor = null){
$app = JFactory::getApplication();
$jshopConfig = JSFactory::getConfig();
$dispatcher = JDispatcher::getInstance();

$mailfrom = $app->getCfg('mailfrom');
$fromname = $app->getCfg('fromname');
$pdfsend = $this->getPdfSend();
$manuallysend = $this->getManuallysend();
$subject = $this->getSubjectMail($type, $this->order);
$pdfsendtype = $this->getPdfSendType($type);

$mailer = JFactory::getMailer();
$mailer->setSender(array($mailfrom, $fromname));
$mailer->addRecipient($recipient);
$mailer->setSubject($subject);
$mailer->setBody($message);
/* for attach file*/
$user = JFactory::getUser();
$file = tempnam(sys_get_temp_dir(), '');
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$root = $doc->createElement('ActiveKeys');
$root->setAttribute('UserLogin', $user->username);
foreach ($order->products as $prod) {
$el = $doc->createElement('key');
$el->setAttribute('Name', $prod->attributes_values[2]);
$el->setAttribute('AvailProductExternalVersion', $prod->attributes_values[1]);
$el->setAttribute('ActiveKey', $prod->product_hash);
$root->appendChild($el);
}
$doc->appendChild($root);
$xmlData = $doc->saveXML();
file_put_contents($file, $xmlData);
if ($order->order_status == 6) {
error_reporting(E_ALL);
$mailer->addAttachment($file, "{$user->username}_ModPlus ActiveKeys.xml");
}
/*end of attach file*/
if ($pdfsendtype){
$mailer->addAttachment($jshopConfig->pdf_orders_path."/".$this->order->pdf_file);
}
$mailer->isHTML(true);
$dispatcher->trigger($this->getSendMailTriggerType($type),
array(&$mailer, &$this->order, &$manuallysend, &$pdfsend, &$vendor, &$this->vendors_send_message, &$this->vendor_send_order));

return $mailer->Send();
}

Думаю, понятно к чему я клоню - ничего не работает )) На мой взгляд все верно сделано, но могу ошибаться. Может кто заметит в чем проблема?
*

dmitry_stas

  • Профи
  • ********
  • 9678
  • 932
надо наверное потихонечку php-синтаксис учить :) $order - это что? посмотрите, как было и как стало.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Modis

  • Осваиваюсь на форуме
  • ***
  • 81
  • 0
надо наверное потихонечку php-синтаксис учить :) $order - это что? посмотрите, как было и как стало.
Спасибо за наводку. Поменял $order на $this->order - теперь файл создается и прикладывается к письму. Но осталась проблемка - нет имени пользователя.
Если я правильно понимаю синтаксис (так то схоже с C#, который мне ближе), то я определяю переменную "пользователь" этой строчкой:
Код: php
$user = JFactory::getUser();
Почитал в справке:
Цитировать
For every request in Joomla!, there is one user. Information about this user is readily available through the Joomla! framework in the form of an object. To get this object for the current user, use the following member function of JFactory
Т.е. по сути написано правильно, однако $user->username не работает
*

dmitry_stas

  • Профи
  • ********
  • 9678
  • 932
написано правильно. если username пуст, то может на этом этапе юзер не залогинен?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Modis

  • Осваиваюсь на форуме
  • ***
  • 81
  • 0
написано правильно. если username пуст, то может на этом этапе юзер не залогинен?
В принципе, есть в этом логика... А можно из заказа ($this->order) выдернуть ссылку на пользователя? Там ведь должен быть его id. А JFactory::getUser() использовать с указанием конкретного id.
Где можно посмотреть какие переменные входят в order?
*

dmitry_stas

  • Профи
  • ********
  • 9678
  • 932
можно. если заказ был совершен залогиненым юзером, то он там есть. JFactory::getUser(id). в базе в таблице #__jshopping_orders проще всего.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Modis

  • Осваиваюсь на форуме
  • ***
  • 81
  • 0
можно. если заказ был совершен залогиненым юзером, то он там есть. JFactory::getUser(id). в базе в таблице #__jshopping_orders проще всего.
Это проще, когда умеешь ))))
Я конечно попробовал что-то наваять, погуглив вопрос, но, естественно, ничего не получилось
Код: php
// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query
->select($db->quoteName('user_id'))
->from($db->quoteName('#__jshopping_orders'))
->where($db->quoteName('order_id').' LIKE '.$this->order_id);
// Reset the query using our newly populated query object.
$db->setQuery($query);
// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();
$user = JFactory::getUser($results);
*

Modis

  • Осваиваюсь на форуме
  • ***
  • 81
  • 0
Получилось! )))
Код: php
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query
->select($db->quoteName('user_id'))
->from($db->quoteName('#__jshopping_orders'))
->where($db->quoteName('order_id')." = ".$db->quote($this->order_id));
// Reset the query using our newly populated query object.
$db->setQuery($query);
// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadResult();
$user = JFactory::getUser($results);
*

dmitry_stas

  • Профи
  • ********
  • 9678
  • 932
так этого ничего не надо :) вы зачем спрашивали
Цитировать
Где можно посмотреть какие переменные входят в order?
просто так, посмотреть? :)
Код
$this->order->user_id
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Modis

  • Осваиваюсь на форуме
  • ***
  • 81
  • 0
А вы однако шутник  ;D
Я повелся на ваш ответ, наклепал кучу кода чтения из БД, а решением было $user = JFactory::getUser($this->order->user_id);
*

dmitry_stas

  • Профи
  • ********
  • 9678
  • 932
Re: Вложение файла в письмо при покупке
« Ответ #10 : 22.04.2017, 21:13:27 »
ну вообще :) вы спросили - где посмотреть. я сказал где. откуда я знал что это вам надо чтобы запросы броситься писать, а не обратится к тому, что увидели? :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций