feat: add static pages for legals and confidentiality

This commit is contained in:
Nicolas Demangeat 2024-07-18 16:20:56 +02:00
parent 60557ccba6
commit 85ffb4e762
37 changed files with 1769 additions and 806 deletions

View file

@ -0,0 +1,48 @@
<?php
namespace App\Enums\ActivityLogs;
use App\Traits\Enums\BaseEnum;
enum ActivityLogsEventEnum: int
{
use BaseEnum;
case created = 1;
case updated = 2;
case duplicated = 3;
case deleted = 4;
/**
* Optionnal labels definition
*
* @phpstan-ignore-next-line
*/
private const LABELS = [
self::created->name => 'Création',
self::updated->name => 'Mise à jour',
self::duplicated->name => 'Duplication',
self::deleted->name => 'Suppression',
];
/**
* Custom added classes definition
*/
private const BOOTSTRAPCLASS = [
self::created->name => 'success',
self::updated->name => 'warning',
self::duplicated->name => 'secondary',
self::deleted->name => 'danger',
];
/**
* Get Class
*
* @return string
*/
public function bootstrapClass(): string
{
return self::BOOTSTRAPCLASS[$this->name];
}
}

View file

@ -0,0 +1,16 @@
<?php
namespace App\Enums\Pagination;
use App\Traits\Enums\BaseEnum;
enum ItemsPerPaginationEnum: int
{
use BaseEnum;
case five = 5;
case twelve = 12;
case twentyfive = 25;
case fifty = 50;
case onehundred = 100;
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\Enums;
use App\Traits\Enums\BaseEnum;
enum StaticPageType: int
{
use BaseEnum;
case legals = 2;
case confidentiality = 3;
/**
* Optionnal labels definition.
*
* @phpstan-ignore-next-line
*/
private const LABELS = [
self::legals->name => 'Mentions légales',
self::confidentiality->name => 'Confidentialité',
];
}

View file

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Models\ActivityLog;
use App\Traits\Controllers\ChangesModelOrder;
use App\Traits\Controllers\UpdateModelPublished;
use Illuminate\Http\Request;
class ActivityLogController extends Controller
{
use ChangesModelOrder;
use UpdateModelPublished;
/**
* Display a listing of the resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function index(Request $request): \Illuminate\Contracts\View\View
{
$this->authorize('isConceptor');
/** @var \Illuminate\Database\Eloquent\Builder $query */
$query = ActivityLog::query()->with('user');
/** @var string $search Search field */
$search = $request->search;
if ($search) {
$this->searchQuery(
$query,
$search,
null,
'model_class',
);
}
$searchFields = \implode(', ', [
trans('validation.custom.target'),
]);
/** Sort columns with a query */
$this->sortQuery($query);
/** Custom pagination */
$activitylogModels = $this->paginate($query);
return view('bo.pages.activity_logs.index', compact('activitylogModels', 'search', 'searchFields'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\ActivityLog $activity_log
* @return \Illuminate\Contracts\View\View
*/
public function show(ActivityLog $activity_log): \Illuminate\Contracts\View\View
{
$this->authorize('isConceptor');
$targetModelClass = $activity_log->model_class;
$targetModel = $activity_log->model_class::where(
(new $targetModelClass())->getRouteKeyName(),
$activity_log->model_id
)->first();
return view('bo.pages.activity_logs.show', [
'activitylogModel' => $activity_log,
'targetModel' => $targetModel,
]);
}
}

View file

@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\StaticPages\UpdateStaticPageRequest;
use App\Models\StaticPage;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class StaticPageController extends Controller
{
/**
* Create the controller instance.
*/
public function __construct()
{
$this->authorizeResource(StaticPage::class);
}
/**
* Display a listing of the resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function index(Request $request): \Illuminate\Contracts\View\View
{
/** @var \Illuminate\Database\Eloquent\Builder $query */
$query = StaticPage::query();
/** @var string $search Search field */
$search = $request->search;
if ($search) {
$this->searchQuery(
$query,
$search,
null,
'title',
);
}
$searchFields = \implode(', ', [
trans('validation.attributes.title'),
]);
/** Sort columns with a query */
$this->sortQuery($query);
/** Custom pagination */
$staticPageModelList = $this->paginate($query);
return view('bo.pages.static_pages.index', compact('staticPageModelList', 'search', 'searchFields'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\StaticPage $static_page
* @return \Illuminate\Contracts\View\View
*/
public function edit(StaticPage $static_page): \Illuminate\Contracts\View\View
{
return view('bo.pages.static_pages.edit', ['staticPageModel' => $static_page]);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\Bo\StaticPages\UpdateStaticPageRequest $request
* @param \App\Models\StaticPage $static_page
* @return \Illuminate\Http\RedirectResponse
*/
public function update(UpdateStaticPageRequest $request, StaticPage $static_page): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request, $static_page) {
$static_page->fill($request->validated());
if ($static_page->saveOrFail()) {
return redirect()->route('bo.static_pages.edit', $static_page)
->with('success', __('crud.messages.has_been_updated', [
'model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1))
]));
}
return redirect()->route('bo.static_pages.edit', $static_page)
->with('error', __('crud.messages.cannot_be_updated', [
'model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1))
]));
});
}
}

View file

@ -2,12 +2,16 @@
namespace App\Http\Controllers;
use App\Enums\Pagination\ItemsPerPaginationEnum;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Cache;
use App\Lib\Helpers\ToolboxHelper;
use Illuminate\Support\Str;
class Controller extends BaseController
{
@ -120,4 +124,30 @@ class Controller extends BaseController
}
return $query;
}
/**
* Customize pagination with cache or config (default).
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param \App\Enums\Pagination\ItemsPerPaginationEnum|null $pagination
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
protected function paginate(
Builder $query,
ItemsPerPaginationEnum $pagination = null
): \Illuminate\Contracts\Pagination\LengthAwarePaginator {
$currentRoutePath = Str::slug(request()->route()->getName());
$cacheKey = "pagination.{$currentRoutePath}";
$pagination = $pagination ?? ItemsPerPaginationEnum::twelve;
$pagination = ToolboxHelper::getValidatedEnum(
Cache::get($cacheKey, $pagination->value()),
'pagination',
'\App\Enums\Pagination\ItemsPerPaginationEnum',
);
if (Cache::get($cacheKey) !== $pagination) {
Cache::put($cacheKey, $pagination);
}
$query = $query->paginate($pagination);
return $query;
}
}

View file

@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers\Fo;
use App\Enums\StaticPageType;
use App\Http\Controllers\Controller;
use App\Models\StaticPage;
class StaticPageController extends Controller
{
/**
* Legal show
*
* @param \App\Models\StaticPage $legalPage
* @return \Illuminate\Contracts\View\View
*/
public function legals(StaticPage $legalPage)
{
$legalPage = StaticPage::query()->where('type', StaticPageType::legals)->first();
return view('fo.pages.legals', ['staticPageModel' => $legalPage]);
}
/**
* Policies show
*
* @param \App\Models\StaticPage $policiesPage
* @return \Illuminate\Contracts\View\View
*/
public function policies(StaticPage $policiesPage)
{
$policiesPage = StaticPage::query()->where('type', StaticPageType::confidentiality)->first();
return view('fo.pages.policies', ['staticPageModel' => $policiesPage]);
}
}

View file

@ -0,0 +1,46 @@
<?php
namespace App\Http\Requests\Bo\StaticPages;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
class UpdateStaticPageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize(): bool
{
return auth('backend')->check();
}
/**
* Prepare the data for validation.
*
* @return void
*/
public function prepareForValidation(): void
{
$this->merge([
'content' => Str::of($this->post('content'))->value()
]);
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'seo_title' => 'required|min:45|max:70',
'seo_description' => 'required|min:50|max:160',
'title' => 'required|min:3|max:255',
'content' => 'present',
];
}
}

View file

@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Enum;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@ -481,4 +482,24 @@ class ToolboxHelper
{
return !$useStorage ? File::mimeType($value) : Storage::mimeType($value);
}
/**
* Get validated pagination from request.
*
* @param integer $default
* @param string $field
* @param string $enumPath
* @return integer
*/
public static function getValidatedEnum(int $default, string $field, string $enumPath): int
{
try {
return \intval(Validator::make(
[$field => \request()->get($field)],
[$field => new Enum($enumPath)]
)->validated()[$field]);
} catch (ValidationException $e) {
return $default;
}
}
}

179
app/Models/ActivityLog.php Normal file
View file

@ -0,0 +1,179 @@
<?php
namespace App\Models;
use App\Enums\ActivityLogs\ActivityLogsEventEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Str;
/**
* @property string $model Target model.
* @property string $model_id Id of the target model.
* @property \App\Enums\ActivityLogs\ActivityLogsEventEnum $event Event of this activity (ActivityLogsEventEnum).
* @property array $data Changes.
* @property-read \Illuminate\Support\Carbon $created_at Created date.
*
* @property-read \App\Models\User $user User BelongsTo relation.
*/
class ActivityLog extends Model
{
use HasFactory;
use Notifiable;
/**
* Indicates if the model should be timestamped.
*
* @var boolean
*/
public $timestamps = false;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'is_anonymous',
'model_class',
'model_id',
'event',
'data',
'created_at',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'is_anonymous' => 'bool',
'event' => ActivityLogsEventEnum::class,
'data' => 'json',
'created_at' => 'datetime',
];
// * METHODS
/**
* Add new activity to the activity logs list.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum
* @return void
*/
public static function addActivity(Model $model, ActivityLogsEventEnum $eventEnum): void
{
$isAnonymous = true;
/** @var \Illuminate\Database\Eloquent\Model|null */
$userModel = auth('backend')->user();
if (is_object($userModel)) {
$userModel = $userModel->getKeyForSelectQuery();
$isAnonymous = false;
}
$activity = new self();
$activity->user_id = $userModel;
$activity->is_console = app()->runningInConsole();
$activity->is_anonymous = $isAnonymous;
$activity->model_class = \get_class($model);
$activity->model_id = $model->getKey();
$activity->event = $eventEnum;
$activity->data = static::getChangedColumns($activity, $model, $eventEnum);
// @phpstan-ignore-next-line
$activity->created_at = now();
$activity->saveOrFail();
}
/**
* Get old, new columns that has changed.
*
* @param self $activity
* @param \Illuminate\Database\Eloquent\Model $model
* @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum
* @return array
*/
public static function getChangedColumns(self $activity, Model $model, ActivityLogsEventEnum $eventEnum): array
{
$modelClassName = $activity->model_class;
/** Get type of each fields of the target model */
/** @var \Illuminate\Database\Eloquent\Model|null $targetModel */
$targetModel = $activity->model_class::where(
(new $modelClassName())->getRouteKeyName(),
$activity->model_id
)->first();
if (\is_null($targetModel)) {
return [];
}
$targetModelTypes = collect($targetModel->toArray())
->map(fn ($value) => self::getValueType($value))
->toArray();
/** Return old, new and type of values changed */
return match ($eventEnum) {
ActivityLogsEventEnum::created => array_intersect_key($targetModelTypes, $model->toArray()),
ActivityLogsEventEnum::duplicated => array_intersect_key($targetModelTypes, $model->toArray()),
ActivityLogsEventEnum::updated => array_intersect_key($targetModelTypes, $model->getChanges()),
default => []
};
}
/**
* Get a value type as a string
* ! Use this for display purpose only
*
* @param mixed $value
* @return string
* @throws \RuntimeException If type is unhlanded.
* @phpcs:disable Generic.Metrics.CyclomaticComplexity.MaxExceeded
*/
private static function getValueType(mixed $value): string
{
// phpcs:enable
$type = \gettype($value);
switch ($type) {
// phpcs:ignore PSR2.ControlStructures.SwitchDeclaration.TerminatingComment
case 'string':
return match (true) {
Str::length(\strip_tags($value)) !== Str::length($value) => 'html',
Str::startsWith($value, 'storage/modelfiles') => 'file',
Str::isUuid($value) => 'uuid',
Str::isUlid($value) => 'ulid',
Str::isUrl($value) => 'url',
Str::isMatch('/^[0-9A-Za-z_-]{10}[048AEIMQUYcgkosw]$/', $value) => 'youtube_video_id',
\is_numeric($value) => 'numeric',
Str::isJson($value) and
(Str::startsWith($value, '[') or Str::startsWith($value, '{')) => 'json',
default => 'string'
};
case 'NULL':
case 'object':
case 'array':
case 'integer':
case 'boolean':
return $type;
case 'double':
return is_float($value) ? 'float' : 'double';
case 'resource (closed)':
case 'resource':
throw new \RuntimeException('Laravel model properties should not contain resources !');
case 'unknown type':
default:
throw new \RuntimeException('Unhandled Type ' . \gettype($value));
} //end switch
}
// * RELATIONS
/**
* User BelongsTo relation.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(User::class);
}
}

113
app/Models/StaticPage.php Normal file
View file

@ -0,0 +1,113 @@
<?php
namespace App\Models;
use App\Enums\StaticPageType;
use App\Lib\Helpers\ToolboxHelper;
use App\Traits\Models\ActivityLog;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
/**
* @property \App\Enums\StaticPageType $type Page type (StaticPageEnum).
* @property string $seo_title Seo title about 70 chars as recommended.
* @property string $seo_description Seo description about 160 chars as recommended.
* @property string $title Title for the page.
* @property string $slug Slug of the title for the page.
* @property string $content WYSIWYG text content using ckeditor.
* @property-read \Illuminate\Support\Carbon $created_at Created date.
* @property-read \Illuminate\Support\Carbon $updated_at Updated date.
*/
class StaticPage extends Model
{
use ActivityLog;
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'seo_title',
'seo_description',
'title',
'content',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'type' => StaticPageType::class,
];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted(): void
{
static::creating(function (self $model) {
// * ASSERTIONS
self::assertTitleIsUnique($model->title);
// * CHANGES
$model->slug = Str::slug($model->title);
});
static::updating(function (self $model) {
// * ASSERTIONS
self::assertTitleIsUnique($model->title, $model->id);
// * CHANGES
$model->slug = Str::slug($model->title);
});
}
// * ROUTABLE
/**
* Get the value of the model's route key.
*
* @return mixed
*/
public function getRouteKey()
{
/** @var \App\Enums\StaticPageType */
$enum = $this->getAttribute($this->getRouteKeyName());
return $enum->value();
}
/**
* Get the route key for the model.
*
* ! Type is the routable parameter
*
* @return string
*/
public function getRouteKeyName(): string
{
return 'type';
}
// * METHODS
/**
* Asserts using validation that the title is unique
*
* @param string|null $title
* @param integer|null $id
* @return void
* @throws \Illuminate\Validation\ValidationException If an actu title already exists.
*/
private static function assertTitleIsUnique(string|null $title, ?int $id = null)
{
$table = (new self())->getTable();
ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id);
ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id);
}
}

View file

@ -0,0 +1,54 @@
<?php
namespace App\Observers;
use App\Enums\ActivityLogs\ActivityLogsEventEnum;
use App\Models\ActivityLog;
use Illuminate\Database\Eloquent\Model;
class ModelObserver
{
/**
* Handle the model "created" event.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public static function created(Model $model): void
{
ActivityLog::addActivity($model, ActivityLogsEventEnum::created);
}
/**
* Handle the model "updated" event.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public static function updated(Model $model): void
{
ActivityLog::addActivity($model, ActivityLogsEventEnum::updated);
}
/**
* Handle the model "duplicated" event.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public static function duplicated(Model $model): void
{
ActivityLog::addActivity($model, ActivityLogsEventEnum::duplicated);
}
/**
* Handle the model "deleted" event.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public static function deleted(Model $model): void
{
ActivityLog::addActivity($model, ActivityLogsEventEnum::deleted);
}
}

View file

@ -0,0 +1,36 @@
<?php
namespace App\Policies;
use App\Models\StaticPage;
use App\Models\User;
class StaticPagePolicy
{
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $authUser
* @return boolean
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.Found
*/
public function viewAny(User $authUser): bool
{
// phpcs:enable
return true;
}
/**
* Determine whether the user can update the model.
*
* @param \App\Models\User $authUser
* @param \App\Models\StaticPage $static_page
* @return boolean
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
*/
public function update(User $authUser, StaticPage $static_page): bool
{
// phpcs:enable
return true;
}
}

View file

@ -0,0 +1,25 @@
<?php
namespace App\Traits\Controllers;
use Illuminate\Database\Eloquent\Model;
/**
* This trait works with Route::bind in App service provider
* to resolve the model and the DB row
* It does not work with binder Service
*/
trait UpdateModelPublished
{
/**
* Change model published.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return \Illuminate\Http\RedirectResponse
*/
public function changePublished(Model $model)
{
$model->update(['published' => !$model->getOriginal('published')]);
return redirect()->back()->with('success', trans(__('crud.messages.publish_status_saved')));
}
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\Traits\Models;
use App\Observers\ModelObserver;
/**
* If there is a static function in a trait (named boot[TraitName]),
* it will be executed as the boot() function would on an Eloquent model.
* Futhermore, event in the Model observer doesn't erase actual events in the model,
* but adds them.
*/
trait ActivityLog
{
/**
*
* @return void
*/
public static function bootActivityLog(): void
{
static::observe(ModelObserver::class);
}
}

View file

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::create('static_pages', function (Blueprint $table) {
$table->id();
$table->unsignedTinyInteger('type')->unique()->comment('Page type (StaticPageEnum)');
$table->string('seo_title')->comment('Seo title about 70 chars as recommended');
$table->string('seo_description')->comment('Seo description about 160 chars as recommended');
$table->string('title')->comment('Title for the page');
$table->string('slug')->unique()->comment('Unique title slug');
$table->text('content')->comment('WYSIWYG text content using ckeditor');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::dropIfExists('static_pages');
}
};

View file

@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::create('activity_logs', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete()
->comment('Id of the user associated, or nullable for a deleted user.');
$table->boolean('is_anonymous')->comment('If there is no user connected when action was realised.');
$table->boolean('is_console')->comment('If the action was realised in console.');
$table->string('model_class')->comment('Target model.');
$table->integer('model_id')->comment('Id of the target model.');
$table->integer('event')->comment('Event of this activity (ActivityLogsEventEnum).');
$table->json('data')->nullable()->comment('List of changes (old and new values).');
$table->timestamp('created_at')->comment('The date on which the user was published.');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::dropIfExists('activity_logs');
}
};

View file

@ -2,6 +2,7 @@
namespace Database\Seeders;
use Database\Seeders\StaticPageSeeder;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
@ -19,6 +20,7 @@ class DatabaseSeeder extends Seeder
ProductSeeder::class,
RecipeSeeder::class,
ShopSeeder::class,
StaticPageSeeder::class,
]);
}
}

View file

