{#
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 = 'front_page' %}
{% block stylesheet %}
<link rel="stylesheet" href="{{ asset('assets/css/main_style.css', 'user_data') }}">
<link rel="stylesheet" href="{{ asset('assets/css/main_module.css', 'user_data') }}">
<style>
.new {
position: absolute;
top: -1%;
left: -2%;
width: 40%;
height: 19%;
background: linear-gradient(to top left, transparent 50%, #df0b75 50%);
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
transform-origin: top left;
color: white;
clip-path: polygon(0 60%, 60% 0, 100% 0, 0 100%);
}
.new-text {
position: absolute;
color: #ffffff;
font-weight: bold;
font-size: 1em;
text-align: center;
line-height: 3em;
transform: rotate(-45deg) translate(-10%,-30%);
}
</style>
{% endblock %}
{% block main %}
<!-- ファーストビュー -->
<section class="first-carousel">
<div class="carousel">
{# ダミー: 最後の画像(ループ用) #}
<a class="car-cont"><img src="{{ asset('assets/img/mv3.png', 'user_data') }}" alt="slide3" /></a>
{# 本来のスライド #}
<a class="car-cont"><img src="{{ asset('assets/img/mv1.png', 'user_data') }}" alt="slide1" /></a>
<a class="car-cont"><img src="{{ asset('assets/img/mv2.png', 'user_data') }}" alt="slide2" /></a>
<a class="car-cont"><img src="{{ asset('assets/img/mv3.png', 'user_data') }}" alt="slide3" /></a>
<a class="car-cont"><img src="{{ asset('assets/img/mv2.png', 'user_data') }}" alt="slide4" /></a>
{# ダミー: 最初の画像(ループ用) #}
<a class="car-cont"><img src="{{ asset('assets/img/mv1.png', 'user_data') }}" alt="slide1" /></a>
</div>
<div class="carousel-dots">
<span class="dot active"></span>
<span class="dot"></span>
<span class="dot"></span>
<span class="dot"></span>
</div>
<div class="carousel-btn prev-btn" style="display:none;">←</div>
<div class="carousel-btn next-btn" style="display:none;">→</div>
</section>
{% block javascript %}
<script>
window.addEventListener("load", function () {
const carousel = document.querySelector(".carousel");
const dots = document.querySelectorAll(".dot");
let slides = Array.from(document.querySelectorAll(".carousel a"));
const firstClone = slides[0].cloneNode(true);
const lastClone = slides[slides.length - 1].cloneNode(true);
carousel.appendChild(firstClone);
carousel.insertBefore(lastClone, slides[0]);
slides = Array.from(document.querySelectorAll(".carousel a"));
let currentIndex = 1;
let slideWidth = slides[0].offsetWidth + 40;
let isTransitioning = false;
function updateSlidePosition(withTransition = false) {
carousel.style.transition = withTransition ? "transform 2s ease-in-out" : "none";
carousel.style.transform = `translateX(${-slideWidth * currentIndex}px)`;
}
function updateDots() {
dots.forEach(dot => dot.classList.remove("active"));
const activeDotIndex = (currentIndex - 1 + dots.length) % dots.length;
dots[activeDotIndex].classList.add("active");
}
function updateActiveSlide() {
slides.forEach(slide => slide.classList.remove("active"));
slides[currentIndex]?.classList.add("active");
}
function goToSlide(index) {
if (isTransitioning) return; // ← 連打・タイミングずれ防止
isTransitioning = true;
currentIndex = index;
updateSlidePosition(true);
updateDots();
updateActiveSlide();
}
// 無限ループ処理(修正済)
carousel.addEventListener("transitionend", () => {
if (currentIndex === 0) {
currentIndex = slides.length - 2;
carousel.style.transition = "none";
carousel.style.transform = `translateX(${-slideWidth * currentIndex}px)`;
updateActiveSlide();
} else if (currentIndex === slides.length - 1) {
currentIndex = 1;
carousel.style.transition = "none";
carousel.style.transform = `translateX(${-slideWidth * currentIndex}px)`;
updateActiveSlide();
}
isTransitioning = false; // ← 切り替え終わったら解放
});
document.querySelector(".prev-btn")?.addEventListener("click", () => goToSlide(currentIndex - 1));
document.querySelector(".next-btn")?.addEventListener("click", () => goToSlide(currentIndex + 1));
dots.forEach((dot, idx) => {
dot.addEventListener("click", () => goToSlide(idx + 1));
});
window.addEventListener("resize", () => {
slideWidth = slides[0].offsetWidth + 40;
updateSlidePosition();
});
updateSlidePosition();
updateActiveSlide();
updateDots();
// 自動スライド(isTransitioning考慮)
let autoSlideInterval = setInterval(() => {
if (!isTransitioning) {
goToSlide(currentIndex + 1);
}
}, 4500);
document.addEventListener("visibilitychange", () => {
if (document.hidden) {
clearInterval(autoSlideInterval);
} else {
autoSlideInterval = setInterval(() => {
if (!isTransitioning) {
goToSlide(currentIndex + 1);
}
}, 4500);
}
});
});
</script>
{% endblock %}
<!-- メインコンテンツ -->
<main class="main-content">
<!-- 上位コンテンツ -->
<section class="special-1">
<div class="bg-blue-1"></div>
<!-- 新刊 -->
<h2 class="newbook-title"><img src="{{ asset('assets/img/title_ic_newbook.svg', 'user_data') }}" alt="new-books" class="newbook-icon"> 新刊案内</h2>
<div class="pipe-line">
<div class="pipe">
<div class="line"></div>
</div>
<div class="white"></div>
</div>
{# まず、Tag.id==1の商品だけ別に集める #}
{% set newTaggedProducts = [] %}
{% for Product in Products %}
{% for ProductTag in Product.ProductTag %}
{% if ProductTag.Tag.id == 1 %}
{% set newTaggedProducts = newTaggedProducts|merge([Product]) %}
{% endif %}
{% endfor %}
{% endfor %}
{# その上でランダムシャッフルして5件だけ抜く #}
{% set newTaggedRandomProducts = [] %}
{% set newTaggedworkingProducts = newTaggedProducts %}
{% for i in 0..4 %}
{#{% set randomProducts = randomProducts|merge([random(taggedProducts)]) %}#}
{% if newTaggedworkingProducts|length > 0 %}
{% set newTaggedRandomIndex = random(newTaggedworkingProducts|keys) %}
{% set newTaggedrandomProduct = newTaggedworkingProducts[newTaggedRandomIndex] %}
{% set newTaggedRandomProducts = newTaggedRandomProducts|merge([newTaggedrandomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set newTaggedworkingProducts = newTaggedworkingProducts|filter(p => p != newTaggedrandomProduct) %}
{% endif %}
{% endfor %}
<div class="content-1">
{% for Product in newTaggedRandomProducts %}
<div class="card-1">
{% for ProductTags in Product.ProductTag %}
{% if ProductTags.Tag.id == 1 %}
<div class="new">
<div class="new-text">New</div>
</div>
{% endif %}
{% endfor %}
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h3>{{Product.name}}</h3>
<p>著者:<span>{{Product.author}}</span></p>
<p>¥<span>{{ Product.getPrice02IncTaxMax|number_format(0, '.', ',') }}</span>税込</p>
</div>
{% endfor %}
</div>
<!-- オススメ書籍 -->
<h2 class="newbook-title"><img src="{{ asset('assets/img/title_ic_recommend.svg', 'user_data') }}" alt="new-books" class="newbook-icon"> オススメ書籍</h2>
<div class="pipe-line">
<div class="pipe">
<div class="line"></div>
</div>
<div class="blue"></div>
</div>
{# まず、Tag.id==1の商品だけ別に集める #}
{% set taggedProducts = [] %}
{% for Product in Products %}
{% for ProductTag in Product.ProductTag %}
{% if ProductTag.Tag.id == 2 %}
{% set taggedProducts = taggedProducts|merge([Product]) %}
{% endif %}
{% endfor %}
{% endfor %}
{# その上でランダムシャッフルして5件だけ抜く #}
{% set randomProducts = [] %}
{% set workingProducts = taggedProducts %}
{% for i in 0..4 %}
{#{% set randomProducts = randomProducts|merge([random(taggedProducts)]) %}#}
{% if workingProducts|length > 0 %}
{% set randomIndex = random(workingProducts|keys) %}
{% set randomProduct = workingProducts[randomIndex] %}
{% set randomProducts = randomProducts|merge([randomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
{% endif %}
{% endfor %}
<div class="content-1">
{% for Product in randomProducts %}
<div class="card-1">
{% for ProductTags in Product.ProductTag %}
{% if ProductTags.Tag.id == 1 %}
<div class="new">
<div class="new-text">New</div>
</div>
{% endif %}
{% endfor %}
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h3>{{Product.name}}</h3>
<p>著者:<span>{{Product.author}}</span></p>
<p>¥<span>{{ Product.getPrice02IncTaxMax|number_format(0, '.', ',') }}</span>税込</p>
</div>
{% endfor %}
</div>
</section>
<!-- 中盤コンテンツ -->
<section class="special-2">
<!-- 売れ筋ランキング -->
<h2 class="newbook-title"><img src="{{ asset('assets/img/title_ic_ranking.svg', 'user_data') }}" alt="ranking" class="newbook-icon"> 売れ筋ランキング</h2>
<div class="pipe-line">
<div class="pipe">
<div class="line"></div>
</div>
<div class="green"></div>
</div>
<div class="content-2">
{% set rankTaggedProducts = [] %}
{% for Product in Products %}
{% for ProductTag in Product.ProductTag %}
{% if ProductTag.Tag.id >=3 and ProductTag.Tag.id<=9 %}
{% set rankTaggedProducts = rankTaggedProducts|merge([{'product': Product, 'tag_id': ProductTag.Tag.id}]) %}
{% endif %}
{% endfor %}
{% endfor %}
{% set rankTaggedProducts = rankTaggedProducts|sort((a, b) => a.tag_id <=> b.tag_id) %}
{% for Product in rankTaggedProducts %}
<div class="card-2">
<div class="lank">
<div class="lank-num">{{Product.tag_id - 2}}</div>
</div>
{% for ProductTags in Product.product.ProductTag %}
{% if ProductTags.Tag.id == 1 %}
<div class="new">
<div class="new-text">New</div>
</div>
{% endif %}
{% endfor %}
<a href="{{ url('product_detail', {'id': Product.product.id}) }}">
<img src="{{asset(Product.product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h3>{{Product.product.name}}</h3>
<p>著者:<span>{{Product.product.author}}</span></p>
<p>¥<span>{{ Product.product.getPrice02IncTaxMax|number_format(0, '.', ',') }}</span>税込</p>
</div>
{% endfor %}
</div>
<!-- 最近チェック -->
{% if RecentlyViewedProducts|length > 0 %}
<h2 class="newbook-title"><img src="{{ asset('assets/img/title_ic_check.svg', 'user_data')}}" alt="check" class="newbook-icon"> 最近チェックした商品</h2>
<div class="pipe-line">
<div class="pipe">
<div class="line"></div>
</div>
<div class="green"></div>
</div>
{{ render(path('block_recently_viewed_products')) }}
{% endif %}
{#あなたへのおすすめ#}
{% if is_granted('ROLE_USER') %}
<h2><img src="{{asset('assets/img/title_ic_check.svg', 'user_data') }}" alt="あなたへのオススメ"> あなたへのオススメ</2>
<div class="pipe-line">
<div class="pipe">
<div class="line"></div>
</div>
<div class="green"></div>
</div>
<div class="content-2">
{# ランダムシャッフルして7件だけ抜く #}
{% set randomProducts = [] %}
{% set workingProducts = recommendProducts %}
{% for i in 0..6 %}
{#{% set randomProducts = randomProducts|merge([random(taggedProducts)]) %}#}
{% if workingProducts|length > 0 %}
{% set randomIndex = random(workingProducts|keys) %}
{% set randomProduct = workingProducts[randomIndex] %}
{% set randomProducts = randomProducts|merge([randomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
{% endif %}
{% endfor %}
{% for Product in randomProducts %}
<div class="card-2 osusume">
{% for ProductTags in Product.ProductTag %}
{% if ProductTags.Tag.id == 1 %}
<div class="new">
<div class="new-text">New</div>
</div>
{% endif %}
{% endfor %}
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h3>{{Product.name}}</h3>
<p>著者:<span>{{Product.author}}</span></p>
<p>¥<span>{{ Product.getPrice02IncTaxMax|number_format(0, '.', ',') }}</span>税込</p>
</div>
{% endfor %}
</div>
{% endif %}
</section>
<style>
.ec-historyRole {
padding: 0;
}
.ec-historyRole__heading {
display: none;
}
</style>
<!-- 下位コンテンツ -->
<section class="special-3">
<h2 class="newbook-title"><img src="{{ asset('assets/img/title_ic_category.svg', 'user_data') }} " alt="" class="newbook-icon"> 書籍カテゴリー</h2>
<div class="pipe-line">
<div class="pipe">
<div class="line"></div>
</div>
<div class="white"></div>
</div>
{# まず、Category.id==1の商品だけ別に集める #}
{% set CategoryProducts = [] %}
{% for Product in Products %}
{% for ProductCategory in Product.ProductCategories %}
{% if ProductCategory.Category.id == 1 %}
{% set CategoryProducts = CategoryProducts|merge([Product]) %}
{% endif %}
{% endfor %}
{% endfor %}
{# その上でランダムシャッフルして5件だけ抜く #}
{% set randomProducts = [] %}
{% set workingProducts = CategoryProducts %}
{% for i in 0..4 %}
{% if workingProducts|length > 0 %}
{% set randomIndex = random(workingProducts|keys) %}
{% set randomProduct = workingProducts[randomIndex] %}
{% set randomProducts = randomProducts|merge([randomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
{% endif %}
{% endfor %}
<div class="content-3">
<!-- 鉄道 -->
<div class="sub-cont">
<div class="con-title">
<h3>鉄道</h3>
<a href="{{ url('product_list') }}?category_id=1" class="list-link">
<span class="list-btn">一覧はコチラ</span>
<span class="btn-l">→</span>
</a>
</div>
<div class="zone">
{% for Product in randomProducts %}
<div class="card-3">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h4>{{Product.name}}</h4>
</div>
{% endfor %}
</div>
</div>
{# まず、Category.id==2の商品だけ別に集める #}
{% set CategoryProducts = [] %}
{% for Product in Products %}
{% for ProductCategory in Product.ProductCategories %}
{% if ProductCategory.Category.id == 2 %}
{% set CategoryProducts = CategoryProducts|merge([Product]) %}
{% endif %}
{% endfor %}
{% endfor %}
{# その上でランダムシャッフルして5件だけ抜く #}
{% set randomProducts = [] %}
{% set workingProducts = CategoryProducts %}
{% for i in 0..4 %}
{% if workingProducts|length > 0 %}
{% set randomIndex = random(workingProducts|keys) %}
{% set randomProduct = workingProducts[randomIndex] %}
{% set randomProducts = randomProducts|merge([randomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
{% endif %}
{% endfor %}
<!-- バス -->
<div class="sub-cont">
<div class="con-title">
<h3>バス</h3>
<a href="{{ url('product_list') }}?category_id=2" class="list-link">
<span class="list-btn">一覧はコチラ</span>
<span class="btn-l">→</span>
</a>
</div>
<div class="zone">
{% for Product in randomProducts %}
<div class="card-3">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h4>{{Product.name}}</h4>
</div>
{% endfor %}
</div>
</div>
<!-- 古地図・歴史散歩(地域) -->
<div class="sub-cont">
<div class="con-title">
<h3>古地図・歴史散歩(地域)</h3>
<a href="" class="list-link">
<span class="list-btn">一覧はコチラ</span>
<span class="btn-l">→</span>
</a>
</div>
{# まず、Category.id==5の商品だけ別に集める #}
{% set CategoryProducts = [] %}
{% for Product in Products %}
{% for ProductCategory in Product.ProductCategories %}
{% if ProductCategory.Category.id == 5 %}
{% set CategoryProducts = CategoryProducts|merge([Product]) %}
{% endif %}
{% endfor %}
{% endfor %}
{# その上でランダムシャッフルして5件だけ抜く #}
{% set randomProducts = [] %}
{% set workingProducts = CategoryProducts %}
{% for i in 0..4 %}
{% if workingProducts|length > 0 %}
{% set randomIndex = random(workingProducts|keys) %}
{% set randomProduct = workingProducts[randomIndex] %}
{% set randomProducts = randomProducts|merge([randomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
{% endif %}
{% endfor %}
<div class="zone">
{% for Product in randomProducts %}
<div class="card-3">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h4>{{Product.name}}</h4>
</div>
{% endfor %}
</div>
</div>
<!-- その他 -->
<div class="sub-cont">
<div class="con-title">
<h3>その他</h3>
<a href="" class="list-link">
<span class="list-btn">一覧はコチラ</span>
<span class="btn-l">→</span>
</a>
</div>
{# まず、Category.id==7の商品だけ別に集める #}
{% set CategoryProducts = [] %}
{% for Product in Products %}
{% for ProductCategory in Product.ProductCategories %}
{% if ProductCategory.Category.id == 7 %}
{% set CategoryProducts = CategoryProducts|merge([Product]) %}
{% endif %}
{% endfor %}
{% endfor %}
{# その上でランダムシャッフルして5件だけ抜く #}
{% set randomProducts = [] %}
{% set workingProducts = CategoryProducts %}
{% for i in 0..4 %}
{% if workingProducts|length > 0 %}
{% set randomIndex = random(workingProducts|keys) %}
{% set randomProduct = workingProducts[randomIndex] %}
{% set randomProducts = randomProducts|merge([randomProduct]) %}
{# 選んだやつをworkingProductsから除外する #}
{% set workingProducts = workingProducts|filter(p => p != randomProduct) %}
{% endif %}
{% endfor %}
<div class="zone">
{% for Product in randomProducts %}
<div class="card-3">
<a href="{{ url('product_detail', {'id': Product.id}) }}">
<img src="{{asset(Product.main_list_image|no_image_product, 'save_image') }}" class="" alt="コンテンツ1"/>
</a>
<h4>{{Product.name}}</h4>
</div>
{% endfor %}
</div>
</div>
</section>
</main>
{% endblock %}