spryker-demo/merchant-review-feature

Merchant review [feature]

1.0.0 2025-04-09 16:09 UTC

This package is auto-updated.

Last update: 2025-05-22 16:54:49 UTC


README

Minimum PHP Version

Merchant Review Feature

Installation

Install feature

composer require spryker-demo/merchant-review-feature

Add SprykerDemo namespace to configuration

$config[KernelConstants::CORE_NAMESPACES] = [
    'SprykerDemo',
    ...
];

Build transfers

console transfer:generate

Wire route provider plugin

# src/Pyz/Yves/Router/RouterDependencyProvider.php

use SprykerDemo\Yves\MerchantReviewWidget\Plugin\Router\MerchantReviewWidgetRouteProviderPlugin;

// ...

public function getRouteProvider(): array
{
    return [
        // ...
        new MerchantReviewWidgetRouteProviderPlugin(),
    ];
});

Wire merchant review widget

# src/Pyz/Yves/ShopApplication/ShopApplicationDependencyProvider.php

use SprykerDemo\Yves\MerchantReviewWidget\Widget\MerchantReviewWidget;

// ...

protected function getGlobalWidgets(): array
{
    return [
        // ...
        MerchantReviewWidget::class,
    ];
});

Apply Twig customization

# src/Pyz/Yves/MerchantProfileWidget/Theme/default/components/molecules/merchant-profile/merchant-profile.twig

{% block body %}
    <div class="grid grid--gap">
        {{ block('contentInner') }}
    </div>

    {% widget 'MerchantReviewWidget' args [data.idMerchant] only %}{% endwidget %}

    {{ block('additional') }}
{% endblock %}

Wire search plugins

# src/Pyz/Client/MerchantReviewSearch/MerchantReviewSearchDependencyProvider.php

