自作の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);
}
}
}