LoginSignup
1
2

More than 5 years have passed since last update.

EC-CUBE4 カスタマイズ開発 Plugin Twig拡張

Last updated at Posted at 2018-10-24

自作のTwig関数やTwigフィルターは、以下の通りにファイルを設置するだけで有効になりました。

app/Plugin/プラグインコード/Twig/Extension/XXXExtension.php
namespace Plugin\プラグインコード\Twig\Extension;


use Twig\Extension\AbstractExtension;

class XXXExtension extends AbstractExtension
{
    public function getFilters()
    {
        return [
            new \Twig_Filter('my_filter', [$this, 'my_filter'])
        ];
    }

    public function my_filter()
    {
        return true;
    }
}

なお、関数やフィルター内で HttpRequest を扱いたい場合は、コンストラクタを以下のようにすることで AutoWiring されました。

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

EC-CUBE4では、サイト全体の多言語化は実装されているが、個人レベルでの多言語化は実装されていないので
独自翻訳フィルターを使って、ブラウザ言語設定またはクッキーを見て翻訳するフィルターを考えてみました。

class SampleExtension extends AbstractExtension
{
    /** @var RequestStack */
    protected $requestStack;

    /**
     * Sample constructor.
     *
     * @param RequestStack $requestStack
     */
    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    /**
     * @return array|\Twig_Filter[]
     */
    public function getFilters()
    {
        return [
            new \Twig_Filter('sample_trans', [$this, 'trans'])
        ];
    }

    /**
     * @param $id
     * @param array $parameters
     * @param string $domain
     * @param null $locale
     *
     * @return mixed
     */
    public function trans($id, array $parameters = [], $domain = 'messages', $locale = null)
    {
        $lang = null;

        $request = $this->requestStack->getCurrentRequest();

        $headers = $request->headers;
        $accept_lang = $headers->get('Accept-Language'); // "ja,en-US;q=0.7,en;q=0.3"
        if ( ! empty($accept_lang)) {
            $accept_langs = explode(',', $accept_lang);
            if ( ! empty($accept_langs) && $accept_langs[0] !== 'ja') {
                $lang = 'en';
            }
        }

        if ($lang === null) {
            $cookies = $request->cookies;
            $cookie_lang = $cookies->get('lang');
            if ( ! empty($cookie_lang) && $cookie_lang !== 'ja') {
                $lang = 'en';
            }
        }

        if ($lang !== null) {
            $locale = $lang;
        }

        $app = \Eccube\Application::getInstance();
        if (isset($app['translator'])) {
            return $app['translator']->trans($id, $parameters, $domain, $locale);
        }
    }
}
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2