В этой статье я хочу показать, как вы можете легко модифицировать существующий магазин, предлагая загружаемые цифровые товары.

Чего мы на самом деле хотим?

Мы хотим иметь возможность создавать продукты, связанные с цифровыми файлами на сервере. Эти файлы не должны загружаться напрямую. Только клиенты, которые купили продукты, связанные с файлами, должны иметь возможность загружать эти файлы, и это должно быть возможно только в том случае, если они уже заплатили.

После того, как клиент приобрел продукт, он может загрузить файл в любое время в пользовательском разделе.

Предпосылки

Чтобы иметь возможность покрыть потребности, я буду использовать следующие компоненты:

  1. ) серверная часть sleekshop SaaS → https://www.sleekshop.io
  2. ) Экскалибур — интерфейс для sleekshop → https://github.com/sleekshop/excalibur
  3. ) Веб-пространство с FTP-доступом

Прежде всего, нам нужно запустить экскалибур — фреймворк.

Поэтому мы создаем класс для продуктов с именем «продукт». Поля, которые мы должны создать, перечислены в файле /setup/readme.txt пакета excalibur. Поля:

3.1 product / type:PRODUCT
with the following fields, whereas name/type is used. You are free in choosing the label in the corresponding language.
- name/char
- short_description/txt
- description/txt
- price/float
- img1/img
- img2/img
- img3/img
- img4/img
- related_items/products
- vendor/char
- type/char
- tags/txt

После этого создаем класс teaser_pic, который позволяет нам загружать тизеры — картинки для стартовой страницы. Необходимые поля также описаны в файле setup/readme.txt. Вот необходимые поля:

3.5 content / type:CONTENT
with the following fields, whereas name/type is used. You are free in choosing the label in the corresponding language.
- headline/char
- content/txt
- img/img

После этого мы можем загрузить интерфейс экскалибура в веб-пространство. Имейте в виду, что документ — root указывает на каталог /public. Нам также нужно изменить файл /vendor/sleekcommerce/sleekshop_request.inc.php.

Измените константы licence_username и licence_password в начале файла и используйте свои учетные данные. Также измените константу сервера и используйте свою конечную точку API. Вся информация доступна в вашем бэкенде в разделе Администрирование->Настройки->API.

Теперь создайте тестовые — товары и тизер — картинку, тогда ваш тестовый магазин будет выглядеть так: https://sleekshop.io/demoshop/

Добавление файлов

Чтобы добавить необходимую функциональность, вы должны добавить новое поле в свой класс продукта. Мы называем его файлом и его типом CHAR.

После этого вы можете создать каталог, содержащий загружаемые файлы. Важно, чтобы этот каталог был недоступен для публики, поэтому мы создаем следующий каталог: /srv/files, куда мы загружаем наши файлы.

Теперь напишите имена файлов в новом поле «файл» соответствующих продуктов.

Сейчас делаем тест — заказ. После этого вы можете войти в свою учетную запись на веб-интерфейсе и увидеть свои заказы. Вот раздел, в котором мы хотим, чтобы клиент мог загрузить файл, прикрепленный к заказанному им продукту.

Поэтому мы вынуждены расширить список. Это можно сделать в шаблоне: /templates/profile.html

{%extends "page.html"%}
{%block content%}
‹div class="col-md-12›‹br›‹br›‹br›
‹div class="container"›
‹div class="row"›
‹h1›{%trans%}Ваши заказы{%endtrans%}:‹/h1›
‹br›‹ br›
‹/div›
‹div class="col-md-8›

‹table class="table table-striped"›
‹thead›
‹tr›
‹th›#‹/th›
‹th›{%trans%}Дата {%endtrans%}‹/th›
‹th›{%trans%}Платеж{%endtrans%}‹/th›
‹th›{%trans%}Доставка{%endtrans%}‹ /th›
‹th›{%trans%}Статус{%endtrans%}‹/th›
‹th›{%trans%}Ваши файлы{%endtrans%}‹/th›
‹/tr›
‹/thead›
‹tbody›
{% для значения в res%%}
‹tr›
‹td›{{value .order_number}}‹/td›
‹td›{{value.creation_date}}‹/td›
‹td›{{value.payment_state_label}}‹/td›
‹td ›{{value.delivery_state_label}}‹/td›
‹td›{{value.order_state}}‹/td›
‹td›{% для файла в value.cart.contents%}< br /> {%if file.type=="PRODUCT_GR"%}
‹a href="/get-file/{{file.id_product}}/{{value.id}}" target="_blank ”›{{file.name}} / {{file.description|raw}}‹/a›‹br›‹br›
{%endif%}
{%endfor%}
‹/td›
‹/tr›
{%endfor%}
‹/tbody›
‹/table›

‹/div›
‹div class="col-md-4›
{%include "profile_sidebar.html"%}
‹/div›
‹/div›< br /> ‹/div›
{%endblock%}

Как видите, мы добавили файловую колонку со ссылкой на новый маршрут:

/get-file/{{file.id_product}}/{{value.id}}

Этот маршрут должен быть добавлен в index.php. Этот файл находится в каталоге /public:

$app-›get('/get-file/:p/:o', function ($p,$o) use ($app,$language,$menu,$username,$cart) {
$ app-›log-›info("Slim-Skeleton '/' route");
if($username=="") header("Location: /login");
$res=UserCtl ::GetUserOrders(SessionCtl::GetSession());
$hasfile=false;
foreach($res as $order)
{
if($o=$order[ "id"])
{
foreach($order["cart"]["contents"] as $element)
{
if($element["id_product"] ==$p)
{
if($order["payment_state_name"]=="PAYMENT_RECEIVED")
{
$hasfile=true;
}
}
}
}
}
if($hasfile)
{
$product=ShopObjectsCtl::GetProductDetails($p);
$file=$product["атрибуты"]["имя файла"]["значение"];
if($file=="") die("NO_FILE");
}
else {
die(“РАЗРЕШЕНИЕ_ОТКАЗАНО”);
}
$file=”../srv/files/”.$file;
if (file_exists($file )) {
header('Content-Description: File Transfer');
header('Content-Type: ap plication/octet-stream’);
header(‘Content-Disposition: вложение; filename="'.basename($file).'"');
header('Срок действия: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' .size($file));
readfile($file);
exit;
}
});

Давайте поговорим о новом маршруте, который мы добавили. Маршрут получает два аргумента: продукт — id и заказ — id. Сначала мы итерируем пользователя — заказы, и если заказ соответствует отправленному заказу — id, то мы итерируем корзину соответствующего заказа до тех пор, пока продукт — id не совпадет с желаемым идентификатором, который мы отправили.

Мы читаем сведения о продукте через API и читаем значение атрибута файла, который мы создали ранее. Также проверяем заказ — статус платежа соответствует PAYMENT_RECEIVED. Если все условия совпадают, то мы считываем файл из каталога srv/files и отправляем его пользователю.

Вот и все!

Теперь у нас есть интернет-магазин, где мы можем предложить товары, представляющие собой цифровые товары в виде файлов, которые можно скачать после покупки товара.