diff --git a/packages/Webkul/Core/src/Contracts/Validations/PhoneNumber.php b/packages/Webkul/Core/src/Contracts/Validations/PhoneNumber.php new file mode 100644 index 000000000..50ce2e218 --- /dev/null +++ b/packages/Webkul/Core/src/Contracts/Validations/PhoneNumber.php @@ -0,0 +1,30 @@ += 10; + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return trans('core::validation.phone-number'); + } +} diff --git a/packages/Webkul/Core/src/Resources/lang/en/validation.php b/packages/Webkul/Core/src/Resources/lang/en/validation.php index 2b2c0bde6..78fa4fcc9 100755 --- a/packages/Webkul/Core/src/Resources/lang/en/validation.php +++ b/packages/Webkul/Core/src/Resources/lang/en/validation.php @@ -4,5 +4,6 @@ return [ 'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.', 'code' => 'The :attribute must be valid.', 'decimal' => 'The :attribute must be valid.', + 'phone-number' => 'The :attribute must be valid phone number.', 'slug' => 'The :attribute must be valid slug.', ]; diff --git a/packages/Webkul/Core/src/Resources/lang/es/validation.php b/packages/Webkul/Core/src/Resources/lang/es/validation.php index 30d5276fe..db40e91f0 100755 --- a/packages/Webkul/Core/src/Resources/lang/es/validation.php +++ b/packages/Webkul/Core/src/Resources/lang/es/validation.php @@ -4,5 +4,6 @@ return [ 'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.', 'code' => 'O :attribute debe ser válido.', 'decimal' => 'O :attribute debe ser válido.', + 'phone-number' => 'The :attribute must be valid phone number.', 'slug' => 'O :attribute debe tener un slug válido.', ]; diff --git a/packages/Webkul/Core/src/Resources/lang/fa/validation.php b/packages/Webkul/Core/src/Resources/lang/fa/validation.php index 2b2c0bde6..78fa4fcc9 100755 --- a/packages/Webkul/Core/src/Resources/lang/fa/validation.php +++ b/packages/Webkul/Core/src/Resources/lang/fa/validation.php @@ -4,5 +4,6 @@ return [ 'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.', 'code' => 'The :attribute must be valid.', 'decimal' => 'The :attribute must be valid.', + 'phone-number' => 'The :attribute must be valid phone number.', 'slug' => 'The :attribute must be valid slug.', ]; diff --git a/packages/Webkul/Core/src/Resources/lang/it/validation.php b/packages/Webkul/Core/src/Resources/lang/it/validation.php index 2c0f204d5..abfff6c4c 100644 --- a/packages/Webkul/Core/src/Resources/lang/it/validation.php +++ b/packages/Webkul/Core/src/Resources/lang/it/validation.php @@ -4,5 +4,6 @@ return [ 'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.', 'code' => ':attribute deve essere valido.', 'decimal' => ':attribute deve essere valido.', + 'phone-number' => 'The :attribute must be valid phone number.', 'slug' => ':attribute deve essere uno slug valido.', ]; diff --git a/packages/Webkul/Core/src/Resources/lang/pt_BR/validation.php b/packages/Webkul/Core/src/Resources/lang/pt_BR/validation.php index 831306f38..15407320a 100755 --- a/packages/Webkul/Core/src/Resources/lang/pt_BR/validation.php +++ b/packages/Webkul/Core/src/Resources/lang/pt_BR/validation.php @@ -4,5 +4,6 @@ return [ 'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.', 'code' => 'O :attribute precisa ser válido.', 'decimal' => 'O :attribute precisa ser válido.', + 'phone-number' => 'The :attribute must be valid phone number.', 'slug' => 'O :attribute precisa ter um slug válido.', ]; diff --git a/packages/Webkul/Core/src/Resources/lang/tr/validation.php b/packages/Webkul/Core/src/Resources/lang/tr/validation.php index e63710a06..c1dde4b28 100644 --- a/packages/Webkul/Core/src/Resources/lang/tr/validation.php +++ b/packages/Webkul/Core/src/Resources/lang/tr/validation.php @@ -4,5 +4,6 @@ return [ 'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.', 'code' => ':attribute değeri geçerli olmalı.', 'decimal' => ':attribute geçerli olmalı.', + 'phone-number' => 'The :attribute must be valid phone number.', 'slug' => ':attribute değeri geçerli bir url olmalı.', ]; diff --git a/packages/Webkul/Customer/src/Http/Controllers/AddressController.php b/packages/Webkul/Customer/src/Http/Controllers/AddressController.php index 412ec5c92..d3395e961 100755 --- a/packages/Webkul/Customer/src/Http/Controllers/AddressController.php +++ b/packages/Webkul/Customer/src/Http/Controllers/AddressController.php @@ -2,23 +2,27 @@ namespace Webkul\Customer\Http\Controllers; -use Illuminate\Http\Request; -use Illuminate\Http\Response; +use Webkul\Customer\Http\Requests\CustomerAddressRequest; use Webkul\Customer\Repositories\CustomerAddressRepository; -use Webkul\Customer\Rules\VatIdRule; -use Auth; class AddressController extends Controller { /** - * Contains route related configuration + * Contains route related configuration. * * @var array */ protected $_config; /** - * CustomerAddressRepository object + * Current customer. + * + * @var \Webkul\Customer\Models\Customer + */ + protected $customer; + + /** + * Customer address repository instance. * * @var \Webkul\Customer\Repositories\CustomerAddressRepository */ @@ -36,13 +40,13 @@ class AddressController extends Controller $this->_config = request('_config'); - $this->customerAddressRepository = $customerAddressRepository; - $this->customer = auth()->guard('customer')->user(); + + $this->customerAddressRepository = $customerAddressRepository; } /** - * Address Route index page + * Address route index page. * * @return \Illuminate\View\View */ @@ -52,7 +56,7 @@ class AddressController extends Controller } /** - * Show the address create form + * Show the address create form. * * @return \Illuminate\View\View */ @@ -68,29 +72,12 @@ class AddressController extends Controller * * @return view */ - public function store() + public function store(CustomerAddressRequest $request) { - request()->merge(['address1' => implode(PHP_EOL, array_filter(request()->input('address1')))]); + $data = $request->validated(); - $data = collect(request()->input())->except('_token')->toArray(); - - $this->validate(request(), [ - 'company_name' => 'string', - 'first_name' => 'string|required', - 'last_name' => 'string|required', - 'address1' => 'string|required', - 'country' => 'string|required', - 'state' => 'string|required', - 'city' => 'string|required', - 'postcode' => 'required', - 'phone' => 'required', - 'vat_id' => new VatIdRule(), - ]); - - $cust_id['customer_id'] = $this->customer->id; - $cust_id['first_name'] = $this->customer->first_name; - $cust_id['last_name'] = $this->customer->last_name; - $data = array_merge($cust_id, $data); + $data['customer_id'] = $this->customer->id; + $data['address1'] = implode(PHP_EOL, array_filter(request()->input('address1'))); if ($this->customer->addresses->count() == 0) { $data['default_address'] = 1; @@ -100,15 +87,15 @@ class AddressController extends Controller session()->flash('success', trans('shop::app.customer.account.address.create.success')); return redirect()->route($this->_config['redirect']); - } else { - session()->flash('error', trans('shop::app.customer.account.address.create.error')); - - return redirect()->back(); } + + session()->flash('error', trans('shop::app.customer.account.address.create.error')); + + return redirect()->back(); } /** - * For editing the existing addresses of current logged in customer + * For editing the existing addresses of current logged in customer. * * @return \Illuminate\View\View */ @@ -116,7 +103,7 @@ class AddressController extends Controller { $address = $this->customerAddressRepository->findOneWhere([ 'id' => $id, - 'customer_id' => auth()->guard('customer')->user()->id, + 'customer_id' => $this->customer->id, ]); if (! $address) { @@ -124,7 +111,7 @@ class AddressController extends Controller } return view($this->_config['view'], array_merge(compact('address'), [ - 'defaultCountry' => config('app.default_country') + 'defaultCountry' => config('app.default_country'), ])); } @@ -134,24 +121,11 @@ class AddressController extends Controller * @param int $id * @return \Illuminate\Http\Response */ - public function update($id) + public function update($id, CustomerAddressRequest $request) { - request()->merge(['address1' => implode(PHP_EOL, array_filter(request()->input('address1')))]); + $data = $request->validated(); - $this->validate(request(), [ - 'company_name' => 'string', - 'first_name' => 'string|required', - 'last_name' => 'string|required', - 'address1' => 'string|required', - 'country' => 'string|required', - 'state' => 'string|required', - 'city' => 'string|required', - 'postcode' => 'required', - 'phone' => 'required', - 'vat_id' => new VatIdRule(), - ]); - - $data = collect(request()->input())->except('_token')->toArray(); + $data['address1'] = implode(PHP_EOL, array_filter(request()->input('address1'))); $addresses = $this->customer->addresses; @@ -172,7 +146,7 @@ class AddressController extends Controller /** * To change the default address or make the default address, - * by default when first address is created will be the default address + * by default when first address is created will be the default address. * * @return \Illuminate\Http\Response */ @@ -192,7 +166,7 @@ class AddressController extends Controller } /** - * Delete address of the current customer + * Delete address of the current customer. * * @param int $id * @return \Illuminate\Http\Response @@ -201,7 +175,7 @@ class AddressController extends Controller { $address = $this->customerAddressRepository->findOneWhere([ 'id' => $id, - 'customer_id' => auth()->guard('customer')->user()->id, + 'customer_id' => $this->customer->id, ]); if (! $address) { diff --git a/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php b/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php index 077f384f1..820404da0 100755 --- a/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php +++ b/packages/Webkul/Customer/src/Http/Controllers/CustomerController.php @@ -5,8 +5,8 @@ namespace Webkul\Customer\Http\Controllers; use Hash; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Mail; -use Webkul\Core\Contracts\Validations\AlphaNumericSpace; use Webkul\Core\Repositories\SubscribersListRepository; +use Webkul\Customer\Http\Requests\CustomerProfileRequest; use Webkul\Customer\Repositories\CustomerRepository; use Webkul\Product\Repositories\ProductReviewRepository; use Webkul\Shop\Mail\SubscriptionEmail; @@ -94,33 +94,20 @@ class CustomerController extends Controller * * @return \Illuminate\Http\Response */ - public function update() + public function update(CustomerProfileRequest $customerProfileRequest) { $isPasswordChanged = false; - $id = auth()->guard('customer')->user()->id; - $this->validate(request(), [ - 'first_name' => ['required', new AlphaNumericSpace], - 'last_name' => ['required', new AlphaNumericSpace], - 'gender' => 'required|in:Other,Male,Female', - 'date_of_birth' => 'date|before:today', - 'email' => 'email|unique:customers,email,' . $id, - 'password' => 'confirmed|min:6|required_with:oldpassword', - 'oldpassword' => 'required_with:password', - 'password_confirmation' => 'required_with:password', - 'image.*' => 'mimes:bmp,jpeg,jpg,png,webp' - ]); + $data = $customerProfileRequest->validated(); - $data = collect(request()->input())->except('_token')->toArray(); - - if (isset($data['date_of_birth']) && $data['date_of_birth'] == "") { + if (isset($data['date_of_birth']) && $data['date_of_birth'] == '') { unset($data['date_of_birth']); } $data['subscribed_to_news_letter'] = isset($data['subscribed_to_news_letter']) ? 1 : 0; if (isset($data['oldpassword'])) { - if ($data['oldpassword'] != "" || $data['oldpassword'] != null) { + if ($data['oldpassword'] != '' || $data['oldpassword'] != null) { if (Hash::check($data['oldpassword'], auth()->guard('customer')->user()->password)) { $isPasswordChanged = true; @@ -137,7 +124,7 @@ class CustomerController extends Controller Event::dispatch('customer.update.before'); - if ($customer = $this->customerRepository->update($data, $id)) { + if ($customer = $this->customerRepository->update($data, auth()->guard('customer')->user()->id)) { if ($isPasswordChanged) { Event::dispatch('user.admin.update-password', $customer); } @@ -182,14 +169,14 @@ class CustomerController extends Controller $this->customerRepository->uploadImages($data, $customer); - Session()->flash('success', trans('shop::app.customer.account.profile.edit-success')); + session()->flash('success', trans('shop::app.customer.account.profile.edit-success')); return redirect()->route($this->_config['redirect']); - } else { - Session()->flash('success', trans('shop::app.customer.account.profile.edit-fail')); - - return redirect()->back($this->_config['redirect']); } + + session()->flash('success', trans('shop::app.customer.account.profile.edit-fail')); + + return redirect()->back($this->_config['redirect']); } /** diff --git a/packages/Webkul/Customer/src/Http/Requests/CustomerAddressRequest.php b/packages/Webkul/Customer/src/Http/Requests/CustomerAddressRequest.php new file mode 100644 index 000000000..2bbba489d --- /dev/null +++ b/packages/Webkul/Customer/src/Http/Requests/CustomerAddressRequest.php @@ -0,0 +1,43 @@ + [new AlphaNumericSpace], + 'first_name' => ['required', new AlphaNumericSpace], + 'last_name' => ['required', new AlphaNumericSpace], + 'address1' => ['required', 'array'], + 'address1.*' => ['required', new AlphaNumericSpace], + 'country' => ['required', 'alpha'], + 'state' => ['required', 'alpha'], + 'city' => ['required', new AlphaNumericSpace], + 'postcode' => ['required', 'numeric'], + 'phone' => ['required', new PhoneNumber], + 'vat_id' => [new VatIdRule()], + ]; + } +} diff --git a/packages/Webkul/Customer/src/Http/Requests/CustomerProfileRequest.php b/packages/Webkul/Customer/src/Http/Requests/CustomerProfileRequest.php new file mode 100644 index 000000000..3b0d90f74 --- /dev/null +++ b/packages/Webkul/Customer/src/Http/Requests/CustomerProfileRequest.php @@ -0,0 +1,42 @@ +guard('customer')->user()->id; + + return [ + 'first_name' => ['required', new AlphaNumericSpace], + 'last_name' => ['required', new AlphaNumericSpace], + 'gender' => 'required|in:Other,Male,Female', + 'date_of_birth' => 'date|before:today', + 'email' => 'email|unique:customers,email,' . $id, + 'password' => 'confirmed|min:6|required_with:oldpassword', + 'oldpassword' => 'required_with:password', + 'password_confirmation' => 'required_with:password', + 'image.*' => 'mimes:bmp,jpeg,jpg,png,webp', + 'phone' => 'numeric', + ]; + } +} diff --git a/packages/Webkul/Shop/src/Resources/views/customers/account/address/create.blade.php b/packages/Webkul/Shop/src/Resources/views/customers/account/address/create.blade.php index 57a31e2f9..bc3bbd9ab 100755 --- a/packages/Webkul/Shop/src/Resources/views/customers/account/address/create.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/customers/account/address/create.blade.php @@ -74,10 +74,14 @@ {!! view_render_event('bagisto.shop.customers.account.address.create_form_controls.vat_id.after') !!} + @php + $addresses = old('address1') ?? explode(PHP_EOL, ''); + @endphp +
- + @{{ errors.first('address1[]') }}
diff --git a/packages/Webkul/Shop/src/Resources/views/customers/account/address/edit.blade.php b/packages/Webkul/Shop/src/Resources/views/customers/account/address/edit.blade.php index e76b80be9..5577dff9a 100755 --- a/packages/Webkul/Shop/src/Resources/views/customers/account/address/edit.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/customers/account/address/edit.blade.php @@ -77,7 +77,7 @@
- + @{{ errors.first('address1[]') }}
@@ -85,7 +85,7 @@ @if (core()->getConfigData('customer.settings.address.street_lines') && core()->getConfigData('customer.settings.address.street_lines') > 1)
@for ($i = 1; $i < core()->getConfigData('customer.settings.address.street_lines'); $i++) - + @endfor
@endif diff --git a/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/create.blade.php b/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/create.blade.php index e3c0df5db..95bafb4cc 100644 --- a/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/create.blade.php +++ b/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/create.blade.php @@ -16,7 +16,6 @@ {!! view_render_event('bagisto.shop.customers.account.address.create.before') !!}
-
@csrf @@ -24,7 +23,9 @@
+ +
@@ -32,7 +33,9 @@
+ +
@@ -40,7 +43,9 @@
+ +
@@ -50,19 +55,23 @@ + +
{!! view_render_event('bagisto.shop.customers.account.address.create_form_controls.vat_id.after') !!} @php - $addresses = explode(PHP_EOL, (old('address1') ?? '')); + $addresses = old('address1') ?? explode(PHP_EOL, ''); @endphp
+ +
@@ -82,7 +91,9 @@
+ +
@@ -90,7 +101,9 @@
+ +
@@ -98,7 +111,9 @@
+ +
diff --git a/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/edit.blade.php b/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/edit.blade.php index e51178b35..6ffaf0bc4 100644 --- a/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/edit.blade.php +++ b/packages/Webkul/Velocity/src/Resources/views/shop/customers/account/address/edit.blade.php @@ -7,24 +7,25 @@ @section('page-detail-wrapper')
+
{!! view_render_event('bagisto.shop.customers.account.address.edit.before', ['address' => $address]) !!} -
@method('PUT') + @csrf {!! view_render_event('bagisto.shop.customers.account.address.edit_form_controls.before', ['address' => $address]) !!} - address1)); ?> -
+ +
@@ -32,7 +33,9 @@
+ +
@@ -40,7 +43,9 @@
+ +
@@ -50,15 +55,23 @@ + +
{!! view_render_event('bagisto.shop.customers.account.address.edit_form_controls.vat_id.after') !!} + @php + $addresses = old('address1') ?? explode(PHP_EOL, $address->address1); + @endphp +
+ +
@@ -78,7 +91,9 @@
+ +
@@ -86,7 +101,9 @@
+ +
@@ -94,7 +111,9 @@
+ +
@@ -114,7 +133,6 @@ -
{!! view_render_event('bagisto.shop.customers.account.address.edit.after', ['address' => $address]) !!} diff --git a/tests/functional/Customer/CustomerCest.php b/tests/functional/Customer/CustomerCest.php index a4165b24e..f9e5d46c5 100644 --- a/tests/functional/Customer/CustomerCest.php +++ b/tests/functional/Customer/CustomerCest.php @@ -9,13 +9,50 @@ use Webkul\Customer\Models\CustomerAddress; class CustomerCest { + /** + * Faker factory. + * + * @var Faker\Factory + */ + public $faker; + + /** + * Address Fields. + * + * @var array + */ public $fields = []; + /** + * Constructor. + * + * @return void + */ + public function __construct() + { + /** + * Instantiate a european faker factory to have the vat provider available. + */ + $this->faker = Factory::create('at_AT'); + } + + /** + * Before method. + * + * @param FunctionalTester $I + * @return void + */ public function _before(FunctionalTester $I): void { $I->useDefaultTheme(); } + /** + * Test update customer profile. + * + * @param FunctionalTester $I + * @return void + */ public function updateCustomerProfile(FunctionalTester $I): void { $customer = $I->loginAsCustomer(); @@ -36,11 +73,14 @@ class CustomerCest ]); } + /** + * Update customer address. + * + * @param FunctionalTester $I + * @return void + */ public function updateCustomerAddress(FunctionalTester $I): void { - // instantiate a european faker factory to have the vat provider available - $faker = Factory::create('at_AT'); - $formCssSelector = '#customer-address-form'; $I->loginAsCustomer(); @@ -51,22 +91,13 @@ class CustomerCest $I->click('Address'); $I->click('Add Address'); - $this->fields = [ - 'company_name' => $faker->company, - 'first_name' => $faker->firstName, - 'last_name' => $faker->lastName, - 'vat_id' => 'INVALIDVAT', - 'address1[]' => $faker->streetAddress, - 'country' => $faker->countryCode, - 'state' => $faker->state, - 'city' => $faker->city, - 'postcode' => $faker->postcode, - 'phone' => $faker->phoneNumber, - ]; + $this->setFields(); foreach ($this->fields as $key => $value) { - // the following fields are rendered via javascript so we ignore them - if (!in_array($key, [ + /** + * The following fields are rendered via javascript so we ignore them. + */ + if (! in_array($key, [ 'country', 'state', ])) { @@ -78,15 +109,15 @@ class CustomerCest $I->wantTo('Ensure that the company_name field is being displayed'); $I->seeElement('.account-table-content > div:nth-child(2) > input:nth-child(2)'); - /* - We need to use this css selector to hit the correct
. There is another one at the - page header (search). - */ + /** + * We need to use this css selector to hit the correct . There is another one at the + * page header (search). + */ $I->submitForm($formCssSelector, $this->fields); $I->seeInSource('The given vat id has a wrong format'); $I->wantTo('enter a valid vat id'); - $this->fields['vat_id'] = $faker->vat(false); + $this->fields['vat_id'] = $this->faker->vat(false); $I->submitForm($formCssSelector, $this->fields); @@ -99,7 +130,7 @@ class CustomerCest $I->click('Edit'); $oldcompany = $this->fields['company_name']; - $this->fields['company_name'] = $faker->company; + $this->fields['company_name'] = preg_replace('/[^A-Za-z0-9 ]/', '', $this->faker->company); $I->submitForm($formCssSelector, $this->fields); @@ -113,7 +144,10 @@ class CustomerCest } /** - * @param FunctionalTester $I + * Assert customer address. + * + * @param FunctionalTester $I + * @return void */ private function assertCustomerAddress(FunctionalTester $I): void { @@ -130,4 +164,36 @@ class CustomerCest 'postcode' => $this->fields['postcode'], ]); } + + /** + * Set fields. + * + * @return void + */ + private function setFields() + { + $this->fields = [ + 'company_name' => $this->cleanField($this->faker->company), + 'first_name' => $this->cleanField($this->faker->firstName), + 'last_name' => $this->cleanField($this->faker->lastName), + 'vat_id' => 'INVALIDVAT', + 'address1[]' => $this->cleanField($this->faker->streetAddress), + 'country' => $this->cleanField($this->faker->countryCode), + 'state' => $this->cleanField($this->faker->state), + 'city' => $this->cleanField($this->faker->city), + 'postcode' => $this->cleanField($this->faker->postcode), + 'phone' => $this->faker->phoneNumber, + ]; + } + + /** + * Clean fields. + * + * @param string $field + * @return string + */ + private function cleanField($field) + { + return preg_replace('/[^A-Za-z0-9 ]/', '', $field); + } }