From 092f4fd71e266d1ad6643d1b120a87d69fb573b5 Mon Sep 17 00:00:00 2001 From: Repellent Date: Wed, 18 Feb 2026 23:06:50 +0500 Subject: [PATCH] Initial commit --- README.md | 16 +- READ_ME.txt | 32 ++ class.basket.php | 407 +++++++++++++++++++++++ class.basket_admin.php | 300 +++++++++++++++++ images/loader-12.gif | Bin 0 -> 24254 bytes images/trash.gif | Bin 0 -> 113 bytes index.php | 4 + info.php | 20 ++ js/basket.js | 86 +++++ js/jquery.block.min.js | 55 +++ lang/index.php | 4 + lang/ru.txt | 91 +++++ module.php | 175 ++++++++++ sql.php | 110 ++++++ templates/basket_show.tpl | 15 + templates/index.php | 4 + templates/mail_text.tpl | 159 +++++++++ templates/order_finish.tpl | 13 + templates/order_form.tpl | 97 ++++++ templates/order_show.tpl | 213 ++++++++++++ templates_admin/basket_delivery.tpl | 79 +++++ templates_admin/basket_delivery_edit.tpl | 56 ++++ templates_admin/basket_payment.tpl | 77 +++++ templates_admin/basket_payment_edit.tpl | 76 +++++ templates_admin/basket_start.tpl | 62 ++++ 25 files changed, 2149 insertions(+), 2 deletions(-) create mode 100644 READ_ME.txt create mode 100644 class.basket.php create mode 100644 class.basket_admin.php create mode 100644 images/loader-12.gif create mode 100644 images/trash.gif create mode 100644 index.php create mode 100644 info.php create mode 100644 js/basket.js create mode 100644 js/jquery.block.min.js create mode 100644 lang/index.php create mode 100644 lang/ru.txt create mode 100644 module.php create mode 100644 sql.php create mode 100644 templates/basket_show.tpl create mode 100644 templates/index.php create mode 100644 templates/mail_text.tpl create mode 100644 templates/order_finish.tpl create mode 100644 templates/order_form.tpl create mode 100644 templates/order_show.tpl create mode 100644 templates_admin/basket_delivery.tpl create mode 100644 templates_admin/basket_delivery_edit.tpl create mode 100644 templates_admin/basket_payment.tpl create mode 100644 templates_admin/basket_payment_edit.tpl create mode 100644 templates_admin/basket_start.tpl diff --git a/README.md b/README.md index b03d9cf..ceb5a8d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ -# basket +### basket -Модуль Корзина Только для AVE.CMS ALT \ No newline at end of file +## Модуль Корзина + +### Модуль позволяет организовать торговлю любыми товарами с использованием корзины и формы оформления заказа. + +#### Инструкция в файле README.txt (находится в корневой папке с файлами) + +#### либо читаем тему в группе https://vk.com/topic-38315276_27718595?offset=0 + +### Changelog: + +04.09.2019 - версия 1.26.1 - адаптация для версии ave.cms 3.26 + +Версия 1.0.1 \ No newline at end of file diff --git a/READ_ME.txt b/READ_ME.txt new file mode 100644 index 0000000..e3c25a8 --- /dev/null +++ b/READ_ME.txt @@ -0,0 +1,32 @@ +Добавляем данную форму в шаблон Рубрики иил Запроса + +
+ + + + + + + + + + + + + +
+ + +
+ + +В корзину + +
+ +Обязательным условием при работе с AJAX добавлением нужны библиотеки jQuery, jQuery Form (библиотеки есть в папке lib/scripts). +Также используется библиотека jQuery Block - для затемнения экрана. + +modules/basket/js/basket.js - также нужно подключить к шаблону. + +Все скрипты являются простой демонстрацией модуля. \ No newline at end of file diff --git a/class.basket.php b/class.basket.php new file mode 100644 index 0000000..897815f --- /dev/null +++ b/class.basket.php @@ -0,0 +1,407 @@ +Query(" + SELECT + b.basket_product_id AS id, + f.field_value AS name, + d.field_value AS article, + e.field_value AS size, + b.basket_product_quantity AS quantity, + b.basket_product_amount AS amount + FROM + " . PREFIX . "_module_basket AS b + LEFT JOIN + " . PREFIX . "_document_fields AS f + ON f.Id = b.basket_product_name_id + LEFT JOIN + " . PREFIX . "_document_fields AS d + ON d.Id = b.basket_product_article_id + LEFT JOIN + " . PREFIX . "_document_fields AS e + ON e.Id = b.basket_product_size_id + WHERE b.basket_session_id = '" . session_id() . "' + ORDER BY b.id ASC + "); + + $total = 0; + $total_send = 0; + + $products = array(); + while($row = $sql->FetchRow()) + { + $total += $row->amount; + $total_send += $row->amount; + $quantity += $row->quantity; + $row->price = $row->amount / $row->quantity; + array_push($products, $row); + } + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_delivery + WHERE delivery_activ = '1' + ORDER BY delivery_position ASC + "); + + $delivery = array(); + while($row = $sql->FetchRow()) + { + array_push($delivery, $row); + } + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_payment + WHERE payment_activ = '1' + ORDER BY payment_position ASC + "); + + $payment = array(); + while ($row = $sql->FetchRow()) + { + $payment_delivery = explode(',', $row->payment_delivery); + if (in_array($_SESSION['delivery_id'], $payment_delivery)) array_push($payment, $row); + } + + if (isset($_SESSION['delivery_id'])) { + $row = $AVE_DB->Query(" + SELECT + delivery_price, + delivery_price_operands + FROM " . PREFIX . "_module_basket_delivery + WHERE id = ".$_SESSION['delivery_id']." AND delivery_activ = '1' + LIMIT 1 + ") + ->FetchRow(); + + if ($row->delivery_price_operands == "Money"){ + + $total = $total + $row->delivery_price; + + }else if ($row->delivery_price_operands == "%"){ + + $total = ($row->deliveryt_price_operands == '%') ? $total+$total/100*$row->delivery_price : $total - $row->delivery_price; + + } + + $total = $total + $delivery_price; + + if (isset($_SESSION['payment_id'])){ + $row = $AVE_DB->Query(" + SELECT + payment_price, + payment_price_operands + FROM " . PREFIX . "_module_basket_payment + WHERE id = ".$_SESSION['payment_id']." AND payment_activ = '1' + LIMIT 1 + ") + ->FetchRow(); + + if ($row->payment_price_operands == "Money"){ + + $total = $total + $row->payment_price; + + }else if ($row->payment_price_operands == "%"){ + + $total = ($row->payment_price_operands == '%') ? $total+$total/100*$row->payment_price : $total - $row->payment_price; + + } + } + } + return array('products' => $products, 'total' => $total, 'delivery' => $delivery, 'payment' => $payment, 'total_cart' => $total_cart, 'total_send' => $total_send, 'quantity' => $quantity); + } + + /** + * Добавить товар в корзину + * + * @param int $product_id идентификатор товара + * (идентификатор документа с атрибутами товара) + * @param int $name_id идентификатор наименования товара + * (идентификатор поля рубрики для наименования) + * @param int $price_id идентификатор цены товара + * (идентификатор поля рубрики для цены) + * @param int $article_id идентификатор артикула товара + * (идентификатор поля рубрики для артикула) + * @param int $size_id идентификатор размера товара + * (идентификатор поля рубрики для размера) + * @param int $quantity количество добавляемых в корзину товаров + */ + + function basketProductAdd($product_id = 0, $name_id = 0, $price_id = 0, $article_id = 0, $size_id = 0, $quantity = 1) + { + global $AVE_DB; + + $product_id = (int)$product_id; + $name_id = (int)$name_id; + $price_id = (int)$price_id; + $article_id = (int)$article_id; + $size_id = (int)$size_id; + $quantity = (int)$quantity; + + if ($product_id === 0 || $name_id === 0 || $price_id === 0 || $article_id === 0 || $size_id === 0 || $quantity === 0) return; + + $session_id = session_id(); + + $sql = $AVE_DB->Query(" + SELECT + Id, + rubric_field_id, + field_value + FROM " . PREFIX . "_document_fields + WHERE document_id = '" . $product_id . "' + AND (rubric_field_id = '" . $name_id . "' OR rubric_field_id = '" . $price_id . "' OR rubric_field_id = '" . $article_id . "' OR rubric_field_id = '" . $size_id . "') + "); + + $product = array(); + while ($row = $sql->FetchRow()) + { + $product[$row->rubric_field_id] = array('id' => $row->Id, + 'val' => $row->field_value); + } + + if (!empty($product)) + { + $exists = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_module_basket + WHERE basket_product_id = '" . $product_id . "' + AND basket_session_id = '" . $session_id . "' + ")->GetCell(); + + if ($exists) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_basket + SET + basket_product_quantity = basket_product_quantity + " . $quantity . ", + basket_product_amount = basket_product_amount + " . $quantity * $product[$price_id]['val'] . " + WHERE basket_product_id = '" . $product_id . "' + AND basket_session_id = '" . $session_id . "' + "); + } + else + { + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_module_basket + SET + basket_session_id = '" . $session_id . "', + basket_product_id = '" . $product_id . "', + basket_product_name_id = '" . $product[$name_id]['id'] . "', + basket_product_price_id = '" . $product[$price_id]['id'] . "', + basket_product_article_id = '" . $product[$article_id]['id'] . "', + basket_product_size_id = '" . $product[$size_id]['id'] . "', + basket_product_quantity = '" . $quantity . "', + basket_product_amount = '" . $quantity * $product[$price_id]['val'] . "' + "); + } + } + } + + /** + * Удалить товар из корзины + * + * @param int $product_id + */ + function basketProductDelete($product_id) + { + global $AVE_DB; + + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_basket + WHERE basket_product_id = '" . (int)$product_id . "' + AND basket_session_id = '" . session_id() . "' + "); + } + + /** + * Пересчет корзины + * + * @param array $quantity + * @param array $delete + */ + function basketOrderUpdate($quantity = array(), $delete = array(), $delivery_id, $payment_id) + { + global $AVE_DB; + + unset ($_SESSION['delivery_id']); + unset ($_SESSION['payment_id']); + + if (!(isset($delete) && is_array($delete))) $delete = array(); + + $session_id = session_id(); + + if (isset($delivery_id) && !isset($payment_id)){ + $_SESSION['delivery_id'] = $delivery_id; + }else if (isset($delivery_id) && isset($payment_id)){ + $_SESSION['delivery_id'] = $delivery_id; + $_SESSION['payment_id'] = $payment_id; + } + + // Изменяем в корзине количества товаров + if (isset($quantity) && is_array($quantity)) + { + foreach ($quantity as $product_id => $product_quantity) + { + $product_id = (int)$product_id; + if (!is_numeric($product_quantity)) continue; + $product_quantity = (int)$product_quantity; + // если количество равно 0 - удаляем товар из корзины + if ($product_quantity === 0) $delete[$product_id] = 1; + if (isset($delete[$product_id])) continue; + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_basket + SET + basket_product_amount = basket_product_amount / basket_product_quantity * " . $product_quantity . ", + basket_product_quantity = '" . $product_quantity . "' + WHERE basket_product_id = '" . $product_id . "' + AND basket_session_id = '" . $session_id . "' + "); + } + } + + // Удаляем помеченные товары + foreach ($delete as $product_id => $val) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_basket + WHERE basket_product_id = '" . (int)$product_id . "' + AND basket_session_id = '" . $session_id . "' + "); + } + } + + + /** + * Отправка заказа + * + */ + function basketOrderSend() + { + global $AVE_DB, $AVE_Template; + + $customer = array(); + + $customer['name'] = isset($_REQUEST['name']) ? trim(stripslashes($_REQUEST['name'])) : ''; + if ($customer['name'] !== '') $customer['name'] = preg_replace('/[^\x20-\xFF]|[><]/', '', $customer['name']); + + $customer['email'] = isset($_REQUEST['email']) ? trim(stripslashes($_REQUEST['email'])) : ''; + if ($customer['email'] !== '') + { + $regex_email = '/^[\w.-]+@[a-z0-9.-]+\.(?:[a-z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$/i'; + if (!preg_match($regex_email, $customer['email'])) $customer['email'] = ''; + } + + $customer['phone'] = isset($_REQUEST['phone']) ? trim(stripslashes($_REQUEST['phone'])) : ''; + if ($customer['phone'] !== '') $customer['phone'] = preg_replace('/[^\x20-\xFF]|[><]/', '', $customer['phone']); + + $customer['address'] = isset($_REQUEST['address']) ? trim(stripslashes($_REQUEST['address'])) : ''; + if ($customer['address'] !== '') $customer['address'] = preg_replace('/[^\x20-\xFF]|[><]/', '', $customer['address']); + + $customer['description'] = isset($_REQUEST['description']) ? trim(stripslashes($_REQUEST['description'])) : ''; + if ($customer['description'] !== '') $customer['description'] = preg_replace('/[^\x20-\xFF]|[><]/', '', $customer['description']); + + $delivery_method = $AVE_DB->Query(" + SELECT delivery_price, delivery_title, delivery_price_operands + FROM " . PREFIX . "_module_basket_delivery + WHERE id = ".$_SESSION['delivery_id']." AND delivery_activ = '1' + LIMIT 1 + ")->FetchRow(); + + $delivery_method_titel = $delivery_method->delivery_title; + $delivery_method_price = $delivery_method->delivery_price; + $delivery_method_operands = $delivery_method->delivery_price_operands; + + $AVE_Template->assign('delivery_method_titel', $delivery_method_titel); + $AVE_Template->assign('delivery_method_price', $delivery_method_price); + $AVE_Template->assign('delivery_method_operands', $delivery_method_operands); + + $payment_method = $AVE_DB->Query(" + SELECT payment_price, payment_title, payment_price_operands + FROM " . PREFIX . "_module_basket_payment + WHERE id = ".$_SESSION['payment_id']." AND payment_activ = '1' + LIMIT 1 + ")->FetchRow(); + $payment_method_titel = $payment_method->payment_title; + $payment_method_price = $payment_method->payment_price; + $payment_method_operands = $payment_method->payment_price_operands; + + $AVE_Template->assign('payment_method_titel', $payment_method_titel); + $AVE_Template->assign('payment_method_price', $payment_method_price); + $AVE_Template->assign('payment_method_operands', $payment_method_operands); + + // Передаем в шаблон информацию о заказчике + $AVE_Template->assign('customer', $customer); + + // Формируем тело письма + $mail_body = $AVE_Template->fetch(BASE_DIR . '/modules/basket/templates/mail_text.tpl'); + + // Если заказчик указал E-mail - отправляем письмо заказчику + if ($customer['email']) + { + send_mail( + $customer['email'], + $mail_body, + $AVE_Template->get_config_vars('BASKET_SHOP_NAME') . ' ' + . $AVE_Template->get_config_vars('BASKET_ORDER_TITLE'), + get_settings('mail_from'), + $AVE_Template->get_config_vars('BASKET_SHOP_NAME'), + 'html' + ); + } + + // Письмо администратору + send_mail( + get_settings('mail_from'), + $mail_body, + $AVE_Template->get_config_vars('BASKET_SHOP_NAME') . ' ' + . $AVE_Template->get_config_vars('BASKET_ORDER_TITLE'), + get_settings('mail_from'), + $AVE_Template->get_config_vars('BASKET_SHOP_NAME'), + 'html' + ); + + // Удаляем заказ из корзины + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_basket + WHERE basket_session_id = '" . session_id() . "' + "); + } +} + +?> \ No newline at end of file diff --git a/class.basket_admin.php b/class.basket_admin.php new file mode 100644 index 0000000..714cab0 --- /dev/null +++ b/class.basket_admin.php @@ -0,0 +1,300 @@ +Query(" + SELECT * + FROM " . PREFIX . "_module_basket_payment + ORDER BY payment_position ASC + "); + while ($row = $sql->FetchRow()) array_push($payment,$row); + + $delivery = array(); + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_delivery + ORDER BY delivery_position ASC + "); + while ($row = $sql->FetchRow()) array_push($delivery,$row); + + if ($home == true){ + $AVE_Template->assign('payment', $payment); + $AVE_Template->assign('delivery', $delivery); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'basket_start.tpl')); + } + } + +//////////////// +// Вид оплаты // +//////////////// + + function basketDelPaymentMethod($id) + { + global $AVE_DB; + + if ($id != 1) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_basket_payment + WHERE id = '" . $id . "' + "); + } + + header("Location:index.php?do=modules&action=modedit&mod=basket&moduleaction=basket_payment&cp=" . SESSION); + exit; + } + + function basketNewPaymentMethod() + { + global $AVE_DB; + + $AVE_DB->Query(" + INSERT " . PREFIX . "_module_basket_payment + SET payment_title = '" . $_POST['payment_title'] . "' + "); + + header("Location:index.php?do=modules&action=modedit&mod=basket&moduleaction=basket_payment&cp=" . SESSION); + exit; + } + + function basketDisplayMethods() + { + global $AVE_DB; + + $methods = array(); + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_payment + ORDER BY payment_position ASC + "); + while ($row = $sql->FetchRow()) array_push($methods,$row); + + return $methods; + } + + function basketPaymentMethods($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + foreach ($_POST['payment_title'] as $id => $payment_title) + { + if (!empty($payment_title)) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_basket_payment + SET + payment_title = '" . $payment_title . "', + payment_activ = '" . $_POST['payment_activ'][$id] . "', + payment_position = '" . $_POST['payment_position'][$id] . "' + WHERE + id = '" . $id . "' + "); + } + } + } + + $AVE_Template->assign('methods', $this->basketDisplayMethods()); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'basket_payment.tpl')); + } + + + function basketEditPaymentMethod($tpl_dir,$id) + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_basket_payment + SET + payment_title = '" . $_POST['payment_title'] . "', + payment_description = '" . $_POST['payment_description'] . "', + payment_activ = '" . $_POST['payment_activ'] . "', + payment_price = '" . $_POST['payment_price'] . "', + payment_price_operands = '" . $_POST['payment_price_operands'] . "', + payment_delivery = '" . ((isset($_POST['payment_delivery']) && is_array($_POST['payment_delivery'])) ? implode(',', $_POST['payment_delivery']) : '') . "' + WHERE + id = '" . $_REQUEST['id'] . "' + "); + + echo ''; + } + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_payment + WHERE id = '" . $id . "' + "); + + $row = $sql->FetchRow(); + $row->payment_delivery = explode(',', $row->payment_delivery); + + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 200; + $config = array(); + $Edi = $oCKeditor->editor('payment_description', $row->payment_description, $config); + + $AVE_Template->assign('Edi', $Edi); + $AVE_Template->assign('basket_delivery', $this->basketDisplayDelivery()); + $AVE_Template->assign('payment', $row); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'basket_payment_edit.tpl')); + } + + function basketDisplayDelivery() + { + global $AVE_DB; + + $basket_delivery = array(); + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_delivery + ORDER BY delivery_position ASC + "); + while ($row = $sql->FetchRow()) array_push($basket_delivery,$row); + + return $basket_delivery; + } + + + + +//------------------------------------------------------ + function basketDeliveryMethods($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + foreach ($_POST['delivery_title'] as $id => $delivery_title) + { + if (!empty($delivery_title)) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_basket_delivery + SET + delivery_title = '" . $delivery_title . "', + delivery_activ = '" . $_POST['delivery_activ'][$id] . "', + delivery_position = '" . $_POST['delivery_position'][$id] . "' + WHERE + id = '" . $id . "' + "); + } + } + } + + $AVE_Template->assign('methods', $this->basketDisplayDelivery()); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'basket_delivery.tpl')); + } + + function basketNewDeliveryMethod() + { + global $AVE_DB; + + $AVE_DB->Query(" + INSERT " . PREFIX . "_module_basket_delivery + SET delivery_title = '" . $_POST['delivery_title'] . "' + "); + + header("Location:index.php?do=modules&action=modedit&mod=basket&moduleaction=basket_delivery&cp=" . SESSION); + exit; + } + + function basketDelDeliveryMethod($id) + { + global $AVE_DB; + + if ($id != 1) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_basket_delivery + WHERE id = '" . $id . "' + "); + } + header("Location:index.php?do=modules&action=modedit&mod=basket&moduleaction=basket_delivery&cp=" . SESSION); + exit; + } + + function basketEditDeliveryMethod($tpl_dir,$id) + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_basket_delivery + SET + delivery_title = '" . $_POST['delivery_title'] . "', + delivery_description = '" . $_POST['delivery_description'] . "', + delivery_activ = '" . $_POST['delivery_activ'] . "', + delivery_price = '" . $_POST['delivery_price'] . "', + delivery_price_operands = '" . $_POST['delivery_price_operands'] . "' + WHERE + id = '" . $_REQUEST['id'] . "' + "); + + echo ''; + } + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_basket_delivery + WHERE id = '" . $id . "' + "); + + $row = $sql->FetchRow(); + + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 200; + $config = array(); + $Edi = $oCKeditor->editor('delivery_description', $row->delivery_description, $config); + + $AVE_Template->assign('Edi', $Edi); + $AVE_Template->assign('delivery', $row); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'basket_delivery_edit.tpl')); + } + + + +} +/** + */ +?> \ No newline at end of file diff --git a/images/loader-12.gif b/images/loader-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..a28b11c8cf1f61dd4b82de63de877e68bd6183fd GIT binary patch literal 24254 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 literal 0 HcmV?d00001 diff --git a/images/trash.gif b/images/trash.gif new file mode 100644 index 0000000000000000000000000000000000000000..e800ef665431badf0f3c26fca582d4d2acbe6152 GIT binary patch literal 113 zcmZ?wbhEHbx>*>k0T@p(!T \ No newline at end of file diff --git a/info.php b/info.php new file mode 100644 index 0000000..7184e97 --- /dev/null +++ b/info.php @@ -0,0 +1,20 @@ + 'basket', + 'ModuleVersion' => '1.26.1', + 'ModuleAutor' => 'AVE.cms Team', + 'ModuleCopyright' => '© 2007-' . date('Y') . ' AVE.cms', + 'ModuleStatus' => 1, + 'ModuleIsFunction' => 1, + 'ModuleTemplate' => 1, + 'ModuleAdminEdit' => 1, + 'ModuleFunction' => 'mod_basket', + 'ModuleTag' => '[mod_basket]', + 'ModuleTagLink' => null, + 'ModuleAveTag' => '#\\\[mod_basket]#', + 'ModulePHPTag' => "" + ); +?> \ No newline at end of file diff --git a/js/basket.js b/js/basket.js new file mode 100644 index 0000000..55e0ae2 --- /dev/null +++ b/js/basket.js @@ -0,0 +1,86 @@ + \ No newline at end of file diff --git a/js/jquery.block.min.js b/js/jquery.block.min.js new file mode 100644 index 0000000..cfb725a --- /dev/null +++ b/js/jquery.block.min.js @@ -0,0 +1,55 @@ +;(function($){if(/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery)||/^1.1/.test($.fn.jquery)){alert('blockUI requires jQuery v1.2.3 or later! You are using v'+$.fn.jquery);return;} +$.fn._fadeIn=$.fn.fadeIn;var noOp=function(){};var mode=document.documentMode||0;var setExpr=$.browser.msie&&(($.browser.version<8&&!mode)||mode<8);var ie6=$.browser.msie&&/MSIE 6.0/.test(navigator.userAgent)&&!mode;$.blockUI=function(opts){install(window,opts);};$.unblockUI=function(opts){remove(window,opts);};$.growlUI=function(title,message,timeout,onClose){var $m=$('
');if(title)$m.append('

'+title+'

');if(message)$m.append('

'+message+'

');if(timeout==undefined)timeout=3000;$.blockUI({message:$m,fadeIn:700,fadeOut:1000,centerY:false,timeout:timeout,showOverlay:false,onUnblock:onClose,css:$.blockUI.defaults.growlCSS});};$.fn.block=function(opts){return this.unblock({fadeOut:0}).each(function(){if($.css(this,'position')=='static') +this.style.position='relative';if($.browser.msie) +this.style.zoom=1;install(this,opts);});};$.fn.unblock=function(opts){return this.each(function(){remove(this,opts);});};$.blockUI.version=2.39;$.blockUI.defaults={message:'

Please wait...

',title:null,draggable:true,theme:false,css:{padding:0,margin:0,width:'30%',top:'40%',left:'35%',textAlign:'center',color:'#000',border:'3px solid #aaa',backgroundColor:'#fff',cursor:'wait'},themedCSS:{width:'30%',top:'40%',left:'35%'},overlayCSS:{backgroundColor:'#000',opacity:0.6,cursor:'wait'},growlCSS:{width:'350px',top:'10px',left:'',right:'10px',border:'none',padding:'5px',opacity:0.6,cursor:'default',color:'#fff',backgroundColor:'#000','-webkit-border-radius':'10px','-moz-border-radius':'10px','border-radius':'10px'},iframeSrc:/^https/i.test(window.location.href||'')?'javascript:false':'about:blank',forceIframe:false,baseZ:1000,centerX:true,centerY:true,allowBodyStretch:true,bindEvents:true,constrainTabKey:true,fadeIn:200,fadeOut:400,timeout:0,showOverlay:true,focusInput:true,applyPlatformOpacityRules:true,onBlock:null,onUnblock:null,quirksmodeOffsetHack:4,blockMsgClass:'blockMsg'};var pageBlock=null;var pageBlockEls=[];function install(el,opts){var full=(el==window);var msg=opts&&opts.message!==undefined?opts.message:undefined;opts=$.extend({},$.blockUI.defaults,opts||{});opts.overlayCSS=$.extend({},$.blockUI.defaults.overlayCSS,opts.overlayCSS||{});var css=$.extend({},$.blockUI.defaults.css,opts.css||{});var themedCSS=$.extend({},$.blockUI.defaults.themedCSS,opts.themedCSS||{});msg=msg===undefined?opts.message:msg;if(full&&pageBlock) +remove(window,{fadeOut:0});if(msg&&typeof msg!='string'&&(msg.parentNode||msg.jquery)){var node=msg.jquery?msg[0]:msg;var data={};$(el).data('blockUI.history',data);data.el=node;data.parent=node.parentNode;data.display=node.style.display;data.position=node.style.position;if(data.parent) +data.parent.removeChild(node);} +$(el).data('blockUI.onUnblock',opts.onUnblock);var z=opts.baseZ;var lyr1=($.browser.msie||opts.forceIframe)?$(''):$('');var lyr2=opts.theme?$(''):$('');var lyr3,s;if(opts.theme&&full){s='';} +else if(opts.theme){s='';} +else if(full){s='';} +else{s='';} +lyr3=$(s);if(msg){if(opts.theme){lyr3.css(themedCSS);lyr3.addClass('ui-widget-content');} +else +lyr3.css(css);} +if(!opts.theme&&(!opts.applyPlatformOpacityRules||!($.browser.mozilla&&/Linux/.test(navigator.platform)))) +lyr2.css(opts.overlayCSS);lyr2.css('position',full?'fixed':'absolute');if($.browser.msie||opts.forceIframe) +lyr1.css('opacity',0.0);var layers=[lyr1,lyr2,lyr3],$par=full?$('body'):$(el);$.each(layers,function(){this.appendTo($par);});if(opts.theme&&opts.draggable&&$.fn.draggable){lyr3.draggable({handle:'.ui-dialog-titlebar',cancel:'li'});} +var expr=setExpr&&(!$.boxModel||$('object,embed',full?null:el).length>0);if(ie6||expr){if(full&&opts.allowBodyStretch&&$.boxModel) +$('html,body').css('height','100%');if((ie6||!$.boxModel)&&!full){var t=sz(el,'borderTopWidth'),l=sz(el,'borderLeftWidth');var fixT=t?'(0 - '+t+')':0;var fixL=l?'(0 - '+l+')':0;} +$.each([lyr1,lyr2,lyr3],function(i,o){var s=o[0].style;s.position='absolute';if(i<2){full?s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'):s.setExpression('height','this.parentNode.offsetHeight + "px"');full?s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'):s.setExpression('width','this.parentNode.offsetWidth + "px"');if(fixL)s.setExpression('left',fixL);if(fixT)s.setExpression('top',fixT);} +else if(opts.centerY){if(full)s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');s.marginTop=0;} +else if(!opts.centerY&&full){var top=(opts.css&&opts.css.top)?parseInt(opts.css.top):0;var expression='((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';s.setExpression('top',expression);}});} +if(msg){if(opts.theme) +lyr3.find('.ui-widget-content').append(msg);else +lyr3.append(msg);if(msg.jquery||msg.nodeType) +$(msg).show();} +if(($.browser.msie||opts.forceIframe)&&opts.showOverlay) +lyr1.show();if(opts.fadeIn){var cb=opts.onBlock?opts.onBlock:noOp;var cb1=(opts.showOverlay&&!msg)?cb:noOp;var cb2=msg?cb:noOp;if(opts.showOverlay) +lyr2._fadeIn(opts.fadeIn,cb1);if(msg) +lyr3._fadeIn(opts.fadeIn,cb2);} +else{if(opts.showOverlay) +lyr2.show();if(msg) +lyr3.show();if(opts.onBlock) +opts.onBlock();} +bind(1,el,opts);if(full){pageBlock=lyr3[0];pageBlockEls=$(':input:enabled:visible',pageBlock);if(opts.focusInput) +setTimeout(focus,20);} +else +center(lyr3[0],opts.centerX,opts.centerY);if(opts.timeout){var to=setTimeout(function(){full?$.unblockUI(opts):$(el).unblock(opts);},opts.timeout);$(el).data('blockUI.timeout',to);}};function remove(el,opts){var full=(el==window);var $el=$(el);var data=$el.data('blockUI.history');var to=$el.data('blockUI.timeout');if(to){clearTimeout(to);$el.removeData('blockUI.timeout');} +opts=$.extend({},$.blockUI.defaults,opts||{});bind(0,el,opts);if(opts.onUnblock===null){opts.onUnblock=$el.data('blockUI.onUnblock');$el.removeData('blockUI.onUnblock');} +var els;if(full) +els=$('body').children().filter('.blockUI').add('body > .blockUI');else +els=$('.blockUI',el);if(full) +pageBlock=pageBlockEls=null;if(opts.fadeOut){els.fadeOut(opts.fadeOut);setTimeout(function(){reset(els,data,opts,el);},opts.fadeOut);} +else +reset(els,data,opts,el);};function reset(els,data,opts,el){els.each(function(i,o){if(this.parentNode) +this.parentNode.removeChild(this);});if(data&&data.el){data.el.style.display=data.display;data.el.style.position=data.position;if(data.parent) +data.parent.appendChild(data.el);$(el).removeData('blockUI.history');} +if(typeof opts.onUnblock=='function') +opts.onUnblock(el,opts);};function bind(b,el,opts){var full=el==window,$el=$(el);if(!b&&(full&&!pageBlock||!full&&!$el.data('blockUI.isBlocked'))) +return;if(!full) +$el.data('blockUI.isBlocked',b);if(!opts.bindEvents||(b&&!opts.showOverlay)) +return;var events='mousedown mouseup keydown keypress';b?$(document).bind(events,opts,handler):$(document).unbind(events,handler);};function handler(e){if(e.keyCode&&e.keyCode==9){if(pageBlock&&e.data.constrainTabKey){var els=pageBlockEls;var fwd=!e.shiftKey&&e.target===els[els.length-1];var back=e.shiftKey&&e.target===els[0];if(fwd||back){setTimeout(function(){focus(back)},10);return false;}}} +var opts=e.data;if($(e.target).parents('div.'+opts.blockMsgClass).length>0) +return true;return $(e.target).parents().children().filter('div.blockUI').length==0;};function focus(back){if(!pageBlockEls) +return;var e=pageBlockEls[back===true?pageBlockEls.length-1:0];if(e) +e.focus();};function center(el,x,y){var p=el.parentNode,s=el.style;var l=((p.offsetWidth-el.offsetWidth)/2)-sz(p,'borderLeftWidth');var t=((p.offsetHeight-el.offsetHeight)/2)-sz(p,'borderTopWidth');if(x)s.left=l>0?(l+'px'):'0';if(y)s.top=t>0?(t+'px'):'0';};function sz(el,p){return parseInt($.css(el,p))||0;};})(jQuery); \ No newline at end of file diff --git a/lang/index.php b/lang/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/lang/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/lang/ru.txt b/lang/ru.txt new file mode 100644 index 0000000..989b8ef --- /dev/null +++ b/lang/ru.txt @@ -0,0 +1,91 @@ + +MODULE_NAME = "Корзина" +MODULE_DESCRIPTION = "Модуль позволяет организовать торговлю любыми товарами с использованием корзины и формы оформления заказа. Разместите системный тег [mod_basket] в нужном месте вашего шаблона сайта или содержимом документа." + + +BASKET_SHOP_NAME = "Мини-магазин AVE.cms" +BASKET_SHOP_LOGO = "logo_bw.png" +BASKET_SHOP_ADDRESS = "МойГород, ул. Ленина, д.1
тел./факс: (111) 555-55-66
Email: info@mysite.ru" + +BASKET_PRODUCT_NAME = "Наименование" +BASKET_PRODUCT_QUANTITY = "Количество" +BASKET_PRODUCT_PRICE = "Цена" +BASKET_PRODUCT_AMOUNT = "Сумма" +BASKET_PRODUCT_DELETE = "Удалить" + +BASKET_ORDER_TITLE = "Уведомление о заказе" +BASKET_ORDER_HEAD = "Обратите внимание этот документ не является официальным счетом.
При получении заказа Вы получите счет который можно будет использовать в финансовой отчетности и документы подтверждающие покупку." +BASKET_ORDER_TOTAL = "Итого" +BASKET_ORDER_DATE = "Дата заказа" +BASKET_ORDER_INFO = "У вас есть вопросы? Обратитесь к нашим менеджерам." +BASKET_ORDER_CHECKOUT = "Оформить" +BASKET_ORDER_SHOW_TIP = "Проверьте список товаров в корзине. При необходимости можете изменить количество товаров в заказе, либо исключить некоторые товары из заказа. Для пересчета суммы заказа используйте кнопку «Обновить». Если список товаров составлен правильно — переходите к заполнению персональной информации по ссылке «Продолжить»." +BASKET_ORDER_FORM_TIP = "Пожалуйста заполните все поля — это поможет нам максимально быстро и точно выполнить Ваш заказ. Если Вы введёте E-mail то получите копию заказа, а так-же будете получать уведомления о этапах выполнения Вашего заказа. В поле «Адрес» укажите адрес доставки и информацию для курьера (станцию метро, номер подъезда, код домофона). Если у Вас есть какие-то дополнительные пожелания относительно заказа — опишите их в поле «Комментарий»." +BASKET_ORDER_SEND_SUCCESS = "Заказ успешно отправлен" + +BASKET_CUSTOMER_INFO = "Информация о заказчике" +BASKET_CUSTOMER_NAME = "Имя" +BASKET_CUSTOMER_EMAIL = "E-mail" +BASKET_CUSTOMER_PHONE = "Телефон" +BASKET_CUSTOMER_ADDRESS = "Адрес" +BASKET_CUSTOMER_DESCRIPTION = "Комментарий" + +BASKET_PROGRESSBAR_STEP1 = "Список товаров" +BASKET_PROGRESSBAR_STEP2 = "Персональная информация" +BASKET_PROGRESSBAR_STEP3 = "Финиш" + +BASKET_TITLE = "Корзина" +BASKET_CURRENCY = "р." +BASKET_UNIT = "шт." +BASKET_UPDATE = "Обновить" +BASKET_NEXT = "Продолжить" +BASKET_SEND = "Отправить" +BASKET_EMPTY = "Корзина пуста" + +[admin] +ModName = "Корзина" +WelcomeText = "Управление модулем Корзина" +mainPage = "Главная страница" + +Yes = "Да" +No = "Нет" +ButtonSave = "Сохранить" +ButtonAdd = "Добавить" +ButtonEdit = "Редактировать" +Actions = "Действия" + +PaymentMethod = "Вид оплаты" +PaymentMethodName = "Наименование оплаты" +PaymentMethodPosition = "Позиция" +PaymentMethodActive = "Активно" +NewPaymentMethod = "Добавить вид оплаты" +PaymentMethodDel = "Удалить" +PaymentMethodEdit = "Редактировать" +PaymentMethodDelTitle = "Вы действительно хотите удалить метод оплаты?" +PaymentCostPercent = "% (Процентов)" +PaymentCostMoney = "Сумма (стоимость)" +PaymentCostText = "Текст (просто)" +AllowedDeliveryMethods = "Совместимые виды доставки" +PaymentPrice = "Стоимость" +PaymentDelivery = "Виды доставки" +PaymentActive = "Активен" +PaymentName = "Наименование" +PaymentDescription = "Описание" +DeliveryMethodInf = "Пожалуйста выберите виды доставки заказа совместимые с видом платежа. Для выбора нескольких видов произведите выбор удерживая нажатой клавишу Ctrl" +EditPaymentMethod = "Редактировать вид платежа" +EditPaymentInfo = "Внимание! При редактировании вида платежа проверте все введеные данные. В случае неверных данных возможны ошибки при оплате товара. Это может привести к потере денежных средств как со стороны клиента так и со сторны администрации сайта." + +DeliveryMethod = "Вид доставки" +DeliveryMethodName = "Наименование доставки" +DeliveryMethodPosition = "Позиция" +DeliveryMethodActive = "Активно" +NewDeliveryMethod = "Добавить вид доставки" +DeliveryMethodDel = "Удалить" +DeliveryMethodEdit = "Редактировать" +DeliveryMethodDelTitle = "Вы действительно хотите удалить метод доставки?" +DeliveryPrice = "Стоимость" +DeliveryName = "Наименование" +DeliveryDescription = "Описание" +DeliveryActive = "Активен" +EditDeliveryMethod = "Редактировать вид доставки" +EditDeliveryInfo = "Внимание! При редактировании вида доставки проверте все введеные данные. В случае неверных данных возможны ошибки при оплате товара. Это может привести к потере денежных средств как со стороны клиента так и со сторны администрации сайта." \ No newline at end of file diff --git a/module.php b/module.php new file mode 100644 index 0000000..f2afe5d --- /dev/null +++ b/module.php @@ -0,0 +1,175 @@ +register_object('oBasket', $oBasket); + + $AVE_Template->config_load(BASE_DIR . '/modules/basket/lang/' . $_SESSION['user_language'] . '.txt'); + + $AVE_Template->display(BASE_DIR . '/modules/basket/templates/basket_show.tpl'); +} + +if (!defined('ACP') && isset($_REQUEST['module']) && $_REQUEST['module'] == 'basket' && !empty($_REQUEST['action'])) +{ + require_once(BASE_DIR . '/modules/basket/class.basket.php'); + + $oBasket = new ModulBasket; + + $AVE_Template->register_object('oBasket', $oBasket); + + $AVE_Template->config_load(BASE_DIR . '/modules/basket/lang/' . $_SESSION['user_language'] . '.txt'); + + switch ($_REQUEST['action']) + { + case 'add': + $p_id = (isset($_REQUEST['p_id'])) ? (int)$_REQUEST['p_id'] : 0; + $p_name = (isset($_REQUEST['p_name'])) ? (int)$_REQUEST['p_name'] : 0; + $p_price = (isset($_REQUEST['p_price'])) ? (int)$_REQUEST['p_price'] : 0; + $p_article = (isset($_REQUEST['p_article'])) ? (int)$_REQUEST['p_article'] : 0; + $p_size = (isset($_REQUEST['p_size'])) ? (int)$_REQUEST['p_size'] : 0; + $quantity = (isset($_REQUEST['quantity'])) ? (int)$_REQUEST['quantity'] : 1; + $oBasket->basketProductAdd($p_id, $p_name, $p_price, $p_article, $p_size, $quantity); + if (empty($_POST['action'])) + { + header("Location:" . get_referer_link()); + } + else + { + $AVE_Template->display(BASE_DIR . '/modules/basket/templates/basket_show.tpl'); + } + exit; + + case 'delete': + $id = (isset($_REQUEST['id'])) ? (int)$_REQUEST['id'] : 0; + $oBasket->basketProductDelete($id); + if (empty($_POST['action'])) + { + header("Location:" . get_referer_link()); + } + else + { + $AVE_Template->display(BASE_DIR . '/modules/basket/templates/basket_show.tpl'); + } + exit; + + case 'order': + unset ($_SESSION['delivery_id']); + unset ($_SESSION['payment_id']); + define('MODULE_SITE', $AVE_Template->get_config_vars('BASKET_TITLE')); + define('MODULE_CONTENT', $AVE_Template->fetch(BASE_DIR . '/modules/basket/templates/order_show.tpl')); + break; + + case 'update': + $product_delete = isset($_REQUEST['product_delete']) ? $_REQUEST['product_delete'] : null; + $product_quantity = isset($_REQUEST['product_quantity']) ? $_REQUEST['product_quantity'] : null; + $delivery_id = isset($_REQUEST['delivery_id']) ? $_REQUEST['delivery_id'] : null; + $payment_id = isset($_REQUEST['payment_id']) ? $_REQUEST['payment_id'] : null; + $oBasket->basketOrderUpdate($product_quantity, $product_delete, $delivery_id, $payment_id); + if (empty($_POST['action'])) + { + header("Location:" . get_referer_link()); + } + else + { + $AVE_Template->display(BASE_DIR . '/modules/basket/templates/order_show.tpl'); + } + exit; + + case 'form': + define('MODULE_SITE', $AVE_Template->get_config_vars('BASKET_TITLE')); + define('MODULE_CONTENT', $AVE_Template->fetch(BASE_DIR . '/modules/basket/templates/order_form.tpl')); + break; + + case 'send': + $oBasket->basketOrderSend(); + define('MODULE_SITE', $AVE_Template->get_config_vars('BASKET_TITLE')); + define('MODULE_CONTENT', $AVE_Template->fetch(BASE_DIR . '/modules/basket/templates/order_finish.tpl')); + unset ($_SESSION['delivery_id']); + unset ($_SESSION['payment_id']); + break; + } +} + +if (defined('ACP') && !empty($_REQUEST['moduleaction'])) + { + + require_once(BASE_DIR . '/modules/basket/class.basket_admin.php'); + + $aBasket = new ModulBasketAdmin; + + $tpl_dir = BASE_DIR . '/modules/basket/templates_admin/'; + $tpl_dir_source = BASE_DIR . '/modules/basket/templates_admin'; + $lang_file = BASE_DIR . '/modules/basket/lang/' . $_SESSION['admin_language'] . '.txt'; + + $AVE_Template->config_load($lang_file, 'admin'); + $config_vars = $AVE_Template->get_config_vars(); + $AVE_Template->assign('config_vars', $config_vars); + $AVE_Template->assign('source', $tpl_dir_source); + + if (!empty($_REQUEST['moduleaction'])) + { + switch ($_REQUEST['moduleaction']) + { + case '1': + $aBasket->basketStart($tpl_dir); + break; + + case 'basket_payment': + $aBasket->basketPaymentMethods($tpl_dir); + break; + + case 'basket_payment_new': + $aBasket->basketNewPaymentMethod(); + break; + + case 'basket_payment_del': + $aBasket->basketDelPaymentMethod($_REQUEST['id']); + break; + + case 'basket_payment_edit': + $aBasket->basketEditPaymentMethod($tpl_dir, $_REQUEST['id']); + break; + + case 'basket_delivery': + $aBasket->basketDeliveryMethods($tpl_dir); + break; + + case 'basket_delivery_new': + $aBasket->basketNewDeliveryMethod(); + break; + + case 'basket_delivery_del': + $aBasket->basketDelDeliveryMethod($_REQUEST['id']); + break; + + case 'basket_delivery_edit': + $aBasket->basketEditDeliveryMethod($tpl_dir, $_REQUEST['id']); + break; + } + } +} +?> \ No newline at end of file diff --git a/sql.php b/sql.php new file mode 100644 index 0000000..a024b47 --- /dev/null +++ b/sql.php @@ -0,0 +1,110 @@ + \ No newline at end of file diff --git a/templates/basket_show.tpl b/templates/basket_show.tpl new file mode 100644 index 0000000..5554478 --- /dev/null +++ b/templates/basket_show.tpl @@ -0,0 +1,15 @@ +{oBasket->getBasket assign='basket'} + +
+

{#BASKET_TITLE#}

+ {if $basket.products} +
+
    + {foreach from=$basket.products item=product}
  • {$product->name} ({$product->quantity}{#BASKET_UNIT#}) - {$product->amount|string_format:"%.2f"}{#BASKET_CURRENCY#}
  • + {/foreach} +
+
+

{#BASKET_ORDER_CHECKOUT#} {#BASKET_ORDER_TOTAL#}: {$basket.total|string_format:"%.2f"}{#BASKET_CURRENCY#} {$basket.quantity}

+
+ {/if} +
\ No newline at end of file diff --git a/templates/index.php b/templates/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/templates/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/templates/mail_text.tpl b/templates/mail_text.tpl new file mode 100644 index 0000000..33f6703 --- /dev/null +++ b/templates/mail_text.tpl @@ -0,0 +1,159 @@ + + + +{#BASKET_SHOP_NAME#} +{literal} + +{/literal} + +{oBasket->getBasket assign='basket'} + + + + + +
+ + + + + +
{#BASKET_SHOP_NAME#}
{#BASKET_SHOP_ADDRESS#}
+ +
+

{#BASKET_ORDER_TITLE#}

+
+ {#BASKET_ORDER_HEAD#} +

+ + + + + + + + + + + + + + + + + + + + + + +{foreach name=product from=$basket.products item=product} + + + + + + + + + +{/foreach} + + + + + +
{#BASKET_PRODUCT_NAME#}{#BASKET_PRODUCT_SIZE#}{#BASKET_PRODUCT_ARTICLE#}{#BASKET_PRODUCT_QUANTITY#}{#BASKET_PRODUCT_PRICE#}{#BASKET_PRODUCT_AMOUNT#}
{$smarty.foreach.product.iteration}{$product->name|truncate:100|escape}{$product->size}{$product->article}{$product->quantity}{#BASKET_UNIT#}{$product->price|string_format:"%.2f"}{#BASKET_CURRENCY#}{$product->amount|string_format:"%.2f"}{#BASKET_CURRENCY#}
{#BASKET_ORDER_TOTAL#} {$basket.total_send|string_format:"%.2f"}{#BASKET_CURRENCY#}
+
+ + + + + + + + + + + + + + +
Вид доставкиСтоимость доставки
{$delivery_method_titel}{if $delivery_method_operands|escape == '%'}{$delivery_method_price}%{elseif $delivery_method_operands|escape == 'Money'}{if $delivery_method_price|escape == 0 || $delivery_method_price=='0.00'}Бесплатно{else}{num_format val=$delivery_method_price|string_format:"%.2f"} руб.{/if}{elseif $delivery_method_operands|escape == 'Text'}{$delivery_method_price|escape}{/if}
+ + + + + + + + + + + + + + +
Вид оплатыСтоимость
{$payment_method_titel}{if $payment_method_operands|escape == '%'}{$payment_method_price}%{elseif $payment_method_operands|escape == 'Money'}{if $payment_method_price|escape == 0 || $payment_method_price=='0.00'}Бесплатно{else}{num_format val=$payment_method_price|string_format:"%.2f"} руб.{/if}{elseif $payment_method_operands|escape == 'Text'}{$payment_method_price|escape}{/if}
+ +
+ + + + +
{#BASKET_ORDER_TOTAL#} - {$basket.total|string_format:"%.2f"}{#BASKET_CURRENCY#}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 {#BASKET_CUSTOMER_INFO#}
{#BASKET_CUSTOMER_NAME#}{$customer.name|escape}
{#BASKET_CUSTOMER_EMAIL#}{$customer.email}
{#BASKET_CUSTOMER_PHONE#}{$customer.phone|escape}
{#BASKET_CUSTOMER_ADDRESS#}{textformat wrap_char='
'}{$customer.address|truncate:1000|escape}{/textformat}
{#BASKET_CUSTOMER_DESCRIPTION#}{textformat wrap_char='
'}{$customer.description|truncate:1000|escape}{/textformat}
 
{#BASKET_ORDER_DATE#}{$smarty.now|date_format:"%d.%m.%Y, %H:%M"}
+ +
+ {#BASKET_ORDER_INFO#}
+
+ {#BASKET_SHOP_NAME#}
+ {#BASKET_SHOP_ADDRESS#} +
+ + + \ No newline at end of file diff --git a/templates/order_finish.tpl b/templates/order_finish.tpl new file mode 100644 index 0000000..3e8484d --- /dev/null +++ b/templates/order_finish.tpl @@ -0,0 +1,13 @@ +
+ + + + + + + + + +
1{#BASKET_PROGRESSBAR_STEP1#}2{#BASKET_PROGRESSBAR_STEP2#}3{#BASKET_PROGRESSBAR_STEP3#}
+

{#BASKET_ORDER_SEND_SUCCESS#}

+
\ No newline at end of file diff --git a/templates/order_form.tpl b/templates/order_form.tpl new file mode 100644 index 0000000..31b74fa --- /dev/null +++ b/templates/order_form.tpl @@ -0,0 +1,97 @@ +{oBasket->getBasket assign='basket'} + +{if $basket.products} +
+ + + + + + + + + + +
1{#BASKET_PROGRESSBAR_STEP1#}2{#BASKET_PROGRESSBAR_STEP2#}3{#BASKET_PROGRESSBAR_STEP3#}
+ +

{#BASKET_ORDER_FORM_TIP#}

+ +
+{* раскомментировать при желании отображать список заказанных товаров + + + + + + + + + + + + + + + + + + + + + + + + + {foreach name=product from=$basket.products item=product} + + + + + + + + + + {/foreach} + + + + + + + +
{#BASKET_PRODUCT_NAME#}{#BASKET_PRODUCT_SIZE#}{#BASKET_PRODUCT_ARTICLE#}{#BASKET_PRODUCT_QUANTITY#}{#BASKET_PRODUCT_PRICE#}{#BASKET_PRODUCT_AMOUNT#}
{$smarty.foreach.product.iteration}{$product->name|escape}{$product->size|escape}{$product->article|escape}{$product->quantity}{$product->price|string_format:"%.2f"}{$product->amount|string_format:"%.2f"}
{$basket.total|string_format:"%.2f"}
+*} +
+

+ + +

+ +

+ + +

+ +

+ + +

+ +

+ + +

+ +

+ + +

+ + +
+
+
+{else} +

{#BASKET_EMPTY#}

+{/if} \ No newline at end of file diff --git a/templates/order_show.tpl b/templates/order_show.tpl new file mode 100644 index 0000000..3155780 --- /dev/null +++ b/templates/order_show.tpl @@ -0,0 +1,213 @@ +{oBasket->getBasket assign='basket'} + +{if $basket.products} +
+ + + + + + + + + + +
1{#BASKET_PROGRESSBAR_STEP1#}2{#BASKET_PROGRESSBAR_STEP2#}3{#BASKET_PROGRESSBAR_STEP3#}
+ +

{#BASKET_ORDER_SHOW_TIP#}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$basket.products item=product} + + + + + + + + + + {/foreach} + +
{#BASKET_PRODUCT_DELETE#}{#BASKET_PRODUCT_NAME#}{#BASKET_PRODUCT_SIZE#}{#BASKET_PRODUCT_ARTICLE#}{#BASKET_PRODUCT_QUANTITY#}{#BASKET_PRODUCT_PRICE#}{#BASKET_PRODUCT_AMOUNT#}
{$product->name|escape}{$product->size|escape}{$product->article|escape}{$product->price|string_format:"%.2f"}{$product->amount|string_format:"%.2f"}
+ +

+ + + + + + + + + + + + + + +{foreach from=$basket.delivery item=delivery} + + + + + + +{/foreach} + +
Пожалуйста, выберите желаемый вид доставки
 Вид доставкиСтоимость доставкиОписание
id|escape==$smarty.session.delivery_id}checked{/if}>{$delivery->delivery_title|escape} + + {if $delivery->delivery_price_operands|escape == '%'}{$delivery->delivery_price}% + + {elseif $delivery->delivery_price_operands|escape == 'Money'} + + {if $delivery->delivery_price|escape == 0 || $delivery->delivery_price=='0.00'}Бесплатно{else}{num_format val=$delivery->delivery_price|string_format:"%.2f"} руб.{/if} + + {elseif $delivery->delivery_price_operands|escape == 'Text'}{$delivery->delivery_price|escape}{/if} + + Подробнее
+ +{if $smarty.session.delivery_id} +

+ + + + + + + + + + + + + +{foreach from=$basket.payment item=payment} + + + + + + +{/foreach} + +
Выбор метода платежа
 Метод оплатыСтоимостьОписание
id|escape==$smarty.session.payment_id}checked{/if}>{$payment->payment_title|escape} + + {if $payment->payment_price_operands|escape == '%'}{$payment->payment_price}% + + {elseif $payment->payment_price_operands|escape == 'Money'} + + {if $payment->payment_price|escape == 0 || $payment->payment_price=='0.00'}Бесплатно{else}{num_format val=$payment->payment_price|string_format:"%.2f"} руб.{/if} + + {elseif $payment->payment_price_operands|escape == 'Text'}{$payment->payment_price|escape}{/if} + + Подробнее
+{/if} + +

+ + + + + + + + + + + + + + +
Итого
+ {$basket.total|string_format:"%.2f"} +
+ +

+ +

+ +{if $smarty.session.delivery_id && $smarty.session.payment_id} +{#BASKET_NEXT#} +{/if} + +
+ +{literal} + +{/literal} + +
+{else} +

{#BASKET_EMPTY#}

+{/if} \ No newline at end of file diff --git a/templates_admin/basket_delivery.tpl b/templates_admin/basket_delivery.tpl new file mode 100644 index 0000000..c3f8c06 --- /dev/null +++ b/templates_admin/basket_delivery.tpl @@ -0,0 +1,79 @@ +
{#DeliveryMethod#}
+ +
+
+ {#WelcomeText#} +
+
+ +
+
+
{#DeliveryMethod#}
+ + +
+ +
+ + + + + + + + + + + + + + + + {foreach from=$methods item=delivery} + + + + + + + + + + {/foreach} + + + + +
{#DeliveryMethodName#}{#DeliveryMethodPosition#}{#DeliveryMethodActive#}{#Actions#}
+
+
+
+
+ delivery_activ=='1'}checked {/if}/>  + delivery_activ=='0'}checked {/if}/> + + + + {if $delivery->id!=1} + + {/if} +
+
+
+ + +
+
+
{#NewDeliveryMethod#}
+
+
+ + + + +
+   +
+
+
+ diff --git a/templates_admin/basket_delivery_edit.tpl b/templates_admin/basket_delivery_edit.tpl new file mode 100644 index 0000000..291d707 --- /dev/null +++ b/templates_admin/basket_delivery_edit.tpl @@ -0,0 +1,56 @@ +
+ +
{#EditDeliveryMethod#}
+ +
+
+ {#EditDeliveryInfo#} +
+
+ +
+
+
{#EditDeliveryMethod#}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
{#DeliveryName#} + +
{#DeliveryDescription#}{$Edi}
{#DeliveryActive#} + delivery_activ=='1'}checked {/if}/>  + delivery_activ=='0'}checked {/if}/> +
{#DeliveryPrice#} + + + +
+ +
+
\ No newline at end of file diff --git a/templates_admin/basket_payment.tpl b/templates_admin/basket_payment.tpl new file mode 100644 index 0000000..ed825a8 --- /dev/null +++ b/templates_admin/basket_payment.tpl @@ -0,0 +1,77 @@ +
{#PaymentMethod#}
+ +
+
+ {#WelcomeText#} +
+
+ +
+
+
{#PaymentMethod#}
+ + +
+ +
+ + + + + + + + + + + + + + + + {foreach from=$methods item=payment} + + + + + + + + + + {/foreach} + + + + +
{#PaymentMethodName#}{#PaymentMethodPosition#}{#PaymentMethodActive#}{#Actions#}
+
+
+
+
+ payment_activ=='1'}checked {/if}/>  + payment_activ=='0'}checked {/if}/> + + + + {if $payment->id!=1} + + {/if} +
+
+
+ +
+
+
{#NewPaymentMethod#}
+
+
+ + + + +
+   +
+
+
\ No newline at end of file diff --git a/templates_admin/basket_payment_edit.tpl b/templates_admin/basket_payment_edit.tpl new file mode 100644 index 0000000..3390075 --- /dev/null +++ b/templates_admin/basket_payment_edit.tpl @@ -0,0 +1,76 @@ +
+ +
{#EditPaymentMethod#}
+ +
+
+ {#EditPaymentInfo#} +
+
+ +
+
+
{#EditDeliveryMethod#}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{#PaymentName#} + +
{#PaymentDescription#}{$Edi}
{#PaymentActive#} + payment_activ=='1'}checked {/if}/>  + payment_activ=='0'}checked {/if}/> +
{#PaymentPrice#} + + +
+ {#AllowedDeliveryMethods#}
+ {#DeliveryMethodInf#} +
+ +
+ + +
+
\ No newline at end of file diff --git a/templates_admin/basket_start.tpl b/templates_admin/basket_start.tpl new file mode 100644 index 0000000..4f9f754 --- /dev/null +++ b/templates_admin/basket_start.tpl @@ -0,0 +1,62 @@ +
{#ModName#}
+ +
+
+ {#WelcomeText#} +
+
+ +
+ +
+ + +
+
+
Вид оплаты
+ +
+ + + + + {foreach from=$payment item=payment} + + + + + {/foreach} + +
{$payment->payment_title|stripslashes}{if $payment->payment_activ=='1'}{else}{/if}
+
+ +
+ + +
+ + +
+
+
{#DeliveryMethod#}
+ +
+ + + + + {foreach from=$delivery item=delivery} + + + + + {/foreach} + +
{$delivery->delivery_title|stripslashes}{if $delivery->delivery_activ=='1'}{else}{/if}
+
+ +
+ +
+ +
\ No newline at end of file