wyyl/beike/Shop/View/Components/Breadcrumb.php

301 lines
7.9 KiB
PHP

<?php
/**
* BreadCrumb.php
*
* @copyright 2022 beikeshop.com - All Rights Reserved
* @link https://beikeshop.com
* @author Edward Yang <yangjin@guangda.work>
* @created 2022-08-17 22:45:42
* @modified 2022-08-17 22:45:42
*/
namespace Beike\Shop\View\Components;
use Beike\Models\Page;
use Beike\Models\PageCategory;
use Beike\Models\Product;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Illuminate\View\Component;
class Breadcrumb extends Component
{
public Collection $breadcrumbs;
/**
* Create a new component instance.
*
* @return void
* @throws \Exception
*/
public function __construct($type, $value, array $text = [])
{
$breadcrumbs[] = [
'title' => trans('shop/common.home'),
'url' => shop_route('home.index'),
];
if ($type == 'category') {
$breadcrumbs = array_merge($breadcrumbs, $this->handleCategoryLinks($value));
} elseif ($type == 'product') {
$breadcrumbs = array_merge($breadcrumbs, $this->handleProductLinks($value));
} elseif ($type == 'order') {
$breadcrumbs = array_merge($breadcrumbs, $this->handleOrderLinks($value));
} elseif ($type == 'rma') {
$breadcrumbs = array_merge($breadcrumbs, $this->handleRmaLinks($value));
} elseif ($type == 'page') {
$breadcrumbs = array_merge($breadcrumbs, $this->handlePageLinks($value));
} elseif ($type == 'page_category') {
$breadcrumbs = array_merge($breadcrumbs, $this->handlePageCategoryLinks($value));
} elseif (Str::startsWith($value, 'account')) {
$breadcrumbs = array_merge($breadcrumbs, $this->handleAccountLinks($value));
} else {
$breadcrumbs = array_merge($breadcrumbs, $this->handleLinks($type, $value, $text));
}
$this->breadcrumbs = collect($breadcrumbs);
}
/**
* Get the view / contents that represent the component.
*
* @return View|
*/
public function render(): View
{
return view('components.breadcrumbs');
}
/**
* 获取分类以及路径
*
* @param $value
* @return array
* @throws \Exception
*/
private function handleCategoryLinks($value): array
{
$link = handle_link(['type' => 'category', 'value' => $value]);
return [
[
'title' => $link['text'],
'url' => $link['link'],
],
];
}
/**
* 获取商品以及分类路径
*
* @param $value
* @return array
* @throws \Exception
*/
private function handleProductLinks($value): array
{
$links = [];
$productId = 0;
if (is_array($value)) {
$productId = $value['id'] ?? 0;
} elseif (is_int($value)) {
$productId = $value;
}
$product = Product::query()->find($productId);
$category = $product->categories()->first();
if ($category) {
$categoryLink = handle_link(['type' => 'category', 'value' => $category]);
$links[] = ['title' => $categoryLink['text'], 'url' => $categoryLink['link']];
}
$productLink = handle_link(['type' => 'product', 'value' => $value]);
$links[] = ['title' => $productLink['text'], 'url' => $productLink['link']];
return $links;
}
/**
* 获取订单详情页面包屑
*
* @param $value
* @return array
* @throws \Exception
*/
private function handleOrderLinks($value): array
{
$links = [];
$link = handle_link(['type' => 'static', 'value' => 'account.index']);
$links[] = [
'title' => $link['text'],
'url' => $link['link'],
];
$link = handle_link(['type' => 'static', 'value' => 'account.order.index']);
$links[] = [
'title' => $link['text'],
'url' => $link['link'],
];
$link = handle_link(['type' => 'order', 'value' => $value]);
$links[] = [
'title' => $value,
'url' => $link['link'],
];
return $links;
}
/**
* 获取订单详情页面包屑
*
* @param $value
* @return array
* @throws \Exception
*/
private function handleRmaLinks($value): array
{
$links = [];
$link = handle_link(['type' => 'static', 'value' => 'account.index']);
$links[] = [
'title' => $link['text'],
'url' => $link['link'],
];
$link = handle_link(['type' => 'static', 'value' => 'account.rma.index']);
$links[] = [
'title' => $link['text'],
'url' => $link['link'],
];
$link = handle_link(['type' => 'rma', 'value' => $value]);
$links[] = [
'title' => $value,
'url' => $link['link'],
];
return $links;
}
/**
* 获取文章页面包屑
*
* @param $value
* @return array
* @throws \Exception
*/
private function handlePageLinks($value): array
{
$pageId = 0;
if (is_array($value)) {
$pageId = $value['id'] ?? 0;
} elseif (is_int($value)) {
$pageId = $value;
}
if (empty($pageId)) {
return [];
}
$links = [];
$page = Page::query()->find($pageId);
$category = $page->category;
if ($category) {
$categoryLink = handle_link(['type' => 'page_category', 'value' => $category]);
$links[] = ['title' => $categoryLink['text'], 'url' => $categoryLink['link']];
}
$productLink = handle_link(['type' => 'page', 'value' => $value]);
$links[] = ['title' => $productLink['text'], 'url' => $productLink['link']];
return $links;
}
/**
* 获取文章页面包屑
*
* @param $value
* @return array
* @throws \Exception
*/
private function handlePageCategoryLinks($value): array
{
$id = 0;
if (is_array($value)) {
$id = $value['id'] ?? 0;
} elseif (is_int($value)) {
$id = $value;
}
if (empty($id)) {
return [];
}
$links = [];
$category = PageCategory::query()->find($id);
if ($category) {
$categoryLink = handle_link(['type' => 'page_category', 'value' => $category]);
$links[] = ['title' => $categoryLink['text'], 'url' => $categoryLink['link']];
}
return $links;
}
/**
* 处理个人中心面包屑
*
* @param $value
* @return array[]
* @throws \Exception
*/
private function handleAccountLinks($value): array
{
$links = [];
$values = explode('.', $value);
if (count($values) == 3) {
$link = handle_link(['type' => 'static', 'value' => 'account.index']);
$links[] = [
'title' => $link['text'],
'url' => $link['link'],
];
}
$link = handle_link(['type' => 'static', 'value' => $value]);
$links[] = [
'title' => $link['text'],
'url' => $link['link'],
];
return $links;
}
/**
* 获取普通链接
*
* @param $type
* @param $value
* @param array $text
* @return array
* @throws \Exception
*/
private function handleLinks($type, $value, array $text = []): array
{
$data = [
'type' => $type,
'value' => $value,
'text' => $text,
];
$link = handle_link($data);
return [
[
'title' => $link['text'],
'url' => $link['link'],
],
];
}
}