Manage homepage by article, modify article template, enhance basket (add selector)

This commit is contained in:
Ludovic CANDELLIER
2022-03-24 00:48:26 +01:00
parent ddc5f2664c
commit c65056531c
13 changed files with 277 additions and 148 deletions

View File

@@ -43,6 +43,28 @@ class ArticlesDataTable extends DataTable
public function modifier($datatables)
{
$datatables
->editColumn('visible', function (Article $article) {
return view("components.form.toggle", [
'name' => 'visible',
'value' => $article->visible,
'on' => __('oui'),
'off' => __('non'),
'meta' => 'data-id=' . $article->id,
'size' => 'sm',
'class' => 'visible',
]);
})
->editColumn('homepage', function (Article $article) {
return view("components.form.toggle", [
'name' => 'homepage',
'value' => $article->homepage,
'on' => __('oui'),
'off' => __('non'),
'meta' => 'data-id=' . $article->id,
'size' => 'sm',
'class' => 'homepage',
]);
})
->editColumn('thumb', function (Article $article) {
$image = Articles::getFullImageByArticle($article);
return '<img src="' . Articles::getThumbSrc($image) . '">';
@@ -64,6 +86,8 @@ class ArticlesDataTable extends DataTable
protected function getColumns()
{
return [
Column::make('visible')->title('Visible')->searchable(false),
Column::make('homepage')->title('Accueil')->searchable(false),
Column::make('article_nature.name')->title('Nature'),
Column::make('thumb')->title('')->searchable(false)->orderable(false)->width(40)->class('text-center'),
Column::make('name')->title('Nom'),

View File

@@ -89,4 +89,17 @@ class ArticleController extends Controller
$index = $request->input('index');
return Articles::deleteImage($id, $index);
}
public function toggleVisible(Request $request)
{
$data = Articles::toggleVisible($request->input('id'), ($request->input('visible') == 'true') ? 1 : 0);
return response()->json(['error' => 0]);
}
public function toggleHomepage(Request $request)
{
$data = Articles::toggleHomepage($request->input('id'), ($request->input('homepage') == 'true') ? 1 : 0);
return response()->json(['error' => 0]);
}
}

View File

@@ -27,16 +27,17 @@ class BasketController extends Controller
if (ShopCart::has($offer_id)) {
$ret = ShopCart::remove($offer_id);
}
$data = Offers::getBasketData($offer_id, $quantity);
$ret = ShopCart::add($data);
$data = $quantity ? Offers::getBasketData($offer_id, $quantity) : false;
$ret = $data ? ShopCart::add($data) : false;
return true;
}
public function basket()
{
$data = self::init();
$data['basket'] = Offers::getBasket();
dump($data['basket']->toArray());
exit;
//dump($data['basket']);
// exit;
return view('Shop.Baskets.basket', $data);
}

View File

@@ -131,4 +131,9 @@ class Article extends Model implements HasMedia
{
return $query->where($this->table . '.visible', 1);
}
public function scopeHomepage($query)
{
return $query->where($this->table . '.homepage', 1);
}
}

View File

@@ -133,21 +133,36 @@ class Articles
$data[] = [
'id' => $shelve->id,
'name' => $shelve->name,
'articles' => self::getArticlesToSell($shelve->id),
'articles' => self::getArticlesToSell([
'category_id' => $shelve->id,
'homepage' => true,
]),
];
}
return $data;
}
public static function getArticlesToSell($category_id = false, $tags = false)
public static function getArticlesToSell($options)
{
$articles = self::getArticlesWithOffers($category_id, $tags);
$articles = self::getArticlesWithOffers($options);
foreach ($articles as $article) {
$price_lists = $article->offers[0]->tariff->price_lists->toArray();
// dump($price_lists);
if (count($price_lists)) {
if (!is_array($data[$article->name] ?? false)) {
$data[$article->name] = [
$data[$article->name] = self::getDataForSale($article);
}
$prices = $price_lists[0]['price_list_values'][0];
$article_nature_name = strtolower($article->article_nature->name);
$data[$article->name][$article_nature_name] = self::getDataPriceForSale($article, $prices);
}
}
return $data ?? false;
}
public static function getDataForSale($article)
{
return [
'id' => $article->id,
'description' => (!empty($article->description)) ? $article->description : $article->product->description,
'image' => self::getFullImageByArticle($article),
@@ -157,10 +172,10 @@ class Articles
'parent_name' => trim(str_replace($article->product->name, '', $article->name)),
];
}
$prices = $price_lists[0]['price_list_values'][0];
$article_nature_name = strtolower($article->article_nature->name);
// dump($prices);
$data[$article->name][$article_nature_name] = [
public static function getDataPriceForSale($article, $prices)
{
return [
'article_id' => $article->id,
'offer_id' => $article->offers[0]->id,
'quantity' => $prices['quantity'],
@@ -168,14 +183,14 @@ class Articles
'variation' => $article->offers[0]->variation->name,
];
}
}
return $data ?? false;
}
public static function getArticlesWithOffers($category_id = false, $tags = false, $sale_channel_id = false)
public static function getArticlesWithOffers($options = false)
{
$sale_channel_id = $sale_channel_id ? $sale_channel_id : SaleChannels::getDefaultID();
return Article::byCategory($category_id)->byTags($tags)->visible()->withAvailableOffers($sale_channel_id)->with([
$category_id = $options['category_id'] ?? false;
$sale_channel_id = $options['sale_channel_id'] ?? SaleChannels::getDefaultID();
$tags = $options['tags'] ?? false;
$model = ($options['homepage'] ?? false) ? Article::homepage()->visible() : Article::visible();
return $model->byCategory($category_id)->byTags($tags)->withAvailableOffers($sale_channel_id)->with([
'image',
'product',
'article_nature',
@@ -187,6 +202,7 @@ class Articles
])->get();
}
public static function getFull($id)
{
$data['article'] = self::getArticleEdit($id);
@@ -452,4 +468,15 @@ class Articles
{
return Tag::storeTags($article, $tags);
}
public static function toggleVisible($id, $visible)
{
return self::update(['visible' => $visible], $id);
}
public static function toggleHomepage($id, $homepage)
{
return self::update(['homepage' => $homepage], $id);
}
}

View File

@@ -18,11 +18,22 @@ class Offers
public static function getBasket()
{
$basket = ShopCart::getContent();
$offers = Offer::with(['variation', 'article.article_nature'])->whereIn('id', ShopCart::keys())->get();
dump($basket->toArray());
dump($offers->toArray());
exit;
return $data;
// dump($basket->toArray());
$offers = Offer::with(['variation', 'article.article_nature', 'article.image'])->whereIn('id', ShopCart::keys())->get();
foreach ($basket as $item) {
$offer = $offers->where('id', $item->id)->first();
$article_nature = strtolower($offer->article->article_nature->name);
$data[$article_nature][] = [
'id' => (int) $item->id,
'name' => $item->name,
'quantity' => (int) $item->quantity,
'price' => $item->price,
'variation' => $offer->variation->name,
'image' => Articles::getPreviewSrc($offer->article->image),
];
}
return $data ?? false;
}
public static function getBasketData($id, $quantity = 1)

View File

@@ -1,80 +1,7 @@
<div class="row mt-3">
<div class="col-12">
<div class="card card-primary card-outline card-outline-tabs">
<div class="card-header p-0 border-bottom-0">
<ul class="card-title nav nav-tabs ml-auto" role="tablist">
<li class="nav-item">
<a href="#characteristics" class="nav-link active" data-toggle="tab" aria-expanded="true">
Caractéristiques
</a>
</li>
<!--
<li class="nav-item">
<a href="#offers" class="nav-link" data-toggle="tab" aria-expanded="true">
{{ __('shop.offers.title') }}
@if(isset($offers_count))<span class="badge">{{ $offers_count }}</span>@endif
</a>
</li>
<li class="nav-item">
<a href="#shipping" class="nav-link" data-toggle="tab" aria-expanded="true">
Livraison
@if(isset($shipping_count))<span class="badge">{{ $shipping_count }}</span>@endif
</a>
</li>
<li class="nav-item">
<a href="#stock" class="nav-link" data-toggle="tab" aria-expanded="true">
Stock
@if(isset($stock_count))<span class="badge">{{ $stock_count }}</span>@endif
</a>
</li>
<li class="nav-item">
<a href="#seo" class="nav-link" data-toggle="tab" aria-expanded="true">
Référencement
</a>
</li>
-->
</ul>
<div class="card-tools">
@include('components.form.toggle', [
'name' => 'visible',
'value' => ($article['visible'] ?? null),
'on' => __('visible'),
'off' => __('invisible'),
'meta' => 'data-id=' . ($article['id'] ?? null),
'size' => 'sm',
])
</div>
</div>
<div class="card-body">
<div class="tab-content">
<div class="tab-pane active" id="characteristics">
@include('Admin.Shop.Articles.partials.characteristics')
</div>
<div class="tab-pane" id="offers">
</div>
<div class="tab-pane" id="shipping">
@include('Admin.Shop.Articles.partials.shipping')
</div>
<div class="tab-pane" id="stock">
@include('Admin.Shop.Articles.partials.stock')
</div>
<div class="tab-pane" id="seo">
@include('Admin.Shop.Articles.partials.seo')
</div>
</div>
</div>
</div>
</div>
</div>
@include('components.save')

View File

@@ -6,7 +6,12 @@
@section('content')
@component('components.card')
@include('components.datatable', ['route' => route('Admin.Shop.Articles.index'), 'model' => 'articles', 'with_filters' => true])
@include('components.datatable', [
'route' => route('Admin.Shop.Articles.index'),
'model' => 'articles',
'with_filters' => true,
'callback' => 'handleArticle()',
])
@component('components.layout.modal', ['title' => 'Filtres', 'id' => 'modal-articles-filters'])
@include('Admin.Shop.Articles.partials.filters', ['model' => 'articles'])
@endcomponent
@@ -14,3 +19,17 @@
@endsection
@include('load.form.select2')
@include('load.form.toggle')
@push('js')
<script>
function handleArticle() {
initToggle("{{ route('Admin.Shop.Articles.toggleVisible') }}", '.visible');
initToggle("{{ route('Admin.Shop.Articles.toggleHomepage') }}", '.homepage');
}
$(document).ready(function () {
initSelect2();
});
</script>
@endpush

View File

@@ -1,6 +1,5 @@
<div class="row">
<div class="col-lg-8">
<div class="row mb-3">
<div class="col-3">
{{ Form::label('model', 'Familles de produit') }}<br>
@@ -28,10 +27,32 @@
</div>
<div class="row mb-3">
<div class="col-12">
<div class="col-8">
{{ Form::label('categories', __('shop.shelves.title')) }}<br>
@include('components.form.select', ['name' => 'categories[]', 'list' => $categories_options, 'values' => $article['categories'] ?? null, 'class' => 'select2', 'multiple' => true])
</div>
<div class="col-2">
{{ Form::label('visible', 'Visible') }}<br>
@include('components.form.toggle', [
'name' => 'visible',
'value' => ($article['visible'] ?? null),
'on' => __('oui'),
'off' => __('non'),
'meta' => 'data-id=' . ($article['id'] ?? null),
'size' => 'sm',
])
</div>
<div class="col-2">
{{ Form::label('homepage', __('Accueil')) }}<br>
@include('components.form.toggle', [
'name' => 'homepage',
'value' => ($article['homepage'] ?? null),
'on' => __('oui'),
'off' => __('non'),
'meta' => 'data-id=' . ($article['id'] ?? null),
'size' => 'sm',
])
</div>
</div>
<div class="row mb-3">

View File

@@ -0,0 +1,49 @@
@extends('Shop.layout.layout', [
'title' => __('Panier'),
])
@section('content')
@if ($basket)
<div class="row">
<div class="col-8">
<div class="row mb-3">
<div class="col-4">
<h1>Panier</h1>
</div>
<div class="col-8">
Livraison à domicile ...<br>
Commande en ligne et livraison par voie postale. Attention certains produits ne sont pas disponibles en livraison.
Les sachets disponibles en lignes sont disponibles à la livraison et uniquement quelques plants.
</div>
</div>
@foreach ($basket as $nature => $items)
<div class="row mb-3 p-2" style="background-color: #ccc;">
<div class="col-12">
<h2 style="font-size: 1.6em;">{{ ucfirst($nature) }}</h2>
@foreach ($items as $item)
@include('Shop.Baskets.partials.article')
@endforeach
</div>
@endforeach
</div>
<div class="col-4">
@component('components.card')
Tarif appliqué :
@endcomponent
</div>
</div>
@endif
@endsection
@push('js')
<script>
$('.basket-quantity').change(function() {
var offer_id = $(this).parent('row');
console.log(offer_id);
});
$('.basket-delete').change(function() {
var offer_id = $(this).data('id');
console.log(offer_id);
});
</script>
@endpush

View File

@@ -0,0 +1,27 @@
<div class="row mb-3" id="basket_offer-{{ $item['id'] }}">
<div class="col-2 text-center">
<img src="{{ $item['image'] }}" class="img-fluid">
</div>
<div class="col-10">
<h3 style="font-size: 1.4em;">{{ $item['name'] }}</h3>
{{ $item['variation'] }}<br/>
<div class="row">
<div class="col-6">
{{ $item['price'] }} / unité
</div>
<div class="col-2">
@include('components.form.inputs.number', [
'name' => 'quantity',
'value' => $item['quantity'],
'class' => 'basket-quantity',
])
</div>
<div class="col-2 text-right" style="font-size: 2em;" id="basket_total-{{ $item['id'] }}">
{{ $item['quantity'] * $item['price'] }}
</div>
<div class="col-2" style="font-size: 2em;">
<i class="fa fa-fw fa-trash basket-delete" data-id={{ $item['id'] }}></i>
</div>
</div>
</div>
</div>

View File

@@ -1,3 +1,4 @@
@if ($shelve['articles'])
<div class="mb-3 bg-light">
<div class="row">
<div class="col-6">
@@ -29,3 +30,4 @@
});
</script>
@endpush
@endif

View File

@@ -15,6 +15,9 @@ Route::prefix('Articles')->name('Articles.')->group(function () {
Route::get('getProductDescription/{product_id?}/{model?}', 'ArticleController@getProductDescription')->name('getProductDescription');
Route::get('getProductTags/{product_id?}/{model?}', 'ArticleController@getProductTags')->name('getProductTags');
Route::get('getProductImages/{product_id?}/{model?}', 'ArticleController@getProductImages')->name('getProductImages');
Route::post('toggleVisible', 'OfferController@toggleVisible')->name('toggleVisible');
Route::post('toggleHomepage', 'OfferController@toggleHomepage')->name('toggleHomepage');
});