@ -0,0 +1,148 @@
<?php
namespace Database\Seeders;
use App\Enums\StaticPageType;
use App\Models\StaticPage;
use Illuminate\Database\Seeder;
class StaticPageSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// Legals.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::legals,
],
[
'seo_title' => 'Mentions légales et CGU',
'seo_description' => 'Mentions légales et conditions générales d\'utilisation du site internet du site internet Lionor',
'title' => 'Mentions légales',
'type' => StaticPageType::legals,
'content' => "
<h2>Introduction</h2>
<p>Nous vous remercions de lire ces conditions générales d'utilisation qui régissent les conditions d'accès et d'utilisation du site <a target='_blank' href='https://lionor.s-web.test' rel='noreferrer noopener'>lionor.fr</a>
<br><br>
<strong>Nous vous invitons à consulter régulièrement cette rubrique car la société Lionor peut être amenée à la modifier à tout moment.</strong>
<br><br>
<strong>Tout utilisateur déclare avoir lu et accepté les mentions légales et les conditions générales d'utilisation et s'engage à s'y conformer.</strong><br><br><br>
Mise à jour le 15/03/2023.</p>
<h2>Mentions légales</h2>
<p>Lionor RTE DE LA GARE 59189 STEENBECQUE<br>Tél : +33(0)328436055 SAS au capital de 1 646 400 euros - RCS de Dunkerque sous le numéro 305 507 303<br><br>
<strong>Editeur du Site</strong> : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans<br>
<strong>Directeur de la publication</strong> : Sylvain Gouet, Responsable Web Marketing Groupe LDC<br>
<strong>Conception du site et réalisation</strong> : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans<br>
<strong>Illustrations</strong> : Médiapole 2020<br>
<strong>Le site est hébergé par</strong> : OVH, via LDC, SAS au capital de 10 069 020 euros, RCS Lille Métropole 537 407 926, 2 rue Kellermann - 59100 Roubaix, Tel : 09 72 10 10 07, Mail : hosting@ml.ovh.net<br></p>
<h2>Droit d'auteur - Droit des marques - Protection des bases de données</h2>
<p>La présentation et le contenu du site constituent, ensemble, une œuvre protégée par les lois en vigueur des droits d'auteur, de la propriété intellectuelle et industrielle.
<br><br>
Les créations apparaissant sur le site (dessins, photographies, images, textes, séquences animées sonores ou non et autres documentations représentées), sont objets de droits d'auteur, de propriété industrielle et/ou intellectuelle et sont, selon les cas, propriété de la société Lionor ou de tiers ayant autorisé la société Lionor à les utiliser.
<br>Aucune exploitation commerciale, reproduction, représentation, utilisation, adaptation, modification, incorporation, traduction, commercialisation, partielle ou intégrale de ces éléments (y compris ceux téléchargeables ou copiables) ne pourra en être faite sans l'accord préalable et écrit de la société Lionor, à l'exception de l'utilisation pour un usage privé sous réserve des dispositions différentes voire plus restrictives du Code de la propriété intellectuelle.
<br>Toute utilisation non expressément autorisée peut engager la responsabilité civile et/ou pénale de son auteur. Lionor se réserve le droit d'engager des poursuites judiciaires à l'encontre de toute personne qui n'aurait pas respecté cette interdiction.</p>
<h2>Vie privée - Données personnelles - Cookies</h2>
<p>Nous vous invitons à vous reporter à notre Charte de confidentialité en <a target='_blank' href='https://lionor.s-web.test/politique-de-donnees-personnelles' rel='noreferrer noopener'>cliquant ici</a>.</p>
<h2>Mentions Sanitaires :</h2>
<p>Pour votre santé :<br>- mangez au moins cinq fruits et légumes par jour<br>- pratiquez une activité physique régulière<br>- évitez de manger trop gras, trop sucré, trop salé<br>- évitez de grignoter entre les repas</p>
<p>Pour toute information complémentaire, consultez le site <a target='_blank' href='https://www.mangerbouger.fr' rel='noreferrer noopener'>www.mangerbouger.fr</a></p>
<h2>Responsabilité</h2>
<p>Lionor a déployé ses meilleurs efforts pour s'assurer de l'exactitude des informations présentes sur son site internet (ci-après le Site). Cependant, Lionor n'est responsable ni de l'exactitude, ni des erreurs, ni des omissions contenues sur le Site. L'utilisateur est seul responsable de l'utilisation de telles informations.
<br>Lionor ne donne aucune garantie, explicite ou implicite, et n'assume aucune responsabilité qui pourrait résulter de l'accès ou de l'utilisation de ce Site incluant toutes détériorations ou virus qui pourraient infecter l'équipement informatique ou tout autre bien de l'utilisateur.
<br>Par ailleurs.
<br>Lionor pourra unilatéralement et à tout moment interrompre temporairement ou définitivement l'accès à tout ou partie du Site, y compris notamment le contenu, les fonctionnalités ou les heures de disponibilité, sans que sa responsabilité ne puisse être recherchée et sans que cela ne puisse donner lieu à l'allocation de dommages et intérêts de quelque nature que ce soit.
<br>Les pages du Site peuvent contenir des liens hypertextes renvoyant vers d'autres sites internet gérés par des sociétés distinctes de Lionor, et sur lesquels Lionor n'exerce aucune sorte de contrôle. Lionor n'est pas responsable du contenu de tout autre site auquel vous pourriez avoir accès via le Site ou les autres sites internet du groupe LDC. Tout utilisateur ou visiteur du Site ne peut mettre en place un lien hypertexte en direction de ce Site sans l'autorisation expresse préalable de Lionor.</p>",
]
);
// Policies.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::confidentiality,
],
[
'seo_title' => 'Politique des données personnelles',
'seo_description' => 'Lionor vous informe sur les données que nous collectons, comment nous les traitons, dans quelles finalités.',
'title' => 'Politique des données personnelles',
'type' => StaticPageType::confidentiality,
'content' => "
<h2>Introduction</h2>
<p>Le nouveau Règlement Général de l'Union Européenne sur la Protection des Données (RGPD), entré en vigueur le 25 mai 2018, vise à mieux encadrer la collecte, le traitement et l'utilisation de vos données personnelles.<br>Lionor, en sa qualité de responsable du traitement, renforce ses engagements pour garantir la protection et la sécurité des données à caractère personnel que vous lui confiez.<br><br></p>
<p>A ce titre, la présente Charte de confidentialité vous informe sur le type de données que nous collectons, comment nous les traitons, dans quelles finalités, de manière à rendre leur utilisation la plus adaptée à vos besoins.<br><br>
Le responsable de traitement, qui collecte et gère vos données, est la société Lionor, SA au capital social de 1 646 400 immatriculée au registre du commerce et des sociétés de Dunkerque sous le numéro 305 507 303, dont le siège social est RTE DE LA GARE 59189 STEENBECQUE.<br><br>
Pour toute question relative à notre Charte de confidentialité, merci de nous contacter via le formulaire de contact suivant:<br><a target='_blank' href='https://www.ldc.fr/rgpd/professionnels/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/professionnels/</a><br><a target='_blank' href='https://www.ldc.fr/rgpd/consommateurs/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/consommateurs/</a>
<br><a target='_blank' href='https://www.ldc.fr/rgpd/salaries/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/salaries/</a><br><br>Nous vous invitons à consulter régulièrement cette rubrique car Lionor peut être amené à la modifier à tout moment.
<br>La présente Charte de confidentialité a été mise à jour le 15/03/2023.</p>
<h2>Nos Engagements</h2>
<p>Conformément à la réglementation relative à la protection des données personnelles et à la vie privée, notamment la loi n°78-17 du 6 janvier 1978 relative à l'informatique, aux fichiers et aux libertés dite loi « Informatique et Libertés » et au Règlement (UE) 2016/679 du 25 mai 2018 relatif à la protection des personnes physiques à l'égard du traitement des données à caractère personnel et à la libre circulation de ces données, (ci-après le « Règlement RGPD»), Lionor s'engage à respecter les principes suivants : <br><br>
<strong>Consentement</strong>: vous devez avoir consenti à la collecte et au traitement de vos données. Si tel n'était pas le cas ou si vous avez changé d'avis, merci de vous reporter à l'article ci-dessous relatif à vos droits.<br><br>
<strong>Limitation des données collectées</strong>: nous ne collectons que les données qui sont strictement nécessaires au traitement et à l'utilisation envisagée. Nous vous rappelons qu'il n'y a aucune obligation à nous transmettre ces données. Toutefois certains services ou opérations promotionnelles nécessitent certaines données, faute de quoi vous ne pourriez y accéder.<br><br>
<strong>Limitation des finalités</strong>: les données que nous collectons sont traitées uniquement dans les finalités décrites ci-dessous.<br><br>
<strong>Limitation des durées de conservation</strong>: vos données sont conservées uniquement le temps nécessaire aux finalités de traitement pour lequel elles ont été collectées. Au-delà de cette durée si aucune obligation légale impose leur conservation, nous veillerons à ce que vos données soient supprimées, détruites ou anonymisées.<br><br>
<strong>Protection des données</strong>: en vue de sécuriser vos données et leur traitement, nous avons mis en place des mesures techniques et organisationnelles détaillées ci-dessous.<br><br>
<strong>Transparence et loyauté</strong>: lorsque Lionor collecte une donnée vous concernant, nous vous informons de l'utilisation qui en sera faite. C'est pourquoi nous vous conseillons de lire attentivement les informations qui vous sont transmises à travers notre site internet.</p>
<h2>Quelles données personnelles sont collectées ?</h2>
<p>Au sens du Règlement RGPD, une donnée à caractère personnel désigne toute information relative à une personne physique identifiée ou identifiable.<br><br>Les données personnelles collectées varient en fonction du but de la collecte et du service dont vous souhaitez bénéficier.<br>
<br>La société Lionor est amenée à collecter les catégories de données personnelles suivantes:<br><br>- coordonnées personnelles (civilité, nom, prénom, adresse e-mail, adresse postale) ; <br>- coordonnées personnelles non obligatoires (date de naissance, numéro de téléphone); <br>- identifiants utilisés pour accéder à votre compte en ligne (adresse IP, adresse e-mail et mot de passe);<br>- données relatives aux tickets de caisse de l'utilisateur ainsi que son RIB ou son compte Paypal;<br>- historiques de navigation, telles que les pages visitées et actions sur le site.<br>
<br>Vous vous engagez à fournir des données personnelles actualisées et valides et garantissez ne faire aucune fausse déclaration et ne donner aucune information erronée.</p>
<h2>Pourquoi vos données personnelles sont collectées ?</h2><p>Vos données peuvent être collectées dans la mesure où vous avez consenti de manière spécifique, libre et éclairée. Elles peuvent également être collectées pour satisfaire à l'exécution d'une obligation légale ou dans le cadre de la relation contractuelle construite avec vous (notamment conditions générales d'utilisation, conditions générales de vente) ou encore dans l'intérêt légitime de Lionor (par exemple pour assurer la sécurité des transactions).<br>
<br>Nous collectons vos données personnelles afin de vous fournir la meilleure expérience utilisateur à travers notre site internet.<br><br><strong>Ces données sont collectées aux fins suivantes </strong><br>- Gestion des fonctionnalités et de la qualité du site internet<br>- Gestion de votre inscription à notre Newsletter et de votre Compte utilisateur<br>- Accès à votre Compte utilisateur<br>- Gestion du recrutement<br>- Traitement de vos demandes de renseignements<br>- Communication des informations (promotions, nouveaux produits, activité de la marque)<br>- Gestion de votre participation à nos jeux, tirages au sort, activités promotionnelles<br>- Développement et amélioration des produits Lionor<br>- Statistiques<br>- Proposition de produits personnalisés et de communications adaptées ou pour recommandation de produits en fonction des besoins de consommateurs<br>- Partages sur les réseaux sociaux</p>
<h2>Quels sont vos droits ?</h2><p>Vous disposez d'un certain nombre de droits concernant vos données personnelles listés ci-dessous. <br><br>
<strong>Droit d'accès</strong> Vous pouvez demander la communication de vos données sous une forme accessible, la confirmation que vos données font ou ne font plus l'objet d'un traitement ainsi que la communication des informations relatives à vos données. Afin que vos données personnelles soient exactes, complètes, pertinentes et à jour, vous avez le droit d'accéder, de corriger ou de mettre à jour vos données personnelles à tout moment.<br><br>
<strong>Droit de rectification</strong><br>Vous êtes en droit de demander à ce que vos données soient rectifiées, complétées ou mises à jour lorsqu'elles sont inexactes, incomplètes, équivoques ou périmées.<br><br>
<strong>Droit à l'effacement </strong><br>Vous avez le droit de demander la suppression de vos données personnelles notamment lorsqu'elles ne sont plus nécessaires aux finalités pour lesquelles elles ont été collectées. Si les données personnelles collectées ne sont plus nécessaires à aucune finalité et qu'aucune obligation légale nous impose de les conserver, nous mettrons tout en œuvre pour supprimer, détruire ou anonymiser ces données.<br><br>
<strong>Droit à la limitation du traitement</strong><br>Vous avez le droit de demander la limitation du traitement de vos données personnelles si : <br><br>- vous contestez l'exactitude des données;<br>- vous souhaitez limiter le traitement des données qui n'avaient pas été traitées de manière licite plutôt que leur suppression; <br>- nous n'avons plus besoin de vos données personnelles mais celles-ci sont nécessaires pour la constatation, l'exercice ou la défense de vos droits en justice; <br>- vous vous êtes opposés au traitement de vos données personnelles et attendez de savoir si vos intérêts liés à cette objection l'emportent sur les motifs légitimes que nous poursuivons. <br><br>
<strong>Droit à la portabilité de vos données </strong><br>Lorsque le traitement est effectué à partir de procédés automatisés et que vous avez librement consenti au traitement de vos données personnelles pour une finalité que nous vous avions communiqué au préalable; ou lorsque nous traitons vos données dans le cadre d'une opération commerciale (ex: vous fournir un produit) vous avez le droit de demander:<br>- à recevoir vos données personnelles dans un format structuré, couramment utilisé et lisible par une machine;<br>- à ce que vos données personnelles soient transmises directement à une autre responsable de traitement, lorsque que cela est techniquement possible.<br><br>
<strong>Droit d'opposition</strong><br>Lorsque vos données sont traitées à des fins de prospection commerciale, vous avez le droit, à tout moment, de vous opposer au traitement de vos données personnelles et ce sans motif.</p>
<h2>Droit de porter réclamation auprès de la CNIL</h2>
<p>Si vous estimez que le traitement de vos données personnelles constitue une violation de la réglementation, vous pouvez introduire une réclamation auprès d'une autorité de contrôle, telle que la CNIL.<br><br>
<strong>Vous pouvez exercer ces droits à tout moment en nous contactant via le formulaire suivant :</strong><br><a target='_blank' href='https://www.ldc.fr/rgpd/professionnels/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/professionnels/</a><br><a target='_blank' href='https://www.ldc.fr/rgpd/consommateurs/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/consommateurs/</a><br><a target='_blank' href='https://www.ldc.fr/rgpd/salaries/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/salaries/</a><br><br>
<strong>Vous recevrez une réponse de notre part dans un délai d'un mois à compter de la réception de la demande. En cas de demande complexe ou du nombre important de demandes, le délai peut être prolongé de deux mois. </strong><br><br>
<strong>L'exercice des droits se fait à titre gratuit. Si toutefois la demande était manifestement infondée ou excessive, Lionor se réserve la possibilité d'appliquer des frais administratifs ou de refuser de donner suite à la demande. </strong></p>
<h2>Comment vos données personnelles sont protégées ?</h2>
<p>Afin d'assurer la sécurité de vos données personnelles nous avons mis en place des mesures de sécurité, notamment des contrôles d'accès, des pare-feux, des serveurs sécurisés.<br><br>Ces mesures visent à protéger vos données personnelles contre toute perte, détournement, mauvaise utilisation, divulgation, modification, interférence, dommage, accès non autorisé des données.<br><br>En cas de violation de vos données personnelles susceptible d'engendrer un risque pour vos droits et libertés, Lionor en notifie la violation à la CNIL dans les meilleurs délais et, si possible, 72 heures au plus tard après en avoir pris connaissance. Lionor vous en informera dans les meilleurs délais.</p>
<h2>Accès à vos données personnelles :</h2>
<p>Vos données personnelles sont destinées au personnel de Lionor habilité à les traiter, notamment le service marketing, développement durable, informatique, commercial, qualité et administratif.</p>
<h2>Partage de vos données personnelles :</h2>
<p>Conformément à la règlementation, quand nous sommes amenés à partager vos données personnelles avec des sous-traitants pour certaines finalités décrites dans la présente Charte, nous nous assurons que leur dispositif en matière de sécurité des données et de leur stockage est au moins aussi important que celui de notre organisation. Nous veillons également à ce qu'ils respectent les lois relatives à la protection des données personnelles dans des conditions au moins équivalentes à celles que nous respectons.<br>
<br>Par ailleurs, les sous-traitants étant amenés à traiter de vos données personnelles pour notre compte et sur nos instructions, nous nous engageons à ce que vos données personnelles ne soient pas partagées ou divulguées pour des finalités autres que celles décrites dans la présente Charte. Nous pouvons cependant être amenés à transmettre vos données, pour des finalités autres que celles prévues dans la Charte, dans les cas où leur communication est requise par la loi et les autorités gouvernementales.</p>
<h2>Transfert de vos données en dehors de l'espace économique Européen :</h2>
<p>Nous nous informons que vos données personnelles ne sont pas traitées en dehors de l'Espace Economique Européen (EEE). En cas de changement, nous vous en avertirons et mettrons tout en œuvre pour que ce transfert international de données dispose d'un niveau et de garanties de sécurité adéquats.</p>
<h2>Utilisation des cookies</h2>
<p>Les cookies sont des petits fichiers textes contenant des informations propres vous concernant stockés sur le disque dur de l'équipement informatique avec lequel vous vous êtes connectés sur le site internet et pouvant être lus seulement par le serveur qui l'a fourni. Les cookies sont gérés par votre navigateur internet.<br><br>Les cookies indiquent la fréquentation des pages que vous visitez, ce qui nous aide à connaître les informations qui vous intéressent. Cela permet de vous offrir plus de contenu qui vous intéresse et moins de contenu qui ne vous intéresse pas. <br><br>Les cookies vous permettent de stocker des préférences et les noms des utilisateurs, enregistrer des produits et des services, personnaliser des pages ou faire de la publicité ciblée.<br>
<br>A travers ces cookies, vos données personnelles peuvent être recueilles telles que :<br>
<br>- des informations concernant le navigateur de votre appareil et le système d'exploitation que vous utilisez;
<br>- l'adresse IP de l'appareil que vous utilisez;
<br>- les pages Web que vous consultez;
<br>- les liens sur lesquelles vous cliquez pendant que vous êtes en interaction avec nos services.<br>
<br>Le site internet <a target='_blank' href='https://lionor.s-web.test' rel='noreferrer noopener'>lionor.fr</a> utilise trois types de cookies qui ont des finalités différentes. Tous les cookies de type non techniques doivent recueillir votre consentement avant d'être installés. Vous pouvez donner votre consentement sur la page d'accueil du site internet, en cliquant sur « accepter ».<br>
<br>- Les cookies strictement nécessaires et fonctionnels Ces cookies sont nécessaires au bon fonctionnement du site internet. Ils vous permettent d'utiliser les principales fonctionnalités. Sans ces cookies, vous ne pourrez pas utiliser normalement le site internet.
<br>- Les cookies analytiques Ces cookies nous permettent de connaître l'utilisation et les performances du site internet et d'en améliorer son fonctionnement. <br>
<br>- Les cookies de ciblage<br>
<br>Ces cookies sont utilisés pour vous présenter des publicités ou vous adresser des informations adaptées à vos centres d'intérêts en dehors du site <a target='_blank' href='https://lionor.s-web.test' rel='noreferrer noopener'>lionor.fr</a> lors de votre navigation sur Internet. Le refus de ces cookies publicitaires n'a pas d'impact sur l'utilisation du site internet. Cependant, le fait de refuser les cookies publicitaires n'entraînera pas l'arrêt de la publicité sur Internet. Cela aura seulement pour effet d'afficher une publicité qui ne tiendra pas compte de vos centres d'intérêt ou de vos préférences.<br><br>
<strong>Vous avez le choix :</strong><br>
<br><strong>- d'accepter</strong> ces cookies en cliquant sur le bouton «Accepter» présent sur le bandeau Cookies, apparaissant au bas de votre page internet. Tant que vous n'avez pas accepté, les cookies ne pourront être stockés sur votre appareil; ou<br><br>
<strong>de refuser</strong> ces cookies via le bouton «Paramétrer» présent sur le bandeau Cookies ou les paramètres de votre navigateur internet.<br>
<br>Lorsque vous cliquez sur le bouton «Paramétrer» du bandeau Cookies, une liste s'affiche présentant les différents types de cookies par finalité. Si vous consentez au dépôt des cookies, il vous suffit de les activer puis de cliquer sur le bouton «Enregistrer» en bas de la fenêtre. Si vous refusez le dépôt des cookies, il vous suffit de cliquer sur le bouton «Enregistrer», le dépôt des cookies étant par défaut désactivé.<br>
<br>Pour en savoir plus sur la désactivation des cookies via votre navigateur internet :<br>
<br>Internet Explorer: <a target='_blank' href='http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies' rel='noreferrer noopener'>http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies</a>
<br>Chrome: <a target='_blank' href='http://support.google.com/chrome/bin/answer.py?hl=fr&amp;hlrm=en&amp;answer=95647' rel='noreferrer noopener'>http://support.google.com/chrome/bin/answer.py?hl=fr&amp;hlrm=en&amp;answer=95647</a>
<br>Firefox: <a target='_blank' href='https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur' rel='noreferrer noopener'>https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur</a>
<br>Safari: <a target='_blank' href='https://support.apple.com/fr-fr/guide/safari/sfri11471/mac' rel='noreferrer noopener'>https://support.apple.com/fr-fr/guide/safari/sfri11471/mac</a><br>
<br>La durée de conservation de ces informations dans votre appareil est d'une durée maximale de 13 mois. A l'expiration de ce délai, nous recueillerons de nouveau votre consentement. <br>Pour plus d'informations sur le paramétrage de vos cookies, vous pouvez consulter :<br><a target='_blank' href='http://www.youronlinechoices.com/fr/' rel='noreferrer noopener'>http://www.youronlinechoices.com/fr/</a><br><a target='_blank' href='https://www.allaboutcookies.org/' rel='noreferrer noopener'>https://www.allaboutcookies.org/</a></p>
<h2>Sites internet de tiers</h2>
<p>Le site internet Lionor peut être associé à des sites internet tiers. Les sites hébergés par des tiers sont hors de notre contrôle. Lorsque vous renseignez des données personnelles sur un site internet tiers, le traitement de ces données n'est pas effectué sur notre site internet, mais sur le site internet tiers concerné. Toute donnée personnelle que vous fournissez sera collectée et traitée conformément à la politique relative à la confidentialité des données du tiers concerné.<br>
<br>Par conséquent, nous n'assumons aucune responsabilité concernant les pratiques exercées par lesdits tiers en matière de protection des données.</p>
<h2>Droit applicable</h2>
<p>La présente Charte de confidentialité est régie et sera interprétée conformément au droit français.</p>
<h2>Nous contacter</h2>
<p>Si vous avez des questions, remarques ou réclamations relatives à la présente Charte de confidentialité, ou le traitement de vos données personnelles, veuillez-nous contacter à l'adresse :<br><br><a target='_blank' href='https://www.ldc.fr/rgpd/professionnels/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/professionnels/</a><br><a target='_blank' href='https://www.ldc.fr/rgpd/consommateurs/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/consommateurs/</a><br><a target='_blank' href='https://www.ldc.fr/rgpd/salaries/' rel='noreferrer noopener'>https://www.ldc.fr/rgpd/salaries/</a></p>
",
]
);
}
}

