Modulanpassungen / -erweiterungen

How-To-Anleitungen, wie man das Modul anpassen oder erweitern kann.

Änderung der Template-Ausgabe - Land-Sprach-Kombination

Standardmäßig werden im Country-Popup die Codes, also der ISO2-Ländercode und der Locale-Code ausgegeben.

<div class="popup-store-switcher">
    <?php if (!empty($recommendedStore)):?>
        <div class="recommended-store">
            <div><b><?= $escaper->escapeHtml(__('Recommended stores')) ?></b></div>
            <div class="switcher
                <?= $escaper->escapeHtmlAttr($recommendedStore['storecode']) ?>
                <?= $escaper->escapeHtmlAttr($recommendedStore['country']) ?>
                <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>"
            >
                <span class="country-code <?= $escaper->escapeHtmlAttr($recommendedStore['country']) ?>">
                    <span><?= $escaper->escapeHtml($recommendedStore['country']) ?></span> (1)
                </span>
                <a href="<?= $escaper->escapeUrl($recommendedStore['pageurl']) ?>"
                   class="language-link <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>">
                    <span class="language-code <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>">
                        <?= $escaper->escapeHtml($recommendedStore['language']) ?> (2)
                    </span>
                </a>
            </div>
        </div>
    <?php endif; ?>

    <div class="all-stores">
        <?php if (!empty($allStoresAndLanguages)):?>
            <div><b><?= $escaper->escapeHtml(__('Available stores')) ?>:</b></div>
            <?php foreach ($allStoresAndLanguages as $country => $languages):?>
                <div class="switcher <?= $escaper->escapeHtmlAttr($country) ?>">
                    <span class="country-code <?= $escaper->escapeHtmlAttr($country) ?>">
                        <?= $escaper->escapeHtml($country) ?> (3)
                    </span>
                    <?php foreach ($languages as $language => $urls):?>
                        <?php foreach ($urls as $url):?>
                            <a href="<?= $escaper->escapeUrl($url['pageurl']) ?>"
                               class="language-link <?= $escaper->escapeHtmlAttr($url['language']) ?>">
                                <span class="language-code <?= $escaper->escapeHtmlAttr($url['language']) ?>">
                                    <?= $escaper->escapeHtml($url['language']) ?> (4)
                                </span>
                            </a>
                        <?php endforeach ?>
                    <?php endforeach ?>
                </div>
            <?php endforeach ?>
        <?php endif; ?>
    </div>
</div>
1 Recommended Store Label
2 Recommended Store Link
3 Label anderer Stores
4 Link anderer Stores
Popup - default

Über das Modul werden bereits weitere Daten in das Template übergeben. Mit der folgenden Anpassung können statt der Codes die übersetzten Länder bzw. Sprachen ausgegeben werden.

<div class="popup-store-switcher">
    <?php if (!empty($recommendedStore)):?>
        <div class="recommended-store">
            <div><b><?= $escaper->escapeHtml(__('Recommended stores')) ?></b></div>
            <div class="switcher
                <?= $escaper->escapeHtmlAttr($recommendedStore['storecode']) ?>
                <?= $escaper->escapeHtmlAttr($recommendedStore['country']) ?>
                <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>"
            >
                <span class="country-code <?= $escaper->escapeHtmlAttr($recommendedStore['country']) ?>">
                    <span><?= $escaper->escapeHtml($recommendedStore['transCountry']) ?></span> (1)
                </span>
                <a href="<?= $escaper->escapeUrl($recommendedStore['pageurl']) ?>"
                   class="language-link <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>">
                    <span class="language-code <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>">
                        <?= $escaper->escapeHtml($recommendedStore['transLanguage']) ?> (2)
                    </span>
                </a>
            </div>
        </div>
    <?php endif; ?>

    <div class="all-stores">
        <?php if (!empty($allStoresAndLanguages)):?>
            <div><b><?= $escaper->escapeHtml(__('Available stores')) ?>:</b></div>
            <?php foreach ($allStoresAndLanguages as $country => $languages):?>
                <div class="switcher <?= $escaper->escapeHtmlAttr($country) ?>">
                    <span class="country-code <?= $escaper->escapeHtmlAttr($country) ?>">
                        <?php
                            $transCountry = '';
                            foreach ($languages as $language => $urls) {
                                foreach ($urls as $url) {
                                    if ($transCountry === '') {
                                        $transCountry = $url['transCountry'];
                                    }
                                }
                            }
                        ?>
                        <?= $escaper->escapeHtml($transCountry) ?> (3)
                    </span>
                    <?php foreach ($languages as $language => $urls):?>
                        <?php foreach ($urls as $url):?>
                            <a href="<?= $escaper->escapeUrl($url['pageurl']) ?>"
                               class="language-link <?= $escaper->escapeHtmlAttr($url['language']) ?>">
                                <span class="language-code <?= $escaper->escapeHtmlAttr($url['language']) ?>">
                                    <?= $escaper->escapeHtml($url['transLanguage']) ?> (4)
                                </span>
                            </a>
                        <?php endforeach ?>
                    <?php endforeach ?>
                </div>
            <?php endforeach ?>
        <?php endif; ?>
    </div>
