Автор Тема: Онлайн оплата без стоимости доставки  (Прочитано 2501 раз)

04 Ноября 2014, 18:56:59
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Всем привет, прошу совета опытных форумчан. Пытаюсь понять, в каком месте копать и не могу.

В двух словах, есть магазин преста 1.4, есть онлайн оплата (liqpay), есть платная доставка.

Так вот, при оплате любого товара модуль оплаты заставляет оплачивать и доставку, хотя это мне как раз и не нужно (доставка оплачивается покупателем при получении и в магазине носит лишь приблизительно-ознакомительный характер).

Суть вопроса: как заставить модуль liqpay не брать плату еще и за доставку? Только total products? В каком месте копать? Вариант с бесплатной доставкой не подходит.
04 Ноября 2014, 19:01:06
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 20837
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Установить модуль зависимость метода оплаты от метода доставки. Есть ссылка на форуме на этот модуль, тему точно не помню. Тогда можно будет указывать бесплатную доставку при оплате по liqpay.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
04 Ноября 2014, 20:40:48
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Установить модуль зависимость метода оплаты от метода доставки. Есть ссылка на форуме на этот модуль, тему точно не помню. Тогда можно будет указывать бесплатную доставку при оплате по liqpay.
Если не ошибаюсь, то этот модуль позволяет показывать клиентам определенные методы оплаты в зависимости от выбранного способа доставки, и выбор бесплатной доставки в список опций там не входит.
04 Ноября 2014, 20:57:42
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1010
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если доставку оплачивать не нужно, зачем тогда ее включать в стоимость?
Фактически доставка бесплатная, так и создавайте метод бесплатной доставки.
04 Ноября 2014, 23:03:05
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если доставку оплачивать не нужно, зачем тогда ее включать в стоимость?
Фактически доставка бесплатная, так и создавайте метод бесплатной доставки.
Доставка не бесплатная, просто оплачивается покупателем в отделении курьерской службы при получении. А стоимость доставки указывается на сайте для примерного информирования клиента о предстоящих затратах. Убирать стоимость доставки не вариант, так как многие пользователи боятся неизвестности и просто бросают оформление заказа на полпути, если стоимость доставки невозможно узнать.
05 Ноября 2014, 10:37:37
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 32988
  • Репутация: +26759/-0
    • Просмотр профиля
Можно в классе PaymentModule.php разделить сумму оплаты. В нем есть все переменные заказа в функции validateOrder
$order->total_paid;
$order->total_shipping;
06 Ноября 2014, 13:45:44
Ответ #6
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Проблема была решена, достаточно просто. В файле модуля liqpay.php ищем:

$amount         = $params['cart']->getOrderTotal(true, 3);
меняем на:
$amount         = $params['cart']->getOrderTotal(true, 4);
Меняется только цифра в скобках, которая означает следующее:
/**    * This function returns the total cart amount    *    * type = 1 : only products    * type = 2 : only discounts    * type = 3 : both    * type = 4 : both but without shipping    * type = 5 : only shipping    * type = 6 : only wrapping    * type = 7 : only products without shipping    *    * @param boolean $withTaxes With or without taxes    * @param integer $type Total type    * @return float Order total    */

теперь модуль "не замечает" стоимость доставки и берет деньги только за сам товар.

После решения проблемы вылезла очередная задача, которую я пока не решил. У меня немного модифицированный движок (валюта по умолчанию доллар, а цены выводятся в евро), цены в евро, а модуль взымает плату в долларах (он по умолчанию).
В файле liqpay.php нашел строку:
$currency = $this->getCurrency();
Она выводит для модуля валюту. Может кто знает, как изменить эту строку, чтобы модуль брал плату в нужной мне валюте? Нужно как-то прописать айди валюты, но я не программер и просто не знаю, как это сделать. Помогите советом.
06 Ноября 2014, 14:32:14
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 32988
  • Репутация: +26759/-0
    • Просмотр профиля
Все тот-же класс PaymentModule.php
/**
 * @param int $id_currency : this parameter is optionnal but on 1.5 version of Prestashop, it will be REQUIRED
 * @return Currency
 */
public function getCurrency($current_id_currency = null)
{
if (!(int)$current_id_currency)
$current_id_currency = Context::getContext()->currency->id;
if (!$this->currencies)
return false;
if ($this->currencies_mode == 'checkbox')
{
$currencies = Currency::getPaymentCurrencies($this->id);
return $currencies;
}
elseif ($this->currencies_mode == 'radio')
{
$currencies = Currency::getPaymentCurrenciesSpecial($this->id);
$currency = $currencies['id_currency'];
if ($currency == -1)
$id_currency = (int)$current_id_currency;
elseif ($currency == -2)
$id_currency = (int)Configuration::get('PS_CURRENCY_DEFAULT');
else
$id_currency = $currency;
}
if (!isset($id_currency) || empty($id_currency))
return false;
$currency = new Currency($id_currency);
return $currency;
}
Можно передать ид валюты, в которой хотите принимать платеж.
06 Ноября 2014, 14:34:21
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 32988
  • Репутация: +26759/-0
    • Просмотр профиля
Вы в модуле смотрите, может там можно сразу подставить ид валюты.
$this->currencies = 1; // ид нужной валюты
06 Ноября 2014, 15:13:35
Ответ #9
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вы в модуле смотрите, может там можно сразу подставить ид валюты.
$this->currencies = 1; // ид нужной валюты

Вот такие две строчки нашел в файле модуля:
$this->currencies = true;
$this->currencies_mode = 'radio';

Подстановка цифры айди валюты вместо true результата не дала. Чувствую, что я близко :)
06 Ноября 2014, 16:40:07
Ответ #10
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 85948
  • Репутация: +25399/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$this->currencies = true;
$this->currencies_mode = 'radio';
Это стандарные переменные определения валюты. Такой переменной нельзя присвоить значение ID валюты. Это не тот случай.
06 Ноября 2014, 18:02:55
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 763
  • Репутация: +6/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Так попробуй
$cart->id_currency = ид твоей валюты;
06 Ноября 2014, 18:04:24
Ответ #12
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$this->currencies = true;
$this->currencies_mode = 'radio';
Это стандарные переменные определения валюты. Такой переменной нельзя присвоить значение ID валюты. Это не тот случай.

Как на счет строчки с валютой из этого кода?

        $delivery = new Address(intval($params['cart']->id_address_delivery));
        $invoice = new Address(intval($params['cart']->id_address_invoice));
        $customer = new Customer(intval($params['cart']->id_customer));               
               
        $return_url    = 'http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/liqpay/validation.php';           
        $currency = $this->getCurrency();
        $amount         = $params['cart']->getOrderTotal(true, 4);
        $order_id      = $_SERVER['SERVER_NAME'].'_'.$params['cart']->id;
        $description   = 'Оплата за товар(и) інтернет-магазину '.$_SERVER['SERVER_NAME'];
06 Ноября 2014, 18:05:44
Ответ #13
  • Фрилансер
  • *
  • Сообщений: 104
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Так попробуй
$cart->id_currency = ид твоей валюты;

А куда этот код прицепить?
06 Ноября 2014, 18:09:23
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 763
  • Репутация: +6/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В модуль перед передачей заказа на оплату.