View file

@ -1,55 +1,73 @@
<?php
return [
'actions' => [
'list' => 'List',
'view' => 'View',
'create' => 'Create',
'update' => 'Update',
'delete' => 'Delete',
'save' => 'Save',
'edit' => 'Edit',
'actions' => [
'list' => 'List',
'view' => 'View',
'create' => 'Create',
'duplicate' => 'Duplicate',
'update' => 'Update',
'delete' => 'Delete',
'save' => 'Save',
'edit' => 'Edit',
],
'helpers' => [
'list' => 'List',
'list_all' => 'List all :model',
'create_model' => 'Create :model',
'view_model' => 'View :model',
'update_model' => 'Update :model',
'delete_model' => 'Delete :model',
'no_results' => 'No results for :models',
'publish' => 'Publish',
'unpublish' => 'Unpublish',
'helpers' => [
'list' => 'List',
'list_all' => 'List all :model',
'create_model' => 'Create :model',
'view_model' => 'View :model',
'update_model' => 'Update :model',
'duplicate_model' => 'Duplicate :model',
'delete_model' => 'Delete :model',
'save_model' => 'Save :model',
'edit_model' => 'Edit :model',
'no_results' => 'No results for :models',
'publish' => 'Publish',
'unpublish' => 'Unpublish',
'seo_title' => 'Must give a precise description of the page, which is recommended for optimum
positioning in search engines (<title> tag).',
'seo_description' => 'Must give a precise description of the page content (<meta> description tag).',
],
'libs' => [
'libs' => [
'toolbox' => [
'assertFieldIsUnique' => 'The :value for the :attribute field is already in use',
'assertNoInternalBoUrls' => ':attribute : It is forbidden to paste backoffice uri into this field',
'assertNoInternalUrls' => ':attribute : It is forbidden to paste a url of :appname into this field',
'assertFieldIsUnique' => 'The :value for the :attribute field is already in use',
'assertNoInternalBoUrls' => ':attribute : It is forbidden to paste back-office uri into this field',
'assertNoInternalUrls' => ':attribute : It is forbidden to paste a url of :appname into this field',
]
],
'messages' => [
'has_been_created' => ':model has been created',
'cannot_be_created' => ':model cannot be created',
'has_been_updated' => ':model has been updated',
'cannot_be_updated' => ':model cannot be updated',
'has_been_deleted' => ':model has been deleted',
'cannot_be_deleted' => ':model cannot be deleted'
'messages' => [
'has_been_created' => ':model has been created',
'cannot_be_created' => ':model cannot be created',
'has_been_updated' => ':model has been updated',
'cannot_be_updated' => ':model cannot be updated',
'has_been_deleted' => ':model has been deleted',
'cannot_be_deleted' => ':model cannot be deleted',
'order_changed' => 'The order has been changed!',
'order_not_changed' => 'The order hasn\'t been changed!',
'publish_status_saved' => 'Change of publication status successful!',
'right' => 'You don\'t have the rights to access this part !'
],
'minicrud' => [
'visibility_label' => 'Visibility',
'visibility_helper' => 'Check to make it visible.',
'enum_select' => 'Select :enum from the list.',
'associated_enum' => 'Associated :enum',
'dimensions_must_be' => 'Must be :widthpx (width) by :heightpx (height).',
'picture_title_helper' => 'Useful for users, displayed by moving the mouse over the image',
'picture_title_label' => 'Title attribute of the image',
'picture_alt_helper' => 'Must describe your image for search engines and blind people (5 to 6 words)',
'picture_alt_label' => 'Alt attribute of the image',
'text_warning' => 'Proofread your content before publishing it',
'pagination' => [
"previous" => "Previous page",
"next" => "Next page",
"specific_page" => "Go to page n°:id",
'paginate_list' => 'Number of elements per page',
],
'other' => [
'up' => 'Change the order of appearance upwards',
'down' => 'Change the order of appearance downwards',
'no_model_found' => 'No :model found|No :model found',
'publish' => 'Published',
'unpublish' => 'Unpublished',
'sort_ascending' => 'Sort :name in ascending order',
'sort_descending' => 'Sort :name in descending order',
'sort_delete' => 'Delete sorting',
'sort_arrow' => 'Here, the arrows are used to sort, not filter.',
'right' => 'You don\'t have the rights',
]
];

View file

@ -2,12 +2,13 @@
return [
'classes' => [
'home' => 'Home',
'shops' => 'Sign',
'ranges' => 'Ranges',
'recipes' => 'Recipes',
'slides' => 'Slides',
'products' => 'Products',
'certifications' => 'Certifications'
'home' => 'Home',
'shops' => 'Sign',
'ranges' => 'Ranges',
'recipes' => 'Recipes',
'slides' => 'Slides',
'products' => 'Products',
'certifications' => 'Certifications',
'static_page' => 'Static page|Static pages',
]
];

View file

@ -1,163 +1,144 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'accepted_if' => 'The :attribute must be accepted when :other is :value.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => 'The :attribute must only contain letters.',
'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.',
'alpha_num' => 'The :attribute must only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
"accepted" => "The :attribute must be accepted.",
"accepted_if" => "The :attribute must be accepted when :other is :value.",
"active_url" => "The :attribute is not a valid URL.",
"after" => "The :attribute must be a date after :date.",
"after_or_equal" => "The :attribute must be a date after or equal to :date.",
"alpha" => "The :attribute must only contain letters.",
"alpha_dash" => "The :attribute must only contain letters, numbers, dashes and underscores.",
"alpha_num" => "The :attribute must only contain letters and numbers.",
"array" => "The :attribute must be an array.",
"before" => "The :attribute must be a date before :date.",
"before_or_equal" => "The :attribute must be a date before or equal to :date.",
"between" => [
"numeric" => "The :attribute must be between :min and :max.",
"file" => "The :attribute must be between :min and :max kilobytes.",
"string" => "The :attribute must be between :min and :max characters.",
"array" => "The :attribute must have between :min and :max items.",
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'current_password' => 'The password is incorrect.',
'date' => 'The :attribute is not a valid date.',
'date_equals' => 'The :attribute must be a date equal to :date.',
'date_format' => 'The :attribute does not match the format :format.',
'declined' => 'The :attribute must be declined.',
'declined_if' => 'The :attribute must be declined when :other is :value.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'ends_with' => 'The :attribute must end with one of the following: :values.',
'enum' => 'The selected :attribute is invalid.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'numeric' => 'The :attribute must be greater than :value.',
'file' => 'The :attribute must be greater than :value kilobytes.',
'string' => 'The :attribute must be greater than :value characters.',
'array' => 'The :attribute must have more than :value items.',
"boolean" => "The :attribute field must be true or false.",
"confirmed" => "The :attribute confirmation does not match.",
"current_password" => "The password is incorrect.",
"date" => "The :attribute is not a valid date.",
"date_equals" => "The :attribute must be a date equal to :date.",
"date_format" => "The :attribute does not match the format :format.",
'declined' => 'The :attribute field must be declined.',
'declined_if' => 'The :attribute field must be declined when :other has the value :value.',
"different" => "The :attribute and :other must be different.",
"digits" => "The :attribute must be :digits digits.",
"digits_between" => "The :attribute must be between :min and :max digits.",
"dimensions" => "The :attribute has invalid image dimensions.",
"distinct" => "The :attribute field has a duplicate value.",
"email" => "The :attribute must be a valid email address.",
"ends_with" => "The :attribute must end with one of the following: :values.",
"exists" => "The selected :attribute is invalid.",
'enum' => 'The :attribute field selected is invalid.',
"file" => "The :attribute must be a file.",
"filled" => "The :attribute field must have a value.",
"gt" => [
"numeric" => "The :attribute must be greater than :value.",
"file" => "The :attribute must be greater than :value kilobytes.",
"string" => "The :attribute must be greater than :value characters.",
"array" => "The :attribute must have more than :value items.",
],
'gte' => [
'numeric' => 'The :attribute must be greater than or equal to :value.',
'file' => 'The :attribute must be greater than or equal to :value kilobytes.',
'string' => 'The :attribute must be greater than or equal to :value characters.',
'array' => 'The :attribute must have :value items or more.',
"gte" => [
"numeric" => "The :attribute must be greater than or equal to :value.",
"file" => "The :attribute must be greater than or equal to :value kilobytes.",
"string" => "The :attribute must be greater than or equal to :value characters.",
"array" => "The :attribute must have :value items or more.",
],
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'lt' => [
'numeric' => 'The :attribute must be less than :value.',
'file' => 'The :attribute must be less than :value kilobytes.',
'string' => 'The :attribute must be less than :value characters.',
'array' => 'The :attribute must have less than :value items.',
"image" => "The :attribute must be an image.",
"in" => "The selected :attribute is invalid.",
"in_array" => "The :attribute field does not exist in :other.",
"integer" => "The :attribute must be an integer.",
"ip" => "The :attribute must be a valid IP address.",
"ipv4" => "The :attribute must be a valid IPv4 address.",
"ipv6" => "The :attribute must be a valid IPv6 address.",
"json" => "The :attribute must be a valid JSON string.",
"lt" => [
"numeric" => "The :attribute must be less than :value.",
"file" => "The :attribute must be less than :value kilobytes.",
"string" => "The :attribute must be less than :value characters.",
"array" => "The :attribute must have less than :value items.",
],
'lte' => [
'numeric' => 'The :attribute must be less than or equal to :value.',
'file' => 'The :attribute must be less than or equal to :value kilobytes.',
'string' => 'The :attribute must be less than or equal to :value characters.',
'array' => 'The :attribute must not have more than :value items.',
"lte" => [
"numeric" => "The :attribute must be less than or equal to :value.",
"file" => "The :attribute must be less than or equal to :value kilobytes.",
"string" => "The :attribute must be less than or equal to :value characters.",
"array" => "The :attribute must not have more than :value items.",
],
'mac_address' => 'The :attribute must be a valid MAC address.',
'max' => [
'numeric' => 'The :attribute must not be greater than :max.',
'file' => 'The :attribute must not be greater than :max kilobytes.',
'string' => 'The :attribute must not be greater than :max characters.',
'array' => 'The :attribute must not have more than :max items.',
'mac_address' => 'The :attribute field must be a valid MAC address.',
"max" => [
"numeric" => "The :attribute must not be greater than :max.",
"file" => "The :attribute must not be greater than :max kilobytes.",
"string" => "The :attribute must not be greater than :max characters.",
"array" => "The :attribute must not have more than :max items.",
],
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
"mimes" => "The :attribute must be a file of type: :values.",
"mimetypes" => "The :attribute must be a file of type: :values.",
"min" => [
"numeric" => "The :attribute must be at least :min.",
"file" => "The :attribute must be at least :min kilobytes.",
"string" => "The :attribute must be at least :min characters.",
"array" => "The :attribute must have at least :min items.",
],
'multiple_of' => 'The :attribute must be a multiple of :value.',
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute format is invalid.',
'numeric' => 'The :attribute must be a number.',
'password' => 'The password is incorrect.',
'present' => 'The :attribute field must be present.',
'prohibited' => 'The :attribute field is prohibited.',
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
"multiple_of" => "The :attribute must be a multiple of :value.",
"not_in" => "The selected :attribute is invalid.",
"not_regex" => "The :attribute format is invalid.",
"numeric" => "The :attribute must be a number.",
"password" => "The password is incorrect.",
"present" => "The :attribute field must be present.",
'prohibited' => 'The :attribute field is forbidden.',
'prohibited_if' => 'The :attribute field is forbidden when :other has the value :value.',
'prohibited_unless' => 'The :attribute field is forbidden unless :other is one of the :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
"regex" => "The :attribute format is invalid.",
"required" => "The :attribute field is required.",
'required_array_keys' => 'The :attribute field must contain entries for :values.',
"required_if" => "The :attribute field is required when :other is :value.",
"required_unless" => "The :attribute field is required unless :other is in :values.",
"required_with" => "The :attribute field is required when :values is present.",
"required_with_all" => "The :attribute field is required when :values are present.",
"required_without" => "The :attribute field is required when :values is not present.",
"required_without_all" => "The :attribute field is required when none of :values are present.",
"same" => "The :attribute and :other must match.",
"size" => [
"numeric" => "The :attribute must be :size.",
"file" => "The :attribute must be :size kilobytes.",
"string" => "The :attribute must be :size characters.",
"array" => "The :attribute must contain :size items.",
],
'starts_with' => 'The :attribute must start with one of the following: :values.',
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid timezone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute must be a valid URL.',
'uuid' => 'The :attribute must be a valid UUID.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
"starts_with" => "The :attribute must start with one of the following: :values.",
"string" => "The :attribute must be a string.",
"timezone" => "The :attribute must be a valid timezone.",
"unique" => "The :attribute has already been taken.",
"uploaded" => "The :attribute failed to upload.",
"url" => "The :attribute must be a valid URL.",
"uuid" => "The :attribute must be a valid UUID.",
'attributes' => [
'firstname' => 'Firstname',
'lastname' => 'Lastname',
'email' => 'E-mail',
'publication' => 'Publication',
'updated_at' => 'Updated_at',
'order' => 'Order',
],
"custom" => [
'of_the' => [
'male' => 'of the ',
'female' => 'of the ',
'vowel' => 'of the '
],
'event' => 'event',
'model' => 'target element',
'order' => 'order',
'publication' => 'publication',
'activated' => 'activated',
'target' => 'target',
'static_page_type' => 'static page type',
'seo_title' => 'SEO title',
'seo_description' => 'SEO description',
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [],
];

View file

@ -2,29 +2,29 @@
return [
'ImageInputComponent' => [
'choose_a_file' => 'Choose a file',
'change_source_picture' => 'Edit Source Image',
'view_source_picture' => 'View image',
'resize_source_picture' => 'Resize image',
'resized_source_picture' => 'Image resized',
'preview_picture' => 'Image preview',
'change_picture_before_import' => 'Image modification before import',
'close_window' => 'Close the window',
'close_and_validate' => 'Validate the content and close the window',
'choose_a_file' => 'Choose a file',
'change_source_picture' => 'Edit Source Image',
'view_source_picture' => 'View image',
'resize_source_picture' => 'Resize image',
'resized_source_picture' => 'Image resized',
'preview_picture' => 'Image preview',
'change_picture_before_import' => 'Image modification before import',
'close_window' => 'Close the window',
'close_and_validate' => 'Validate the content and close the window',
'close_window_without_validation' => 'Close the window without validating the content',
'zoom_in' => 'Zoom in',
'zoom_out' => 'Zoom out',
'move_left' => 'Move left',
'move_right' => 'Move right',
'move_up' => 'Move up',
'move_down' => 'Move down',
'mirror_horizontal' => 'Horizontal mirror',
'mirror_vertical' => 'Vertical mirror',
'rotation' => 'Rotation',
'rotate_rewind' => 'Counter-clockwise rotation',
'rotate' => 'Clockwise rotation',
'degres' => ':deg degrees',
'validate' => 'Validate',
'preview' => 'Preview',
'zoom_in' => 'Zoom in',
'zoom_out' => 'Zoom out',
'move_left' => 'Move left',
'move_right' => 'Move right',
'move_up' => 'Move up',
'move_down' => 'Move down',
'mirror_horizontal' => 'Horizontal mirror',
'mirror_vertical' => 'Vertical mirror',
'rotation' => 'Rotation',
'rotate_rewind' => 'Counter-clockwise rotation',
'rotate' => 'Clockwise rotation',
'degres' => ':deg egrees',
'validate' => 'Validate',
'preview' => 'Preview',
]
];

View file

@ -1,57 +1,73 @@
<?php
return [
'actions' => [
'list' => 'Liste',
'view' => 'Voir',
'create' => 'Créer',
'update' => 'Mettre à jour',
'delete' => 'Supprimer',
'save' => 'Enregistrer',
'edit' => 'Editer',
'actions' => [
'list' => 'Liste',
'view' => 'Voir',
'create' => 'Créer',
'duplicate' => 'Dupliquer',
'update' => 'Éditer',
'delete' => 'Supprimer',
'save' => 'Sauvegarder',
'edit' => 'Mettre à jour',
],
'helpers' => [
'list' => 'Liste',
'list_all' => 'Liste des :model',
'create_model' => 'Créer un(e) :model',
'view_model' => 'Voir le/la :model',
'update_model' => 'Mettre à jour le/la :model',
'delete_model' => 'Supprimer le/la :model',
'no_results' => 'Aucun résultat pour :models',
'publish' => 'Publier',
'unpublish' => 'Dépublier',
'helpers' => [
'list' => 'Liste',
'list_all' => 'Lister tous les :model',
'create_model' => 'Créer :model',
'view_model' => 'Voir :model',
'update_model' => 'Éditer :model',
'duplicate_model' => 'Dupliquer :model',
'delete_model' => 'Supprimer :model',
'save_model' => 'Sauvegarder :model',
'edit_model' => 'Mettre à jour :model',
'no_results' => 'Aucun résultat pour :model',
'publish' => 'Publié',
'unpublish' => 'Dépublié',
'seo_title' => 'Doit décrire précisément la page, recommandation pour un positionnement
optimal dans les moteurs de recherche (balise <title>).',
'seo_description' => 'Doit décrire précisément le contenu de la page (balise <meta> description).',
],
'libs' => [
'libs' => [
'toolbox' => [
'assertFieldIsUnique' => 'La valeur :value pour le champ :attribute field est déjà utilisée',
'assertNoInternalBoUrls' => ':attribute : Il est interdit de coller une uri du backoffice dans ce champ',
'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ',
'assertFieldIsUnique' => 'La :valeur du champ :attribut est déjà utilisée',
'assertNoInternalBoUrls' => ':attribute : Il est interdit de coller l\'uri de back-office dans ce champ',
'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ.',
]
],
'messages' => [
'has_been_created' => ':model a été créé',
'cannot_be_created' => ':model ne peut pas être créé',
'has_been_updated' => ':model a été mis à jour',
'cannot_be_updated' => ':model ne peut pas être mis à jour',
'has_been_deleted' => ':model a été supprimé',
'cannot_be_deleted' => ':model ne peut pas être supprimé'
'messages' => [
'has_been_created' => ':model a été créé',
'cannot_be_created' => ':model ne peut être créé',
'has_been_updated' => ':model a été mis à jour',
'cannot_be_updated' => ':model ne peut être mis à jour',
'has_been_deleted' => ':model a été supprimé',
'cannot_be_deleted' => ':model ne peut être supprimé',
'order_changed' => 'L\'ordre a été changé !',
'order_not_changed' => 'L\'ordre n\'a pas été changé !',
'publish_status_saved' => 'Changement de l\'état de publication réussit !',
'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !'
],
'minicrud' => [
'visibility_label' => 'Visibilité',
'visibility_helper' => 'Cochez pour rendre visible.',
'select' => 'Sélectionnez un(e) :entity depuis la liste.',
'associated' => ':entity associé(e)',
'dimensions_must_be' => 'Doit être de :widthpx (largeur) par :heightpx (hauteur).',
'picture_title_helper' => 'Utile pour les utilisateurs, affiché lorsque la souris est sur l\'image',
'picture_title_label' => 'Attribut \'title\' de l\'image',
'picture_alt_helper' => 'Doit décrire l\'image pour les moteurs de recherches et les personnes malvoyantes
(5 à 6 mots)',
'picture_alt_label' => 'Attribut \'alt\' de l\'image',
'text_warning' => 'Relisez votre contenu avant de le publier',
'pagination' => [
"previous" => "Page précédente",
"next" => "Page suivante",
"specific_page" => "Accéder à la page n°:id",
'paginate_list' => 'Nombre d\'éléments par page',
],
'other' => [
'up' => 'Modifier l\'ordre d\'apparition vers le haut',
'down' => 'Modifier l\'ordre d\'apparition vers le bas',
'no_model_found' => 'Aucun :model trouvé|Aucune :model trouvée',
'publish' => 'Publié',
'unpublish' => 'Dépublié',
'sort_ascending' => 'Trier :name dans l\'ordre croissant',
'sort_descending' => 'Trier :name dans l\'ordre décroissant',
'sort_delete' => 'Supprimer le tri',
'sort_arrow' => 'Ici, les flèches sont utilisées pour trier et non pour filtrer',
'right' => 'Vous n\'avez pas les droits',
]
];

View file

@ -2,12 +2,13 @@
return [
'classes' => [
'home' => 'Accueil',
'shops' => 'Enseignes',
'ranges' => 'Gammes',
'recipes' => 'Recettes',
'slides' => 'Slides',
'products' => 'Produits',
'certifications' => 'Certifications'
'home' => 'Accueil',
'shops' => 'Enseignes',
'ranges' => 'Gammes',
'recipes' => 'Recettes',
'slides' => 'Slides',
'products' => 'Produits',
'certifications' => 'Certifications',
'static_page' => 'Page statique|Pages statiques'
]
];

View file

@ -1,18 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'Le champ :attribute doit être accepté.',
'accepted_if' => 'Le champ :attribute doit être accepté quand :other a la valeur :value.',
'active_url' => 'Le champ :attribute n\'est pas une URL valide.',
@ -129,26 +117,87 @@ return [
'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.',
'url' => 'Le format de l\'URL de :attribute n\'est pas valide.',
'uuid' => 'Le champ :attribute doit être un UUID valide',
'custom' => [],
'phone' => 'Le champ :attribute n\'est pas un numéro de téléphone valide.',
'color' => ':attribute doit être un code couleur valide (hexadecimal, RGB, RGBA ou un nom de couleur CSS)',
'color_hex' => ':attribute doit être un code couleur hexadecimal valide',
'color_rgb' => ':attribute doit être un code couleur RGB valide',
'color_rgba' => ':attribute doit être un code couleur RGBA valide',
'color_name' => ':attribute doit être un nom de couleur CSS valide',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'postal_code' =>
'Le champ :attribute accepte les codes postaux des pays suivants :countries comme par exemple :examples.',
'custom' => [
'text_warning' => 'Relisez votre contenu avant de le publier (minimum :number caractères).',
'text_proofread' => 'Relisez votre contenu avant de le publier.',
'select_entity' => 'Sélectionnez :entity dans la liste déroulante.',
'color' => 'Sélectionnez :entity parmis les couleurs existantes.',
'dimensions_must_be' => 'Doit être :widthpx (largeur) par :heightpx (hauteur).',
'image_alt' => 'La description de l\'image doit être adaptée aux moteurs de recherche et
aux non-voyants (5 à 6 mots, minimum 3 caractères).',
'image_title' =>
'Utile pour les utilisateurs, affiché en passant la souris sur l\'image
(minimum 3 caractères).',
'seo_title_helper' => 'Doit décrire précisément la page, recommandation pour un positionnement
optimal dans les moteurs de recherche (balise <title>).',
'seo_description_helper' => 'Doit décrire précisément le contenu de la page (balise <meta> description).',
'event_text_helper' => 'Doit décrire l\'évènement.',
'slider_pictures' => 'Les images du slider doivent être de :widthpx (largeur) par :heightpx (hauteur),
(minimum :min et maximum :max images sont autorisées).',
'list_items' => 'Doit décrire la valeur du :field (minimum :min caractères,
:lineMin à :lineMax lignes).',
'of_the' => [
'male' => 'du ',
'female' => 'de la ',
'vowel' => 'de l\''
],
'event' => 'évènement',
'model' => 'élément ciblé',
'order' => 'ordre',
'publication' => 'publication',
'activated' => 'activé',
'target' => 'cible',
'static_page_type' => 'type de page',
'seo_title' => 'titre SEO',
'seo_description' => 'description SEO',
],
'attributes' => [
'advantages' => 'Avantages',
'associated_news' => 'Actualités associées',
'associated_products' => 'Produits associés',
'attribute_alt' => 'Attribut alt',
'attribute_title' => 'Attribut title',
'button' => 'Bouton',
'caliber' => 'Calibre',
'categories' => 'Catégorie(s)',
'color' => 'Couleur',
'content' => 'Contenu',
'content_bloc' => 'Corps du bloc',
'cooking_time' => 'Temps de cuisson',
'created_at' => 'Créé le',
'declare_event' => 'Déclarer un évènement',
'description' => 'Description',
'difficulty' => 'Difficulté',
'event_end' => 'Date de fin de l\'évènement',
'event_start' => 'Date de début de l\'évènement',
'event' => 'Évènement',
'general_informations' => 'Informations générales',
'high_point' => 'Point fort',
'id' => 'Id',
'ingredients' => 'Ingrédients',
'label' => 'Libellé',
'link' => 'Lien',
'nutritionnal_values' => 'Valeurs nutritionnelles',
'order' => 'Ordre',
'packaging' => 'Conditionnement',
'page' => 'Espèce',
'picture_banner' => 'Bannière',
'picture_thumbnail_sm' => 'Petite vignette',
'picture_thumbnail' => 'Vignette',
'picture' => 'Image',
'preparation_time' => 'Temps de préparation',
'preparation' => 'Préparation',
'seo_description' => 'Description SEO',
'seo_title' => 'Titre SEO',
'seo' => 'Contenu SEO',
'species' => 'Espèce',
'status' => 'État de publication',
'subtitle' => 'Sous-titre',
'title' => 'Titre',
'updated_at' => 'Mis à jour le',
'youtube_video' => 'Vidéo Youtube',
'guests_nb' => 'Nombre de convives',
'advice' => 'Conseil',
'preparation' => 'Préparation',
],
];

View file

@ -2,29 +2,29 @@
return [
'ImageInputComponent' => [
'choose_a_file' => 'Choisir un fichier',
'change_source_picture' => 'Editer l\'image source',
'view_source_picture' => 'Voir l\'image',
'resize_source_picture' => 'Redimensonner l\'image',
'resized_source_picture' => 'Image redimensionnée',
'preview_picture' => 'Aperçu de l\'image',
'change_picture_before_import' => 'Modification de l\'image avant l\'import',
'close_window' => 'Fermer la fenêtre',
'close_and_validate' => 'Valider le contenu et fermer la fenêtre',
'choose_a_file' => 'Choisir un fichier',
'change_source_picture' => 'Modifier l\'image source',
'view_source_picture' => 'Voir l\'image',
'resize_source_picture' => 'Redimensionner l\'image',
'resized_source_picture' => 'Image redimensionnée',
'preview_picture' => 'Aperçu de l\'image',
'change_picture_before_import' => 'Modification de l\'image avant l\'importation',
'close_window' => 'Fermer la fenêtre',
'close_and_validate' => 'Valider le contenu et fermer la fenêtre',
'close_window_without_validation' => 'Fermer la fenêtre sans valider le contenu',
'zoom_in' => 'Zoomer',
'zoom_out' => 'Dézommer',
'move_left' => 'Déplacer vers la gauche',
'move_right' => 'Déplacer vers la droite',
'move_up' => 'Déplacer vers le haut',
'move_down' => 'Déplacer vers le bas',
'mirror_horizontal' => 'Symétrie horizontale',
'mirror_vertical' => 'Symétrie verticale',
'rotation' => 'Rotation',
'rotate_rewind' => 'Rotation antihoraire',
'rotate' => 'Rotation horaire',
'degres' => ':deg degrés',
'validate' => 'Valider',
'preview' => 'Aperçu',
'zoom_in' => 'Zoom avant',
'zoom_out' => 'Zoom arrière',
'move_left' => 'Déplacer vers la gauche',
'move_right' => 'Déplacer vers la droite',
'move_up' => 'Déplacer en vers le haut',
'move_down' => 'Déplacer en vers le bas',
'mirror_horizontal' => 'Miroir horizontal',
'mirror_vertical' => 'Miroir vertical',
'rotation' => 'Rotation',
'rotate_rewind' => 'Rotation dans le sens inverse des aiguilles d\'une montre',
'rotate' => 'Rotation dans le sens des aiguilles d\'une montre',
'degres' => ':deg degrés',
'validate' => 'Valider',
'preview' => 'Prévisualisation',
]
];

View file

@ -51,5 +51,12 @@
{{ __('models.classes.shops') }}
</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark @if (request()->routeIs('bo.static_pages.*')) fw-bold @endif" data-bs-toggle="tooltip"
href="{{ route('bo.static_pages.index', ['sort_col' => 'updated_at', 'sort_way' => 'desc']) }}"
title="{{ __('Administrer les :model', ['model' => trans_choice('models.classes.static_page', '*')]) }}">
{{ Str::title(trans_choice('models.classes.static_page', '*')) }}
</a>
</li>
</ul>
@endauth

View file

@ -0,0 +1,56 @@
@extends('bo.layout', ['brParam' => $staticPageModel])
@section('title', sprintf('%s - %s %s', __('models.classes.static_page'), Str::ucfirst(__('édition')), $staticPageModel->title))
@section('breadcrumb', request()->route()->getName())
@section('content')
<div class="card">
<div class="card-header">
<div class="row">
<div class="col">
<h1 class="col h4">
<a href="{{ route('bo.static_pages.index') }}" class="text-decoration-none btn btn-sm btn-primary"
role="button" aria-roledescription="{{ __('Revenir en arrière') }}">
<i class="fa-solid fa-arrow-left-long"></i>
</a>
<span>&nbsp;{{ Str::title(trans_choice('models.classes.static_page', '*')) }}&nbsp;{{ __('édition') }}</span>
</h1>
</div>
<div class="col text-end">
<div class="btn-group" role="group">
<a class="btn btn-warning"
href="{{ route('legals') }}"
title="{{ __('Voir :model', [
'model' => Str::singular(__('models.classes.static_page')),
]) }}"
target="_blank"
data-bs-toggle="tooltip"><i class="fa-solid fa-eye"></i></a>
<a id="formSubmitClone" class="btn btn-primary" role="button"
title="{{ __('Enregistrer :model', [
'model' => Str::singular(__('models.classes.static_page')),
]) }}"
data-bs-toggle="tooltip">{{ __('Enregistrer') }}</a>
</div>
</div>
</div>
</div>
<div class="card-body">
<form id="formSubmit" action="{{ route('bo.static_pages.update', $staticPageModel) }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
@include('bo.pages.static_pages.form', compact('staticPageModel'))
<div class="row">
<div class="col text-center text-md-end">
<button type="submit" class="btn btn-primary"
title="{{ __('Enregister :model', [
'model' => Str::singular(__('models.classes.static_page')),
]) }}"
data-bs-toggle="tooltip">{{ __('Enregister') }}</button>
</div>
</div>
</form>
</div>
</div>
@endsection

View file

@ -0,0 +1,171 @@
<div class="row">
{{-- TYPE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.static_page_type')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.tinyint-enum', [
'id' => 'userRole',
'label' => __('Associer un type'),
'name' => 'type',
'model' => $staticPageModel ?? null,
'required' => false,
'disabled' => true,
'associatedModels' => \App\Enums\StaticPageType::toArray(),
'helper' => '',
])
</div>
</div>
</fieldset>
</div>
{{-- TITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.title')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.varchar', [
'id' => 'userFirstname',
'label' => __('Titre de la :model', ['model' => trans_choice('models.classes.static_page', 1)]),
'hasWordCounter' => true,
'name' => 'title',
'required' => true,
'model' => $staticPageModel ?? null,
'helper' => __('validation.between.string', [
'attribute' => __('titre de la :model', ['model' => trans_choice('models.classes.static_page', 1)]),
'min' => 3,
'max' => 255,
]),
'placeholder' => __('Un titre clair et concis'),
])
</div>
</div>
</fieldset>
</div>
</div>
<div class="row">
{{-- SEO_TITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo_title')) }}</legend>
<div class="row">
<div class="col-12 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'staticPagesSeoTitle',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_title')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
'hasWordCounter' => true,
'name' => 'seo_title',
'required' => true,
'model' => $staticPageModel ?? null,
'helper' => sprintf(
'%s %s',
__('crud.helpers.seo_title'),
__('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => __('validation.custom.seo_title'),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
'min' => 45,
'max' => 70,
])),
'placeholder' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_title')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
])
</div>
</div>
</fieldset>
</div>
{{-- SEO_DESCRIPTION --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo_description')) }}</legend>
<div class="row">
<div class="col-12">
@include('bo.partials.inputs.varchar-multiline', [
'id' => 'staticPagesSeoDescription',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_description')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
'name' => 'seo_description',
'model' => $staticPageModel ?? null,
'required' => true,
'helper' => sprintf(
'%s %s',
__('crud.helpers.seo_description'),
__('validation.between.string', [
'attribute' => __(':field :inter:model', [
'field' => __('validation.custom.seo_description'),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
'min' => 50,
'max' => 160,
])),
'placeholder' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.custom.seo_description')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
])
</div>
</div>
</fieldset>
</div>
</div>
<div class="row">
{{-- CONTENT --}}
<div class="col-12 mb-3">
<fieldset class="border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.content')) }}</legend>
<div class="row mb-3">
<div class="col-12">
@include('bo.partials.inputs.text-html', [
'id' => 'articleContent',
'label' => __(':field :inter:model', [
'field' => Str::ucfirst(__('validation.attributes.content')),
'inter' => __('validation.custom.of_the.female'),
'model' => trans_choice('models.classes.static_page', 1),
]),
'name' => 'content',
'model' => $staticPageModel ?? null,
'required' => true,
'helper' => __('validation.custom.text_proofread'),
])
</div>
</div>
</fieldset>
</div>
</div>
<div class="row">
<div class="col text-center">
<p><b>{{ __('* Champs obligatoires') }}</b></p>
</div>
</div>
@push('scripts')
<script nonce="{{ $nonce }}">
document.addEventListener("DOMContentLoaded", () => {
// Submit button clone.
const submit = document.getElementById('formSubmit')
submitClone = document.getElementById('formSubmitClone');
submitClone.addEventListener('click', (event) => {
event.preventDefault();
submit.click('');
})
});
</script>
@endpush

View file

@ -0,0 +1,39 @@
<table class="table-hover table-fix-action m-0 table">
@if (count($staticPageModelList) > 0)
<thead>
@include('modules.table-col-sorter', [
'cols' => [
'type' => Str::ucfirst(__('validation.custom.static_page_type')),
'title' => Str::ucfirst(__('validation.attributes.title')),
'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')),
],
])
</thead>
<tbody>
@foreach ($staticPageModelList as $staticPageModel)
<tr class="border-bottom">
<td class="text-start align-middle">{{ $staticPageModel->type->label() }}</td>
<td class="text-start align-middle">{{ $staticPageModel->title }}</td>
<td class="text-start align-middle">
<span class="badge bg-secondary">{{ $staticPageModel->updated_at->isoFormat('LLLL') }}</span>
</td>
<td class="text-end align-middle">
<div class="btn-group">
<a class="btn btn-sm btn-primary" data-bs-toggle="tooltip"
href="{{ route('bo.static_pages.edit', ['static_page' => $staticPageModel]) }}"
title="{{ Str::ucfirst(__('crud.actions.update')) }}">
<i class="fa-solid fa-pencil"></i>
</a>
</div>
</td>
</tr>
@endforeach
</tbody>
@else
<tr>
<td class="border-0">
{{ trans_choice('crud.other.no_model_found', 2, ['model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1))]) }}
</td>
</tr>
@endif
</table>

View file

@ -0,0 +1,36 @@
@extends('bo.layout')
@section('title', sprintf('%s - %s', __('models.classes.static_pages'), Str::ucfirst(__('liste'))))
@section('breadcrumb', request()->route()->getName())
@section('content')
<div class="card">
<div class="card-header">
<div class="row">
<div class="col">
<h1 class="h3">{{ Str::title(trans_choice('models.classes.static_page', '*')) }}&nbsp;{{ Str::ucfirst(__('liste')) }}</h1>
</div>
</div>
</div>
<div class="card-body">
@include('modules.search-bar')
<div class="row justify-content-center">
<div class="col-12 col-md-6 p-0 p-md-3">
{{ $staticPageModelList->withQueryString()->onEachSide(1)->links() }}
</div>
</div>
<div class="row">
<div class="col">
@include('bo.pages.static_pages.index-list')
</div>
</div>
<div class="row justify-content-center">
<div class="col-12 col-md-6 p-0 p-md-3">
{{ $staticPageModelList->withQueryString()->onEachSide(1)->links() }}
</div>
</div>
</div>
</div>
@endsection

View file

@ -1,7 +1,7 @@
@extends('fo.layout')
@section('title', "Mentions légales")
@section('description', "Mentions légales et conditions générales d'utilisation du site internet Lionor")
@section('title', __($staticPageModel->seo_title))
@section('description', __($staticPageModel->seo_description))
@section('breadcrumb', request()->route()->getName())
@section('content')
@ -23,117 +23,12 @@
<div class="container pt-lg-5">
<div class="row justify-content-center">
<section class="col-md-10 stripes px-5">
<h1 class="text-uppercase text-center font-amatic font-amatic-48">
{{ __('Mentions légales et conditions générales d\'utilisation') }}
<span>{{ __('du site internet Lionor') }}</span>
</h1>
<h1 class="text-uppercase text-center font-amatic font-amatic-48">{{ __($staticPageModel->title) }}</h1>
</section>
</div>
<div class="contact-wrapper position-relative bg-ardoise-radial pt-5 pt-sm-6">
<div class="row wrapper-xl mb-3">
<h2 class="h2 color-second">Introduction</h2>
<p>
Nous vous remercions de lire ces conditions générales d'utilisation
qui régissent les conditions d'accès et d'utilisation du site
<a href="{{ route('home') }}">lionor.fr</a> <br><br>
<strong>
Nous vous invitons à consulter régulièrement cette rubrique car la
société Lionor peut être amenée à la modifier à tout moment.<br><br>
Tout utilisateur déclare avoir lu et accepté les mentions légales et
les conditions générales d'utilisation et s'engage à s'y
conformer.<br>
</strong><br><br>
Mise à jour le 15/03/2023.
</p>
<h2 class="h2 color-second">Mentions légales</h2>
<p>
Lionor RTE DE LA GARE 59189 STEENBECQUE<br>
Tél : +33(0)328436055 SAS au capital de 1 646 400 euros -
RCS de Dunkerque sous le numéro 305 507 303<br><br>
<strong>Editeur du Site</strong> : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans<br>
<strong>Directeur de la publication</strong> : Sylvain Gouet, Responsable Web Marketing Groupe LDC<br>
<strong>Conception du site et réalisation</strong> : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans<br>
<strong>Illustrations</strong> : Médiapole 2020<br>
<strong>Le site est hébergé par</strong> : OVH, via LDC, SAS au capital de 10 069 020 euros, RCS Lille Métropole 537 407 926, 2 rue Kellermann - 59100 Roubaix, Tel : 09 72 10 10 07, Mail : hosting@ml.ovh.net<br>
</p>
<h2 class="h2 color-second">
Droit d'auteur - Droit des marques - Protection des bases de données
</h2>
<p>
La présentation et le contenu du site constituent, ensemble, une œuvre
protégée par les lois en vigueur des droits d'auteur, de la propriété
intellectuelle et industrielle.<br><br>
Les créations apparaissant sur le site (dessins, photographies,
images, textes, séquences animées sonores ou non et autres
documentations représentées), sont objets de droits d'auteur, de
propriété industrielle et/ou intellectuelle et sont, selon les cas,
propriété de la société Lionor ou de tiers ayant autorisé la
société Lionor à les utiliser.<br>
Aucune exploitation commerciale, reproduction, représentation,
utilisation, adaptation, modification, incorporation, traduction,
commercialisation, partielle ou intégrale de ces éléments (y compris
ceux téléchargeables ou copiables) ne pourra en être faite sans
l'accord préalable et écrit de la société Lionor, à l'exception de
l'utilisation pour un usage privé sous réserve des dispositions
différentes voire plus restrictives du Code de la propriété
intellectuelle.<br>
Toute utilisation non expressément autorisée peut engager la
responsabilité civile et/ou pénale de son auteur. Lionor se réserve
le droit d'engager des poursuites judiciaires à l'encontre de toute
personne qui n'aurait pas respecté cette interdiction.
</p>
<h2 class="h2 color-second">Vie privée - Données personnelles - Cookies</h2>
<p>
Nous vous invitons à vous reporter à notre Charte de confidentialité
en <a href="{{ route('policies') }}">cliquant ici</a>.
</p>
<h2 class="h2 color-second">Mentions Sanitaires :</h2>
<p>Pour votre santé :<br>
- mangez au moins cinq fruits et légumes par jour<br>
- pratiquez une activité physique régulière<br>
- évitez de manger trop gras, trop sucré, trop salé<br>
- évitez de grignoter entre les repas
</p>
<p>
Pour toute information complémentaire, consultez le site
<a href="https://www.mangerbouger.fr">www.mangerbouger.fr</a>
</p>
<h2 class="h2 color-second">Responsabilité</h2>
<p>
Lionor a déployé ses meilleurs efforts pour s'assurer de
l'exactitude des informations présentes sur son site internet
(ci-après le Site). Cependant, Lionor n'est responsable ni de
l'exactitude, ni des erreurs, ni des omissions contenues sur le Site.
L'utilisateur est seul responsable de l'utilisation de telles
informations.<br>
Lionor ne donne aucune garantie, explicite ou implicite, et
n'assume aucune responsabilité qui pourrait résulter de l'accès ou de
l'utilisation de ce Site incluant toutes détériorations ou virus qui
pourraient infecter l'équipement informatique ou tout autre bien de
l'utilisateur.<br>
Par ailleurs.<br>
Lionor pourra unilatéralement et à tout moment interrompre
temporairement ou définitivement l'accès à tout ou partie du Site, y
compris notamment le contenu, les fonctionnalités ou les heures de
disponibilité, sans que sa responsabilité ne puisse être recherchée et
sans que cela ne puisse donner lieu à l'allocation de dommages et
intérêts de quelque nature que ce soit.<br>
Les pages du Site peuvent contenir des liens hypertextes renvoyant
vers d'autres sites internet gérés par des sociétés distinctes de
Lionor, et sur lesquels Lionor n'exerce aucune sorte de
contrôle. Lionor n'est pas responsable du contenu de tout autre
site auquel vous pourriez avoir accès via le Site ou les autres sites
internet du groupe LDC. Tout utilisateur ou visiteur du Site ne peut
mettre en place un lien hypertexte en direction de ce Site sans
l'autorisation expresse préalable de Lionor.
</p>
{!! clean($staticPageModel->content) !!}
</div>
</div>
</div>

View file

@ -23,381 +23,12 @@
<div class="container pt-lg-5">
<div class="row justify-content-center">
<section class="col-md-8 stripes px-5">
<h1 class="text-uppercase text-center font-amatic font-amatic-48">{{ __('Politique des données personnelles') }}</h1>
<h1 class="text-uppercase text-center font-amatic font-amatic-48">{{ __($staticPageModel->title) }}</h1>
</section>
</div>
<div class="contact-wrapper position-relative bg-ardoise-radial pt-5 pt-sm-6">
<div class="row wrapper-xl mb-3">
<h2 class="h2 color-second">Introduction</h2>
<p>
Le nouveau Règlement Général de l'Union Européenne sur la Protection
des Données (RGPD), entré en vigueur le 25 mai 2018, vise à mieux
encadrer la collecte, le traitement et l'utilisation de vos données
personnelles.<br>
Lionor, en sa qualité de responsable du traitement, renforce ses
engagements pour garantir la protection et la sécurité des données à
caractère personnel que vous lui confiez.<br><br>
</p>
<p>
A ce titre, la présente Charte de confidentialité vous informe sur le
type de données que nous collectons, comment nous les traitons, dans
quelles finalités, de manière à rendre leur utilisation la plus
adaptée à vos besoins. <br><br>
Le responsable de traitement, qui collecte et gère vos données, est la
société Lionor, SA au capital social de 1 646 400
immatriculée au registre du commerce et des sociétés de Dunkerque sous
le numéro 305 507 303, dont le siège social est RTE DE LA GARE 59189 STEENBECQUE.<br><br>
Pour toute question relative à notre Charte de confidentialité, merci
de nous contacter via le formulaire de contact suivant:<br>
<a href="https://www.ldc.fr/rgpd/professionnels/">https://www.ldc.fr/rgpd/professionnels/</a><br>
<a href="https://www.ldc.fr/rgpd/consommateurs/">https://www.ldc.fr/rgpd/consommateurs/</a><br>
<a href="https://www.ldc.fr/rgpd/salaries/">https://www.ldc.fr/rgpd/salaries/</a><br><br>
Nous vous invitons à consulter régulièrement cette rubrique car
Lionor peut être amené à la modifier à tout moment. <br>
La présente Charte de confidentialité a été mise à jour le 15/03/2023.
</p>
<h2 class="h2 color-second">Nos Engagements</h2>
<p>
Conformément à la réglementation relative à la protection des données
personnelles et à la vie privée, notamment la loi n°78-17 du 6 janvier
1978 relative à l'informatique, aux fichiers et aux libertés dite loi
« Informatique et Libertés » et au Règlement (UE) 2016/679 du 25 mai
2018 relatif à la protection des personnes physiques à l'égard du
traitement des données à caractère personnel et à la libre circulation
de ces données, (ci-après le « Règlement RGPD»), Lionor s'engage à
respecter les principes suivants&nbsp;: <br><br>
<strong>Consentement</strong>: vous devez avoir consenti à la collecte et au
traitement de vos données. Si tel n'était pas le cas ou si vous avez
changé d'avis, merci de vous reporter à l'article ci-dessous relatif à
vos droits. <br><br>
<strong>Limitation des données collectées</strong>: nous ne collectons que les
données qui sont strictement nécessaires au traitement et à
l'utilisation envisagée. Nous vous rappelons qu'il n'y a aucune
obligation à nous transmettre ces données. Toutefois certains services
ou opérations promotionnelles nécessitent certaines données, faute de
quoi vous ne pourriez y accéder.<br><br>
<strong>Limitation des finalités</strong>: les données que nous collectons sont
traitées uniquement dans les finalités décrites ci-dessous.<br><br>
<strong>Limitation des durées de conservation</strong>: vos données sont
conservées uniquement le temps nécessaire aux finalités de traitement
pour lequel elles ont été collectées. Au-delà de cette durée si aucune
obligation légale impose leur conservation, nous veillerons à ce que
vos données soient supprimées, détruites ou anonymisées.<br><br>
<strong>Protection des données</strong>: en vue de sécuriser vos données et leur
traitement, nous avons mis en place des mesures techniques et
organisationnelles détaillées ci-dessous.<br><br>
<strong>Transparence et loyauté</strong>: lorsque Lionor collecte une donnée
vous concernant, nous vous informons de l'utilisation qui en sera
faite. C'est pourquoi nous vous conseillons de lire attentivement les
informations qui vous sont transmises à travers notre site internet.
</p>
<h2 class="h2 color-second">Quelles données personnelles sont collectées ?</h2>
<p>
Au sens du Règlement RGPD, une donnée à caractère personnel désigne
toute information relative à une personne physique identifiée ou
identifiable.<br><br>
Les données personnelles collectées varient en fonction du but de la
collecte et du service dont vous souhaitez bénéficier.<br><br>
La société Lionor est amenée à collecter les catégories de données
personnelles suivantes:<br><br>
- coordonnées personnelles (civilité, nom, prénom, adresse e-mail,
adresse postale) ; <br>
- coordonnées personnelles non obligatoires (date de naissance, numéro
de téléphone); <br>
- identifiants utilisés pour accéder à votre compte en ligne (adresse
IP, adresse e-mail et mot de passe);<br>
- données relatives aux tickets de caisse de l'utilisateur ainsi que
son RIB ou son compte Paypal;<br>
- historiques de navigation, telles que les pages visitées et actions
sur le site.<br><br>
Vous vous engagez à fournir des données personnelles actualisées et
valides et garantissez ne faire aucune fausse déclaration et ne donner
aucune information erronée.
</p>
<h2 class="h2 color-second">Pourquoi vos données personnelles sont collectées ?</h2>
<p>
Vos données peuvent être collectées dans la mesure où vous avez
consenti de manière spécifique, libre et éclairée. Elles peuvent
également être collectées pour satisfaire à l'exécution d'une
obligation légale ou dans le cadre de la relation contractuelle
construite avec vous (notamment conditions générales d'utilisation,
conditions générales de vente) ou encore dans l'intérêt légitime de
Lionor (par exemple pour assurer la sécurité des transactions).<br><br>
Nous collectons vos données personnelles afin de vous fournir la
meilleure expérience utilisateur à travers notre site internet.<br><br>
<strong>Ces données sont collectées aux fins suivantes </strong><br>
- Gestion des fonctionnalités et de la qualité du site internet<br>
- Gestion de votre inscription à notre Newsletter et de votre Compte
utilisateur<br>
- Accès à votre Compte utilisateur<br>
- Gestion du recrutement<br>
- Traitement de vos demandes de renseignements<br>
- Communication des informations (promotions, nouveaux produits,
activité de la marque)<br>
- Gestion de votre participation à nos jeux, tirages au sort,
activités promotionnelles<br>
- Développement et amélioration des produits Lionor<br>
- Statistiques<br>
- Proposition de produits personnalisés et de communications adaptées
ou pour recommandation de produits en fonction des besoins de
consommateurs<br>
- Partages sur les réseaux sociaux
</p>
<h2 class="h2 color-second">Quels sont vos droits ?</h2>
<p>
Vous disposez d'un certain nombre de droits concernant vos données
personnelles listés ci-dessous. <br><br>
<strong>Droit d'accès</strong>
Vous pouvez demander la communication de vos données sous une forme
accessible, la confirmation que vos données font ou ne font plus
l'objet d'un traitement ainsi que la communication des informations
relatives à vos données. Afin que vos données personnelles soient
exactes, complètes, pertinentes et à jour, vous avez le droit
d'accéder, de corriger ou de mettre à jour vos données personnelles à
tout moment.<br><br>
<strong>Droit de rectification</strong><br>
Vous êtes en droit de demander à ce que vos données soient rectifiées,
complétées ou mises à jour lorsqu'elles sont inexactes, incomplètes,
équivoques ou périmées.<br><br>
<strong>Droit à l'effacement </strong><br>
Vous avez le droit de demander la suppression de vos données
personnelles notamment lorsqu'elles ne sont plus nécessaires aux
finalités pour lesquelles elles ont été collectées. Si les données
personnelles collectées ne sont plus nécessaires à aucune finalité et
qu'aucune obligation légale nous impose de les conserver, nous
mettrons tout en œuvre pour supprimer, détruire ou anonymiser ces
données.<br><br>
<strong>Droit à la limitation du traitement</strong><br>
Vous avez le droit de demander la limitation du traitement de vos
données personnelles si : <br><br>
- vous contestez l'exactitude des données;<br>
- vous souhaitez limiter le traitement des données qui n'avaient pas
été traitées de manière licite plutôt que leur suppression; <br>
- nous n'avons plus besoin de vos données personnelles mais celles-ci
sont nécessaires pour la constatation, l'exercice ou la défense de vos
droits en justice; <br>
- vous vous êtes opposés au traitement de vos données personnelles et
attendez de savoir si vos intérêts liés à cette objection l'emportent
sur les motifs légitimes que nous poursuivons. <br><br>
<strong>Droit à la portabilité de vos données </strong><br>
Lorsque le traitement est effectué à partir de procédés automatisés et
que vous avez librement consenti au traitement de vos données
personnelles pour une finalité que nous vous avions communiqué au
préalable; ou lorsque nous traitons vos données dans le cadre d'une
opération commerciale (ex: vous fournir un produit) vous avez le droit
de demander:<br>
- à recevoir vos données personnelles dans un format structuré,
couramment utilisé et lisible par une machine;<br>
- à ce que vos données personnelles soient transmises directement à
une autre responsable de traitement, lorsque que cela est
techniquement possible.<br><br>
<strong>Droit d'opposition</strong><br>
Lorsque vos données sont traitées à des fins de prospection
commerciale, vous avez le droit, à tout moment, de vous opposer au
traitement de vos données personnelles et ce sans motif.
</p>
<h2 class="h2 color-second">Droit de porter réclamation auprès de la CNIL</h2>
<p>
Si vous estimez que le traitement de vos données personnelles
constitue une violation de la réglementation, vous pouvez introduire
une réclamation auprès d'une autorité de contrôle, telle que la
CNIL.<br><br>
<strong>Vous pouvez exercer ces droits à tout moment en nous contactant via
le formulaire suivant :<br></strong>
<a href="https://www.ldc.fr/rgpd/professionnels/">https://www.ldc.fr/rgpd/professionnels/</a><br>
<a href="https://www.ldc.fr/rgpd/consommateurs/">https://www.ldc.fr/rgpd/consommateurs/</a><br>
<a href="https://www.ldc.fr/rgpd/salaries/">https://www.ldc.fr/rgpd/salaries/</a><br><br>
<strong>Vous recevrez une réponse de notre part dans un délai d'un mois à
compter de la réception de la demande. En cas de demande complexe ou
du nombre important de demandes, le délai peut être prolongé de deux
mois. </strong><br><br>
<strong>L'exercice des droits se fait à titre gratuit. Si toutefois la
demande était manifestement infondée ou excessive, Lionor se
réserve la possibilité d'appliquer des frais administratifs ou de
refuser de donner suite à la demande.
</strong>
</p>
<h2 class="h2 color-second">Comment vos données personnelles sont protégées ?</h2>
<p>
Afin d'assurer la sécurité de vos données personnelles nous avons mis
en place des mesures de sécurité, notamment des contrôles d'accès, des
pare-feux, des serveurs sécurisés.<br><br>
Ces mesures visent à protéger vos données personnelles contre toute
perte, détournement, mauvaise utilisation, divulgation, modification,
interférence, dommage, accès non autorisé des données.<br><br>
En cas de violation de vos données personnelles susceptible
d'engendrer un risque pour vos droits et libertés, Lionor en
notifie la violation à la CNIL dans les meilleurs délais et, si
possible, 72 heures au plus tard après en avoir pris connaissance.
Lionor vous en informera dans les meilleurs délais.
</p>
<h2 class="h2 color-second">Accès à vos données personnelles :</h2>
<p>
Vos données personnelles sont destinées au personnel de Lionor
habilité à les traiter, notamment le service marketing, développement
durable, informatique, commercial, qualité et administratif.
</p>
<h2 class="h2 color-second">Partage de vos données personnelles :</h2>
<p>
Conformément à la règlementation, quand nous sommes amenés à partager
vos données personnelles avec des sous-traitants pour certaines
finalités décrites dans la présente Charte, nous nous assurons que
leur dispositif en matière de sécurité des données et de leur stockage
est au moins aussi important que celui de notre organisation. Nous
veillons également à ce qu'ils respectent les lois relatives à la
protection des données personnelles dans des conditions au moins
équivalentes à celles que nous respectons.<br><br>
Par ailleurs, les sous-traitants étant amenés à traiter de vos données
personnelles pour notre compte et sur nos instructions, nous nous
engageons à ce que vos données personnelles ne soient pas partagées ou
divulguées pour des finalités autres que celles décrites dans la
présente Charte. Nous pouvons cependant être amenés à transmettre vos
données, pour des finalités autres que celles prévues dans la Charte,
dans les cas où leur communication est requise par la loi et les
autorités gouvernementales.
</p>
<h2 class="h2 color-second">
Transfert de vos données en dehors de l'espace économique Européen :
</h2>
<p>
Nous nous informons que vos données personnelles ne sont pas traitées
en dehors de l'Espace Economique Européen (EEE). En cas de changement,
nous vous en avertirons et mettrons tout en œuvre pour que ce
transfert international de données dispose d'un niveau et de garanties
de sécurité adéquats.
</p>
<h2 class="h2 color-second">Utilisation des cookies</h2>
<p>
Les cookies sont des petits fichiers textes contenant des informations
propres vous concernant stockés sur le disque dur de l'équipement
informatique avec lequel vous vous êtes connectés sur le site internet
et pouvant être lus seulement par le serveur qui l'a fourni. Les
cookies sont gérés par votre navigateur internet.<br><br>
Les cookies indiquent la fréquentation des pages que vous visitez, ce
qui nous aide à connaître les informations qui vous intéressent. Cela
permet de vous offrir plus de contenu qui vous intéresse et moins de
contenu qui ne vous intéresse pas. <br><br>
Les cookies vous permettent de stocker des préférences et les noms des
utilisateurs, enregistrer des produits et des services, personnaliser
des pages ou faire de la publicité ciblée.<br><br>
A travers ces cookies, vos données personnelles peuvent être
recueilles telles que :<br><br>
- des informations concernant le navigateur de votre appareil et le
système d'exploitation que vous utilisez;<br>
- l'adresse IP de l'appareil que vous utilisez;<br>
- les pages Web que vous consultez;<br>
- les liens sur lesquelles vous cliquez pendant que vous êtes en
interaction avec nos services.<br><br>
Le site internet <a href="{{ route('home') }}">lionor.fr</a> utilise trois types
de cookies qui ont des finalités différentes. Tous les cookies de type
non techniques doivent recueillir votre consentement avant d'être
installés. Vous pouvez donner votre consentement sur la page d'accueil
du site internet, en cliquant sur « accepter ». <br><br>
- Les cookies strictement nécessaires et fonctionnels Ces cookies sont
nécessaires au bon fonctionnement du site internet. Ils vous
permettent d'utiliser les principales fonctionnalités. Sans ces
cookies, vous ne pourrez pas utiliser normalement le site internet.
<br>
- Les cookies analytiques Ces cookies nous permettent de connaître
l'utilisation et les performances du site internet et d'en améliorer
son fonctionnement. <br><br>
- Les cookies de ciblage<br><br>
Ces cookies sont utilisés pour vous présenter des publicités ou vous
adresser des informations adaptées à vos centres d'intérêts en dehors
du site <a href="{{ route('home') }}">lionor.fr</a> lors de votre navigation sur Internet.
Le refus de ces cookies publicitaires n'a pas d'impact sur
l'utilisation du site internet. Cependant, le fait de refuser les
cookies publicitaires n'entraînera pas l'arrêt de la publicité sur
Internet. Cela aura seulement pour effet d'afficher une publicité qui
ne tiendra pas compte de vos centres d'intérêt ou de vos
préférences.<br><br>
<strong>Vous avez le choix :</strong><br><br>
<strong>- d'accepter</strong> ces cookies en cliquant sur le bouton «Accepter»
présent sur le bandeau Cookies, apparaissant au bas de votre page
internet. Tant que vous n'avez pas accepté, les cookies ne pourront
être stockés sur votre appareil; ou<br><br>
<strong>de refuser</strong> ces cookies via le bouton «Paramétrer» présent sur
le bandeau Cookies ou les paramètres de votre navigateur internet.<br><br>
Lorsque vous cliquez sur le bouton «Paramétrer» du bandeau Cookies,
une liste s'affiche présentant les différents types de cookies par
finalité. Si vous consentez au dépôt des cookies, il vous suffit de
les activer puis de cliquer sur le bouton «Enregistrer» en bas de la
fenêtre. Si vous refusez le dépôt des cookies, il vous suffit de
cliquer sur le bouton «Enregistrer», le dépôt des cookies étant par
défaut désactivé.<br><br>
Pour en savoir plus sur la désactivation des cookies via votre
navigateur internet :<br><br>
Internet Explorer:
<a href="http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies">http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies</a>
<br>
Chrome:
<a href="http://support.google.com/chrome/bin/answer.py?hl=fr&amp;hlrm=en&amp;answer=95647">http://support.google.com/chrome/bin/answer.py?hl=fr&amp;hlrm=en&amp;answer=95647</a>
<br>
Firefox:
<a href="https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur">https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur</a>
<br>
Safari:
<a href="https://support.apple.com/fr-fr/guide/safari/sfri11471/mac">https://support.apple.com/fr-fr/guide/safari/sfri11471/mac</a><br><br>
La durée de conservation de ces informations dans votre appareil est
d'une durée maximale de 13 mois. A l'expiration de ce délai, nous
recueillerons de nouveau votre consentement. <br>
Pour plus d'informations sur le paramétrage de vos cookies, vous
pouvez consulter :<br>
<a href="http://www.youronlinechoices.com/fr/">http://www.youronlinechoices.com/fr/</a><br>
<a href="https://www.allaboutcookies.org/">https://www.allaboutcookies.org/</a>
</p>
<h2 class="h2 color-second">Sites internet de tiers</h2>
<p>
Le site internet Lionor peut être associé à des sites internet
tiers. Les sites hébergés par des tiers sont hors de notre contrôle.
Lorsque vous renseignez des données personnelles sur un site internet
tiers, le traitement de ces données n'est pas effectué sur notre site
internet, mais sur le site internet tiers concerné. Toute donnée
personnelle que vous fournissez sera collectée et traitée conformément
à la politique relative à la confidentialité des données du tiers
concerné.<br><br>
Par conséquent, nous n'assumons aucune responsabilité concernant les
pratiques exercées par lesdits tiers en matière de protection des
données.
</p>
<h2 class="h2 color-second">Droit applicable</h2>
<p>
La présente Charte de confidentialité est régie et sera interprétée
conformément au droit français.
</p>
<h2 class="h2 color-second">Nous contacter</h2>
<p>
Si vous avez des questions, remarques ou réclamations relatives à la
présente Charte de confidentialité, ou le traitement de vos données
personnelles, veuillez-nous contacter à l'adresse :<br><br>
<a href="https://www.ldc.fr/rgpd/professionnels/">https://www.ldc.fr/rgpd/professionnels/</a><br>
<a href="https://www.ldc.fr/rgpd/consommateurs/">https://www.ldc.fr/rgpd/consommateurs/</a><br>
<a href="https://www.ldc.fr/rgpd/salaries/">https://www.ldc.fr/rgpd/salaries/</a>
</p>
{!! clean($staticPageModel->content) !!}
</div>
</div>
</div>

View file

@ -8,6 +8,7 @@ use App\Models\Shop;
use Diglactic\Breadcrumbs\Breadcrumbs;
use Diglactic\Breadcrumbs\Generator;
use Illuminate\Support\Str;
use App\Models\StaticPage;
// * Root
Breadcrumbs::for('bo.dashboard', function (Generator $trail) {
@ -89,3 +90,15 @@ Breadcrumbs::for('bo.shops.edit', function (Generator $trail, Shop $shop) {
$trail->parent('bo.shops.index');
$trail->push(trans('Édition'), route('bo.shops.edit', $shop));
});
// * STATIC PAGES
Breadcrumbs::for('bo.static_pages.index', function (Generator $trail) {
$trail->push(
Str::of(trans_choice('models.classes.static_page', '*'))->ucfirst(),
route('bo.static_pages.index', ['sort_col' => 'updated_at', 'sort_way' => 'desc'])
);
});
Breadcrumbs::for('bo.static_pages.edit', function (Generator $trail, StaticPage $static_page) {
$trail->parent('bo.static_pages.index');
$trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.static_pages.edit', $static_page));
});

View file

@ -6,6 +6,7 @@ use App\Http\Controllers\Bo\ProductController;
use App\Http\Controllers\Bo\RangeController;
use App\Http\Controllers\Bo\RecipeController;
use App\Http\Controllers\Bo\ShopController;
use App\Http\Controllers\Bo\StaticPageController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
@ -47,5 +48,16 @@ Route::prefix('bo')->name('bo.')->middleware(['admin-secure', 'throttle:credenti
->middleware('htmlsanitize:description,preparation,ingredients');
Route::post('/recipes/{recipe}/change-published', [RecipeController::class, 'changePublished'])
->name('recipes.change-published');
// * STATIC PAGES
Route::resource('pages', StaticPageController::class)
->names([
'index' => 'static_pages.index',
'edit' => 'static_pages.edit',
'update' => 'static_pages.update',
])->parameters(['pages' => 'static_page'])
->only(['index', 'edit', 'update'])
->withoutMiddleware('htmlsanitize')
->middleware('htmlsanitize:content');
});
});

View file

@ -1,5 +1,6 @@
<?php
use App\Http\Controllers\Fo\StaticPageController;
use App\Http\Controllers\Fo\ShopController;
use App\Http\Controllers\Fo\ContactController;
use App\Http\Controllers\Fo\HomeController;
@ -45,8 +46,8 @@ Route::namespace('\App\Http\Controllers\Fo')->middleware(['throttle:credentials'
});
Route::view('/ou-nous-trouver', 'fo.pages.map')->name('map');
Route::view('/politique-de-donnees-personnelles', 'fo.pages.policies')->name('policies');
Route::view('/mentions-legales', 'fo.pages.legals')->name('legals');
Route::get('/politique-de-donnees-personnelles', [StaticPageController::class, 'policies'])->name('policies');
Route::get('/mentions-legales', [StaticPageController::class, 'legals'])->name('legals');
// * ROUTES TO GET SHOPS FOR MARKET FINDER
Route::get('/api/shops', [ShopController::class, 'index'])->name('shops.index');