</div>
1 Austausch des Country-Codes durch übersetztes Land (recommended)
2 Austausch des Sprach-Codes durch übersetzte Sprache (recommended)
3 Ermittlung und Austausch Country-Codes durch übersetztes Land
4 Austausch Sprach-Code durch übersetzte Sprache
Popup - Sprache/Land übersetzt

Änderung der Template-Ausgabe - Custom-Label

Auch können die Labels und Links durch komplett eigene Texte ersetzt werden. Diese können mit folgendem Beispiel generiert und mit Hilfe des Translation-Generators übersetzt werden.

<div class="popup-store-switcher">
    <?php if (!empty($recommendedStore)):?>
        <div class="recommended-store">
            <div><b><?= $escaper->escapeHtml(__('Recommended stores')) ?></b></div>
            <div class="switcher
                <?= $escaper->escapeHtmlAttr($recommendedStore['storecode']) ?>
                <?= $escaper->escapeHtmlAttr($recommendedStore['country']) ?>
                <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>"
            >
                <!--
                <span class="country-code <?= $escaper->escapeHtmlAttr($recommendedStore['country']) ?>">(1)
                    <span><?= $escaper->escapeHtml($recommendedStore['country']) ?></span>
                </span>
                -->
                <a href="<?= $escaper->escapeUrl($recommendedStore['pageurl']) ?>"
                   class="language-link <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>">
                    <span class="language-code <?= $escaper->escapeHtmlAttr($recommendedStore['language']) ?>">
                        <?= $escaper->escapeHtml(
                            __($recommendedStore['storecode'].'_'.$recommendedStore['country'].'_'.$recommendedStore['language']) (2)
                        ) ?>
                    </span>
                </a>
            </div>
        </div>
    <?php endif; ?>

    <div class="all-stores">
        <?php if (!empty($allStoresAndLanguages)):?>
            <div><b><?= $escaper->escapeHtml(__('Available stores')) ?>:</b></div>
            <?php foreach ($allStoresAndLanguages as $country => $languages):?>
                <div class="switcher <?= $escaper->escapeHtmlAttr($country) ?>">
                    <!--
                    <span class="country-code <?= $escaper->escapeHtmlAttr($country) ?>"> (3)
                        <?= $escaper->escapeHtml($country) ?>
                    </span>
                    -->
                    <?php foreach ($languages as $language => $urls):?>
                        <?php foreach ($urls as $url):?>
                            <a href="<?= $escaper->escapeUrl($url['pageurl']) ?>"
                               class="language-link <?= $escaper->escapeHtmlAttr($url['language']) ?>">
                                <span class="language-code <?= $escaper->escapeHtmlAttr($url['language']) ?>">
                                    <?= $escaper->escapeHtml(__($url['storecode'].'_'.$url['country'].'_'.$url['language'])) ?> (4)
                                </span>
                            </a>
                        <?php endforeach ?>
                    <?php endforeach ?>
                </div>
            <?php endforeach ?>
        <?php endif; ?>
    </div>
</div>
1 Entfernung Label (recommended)
2 Definition "Custom-Label" (recommended)
3 Entfernung Label
4 *Definition "Custom-Label" *
nicht übersetzt übersetzt

Custom Popup

Custom Popup - übersetzt

Änderung der Store-Wechsler-Logik - reiner Sprachwechsler

Die grundsätzliche Logik sieht vor, den Store-Wechsel aufgrund Landes vorzunehmen. Ebenso wird der "vorgeschlagene" Store so ermittelt und ausgegeben. In manchen Shop-Konstellationen kann der Wechsler nicht korrekt funktionieren. Unter anderen, wenn für alle Stores das Default Country gleich ist.

Sprich: "Nur eine Website mit mehreren Sprachen (Store Views)."

Da dies generell aber Seiteneffekte nach sich ziehen kann, wurde dieses Feature nicht in das Modul als Standard aufgenommen. Hier dennoch einen Lösungsmöglichkeit aus dem Country-Popup ein "Language-Popup" zu machen.

<?php
/**
 * Copyright (c) 2020 TechDivision GmbH
 * All rights reserved
 *
 * This product includes proprietary software developed at TechDivision GmbH, Germany
 * For more information see https://www.techdivision.com/
 *
 * To obtain a valid license for using this software please contact us at
 * license@techdivision.com
 */

namespace TechDivision\CountryPopup\Plugin\ViewModel;

use Magento\Framework\Exception\NoSuchEntityException;
use TechDivision\CountryPopup\ViewModel\Popup as PopupBase;
use TechDivision\CountryPopup\Helper\Config;
use TechDivision\CountryPopup\Model\StoreDataProvider;

/**
 * @copyright   Copyright (c) 2020 TechDivision GmbH (https://www.techdivision.com)
 * @site        https://www.techdivision.com/
 * @author      Julia Mehringer <j.mehringer@techdivision.com>
 */
class Popup
{
    /** @var Config */
    protected $config;

    /** @var StoreDataProvider */
    protected $storeDataProvider;

    /**
     * @param Config $config
     * @param StoreDataProvider $storeDataProvider
     */
    public function __construct( (1)
        Config $config,
        StoreDataProvider $storeDataProvider
    ) {
        $this->config = $config;
        $this->storeDataProvider = $storeDataProvider;
    }

    /**
     * @param PopupBase $subject
     * @param $result
     * @param string $localeOrCountry
     * @return bool
     */
    public function afterCheckCountry(PopupBase $subject, $result, $localeOrCountry)
    {
        $tmpCountry = explode('_', $localeOrCountry);
        $country = end($tmpCountry);

        $tmpLocale = explode('_', $this->config->getStoreLocale());
        $locale = strtoupper($tmpLocale[0]);

        return $country === $locale;(2)
    }

    /**
     * @param PopupBase $subject
     * @param array $result
     * @param array $cachedStoreData
     * @return array
     * @throws NoSuchEntityException
     */
    public function afterGetRecommendedStore(PopupBase $subject, $result, $cachedStoreData)
    {
        $recommended = $subject->getCountryFromClient();
        if (!empty($recommended)) {

            if (isset($cachedStoreData[$this->config->getStoreCountry()])) {
                if (isset($cachedStoreData[$this->config->getStoreCountry()][$recommended])) {
                    return reset($cachedStoreData[$this->config->getStoreCountry()][$recommended]);
                }
                // take first language and first store
                $firstLanguageFromCountry = reset($cachedStoreData[$this->config->getStoreCountry()]);(3)
                return reset($firstLanguageFromCountry);
            }
        }
        return [];

    }

    /**
     * @param PopupBase $subject
     * @param $result
     * @return false
     * @throws NoSuchEntityException
     */
    public function afterIsRecommendedStoreInUse(PopupBase $subject, $result)
    {
        $countryLanguageUrl = $this->storeDataProvider->getCountryLanguageURLs();
        $recommendedStore = $subject->getRecommendedStore($countryLanguageUrl);
        if (empty($recommendedStore)) {
            return false;
        }

        $tmpLanguage = explode('_', $recommendedStore['language']);
        $language = strtoupper($tmpLanguage[0]);

        return $subject->checkCountry($language ?? ''); (4)
    }
}
1 Die Standard-Logik kann über ein Magento-Plugin überschrieben werden. Mit After-Methods können die gewünschten Änderungen implementiert werden.
2 Die Funktion checkCountry prüft nun die Sprache (Locale).
3 Da durch den Check nun mehrere Stores als passender Vorschlag gültig sind, kann einfach der erste vorgeschlagene Store gewählt und ausgegeben werden.
4 Auch die Prüffunktion, ob der aktuell befindliche Store als "recommended" gilt, muss angepasst werden, so das der Check gegen die Sprache und nicht gegen das Land geführt wird.