mirror of https://github.com/4xmen/xshop.git
Added contact area
parent
266d38fd35
commit
ddb5b346f2
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ContactSubmitRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'full_name' => ['required', 'string', 'max:255', 'min:3'],
|
||||||
|
'phone' => ['required', 'string', 'max:15', 'min:8'],
|
||||||
|
'subject' => ['nullable', 'string', 'max:255', 'min:4'],
|
||||||
|
'email' => ['required', 'email', 'max:255', 'min:4'],
|
||||||
|
'bodya' => ['required', 'string', 'max:4048', 'min:15'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,129 @@
|
|||||||
|
<section class='MeloContact'>
|
||||||
|
<div class="{{gfx()['container']}}">
|
||||||
|
|
||||||
|
<h1 class="text-center fw-light mb-3">
|
||||||
|
{{getSetting($data->area->name.'_'.$data->part.'_title')}}
|
||||||
|
</h1>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-5">
|
||||||
|
<div class="pin-box p-3">
|
||||||
|
<i class="ri-mail-add-line icon"></i>
|
||||||
|
@if(getGroupBySetting($data->area->name.'_'.$data->part)?->posts()->where('status',1)->where('is_pinned',1)->count() == 0)
|
||||||
|
<h3 class="p-4 text-center">
|
||||||
|
{{__("You must add a pinned post to :GROUP",['GROUP' => getGroupBySetting($data->area->name.'_'.$data->part)?->name])}}
|
||||||
|
</h3>
|
||||||
|
@else
|
||||||
|
<h3>
|
||||||
|
{{getGroupBySetting($data->area->name.'_'.$data->part)?->posts()->where('status',1)->where('is_pinned',1)->first()->title}}
|
||||||
|
</h3>
|
||||||
|
{!! getGroupBySetting($data->area->name.'_'.$data->part)?->posts()->where('status',1)->where('is_pinned',1)->first()->body!!}
|
||||||
|
|
||||||
|
<ul class="social text-center">
|
||||||
|
@foreach(getSettingsGroup('social_')??[] as $k => $social)
|
||||||
|
<li class="d-inline-block mx-2">
|
||||||
|
<a href="{{$social}}">
|
||||||
|
<i class="ri-{{$k}}-line"></i>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-7">
|
||||||
|
|
||||||
|
@include('components.err')
|
||||||
|
<form class="safe-form" method="post">
|
||||||
|
<input type="hidden" class="safe-url" data-url="{{route('client.send-contact')}}">
|
||||||
|
@csrf
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="full_name">
|
||||||
|
{{__('Name and lastname')}}
|
||||||
|
</label>
|
||||||
|
<input name="full_name" type="text"
|
||||||
|
class="form-control @error('full_name') is-invalid @enderror"
|
||||||
|
placeholder="{{__('Name and lastname')}}"
|
||||||
|
value="{{old('full_name',auth('customer')->user()->name??null)}}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="Phone">
|
||||||
|
{{__('Phone')}}
|
||||||
|
</label>
|
||||||
|
<input name="phone" type="tel"
|
||||||
|
class="form-control @error('Phone') is-invalid @enderror"
|
||||||
|
placeholder="{{__('Phone')}}" value="{{old('Phone',auth('customer')->user()->mobile??null)}}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mt-3">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">
|
||||||
|
{{__('Email')}}
|
||||||
|
</label>
|
||||||
|
<input name="email" type="email"
|
||||||
|
class="form-control @error('email') is-invalid @enderror"
|
||||||
|
placeholder="{{__('Email')}}" value="{{old('email',auth('customer')->user()->email??null)}}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mt-3">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="subject">
|
||||||
|
{{__('Subject')}}
|
||||||
|
</label>
|
||||||
|
<input name="subject" type="text"
|
||||||
|
class="form-control @error('subject') is-invalid @enderror"
|
||||||
|
placeholder="{{__('Subject')}}"
|
||||||
|
value="{{old('subject')}}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12 mt-3">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="body">
|
||||||
|
{{__('Your message...')}}
|
||||||
|
</label>
|
||||||
|
<textarea name="bodya" style=" height: 150px;"
|
||||||
|
class="form-control @error('bodya') is-invalid @enderror"
|
||||||
|
placeholder="{{__('Question/Message')}}">{{old('body')}}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-112">
|
||||||
|
<label> </label>
|
||||||
|
<button class="btn btn-primary mt-2 w-100">
|
||||||
|
<i class="ri-send-plane-line"></i>
|
||||||
|
{{__('Send')}}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="py-5">
|
||||||
|
|
||||||
|
@php($dir = langIsRTL(app()->getLocale() )?'rtl':'ltr' )
|
||||||
|
|
||||||
|
@foreach( getGroupBySetting($data->area->name.'_'.$data->part)?->posts()->where('status',1)
|
||||||
|
->where('is_pinned',0)->orderByDesc('id')->get() as $i => $post)
|
||||||
|
<div class="row mb-2" @if( ($i % 2) == 0) dir="rtl" @else dir="ltr" @endif>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<img src="{{$post->imgUrl()}}" alt="{{$post->title}}" class="img-fluid">
|
||||||
|
</div>
|
||||||
|
<div class="col-md" dir="{{$dir}}">
|
||||||
|
<h3>
|
||||||
|
<a href="{{$post->webUrl()}}">
|
||||||
|
{{$post->title}}
|
||||||
|
</a>
|
||||||
|
</h3>
|
||||||
|
<p>
|
||||||
|
{{$post->subtitle}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"name": "MeloContact",
|
||||||
|
"version": "1.0",
|
||||||
|
"author": "xStack",
|
||||||
|
"email": "xshop@xstack.ir",
|
||||||
|
"license": "GPL-3.0-or-later",
|
||||||
|
"url": "https:\/\/xstack.ir",
|
||||||
|
"author_url": "https:\/\/4xmen.ir",
|
||||||
|
"packages": []
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Resources\Views\Segments;
|
||||||
|
|
||||||
|
use App\Models\Group;
|
||||||
|
use App\Models\Part;
|
||||||
|
use App\Models\Setting;
|
||||||
|
|
||||||
|
class MeloContact
|
||||||
|
{
|
||||||
|
public static function onAdd(Part $part = null)
|
||||||
|
{
|
||||||
|
$setting = new Setting();
|
||||||
|
$setting->section = 'theme';
|
||||||
|
$setting->key = $part->area->name . '_' . $part->part;
|
||||||
|
$setting->value = Group::first()->id;
|
||||||
|
$setting->type = 'GROUP';
|
||||||
|
$setting->size = 6;
|
||||||
|
$setting->title = $part->area->name . ' ' . $part->part;
|
||||||
|
$setting->save();
|
||||||
|
|
||||||
|
$setting = new Setting();
|
||||||
|
$setting->section = 'theme';
|
||||||
|
$setting->key = $part->area->name . '_' . $part->part.'_title';
|
||||||
|
$setting->value = __("Contact us");
|
||||||
|
$setting->type = 'TEXT';
|
||||||
|
$setting->size = 6;
|
||||||
|
$setting->title = $part->area->name . ' ' . $part->part . ' title';
|
||||||
|
$setting->save();
|
||||||
|
}
|
||||||
|
public static function onRemove(Part $part = null)
|
||||||
|
{
|
||||||
|
Setting::where('key',$part->area->name . '_' . $part->part)->first()?->delete();
|
||||||
|
Setting::where('key',$part->area->name . '_' . $part->part.'_title')->first()?->delete();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public static function onMount(Part $part = null)
|
||||||
|
{
|
||||||
|
return $part;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
.MeloContact {
|
||||||
|
padding: 2rem 0;
|
||||||
|
h1{
|
||||||
|
border-bottom: 1px solid var(--xshop-primary);
|
||||||
|
}
|
||||||
|
.pin-box{
|
||||||
|
background: var(--xshop-secondary);
|
||||||
|
border-radius: var(--xshop-border-radius);
|
||||||
|
min-height: 400px;
|
||||||
|
position: relative;
|
||||||
|
color: var(--xshop-diff2);
|
||||||
|
|
||||||
|
i.icon{
|
||||||
|
position: absolute;
|
||||||
|
inset-inline-end: -1%;
|
||||||
|
top: -10%;
|
||||||
|
font-size:128px;
|
||||||
|
opacity: .3;
|
||||||
|
transform: rotateZ(-17deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.social{
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
|
||||||
|
a,a:visited{
|
||||||
|
color: var(--xshop-diff2);
|
||||||
|
|
||||||
|
|
||||||
|
i{
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 269 KiB |
Loading…
Reference in New Issue