templates/components/cook.html.twig line 1

Open in your IDE?
  1. <div class="v-cook-selector" ref="vCookSelector">
  2.   <transition name="fade">
  3.   <article class="js-cook-selector-pref" v-show="opened">
  4.     <div class="responsive-container">
  5.       <header>
  6.         <div class="header_wr">
  7.           <div class="title_wr">
  8.             <a href="#" class="back" @click.stop="close"></a>
  9.             <h1 class="header_title">料理を選ぶ</h1>
  10.           </div>
  11.         </div>
  12.       </header>
  13.       <main>
  14.         <h2 class="page_title02">料理を選ぶ</h2>
  15.         <ul class="cook_list">
  16.           <li v-for="cook in cooks">
  17.             <a href="#" @click.stop="selectCook(cook)">
  18.               <p>[[ cook.name ]]</p>
  19.               <img :src="image(cook)" :alt="cook.name">
  20.             </a>
  21.           </li>
  22.         </ul>
  23.       </main>
  24.     </div>
  25.   </article>
  26.   </transition>
  27. </div>
  28. <script>
  29.   $(function () {
  30.       var vCookSelector = new Vue({
  31.           el: '.v-cook-selector',
  32.           delimiters: ['[[', ']]'],
  33.           data: function () {
  34.               return {
  35.                   {# // trueならエリア選択画面を表示 #}
  36.                   opened: false,
  37.                   {# // 選択可能なcook、location #}
  38.                   cooks: [],
  39.                   {# // 選択したcook #}
  40.                   selectedCook: null,
  41.                   {# // location選択後に実行されるcallback #}
  42.                   callback: null,
  43.               };
  44.           },
  45.           created: function () {
  46.               this.refreshCook();
  47.           },
  48.           computed: {
  49.           },
  50.           methods: {
  51.               open: function (callback) {
  52.                   this.opened = true;
  53.                   this.callback = callback;
  54.               },
  55.               close: function () {
  56.                   this.opened = false;
  57.               },
  58.               refreshCook: function () {
  59.                   var self = this;
  60.                   $.ajax({
  61.                       url: '{{ path('api_categories_get_collection') }}',
  62.                       headers: {
  63.                           'Accept': 'application/json',
  64.                       },
  65.                   }).done(function (data) {
  66.                       self.cooks = data;
  67.                   }).fail(function () {
  68.                       alert('料理の取得に失敗しました。ページを再読み込みしてください。');
  69.                   });
  70.               },
  71.               selectCook: function (cook) {
  72.                   this.selectedCook = cook;
  73.                   if (typeof this.callback === 'object' || typeof this.callback === 'function') {
  74.                       this.callback(this.selectedCook);
  75.                   }
  76.                   this.close();
  77.               },
  78.               image: function (data) {
  79.                   if (typeof data.image === 'undefined') {
  80.                       return '/img/no-image.jpeg';
  81.                   } else if (! data.image) {
  82.                       return '/img/no-image.jpeg';
  83.                   } else {
  84.                       return data.image;
  85.                   }
  86.               }
  87.           },
  88.       });
  89.       $(document).on('click', '.js-cook-selector', function () {
  90.           var self = this;
  91.           {# // .js-cook-selectorをクリックするとエリア選択画面を表示 #}
  92.           vCookSelector.open(function (cook) {
  93.               {# // 呼び出し元の要素にはlocationの名称を日本語で入れる #}
  94.               $(self).val(cook.name);
  95.               {# // 選択したlocationのIDを入れる対象の要素をdata属性から取得したセレクタで取得 #}
  96.               var target = $(self).data('cook-selector-data-target');
  97.               var $target = $(target);
  98.               {# // 選択したlocationのIDを値として入れる #}
  99.               $target.val(cook.id);
  100.           });
  101.       });
  102.   });
  103. </script>