use Spryker\Client\SearchElasticsearch\Plugin\QueryExpander\PaginatedQueryExpanderPlugin;
use Spryker\Client\SearchElasticsearch\Plugin\ResultFormatter\PaginatedResultFormatterPlugin;
use SprykerDemo\Client\MerchantReviewSearch\Plugin\Elasticsearch\QueryExpander\RatingAggregationQueryExpanderPlugin;
use SprykerDemo\Client\MerchantReviewSearch\Plugin\Elasticsearch\QueryExpander\SortByCreatedAtQueryExpanderPlugin;
use SprykerDemo\Client\MerchantReviewSearch\Plugin\Elasticsearch\ResultFormatter\MerchantReviewsResultFormatterPlugin;
use SprykerDemo\Client\MerchantReviewSearch\Plugin\Elasticsearch\ResultFormatter\RatingAggregationResultFormatterPlugin;
// ...

    /**
     * @return array<\Spryker\Client\SearchExtension\Dependency\Plugin\QueryExpanderPluginInterface>
     */
    public function getMerchantReviewsQueryExpanderPlugins(): EventSubscriberCollectionInterface
    {
        return [
                // ...
                new PaginatedQueryExpanderPlugin(),
                new RatingAggregationQueryExpanderPlugin(),
                new SortByCreatedAtQueryExpanderPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Client\SearchExtension\Dependency\Plugin\ResultFormatterPluginInterface>
     */
    public function getMerchantReviewsSearchResultFormatterPlugins(): array
    {
        return [
                // ...
                new MerchantReviewsResultFormatterPlugin(),
                new PaginatedResultFormatterPlugin(),
                new RatingAggregationResultFormatterPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Client\SearchExtension\Dependency\Plugin\QueryExpanderPluginInterface>
     */
    protected function getMerchantRatingAggregationQueryExpanderPlugins(): array
    {
        return [
            new LocalizedQueryExpanderPlugin(),
            new RatingAggregationQueryExpanderPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Client\SearchExtension\Dependency\Plugin\ResultFormatterPluginInterface>
     */
    protected function getMerchantRatingAggregationResultFormatterPlugins(): array
    {
        return [
            new RatingAggregationResultFormatterPlugin(),
        ];
    }

Wire publisher plugins

# src/Pyz/Zed/Publisher/PublisherDependencyProvider.php

use SprykerDemo\Zed\MerchantReviewSearch\Communication\Plugin\Publisher\MerchantReviewSearchDeletePublisherPlugin;
use SprykerDemo\Zed\MerchantReviewSearch\Communication\Plugin\Publisher\MerchantReviewSearchPublisherTriggerPlugin;
use SprykerDemo\Zed\MerchantReviewSearch\Communication\Plugin\Publisher\MerchantReviewSearchWritePublisherPlugin;

// ...

protected function getPublisherTriggerPlugins(): array
{
    return [
        // ...
        new MerchantReviewSearchPublisherTriggerPlugin(),
    ];
}

protected function getPublisherPlugins(): array
{
    return [
        // ...
        new MerchantReviewSearchDeletePublisherPlugin(),
        new MerchantReviewSearchWritePublisherPlugin(),
    ];
}

Wire queue plugins

# src/Pyz/Zed/Queue/QueueDependencyProvider.php

use SprykerDemo\Shared\MerchantReviewSearch\MerchantReviewSearchConfig;
// ...

protected function getProcessorMessagePlugins(Container $container): array
{
    return [
        // ...
        MerchantReviewSearchConfig::MERCHANT_REVIEW_SYNC_SEARCH_QUEUE => new SynchronizationSearchQueueMessageProcessorPlugin(),
    ];
}

Configure ACL

# src/Pyz/Zed/AclMerchantPortal/AclMerchantPortalDependencyProvider.php

use SprykerDemo\Zed\MerchantReviewMerchantPortalGui\Communication\Plugin\AclMerchantPortal\MerchantReviewAclEntityConfigurationExpanderPlugin;
use SprykerDemo\Zed\MerchantReviewMerchantPortalGui\Communication\Plugin\AclMerchantPortal\MerchantReviewMerchantPortalGuiMerchantAclRuleExpanderPlugin;

// ...

protected function getAclEntityConfigurationExpanderPlugins(): array
{
    return [
        // ...
        new MerchantReviewAclEntityConfigurationExpanderPlugin(),
    ];
}

protected function getMerchantAclRuleExpanderPlugins(): array
{
    return [
        // ...
        new MerchantReviewMerchantPortalGuiMerchantAclRuleExpanderPlugin(),
    ];
}

# src/Pyz/Zed/Acl/AclConfig.php

protected function addPyzMerchantPortalInstallerRules(array $installerRules): array
{
    return [
        // ...
        'merchant-review-merchant-portal-gui',
    ];
}

Adjust Navigation configuration file

<?xml version="1.0"?>
<config>
    ...
    <administration>
        ...
        <pages>
            ...
            <merchant-reviews>
                <label>My Merchant Reviews &amp; Ratings</label>
                <title>My Merchant Reviews &amp; Ratings</title>
                <bundle>merchant-review-gui</bundle>
                <controller>index</controller>
                <action>index</action>
            </merchant-reviews>
        </pages>
    </administration>
    <merchant-review-merchant-portal-gui>
        <label>Merchant Reviews</label>
        <title>Merchant Reviews</title>
        <icon>offers</icon>
        <bundle>merchant-review-merchant-portal-gui</bundle>
        <controller>merchant-reviews</controller>
        <action>index</action>
    </merchant-review-merchant-portal-gui>
</config>

Apply Twig customization

# src/Pyz/Zed/ProductManagement/Presentation/Index/index.twig

{% block action %}
    {{ createActionButton('/import-process-spreadsheet-gui/index/select-sheet', 'Product Import from Spreadsheet' | trans) }}
    ...
{% endblock %}

Add translations

# data/import/common/common/glossary.csv

merchant_review.merchant_ratings,Merchant Ratings,en_US
merchant_review.merchant_ratings,Bewertungen,de_DE
merchant_review.merchant_ratings,Merchant Ratings,fr_FR
merchant_review.merchant_ratings,Merchant Ratings,es_ES
merchant_review.merchant_reviews,Merchant Reviews,en_US
merchant_review.merchant_reviews,Rezensionen,de_DE
merchant_review.merchant_reviews,Merchant Reviews,fr_FR
merchant_review.merchant_reviews,Merchant Reviews,es_ES
merchant_review.on,on,en_US
merchant_review.on,am,de_DE
merchant_review.on,on,fr_FR
merchant_review.on,on,es_ES
merchant_review.summary.star,star,en_US
merchant_review.summary.star,Stern,de_DE
merchant_review.summary.star,étoile,fr_FR
merchant_review.summary.star,estrella,es_ES
merchant_review.summary.stars,stars,en_US
merchant_review.summary.stars,Sterne,de_DE
merchant_review.summary.stars,étoiles,fr_FR
merchant_review.summary.stars,estrellas,es_ES
merchant_review.summary.out_of,out of,en_US
merchant_review.summary.out_of,von,de_DE
merchant_review.summary.out_of,hors de,fr_FR
merchant_review.summary.out_of,fuera de,es_ES
merchant_review.summary.review,review,en_US
merchant_review.summary.review,Bewertung,de_DE
merchant_review.summary.review,commentaire,fr_FR
merchant_review.summary.review,reseña,es_ES
merchant_review.summary.reviews,reviews,en_US
merchant_review.summary.reviews,Bewertungen,de_DE
merchant_review.summary.reviews,commentaires,fr_FR
merchant_review.summary.reviews,reseñas,es_ES
merchant_review.summary.title,Merchant Reviews & Ratings,en_US
merchant_review.summary.title,Händlerbewertungen,de_DE
merchant_review.summary.title,Merchant Reviews & Ratings,fr_FR
merchant_review.summary.title,Merchant Reviews & Ratings,es_ES
merchant_review.no_reviews,No review for this merchant yet,en_US
merchant_review.no_reviews,Noch keine Bewertung für diesen Händler,de_DE
merchant_review.no_reviews,No review for this merchant yet,fr_FR
merchant_review.no_reviews,No review for this merchant yet,es_ES
merchant_review.submit.add_a_review,Add a Review,en_US
merchant_review.submit.add_a_review,Bewertung hinzufügen,de_DE
merchant_review.submit.add_a_review,Ajouter un commentaire,fr_FR
merchant_review.submit.add_a_review,Agrega una reseña,es_ES
merchant_review.submit.rating,Rating,en_US
merchant_review.submit.rating,Bewertung,de_DE
merchant_review.submit.rating,Notation,fr_FR
merchant_review.submit.rating,Clasificación,es_ES
merchant_review.submit.rating.none,No rating was selected,en_US
merchant_review.submit.rating.none,Es wurde keine Bewertung ausgewählt,de_DE
merchant_review.submit.rating.none,No rating was selected,fr_FR
merchant_review.submit.rating.none,No rating was selected,es_ES
merchant_review.submit.summary,Summary,en_US
merchant_review.submit.summary,Überschrift,de_DE
merchant_review.submit.summary,Résumé,fr_FR
merchant_review.submit.summary,Resumen,es_ES
merchant_review.submit.description,Description,en_US
merchant_review.submit.description,Rezension,de_DE
merchant_review.submit.description,Description,fr_FR
merchant_review.submit.description,Descripción,es_ES
merchant_review.submit.nickname,Name,en_US
merchant_review.submit.nickname,Name,de_DE
merchant_review.submit.nickname,Nom,fr_FR
merchant_review.submit.nickname,Nombre,es_ES
merchant_review.submit.success,Merchant review was successfully submitted.,en_US
merchant_review.submit.success,Rezensionen wurde erfolgreich versendet.,de_DE
merchant_review.submit.success,Merchant review was successfully submitted.,fr_FR
merchant_review.submit.success,Merchant review was successfully submitted.,es_ES
merchant_review.error.no_customer,Please login to access this feature.,en_US
merchant_review.error.no_customer,"Bitte melden Sie sich an, um Zugiff auf dieses Feature zu erhalten.",de_DE
merchant_review.error.no_customer,Please login to access this feature.,fr_FR
merchant_review.error.no_customer,Please login to access this feature.,es_ES
merchant_review.error.invalid_rating,Merchant rating should be selected.,en_US
merchant_review.error.invalid_rating,Bewertungen soll ausgewählt werden.,de_DE
merchant_review.error.invalid_rating,Merchant rating should be selected.,fr_FR
merchant_review.error.invalid_rating,Merchant rating should be selected.,es_ES
merchant_review.error.no_blank_nickname,Please fill the Nickname.,en_US
merchant_review.error.no_blank_nickname,Bitte geben Sie den Spitznamen ein.,de_DE
merchant_review.error.no_blank_nickname,Please fill the Nickname.,fr_FR
merchant_review.error.no_blank_nickname,Please fill the Nickname.,es_ES
merchant_review.error.no_blank_summary,Please fill the summary.,en_US
merchant_review.error.no_blank_summary,Bitte füllen Sie die Zusammenfassung aus.,de_DE
merchant_review.error.no_blank_summary,Please fill the summary.,fr_FR
merchant_review.error.no_blank_summary,Please fill the summary.,es_ES
merchant_review.error.no_blank_description,Please fill the description.,en_US
merchant_review.error.no_blank_description,Bitte füllen Sie die Beschreibung aus.,de_DE
merchant_review.error.no_blank_description,Please fill the description.,fr_FR
merchant_review.error.no_blank_description,Please fill the description.,es_ES
merchant_review.reviews,Reviews,en_US
merchant_review.reviews,Bewertungen,de_DE
merchant_review.reviews,Reviews,fr_FR
merchant_review.reviews,Reviews,es_ES

Import translations

console data:import:glossary

Add synchronization Propel behavior

<database xmlns="spryker:schema-01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="zed" xsi:schemaLocation="spryker:schema-01 https://static.spryker.com/schema-01.xsd" namespace="Orm\Zed\MerchantReviewSearch\Persistence" package="src.Orm.Zed.MerchantReviewSearch.Persistence">

    <table name="spy_merchant_review_search" identifierQuoting="true">
        <behavior name="synchronization">
            <parameter name="queue_pool" value="synchronizationPool"/>
        </behavior>
    </table>

</database>

Add event Propel behavior

<?xml version="1.0"?>
<database xmlns="spryker:schema-01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="spryker:schema-01 https://static.spryker.com/schema-01.xsd" name="zed" namespace="Orm\Zed\MerchantReview\Persistence" package="src.Orm.Zed.MerchantReview.Persistence">

    <table name="spy_merchant_review" idMethod="native" allowPkInsert="true">
        <behavior name="event">
            <parameter name="spy_merchant_review_all" column="*"/>
        </behavior>
    </table>

</database>

Build Propel classes

console propel:install

Build Backoffice frontend

frontend:zed:install-dependencies
frontend:zed:build

Build Yves frontend

frontend:yves:install-dependencies
frontend:yves:build

Build MP frontend

frontend:mp:install-dependencies
frontend:mp:build