EC-CUBE3の ブロックのtwigテンプレートでphp関数を使えるようにする方法 

EC-CUBE2系ではテンプレートにsmartyが使われていたので
{php}タグで phpを書くことができました
EC-CUBE3のテンプレートはtwigになって、そのままではphpコードは書くことができません。
しかし、簡単なブロックを作成して埋め込みたいとき わざわざプラグインを作るのもめんどうです。
こんかい、RSSフィードを出力するブロックを実現してみました。
javascriptでやればできるんですが、HTMLとして出力したいというのがあって、phpでやってみました

EC-CUBE3 コンテンツ管理、ブロック作成で php関数 file_get_contentsを使えるようにする

/var/www/html/eccube/src/Eccube/Twig/Extension/EccubeExtension.php

に以下 14行目

new \Twig_SimpleFunction(‘php_*’, array($this,’phpFunctions’),array(‘is_safe’ => array(‘html’))),


public function phpFunctions()
を追加します

public function getFunctions()
    {
        $RoutingExtension = $this->app['twig']->getExtension('routing');

        return array(
            new \Twig_SimpleFunction('calc_inc_tax', array($this, 'getCalcIncTax')),
            new \Twig_SimpleFunction('active_menus', array($this, 'getActiveMenus')),
            new \Twig_SimpleFunction('csrf_token_for_anchor', array($this, 'getCsrfTokenForAnchor'), array('is_safe' => array('all'))),

            // Override: \Symfony\Bridge\Twig\Extension\RoutingExtension::url
            new \Twig_SimpleFunction('url', array($this, 'getUrl'), array('is_safe_callback' => array($RoutingExtension, 'isUrlGenerationSafe'))),
            // Override: \Symfony\Bridge\Twig\Extension\RoutingExtension::path
            new \Twig_SimpleFunction('path', array($this, 'getPath'), array('is_safe_callback' => array($RoutingExtension, 'isUrlGenerationSafe'))),
            new \Twig_SimpleFunction('php_*', array($this,'phpFunctions'),array('is_safe' => array('html'))),
        );
    }
    public function phpFunctions()
    {
        $arg_list = func_get_args();
        $function = array_shift($arg_list);
        $allowFunctions=array('file_get_contents','echo');
        if(in_array($function,$allowFunctions)==false){
            return NULL;
        }
        if(is_callable($function)){
            return call_user_func_array($function, $arg_list);
        }

        $errMsg = 'Called to an undefined function : php_' . $function . " ";

        trigger_error($errMsg, E_USER_NOTICE);

        return NULL;
    }
  //
  //
   //

プログラムの修正はこれだけです。

実際の使い方

てきとうな場所に素のphpプログラムを作ります

RSSフィードをphpで出力する phpスクリプト

wp/my_php/rss_php.php

//
$rss = simplexml_load_file('http://esuppo.ecopls.link/wp/feed');
$echos.= '<ul>';
foreach($rss->channel->item as $item){
  $title = $item->title;
  $link = $item->link;
  $echos.='
  <li><a href="'.$link.'" target="_blank">
  <span class="title">'. $title .'</span>
  </a></li>
  ';
}  
$echos.= '</ul>'."\r\n"; 
echo $echos;
//

EC-CUBE コンテンツ管理のブロック中で
ブログ新着情報

//
{{ php_file_get_contents('https://esuppo.ecopls.link/wp/my_php/rss_php.php') }}
//

などのように php関数の前に php_をつけてfile_get_contentsを呼び出します

すべての関数が使えるのもよくないので

//
//
        $allowFunctions=array('file_get_contents','echo');
        if(in_array($function,$allowFunctions)==false){
            return NULL;
        }
//

のように使える関数をリスト化しています。