setono-custom/sylius-pickup-point-plugin-custom

Pickup point plugin for Sylius

Package info

github.com/Nana-asiamah98/SyliusPickupPointPlugin

Type:symfony-bundle

pkg:composer/setono-custom/sylius-pickup-point-plugin-custom

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

v1.0.0-beta.13 2021-04-26 13:19 UTC

Requires

Suggests

Provides

None

Conflicts

Replaces

None

MIT f5f90d98410b0f77512acfebf786d40826d33348

syliussylius-plugin


README

πŸ‘ Latest Version
πŸ‘ Latest Unstable Version
πŸ‘ Software License
πŸ‘ Build Status

Add a <select> that contains pickup points to your select shipping checkout step.

πŸ‘ List of pickup points

Supported providers

  • DAO
  • GLS
  • PostNord
  • Fake provider (for development/playing purposes)

Screenshots

Shop

This is the shipping method step in the checkout process where you can choose a pickup point.

πŸ‘ Screenshot showing checkout select shipping step with pickup points available

On the complete order step in checkout you can see the pickup point you have chosen.

πŸ‘ Screenshot showing checkout complete step with pickup point address

Admin

On the order you can see what pickup point the customer has chosen.

πŸ‘ Screenshot showing admin order shipping page with pickup point address

When you edit shipping method you can associate a pickup point provider to that shipping method.

πŸ‘ Screenshot showing admin shipping method with some pickup point providers

Installation

Step 1: Install and enable plugin

Open a command console, enter your project directory and execute the following command to download the latest stable version of this plugin:

$ composer require setono/sylius-pickup-point-plugin

This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.

Add bundle to your config/bundles.php:

<?php
# config/bundles.php

return [
 // ...
 Setono\SyliusPickupPointPlugin\SetonoSyliusPickupPointPlugin::class => ['all' => true],
 // ...
];

Step 2: Import routing and configs

Import routing

# config/routes/setono_sylius_pickup_point.yaml
setono_sylius_pickup_point_plugin:
 resource: "@SetonoSyliusPickupPointPlugin/Resources/config/routing.yaml"

Import application config

# config/packages/setono_sylius_pickup_point.yaml
imports:
 - { resource: "@SetonoSyliusPickupPointPlugin/Resources/config/app/config.yaml" } 

(Optional) Import fixtures to play in your app

# config/packages/setono_sylius_pickup_point.yaml
imports:
 - { resource: "@SetonoSyliusPickupPointPlugin/Resources/config/app/fixtures.yaml" } 

Step 3: Update templates

Add the following to the admin template SyliusAdminBundle/ShippingMethod/_form.html.twig

{{ form_row(form.pickupPointProvider) }}

See an example here.

Next add the following to the shop template SyliusShopBundle/Checkout/SelectShipping/_shipment.html.twig

{% form_theme form.pickupPointId '@SetonoSyliusPickupPointPlugin/Form/theme.html.twig' %}

{{ form_row(form.pickupPointId) }}

See an example here.

Next add the following to the shop template SyliusShopBundle/Common/Order/_shipments.html.twig after shipment method header:

{% include "@SetonoSyliusPickupPointPlugin/Shop/Label/Shipment/pickupPoint.html.twig" %}

See an example here.

Next add the following to the admin template SyliusAdminBundle/Order/Show/_shipment.html.twig after shipment header:

{% include "@SetonoSyliusPickupPointPlugin/Shop/Label/Shipment/pickupPoint.html.twig" %}

See an example here.

Step 4: Customize resources

Shipment resource

If you haven't extended the shipment resource yet, here is what it should look like:

<?php
// src/Entity/Shipment.php

