app/template/osechi/Block/topic.twig line 1

Open in your IDE?
  1. {#
  2. ///////////////////////////////////////////////////////////////////////
  3. This template is part of EC-CUBE Design template.
  4. Copyright(c) JAPAN ELECTRONIC INDUSTRIAL ARTS CO.LTD.
  5. http://www.jeia.co.jp/
  6. For the full copyright and license information, please view the LICENSE
  7. file that was distributed with this source code.
  8. 本テンプレートの著作権は、「株式会社日本電子工藝社」に帰属いたします。
  9. ※本テンプレートを譲渡・再頒布・転用・第三者へ開示することは禁止いたします。
  10. ただし、事業者によるショップ運営者への設置代行を禁止するものではございません。
  11. ※本テンプレートを申請されたご利用サイトへの設置以外の目的で複製することは禁止いたします。
  12. ※本テンプレートデータ内のライセンス条項、および著作権に関する記述を削除することはできません。
  13. ※ご利用サイトを変更することはできません。申請と異なるサイトにてご利用になる場合は、
  14. 別途、ご利用費用をお支払いただく必要がございます。
  15. ※本テンプレートの改変にあたり、一切のサポートはいたしかねます。
  16. ※本テンプレートは、すべての設置環境で動作する事は保証しておりません。
  17. ///////////////////////////////////////////////////////////////////////
  18. #}
  19. {#
  20. 以下のブロックを当Twigでまとめて記述しています。
  21. * Locations 所在地(Googleマップ埋め込み)
  22. * インスタグラム最新記事表示ブロック
  23. ※各ブロックを別々にブロック管理したい場合は、管理画面からブロックを新規作成し、各ブロックにコード内容をコピーして目的の位置にブロック挿入してください。
  24. #}
  25. {#
  26. Locations 所在地(Googleマップ埋め込み)
  27. Googleマップ埋め込みiframeタグ、背景画像のパス、ロゴ画像のパスを下記のTwig変数「ShopMap」に登録してください。
  28. * iframe:  Googleマップ埋め込みiframeタグ
  29. * bg:      背景画像のパス
  30. * logo:    ロゴ画像のパス
  31.            背景画像、ロゴ画像ともパス指定においては、
  32.            ※テンプレートのデフォルトでは「sample」ディレクトリに画像を格納していますので「asset('assets/img/sample/xxxx.jpg')」のように指定しています。​
  33.            ※クラウド版ec-cube.coをご利用の方はアップロード画像をフルパスにて以下のように指定してください。
  34.           【例】bg:   '/html/user_data/assets/img/xxxx.jpg',
  35.           【例】logo: '/html/user_data/assets/img/xxxx.png'
  36. Googleマップ埋め込みの手順
  37. Googleマップ(https://www.google.co.jp/maps/)にアクセスして、店舗名称もしくは住所で検索して目的の地図を開いてください。
  38. 左上のメニューボタンをクリックして「地図の共有または埋め込む」を選択して、表示されるダイアログから「地図を埋め込む」を選択してください。
  39. 表示されるiframeタグをコピーし、上記の変数を書き換えてください。width、height属性はあってもなくても構いません。
  40. 当ブロックの背景画像は「access_bg.jpg」、ロゴ画像は「access_logo.png」(透過画像)となっています。
  41. レスポンシブにより背景画像を挿す場所を変えています。
  42. 背景画像、ロゴ画像の指定については本来はCSSで定義する所でありますが、クラウド版ec-cube.coでも使用できるようにこちらにてTwig変数を用いて定義しています。
  43. CSSスタイリングは「_12.5.topics.scss」で行っています。
  44. #}
  45. {# ----------▼ shopMap画像登録 ▼---------- #}
  46. {% set ShopMap = 
  47.     {
  48.         iframe:   '<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1363.0429595837415!2d139.69935249167554!3d35.65530905821623!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188b57493e0879%3A0x488f94e329810eb2!2z44CSMTUwLTAwMzEg5p2x5Lqs6YO95riL6LC35Yy65qGc5LiY55S677yS77yT4oiS77yS77yT!5e0!3m2!1sja!2sjp!4v1694072534282!5m2!1sja!2sjp" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>',
  49.         bg:       asset( 'assets/img/top/access_bg.webp' ),
  50.         logo:     asset( 'assets/img/sample/access_logo.png' )
  51.     }
  52. %}
  53. {# ----------▲ shopMap画像登録 ▲---------- #}
  54. <!-- Block/topic.twig -->
  55. {#
  56. <div class="ec-shopMapRole appearEffect">
  57.     <div class="ec-secHeading">
  58.         <h2>
  59.             <span class="ec-secHeading__en">Locations</span>
  60.             <span class="ec-secHeading__ja">所在地</span>
  61.         </h2>
  62.     </div>
  63.     <div class="ec-shopMapRole__container" style="background-image: url( {{ ShopMap.bg }} );">
  64.         <div class="ec-shopMapRole__wrap">
  65.             <div class="ec-shopMapRole__map">
  66.                 <div class="map">
  67.                     {{ ShopMap.iframe|raw }}
  68.                 </div>
  69.             </div>
  70.             <div class="ec-shopMapRole__content" style="background-image: url( {{ ShopMap.bg }} );">
  71.                 <div class="logo"><img src="{{ ShopMap.logo }}" alt=""></div>
  72.                 <address>
  73.                     location: 2nd floor, Shinoda Building, 23-3 Sakuragaoka-cho, Shibuya-ku, Tokyo
  74.                     <br>
  75.                     tel: 03-5784-3280
  76.                 </address>
  77.             </div>
  78.         </div>
  79.     </div>
  80. </div>
  81. #}
  82. {#
  83. インスタグラム最新記事表示ブロック
  84. インスタグラムの最新記事を表示するブロックです。
  85. 最新記事を動的に取得するには「Instagram Graph API」のビジネスアカウントIDとトークンを取得する必要があります。​
  86. 取得の方法についてはお手数ですがお調べくださるようお願い申し上げます。様々なサイト様が詳しく解説してくださっています。​
  87. 当テンプレートでは1段階目トークン取得の際に指定する「アクセス許可」は以下の9点を選択して動作確認しております。
  88. * public_profile(初めから選択済)
  89. * business_management
  90. * pages_show_list
  91. * instagram_basic
  92. * instagram_manage_insights
  93. * instagram_manage_comments
  94. * pages_manage_ads
  95. * pages_manage_metadata
  96. * pages_read_engagement
  97. * pages_read_user_content
  98. 取得したビジネスアカウントIDとアクセストークン(3段目トークン)を下記のTwig変数「Instagram」にセットしてください。
  99. * business_id:  ビジネスアカウントID
  100. * access_token: アクセストークン(3段目トークン)
  101. CSSスタイリングは「_12.11.instagram.scss」で行っています。
  102. #}
  103. {# ----------▼ Instagram Graph API設定 ▼---------- #}
  104. {% set Instagram = 
  105.     {
  106.         business_id:  '',
  107.         access_token: ''
  108.     }
  109. %}
  110. {# ----------▲ Instagram Graph API設定 ▲---------- #}
  111. <!-- Block/topic.twig -->
  112. {#
  113. <div class="ec-instagramRole appearEffect">
  114.     <div class="ec-secHeading">
  115.         <h2>
  116.             <span class="ec-secHeading__en">Instagram</span>
  117.             <span class="ec-secHeading__ja">インスタグラム</span>
  118.         </h2>
  119.     </div>
  120.     <ul class="ec-instagramRole__list"></ul>
  121. </div>
  122. #}
  123. {# 管理上の都合にてここにスクリプトを記述します。スクリプト実行順序があるので「$(function(){});」で囲っています。 #}
  124. <script>
  125.     $(function(){
  126.         var $base = $( '.ec-instagramRole' );
  127.         var $instagramList = $base.find( 'ul.ec-instagramRole__list' );
  128.         // Instastram ビジネスアカウントID
  129.         var business_id = '{{ Instagram.business_id }}';
  130.         // Instagram Graph APIトークン
  131.         var token = '{{ Instagram.access_token }}';
  132.         var amount = 16;// 取得する記事数
  133.         var textMax = 80;// コメント表示の文字数制限
  134.         // ビジネスアカウントIDとトークンが未指定の場合はダミー表示
  135.         if ( business_id == '' || token == '' ) {
  136.             for ( var i=0; i<amount; i++) {
  137.                 var image = '{{ asset("assets/img/sample/") }}instagram.jpg';
  138.                 var $instagram_li = '<li><a href="javascript:void(0);"><div class="media_image" style="background-image:url(' + image + ');"></div></a><div class="popup"><div class="comment">キャプションを表示します。Instagram Graph APIを使用するにはビジネスアカウントIDとトークンを取得する必要があります。</div></div></li>';
  139.                 $instagramList.append( $instagram_li );
  140.             }
  141.             return false;
  142.         }
  143.         
  144.         // 記事取得URLを生成
  145.         var instagram_api_url = 'https://graph.facebook.com/v11.0/';
  146.         var query =             'name,media.limit(' + amount +'){caption,like_count,media_url,permalink,timestamp,username,thumbnail_url}';
  147.         var geturl =            instagram_api_url + business_id + "?fields=" + query + "&access_token=" + token;
  148.         $.ajax({
  149.             type: 'GET',
  150.             url: geturl,
  151.             dataType: 'json',
  152.             success: function(json) {
  153.                 var insta = json.media.data;
  154.                 for ( var i=0; i<insta.length; i++ ) {
  155.                     //console.log(insta[i]);
  156.                     // li, a要素を生成
  157.                     var $instagram_li = $( '<li>' );
  158.                     var $instagram_link = $( '<a target="_blank">' ).attr( 'href', insta[i].permalink );
  159.                     var $instagram_media = null;
  160.                     // メディア(画像・動画)
  161.                     if (  insta[i].media_url.indexOf( 'video' ) > 0 ) {
  162.                         // 動画の場合
  163.                         if ( insta[i].thumbnail_url && window.innerWidth < 1280 ) {
  164.                             // 動画サムネイルが取得できている場合(かつスマホ・タブレット時)はサムネイル画像を表示(通常の画像と同じ構造)
  165.                             $instagram_media = $( '<div class="media_image video_thumbnail" style="background-image:url(' + insta[i].thumbnail_url + ');">' );
  166.                         } else {
  167.                             // videoタグを生成
  168.                             $instagram_media = $( '<div class="media_video">' ).append( $( '<video controls playsinline preload="metadata">' ).prop( 'src', insta[i].media_url ) );
  169.                         }
  170.                     } else {
  171.                         // 画像の場合(正方形でない画像を正方形クリップさせるため背景画像で使用)
  172.                         $instagram_media = $( '<div class="media_image" style="background-image:url(' + insta[i].media_url + ');">' );
  173.                     }
  174.                     // 要素組立て
  175.                     $instagram_link.append( $instagram_media );
  176.                     $instagram_li.append( $instagram_link )
  177.                     $instagramList.append( $instagram_li );
  178.                     
  179.                     // ポップアップ要素(キャプション、いいねの表示)
  180.                     var $popup = $( '<div class="popup">' );
  181.                     // コメント
  182.                     var caption = '';
  183.                     if ( insta[i].caption ) {
  184.                         caption = insta[i].caption;
  185.                         // 文字数制限
  186.                         if ( caption.length > textMax ) {
  187.                             caption = caption.substr(0, textMax) + '...';
  188.                         }
  189.                         // ポップアップ要素にキャプションを追加
  190.                         $popup.append( '<div class="insta_caption">' + caption + '</div>' );
  191.                     }
  192.                     // ポップアップHTMLを組立て
  193.                     //$popup.append( '<div class="likeCount">いいね!' + insta[i].like_count + '件</div>' );
  194.                     $popup.append( '<div class="likeCount"><i class="jeiafont jeia-heart_fill"></i>' + insta[i].like_count + '件</div>' );
  195.                     $popup.appendTo( $instagram_li );
  196.                 }
  197.             },
  198.             error: function() {
  199.                 //エラー時
  200.             }
  201.         });
  202.     });
  203. </script>