comsa / sulu-shopping-cart

安装: 237

依赖项: 0

建议者: 0

安全: 0

星标: 1

分支: 0

类型:symfony-bundle

4.3.1 2022-04-14 09:12 UTC

README

composer req comsa/sulu-shopping-cart

添加到 assets/admin/package.json

"sulu-shopping-cart-bundle": "file:node_modules/@sulu/vendor/comsa/sulu-shopping-cart/Resources/js"

运行 npm install

添加到 assets/admin/app.js

import 'sulu-shopping-cart-bundle/admin'

并使用 npm run build 进行构建,这可能需要一段时间 :)

设置前端 js:添加到 package.json

"sulu-shopping-cart-bundle": "file:../../vendor/comsa/sulu-shopping-cart/Resources/js"

添加到 index.js

import 'sulu-shopping-cart-bundle/website';

并使用 npm run build 进行构建或在使用开发环境时使用 npm run dev

将路由添加到 routes_admin.yamlroutes_website.yaml

在:config/packages/doctrine.yaml

doctrine:
  orm:
    mappings:
      SuluShoppingCartBundle:
        is_bundle: true
        type: attribute
        dir: '/Entity'
        prefix: 'Comsa\SuluShoppingCart\Entity'
        alias: SuluShoppingCart

在:config/routes_admin.yaml

sulu_shopping_cart_admin:
  type: rest
  resource: "@SuluShoppingCartBundle/Resources/config/routes/admin.yaml"
  prefix: /admin/api
sulu_shopping_cart_admin_controller:
  resource: "@SuluShoppingCartBundle/Resources/config/routes/adminController.yaml"

在:config/routes_website.yaml

sulu_shopping_cart_website:
  resource: "@SuluShoppingCartBundle/Resources/config/routes/website.yaml"

默认配置

根据您的需求进行调整

parameters:
  #Configure the correct value in the .env file
  comsa_sulu_shopping_mollie_api_key: '%env(COMSA_SC_MOLLIE_API_KEY)%'
Make sure your product template is called "comsa_product".
<property name="product" type="single_product_selection">
    <meta>
        <title lang="en">Product</title>
        <title lang="nl">Product</title>
    </meta>
</property>

将以下内容添加到您的产品模板中,这将渲染添加到购物车部分

{{ render(controller('Comsa\\SuluShoppingCart\\Controller\\CartController::addToCart', {'uuid': id})) }}

要将购物车添加到某个位置,请使用以下内容,您可以从自己的模板中覆盖此模板

{% include '@SuluShoppingCart/cart-small.html.twig' %}

扩展实体

在 src/entity 中创建 CartItem.php 类

<?php

declare(strict_types=1);

namespace App\Entity;

use Comsa\SuluShoppingCart\Entity\CartItem as BaseCartItem;
use Doctrine\ORM\Mapping\Entity;

#[Entity()]
class CartItem extends BaseCartItem
{

}

在 src/entity 中创建 Order.php

<?php


namespace App\Entity;

use Comsa\SuluShoppingCart\Entity\Order as BaseOrder;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Order extends BaseOrder
{

}

在这里您可以定义自定义属性。
例如

<?php


namespace App\Entity;

use Comsa\SuluShoppingCart\Entity\CartItem as BaseCartItem;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class CartItem extends BaseCartItem
{
      /**
     * @ORM\Column(type="text", length=6000, nullable=true)
     */
    private $accessoryText;

    public function getAccessoryText(): ?string
    {
        return $this->accessoryText;
    }

    public function setAccessoryText(?string $accessoryText)
    {
        $this->accessoryText = $accessoryText;
    }
}

请确保遵循 Symfony 编码标准,并且命名空间与上面所示正确。

扩展实体后,更新您的数据库

php bin/console doctrine:schema:update -f

扩展表单

通过扩展表单扩展基本表单的自定义属性。

例如

<?php

namespace App\Form\Extension;


use Comsa\SuluShoppingCart\Form\AddToCartType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class AddToCartTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
       $builder->add("accessoryText", TextType::class);
    }

    public static function getExtendedTypes(): iterable
    {
        return [
          AddToCartType::class
        ];
    }
}

请确保命名空间与上面所示正确。

加载设置

要配置支付方法和运输方法,需要加载设置。

将以下内容复制并粘贴到 AppFixtures.php 中,位于 App/DataFixtures

<?php

namespace App\DataFixtures;

use Comsa\SuluShoppingCart\DataFixtures\AppSeed;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;

class AppFixtures extends Fixture implements DependentFixtureInterface
{
    public function load(ObjectManager $manager)
    {

    }

    public function getDependencies(): array
    {
        return [
            AppSeed::class
        ];
    }
}

运行以下命令以加载设置

php bin/console doctrine:fixtures:load --append

请确保它们根据您的需求正确配置。

翻译

扩展属性将自动在订单摘要中渲染。

翻译可以在应用根目录中的 translations/sulu 文件夹内进行。文件名应为 admin.{locale}.yaml

例如

properties:
  accessoryText: "Tekst op kaart"

请确保将所有自定义属性输入到上面所示 properties 命名空间下。

模板(可选)

产品概述 XML

<?xml version="1.0" ?>
<type name="product_overview" xmlns="http://schemas.sulu.io/template/template"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xsi:schemaLocation="http://schemas.sulu.io/template/template http://schemas.sulu.io/template/template-1.0.xsd">
    <meta>
        <title lang="en">Product Overview</title>
        <title lang="nl">Product Overzicht</title>
    </meta>
    <properties>
        <property name="products" type="smart_content">
            <meta>
                <title lang="en">Products</title>
                <title lang="nl">Producten</title>
            </meta>

            <params>
                <param name="provider" value="pages"/>
                <param name="max_per_page" value="16"/>
                <param name="page_parameter" value="page"/>
                <param name="properties" type="collection">
                    <param name="title" value="title"/>
                    <param name="text" value="text"/>
                    <param name="product" value="product"/>
                    <param name="images" value="images"/>
                    <param name="rating" value="rating"/>
                    <param name="description" value="description"/>
                    <param name="imageFormat" value="imageFormat"/>
                    <param name="location" value="location"/>
                    <param name="sold" value="sold"/>
                    <param name="licence" value="licence"/>
                    <param name="price" value="price"/>
                    <param name="btntext" value="btntext"/>
                    <param name="status" value="status"/>
                </param>
            </params>
        </property>
    </properties>
</type>

产品概述 TWIG

<section class="product-overview">
  <div class="row gx-5">
    {% for page in block.products %}
      {% set product = page.product %}
      {% if product.thumbnail %}
        {% set thumbnail = sulu_resolve_media(product.thumbnail, app.request.locale) %}
      {% else %}
        {% set thumbnail = false %}
      {% endif %}
      <article class="col-12 col-sm-6 col-xl-3">
        <div class="card mx-auto my-2">
          <div class="image-wrapper">
            {% if thumbnail %}
              <img src="{{ thumbnail.formats['x380_default'] }}" class="card-img-top" alt="{{ product.title }}" title="{{ product.title }}">
            {% else %}
              <p>{{ 'comsa_sulu_shopping_cart.no_thumbnail'|trans }}</p>
            {% endif %}
          </div>
          <div class="card-body">
            <h5 class="card-title">{{ product.title }}</h5>
            <h6 class="card-title">€{{ product.price|number_format(2) }}</h6>
            <a href="{{ sulu_content_path(page.url) }}" class="btn btn-primary">Bekijk product</a>
          </div>
        </div>
      </article>
    {% endfor %}
    {% if pagination is defined and pagination == true %}
      <nav class="mt-3" aria-label="{{ 'label.paginering'|trans|capitalize }} ">
        {% set page = viewLink.page %}
        <ul class="pagination {% if page -1 < 1 %} justify-content-end {% endif %}">
          {% if page-1 >= 1 %}
            <li class="page-item">
              <a class="page-link" href="{{ sulu_content_path(content.url) }}?page={{ page-1 }}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
                <span>{{ 'label.previous'|trans|capitalize }}</span>
              </a>
            </li>
          {% endif %}

          {% if viewLink.hasNextPage %}
            <li class="page-item">
              <a class="page-link" href="{{ sulu_content_path(content.url) }}?page={{ page+1 }}" aria-label="Next">
                <span>{{ 'label.next'|trans|capitalize }}</span>
                <span aria-hidden="true">&raquo;</span>
              </a>
            </li>
          {% endif %}
        </ul>
      </nav>
    {% endif %}

  </div>
