setono / sylius-variant-link-plugin
Sylius 插件,可实现直接链接到变体
Requires
- php: >=7.4
- psr/link: ^1.0
- sylius/resource-bundle: ^1.6
- symfony/config: ^5.4 || ^6.0
- symfony/dependency-injection: ^5.4 || ^6.0
- symfony/event-dispatcher: ^5.4 || ^6.0
- symfony/http-foundation: ^5.4 || ^6.0
- symfony/http-kernel: ^5.4 || ^6.0
- symfony/routing: ^5.4 || ^6.0
- symfony/web-link: ^5.4 || ^6.0
- twig/twig: ^2.0 || ^3.0
- webmozart/assert: ^1.11
Requires (Dev)
- phpunit/phpunit: ^9.5
- psalm/plugin-phpunit: ^0.18.4
- setono/code-quality-pack: ^2.4
- setono/sylius-behat-pack: ^0.2
- sylius/sylius: ~1.10.14
- symfony/debug-bundle: ^5.4 || ^6.0
- symfony/dotenv: ^5.4 || ^6.0
- symfony/intl: ^5.4 || ^6.0
- symfony/web-profiler-bundle: ^5.4 || ^6.0
- dev-master
- v1.2.1
- v1.2.0
- v1.1.0
- v1.0.0
- v0.2.1
- v0.2.0
- v0.1.4
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1.0
- dev-dependabot/composer/symfony/dotenv-tw-5.4.21
- dev-dependabot/composer/symfony/http-kernel-tw-5.4.21
- dev-dependabot/composer/symfony/web-link-tw-5.4.21
- dev-dependabot/composer/sylius/sylius-tw-1.10
- dev-dependabot/composer/symfony/dependency-injection-tw-5.4.3
- dev-dependabot/github_actions/actions/upload-artifact-3.1.0
- dev-dependabot/github_actions/actions/checkout-3
- dev-dependabot/github_actions/shivammathur/setup-php-2.11.0
This package is auto-updated.
Last update: 2024-09-03 12:38:05 UTC
README
在标准的 Sylius 商店中,无法直接链接到变体。本插件解决了这个问题。
屏幕截图
安装
步骤 1:下载插件
打开命令行,进入项目目录并执行以下命令以下载此包的最新稳定版本
$ composer require setono/sylius-variant-link-plugin
此命令要求您全局安装 Composer,如 Composer 文档的 安装章节 中所述。
步骤 2:启用插件
然后,通过将其添加到项目中 config/bundles.php
文件中注册的插件/包列表中,启用插件
<?php # config/bundles.php return [ // ... Setono\SyliusVariantLinkPlugin\SetonoSyliusVariantLinkPlugin::class => ['all' => true], // ... ];
步骤 3:导入路由
# config/routes/setono_sylius_variant_link.yaml setono_sylius_variant_link: resource: "@SetonoSyliusVariantLinkPlugin/Resources/config/routes.yaml"
步骤 4:安装资产
$ php bin/console assets:install
步骤 5:覆盖产品显示模板
首先,将文件 vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/Resources/views/Product/show.html.twig
复制到 templates/bundles/SyliusShopBundle/Product/show.html.twig
以下是两个执行此操作的命令(仅在尚未覆盖此模板的情况下执行)
$ mkdir -p templates/bundles/SyliusShopBundle/Product $ cp vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/Resources/views/Product/show.html.twig templates/bundles/SyliusShopBundle/Product
在模板中,我们需要三件事
- 包含一个模板
- 包含一个 JavaScript 文件
- 运行一个 JavaScript 函数
1. 包含变体链接模板
在 content
块中添加以下 twig 行: {% include '@SetonoSyliusVariantLinkPlugin/_variantLinks.html.twig' with {'variants': product.variants} %}
2 和 3. 包含 JavaScript 文件并运行函数
在 javascripts
块中追加以下内容
{% include 'SyliusUiBundle::_javascripts.html.twig' with {'path': 'bundles/setonosyliusvariantlinkplugin/js/setono-variant-links.js'} %} <script> $(function() { $(document).variantLinks(); }); </script>
请参阅 此文件 了解这三个更改的示例。
用法
链接到变体
{# @var \Sylius\Component\Product\Model\ProductVariantInterface variant #} {{ setono_variant_path(variant) }} {# Works as Symfonys path() function a returns an absolute path #} {{ setono_variant_url(variant) }} {# Works as Symfonys url() function a returns an absolute url #}
请参阅 示例。
查看产品
如果您有一个具有 slug product-1
的产品,其中有一个代码为 variant-code-1
的变体,则上述 twig 语句将在默认 Sylius 安装中返回 /en_US/products/product-1/variant-code-1
。
所以尝试访问那个 URL,您将看到相应的变体被选中,并且价格是相应变体的正确价格。
输出变体值而不是产品值
在产品显示页面(/en_US/products/slug
)中输出产品代码,但假设您想输出变体代码。那么您只需这样做
{{ (product|sylius_resolve_variant).code }}
如果您想在多个地方做这件事,您当然可以设置产品变体如下
{% set variant = product|sylius_resolve_variant %} {{ variant.code }}
简单易懂!
扩展
我想使用比变体代码更其他的东西作为 URL
假设您有一个拥有服装的商店,您想使用服装的大小作为 URL 来确定变体。您希望得到类似 /en_US/products/product-1/medium
的 URL。
为此,您需要实现两个接口
实现 ProductVariantFromIdentifierResolverInterface
<?php namespace App\Resolver; use Setono\SyliusVariantLinkPlugin\Resolver\ProductVariantFromIdentifierResolverInterface; use Sylius\Component\Core\Model\ProductInterface; use Sylius\Component\Core\Model\ProductVariantInterface; final class ProductVariantFromSizeResolver implements ProductVariantFromIdentifierResolverInterface { public function resolve(ProductInterface $product, string $identifier) : ?ProductVariantInterface { foreach ($product->getVariants() as $variant) { foreach ($variant->getOptionValues() as $optionValue) { if(strtolower($optionValue->getValue()) === $identifier) { return $variant; } } } return null; } }
现在定义服务
<?xml version="1.0" encoding="UTF-8" ?> <container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://symfony.com.cn/schema/dic/services" xsi:schemaLocation="https://symfony.com.cn/schema/dic/services https://symfony.com.cn/schema/dic/services/services-1.0.xsd"> <services> <service id="Setono\SyliusVariantLinkPlugin\Resolver\ProductVariantFromIdentifierResolverInterface" alias="app.resolver.product_variant_from_size"/> <service id="app.resolver.product_variant_from_size" class="App\Resolver\ProductVariantFromSizeResolver"/> </services> </container>
实现 ProductVariantUrlGeneratorInterface
<?php namespace App\UrlGenerator; use Setono\SyliusVariantLinkPlugin\UrlGenerator\ProductVariantUrlGeneratorInterface; use Sylius\Component\Product\Model\ProductVariantInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; final class ProductVariantFromSizeUrlGenerator implements ProductVariantUrlGeneratorInterface { /** @var UrlGeneratorInterface */ private $urlGenerator; public function __construct(UrlGeneratorInterface $urlGenerator) { $this->urlGenerator = $urlGenerator; } public function generate( ProductVariantInterface $productVariant, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH ) : string{ $parameters = array_merge($parameters, [ 'slug' => $productVariant->getProduct()->getSlug(), 'variant_identifier' => $productVariant->getOptionValues()->first()->getCode(), ]); return $this->urlGenerator->generate( 'setono_sylius_variant_link_shop_product_variant_show', $parameters, $referenceType ); } }
现在定义服务
<?xml version="1.0" encoding="UTF-8" ?> <container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://symfony.com.cn/schema/dic/services" xsi:schemaLocation="https://symfony.com.cn/schema/dic/services https://symfony.com.cn/schema/dic/services/services-1.0.xsd"> <services> <service id="Setono\SyliusVariantLinkPlugin\UrlGenerator\ProductVariantUrlGeneratorInterface" alias="app.url_generator.product_variant_from_size"/> <service id="app.url_generator.product_variant_from_size" class="App\UrlGenerator\ProductVariantFromSizeUrlGenerator"/> </services> </container>
注意,如果您使用自动注入,则只需要别名。