rohsyl/omega-core

contact plugin

Closed this issue · 2 comments

Plugin pour form de contact

<form id="contact-form" action="{{ route('shop.contact') }}" method="post">

        @csrf

        @auth('shop')

            <div class="form-group row">
                <div class="col-12 col-md-4">
                    <label for="email">{{ __('E-Mail') }}</label>
                </div>
                <div class="col-12 col-md-8 form-material pt-0">
                    <input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}" placeholder="{{ auth('shop')->user()->email }}">
                    @include('back.helpers.input-errors', ['inputName' => 'email'])
                </div>
            </div>

        @else

            <div class="form-group row">
                <div class="col-12 col-md-4">
                    <label for="firstname">{{ __('Prénom') }}</label>
                </div>
                <div class="col-12 col-md-8 form-material pt-0">
                    <input type="firstname" class="form-control" id="firstname" name="firstname" value="{{ old('firstname') }}">
                    @include('back.helpers.input-errors', ['inputName' => 'firstname'])
                </div>
            </div>

            <div class="form-group row">
                <div class="col-12 col-md-4">
                    <label for="lastname">{{ __('Nom') }}</label>
                </div>
                <div class="col-12 col-md-8 form-material pt-0">
                    <input type="lastname" class="form-control" id="lastname" name="lastname" value="{{ old('lastname') }}">
                    @include('back.helpers.input-errors', ['inputName' => 'lastname'])
                </div>
            </div>

            <div class="form-group row">
                <div class="col-12 col-md-4">
                    <label for="email">{{ __('E-Mail') }}</label>
                </div>
                <div class="col-12 col-md-8 form-material pt-0">
                    <input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}">
                    @include('back.helpers.input-errors', ['inputName' => 'email'])
                </div>
            </div>

        @endif


        <div class="form-group row">
            <div class="col-12 col-md-4">
                <label for="message">{{ __('Message') }}</label>
            </div>
            <div class="col-12 col-md-8 form-material pt-0">
                <textarea class="form-control" id="message" name="message" rows="10">{!! old('message') ?? '' !!}</textarea>
                @include('back.helpers.input-errors', ['inputName' => 'message'])
            </div>
        </div>

        <div class="form-group row mt-50">
            <div class="offset-md-4">
                <button
                        data-sitekey="{{ env('GOOGLE_CAPTCHA_KEY') }}"
                        data-callback='onSubmit'
                        data-action='submit'
                        type="submit"
                        class="btn btn-hero btn-noborder btn-rounded btn-success g-recaptcha">
                    <i class="fa fa-user-plus mr-10"></i> {{ ('Envoyer message') }}
                </button>
            </div>
        </div>

    </form>

@endsection

@section('js_after')
    <script src="https://www.google.com/recaptcha/api.js"></script>
    <script>
        function onSubmit(token) {
            document.getElementById("contact-form").submit();
        }
    </script>
use App\Http\Controllers\Controller;
use App\Http\Requests\Front\Contact\CreateContactRequest;
use App\Models\Request;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

class ContactController extends Controller
{
    private String $recaptcha_api_base = "https://www.google.com/recaptcha/api/";
    private String $recaptcha_verify_endpoint = "siteverify";

    public function create() {
        return view('front.contact.index');
    }

    public function store(CreateContactRequest $request) {
        $input = $request->validated();

        $token = $input['g-recaptcha-response'];

        $client = new Client([
            'base_uri' => $this->recaptcha_api_base,
            'timeout' => 2.0
        ]);
        try {
            $res = $client->post($this->recaptcha_verify_endpoint, [
                'query' => [
                    'secret' => env('GOOGLE_CAPTCHA_SECRET'),
                    'response' => $token,
                ]
            ]);

            // reCaptcha check
            $response = json_decode($res->getBody()->getContents(),true);
            if(!$response['success'])
                return back()->with(['message.text' => __('reCaptcha challenge échoué'), 'message.type' => 'warning']);
        }
        catch (GuzzleException $e){
            if(!auth('shop')->check())
                return back()->with(['message.text' => __('Erreur du Google reCaptcha, merci de réessayer plus tard'), 'message.type' => 'warning']);
        }

        if (auth('shop')->check())
            $input += ['client_id' => auth('shop')->user()->id];

        $input += ['status' => config('shop.client_request.keys.new')];

        Request::create($input);

        session()->now('message.type', 'success');
        session()->now('message.text', __('Merci pour votre demande, elle sera traitée dans les meilleurs délais.'));

        return view('.index');
    }
}