</section>

产品页面 HTML

{% extends "base.html.twig" %}

{% block content %}
  {% set product = content.product %}
  <div class="product-details-wrapper">
    <div class="container">
      <div class="row py-5">
        {% if product.thumbnail %}
          <div class="col-md-6">
            {% set thumbnail = sulu_resolve_media(product.thumbnail, app.request.locale) %}
            <div class="product-thumbnail-wrapper">
              <img class="product-thumbnail" src="{{ thumbnail.formats['default'] }}" alt="{{ product.title }}"
                   title="{{ product.title }}">
            </div>
          </div>
        {% else %}
          <div class="col-md-6">
            <div class="product-thumbnail-wrapper img-thumbnail d-flex align-items-center justify-content-center">
              <p>Geen foto beschikbaar</p>
            </div>
          </div>
        {% endif %}

        <div class="col-md-6 mt-3 d-flex">
          <div class="mx-auto product-info">
            <h1>{{ product.title }}</h1>
            {% if product.code %}
              <p class="text-muted " style="font-size: 0.8rem;"> {{ 'comsa_sulu_shopping_cart.code'|trans }}
                : {{ product.code }}</p>
            {% endif %}

            {% if product.description %}
              {{ product.description|raw }}
            {% else %}
              {{ 'comsa_sulu_shopping_cart.no_description'|trans }}
            {% endif %}

            <div class="products">
              <p class="price">
                <span>€{{ product.price|number_format(2) }}</span>
              </p>
            </div>

            {% if product.followStock %}
              {% if product.stock > 0 %}
                {{ render(controller('Comsa\\SuluShoppingCart\\Controller\\CartController::addToCart', {'uuid': id})) }}
              {% else %}
                <div class="alert alert-danger" role="alert">
                  {{ 'comsa_sulu_shopping_cart.not_available'|trans }}
                </div>
              {% endif %}
            {% else %}
              {{ render(controller('Comsa\\SuluShoppingCart\\Controller\\CartController::addToCart', {'uuid': id})) }}
            {% endif %}
          </div>
        </div>
        {% include 'blocks/all.html.twig' with { 'blocks': content.extendedBlocks } %}
      </div>
    </div>
  </div>
{% endblock %}

导入产品

可以使用以下命令导入产品

comsa:shopping:import-products <inputfile> <parent-page-id> <webspace-key> <locale>

参数表示以下内容

<tr>
    <th>Argument</th>
    <th>Explanation</th>
    <th>Requirements</th>
</tr>
<tr>
    <td>Inputfile</td>
    <td>The file that is being used to import the products.</td>
    <td>Check chapter "Inputfile Requirements"</td>
</tr>
<tr>
    <td>Parent Page Id</td>
    <td>Uuid of the page where the import will run. All categories will have this page as parent.</td>
    <td>/</td>
</tr>
<tr>
    <td>Webspace key</td>
    <td>Key of the webspace where the pages must bee made</td>
    <td>/</td>
</tr>
<tr>
    <td>Locale</td>
    <td>For which locale must the pages be made?</td>
    <td>/</td>
</tr>

输入文件要求

  • 文件必须是一个 Xlsx 文件。
  • 输入文件参数必须包含文件的完整路径(例如。public/uploads/files/products.xlsx)。
  • 产品必须从第二行开始。
  • 文件必须具有以下结构
  • A B C D E F G H
    1 产品代码 类别 标题 描述 价格 单位 跟踪库存 库存
    2 PRODUCTS START

输入文件字段要求

字段 必需 要求
产品代码 False 最大长度:255
类别 True /
标题 True 最大长度:255
描述 False 最大长度:65534
价格 True 必须以欧元表示(例如。€22,70)
单位 True 必须
  • kg
  • 每个
跟踪库存 True 必须是 "是" 或 "否"
库存 False 只有整数