Не отправляются письма Virtuemart 2.0.x. Не происходит подтверждение заказа
7 марта 2012 в 14:54 в категории Плагины и модули, Статьи о php 4 комментарияДоброе время суток, Уважаемые читатели и подписчики!
Сегодня расскажу вам о том, как решить проблему, с которой я столкнулся во время работы с новым Virtuemart 2.0.2. Проблема заключалась в том, что после того как человек вводит свои данные и нажимает на кнопочку «Подтвердить заказ» загружается абсолютно пустая страница, но сам заказ сохраняется в администраторской панели, и не отправляются письма, уведомляющие пользователя и администратора о заказе через Virtuemart.
Немного покопавшись в коде, я нашел решение этой проблемы.
Я гуглил, но ничего не смог найти, потом оклеветал хостинг, т.к. на Denwer’e все работало нормально, начал настраивать почту, пробовать разные варианты отправки php mail(); SMTP, sendmail. Но ничего не помогало. И тут я увидел что в начале письма, которое отправляется пользователю (у Denver’a сохраняются письма, отправленные через php mail(); в папке WebServers\tmp\!sendmail ), выводится сообщение об ошибке. Оповещение говорит о том, что что-то не так с передаваемым параметром в функцию substr(); в файле
administrator/components/com_virtuemart/models/orders.php на строке 997
Открыв файл, я нашел нужную строку. Она находилась в условии:
if(empty($data['invoice_number'])) { //$variable_fixed=sprintf("%05s",$num_rows); $data['invoice_number'] = str_replace('-', '', substr(JFactory::getDate(),2,8)).substr(md5($orderDetails['order_number'].$orderDetails['order_status']),0,3).'0'.$count; }
Там есть два вызова функции substr(); и на один из них ругается сервер.
$data['invoice_number'] = str_replace('-', '', substr(JFactory::getDate(),2,8)).substr(md5($orderDetails['order_number'].$orderDetails['order_status']),0,3).'0'.$count;
Удаление первого выражения:
str_replace('-', '', substr(JFactory::getDate(),2,8))
привело к тому, что ошибка пропала, и все нормально начало работать. Не знаю чем чревато такого рода изменение, но сайт начал работать нормально. Отправляются все письма: администратору и пользователю, грузится страничка с подтверждением оформления заказа.
Вот в конечном итоге что у меня получилось на строке 997:
$data['invoice_number'] = substr(md5($orderDetails['order_number'].$orderDetails['order_status']),0,3).'0'.$count;
Вообще, это функция присвоения номера/кода заказа к нему же. Условие проверяет указан ли уже номер/код, если нет, то формирует его из двух строк: первая часть — цифры текущей даты, вторая — md5(); от номера заказа и от его статуса.
Т.е. в принципе мы ничего критического не сделали, но если у вас есть более элегантное и красивое решение данной проблемы — милости просим в комментарии.
Удачного кодинга!
4 комментария
Здравствуйте! Проблема не решилась. Так же не приходят уведомления. Если вручную сменить статус заказа, то уведомление приходит только клиенту. В чем может быть причина?
1) какая версия Virtuemart
2) Точно ли все делали по статье?
3) скорей всего нужно смотреть лично
Тоже не помогло. И сообщения лишние об ошибках повываливались
Какая версия virtuemart?