Merge branch 'develop' into trunk
This commit is contained in:
commit
df4f4e63ed
36 changed files with 613 additions and 79 deletions
|
|
@ -23,6 +23,11 @@ use Kwaadpepper\Enum\BaseEnumRoutable;
|
|||
* @method static self foodProducts()
|
||||
* @method static self mentions()
|
||||
* @method static self charte()
|
||||
* @method static self home()
|
||||
* @method static self marque()
|
||||
* @method static self news()
|
||||
* @method static self foodservice()
|
||||
* @method static self gammes()
|
||||
*/
|
||||
class Page extends BaseEnumRoutable
|
||||
{
|
||||
|
|
@ -49,6 +54,11 @@ class Page extends BaseEnumRoutable
|
|||
'foodProducts' => 17,
|
||||
'mentions' => 18,
|
||||
'charte' => 19,
|
||||
'home' => 20,
|
||||
'marque' => 21,
|
||||
'news' => 22,
|
||||
'foodservice' => 23,
|
||||
'gammes' => 24
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
91
app/Http/Controllers/Bo/SeoDataController.php
Normal file
91
app/Http/Controllers/Bo/SeoDataController.php
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Bo;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\StoreSeoDataRequest;
|
||||
use App\Models\SeoDatum;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SeoDataController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param \App\Models\SeoDatum $SeoDatum
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(SeoDatum $SeoDatum)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param \App\Models\SeoDatum $SeoDatum
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit(SeoDatum $SeoDatum)
|
||||
{
|
||||
return view('back.seo_data.edit', compact('SeoDatum'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \App\Models\SeoDatum $SeoDatum
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(StoreSeoDataRequest $request, SeoDatum $SeoDatum)
|
||||
{
|
||||
$SeoDatum->fill($request->validated());
|
||||
$SeoDatum->save();
|
||||
|
||||
return redirect()->route('bo.seo_data.edit', $SeoDatum->page)
|
||||
->with('success', trans('Modifications enregistrées !'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param \App\Models\SeoDatum $SeoDatum
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(SeoDatum $SeoDatum)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
18
app/Http/Controllers/FoodServiceController.php
Normal file
18
app/Http/Controllers/FoodServiceController.php
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class FoodServiceController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$page = Page::foodservice();
|
||||
$seoDatum = SeoDatum::where('page',$page)->first();
|
||||
|
||||
return view('front.food-service', compact('seoDatum'));
|
||||
}
|
||||
}
|
||||
|
|
@ -2,8 +2,10 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\Gamme;
|
||||
use App\Models\Product;
|
||||
use App\Models\SeoDatum;
|
||||
|
||||
class GammesController extends Controller
|
||||
{
|
||||
|
|
@ -15,7 +17,10 @@ class GammesController extends Controller
|
|||
$gammes = $gammes->whereNotIn('slug','food-service');
|
||||
$nb_gammes = $gammes->count();
|
||||
|
||||
return view('front.gammes.index', compact('gammes', 'nb_gammes'));
|
||||
$page = Page::gammes();
|
||||
$seoDatum = SeoDatum::where('page',$page)->first();
|
||||
|
||||
return view('front.gammes.index', compact('gammes', 'nb_gammes', 'seoDatum'));
|
||||
}
|
||||
|
||||
public function show(Gamme $gamme)
|
||||
|
|
@ -38,6 +43,11 @@ class GammesController extends Controller
|
|||
->orderBy('name')
|
||||
->get();
|
||||
|
||||
return view('front.gammes.show', compact('gamme', 'products'));
|
||||
//make ghost seoDatum from the gamme
|
||||
$seoDatum = new SeoDatum();
|
||||
$seoDatum->title = $gamme->title;
|
||||
$seoDatum->description = $gamme->text;
|
||||
|
||||
return view('front.gammes.show', compact('gamme', 'products', 'seoDatum'));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use App\Models\Slide;
|
||||
use App\Models\Slider;
|
||||
use Illuminate\Support\Carbon;
|
||||
|
|
@ -10,6 +12,10 @@ class HomeController extends Controller
|
|||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
$page = Page::home();
|
||||
$seoDatum = SeoDatum::where('page',$page)->first();
|
||||
|
||||
$slider = Slider::where('published', 1)->first();
|
||||
if ($slider) {
|
||||
$slides = Slide::whereHas('slider', function ($q) use ($slider) {
|
||||
|
|
@ -26,9 +32,9 @@ class HomeController extends Controller
|
|||
});
|
||||
})->orderBy('order', 'ASC')
|
||||
->get();
|
||||
return view('front.home', compact('slider', 'slides'));
|
||||
return view('front.home', compact('slider', 'slides', 'seoDatum'));
|
||||
} else {
|
||||
return view('front.home', compact('slider'));
|
||||
return view('front.home', compact('slider', 'seoDatum'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
22
app/Http/Controllers/LegalsController.php
Normal file
22
app/Http/Controllers/LegalsController.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use App\Models\Text;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class LegalsController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$mentions_legales = Text::where('page', Page::mentions()->value)->first();
|
||||
|
||||
//make ghost seoDatum from the gamme
|
||||
$seoDatum = new SeoDatum();
|
||||
$seoDatum->title = $mentions_legales->title;
|
||||
|
||||
return view('front.legals', compact('seoDatum'));
|
||||
}
|
||||
}
|
||||
18
app/Http/Controllers/MarqueController.php
Normal file
18
app/Http/Controllers/MarqueController.php
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class MarqueController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$page = Page::marque();
|
||||
$seoDatum = SeoDatum::where('page',$page)->first();
|
||||
|
||||
return view('front.a-propos', compact('seoDatum'));
|
||||
}
|
||||
}
|
||||
18
app/Http/Controllers/NewsController.php
Normal file
18
app/Http/Controllers/NewsController.php
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NewsController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$page = Page::news();
|
||||
$seoDatum = SeoDatum::where('page',$page)->first();
|
||||
|
||||
return view('front.news', compact('seoDatum'));
|
||||
}
|
||||
}
|
||||
22
app/Http/Controllers/PolicyController.php
Normal file
22
app/Http/Controllers/PolicyController.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use App\Models\Text;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PolicyController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$privacy_policy = Text::where('page', Page::charte()->value)->first();
|
||||
|
||||
//make ghost seoDatum from the gamme
|
||||
$seoDatum = new SeoDatum();
|
||||
$seoDatum->title = $privacy_policy->title;
|
||||
|
||||
return view('front.policy', compact('seoDatum'));
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ namespace App\Http\Controllers;
|
|||
|
||||
use App\Models\Gamme;
|
||||
use App\Models\Product;
|
||||
use App\Models\SeoDatum;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ProductsController extends Controller
|
||||
|
|
@ -13,7 +14,13 @@ class ProductsController extends Controller
|
|||
{
|
||||
//$product = Product::whereSlug($product->slug)->first();
|
||||
//dd($product);
|
||||
return view('front.product', compact('product', 'gamme'));
|
||||
|
||||
//make ghost seoDatum from the gamme
|
||||
$seoDatum = new SeoDatum();
|
||||
$seoDatum->title = $product->name;
|
||||
$seoDatum->description = $product->description;
|
||||
|
||||
return view('front.product', compact('product', 'gamme', 'seoDatum'));
|
||||
}
|
||||
|
||||
public function search(Request $request) {
|
||||
|
|
|
|||
|
|
@ -57,8 +57,10 @@ class InitVarsGlobals
|
|||
])->first();
|
||||
// Limitation à 3 produits affichés sur la homepage
|
||||
$products_home = Product::where('is_on_top', true)->take(3)->get();
|
||||
// Limitation à 6 produits affichés sur la page Food Service
|
||||
$products_food = Product::where('is_food_service', true)->take(6)->get();
|
||||
// produits affichés sur la page news
|
||||
$products_news = Product::where('is_news', true)->get();
|
||||
// Produits affichés sur la page Food Service
|
||||
$products_food = Product::where('is_food_service', true)->get();
|
||||
|
||||
$pictos_marqueBloc2 = Picto::where('page', Page::marqueBloc2()->value)->get();
|
||||
$pictos_food = Picto::where('page', Page::foodBloc2()->value)->get();
|
||||
|
|
@ -87,6 +89,7 @@ class InitVarsGlobals
|
|||
View::share('posts', $posts);
|
||||
|
||||
View::share('products_home', $products_home);
|
||||
View::share('products_news', $products_news);
|
||||
View::share('products_food', $products_food);
|
||||
|
||||
View::share('advice_news', $advice_news);
|
||||
|
|
|
|||
|
|
@ -150,6 +150,7 @@ class StoreProductRequest extends FormRequest
|
|||
'plusproduit' => $tabPlusProduit,
|
||||
'is_published' => $this->is_published ? true : false,
|
||||
'is_on_top' => $this->is_on_top ? true : false,
|
||||
'is_news' => $this->is_news ? true : false,
|
||||
'is_food_service' => $this->is_food_service ? true : false,
|
||||
'is_halal' => $this->is_halal ? true : false,
|
||||
]);
|
||||
|
|
@ -180,6 +181,7 @@ class StoreProductRequest extends FormRequest
|
|||
'pictogramme2' => 'nullable|image|mimes:png|max:1024|dimensions:width=141,height=100',
|
||||
'is_published' => 'nullable|boolean',
|
||||
'is_on_top' => 'nullable|boolean',
|
||||
'is_news' => 'nullable|boolean',
|
||||
'is_food_service' => 'nullable|boolean',
|
||||
'is_halal' => 'nullable|boolean',
|
||||
// 'seo_title' => 'required|max:255',
|
||||
|
|
|
|||
32
app/Http/Requests/StoreSeoDataRequest.php
Normal file
32
app/Http/Requests/StoreSeoDataRequest.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class StoreSeoDataRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return auth()->check();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'title' => 'required|max:255',
|
||||
'description' => 'sometimes|max:255',
|
||||
'keywords' => 'sometimes|max:255',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -24,6 +24,7 @@ class Product extends Model
|
|||
'plusproduit',
|
||||
'is_published',
|
||||
'is_on_top',
|
||||
'is_news',
|
||||
'is_halal',
|
||||
'is_food_service',
|
||||
'seo_title',
|
||||
|
|
|
|||
50
app/Models/SeoDatum.php
Normal file
50
app/Models/SeoDatum.php
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Traits\CastsEnumsHasTranslations;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class SeoDatum extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use CastsEnumsHasTranslations;
|
||||
|
||||
public $enumCasts = [
|
||||
'page' => Page::class
|
||||
];
|
||||
|
||||
/**
|
||||
* Engagment fillable fields
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fillable = [
|
||||
'title',
|
||||
'description',
|
||||
'keywords'
|
||||
];
|
||||
|
||||
/**
|
||||
* Engagment translatable fields array
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $translatable = [
|
||||
'title',
|
||||
'description',
|
||||
'keywords'
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the route key for the model.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRouteKeyName()
|
||||
{
|
||||
return 'page';
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,10 @@
|
|||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ class ProductFactory extends Factory
|
|||
'plusproduit' => json_encode([$tabPlusProduit1, $tabPlusProduit2, $tabPlusProduit3]),
|
||||
'is_published' => true,
|
||||
'is_on_top' => rand(true, false),
|
||||
'is_news' => rand(true, false),
|
||||
'is_food_service' => rand(true, false),
|
||||
'is_halal' => rand(true, false),
|
||||
'seo_title' => $this->faker->text(5),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddIsNewsOnProducts extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('products', function (Blueprint $table) {
|
||||
$table->boolean('is_news')->after('is_on_top');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('products', function (Blueprint $table) {
|
||||
$table->dropColumn('is_news');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
use Database\Seeders\SeoDataSeeder;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateSeoDataTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('seo_data', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->smallInteger('page')->unique();
|
||||
$table->text('title')->nullable();
|
||||
$table->text('description')->nullable();
|
||||
$table->text('keywords')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
$seeder = new SeoDataSeeder();
|
||||
$seeder->run();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('seo_data');
|
||||
}
|
||||
}
|
||||
|
|
@ -162,6 +162,7 @@ class GammesSeeder extends Seeder
|
|||
$product->plusproduit = json_encode([$tabPlusProduit1, $tabPlusProduit2]);
|
||||
$product->is_published = true;
|
||||
$product->is_on_top = rand(true, false);
|
||||
$product->is_news = rand(true, false);
|
||||
$product->is_food_service = rand(true, false);
|
||||
$product->is_halal = rand(true, false);
|
||||
$product->seo_title = 'Chicken franks, poulet, recettes, qualité';
|
||||
|
|
@ -226,6 +227,7 @@ class GammesSeeder extends Seeder
|
|||
$product->plusproduit = json_encode([$tabPlusProduit1, $tabPlusProduit2]);
|
||||
$product->is_published = true;
|
||||
$product->is_on_top = rand(true, false);
|
||||
$product->is_news = rand(true, false);
|
||||
$product->is_food_service = rand(true, false);
|
||||
$product->is_halal = rand(true, false);
|
||||
$product->seo_title = 'recette, qualité, Chicken franks, plaisir, gourmandise';
|
||||
|
|
@ -254,6 +256,7 @@ class GammesSeeder extends Seeder
|
|||
$product->plusproduit = json_encode([$tabPlusProduit1, $tabPlusProduit2, $tabPlusProduit3]);
|
||||
$product->is_published = true;
|
||||
$product->is_on_top = rand(true, false);
|
||||
$product->is_news = rand(true, false);
|
||||
$product->is_food_service = rand(true, false);
|
||||
$product->is_halal = rand(true, false);
|
||||
$product->seo_title = 'recette, qualité, Chicken franks, plaisir, gourmandise';
|
||||
|
|
@ -312,6 +315,7 @@ class GammesSeeder extends Seeder
|
|||
$product->plusproduit = json_encode([$tabPlusProduit1, $tabPlusProduit2, $tabPlusProduit3]);
|
||||
$product->is_published = true;
|
||||
$product->is_on_top = rand(true, false);
|
||||
$product->is_news = rand(true, false);
|
||||
$product->is_food_service = rand(true, false);
|
||||
$product->is_halal = rand(true, false);
|
||||
$product->seo_title = 'recette, qualité, viande, cuisse, steak haché, poulet';
|
||||
|
|
@ -351,6 +355,7 @@ class GammesSeeder extends Seeder
|
|||
$product->plusproduit = json_encode([$tabPlusProduit1]);
|
||||
$product->is_published = true;
|
||||
$product->is_on_top = rand(true, false);
|
||||
$product->is_news = rand(true, false);
|
||||
$product->is_food_service = rand(true, false);
|
||||
$product->is_halal = rand(true, false);
|
||||
$product->seo_title = 'volaille, poulet, Doux, qualités';
|
||||
|
|
|
|||
53
database/seeders/SeoDataSeeder.php
Normal file
53
database/seeders/SeoDataSeeder.php
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Enums\Page;
|
||||
use App\Models\SeoDatum;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class SeoDataSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$seo_data = new SeoDatum();
|
||||
$seo_data->title = "Page d'accueil";
|
||||
$seo_data->description = "";
|
||||
$seo_data->keywords = "";
|
||||
$seo_data->page = Page::home();
|
||||
$seo_data->save();
|
||||
|
||||
$seo_data = new SeoDatum();
|
||||
$seo_data->title = "Marque";
|
||||
$seo_data->description = "";
|
||||
$seo_data->keywords = "";
|
||||
$seo_data->page = Page::marque();
|
||||
$seo_data->save();
|
||||
|
||||
$seo_data = new SeoDatum();
|
||||
$seo_data->title = "Actualités";
|
||||
$seo_data->description = "";
|
||||
$seo_data->keywords = "";
|
||||
$seo_data->page = Page::news();
|
||||
$seo_data->save();
|
||||
|
||||
$seo_data = new SeoDatum();
|
||||
$seo_data->title = "Food Service";
|
||||
$seo_data->description = "";
|
||||
$seo_data->keywords = "";
|
||||
$seo_data->page = Page::foodservice();
|
||||
$seo_data->save();
|
||||
|
||||
$seo_data = new SeoDatum();
|
||||
$seo_data->title = "Les Gammes";
|
||||
$seo_data->description = "";
|
||||
$seo_data->keywords = "";
|
||||
$seo_data->page = Page::gammes();
|
||||
$seo_data->save();
|
||||
}
|
||||
}
|
||||
|
|
@ -132,6 +132,11 @@ $plusproduit = json_decode($product->plusproduit);
|
|||
<label class="form-check-label" for="is_on_top">{{ __('A la une') }}</label>
|
||||
@include('back.modules.input-error', ['inputName'=>'is_on_top'])
|
||||
</div>
|
||||
<div class="form-group form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="is_news" name="is_news" @if (old('is_news', $product->is_news) === 1 || old('is_news', $product->is_news) === 'on')checked="checked" @endif>
|
||||
<label class="form-check-label" for="is_news">{{ __('Affiché dans la page "Actualités') }}</label>
|
||||
@include('back.modules.input-error', ['inputName'=>'is_news'])
|
||||
</div>
|
||||
<div class="form-group form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="is_food_service" name="is_food_service" @if (old('is_food_service', $product->is_food_service) === 1 || old('is_food_service', $product->is_food_service) === 'on')checked="checked" @endif>
|
||||
<label class="form-check-label" for="is_food_service">{{ __('Affiché dans la page "Food Service"') }}</label>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
<th scope="col">{{ __('Gamme') }}</th>
|
||||
<th scope="col">{{ __('Publié') }}</th>
|
||||
<th scope="col">{{ __('A la une') }}</th>
|
||||
<th scope="col">{{ __('Actualités') }}</th>
|
||||
<th scope="col">{{ __('Food Service') }}</th>
|
||||
<th scope="col">{{ __('Halal') }}</th>
|
||||
<th scope="col"></th>
|
||||
|
|
@ -42,6 +43,7 @@
|
|||
@endif
|
||||
<td>{{$product->is_published ? 'Oui' : 'Non'}}</td>
|
||||
<td>{{$product->is_on_top ? 'Oui' : 'Non'}}</td>
|
||||
<td>{{$product->is_news ? 'Oui' : 'Non'}}</td>
|
||||
<td>{{$product->is_food_service ? 'Oui' : 'Non'}}</td>
|
||||
<td>{{$product->is_halal ? 'Oui' : 'Non'}}</td>
|
||||
<td>
|
||||
|
|
|
|||
79
resources/views/back/seo_data/edit.blade.php
Normal file
79
resources/views/back/seo_data/edit.blade.php
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
@extends('layouts.backend')
|
||||
|
||||
@section('content')
|
||||
<form action="{{route('bo.seo_data.update', $SeoDatum->page)}}" method="POST" enctype="multipart/form-data">
|
||||
@method('PUT')
|
||||
@csrf
|
||||
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
||||
<h1 class="h2"><a href="{{route('bo.home')}}" class="h2 text-decoration-none">
|
||||
< </a> {{ __('Paramètres SEO')."-".$SeoDatum->page->label}} <small class="text-muted">{{ __('Edition') }}</small></h1>
|
||||
<div class="btn-toolbar mb-2 mb-md-0">
|
||||
<button type="submit" class="btn btn-sm btn-primary">{{ __('Enregistrer') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="title">{{ __('Titre') }} *</label>
|
||||
<input type="text" id="title" name="title" class="form-control" placeholder="{{ __('Titre') }} *" value="{{ old('title', $SeoDatum->title ?? '') }}" required>
|
||||
@include('back.modules.input-error', ['inputName'=>'title'])
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="description">{{ __('Description') }} *</label>
|
||||
<input type="text" id="description" name="description" class="form-control" placeholder="{{ __('Description') }} *" value="{{ old('description', $SeoDatum->description ?? '') }}" required>
|
||||
@include('back.modules.input-error', ['inputName'=>'description'])
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="keywords">{{ __('Mots Clés') }} *</label>
|
||||
<input type="text" id="keywords" name="keywords" class="form-control" placeholder="{{ __('Mots Clés') }} *" value="{{ old('keywords', $SeoDatum->keywords ?? '') }}" required>
|
||||
@include('back.modules.input-error', ['inputName'=>'keywords'])
|
||||
</div>
|
||||
</form>
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/javascript">
|
||||
var editorConfig = {
|
||||
removePlugins: ["Image", "ImageCaption", "ImageStyle", "ImageToolbar", "ImageUpload"],
|
||||
toolbar: ['heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', '|', 'blockQuote', 'insertTable', '|', 'undo', 'redo'],
|
||||
heading: {
|
||||
options: [{
|
||||
model: 'paragraph',
|
||||
title: 'Paragraph',
|
||||
class: 'ck-heading_paragraph'
|
||||
},
|
||||
{
|
||||
model: 'heading1',
|
||||
view: 'h1',
|
||||
title: 'Heading 1',
|
||||
class: 'ck-heading_heading1'
|
||||
},
|
||||
{
|
||||
model: 'heading2',
|
||||
view: 'h2',
|
||||
title: 'Heading 2',
|
||||
class: 'ck-heading_heading2'
|
||||
},
|
||||
{
|
||||
model: 'heading3',
|
||||
view: 'h3',
|
||||
title: 'Heading 3',
|
||||
class: 'ck-heading_heading3'
|
||||
},
|
||||
{
|
||||
model: 'heading4',
|
||||
view: 'h4',
|
||||
title: 'Heading 4',
|
||||
class: 'ck-heading_heading4'
|
||||
}
|
||||
]
|
||||
},
|
||||
table: {
|
||||
contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells']
|
||||
}
|
||||
};
|
||||
ClassicEditor
|
||||
.create(document.querySelector('#text'), editorConfig)
|
||||
.catch(error => {
|
||||
console.error(error);
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Accueil'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
@ -126,40 +127,6 @@
|
|||
@endif
|
||||
@endif
|
||||
@endforeach
|
||||
{{--
|
||||
<div class="step is-flex start right p-rel animate__animated fadeInRight animate__slow">
|
||||
|
||||
<span class="year">1920</span>
|
||||
<div class="step_content">
|
||||
<h3 class="step_title bold">Lorem Ipsum dolor sit amet.</h3>
|
||||
<p class="align-justify">Lorem ip sum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
|
||||
<img src="{{ asset('assets/images/blog.jpg') }}" alt="photo">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="step left p-rel desk-mt-n95 smrt-order animate__animated fadeInLeft animate__slow">
|
||||
|
||||
<img src="{{ asset('assets/images/doux-selection.jpg') }}" alt="photo">
|
||||
<span class="year">2021</span>
|
||||
<div class="step_content">
|
||||
<h3 class="step_title bold">Lorem Ipsum dolor sit amet.</h3>
|
||||
<p class="align-justify">Lorem ip sum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="step special right p-rel desk-ml-150 smrt-order animate__animated fadeInRight animate__slow">
|
||||
|
||||
<img src="{{ asset('assets/images/doux-nuggets.jpg') }}" alt="photo">
|
||||
<span class="year">2020</span>
|
||||
<div class="step_content">
|
||||
<h3 class="step_title bold">Lorem Ipsum dolor sit amet.</h3>
|
||||
<p class="align-justify">Lorem ip sum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
--}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Food service'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
@ -43,7 +44,7 @@
|
|||
<div class="align-justify animate__animated fadeInRight animate__slow">
|
||||
{!! $encart_food->text !!}
|
||||
</div>
|
||||
<a href="{{ route($routeprefixer . 'wasup') }}/#notre-histoire" class="cta">{{ __('En savoir plus') }}</a>
|
||||
{{--<a href="{{ route($routeprefixer . 'wasup') }}/#notre-histoire" class="cta">{{ __('En savoir plus') }}</a>--}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Accueil'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Accueil'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Accueil'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
<div class="jumbotron">
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', $mentions_legales->title)
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Accueil'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
@ -104,9 +105,9 @@
|
|||
</div>
|
||||
<p class="h2">{{ __('Nous travaillons toujours pour améliorer nos recettes et proposer des produits de meilleure qualité')}}</p>
|
||||
|
||||
@if (isset($products_home))
|
||||
@if (isset($products_news))
|
||||
<div id="carrousel2">
|
||||
@foreach ($products_home as $product)
|
||||
@foreach ($products_news as $product)
|
||||
<div class="item is-flex">
|
||||
<div class="item__image">
|
||||
<a href="{{ route($routeprefixer . 'product.show', ['gammeSlug' => $product->gamme->slug , 'productSlug' => $product->slug]) }}">
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', $privacy_policy->title)
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', $seoDatum->description)
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
@extends('layouts.frontend')
|
||||
@section('title', __('Accueil'))
|
||||
@section('description', __("Découvrez DOUX, des produits de volailles françaises."))
|
||||
@section('title', $seoDatum->title)
|
||||
@section('description', strip_tags($seoDatum->description))
|
||||
@section('keywords', $seoDatum->keywords)
|
||||
|
||||
@section('content')
|
||||
|
||||
|
|
|
|||
|
|
@ -11,15 +11,19 @@
|
|||
</h2>
|
||||
<div id="collapseOne" class="accordion-collapse collapse" aria-labelledby="headingOne">
|
||||
<div class="accordion-body">
|
||||
<div class="mb-3">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SLIDER') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.sliders.index')}}">{{ __('Slider') }}</a>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.slides.index')}}">{{ __('Slide') }}</a>
|
||||
</div>
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('ENCART DE PRESENTATION') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.encarts.edit', $encart_home->id)}}">{{ __('Contenu') }}</a>
|
||||
</div>
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SEO') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.seo_data.edit', Page::home()->value)}}">{{ __('Data') }}</a>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SLIDER') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.sliders.index')}}">{{ __('Slider') }}</a>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.slides.index')}}">{{ __('Slide') }}</a>
|
||||
</div>
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('ENCART DE PRESENTATION') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.encarts.edit', $encart_home->id)}}">{{ __('Contenu') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -32,6 +36,10 @@
|
|||
</h2>
|
||||
<div id="collapseBrand" class="accordion-collapse collapse" aria-labelledby="headingBrand">
|
||||
<div class="accordion-body">
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SEO') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.seo_data.edit', Page::marque()->value)}}">{{ __('Data') }}</a>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('ENCART DE PRESENTATION') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.encarts.edit', $encart_marqueHeader->id)}}">{{ __('Contenu') }}</a>
|
||||
|
|
@ -68,7 +76,12 @@
|
|||
</h2>
|
||||
<div id="collapseGammes" class="accordion-collapse collapse" aria-labelledby="headingGammes">
|
||||
<div class="accordion-body">
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SEO') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.seo_data.edit', Page::gammes()->value)}}">{{ __('Data') }}</a>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('Gammes') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.gammes.index')}}">{{ __('Toutes les gammes') }}</a>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.gammes.create')}}">{{ __('Ajouter une gamme') }}</a>
|
||||
</div>
|
||||
|
|
@ -100,6 +113,10 @@
|
|||
</h2>
|
||||
<div id="collapseNews" class="accordion-collapse collapse" aria-labelledby="headingNews">
|
||||
<div class="accordion-body">
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SEO') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.seo_data.edit', Page::news()->value)}}">{{ __('Data') }}</a>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('BLOC DES CONSEILS') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.advice.edit', $advice_news->id)}}">{{ __('Contenu') }}</a>
|
||||
|
|
@ -123,6 +140,10 @@
|
|||
</h2>
|
||||
<div id="collapseTwo" class="accordion-collapse collapse" aria-labelledby="headingTwo">
|
||||
<div class="accordion-body">
|
||||
<div class="mb-1">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('SEO') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.seo_data.edit', Page::foodservice()->value)}}">{{ __('Data') }}</a>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<h6 class="pb-1 mb-1 text-dark border-bottom">{{ __('ENCART DE PRESENTATION') }}</h6>
|
||||
<a class="nav-link py-0 ms-4" href="{{route('bo.encarts.edit', $encart_food->id)}}">{{ __('Contenu') }}</a>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
<title>{{ config('app.name') }}@hasSection('title') - @yield('title')@endif</title>
|
||||
<meta name="description" content="@yield('description')">
|
||||
<meta name="keywords" content="@yield('keywords')">
|
||||
|
||||
@hasSection('canonical')
|
||||
<link rel="canonical" href="@yield('canonical')" />
|
||||
|
|
@ -19,4 +20,4 @@
|
|||
<meta name="robots" content="@yield('metaIndex')">
|
||||
@else
|
||||
<meta name="robots" content="index, follow">
|
||||
@endif
|
||||
@endif
|
||||
|
|
|
|||
|
|
@ -20,14 +20,20 @@ use App\Http\Controllers\Bo\PictoBrandsController;
|
|||
use App\Http\Controllers\Bo\PictosController;
|
||||
use App\Http\Controllers\Bo\PostsController;
|
||||
use App\Http\Controllers\Bo\ProductsController;
|
||||
use App\Http\Controllers\Bo\SeoDataController;
|
||||
use App\Http\Controllers\Bo\SlidersController;
|
||||
use App\Http\Controllers\Bo\SlidesController;
|
||||
use App\Http\Controllers\Bo\TextsController;
|
||||
use App\Http\Controllers\Bo\TitlesController;
|
||||
use App\Http\Controllers\HomeController as ControllersHomeController;
|
||||
use App\Http\Controllers\MarqueController as ControllersMarqueController;
|
||||
use App\Http\Controllers\GammesController as ControllersGammesController;
|
||||
use App\Http\Controllers\NewsController as ControllersNewsController;
|
||||
use App\Http\Controllers\ProductsController as ControllersProductsController;
|
||||
use App\Http\Controllers\ContactController as ControllersContactController;
|
||||
use App\Http\Controllers\FoodServiceController as ControllersFoodServiceController;
|
||||
use App\Http\Controllers\LegalsController as ControllersLegalsController;
|
||||
use App\Http\Controllers\PolicyController as ControllersPolicyController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
|
|
@ -78,6 +84,8 @@ Route::prefix('bo')
|
|||
'slides' => SlidesController::class,
|
||||
]
|
||||
);
|
||||
Route::resource('seo_data', SeoDataController::class)
|
||||
->except(['index', 'create', 'store', 'destroy', 'show']);
|
||||
Route::resource('moments', MomentsController::class)
|
||||
->except(['create', 'store', 'destroy', 'show']);
|
||||
Route::resource('encarts', EncartsController::class)
|
||||
|
|
@ -115,18 +123,18 @@ foreach ($langs as $lang) {
|
|||
->group(
|
||||
function () {
|
||||
Route::get('/', [ControllersHomeController::class, 'index'])->name('home');
|
||||
Route::view('/notre-marque', 'front.a-propos')->name('wasup');
|
||||
Route::get('/notre-marque', [ControllersMarqueController::class, 'index'])->name('wasup');
|
||||
Route::get('/nos-gammes', [ControllersGammesController::class, 'index'])->name('gammes.index');
|
||||
Route::get('/gamme/{gammeSlug}', [ControllersGammesController::class, 'show'])->name('gammes.show');
|
||||
Route::get(
|
||||
'/produit/{gammeSlug}/{productSlug}',
|
||||
[ControllersProductsController::class, 'show']
|
||||
)->name('product.show');
|
||||
Route::view('/nos-actualites', 'front.news')->name('news');
|
||||
Route::view('/food-service', 'front.food-service')->name('food');
|
||||
Route::view('/mentions-legales', 'front.legals')->name('cgu');
|
||||
Route::view('/charte-confidentialite', 'front.policy')->name('policy');
|
||||
Route::view('/plan-site', 'front.site-map')->name('site-map');
|
||||
Route::get('/nos-actualites', [ControllersNewsController::class, 'index'])->name('news');
|
||||
Route::get('/food-service', [ControllersFoodServiceController::class, 'index'])->name('food');
|
||||
Route::get('/mentions-legales', [ControllersLegalsController::class, 'index'])->name('cgu');
|
||||
Route::get('/charte-confidentialite', [ControllersPolicyController::class, 'index'])->name('policy');
|
||||
//Route::view('/plan-site', 'front.site-map')->name('site-map');
|
||||
Route::get('/recherche', [ControllersProductsController::class, 'search'])->name('search');
|
||||
//Classic
|
||||
Route::get('/contact', [ControllersContactController::class, 'contact'])->name('contact');
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue