Хочу сделать прототип корзины магазина как в этом примере |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Библиотека разработок
|
Документооборот | 76 |
Наука/образование | 30 |
Бухгалтерский учет. Финансы | 63 |
Обработка и хранение данных | 49 |
Решения для бизнеса | 65 |
Игры и развлечения, анализ и тестирование | 5 |
Домашние дела | 10 |
Культура, спорт, здоровье | 6 |
Инструменты для разработчика | 48 |
Конкурс
Разработчикам
Документооборот → Работа с электронной почтой и Интернет
Анатолий Ефимочкин
01.06.06
Обычная практика оформления прайс-листов в Excel для рассылки потенциальным покупателям широко используется всеми фирмами. Однако дальнейшая работа с полученной таблицей весьма примитивна и не отличается от просмотра распечатанного списка товаров и цен, несмотря на то, что Excel является мощным и удобным средством не только для просмотра, но и для подготовки перечня выбранных позиций.
Данная разработка позволяет очень легко дополнять ваш прайс-лист функцией «Корзина» не прибегая к программированию. Не использует макросов, поэтому вы смело можете рассылать прайс-лист вместе с корзиной вашим покупателям.
Вы можете легко изменять количество строк и столбцов корзины. Поэтому корзину можно использовать и для других целей, отбирая записи из списка в произвольном порядке.
Исходный код: доступен
Способ распространения: бесплатно
Korzina_OE.zip
39 КБ
Рейтинг разработки: 4
PC Magazine/RE:
Данная разработка представляет собой документ Excel, при вставке в который дополнительного листа содержащего прайс-лист у пользователя появляется возможность размещать выбранный товар в необходимом количестве в корзину аналогичную применяемым, например в Интернет-магазинах. При наличии даже минимального опыта работы с Excel, во всех необходимых настройках можно разобраться буквально за пару минут и оснастить «корзиной» любой прайс-лист.
Копирование материалов разрешается только при наличии ссылки на сайт offext.ru © 2006–2023
Задача:
Нестандартное применение парсера — автоматическое добавление товаров в корзину поставщика по списку в Экселе с учетом цвета, размера и наличия товара.
Описание:
ВНИМАНИЕ!!! ДЛЯ РАБОТЫ ПАРСЕРА НЕОБХОДИМО СКАЧАТЬ ОБА ФАЙЛА!
Для тех, кто занимается совместными покупками знакома ситуация, когда надо добавить множество товаров в корзину поставщику, при этом не ошибиться с товаром, цветом и размером.
Когда объемы заказов большие и происходят регулярно, целесообразно отдать эту операцию на выполнение парсеру.
Данная настройка проходит по специально подготовленному списку в Эксель. Сначала она находит товар на сайте поставщика (kotikof.ru), потом определяет наличие цвета и нужного размера. Если товар не найден или нет нужного цвета/размера в наличии, то парсер ставит соответствующую метку напротив товарной позиции. Если всё подходит, то отправляется запрос через Internet Explorer на добавление товара в корзину в нужном количестве.
Для анализа наличия подходящего размера и формирования запросов к сайту применяется специально написанный макрос, который автоматически добавляется к файлу при парсинге.
После окончания работы парсера открывается окно Internet Explorer со страницей корзины. Обычно для работы с корзиной требуются учетные данные — логин/пароль, но сайт kotikof поддерживает работу без них.
По аналогии с данной настройкой могут быть написаны настройки для добавления товаров в корзину на других сайтах.
Для приобретения полной версии настройки этого парсера, обращайтесь на почту, с указанием ссылки на эту статью.
kehrypy Пользователь Сообщений: 24 |
Надо что бы с листа Прайс, были выбраны только те позиции, который закажет клиент из столбца Заказ. И перенесены на новую страницу, где будет уже указана суммарная стоимость заказа, и отдельно сумма всех заказанных позиций (это вроде работает, но ещё не доехал до них) Не могу понять в чём косяк, нашёл файл пытался под себя сделать. Запутался. |
Kuzmich Пользователь Сообщений: 7998 |
#2 21.11.2017 09:20:30
А где макрос-то? |
||
kehrypy Пользователь Сообщений: 24 |
только выбранные позиции с листа прайс |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#4 21.11.2017 09:26:12
проще. А теперь откройте файл и найдите там макрос У Вас файл .xlsx — а они не могут хранить макросы. Чтобы макросы сохранились в файле надо сохранять в формате «Книга с поддержкой макросов(.xlsm)» И главное: ознакомьтесь с правилами: сейчас название тема не отражает суть задачи. А значит тема — кандидат как минимум на закрытие. Предложите в новом сообщении название темы, согласно правил. Модераторы придут и изменят. Изменено: The_Prist — 21.11.2017 09:27:07 Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
kehrypy Пользователь Сообщений: 24 |
#5 21.11.2017 09:28:21
Изменено: kehrypy — 21.11.2017 10:56:00 |
||
Kuzmich Пользователь Сообщений: 7998 |
#7 21.11.2017 09:34:18 Можно тему назвать:
|
||||
kehrypy Пользователь Сообщений: 24 |
#8 21.11.2017 09:42:13
там посоветовали обратиться сюда |
||
kehrypy Пользователь Сообщений: 24 |
Kuzmich, в область заказа не попадают выбранное количество позиций с листа прайса. Цена которая стоит должна быть уже суммой этого количества выбранного покупателем:( |
Kuzmich Пользователь Сообщений: 7998 |
#10 21.11.2017 10:04:31
Попробуйте дописать сами в макрос это действие. |
||
kehrypy Пользователь Сообщений: 24 |
А как сделать что бы в столбце заказ было конкретно количество ( тоесть в листе прайс я выбрал эту позицию 1, следующую три, и он показывал в листе заказа что я выбрал три, а чего один) а столб цена был равен количеству одной цены за штуку на количество заказа. не грамотен я маленько в этом, вот и прошу помочь = извините уж за тупость, я пока ещё тут не грамотен Изменено: kehrypy — 21.11.2017 10:56:56 |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
kehrypy, не нужно цитировать без необходимости — кнопка цитирования не для ответа! |
kehrypy Пользователь Сообщений: 24 |
Исправил. Изменено: kehrypy — 21.11.2017 11:39:38 |
Kuzmich Пользователь Сообщений: 7998 |
#14 21.11.2017 11:49:53
У вас на листе Прайс есть столбец Кол-во. Его как учитывать? |
||
kehrypy Пользователь Сообщений: 24 |
Кнопка цитирования не для ответа [МОДЕРАТОР] Его вообще не учитывать. Это для меня инфо. мб и не будет столбца такого |
Kuzmich Пользователь Сообщений: 7998 |
#16 21.11.2017 11:59:28 Добавьте в цикл строки
|
||
kehrypy Пользователь Сообщений: 24 |
Спасибо большое! вроде всё как хотел) буду обращаться как возникнут трудности |
kehrypy Пользователь Сообщений: 24 |
А как сделать что бы строка 4000+ тоже была выбрана при нажатии кнопки заказ? |
Kuzmich Пользователь Сообщений: 7998 |
#19 21.11.2017 15:10:15
Приведите пример
Что за строка? |
||||
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Вместо того, чтобы написать «Строка 4775» прикрепили скрин )) Что он даёт? |
kehrypy Пользователь Сообщений: 24 |
При нажатии кнопки заказа, строки ниже четырёх тысяч не попадают почему то под результат |
Hugo Пользователь Сообщений: 23257 |
Не почему то, а потому что последняя строка определяется по другому столбцу, измените на D или E, смотря какие там обычно файлы. Или определяйте сразу по нескольким столбцам (хоть 10), берите максимальное значение. |
kehrypy Пользователь Сообщений: 24 |
#23 22.11.2017 09:24:10
это где мне поменять? Простите за неграмотность |
||
Kuzmich Пользователь Сообщений: 7998 |
#24 22.11.2017 12:21:57 kehrypy, написал
В коде последняя строка на листе Прайс определяется по столбцу А строкой
Из скрина экрана в сообщении #20 у вас в столбце А нет значений, определяйте |
||||
kehrypy Пользователь Сообщений: 24 |
После нажатия кнопки заказа отображалось что бы количество заказа ещё (теперь понадобилось) Прикрепленные файлы
|
Kuzmich Пользователь Сообщений: 7998 |
#26 12.02.2018 18:00:25
|
||||
kehrypy Пользователь Сообщений: 24 |
#27 13.02.2018 07:36:09 Спасибо, помог Ваш макрос, ещё там добавил что бы строка заказа была указана
Изменено: kehrypy — 13.02.2018 09:24:49 |
||
kehrypy Пользователь Сообщений: 24 |
А как ещё сделать итоговую сумму всех этих товаров на листе заказа? Следуя из количества и цены Изменено: kehrypy — 13.02.2018 09:46:13 |
Добрый день! С помощью обычной Сводной таблицы (PivotTable) и 2-ч мааааленьких макросов. Изменено: Михаил Лебедев — 13.02.2018 09:56:07 Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/ |
|
kehrypy Пользователь Сообщений: 24 |
#30 13.02.2018 10:15:52 С помощью сводной таблицы у Вас сумма по цене не сходится, а в макросе сразу вписать что бы расчёт был не выйдет? |
06.07.2019
Добавление товаров в корзину из Excel прайса
Представьте что Вам необходимо работать с оптовыми продажами. Или же сайт специализируется на дешевых товарах, которые пользователь будет покупать в больших количествах.
Вы столкнетесь с проблемой, когда для добавления сотни товаров в корзину нужно будет тратить довольно много времени.
В этом случае Вам может помочь добавление товаров в корзину из excel файла.
Основная идея в том, чтобы дать скачать пользователю прайс с товарами, в котором будет проставлено необходимое количество товара для покупки.
После этого пользователь загружает такой прайс обратно на сайт, и скрипт добавляет товары из прайса в корзину.
Я реализовал это в виде компонента gricuk:basket.from.file. Дальше приведу код:
class.php
<?php
use BitrixMainApplication;
use BitrixMainLoader;
use BitrixSale;
use BitrixMainSystemException;
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
class BasketFromFile extends CBitrixComponent
{
public function onPrepareComponentParams($arParams)
{
BitrixMainLoader::includeModule("iblock");
BitrixMainLoader::includeModule("catalog");
BitrixMainLoader::includeModule("sale");
return $arParams;
}
public function executeComponent()
{
$request = Application::getInstance()->getContext()->getRequest();
$this->arResult["ACTION"] = $request->get("action");
if ($this->arResult["ACTION"] == "download") {
$this->downloadPriceForCurrentUser();
}
if ($this->arResult["ACTION"] == "addToBasket") {
$this->addFromFile();
}
$this->includeComponentTemplate();
}
public function addFromFile()
{
global $USER;
$dbProducts = BitrixCatalogProductTable::getList([
"select" => [
"NAME" => "IBLOCK_ELEMENT.NAME",
"*"
],
"filter" => [
"IBLOCK_ELEMENT.ACTIVE" => "Y"
],
]);
$existProducts = [];
foreach ($dbProducts as $product) {
$existProducts[$product["ID"]] = $product;
}
$resultArray = [["#", "Категория", "Название", "Доступно, шт", "Цена, руб", "Количество"]];
try {
$inputFileName = $_FILES["excelFile"]["tmp_name"];
$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$spreadsheet = $reader->load($inputFileName);
$worksheet = $spreadsheet->getActiveSheet();
$products = [];
foreach ($worksheet->getRowIterator() as $row) {
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
$cells = [];
foreach ($cellIterator as $cell) {
$cells[] = $cell->getValue();
}
if (intval($cells[5]) > 0) {
$products[] = [
"ID" => $cells[0],
"QUANTITY" => $cells[5],
];
}
}
unset($products[0]);
CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID());
foreach ($products as $product) {
if (isset($existProducts[$product["ID"]])) {
$addResult = $this->addProductToBasket($product["ID"], $product["QUANTITY"]);
if (!$addResult->isSuccess()) {
$this->arResult["ERRORS"][] = $addResult->getErrorMessages();
}
}
}
} catch (Exception $e) {
$this->arResult["ERRORS"][] = $e->getMessage();
}
}
public function addProductToBasket($productId, $quantity)
{
BitrixMainLoader::includeModule("catalog");
$product = BitrixCatalogProductTable::getById($productId)->fetch();
$productToAdd = [
"PRODUCT_ID" => $productId
];
if ($product["TYPE"] == BitrixCatalogProductTable::TYPE_OFFER) {
$parentProduct = CCatalogSku::GetProductInfo($productId);
$productProperties = CIBlockPriceTools::GetOfferProperties(
$productId,
$parentProduct["IBLOCK_ID"],
[
"VOLUME"
],
[]
);
if (!empty($productProperties)) {
$productToAdd["PROPS"] = $productProperties;
}
}
return BitrixCatalogProductBasket::addProduct(
$productToAdd,
[
"QUANTITY" => $quantity
]
);
}
public function downloadPriceForCurrentUser()
{
global $USER;
$dbProducts = BitrixCatalogProductTable::getList([
"select" => [
"NAME" => "IBLOCK_ELEMENT.NAME",
"SECTION_ID" => "IBLOCK_ELEMENT.IBLOCK_SECTION_ID",
"SECTION_NAME" => "IBLOCK_ELEMENT.IBLOCK_SECTION.NAME",
"*"
],
"filter" => [
"IBLOCK_ELEMENT.ACTIVE" => "Y",
"IBLOCK_ELEMENT.IBLOCK_ID" => [
GricukMainConf::ID_IBLOCK_CATALOG,
GricukMainConf::ID_IBLOCK_OFFERS,
],
[
"LOGIC" => "OR",
[
"!TYPE" => BitrixCatalogProductTable::TYPE_SKU,
">QUANTITY" => 0,
],
[
"TYPE" => BitrixCatalogProductTable::TYPE_SKU,
]
]
],
"order" => [
"IBLOCK_ELEMENT.IBLOCK_SECTION.LEFT_MARGIN",
"IBLOCK_ELEMENT.SORT",
"IBLOCK_ELEMENT.ID",
]
]);
$products = [];
$skuProducts = [];
foreach ($dbProducts as $product) {
if ($product["TYPE"] != BitrixCatalogProductTable::TYPE_SKU) {
$product["PRICE"] = CCatalogProduct::GetOptimalPrice($product["ID"]);
} else {
$skuProducts[$product["ID"]] = $product["ID"];
}
$products[$product["ID"]] = $product;
}
$skuOffersMap = CCatalogSku::getOffersList(array_keys($skuProducts));
foreach ($skuOffersMap as $skuId => $offers) {
foreach ($offers as $offerId => $offer) {
if (isset($products[$skuId]) && isset($products[$offerId])) {
$products[$skuId]["OFFERS"][$offerId] = $products[$offerId];
unset($products[$offerId]);
}
}
}
$resultArray = [["#", "Категория", "Название", "Доступно, шт", "Цена, руб", "Количество"]];
foreach ($products as $product) {
if ($product["TYPE"] == BitrixCatalogProductTable::TYPE_OFFER) {
continue;
}
if ($product["TYPE"] != BitrixCatalogProductTable::TYPE_SKU) {
$resultArray[] = [
$product["ID"],
$product["SECTION_NAME"],
$product["NAME"],
$product["QUANTITY"],
$product["PRICE"]["RESULT_PRICE"]["DISCOUNT_PRICE"],
""
];
}
if (isset($product["OFFERS"])) {
foreach ($product["OFFERS"] as $offer) {
$resultArray[] = [
$offer["ID"],
$product["SECTION_NAME"],
$offer["NAME"],
$offer["QUANTITY"],
$offer["PRICE"]["RESULT_PRICE"]["DISCOUNT_PRICE"],
""
];
}
}
}
$spreadsheet = new PhpOfficePhpSpreadsheetSpreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->fromArray($resultArray);
$sheet->getColumnDimension('A')->setWidth(10);//#
$sheet->getColumnDimension('B')->setWidth(35);//Категория
$sheet->getColumnDimension('C')->setWidth(62);//Название
$sheet->getColumnDimension('D')->setWidth(14);//Доступно, шт
$sheet->getColumnDimension('E')->setWidth(14);//Цена, руб
$sheet->getColumnDimension('F')->setWidth(14);//Количество
$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$filePath = BitrixMainApplication::getDocumentRoot() . "/upload/tmp/price-{$USER->GetID()}.xlsx";
$writer->save($filePath);
GricukUtilsHelpers::file_force_download($filePath);
die();
}
}
template.php
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);
?>
<div class="row">
<div class="col-sm-12">
Для того чтобы добавить товары в корзину с помощью Excell прайса необходимо:
<ul>
<li>Скачать пример прайса, нажав кнопку <b>"Скачать шаблон"</b></li>
<li>В полученном xlsx файле ввести необходимое количество товара в колонку <b>"Количество"</b></li>
<li>Сохранить файл</li>
<li>На данной странице нажать кнопку <b>"Выберите файл"</b>. В открывшемся окне, указать файл, который был
ранее сохранен
</li>
<li>На странице сайта нажать на кноку <b>"Добавить в корзину"</b></li>
</ul>
<h4><b>Внимание!</b> Цены в файле не окончательные! При добавлении в корзину они могут измениться.</h4>
<h4><b>Внимание!</b> Всё что уже есть в корзине будет удалено!</h4>
</div>
<div class="col-sm-12">
<form action="<?= POST_FORM_ACTION_URI ?>" method="POST" enctype="multipart/form-data">
<input type="hidden" name="action" value="addToBasket">
<div class="form-group">
<label for="excel-price">Файл Excel</label>
<input type="file" id="excel-price" class="form-control" name="excelFile" required>
</div>
<div class="form-group">
<a href="?action=download" class="btn btn-link">Скачать шаблон</a>
<button class="btn btn-default">Добавить в корзину</button>
</div>
</form>
</div>
<? if ($arResult["ACTION"] == "addToBasket" && empty($arResult["ERRORS"])): ?>
<div class="col-sm-12">
<?
ShowMessage(["MESSAGE" => "Товары из файла успешно добавлены в корзину", "TYPE" => "OK"]);
?>
</div>
<? endif ?>
<? if ($arResult["ERRORS"]): ?>
<div class="col-sm-12">
<?
foreach ($arResult["ERRORS"] as $error) {
ShowError($error);
}
?>
</div>
<? endif ?>
</div>
Шаблон выполнен без нормального внешнего вида, так как в моем случае компонент используют менеджеры со стороны сайта. Поэтому не было каких то требований к его оформлению.
На сайте выглядит как то так:
Теперь о коде компонента. Как можно увидеть, в нем для работы с Excel используется библиотека PhpSpreadsheet’s ,
поэтому ее надо будет скачать и подключить на сайт.
Код класса можно разделить на 2 части. 1я — формирует прайс для текущего пользователя (метод downloadPriceForCurrentUser). 2я — добавляет товары в корзину из загруженного файла (методы addFromFile и addProductToBasket).
Особое внимание стоит уделить строке в методе addProductToBasket со следующим кодом:
$productProperties = CIBlockPriceTools::GetOfferProperties(
$productId,
$parentProduct["IBLOCK_ID"],
[
"VOLUME"
],
[]
);
В качестве 3 параметра идет массив с символьными кодами свойств торговых предложений, которые необходимо добавлять в корзину. В моем случае это объем.
В конце можно увидеть вызов GricukUtilsHelpers::file_force_download($filePath);, подробнее об этом можно почитать в статье Принудительная загрузка файла