declare(strict_types=1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Setono\SyliusPickupPointPlugin\Model\PickupPointAwareTrait;
use Setono\SyliusPickupPointPlugin\Model\ShipmentInterface;
use Sylius\Component\Core\Model\Shipment as BaseShipment;

/**
 * @ORM\Entity()
 * @ORM\Table(name="sylius_shipment")
 */
class Shipment extends BaseShipment implements ShipmentInterface
{
 use PickupPointAwareTrait;
}

Shipping method resource

If you haven't extended the shipping method resource yet, here is what it should look like:

<?php
// src/Entity/ShippingMethod.php

declare(strict_types=1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Setono\SyliusPickupPointPlugin\Model\PickupPointProviderAwareTrait;
use Setono\SyliusPickupPointPlugin\Model\ShippingMethodInterface;
use Sylius\Component\Core\Model\ShippingMethod as BaseShippingMethod;

/**
 * @ORM\Entity()
 * @ORM\Table(name="sylius_shipping_method")
 */
class ShippingMethod extends BaseShippingMethod implements ShippingMethodInterface
{
 use PickupPointProviderAwareTrait;
}

You can read about extending resources here.

Update shipping resources config

Next you need to tell Sylius that you will use your own extended resources:

# config/packages/_sylius.yaml

sylius_shipping:
 resources:
 shipment:
 classes:
 model: App\Entity\Shipment
 shipping_method:
 classes:
 model: App\Entity\ShippingMethod

Step 5: Configure plugin

Enable desired providers

Note that:

  • faker provider will not work on prod environment
  • gls provider require setono/gls-webservice-bundle to be installed
  • dao provider require setono/dao-bundle to be installed
  • post_nord provider require setono/post-nord-bundle to be installed
# config/packages/setono_sylius_pickup_point.yaml
setono_sylius_pickup_point:
 providers:
 faker: true
 gls: true
 post_nord: true
 dao: true

If you want to use cache

Cache disabled by default. To enable it, make next configuration:

# config/packages/setono_sylius_pickup_point.yaml
framework:
 cache:
 pools:
 setono_sylius_pickup_point.provider_cache_pool:
 adapter: cache.app

setono_sylius_pickup_point:
 cache:
 enabled: true
 pool: setono_sylius_pickup_point.provider_cache_pool

Step 6: Update database schema

bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate 

Step 7: Update validation groups

Add checkout_select_shipping to sylius.form.type.checkout_select_shipping.validation_groups:

# config/packages/_sylius.yaml

parameters:
 sylius.form.type.checkout_select_shipping.validation_groups: ['sylius', 'checkout_select_shipping']

Step 8: Install assets

bin/console sylius:install:assets 
bin/console sylius:theme:assets:install

Play

To see pickup points list, use next example address at checkout:

Dannebrogsgade 1
9000 Aalborg
DK
HΓ€meentie 1
00350 Helsinki
FI
Vasterhaninge 1
137 94 Stockholm
SE

Note, that providers have their pickup points only at given countries:

So, to play with all 3 providers at once - use DK address.

Troubleshooting

  • At /en_US/checkout/select-shipping step you see No results found at Pickup point id field.

    • Check your browser's developer console and make sure JS scripts loaded correctly. Also make sure setono-pickup-point.js compiled (read as you not forgot to run sylius:install:assets).

    • Make sure content of plugin's src/Resources/views/_javascripts.html.twig actually rendered. If not - probably, you erased {{ sonata_block_render_event('sylius.shop.layout.javascripts') }} from your custom layout.html.twig.

    Also, make sure {{ sonata_block_render_event('sylius.admin.layout.javascripts') }} in place at your admin's layout.html.twig if it was customized.

    • If you're using themes, make sure you executed sylius:theme:assets:install after plugin installation.
  • The service "setono_sylius_pickup_point.registry.provider" has a dependency on a non-existent service "setono_post_nord.http_client".

    You should specify setono_post_nord.http_client configuration or define Buzz\Client\BuzzClientInterface service to use as default http client. See Setono/PostNordBundle#1

    You should add config/packages/buzz.yaml and config/packages/nyholm_psr7.yaml configs.

  • You're facing Pickup point cannot be blank. validation error at /checkout/address step at your application

    Make sure you're followed instructions from Installation step 7.