{#
This file is part of EC-CUBE
Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
http://www.ec-cube.co.jp/
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
#}
{% extends 'default_frame.twig' %}
{% set body_class = 'product_page' %}
{% block stylesheet %}
<style>
.hidden{
display: none;
}
.slick-slider {
margin-bottom: 30px;
}
.slick-dots {
position: absolute;
bottom: -45px;
display: block;
width: 100%;
padding: 0;
list-style: none;
text-align: center;
}
.slick-dots li {
position: relative;
display: inline-block;
width: 20px;
height: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button {
font-size: 0;
line-height: 0;
display: block;
width: 20px;
height: 20px;
padding: 5px;
cursor: pointer;
color: transparent;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus {
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before {
opacity: 1;
}
.slick-dots li button:before {
content: " ";
line-height: 20px;
position: absolute;
top: 0;
left: 0;
width: 12px;
height: 12px;
text-align: center;
opacity: .25;
background-color: black;
border-radius: 50%;
}
.slick-dots li.slick-active button:before {
opacity: .75;
background-color: black;
}
.slick-dots li button.thumbnail img {
width: 0;
height: 0;
}
.price_no_tax{
color: black;
}
.price_no_tax_first{
margin-left: 30px;
}
.product_plate_type_print img{
width: unset;
}
.ec-productRole .ec-productRole__category{
border-bottom: unset;
}
</style>
{% endblock %}
{# --- この商品がカテゴリID=124か判定 --- #}
{% set is_calendar = false %}
{% for pc in Product.ProductCategories %}
{% if pc.Category.id == 124 %}
{% set is_calendar = true %}
{% endif %}
{% endfor %}
{% block javascript %}
<script>
var stocks = {{stocks|json_encode|raw}};
eccube.classCategories = {{ class_categories_as_json(Product)|raw }};
// 規格2に選択肢を割り当てる。
function fnSetClassCategories(form, classcat_id2_selected) {
var $form = $(form);
var product_id = $form.find('input[name=product_id]').val();
var $sele1 = $form.find('select[name=classcategory_id1]');
var $sele2 = $form.find('select[name=classcategory_id2]');
eccube.setClassCategories($form, product_id, $sele1, $sele2, classcat_id2_selected);
}
var code = jQuery('.product-code-default').text();
if (Number(stocks[code]) < 0){
jQuery('.product-stock-quantity-default').html('<b>あり</b>');
}
if (stocks[code] != undefined && stocks[code] > 0){
jQuery('.product-stock-quantity-default').html(stocks[code]);
}else if (stocks[code] != undefined && stocks[code] == 0){
jQuery('.product-stock-quantity-default').html('<b>なし</b>');
}
{% if form.classcategory_id2 is defined %}
fnSetClassCategories(
$('#form1'), {{ form.classcategory_id2.vars.value|json_encode|raw }}
);
{% elseif form.classcategory_id1 is defined %}
$('input[name="classcategory_option"]').on('change', function(e) {
$('#classcategory_id1').val($(e.target).val()).change();
})
eccube.checkStock($('#form1'), {{ Product.id }}, {{ form.classcategory_id1.vars.value|json_encode|raw }}, null);
{% endif %}
</script>
<script>
$(function() {
// bfcache無効化
$(window).bind('pageshow', function(event) {
if (event.originalEvent.persisted) {
location.reload(true);
}
});
// Core Web Vital の Cumulative Layout Shift(CLS)対策のため
// img タグに width, height が付与されている.
// 630px 未満の画面サイズでは縦横比が壊れるための対策
// see https://github.com/EC-CUBE/ec-cube/pull/5023
$('.ec-grid2__cell').hide();
var removeSize = function () {
$('.slide-item').height('');
$('.slide-item img')
.removeAttr('width')
.removeAttr('height')
.removeAttr('style');
};
var slickInitial = function(slick) {
$('.ec-grid2__cell').fadeIn(1500);
var baseHeight = $(slick.target).height();
var baseWidth = $(slick.target).width();
var rate = baseWidth / baseHeight;
$('.slide-item').height(baseHeight * rate); // 余白を削除する
// transform を使用することでCLSの影響を受けないようにする
$('.slide-item img')
.css(
{
'transform-origin': 'top left',
'transform': 'scaleY(' + rate + ')',
'transition': 'transform .1s'
}
);
// 正しいサイズに近くなったら属性を解除する
setTimeout(removeSize, 500);
};
$('.item_visual').on('init', slickInitial);
// リサイズ時は CLS の影響を受けないため属性を解除する
$(window).resize(removeSize);
$('.item_visual').slick({
dots: false,
arrows: false,
responsive: [{
breakpoint: 768,
settings: {
dots: true
}
}]
});
$('.slideThumb').on('click', function() {
var index = $(this).attr('data-index');
$('.item_visual').slick('slickGoTo', index, false);
})
});
</script>
<script>
$(function() {
function htmlQty(type, printerUnit, orderUnit) {
var html = ``;
if(type === 1) {
{% if Product.printer_unit %}
html += `<select id="quantity" name="quantity" style="min-width:unset;" placeholder="数量" class="form-select">`;
html += `<option value="" selected="selected">数量</option>`;
for(let i = 1; i < 31; i++) {
html += `<option value="${ i*printerUnit }">${ i*printerUnit }</option>`;
}
html += `</select>`;
{% else %}
if(orderUnit > 0) {
if(printerUnit === 0) {
printerUnit = orderUnit;
}
html += `<select id="quantity" name="quantity" style="min-width:unset;" placeholder="数量" class="form-select">`;
html += `<option value="" selected="selected">数量</option>`;
for(let i = 1; i < 31; i++) {
html += `<option value="${ i*printerUnit }">${ i*printerUnit }</option>`;
}
html += `</select>`;
} else {
html += `<input type="number" id="quantity" name="quantity" required="required" min="1" maxlength="9" style="min-width:unset; display: block !important;" placeholder="数量" class="form-control" value="1">`;
}
{% endif %}
} else {
{% if Product.order_unit %}
html += `<select id="quantity" name="quantity" style="min-width:unset;" placeholder="数量" class="form-select">`;
html += `<option value="" selected="selected">数量</option>`;
for(let i = 1; i < 31; i++) {
html += `<option value="${ i*orderUnit }">${ i*orderUnit }</option>`;
}
html += `</select>`;
{% else %}
html += `<input type="number" id="quantity" name="quantity" required="required" min="1" maxlength="9" style="min-width:unset; display: block !important;" placeholder="数量" class="form-control" value="1">`;
{% endif %}
}
return html;
}
$(".group-input-qty").html('');
$(".group-input-qty").append(htmlQty(0, {{ Product.printer_unit | default(0) }}, {{ Product.order_unit | default(0) }}));
$('.add-cart').on('click', function(event) {
{% if form.classcategory_id1 is defined %}
// 規格1フォームの必須チェック
if ($('#classcategory_id1').val() == '__unselected' || $('#classcategory_id1').val() == '') {
$('#classcategory_id1')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
return true;
} else {
$('#classcategory_id1')[0].setCustomValidity('');
}
{% endif %}
{% if form.classcategory_id2 is defined %}
// 規格2フォームの必須チェック
if ($('#classcategory_id2').val() == '__unselected' || $('#classcategory_id2').val() == '') {
$('#classcategory_id2')[0].setCustomValidity('{{ '項目が選択されていません'|trans }}');
return true;
} else {
$('#classcategory_id2')[0].setCustomValidity('');
}
{% endif %}
// 個数フォームのチェック
var isPrint = false;
if ($('#is_print').val() == 1) {
isPrint = true;
if (!$('#product_print_color').val()) {
$('#product_print_color')[0].setCustomValidity('{{ 'ネームプリントの色を選択してください。'|trans }}');
return true;
} else {
$('#product_print_color')[0].setCustomValidity('');
}
}
// 個数フォームのチェック
if (!$('#quantity').val()) {
if ($('#quantity').prop('nodeName') == 'SELECT') {
$('#quantity')[0].setCustomValidity('{{ '数量を選択してください。'|trans }}');
} else {
$('#quantity')[0].setCustomValidity('{{ '数量を入力してください。'|trans }}');
}
return true;
} else {
$('#quantity')[0].setCustomValidity('');
}
event.preventDefault();
$form = $('#form1');
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
data: $form.serialize(),
dataType: 'json',
beforeSend: function(xhr, settings) {
// Buttonを無効にする
$('.add-cart').prop('disabled', true);
}
}).done(function(data) {
// レスポンス内のメッセージをalertで表示
$.each(data.messages, function() {
$('#ec-modal-header').html(this);
});
$('.ec-modal').show()
// カートブロックを更新する
$.ajax({
url: "{{ url('block_cart') }}",
type: 'GET',
dataType: 'html'
}).done(function(html) {
$('.ec-headerRole__cart').html(html);
});
}).fail(function(data) {
alert('{{ 'カートへの追加に失敗しました。'|trans }}');
}).always(function(data) {
// Buttonを有効にする
$('.add-cart').prop('disabled', false);
});
});
$("#is_print").change(function(){
$(".group-input-qty").html('');
if ($(this).val() == 1) {
$('.form-is_repurchase').css('display', 'block');
$('.form-is_repurchase input:first').prop('checked', true);
$('.form-product-color').css('display', 'block');
$(".group-input-qty").append(htmlQty(1, {{ Product.printer_unit | default(0) }}, {{ Product.order_unit | default(0) }}));
// $("#quantity").attr('name', 'quantity').css('display', 'inline-block');
// $("#quantity_raw").attr('name', 'quantity_raw').css('display', 'none');
} else {
$('.form-is_repurchase').css('display', 'none');
$('.form-is_repurchase input').prop('checked', false);
$('.form-product-color').css('display', 'none');
$('.form-product-color select').val('');
$(".group-input-qty").append(htmlQty(0, {{ Product.printer_unit | default(0) }}, {{ Product.order_unit | default(0) }}));
// $("#quantity").attr('name', 'quantity_raw').css('display', 'none');
// $("#quantity_raw").attr('name', 'quantity').css('display', 'inline-block');
}
});
});
$('.ec-modal-wrap').on('click', function(e) {
// モーダル内の処理は外側にバブリングさせない
e.stopPropagation();
});
$('.ec-modal-overlay, .ec-modal, .ec-modal-close, .ec-inlineBtn--cancel').on('click', function() {
$('.ec-modal').hide()
});
var nIndexClass = 1;
$("#classcategory_id1 > option").each(function(k, v) {
if(this.value != "__unselected") {
$(v).attr('key', nIndexClass);
nIndexClass++;
}
});
var jsonQty = {{ Product.getAllStocks|json_encode|raw }}
var select_classcategory_id1 = 0;
$('#classcategory_id1').on('change', function(e) {
if(this.selectedIndex < 1) return false;
{% if form.classcategory_id1 is defined %}
getClass(this.selectedIndex)
{% if form.classcategory_id2 is defined %}
select_classcategory_id1 = this.selectedIndex;
{% endif %}
{% endif %}
});
$('#classcategory_id2').on('change', function(e) {
if(this.selectedIndex < 1) return false;
getClass(select_classcategory_id1, this.selectedIndex)
});
function getClass(class1, class2) {
var qty = '';
{% if form.classcategory_id1 is defined %}
qty = jsonQty[class1];
{% if form.classcategory_id2 is defined %}
qty = jsonQty[class1][class2];
{% endif %}
{% endif %}
if(qty == "0") {
$('.ec-productRole__code span.product-stock-quantity-default').html("<b>なし</b>");
} else if(!!qty === false){
$('.ec-productRole__code span.product-stock-quantity-default').html("<b>あり</b>");
}else {
qty = parseInt(qty);
$('.ec-productRole__code span.product-stock-quantity-default').html("<b>"+qty+"</b>");
}
}
// $('#is_print').change(function() {
// window.location.href = window.location.href+'?is_print='+$(this).val();
// });
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "{{ Product.name }}",
"image": [
{% for img in Product.ProductImage %}
"{{ app.request.schemeAndHttpHost }}{{ asset(img, 'save_image') }}"{% if not loop.last %},{% endif %}
{% else %}
"{{ app.request.schemeAndHttpHost }}{{ asset(''|no_image_product, 'save_image') }}"
{% endfor %}
],
"description": "{{ Product.description_list | default(Product.description_detail) | replace({'\n': '', '\r': ''}) | slice(0,300) }}",
{% if Product.code_min %}
"sku": "{{ Product.code_min }}",
{% endif %}
"offers": {
"@type": "Offer",
"url": "{{ url('product_detail', {'id': Product.id}) }}",
"priceCurrency": "{{ eccube_config.currency }}",
"price": {{ Product.getPrice02IncTaxMin ? Product.getPrice02IncTaxMin : 0}},
"availability": "{{ Product.stock_find ? "InStock" : "OutOfStock" }}"
}
}
</script>
{# --- この商品がカテゴリID=124か判定 --- #}
{% set is_calendar = false %}
{% for pc in Product.ProductCategories %}
{% if pc.Category.id == 124 %}
{% set is_calendar = true %}
{% endif %}
{% endfor %}
{% if is_calendar %}
<script>
document.addEventListener('DOMContentLoaded', function () {
// 規格1(数量パターン)
const select1 = document.getElementById('classcategory_id1')
|| document.querySelector('select[name="classcategory_id1"]');
if (!select1) return;
// 規格2(優先: #is_print、なければ classcategory_id2)
const isPrint = document.getElementById('is_print'); // 0=しない, 1=する
const select2 = isPrint || document.getElementById('classcategory_id2')
|| document.querySelector('select[name="classcategory_id2"]');
// 再版区分(表示/非表示を切り替え)
const repurchaseBlock = document.querySelector('.form-is_repurchase');
// ネームプリント切替連動(カレンダー)
const PRINT_ON_VALUES = new Set(['291', '292']); // ネームプリントあり
const PRINT_OFF_VALUES = new Set(['289', '290']); // ネームプリントなし
const PRINT_BOTH_VALUES = new Set(['288']); // 両方選択可
// classcategory_id2 用に元<option>保存(#is_printが無い場合に使う)
let original2 = null;
if (select2 && select2 !== isPrint) {
original2 = Array.from(select2.options).map(o => ({ value: o.value, text: (o.text||'').trim() }));
}
function applyRepurchaseVisibility() {
if (!repurchaseBlock) return;
if (isPrint) {
repurchaseBlock.style.display = (isPrint.value === '1') ? '' : 'none';
}
}
function setIsPrintMode(mode) {
// #is_print がある(今回の構成)場合
if (isPrint) {
isPrint.innerHTML = '';
if (mode === 'do') {
isPrint.add(new Option('ネームプリントする', '1'));
isPrint.value = '1';
} else if (mode === 'dont') {
isPrint.add(new Option('ネームプリントしない', '0'));
isPrint.value = '0';
} else if (mode === 'both') {
// ★ 両方出す
isPrint.add(new Option('ネームプリントしない', '0'));
isPrint.add(new Option('ネームプリントする', '1'));
// 初期は「しない」に寄せる(必要なら '1' に変更可)
isPrint.value = '0';
}
// 他のハンドラより後に発火させる
setTimeout(() => {
isPrint.dispatchEvent(new Event('change', { bubbles: true }));
applyRepurchaseVisibility();
}, 0);
return;
}
// #is_print が無く、classcategory_id2 を使っている場合(参考)
if (select2 && original2) {
let list = [];
if (mode === 'do') list = original2.filter(o => o.text.includes('する'));
else if (mode === 'dont') list = original2.filter(o => o.text.includes('しない'));
else /* both */ list = original2.slice();
select2.innerHTML = '';
list.forEach(o => select2.add(new Option(o.text, o.value)));
select2.selectedIndex = list.length ? 0 : -1;
setTimeout(() => {
select2.dispatchEvent(new Event('change', { bubbles: true }));
}, 0);
if (repurchaseBlock) {
repurchaseBlock.style.display = (mode === 'do') ? '' : 'none';
}
}
}
function onFirstChanged() {
const v1 = select1.value;
if (!v1 || v1 === '__unselected') {
if (repurchaseBlock) repurchaseBlock.style.display = 'none';
return;
}
if (PRINT_BOTH_VALUES.has(v1)) {
setIsPrintMode('both'); // ★ 100冊以上~ は両方
} else if (PRINT_ON_VALUES.has(v1)) {
setIsPrintMode('do');
} else if (PRINT_OFF_VALUES.has(v1)) {
setIsPrintMode('dont');
} else {
setIsPrintMode('dont');
}
}
if (isPrint) {
isPrint.addEventListener('change', applyRepurchaseVisibility);
}
function updateIsPrintOptions(mode) {
const isPrint = document.getElementById('is_print');
const repurchaseBlock = document.querySelector('.form-is_repurchase');
if (!isPrint) return;
// 一旦 option 全削除
isPrint.innerHTML = '';
if (mode === 'do') {
isPrint.add(new Option('ネームプリントする', '1'));
isPrint.value = '1';
} else if (mode === 'dont') {
isPrint.add(new Option('ネームプリントしない', '0'));
isPrint.value = '0';
} else {
isPrint.add(new Option('ネームプリントしない', '0'));
isPrint.add(new Option('ネームプリントする', '1'));
isPrint.value = '0';
}
// ネームプリント「する」なら再版選択を表示
if (repurchaseBlock) {
repurchaseBlock.style.display = (isPrint.value === '1') ? '' : 'none';
}
// イベント発火で数量 UI 切り替えなど反映
isPrint.dispatchEvent(new Event('change', { bubbles: true }));
}
select1.addEventListener('change', onFirstChanged);
onFirstChanged(); // 初期反映
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const el1 = document.getElementById('classcategory_id1') || document.querySelector('select[name="classcategory_id1"]');
const el2 = document.getElementById('classcategory_id2') || document.querySelector('select[name="classcategory_id2"]');
const out = document.getElementById('delivery-duration-text');
// 発送目安マップ
const deliveryMap = {};
{% for pc in Product.ProductClasses %}
{% set c1 = pc.ClassCategory1 ? pc.ClassCategory1.id : '' %}
{% set c2 = pc.ClassCategory2 ? pc.ClassCategory2.id : '' %}
{% set label = pc.DeliveryDuration ? pc.DeliveryDuration.name : '' %}
{% if pc.ClassCategory2 %}
deliveryMap['{{ c1 }}'] = deliveryMap['{{ c1 }}'] || {};
deliveryMap['{{ c1 }}']['{{ c2 }}'] = '{{ label|e('js') }}';
{% else %}
deliveryMap['{{ c1 }}'] = '{{ label|e('js') }}';
{% endif %}
{% endfor %}
function updateDelivery() {
if (!el1 || !out) return;
const v1 = el1.value;
if (!v1 || v1 === '__unselected') {
out.textContent = '';
return;
}
let label = '';
if (el2 && el2.value && el2.value !== '__unselected') {
if (deliveryMap[v1] && typeof deliveryMap[v1] === 'object') {
label = deliveryMap[v1][el2.value] || '';
}
} else {
label = (typeof deliveryMap[v1] === 'string') ? deliveryMap[v1] : '';
}
out.textContent = label || '';
}
if (el1) el1.addEventListener('change', updateDelivery);
if (el2) el2.addEventListener('change', updateDelivery);
updateDelivery(); // 初期表示
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const form = document.querySelector('#form1');
const select1 = document.getElementById('classcategory_id1');
const qtySelector = 'select[name="quantity"], input[name="quantity"]';
function getQtyEl() {
return document.querySelector(qtySelector);
}
function getFixedQty(v1) {
if (v1 === '291' || v1 === '289') return '50';
if (v1 === '292' || v1 === '290') return '90';
return null;
}
function enforceQuantity(showAlert = false) {
const selected = select1?.value;
const qtyEl = getQtyEl();
const fixed = getFixedQty(selected);
if (!selected || !qtyEl || !fixed) return;
if (qtyEl.value !== fixed) {
if (showAlert) alert(`この規格では数量は${fixed}個に固定されています。`);
qtyEl.value = fixed;
}
}
// 数量変更時に自動補正
document.addEventListener('change', function (e) {
if (e.target.matches(qtySelector) || e.target.id === 'classcategory_id1') {
enforceQuantity(false);
}
});
// フォーム送信時にも補正とアラート
if (form) {
form.addEventListener('submit', function () {
enforceQuantity(true);
});
}
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const select1 = document.getElementById('classcategory_id1');
const form = document.querySelector('#form1');
function getQtyEl() {
return document.querySelector('select[name="quantity"], input[name="quantity"]');
}
function getFixedQty(v1) {
if (v1 === '291' || v1 === '289') return '50';
if (v1 === '292' || v1 === '290') return '90';
return null;
}
function enforceQuantity(showAlert = false) {
const selected = select1?.value;
const qtyEl = getQtyEl();
const fixed = getFixedQty(selected);
if (!selected || !qtyEl || !fixed) return;
if (qtyEl.value !== fixed) {
if (showAlert) alert(`この規格では数量は ${fixed} 個に固定されています。`);
qtyEl.value = fixed;
}
}
function attachQtyWatcher() {
const qtyEl = getQtyEl();
if (!qtyEl) return;
qtyEl.removeEventListener('change', qtyEl._handler || (() => {}));
qtyEl._handler = () => enforceQuantity(false);
qtyEl.addEventListener('change', qtyEl._handler);
}
// セレクト1が変わるたびに数量制御イベント再アタッチ
select1?.addEventListener('change', () => {
setTimeout(() => {
enforceQuantity(false);
attachQtyWatcher();
}, 100);
});
// is_print変更時もセレクトが入れ替わるため再アタッチ
const isPrint = document.getElementById('is_print');
isPrint?.addEventListener('change', () => {
setTimeout(() => {
enforceQuantity(false);
attachQtyWatcher();
}, 100);
});
// 最初の数量セレクトにも適用
setTimeout(() => {
enforceQuantity(false);
attachQtyWatcher();
}, 300);
// フォーム送信時チェック
form?.addEventListener('submit', function (e) {
enforceQuantity(true);
});
});
</script>
{% endif %}//カレンダー終わり
{% endblock %}
{% block main %}
<div class="ec-productRole">
<div class="ec-grid2">
<div class="ec-grid2__cell">
<div class="ec-sliderItemRole">
{# 関連カテゴリ #}
{% if Product.ProductCategories is not empty %}
<div class="ec-productRole__category">
<div>{{ '関連カテゴリ'|trans }}</div>
{% for ProductCategory in Product.ProductCategories %}
<ul>
<li>
{% for Category in ProductCategory.Category.path %}
<a href="{{ url('product_list') }}?category_id={{ Category.id }}">{{ Category.name }}</a> {%- if loop.last == false %}
<span>></span>{% endif -%}
{% endfor %}
</li>
</ul>
{% endfor %}
</div>
{% endif %}
</div>
<div class="ec-sliderItemRole">
<div class="item_visual">
{% for ProductImage in Product.ProductImage %}
<div class="slide-item"><img src="{{ asset(ProductImage, 'save_image') }}" alt="{{ loop.first ? Product.name : '' }}" width="550" height="550"{% if loop.index > 1 %} loading="lazy"{% endif %}></div>
{% else %}
<div class="slide-item"><img src="{{ asset(''|no_image_product, 'save_image') }}" alt="{{ loop.first ? Product.name : '' }}" width="550" height="550"></div>
{% endfor %}
</div>
<div class="item_nav">
{% for ProductImage in Product.ProductImage %}
<div class="slideThumb" data-index="{{ loop.index0 }}"><img src="{{ asset(ProductImage, 'save_image') }}" alt="" width="133" height="133" loading="lazy"></div>
{% endfor %}
</div>
</div>
{% set sampleTagIds = [8, 12] %}
{% set hasSampleTag = false %}
{% for ProductTag in Product.ProductTag %}
{% if ProductTag.Tag.id in sampleTagIds %}
{% set hasSampleTag = true %}
{% endif %}
{% endfor %}
{% if hasSampleTag %}
<div class="ec-sliderItemRole">
<p style="text-align: center;">
<a class="ec-blockBtn--cancel" href="/contact?product_id={{ Product.id }}" target="_blank">サンプル請求</a>
</p>
</div>
<div class="ec-sliderItemRole">
<p><b>【サンプルについて】</b><br>
<b><サンプル無料マークの商品について></b><br>
こちらのの商品は3点まで組み合わせ自由、無料で発送いたします。<br>
<b><サンプルレンタルOKマークの商品について></b><br>
こちらの商品は3点まで組み合わせ自由、貸出いたします。(※発送料は弊社負担ですが、ご返却送料はお客様ご負担となります。※サンプル到着後2週間以内にご返却ください。)</p><br>
<p>※在庫状況により、ご要望に添えない場合がございます。ご了承ください。</p>
</div>
{% endif %}
</div>
<div class="ec-grid2__cell">
<div class="ec-productRole__profile">
{# 商品名 #}
<div class="ec-productRole__title">
<h2 class="ec-headingTitle">{{ Product.name }}</h2>
</div>
{# タグ #}
<ul class="ec-productRole__tags">
{% for Tag in Product.Tags %}
<li class="ec-productRole__tag tag_{{ Tag.id }}">{{ Tag }}</li>
{% endfor %}
</ul>
{# 通常価格 #}
{#{% if Product.hasProductClass -%}
<div class="ec-productRole__priceRegular">
{% if Product.getPrice01Min is not null and Product.getPrice01IncTaxMin == Product.getPrice01IncTaxMax %}
<span class="ec-productRole__priceRegularPrice">{{ '通常価格'|trans }}:<span class="price01-default">{{ Product.getPrice01IncTaxMin|price }}</span></span>
<span class="ec-productRole__priceRegularTax">{{ '税込'|trans }}</span>
{% elseif Product.getPrice01Min is not null and Product.getPrice01Max is not null %}
<span class="ec-productRole__priceRegularPrice">{{ '通常価格'|trans }}:<span class="price01-default">{{ Product.getPrice01IncTaxMin|price }}~ {{ Product.getPrice01IncTaxMax|price }}</span></span>
<span class="ec-productRole__priceRegularTax">{{ '税込'|trans }}</span>
{% endif %}
</div>
{% else %}
{% if Product.getPrice01Max is not null %}
<span class="ec-productRole__priceRegularPrice">{{ '通常価格'|trans }}:{{ Product.getPrice01IncTaxMin|price }}</span>
<span class="ec-productRole__priceRegularTax">{{ '税込'|trans }}</span>
{% endif %}
{% endif %}#}
{# 販売価格 #}
<div class="ec-productRole__price">
{% if Product.hasProductClass -%}
{% if Product.getPrice02IncTaxMin == Product.getPrice02IncTaxMax %}
<div class="ec-price">
<span class="ec-price__price price02-default">{{ Product.getPrice02IncTaxMin|price }}</span>
<span class="ec-price__tax">{{ '税込'|trans }}</span>
<span class="ec-price__price price_no_tax price_no_tax_first">{{ Product.getPrice02Min|price }}</span>
<span class="ec-price__tax price_no_tax">{{ '税抜'|trans }}</span>
</div>
{% else %}
<div class="ec-price">
<span class="ec-price__price price02-default">{{ Product.getPrice02IncTaxMin|price }} ~ {{ Product.getPrice02IncTaxMax|price }}</span>
<span class="ec-price__tax">{{ '税込'|trans }}</span><br>
<span class="ec-price__price price_no_tax">{{ Product.getPrice02Min|price }} ~ {{ Product.getPrice02Max|price }}</span>
<span class="ec-price__tax price_no_tax">{{ '税抜'|trans }}</span>
</div>
{% endif %}
{% else %}
<div class="ec-price">
<span class="ec-price__price">{{ Product.getPrice02IncTaxMin|price }}</span>
<span class="ec-price__tax">{{ '税込'|trans }}</span>
<span class="ec-price__price price_no_tax price_no_tax_first">{{ Product.getPrice02Min|price }}</span>
<span class="ec-price__tax price_no_tax">{{ '税抜'|trans }}</span>
</div>
{% endif %}
</div>
{# 商品コード #}
{% if Product.code_min is not empty %}
<div class="ec-productRole__code">
{{ '商品コード'|trans }}: <span class="product-code-default">{{ Product.code_min }}{% if Product.code_min != Product.code_max %} ~ {{ Product.code_max }}{% endif %}</span>
</div>
{% endif %}
{% if not is_calendar %}
<div class="ec-productRole__code">
{{ '在庫'|trans }}: <span class="product-stock-quantity-default"></span>
</div>
{% endif %}
{% if is_calendar %}
<div class="ec-productRole__code">
発送日目安:<span id="delivery-duration-text"></span>
</div>
{% endif %}
<br>
<div class="ec-productRole__description">{{ Product.description_detail|raw|nl2br }}
</div>
<form action="{{ url('product_add_cart', {id:Product.id}) }}" method="post" id="form1" name="form1">
{% if Product.stock_find %}
<div class="ec-productRole__actions">
{% if form.classcategory_id1 is defined %}
<div class="ec-select">
{{ form_row(form.classcategory_id1, {'label':false}) }}
{{ form_errors(form.classcategory_id1) }}
</div>
{% if form.classcategory_id2 is defined %}
<div class="ec-select">
{{ form_row(form.classcategory_id2, {'label':false}) }}
{{ form_errors(form.classcategory_id2) }}
</div>
{% endif %}
{% endif %}
{% if Product.product_print_type == false %}
{% set colors = Product.product_print_color|split(',') %}
{% if Product.product_print_type == false and colors|length > 0 %}
<div class="row mb-2">
<div class="col-4">
<div class="ec-select">
{{ form_widget(form.is_print, {'attr': {'style':'min-width:unset', 'id': 'is_print'}}) }}
{{ form_errors(form.is_print) }}
</div>
</div>
<div class="col-6 form-is_repurchase" style="display: none">
<div class="form-check mt-2">
{{ form_widget(form.is_repurchase, {'label_attr': {'class': 'radio-inline'}}) }}
{{ form_errors(form.is_repurchase) }}
</div>
</div>
</div>
<div class="row form-product-color" style="display: none">
<div class="col-5">
<div class="ec-select">
<div class="mb-3">
{{ form_widget(form.product_print_color, {'attr': {'style':'min-width:unset'}}) }}
{{ form_errors(form.product_print_color) }}
</div>
</div>
</div>
</div>
{% endif %}
{% endif %}
<div class="row">
<div class="col-3">
<div class="{% if Product.order_unit %}ec-select{% else %}ec-numberInput{% endif %} mt-2 group-input-qty">
{{ form_widget(form.quantity, {'attr': {'style':'min-width:unset;display: none;', 'placeholder': '数量'}}) }}
{# {{ form_widget(form.quantity_raw, {'attr': {'style':'min-width: unset;display: none', 'placeholder': '数量'}}) }}#}
{{ form_errors(form.quantity) }}
</div>
</div>
<div class="col-8">
<button type="submit" class="ec-blockBtn--action add-cart">
{{ 'カートに入れる'|trans }}
</button>
</div>
</div>
</div>
{% else %}
<div class="ec-productRole__btn">
<button type="button" class="ec-blockBtn--action" disabled="disabled">
{{ 'ただいま品切れ中です。'|trans }}
</button>
</div>
{% endif %}
{{ form_rest(form) }}
</form>
<div class="ec-modal">
<div class="ec-modal-overlay">
<div class="ec-modal-wrap">
<span class="ec-modal-close"><span class="ec-icon"><img src="{{ asset('assets/icon/cross-dark.svg') }}" alt=""/></span></span>
<div id="ec-modal-header" class="text-center">{{ 'カートに追加しました。'|trans }}</div>
<div class="ec-modal-box">
<div class="ec-role">
<span class="ec-inlineBtn--cancel">{{ 'お買い物を続ける'|trans }}</span>
<a href="{{ url('cart') }}" class="ec-inlineBtn--action">{{ 'カートへ進む'|trans }}</a>
</div>
</div>
</div>
</div>
</div>
<div class="ec-productRole__SNS">
<a href="https://twitter.com/share" class="twitter-share-button" data-via="lemanze" data-lang="ja" data-count="none">ツイート</a>
<script>
!function(d,s,id){
var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';
if(!d.getElementById(id)){
js=d.createElement(s);
js.id=id;
js.src=p+'://platform.twitter.com/widgets.js';
fjs.parentNode.insertBefore(js,fjs);
}
}(document, 'script', 'twitter-wjs');
</script>
<div class="line-it-button" data-lang="ja" data-type="share-a" data-env="REAL" data-url="{{ url('product_detail', {'id': Product.id}) }}" data-color="default" data-size="small" data-count="true" data-ver="3" style="display: none;"></div>
<script src="https://www.line-website.com/social-plugins/js/thirdparty/loader.min.js" async="async" defer="defer"></script>
</div>
{% if BaseInfo.option_favorite_product %}
<form action="{{ url('product_add_favorite', {id:Product.id}) }}" method="post">
<div class="ec-productRole__btn">
{% if is_favorite == false %}
<button type="submit" id="favorite" class="ec-blockBtn--cancel">
{{ 'お気に入りに追加'|trans }}
</button>
{% else %}
<button type="submit" id="favorite" class="ec-blockBtn--cancel"
disabled="disabled">{{ 'お気に入りに追加済です。'|trans }}
</button>
{% endif %}
</div>
</form>
{% endif %}
{% if Product.freearea %}
<div class="ec-productRole__description">
{{ include(template_from_string(Product.freearea|raw|nl2br)) }}
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}