update cart button is not shown, when only products without quantity box are in cart, tests added
This commit is contained in:
commit
14c0276fce
21
.env.testing
21
.env.testing
|
|
@ -1,7 +1,7 @@
|
|||
APP_NAME=Bagisto
|
||||
APP_NAME=Laravel
|
||||
APP_ENV=local
|
||||
APP_VERSION=0.1.8
|
||||
APP_KEY=base64:NFtGjjFAqET6RlX3PVC/gFpzHb4jK1OxDc3cuU5Asz4=
|
||||
APP_VERSION=0.1.5
|
||||
APP_KEY=base64:G4KY3tUsTaY9ONo1n/QyJvVLQZdJDgbIkSJswFK01HE=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
|
||||
|
|
@ -10,14 +10,14 @@ LOG_CHANNEL=stack
|
|||
DB_CONNECTION=mysql
|
||||
DB_HOST=mysql
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=bagisto_test
|
||||
DB_USERNAME=root
|
||||
DB_PASSWORD=root
|
||||
DB_DATABASE=bagisto_testing
|
||||
DB_USERNAME=bagisto
|
||||
DB_PASSWORD=secret
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=20
|
||||
SESSION_LIFETIME=120
|
||||
QUEUE_DRIVER=sync
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
|
|
@ -31,10 +31,6 @@ MAIL_USERNAME=
|
|||
MAIL_PASSWORD=
|
||||
MAIL_ENCRYPTION=tls
|
||||
|
||||
SHOP_MAIL_FROM=
|
||||
ADMIN_MAIL_TO=
|
||||
|
||||
fixer_api_key=
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
|
|
@ -43,3 +39,6 @@ PUSHER_APP_CLUSTER=mt1
|
|||
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
SHOP_MAIL_FROM=test@example.com
|
||||
ADMIN_MAIL_TO=test@example.com
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
name: CI
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
name: Run tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:5.7
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
MYSQL_DATABASE: bagisto_testing
|
||||
MYSQL_USER: bagisto
|
||||
MYSQL_PASSWORD: secret
|
||||
ports:
|
||||
- 3306
|
||||
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup php
|
||||
uses: shivammathur/setup-php@v1
|
||||
with:
|
||||
php-version: '7.3'
|
||||
extensions: intl, curl, mbstring, openssl, pdo, pdo_mysql, tokenizer
|
||||
|
||||
- name: Set environment
|
||||
run: |
|
||||
set -e
|
||||
sed -i "s|^\(DB_HOST=\s*\).*$|\1127.0.0.1|" .env.testing
|
||||
sed -i "s|^\(DB_PORT=\s*\).*$|\1${{ job.services.mysql.ports['3306'] }}|" .env.testing
|
||||
printf "the complete .env.testing ...\n\n"
|
||||
cat .env.testing
|
||||
|
||||
- name: Composer install
|
||||
run: |
|
||||
set -e
|
||||
composer global require hirak/prestissimo
|
||||
composer install --no-interaction --ansi --no-progress --no-suggest --optimize-autoloader
|
||||
|
||||
- name: Migrate database
|
||||
run: set -e && php artisan migrate --env=testing
|
||||
|
||||
- name: Execute unit tests
|
||||
run: set -e && vendor/bin/codecept run unit
|
||||
|
||||
- name: Execute functional tests
|
||||
run: set -e && vendor/bin/codecept run functional
|
||||
|
||||
- name: Execute trigger tests
|
||||
run: set -e && vendor/bin/codecept run trigger
|
||||
|
||||
- name: Persist test artifacts
|
||||
uses: actions/upload-artifact@v1
|
||||
if: always()
|
||||
with:
|
||||
name: test_artifacts
|
||||
path: tests/_output
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
/docker-compose-collection
|
||||
/bin
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
|
|
@ -15,7 +17,6 @@ npm-debug.log
|
|||
yarn-error.log
|
||||
.env
|
||||
/ignorables/*
|
||||
composer.lock
|
||||
yarn.lock
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ Take advantage of two of the hottest frameworks used in this project -- Laravel
|
|||
* **OS**: Ubuntu 16.04 LTS or higher / Windows 7 or Higher (WampServer / XAMPP).
|
||||
* **SERVER**: Apache 2 or NGINX.
|
||||
* **RAM**: 3 GB or higher.
|
||||
* **PHP**: 7.1.3 or higher.
|
||||
* **PHP**: 7.2.0 or higher.
|
||||
* **Processor**: Clock Cycle 1 Ghz or higher.
|
||||
* **For MySQL users**: 5.7.23 or higher.
|
||||
* **For MariaDB users**: 10.2.7 or Higher.
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"license": "MIT",
|
||||
"type": "project",
|
||||
"require": {
|
||||
"php": "^7.1.3",
|
||||
"php": "^7.2.0",
|
||||
"ext-curl": "*",
|
||||
"ext-intl": "*",
|
||||
"ext-mbstring": "*",
|
||||
|
|
@ -18,28 +18,33 @@
|
|||
"ext-pdo_mysql": "*",
|
||||
"ext-tokenizer": "*",
|
||||
"astrotomic/laravel-translatable": "^11.0.0",
|
||||
"barryvdh/laravel-dompdf": "0.8.3",
|
||||
"barryvdh/laravel-dompdf": "0.8.5",
|
||||
"doctrine/dbal": "2.9.2",
|
||||
"fideloper/proxy": "^4.0",
|
||||
"flynsarmy/db-blade-compiler": "*",
|
||||
"guzzlehttp/guzzle": "~6.0",
|
||||
"intervention/image": "^2.4",
|
||||
"intervention/imagecache": "^2.3",
|
||||
"kalnoy/nestedset": "^4.3",
|
||||
"kalnoy/nestedset": "5.0.0",
|
||||
"konekt/concord": "^1.2",
|
||||
"laravel/framework": "5.6.*",
|
||||
"laravel/framework": "^6.0",
|
||||
"laravel/helpers": "^1.1",
|
||||
"laravel/tinker": "^1.0",
|
||||
"maatwebsite/excel": "3.1.11",
|
||||
"prettus/l5-repository": "2.6.32",
|
||||
"tymon/jwt-auth": "1.0.0-rc.4"
|
||||
"maatwebsite/excel": "3.1.18",
|
||||
"nwidart/laravel-modules": "^3.2",
|
||||
"prettus/l5-repository": "^2.6",
|
||||
"tymon/jwt-auth": "^1.0.0"
|
||||
},
|
||||
|
||||
"require-dev": {
|
||||
"codeception/codeception": "3.1.*",
|
||||
"barryvdh/laravel-debugbar": "^3.1",
|
||||
"codeception/codeception": "^4.0",
|
||||
"codeception/module-asserts": "^1.1",
|
||||
"codeception/module-filesystem": "^1.0",
|
||||
"codeception/module-laravel5": "^1.0",
|
||||
"filp/whoops": "^2.0",
|
||||
"fzaninotto/faker": "^1.4",
|
||||
"laravel/dusk": "^4.0",
|
||||
"laravel/dusk": "^5.7.0",
|
||||
"mockery/mockery": "^1.0",
|
||||
"nunomaduro/collision": "^2.0",
|
||||
"phpunit/phpunit": "^7.0"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -93,6 +93,19 @@ return [
|
|||
|
||||
'fallback_locale' => 'en',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Country
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default country by country code.
|
||||
| Ensure it is uppercase and reflects the 'code' column of the
|
||||
| countries table.
|
||||
|
|
||||
*/
|
||||
|
||||
'default_country' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Base Currency Code
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ return [
|
|||
|
||||
'prefix' => env(
|
||||
'CACHE_PREFIX',
|
||||
str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
|
||||
\Illuminate\Support\Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'
|
||||
),
|
||||
|
||||
];
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ return [
|
|||
|
||||
'cookie' => env(
|
||||
'SESSION_COOKIE',
|
||||
str_slug(env('APP_NAME', 'laravel'), '_').'_session'
|
||||
\Illuminate\Support\Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
|
||||
),
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
"lodash": "^4.17.4",
|
||||
"popper.js": "^1.12",
|
||||
"resolve-url-loader": "^3.1.0",
|
||||
"sass": "^1.24.4",
|
||||
"sass": "^1.24.5",
|
||||
"sass-loader": "^8.0.2",
|
||||
"vue": "^2.5.7",
|
||||
"vue-template-compiler": "^2.6.11"
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ class CartController extends Controller
|
|||
*/
|
||||
public function store($id)
|
||||
{
|
||||
Event::fire('checkout.cart.item.add.before', $id);
|
||||
Event::dispatch('checkout.cart.item.add.before', $id);
|
||||
|
||||
$result = Cart::addProduct($id, request()->except('_token'));
|
||||
|
||||
|
|
@ -112,8 +112,8 @@ class CartController extends Controller
|
|||
|
||||
if ($customer = auth($this->guard)->user())
|
||||
$this->wishlistRepository->deleteWhere(['product_id' => $id, 'customer_id' => $customer->id]);
|
||||
|
||||
Event::fire('checkout.cart.item.add.after', $result);
|
||||
|
||||
Event::dispatch('checkout.cart.item.add.after', $result);
|
||||
|
||||
Cart::collectTotals();
|
||||
|
||||
|
|
@ -143,11 +143,11 @@ class CartController extends Controller
|
|||
foreach (request()->get('qty') as $itemId => $qty) {
|
||||
$item = $this->cartItemRepository->findOneByField('id', $itemId);
|
||||
|
||||
Event::fire('checkout.cart.item.update.before', $itemId);
|
||||
Event::dispatch('checkout.cart.item.update.before', $itemId);
|
||||
|
||||
Cart::updateItems(request()->all());
|
||||
|
||||
Event::fire('checkout.cart.item.update.after', $item);
|
||||
Event::dispatch('checkout.cart.item.update.after', $item);
|
||||
}
|
||||
|
||||
Cart::collectTotals();
|
||||
|
|
@ -167,11 +167,11 @@ class CartController extends Controller
|
|||
*/
|
||||
public function destroy()
|
||||
{
|
||||
Event::fire('checkout.cart.delete.before');
|
||||
Event::dispatch('checkout.cart.delete.before');
|
||||
|
||||
Cart::deActivateCart();
|
||||
|
||||
Event::fire('checkout.cart.delete.after');
|
||||
Event::dispatch('checkout.cart.delete.after');
|
||||
|
||||
$cart = Cart::getCart();
|
||||
|
||||
|
|
@ -189,11 +189,11 @@ class CartController extends Controller
|
|||
*/
|
||||
public function destroyItem($id)
|
||||
{
|
||||
Event::fire('checkout.cart.item.delete.before', $id);
|
||||
Event::dispatch('checkout.cart.item.delete.before', $id);
|
||||
|
||||
Cart::removeItem($id);
|
||||
|
||||
Event::fire('checkout.cart.item.delete.after', $id);
|
||||
Event::dispatch('checkout.cart.item.delete.after', $id);
|
||||
|
||||
Cart::collectTotals();
|
||||
|
||||
|
|
@ -213,11 +213,11 @@ class CartController extends Controller
|
|||
*/
|
||||
public function moveToWishlist($id)
|
||||
{
|
||||
Event::fire('checkout.cart.item.move-to-wishlist.before', $id);
|
||||
Event::dispatch('checkout.cart.item.move-to-wishlist.before', $id);
|
||||
|
||||
Cart::moveToWishlist($id);
|
||||
|
||||
Event::fire('checkout.cart.item.move-to-wishlist.after', $id);
|
||||
Event::dispatch('checkout.cart.item.move-to-wishlist.after', $id);
|
||||
|
||||
Cart::collectTotals();
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ use Webkul\API\Http\Resources\Checkout\CartShippingRate as CartShippingRateResou
|
|||
use Webkul\API\Http\Resources\Sales\Order as OrderResource;
|
||||
use Webkul\Checkout\Http\Requests\CustomerAddressForm;
|
||||
use Webkul\Sales\Repositories\OrderRepository;
|
||||
use Illuminate\Support\Str;
|
||||
use Cart;
|
||||
|
||||
/**
|
||||
|
|
@ -60,9 +61,9 @@ class CheckoutController extends Controller
|
|||
|
||||
auth()->setDefaultDriver($this->guard);
|
||||
|
||||
|
||||
|
||||
// $this->middleware('auth:' . $this->guard);
|
||||
|
||||
|
||||
$this->_config = request('_config');
|
||||
|
||||
$this->cartRepository = $cartRepository;
|
||||
|
|
@ -90,7 +91,7 @@ class CheckoutController extends Controller
|
|||
unset($data['billing']['address_id']);
|
||||
}
|
||||
|
||||
if (isset($data['shipping']['id']) && str_contains($data['shipping']['id'], 'address_')) {
|
||||
if (isset($data['shipping']['id']) && Str::contains($data['shipping']['id'], 'address_')) {
|
||||
unset($data['shipping']['id']);
|
||||
unset($data['shipping']['address_id']);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,11 +60,11 @@ class CustomerController extends Controller
|
|||
'customer_group_id' => 1
|
||||
]);
|
||||
|
||||
Event::fire('customer.registration.before');
|
||||
Event::dispatch('customer.registration.before');
|
||||
|
||||
$customer = $this->customerRepository->create($data);
|
||||
|
||||
Event::fire('customer.registration.after', $customer);
|
||||
Event::dispatch('customer.registration.after', $customer);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Your account has been created successfully.'
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ class SessionController extends Controller
|
|||
], 401);
|
||||
}
|
||||
|
||||
Event::fire('customer.after.login', request('email'));
|
||||
Event::dispatch('customer.after.login', request('email'));
|
||||
|
||||
$customer = auth($this->guard)->user();
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,39 @@
|
|||
/*!
|
||||
* jQuery JavaScript Library v3.4.1
|
||||
* https://jquery.com/
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* https://sizzlejs.com/
|
||||
*
|
||||
* Copyright JS Foundation and other contributors
|
||||
* Released under the MIT license
|
||||
* https://jquery.org/license
|
||||
*
|
||||
* Date: 2019-05-01T21:04Z
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Sizzle CSS Selector Engine v2.3.4
|
||||
* https://sizzlejs.com/
|
||||
*
|
||||
* Copyright JS Foundation and other contributors
|
||||
* Released under the MIT license
|
||||
* https://js.foundation/
|
||||
*
|
||||
* Date: 2019-04-08
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Vue.js v2.6.11
|
||||
* (c) 2014-2019 Evan You
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license
|
||||
* Lodash <https://lodash.com/>
|
||||
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||
* Released under MIT license <https://lodash.com/license>
|
||||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
||||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||
*/
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"/js/admin.js": "/js/admin.js?id=d1daece26673ab30942b",
|
||||
"/css/admin.css": "/css/admin.css?id=c845e7c275d4df7fa03f"
|
||||
"/js/admin.js": "/js/admin.js?id=8c0724bfd64081ee94bf",
|
||||
"/css/admin.css": "/css/admin.css?id=9a8c6ebe5e08965b7ae6"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,12 +182,6 @@ return [
|
|||
'sort' => 2,
|
||||
'icon-class' => ''
|
||||
], [
|
||||
'key' => 'settings.development',
|
||||
'name' => 'admin::app.settings.development.title',
|
||||
'route' => 'admin.development.index',
|
||||
'sort' => 8,
|
||||
'icon-class' => ''
|
||||
],[
|
||||
'key' => 'promotions',
|
||||
'name' => 'admin::app.layouts.promotions',
|
||||
'route' => 'admin.catalog-rules.index',
|
||||
|
|
|
|||
|
|
@ -87,10 +87,21 @@ return [
|
|||
'key' => 'catalog.products',
|
||||
'name' => 'admin::app.admin.system.products',
|
||||
'sort' => 2
|
||||
], [
|
||||
'key' => 'catalog.products.guest-checkout',
|
||||
'name' => 'admin::app.admin.system.guest-checkout',
|
||||
'sort' => 1,
|
||||
'fields' => [
|
||||
[
|
||||
'name' => 'allow-guest-checkout',
|
||||
'title' => 'admin::app.admin.system.allow-guest-checkout',
|
||||
'type' => 'boolean'
|
||||
]
|
||||
]
|
||||
], [
|
||||
'key' => 'catalog.products.review',
|
||||
'name' => 'admin::app.admin.system.review',
|
||||
'sort' => 1,
|
||||
'sort' => 2,
|
||||
'fields' => [
|
||||
[
|
||||
'name' => 'guest_review',
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ class ConfigurationController extends Controller
|
|||
*/
|
||||
public function store()
|
||||
{
|
||||
Event::fire('core.configuration.save.before');
|
||||
Event::dispatch('core.configuration.save.before');
|
||||
|
||||
if (request()->has('general.design.admin_logo.logo_image') && ! request()->input('general.design.admin_logo.logo_image.delete')) {
|
||||
$this->validate(request(), [
|
||||
|
|
@ -128,7 +128,7 @@ class ConfigurationController extends Controller
|
|||
|
||||
$this->coreConfigRepository->create(request()->all());
|
||||
|
||||
Event::fire('core.configuration.save.after');
|
||||
Event::dispatch('core.configuration.save.after');
|
||||
|
||||
session()->flash('success', trans('admin::app.configuration.save-message'));
|
||||
|
||||
|
|
|
|||
|
|
@ -755,12 +755,6 @@ Route::group(['middleware' => ['web']], function () {
|
|||
// 'redirect' => 'admin.cms.index'
|
||||
// ])->name('admin.cms.delete');
|
||||
});
|
||||
|
||||
// Development settings
|
||||
Route::prefix('development')->group(function () {
|
||||
Route::get('/', 'Webkul\Admin\Http\Controllers\Development\DashboardController@index')
|
||||
->name('admin.development.index');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ class NewInvoiceNotification extends Mailable
|
|||
$order = $this->invoice->order;
|
||||
|
||||
return $this->to($order->customer_email, $order->customer_full_name)
|
||||
->from(config('mail.from'))
|
||||
->subject(trans('shop::app.mail.invoice.subject', ['order_id' => $order->increment_id]))
|
||||
->view('shop::emails.sales.new-invoice');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ class NewOrderNotification extends Mailable
|
|||
public function build()
|
||||
{
|
||||
return $this->to($this->order->customer_email, $this->order->customer_full_name)
|
||||
->from(config('mail.from'))
|
||||
->subject(trans('shop::app.mail.order.subject'))
|
||||
->view('shop::emails.sales.new-order');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ class NewRefundNotification extends Mailable
|
|||
$order = $this->refund->order;
|
||||
|
||||
return $this->to($order->customer_email, $order->customer_full_name)
|
||||
->from(config('mail.from'))
|
||||
->subject(trans('shop::app.mail.refund.subject', ['order_id' => $order->increment_id]))
|
||||
->view('shop::emails.sales.new-refund');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ class NewShipmentNotification extends Mailable
|
|||
$order = $this->shipment->order;
|
||||
|
||||
return $this->to($order->customer_email, $order->customer_full_name)
|
||||
->from(config('mail.from'))
|
||||
->subject(trans('shop::app.mail.shipment.subject', ['order_id' => $order->increment_id]))
|
||||
->view('shop::emails.sales.new-shipment');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Angle-Right</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Angle-Right" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
|
||||
<polyline id="Path-3" stroke="#A2A2A2" stroke-width="3" points="7 3 14 10.058476 7.11598308 17"></polyline>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 618 B |
|
|
@ -1,14 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Icon-Graph-Green</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Icon-Graph-Green" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
|
||||
<g transform="translate(8.000000, 5.000000)" stroke="#00C357" stroke-width="2">
|
||||
<path d="M4,0 L4,14" id="Path-2"></path>
|
||||
<path d="M4,0 L0,4" id="Path-3"></path>
|
||||
<path d="M7.92330631,0 L3.92330631,4" id="Path-3-Copy" transform="translate(5.961653, 2.000000) scale(-1, 1) translate(-5.961653, -2.000000) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 881 B |
|
|
@ -87,7 +87,7 @@ $(document).ready(function () {
|
|||
},
|
||||
|
||||
addFlashMessages() {
|
||||
if (typeof flashMessages !== 'undefined') {
|
||||
if (typeof flashMessages == 'undefined') {
|
||||
return;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1202,6 +1202,9 @@ return [
|
|||
'system' => [
|
||||
'catalog' => 'Catalog',
|
||||
'products' => 'Products',
|
||||
'guest-checkout' => 'Guest Checkout',
|
||||
'allow-guest-checkout' => 'Allow Guest Checkout',
|
||||
'allow-guest-checkout-hint' => 'Hint: If turned on, this option can be configured for each product specifically.',
|
||||
'review' => 'Review',
|
||||
'allow-guest-review' => 'Allow Guest Review',
|
||||
'inventory' => 'Inventory',
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
<div slot="body">
|
||||
<div class="control-group" :class="[errors.has('password') ? 'has-error' : '']">
|
||||
<label for="password">{{ __('admin::app.account.password') }}</label>
|
||||
<input type="password" v-validate="'min:6'" class="control" id="password" name="password" data-vv-as=""{{ __('admin::app.account.password') }}""/>
|
||||
<input type="password" v-validate="'min:6'" class="control" id="password" name="password" ref="password" data-vv-as=""{{ __('admin::app.account.password') }}""/>
|
||||
<span class="control-error" v-if="errors.has('password')">@{{ errors.first('password') }}</span>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@
|
|||
|
||||
<div class="control-group">
|
||||
<label for="locale-{{ $locale->code }}">{{ $locale->name . ' (' . $locale->code . ')' }}</label>
|
||||
<input type="text" class="control" id="locale-{{ $locale->code }}" name="<?php echo $locale->code; ?>[name]" value="{{ old($locale->code)['name'] ?? $attribute->translate($locale->code)['name'] }}"/>
|
||||
<input type="text" class="control" id="locale-{{ $locale->code }}" name="<?php echo $locale->code; ?>[name]" value="{{ old($locale->code)['name'] ?? ($attribute->translate($locale->code)->name ?? '') }}"/>
|
||||
</div>
|
||||
|
||||
@endforeach
|
||||
|
|
@ -432,7 +432,7 @@
|
|||
@endif
|
||||
|
||||
@foreach (app('Webkul\Core\Repositories\LocaleRepository')->all() as $locale)
|
||||
row['{{ $locale->code }}'] = "{{ $option->translate($locale->code)['label'] }}";
|
||||
row['{{ $locale->code }}'] = "{{ $option->translate($locale->code)['label'] ?? '' }}";
|
||||
@endforeach
|
||||
|
||||
this.optionRows.push(row);
|
||||
|
|
|
|||
|
|
@ -77,6 +77,10 @@
|
|||
@foreach ($customAttributes as $attribute)
|
||||
|
||||
<?php
|
||||
if ($attribute->code == 'guest_checkout' && ! core()->getConfigData('catalog.products.guest-checkout.allow-guest-checkout')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$validations = [];
|
||||
|
||||
if ($attribute->is_required) {
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@
|
|||
<div class="control-group" :class="[errors.has('html_content') ? 'has-error' : '']">
|
||||
<label for="html_content" class="required">{{ __('admin::app.cms.pages.content') }}</label>
|
||||
|
||||
<textarea type="text" class="control" id="content" name="html_content" v-validate="'required'" value="{{ old('html_content') }}" data-vv-as=""{{ __('admin::app.cms.pages.content') }}""></textarea>
|
||||
<textarea type="text" class="control" id="content" name="html_content" v-validate="'required'" data-vv-as=""{{ __('admin::app.cms.pages.content') }}"">{{ old('html_content') }}</textarea>
|
||||
|
||||
<span class="control-error" v-if="errors.has('html_content')">@{{ errors.first('html_content') }}</span>
|
||||
</div>
|
||||
|
|
@ -89,13 +89,14 @@
|
|||
<div class="control-group">
|
||||
<label for="meta_keywords">{{ __('admin::app.cms.pages.meta_keywords') }}</label>
|
||||
|
||||
<textarea type="text" class="control" name="meta_keywords" value="{{ old('meta_keywords') }}"></textarea>
|
||||
<textarea type="text" class="control" name="meta_keywords">{{ old('meta_keywords') }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="meta_description">{{ __('admin::app.cms.pages.meta_description') }}</label>
|
||||
|
||||
<textarea type="text" class="control" name="meta_description" value="{{ old('meta_description') }}"></textarea>
|
||||
<textarea type="text" class="control" name="meta_description">{{ old('meta_description') }}</textarea>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</accordian>
|
||||
|
|
|
|||
|
|
@ -77,9 +77,7 @@
|
|||
<div class="control-group" :class="[errors.has('{{$locale}}[html_content]') ? 'has-error' : '']">
|
||||
<label for="html_content" class="required">{{ __('admin::app.cms.pages.content') }}</label>
|
||||
|
||||
<textarea type="text" class="control" id="content" name="{{$locale}}[html_content]" v-validate="'required'" data-vv-as=""{{ __('admin::app.cms.pages.content') }}"">
|
||||
{{ old($locale)['html_content'] ?? ($page->translate($locale)['html_content'] ?? '') }}
|
||||
</textarea>
|
||||
<textarea type="text" class="control" id="content" name="{{$locale}}[html_content]" v-validate="'required'" data-vv-as=""{{ __('admin::app.cms.pages.content') }}"">{{ old($locale)['html_content'] ?? ($page->translate($locale)['html_content'] ?? '') }}</textarea>
|
||||
|
||||
<span class="control-error" v-if="errors.has('{{$locale}}[html_content]')">@{{ errors.first('{!!$locale!!}[html_content]') }}</span>
|
||||
</div>
|
||||
|
|
@ -105,17 +103,15 @@
|
|||
<div class="control-group">
|
||||
<label for="meta_keywords">{{ __('admin::app.cms.pages.meta_keywords') }}</label>
|
||||
|
||||
<textarea type="text" class="control" name="{{$locale}}[meta_keywords]">
|
||||
{{ old($locale)['meta_keywords'] ?? ($page->translate($locale)['meta_keywords'] ?? '') }}
|
||||
</textarea>
|
||||
<textarea type="text" class="control" name="{{$locale}}[meta_keywords]">{{ old($locale)['meta_keywords'] ?? ($page->translate($locale)['meta_keywords'] ?? '') }}</textarea>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="meta_description">{{ __('admin::app.cms.pages.meta_description') }}</label>
|
||||
|
||||
<textarea type="text" class="control" name="{{$locale}}[meta_description]">
|
||||
{{ old($locale)['meta_description'] ?? ($page->translate($locale)['meta_description'] ?? '') }}
|
||||
</textarea>
|
||||
<textarea type="text" class="control" name="{{$locale}}[meta_description]">{{ old($locale)['meta_description'] ?? ($page->translate($locale)['meta_description'] ?? '') }}</textarea>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</accordian>
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
<div class="form-container">
|
||||
@csrf()
|
||||
|
||||
@if ($groups = array_get($config->items, request()->route('slug') . '.children.' . request()->route('slug2') . '.children'))
|
||||
@if ($groups = \Illuminate\Support\Arr::get($config->items, request()->route('slug') . '.children.' . request()->route('slug2') . '.children'))
|
||||
|
||||
@foreach ($groups as $key => $item)
|
||||
|
||||
|
|
@ -65,6 +65,11 @@
|
|||
|
||||
@include ('admin::configuration.field-type', ['field' => $field])
|
||||
|
||||
@php ($hint = $field['title'] . '-hint')
|
||||
@if ($hint !== __($hint))
|
||||
{{ __($hint) }}
|
||||
@endif
|
||||
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<?php $keys = explode('.', $menu->currentKey); ?>
|
||||
|
||||
@if(isset($keys) && strlen($keys[0]))
|
||||
@foreach (array_get($menu->items, current($keys) . '.children') as $item)
|
||||
@foreach (\Illuminate\Support\Arr::get($menu->items, current($keys) . '.children') as $item)
|
||||
<li class="{{ $menu->getActive($item) }}">
|
||||
<a href="{{ $item['url'] }}">
|
||||
{{ trans($item['name']) }}
|
||||
|
|
|
|||
|
|
@ -4,11 +4,11 @@
|
|||
<?php $keys = explode('.', $menu->currentKey); ?>
|
||||
|
||||
|
||||
@if ($items = array_get($menu->items, implode('.children.', array_slice($keys, 0, 2)) . '.children'))
|
||||
|
||||
@if ($items = \Illuminate\Support\Arr::get($menu->items, implode('.children.', array_slice($keys, 0, 2)) . '.children'))
|
||||
|
||||
<ul>
|
||||
|
||||
@foreach (array_get($menu->items, implode('.children.', array_slice($keys, 0, 2)) . '.children') as $item)
|
||||
@foreach (\Illuminate\Support\Arr::get($menu->items, implode('.children.', array_slice($keys, 0, 2)) . '.children') as $item)
|
||||
|
||||
<li class="{{ $menu->getActive($item) }}">
|
||||
<a href="{{ $item['url'] }}">
|
||||
|
|
@ -17,14 +17,14 @@
|
|||
</li>
|
||||
|
||||
@endforeach
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
@endif
|
||||
|
||||
@else
|
||||
|
||||
@if ($items = array_get($config->items, request()->route('slug') . '.children'))
|
||||
@if ($items = \Illuminate\Support\Arr::get($config->items, request()->route('slug') . '.children'))
|
||||
|
||||
<ul>
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@
|
|||
padding: 5px 10px;
|
||||
border-bottom: solid 1px #d3d3d3;
|
||||
border-left: solid 1px #d3d3d3;
|
||||
color: $font-color;
|
||||
color: #3A3A3A;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
|
@ -127,7 +127,7 @@
|
|||
<p>{{ $invoice->order->shipping_address->city }}</p>
|
||||
<p>{{ $invoice->order->shipping_address->state }}</p>
|
||||
<p>{{ core()->country_name($invoice->order->shipping_address->country) }} {{ $invoice->order->shipping_address->postcode }}</p>
|
||||
{{ __('shop::app.checkout.onepage.contact') }} : {{ $invoice->order->shipping_address->phone }}
|
||||
{{ __('shop::app.checkout.onepage.contact') }} : {{ $invoice->order->shipping_address->phone }}
|
||||
</td>
|
||||
@endif
|
||||
</tr>
|
||||
|
|
@ -187,7 +187,7 @@
|
|||
|
||||
@if (isset($item->additional['attributes']))
|
||||
<div class="item-options">
|
||||
|
||||
|
||||
@foreach ($item->additional['attributes'] as $attribute)
|
||||
<b>{{ $attribute['attribute_name'] }} : </b>{{ $attribute['option_label'] }}</br>
|
||||
@endforeach
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
<div class="form-container">
|
||||
@csrf()
|
||||
|
||||
{!! view_render_event('bagisto.admin.settings.locale.edit.before') !!}
|
||||
{!! view_render_event('bagisto.admin.settings.locale.edit.before', ['locale' => $locale]) !!}
|
||||
|
||||
<input name="_method" type="hidden" value="PUT">
|
||||
|
||||
|
|
@ -60,7 +60,7 @@
|
|||
</div>
|
||||
</accordian>
|
||||
|
||||
{!! view_render_event('bagisto.admin.settings.locale.edit.after') !!}
|
||||
{!! view_render_event('bagisto.admin.settings.locale.edit.after', ['locale' => $locale]) !!}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
<div class="control-group" :class="[errors.has('password') ? 'has-error' : '']">
|
||||
<label for="password">{{ __('admin::app.users.reset-password.password') }}</label>
|
||||
<input type="password" v-validate="'required|min:6'" class="control" id="password" name="password" data-vv-as=""{{ __('admin::app.users.reset-password.password') }}""/>
|
||||
<input type="password" v-validate="'required|min:6'" class="control" id="password" name="password" ref="password" data-vv-as=""{{ __('admin::app.users.reset-password.password') }}""/>
|
||||
<span class="control-error" v-if="errors.has('password')">@{{ errors.first('password') }}</span>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
<div slot="body">
|
||||
<div class="control-group" :class="[errors.has('password') ? 'has-error' : '']">
|
||||
<label for="password">{{ __('admin::app.users.users.password') }}</label>
|
||||
<input type="password" v-validate="'min:6|max:18'" class="control" id="password" name="password" data-vv-as=""{{ __('admin::app.users.users.password') }}""/>
|
||||
<input type="password" v-validate="'min:6|max:18'" class="control" id="password" name="password" ref="password" data-vv-as=""{{ __('admin::app.users.users.password') }}""/>
|
||||
<span class="control-error" v-if="errors.has('password')">@{{ errors.first('password') }}</span>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
<div slot="body">
|
||||
<div class="control-group" :class="[errors.has('password') ? 'has-error' : '']">
|
||||
<label for="password">{{ __('admin::app.users.users.password') }}</label>
|
||||
<input type="password" v-validate="'min:6|max:18'" class="control" id="password" name="password" data-vv-as=""{{ __('admin::app.users.users.password') }}""/>
|
||||
<input type="password" v-validate="'min:6|max:18'" class="control" id="password" name="password" ref="password" data-vv-as=""{{ __('admin::app.users.users.password') }}""/>
|
||||
<span class="control-error" v-if="errors.has('password')">@{{ errors.first('password') }}</span>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ mix.setPublicPath(publicPath).mergeManifest();
|
|||
mix.disableNotifications();
|
||||
|
||||
mix.js(__dirname + "/src/Resources/assets/js/app.js", "js/admin.js")
|
||||
.copyDirectory( __dirname + '/src/Resources/assets/images', publicPath + '/images')
|
||||
.sass(__dirname + "/src/Resources/assets/sass/app.scss", "css/admin.css")
|
||||
.options({
|
||||
processCssUrls: false
|
||||
|
|
|
|||
|
|
@ -3,16 +3,20 @@
|
|||
namespace Webkul\Attribute\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use DB;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AttributeFamilyTableSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
|
||||
|
||||
DB::table('attribute_families')->delete();
|
||||
|
||||
DB::table('attribute_families')->insert([
|
||||
['id' => '1','code' => 'default','name' => 'Default','status' => '0','is_user_defined' => '1']
|
||||
]);
|
||||
|
||||
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
|
||||
}
|
||||
}
|
||||
|
|
@ -3,12 +3,17 @@
|
|||
namespace Webkul\Attribute\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use DB;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AttributeGroupTableSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
|
||||
|
||||
DB::table('attribute_groups')->delete();
|
||||
DB::table('attribute_group_mappings')->delete();
|
||||
|
||||
DB::table('attribute_groups')->delete();
|
||||
|
||||
DB::table('attribute_groups')->insert([
|
||||
|
|
@ -42,9 +47,12 @@ class AttributeGroupTableSeeder extends Seeder
|
|||
['attribute_id' => '20','attribute_group_id' => '5','position' => '2'],
|
||||
['attribute_id' => '21','attribute_group_id' => '5','position' => '3'],
|
||||
['attribute_id' => '22','attribute_group_id' => '5','position' => '4'],
|
||||
['attribute_id' => '23','attribute_group_id' => '1','position' => '9'],
|
||||
['attribute_id' => '24','attribute_group_id' => '1','position' => '10'],
|
||||
['attribute_id' => '25','attribute_group_id' => '1','position' => '11']
|
||||
['attribute_id' => '23','attribute_group_id' => '1','position' => '10'],
|
||||
['attribute_id' => '24','attribute_group_id' => '1','position' => '11'],
|
||||
['attribute_id' => '25','attribute_group_id' => '1','position' => '12'],
|
||||
['attribute_id' => '26','attribute_group_id' => '1','position' => '9']
|
||||
]);
|
||||
|
||||
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
|
||||
}
|
||||
}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
namespace Webkul\Attribute\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use DB;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AttributeOptionTableSeeder extends Seeder
|
||||
{
|
||||
|
|
@ -11,6 +11,7 @@ class AttributeOptionTableSeeder extends Seeder
|
|||
public function run()
|
||||
{
|
||||
DB::table('attribute_options')->delete();
|
||||
DB::table('attribute_option_translations')->delete();
|
||||
|
||||
DB::table('attribute_options')->insert([
|
||||
['id' => '1', 'admin_name' => 'Red', 'sort_order' => '1', 'attribute_id' => '23'],
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
namespace Webkul\Attribute\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use DB;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AttributeTableSeeder extends Seeder
|
||||
{
|
||||
|
|
@ -12,6 +12,7 @@ class AttributeTableSeeder extends Seeder
|
|||
public function run()
|
||||
{
|
||||
DB::table('attributes')->delete();
|
||||
DB::table('attribute_translations')->delete();
|
||||
|
||||
$now = Carbon::now();
|
||||
|
||||
|
|
@ -59,9 +60,11 @@ class AttributeTableSeeder extends Seeder
|
|||
['id' => '23','code' => 'color','admin_name' => 'Color','type' => 'select','validation' => NULL,'position' => '23','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '1','is_configurable' => '1','is_user_defined' => '1','is_visible_on_front' => '0',
|
||||
'use_in_flat' => '1','created_at' => $now,'updated_at' => $now],
|
||||
['id' => '24','code' => 'size','admin_name' => 'Size','type' => 'select','validation' => NULL,'position' => '24','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '1','is_configurable' => '1','is_user_defined' => '1','is_visible_on_front' => '0',
|
||||
'use_in_flat' => '1','created_at' => $now,'updated_at' => $now],
|
||||
'use_in_flat' => '1','created_at' => $now,'updated_at' => $now],
|
||||
['id' => '25','code' => 'brand','admin_name' => 'Brand','type' => 'select','validation' => NULL,'position' => '25','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '1','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '1',
|
||||
'use_in_flat' => '1','created_at' => $now,'updated_at' => $now]
|
||||
'use_in_flat' => '1','created_at' => $now,'updated_at' => $now],
|
||||
['id' => '26','code' => 'guest_checkout','admin_name' => 'Guest Checkout','type' => 'boolean','validation' => NULL,'position' => '8','is_required' => '1','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0',
|
||||
'use_in_flat' => '1','created_at' => $now,'updated_at' => $now],
|
||||
]);
|
||||
|
||||
|
||||
|
|
@ -90,7 +93,8 @@ class AttributeTableSeeder extends Seeder
|
|||
['id' => '22','locale' => 'en','name' => 'Weight','attribute_id' => '22'],
|
||||
['id' => '23','locale' => 'en','name' => 'Color','attribute_id' => '23'],
|
||||
['id' => '24','locale' => 'en','name' => 'Size','attribute_id' => '24'],
|
||||
['id' => '25','locale' => 'en','name' => 'Brand','attribute_id' => '25']
|
||||
['id' => '25','locale' => 'en','name' => 'Brand','attribute_id' => '25'],
|
||||
['id' => '26','locale' => 'en','name' => 'Allow Guest Checkout','attribute_id' => '26']
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -13,9 +13,9 @@ class DatabaseSeeder extends Seeder
|
|||
*/
|
||||
public function run()
|
||||
{
|
||||
$this->call(AttributeTableSeeder::class);
|
||||
$this->call(AttributeOptionTableSeeder::class);
|
||||
$this->call(AttributeFamilyTableSeeder::class);
|
||||
$this->call(AttributeGroupTableSeeder::class);
|
||||
$this->call(AttributeTableSeeder::class);
|
||||
$this->call(AttributeOptionTableSeeder::class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Event;
|
|||
use Webkul\Attribute\Repositories\AttributeRepository;
|
||||
use Webkul\Attribute\Repositories\AttributeGroupRepository;
|
||||
use Illuminate\Container\Container as App;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Attribute Reposotory
|
||||
|
|
@ -66,7 +67,7 @@ class AttributeFamilyRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
Event::fire('catalog.attribute_family.create.before');
|
||||
Event::dispatch('catalog.attribute_family.create.before');
|
||||
|
||||
$attributeGroups = isset($data['attribute_groups']) ? $data['attribute_groups'] : [];
|
||||
unset($data['attribute_groups']);
|
||||
|
|
@ -88,7 +89,7 @@ class AttributeFamilyRepository extends Repository
|
|||
}
|
||||
}
|
||||
|
||||
Event::fire('catalog.attribute_family.create.after', $family);
|
||||
Event::dispatch('catalog.attribute_family.create.after', $family);
|
||||
|
||||
return $family;
|
||||
}
|
||||
|
|
@ -103,7 +104,7 @@ class AttributeFamilyRepository extends Repository
|
|||
{
|
||||
$family = $this->find($id);
|
||||
|
||||
Event::fire('catalog.attribute_family.update.before', $id);
|
||||
Event::dispatch('catalog.attribute_family.update.before', $id);
|
||||
|
||||
$family->update($data);
|
||||
|
||||
|
|
@ -111,7 +112,7 @@ class AttributeFamilyRepository extends Repository
|
|||
|
||||
if (isset($data['attribute_groups'])) {
|
||||
foreach ($data['attribute_groups'] as $attributeGroupId => $attributeGroupInputs) {
|
||||
if (str_contains($attributeGroupId, 'group_')) {
|
||||
if (Str::contains($attributeGroupId, 'group_')) {
|
||||
$attributeGroup = $family->attribute_groups()->create($attributeGroupInputs);
|
||||
|
||||
if (isset($attributeGroupInputs['custom_attributes'])) {
|
||||
|
|
@ -152,7 +153,7 @@ class AttributeFamilyRepository extends Repository
|
|||
$this->attributeGroupRepository->delete($attributeGroupId);
|
||||
}
|
||||
|
||||
Event::fire('catalog.attribute_family.update.after', $family);
|
||||
Event::dispatch('catalog.attribute_family.update.after', $family);
|
||||
|
||||
return $family;
|
||||
}
|
||||
|
|
@ -181,10 +182,10 @@ class AttributeFamilyRepository extends Repository
|
|||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
Event::fire('catalog.attribute_family.delete.before', $id);
|
||||
Event::dispatch('catalog.attribute_family.delete.before', $id);
|
||||
|
||||
parent::delete($id);
|
||||
|
||||
Event::fire('catalog.attribute_family.delete.after', $id);
|
||||
Event::dispatch('catalog.attribute_family.delete.after', $id);
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ use Webkul\Core\Eloquent\Repository;
|
|||
use Illuminate\Support\Facades\Event;
|
||||
use Webkul\Attribute\Repositories\AttributeOptionRepository;
|
||||
use Illuminate\Container\Container as App;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Attribute Reposotory
|
||||
|
|
@ -54,7 +55,7 @@ class AttributeRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
Event::fire('catalog.attribute.create.before');
|
||||
Event::dispatch('catalog.attribute.create.before');
|
||||
|
||||
$data = $this->validateUserInput($data);
|
||||
|
||||
|
|
@ -70,7 +71,7 @@ class AttributeRepository extends Repository
|
|||
}
|
||||
}
|
||||
|
||||
Event::fire('catalog.attribute.create.after', $attribute);
|
||||
Event::dispatch('catalog.attribute.create.after', $attribute);
|
||||
|
||||
return $attribute;
|
||||
}
|
||||
|
|
@ -87,7 +88,7 @@ class AttributeRepository extends Repository
|
|||
|
||||
$attribute = $this->find($id);
|
||||
|
||||
Event::fire('catalog.attribute.update.before', $id);
|
||||
Event::dispatch('catalog.attribute.update.before', $id);
|
||||
|
||||
$attribute->update($data);
|
||||
|
||||
|
|
@ -96,7 +97,7 @@ class AttributeRepository extends Repository
|
|||
if (in_array($attribute->type, ['select', 'multiselect', 'checkbox'])) {
|
||||
if (isset($data['options'])) {
|
||||
foreach ($data['options'] as $optionId => $optionInputs) {
|
||||
if (str_contains($optionId, 'option_')) {
|
||||
if (Str::contains($optionId, 'option_')) {
|
||||
$this->attributeOptionRepository->create(array_merge([
|
||||
'attribute_id' => $attribute->id,
|
||||
], $optionInputs));
|
||||
|
|
@ -115,7 +116,7 @@ class AttributeRepository extends Repository
|
|||
$this->attributeOptionRepository->delete($optionId);
|
||||
}
|
||||
|
||||
Event::fire('catalog.attribute.update.after', $attribute);
|
||||
Event::dispatch('catalog.attribute.update.after', $attribute);
|
||||
|
||||
return $attribute;
|
||||
}
|
||||
|
|
@ -126,11 +127,11 @@ class AttributeRepository extends Repository
|
|||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
Event::fire('catalog.attribute.delete.before', $id);
|
||||
Event::dispatch('catalog.attribute.delete.before', $id);
|
||||
|
||||
parent::delete($id);
|
||||
|
||||
Event::fire('catalog.attribute.delete.after', $id);
|
||||
Event::dispatch('catalog.attribute.delete.after', $id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,15 +2,16 @@
|
|||
|
||||
namespace Webkul\CMS\Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use DB;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class CMSPagesTableSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
DB::table('cms_pages')->delete();
|
||||
DB::table('cms_page_translations')->delete();
|
||||
|
||||
DB::table('cms_pages')->insert([
|
||||
[
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ class CmsRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
Event::fire('cms.pages.create.before');
|
||||
Event::dispatch('cms.pages.create.before');
|
||||
|
||||
$model = $this->getModel();
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ class CmsRepository extends Repository
|
|||
|
||||
$page->channels()->sync($data['channels']);
|
||||
|
||||
Event::fire('cms.pages.create.after', $page);
|
||||
Event::dispatch('cms.pages.create.after', $page);
|
||||
|
||||
return $page;
|
||||
}
|
||||
|
|
@ -61,13 +61,13 @@ class CmsRepository extends Repository
|
|||
{
|
||||
$page = $this->find($id);
|
||||
|
||||
Event::fire('cms.pages.update.before', $id);
|
||||
Event::dispatch('cms.pages.update.before', $id);
|
||||
|
||||
parent::update($data, $id, $attribute);
|
||||
|
||||
$page->channels()->sync($data['channels']);
|
||||
|
||||
Event::fire('cms.pages.update.after', $id);
|
||||
Event::dispatch('cms.pages.update.after', $id);
|
||||
|
||||
return $page;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,11 +97,11 @@ class CartRuleController extends Controller
|
|||
|
||||
$data = request()->all();
|
||||
|
||||
Event::fire('promotions.cart_rule.create.before');
|
||||
Event::dispatch('promotions.cart_rule.create.before');
|
||||
|
||||
$cartRule = $this->cartRuleRepository->create($data);
|
||||
|
||||
Event::fire('promotions.cart_rule.create.after', $cartRule);
|
||||
Event::dispatch('promotions.cart_rule.create.after', $cartRule);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.create-success', ['name' => 'Cart Rule']));
|
||||
|
||||
|
|
@ -145,11 +145,11 @@ class CartRuleController extends Controller
|
|||
|
||||
$cartRule = $this->cartRuleRepository->findOrFail($id);
|
||||
|
||||
Event::fire('promotions.cart_rule.update.before', $cartRule);
|
||||
Event::dispatch('promotions.cart_rule.update.before', $cartRule);
|
||||
|
||||
$cartRule = $this->cartRuleRepository->update(request()->all(), $id);
|
||||
|
||||
Event::fire('promotions.cart_rule.update.after', $cartRule);
|
||||
Event::dispatch('promotions.cart_rule.update.after', $cartRule);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.update-success', ['name' => 'Cart Rule']));
|
||||
|
||||
|
|
@ -167,11 +167,11 @@ class CartRuleController extends Controller
|
|||
$cartRule = $this->cartRuleRepository->findOrFail($id);
|
||||
|
||||
try {
|
||||
Event::fire('promotions.cart_rule.delete.before', $id);
|
||||
Event::dispatch('promotions.cart_rule.delete.before', $id);
|
||||
|
||||
$this->cartRuleRepository->delete($id);
|
||||
|
||||
Event::fire('promotions.cart_rule.delete.after', $id);
|
||||
Event::dispatch('promotions.cart_rule.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.delete-success', ['name' => 'Cart Rule']));
|
||||
|
||||
|
|
|
|||
|
|
@ -94,11 +94,11 @@ class CatalogRuleController extends Controller
|
|||
|
||||
$data = request()->all();
|
||||
|
||||
Event::fire('promotions.catalog_rule.create.before');
|
||||
Event::dispatch('promotions.catalog_rule.create.before');
|
||||
|
||||
$catalogRule = $this->catalogRuleRepository->create($data);
|
||||
|
||||
Event::fire('promotions.catalog_rule.create.after', $catalogRule);
|
||||
Event::dispatch('promotions.catalog_rule.create.after', $catalogRule);
|
||||
|
||||
$this->catalogRuleIndexHelper->reindexComplete();
|
||||
|
||||
|
|
@ -141,11 +141,11 @@ class CatalogRuleController extends Controller
|
|||
|
||||
$catalogRule = $this->catalogRuleRepository->findOrFail($id);
|
||||
|
||||
Event::fire('promotions.catalog_rule.update.before', $catalogRule);
|
||||
Event::dispatch('promotions.catalog_rule.update.before', $catalogRule);
|
||||
|
||||
$catalogRule = $this->catalogRuleRepository->update(request()->all(), $id);
|
||||
|
||||
Event::fire('promotions.catalog_rule.update.after', $catalogRule);
|
||||
Event::dispatch('promotions.catalog_rule.update.after', $catalogRule);
|
||||
|
||||
$this->catalogRuleIndexHelper->reindexComplete();
|
||||
|
||||
|
|
@ -165,11 +165,11 @@ class CatalogRuleController extends Controller
|
|||
$catalogRule = $this->catalogRuleRepository->findOrFail($id);
|
||||
|
||||
try {
|
||||
Event::fire('promotions.catalog_rule.delete.before', $id);
|
||||
Event::dispatch('promotions.catalog_rule.delete.before', $id);
|
||||
|
||||
$this->catalogRuleRepository->delete($id);
|
||||
|
||||
Event::fire('promotions.catalog_rule.delete.after', $id);
|
||||
Event::dispatch('promotions.catalog_rule.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.delete-success', ['name' => 'Catalog Rule']));
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,9 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Category\Models\Category;
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
$factory->define(Category::class, function (Faker $faker, array $attributes) {
|
||||
|
||||
return [
|
||||
|
|
|
|||
|
|
@ -115,15 +115,15 @@ class CategoryController extends Controller
|
|||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @param int $id
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$categories = $this->categoryRepository->getCategoryTree($id);
|
||||
|
||||
$category = $this->categoryRepository->findOrFail($id);
|
||||
|
||||
$categories = $this->categoryRepository->getCategoryTreeWithoutDescendant($id);
|
||||
|
||||
$attributes = $this->attributeRepository->findWhere(['is_filterable' => 1]);
|
||||
|
||||
return view($this->_config['view'], compact('category', 'categories', 'attributes'));
|
||||
|
|
@ -174,7 +174,7 @@ class CategoryController extends Controller
|
|||
|
||||
$this->categoryRepository->delete($id);
|
||||
|
||||
Event::fire('catalog.category.delete.after', $id);
|
||||
Event::dispatch('catalog.category.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.delete-success', ['name' => 'Category']));
|
||||
|
||||
|
|
@ -200,11 +200,11 @@ class CategoryController extends Controller
|
|||
|
||||
foreach ($indexes as $key => $value) {
|
||||
try {
|
||||
Event::fire('catalog.category.delete.before', $value);
|
||||
Event::dispatch('catalog.category.delete.before', $value);
|
||||
|
||||
$this->categoryRepository->delete($value);
|
||||
|
||||
Event::fire('catalog.category.delete.after', $value);
|
||||
Event::dispatch('catalog.category.delete.after', $value);
|
||||
} catch(\Exception $e) {
|
||||
$suppressFlash = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,10 @@ namespace Webkul\Category\Models;
|
|||
use Webkul\Core\Eloquent\TranslatableModel;
|
||||
use Kalnoy\Nestedset\NodeTrait;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Webkul\Category\Contracts\Category as CategoryContract;
|
||||
use Webkul\Attribute\Models\AttributeProxy;
|
||||
use Webkul\Category\Repositories\CategoryRepository;
|
||||
|
||||
/**
|
||||
* Class Category
|
||||
|
|
@ -19,7 +21,7 @@ class Category extends TranslatableModel implements CategoryContract
|
|||
{
|
||||
use NodeTrait;
|
||||
|
||||
public $translatedAttributes = ['name', 'description', 'slug', 'meta_title', 'meta_description', 'meta_keywords'];
|
||||
public $translatedAttributes = ['name', 'description', 'slug', 'url_path', 'meta_title', 'meta_description', 'meta_keywords'];
|
||||
|
||||
protected $fillable = ['position', 'status', 'display_mode', 'parent_id'];
|
||||
|
||||
|
|
@ -51,4 +53,63 @@ class Category extends TranslatableModel implements CategoryContract
|
|||
{
|
||||
return $this->belongsToMany(AttributeProxy::modelClass(), 'category_filterable_attributes')->with('options');
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the root category of a category
|
||||
*
|
||||
* @return Category
|
||||
*/
|
||||
public function getRootCategory(): Category
|
||||
{
|
||||
return Category::where([
|
||||
['parent_id', '=', null],
|
||||
['_lft', '<=', $this->_lft],
|
||||
['_rgt', '>=', $this->_rgt],
|
||||
])->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all categories within the category's path
|
||||
*
|
||||
* @return Category[]
|
||||
*/
|
||||
public function getPathCategories(): array
|
||||
{
|
||||
$category = $this->findInTree();
|
||||
|
||||
$categories = [$category];
|
||||
|
||||
while (isset($category->parent)) {
|
||||
$category = $category->parent;
|
||||
$categories[] = $category;
|
||||
}
|
||||
|
||||
return array_reverse($categories);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds and returns the category within a nested category tree
|
||||
* will search in root category by default
|
||||
* is used to minimize the numbers of sql queries for it only uses the already cached tree
|
||||
*
|
||||
* @param Category[] $categoryTree
|
||||
* @return Category
|
||||
*/
|
||||
public function findInTree($categoryTree = null): Category
|
||||
{
|
||||
if (! $categoryTree) {
|
||||
$categoryTree = app(CategoryRepository::class)->getVisibleCategoryTree($this->getRootCategory()->id);
|
||||
}
|
||||
|
||||
$category = $categoryTree->first();
|
||||
|
||||
if (! $category) {
|
||||
throw new NotFoundHttpException('category not found in tree');
|
||||
}
|
||||
|
||||
if ($category->id === $this->id) {
|
||||
return $category;
|
||||
}
|
||||
return $this->findInTree($category->children);
|
||||
}
|
||||
}
|
||||
|
|
@ -9,6 +9,7 @@ use Webkul\Core\Eloquent\Repository;
|
|||
use Webkul\Category\Models\Category;
|
||||
use Webkul\Category\Models\CategoryTranslation;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
/**
|
||||
* Category Reposotory
|
||||
|
|
@ -34,7 +35,7 @@ class CategoryRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
Event::fire('catalog.category.create.before');
|
||||
Event::dispatch('catalog.category.create.before');
|
||||
|
||||
if (isset($data['locale']) && $data['locale'] == 'all') {
|
||||
$model = app()->make($this->model());
|
||||
|
|
@ -57,7 +58,7 @@ class CategoryRepository extends Repository
|
|||
$category->filterableAttributes()->sync($data['attributes']);
|
||||
}
|
||||
|
||||
Event::fire('catalog.category.create.after', $category);
|
||||
Event::dispatch('catalog.category.create.after', $category);
|
||||
|
||||
return $category;
|
||||
}
|
||||
|
|
@ -75,6 +76,18 @@ class CategoryRepository extends Repository
|
|||
: $this->model::orderBy('position', 'ASC')->get()->toTree();
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify category tree
|
||||
*
|
||||
* @param integer $id
|
||||
* @return mixed
|
||||
*/
|
||||
public function getCategoryTreeWithoutDescendant($id = null)
|
||||
{
|
||||
return $id
|
||||
? $this->model::orderBy('position', 'ASC')->where('id', '!=', $id)->whereNotDescendantOf($id)->get()->toTree()
|
||||
: $this->model::orderBy('position', 'ASC')->get()->toTree();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get root categories
|
||||
|
|
@ -116,7 +129,7 @@ class CategoryRepository extends Repository
|
|||
$exists = CategoryTranslation::where('category_id', '<>', $id)
|
||||
->where('slug', $slug)
|
||||
->limit(1)
|
||||
->select(\DB::raw(1))
|
||||
->select(DB::raw(1))
|
||||
->exists();
|
||||
|
||||
return $exists ? false : true;
|
||||
|
|
@ -161,7 +174,7 @@ class CategoryRepository extends Repository
|
|||
{
|
||||
$category = $this->find($id);
|
||||
|
||||
Event::fire('catalog.category.update.before', $id);
|
||||
Event::dispatch('catalog.category.update.before', $id);
|
||||
|
||||
$category->update($data);
|
||||
|
||||
|
|
@ -171,7 +184,7 @@ class CategoryRepository extends Repository
|
|||
$category->filterableAttributes()->sync($data['attributes']);
|
||||
}
|
||||
|
||||
Event::fire('catalog.category.update.after', $id);
|
||||
Event::dispatch('catalog.category.update.after', $id);
|
||||
|
||||
return $category;
|
||||
}
|
||||
|
|
@ -182,11 +195,11 @@ class CategoryRepository extends Repository
|
|||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
Event::fire('catalog.category.delete.before', $id);
|
||||
Event::dispatch('catalog.category.delete.before', $id);
|
||||
|
||||
parent::delete($id);
|
||||
|
||||
Event::fire('catalog.category.delete.after', $id);
|
||||
Event::dispatch('catalog.category.delete.after', $id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ use Webkul\Checkout\Models\CartPayment;
|
|||
use Webkul\Customer\Repositories\WishlistRepository;
|
||||
use Webkul\Customer\Repositories\CustomerAddressRepository;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
/**
|
||||
* Facades handler for all the methods to be implemented in Cart.
|
||||
|
|
@ -131,7 +132,7 @@ class Cart {
|
|||
*/
|
||||
public function addProduct($productId, $data)
|
||||
{
|
||||
Event::fire('checkout.cart.add.before', $productId);
|
||||
Event::dispatch('checkout.cart.add.before', $productId);
|
||||
|
||||
$cart = $this->getCart();
|
||||
|
||||
|
|
@ -146,6 +147,10 @@ class Cart {
|
|||
if (is_string($cartProducts)) {
|
||||
$this->collectTotals();
|
||||
|
||||
if (! count($cart->all_items) > 0) {
|
||||
session()->forget('cart');
|
||||
}
|
||||
|
||||
throw new \Exception($cartProducts);
|
||||
} else {
|
||||
$parentCartItem = null;
|
||||
|
|
@ -175,7 +180,7 @@ class Cart {
|
|||
}
|
||||
}
|
||||
|
||||
Event::fire('checkout.cart.add.after', $cart);
|
||||
Event::dispatch('checkout.cart.add.after', $cart);
|
||||
|
||||
$this->collectTotals();
|
||||
|
||||
|
|
@ -249,7 +254,7 @@ class Cart {
|
|||
if (! $this->isItemHaveQuantity($item))
|
||||
throw new \Exception(trans('shop::app.checkout.cart.quantity.inventory_warning'));
|
||||
|
||||
Event::fire('checkout.cart.update.before', $item);
|
||||
Event::dispatch('checkout.cart.update.before', $item);
|
||||
|
||||
$this->cartItemRepository->update([
|
||||
'quantity' => $quantity,
|
||||
|
|
@ -259,7 +264,7 @@ class Cart {
|
|||
'base_total_weight' => $item->weight * $quantity
|
||||
], $itemId);
|
||||
|
||||
Event::fire('checkout.cart.update.after', $item);
|
||||
Event::dispatch('checkout.cart.update.after', $item);
|
||||
}
|
||||
|
||||
$this->collectTotals();
|
||||
|
|
@ -297,7 +302,7 @@ class Cart {
|
|||
*/
|
||||
public function removeItem($itemId)
|
||||
{
|
||||
Event::fire('checkout.cart.delete.before', $itemId);
|
||||
Event::dispatch('checkout.cart.delete.before', $itemId);
|
||||
|
||||
if (! $cart = $this->getCart())
|
||||
return false;
|
||||
|
|
@ -313,32 +318,13 @@ class Cart {
|
|||
}
|
||||
}
|
||||
|
||||
Event::fire('checkout.cart.delete.after', $itemId);
|
||||
Event::dispatch('checkout.cart.delete.after', $itemId);
|
||||
|
||||
$this->collectTotals();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear cart
|
||||
* @return bool
|
||||
*/
|
||||
public function clear(): bool
|
||||
{
|
||||
if (! $cart = $this->getCart()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->cartRepository->delete($cart->id);
|
||||
|
||||
if (session()->has('cart')) {
|
||||
session()->forget('cart');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function handles when guest has some of cart products and then logs in.
|
||||
*
|
||||
|
|
@ -638,7 +624,7 @@ class Cart {
|
|||
if (! $cart = $this->getCart())
|
||||
return false;
|
||||
|
||||
Event::fire('checkout.cart.collect.totals.before', $cart);
|
||||
Event::dispatch('checkout.cart.collect.totals.before', $cart);
|
||||
|
||||
$this->calculateItemsTax();
|
||||
|
||||
|
|
@ -681,7 +667,7 @@ class Cart {
|
|||
|
||||
$cart->save();
|
||||
|
||||
Event::fire('checkout.cart.collect.totals.after', $cart);
|
||||
Event::dispatch('checkout.cart.collect.totals.after', $cart);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -871,8 +857,8 @@ class Cart {
|
|||
'applied_cart_rule_ids' => $data['applied_cart_rule_ids'],
|
||||
'discount_amount' => $data['discount_amount'],
|
||||
'base_discount_amount' => $data['base_discount_amount'],
|
||||
'billing_address' => array_except($data['billing_address'], ['id', 'cart_id']),
|
||||
'payment' => array_except($data['payment'], ['id', 'cart_id']),
|
||||
'billing_address' => Arr::except($data['billing_address'], ['id', 'cart_id']),
|
||||
'payment' => Arr::except($data['payment'], ['id', 'cart_id']),
|
||||
'channel' => core()->getCurrentChannel(),
|
||||
];
|
||||
|
||||
|
|
@ -883,9 +869,9 @@ class Cart {
|
|||
'shipping_description' => $data['selected_shipping_rate']['method_description'],
|
||||
'shipping_amount' => $data['selected_shipping_rate']['price'],
|
||||
'base_shipping_amount' => $data['selected_shipping_rate']['base_price'],
|
||||
'shipping_address' => Arr::except($data['shipping_address'], ['id', 'cart_id']),
|
||||
'shipping_discount_amount' => $data['selected_shipping_rate']['discount_amount'],
|
||||
'base_shipping_discount_amount' => $data['selected_shipping_rate']['base_discount_amount'],
|
||||
'shipping_address' => array_except($data['shipping_address'], ['id', 'cart_id']),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -138,12 +138,27 @@ class Cart extends Model implements CartContract
|
|||
*/
|
||||
public function hasProductsWithQuantityBox(): bool
|
||||
{
|
||||
$result = true;
|
||||
foreach ($this->items as $item) {
|
||||
if ($item->product->getTypeInstance()->showQuantityBox() === true) {
|
||||
$result = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if cart has items that allow guest checkout
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasGuestCheckoutItems()
|
||||
{
|
||||
foreach ($this->items as $item) {
|
||||
if ($item->product->getAttribute('guest_checkout') === 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Core\Database\Seeders;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ConfigTableSeeder extends Seeder
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
DB::table('core_config')->delete();
|
||||
|
||||
$now = Carbon::now();
|
||||
|
||||
DB::table('core_config')->insert([
|
||||
'id' => 1,
|
||||
'code' => 'catalog.products.guest-checkout.allow-guest-checkout',
|
||||
'value' => '1',
|
||||
'channel_code' => null,
|
||||
'locale_code' => null,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -18,5 +18,6 @@ class DatabaseSeeder extends Seeder
|
|||
$this->call(CountriesTableSeeder::class);
|
||||
$this->call(StatesTableSeeder::class);
|
||||
$this->call(ChannelTableSeeder::class);
|
||||
$this->call(ConfigTableSeeder::class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,18 +82,28 @@ abstract class Repository extends BaseRepository {
|
|||
return $this->parserResult($model);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
/**
|
||||
* Count results of repository
|
||||
*
|
||||
* @param array $where
|
||||
* @param string $columns
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count()
|
||||
public function count(array $where = [], $columns = '*')
|
||||
{
|
||||
$this->applyCriteria();
|
||||
$this->applyScope();
|
||||
|
||||
$total = $this->model->count();
|
||||
$this->resetModel();
|
||||
if ($where) {
|
||||
$this->applyConditions($where);
|
||||
}
|
||||
|
||||
return $total;
|
||||
$result = $this->model->count($columns);
|
||||
$this->resetModel();
|
||||
$this->resetScope();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -0,0 +1,248 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Core\Helpers;
|
||||
|
||||
// here you can define custom actions
|
||||
// all public methods declared in helper class will be available in $I
|
||||
|
||||
use Codeception\Module\Laravel5;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Webkul\Product\Models\Product;
|
||||
use Webkul\Product\Models\ProductInventory;
|
||||
use Webkul\Product\Models\ProductAttributeValue;
|
||||
use Webkul\Product\Models\ProductDownloadableLink;
|
||||
use Webkul\Product\Models\ProductDownloadableLinkTranslation;
|
||||
|
||||
class Laravel5Helper extends Laravel5
|
||||
{
|
||||
public const SIMPLE_PRODUCT = 1;
|
||||
public const VIRTUAL_PRODUCT = 2;
|
||||
public const DOWNLOADABLE_PRODUCT = 3;
|
||||
|
||||
/**
|
||||
* Returns field name of given attribute.
|
||||
*
|
||||
* @param string $attribute
|
||||
*
|
||||
* @return string|null
|
||||
* @part ORM
|
||||
*/
|
||||
public static function getAttributeFieldName(string $attribute): ?string
|
||||
{
|
||||
$attributes = [
|
||||
'product_id' => 'integer_value',
|
||||
'sku' => 'text_value',
|
||||
'name' => 'text_value',
|
||||
'url_key' => 'text_value',
|
||||
'tax_category_id' => 'integer_value',
|
||||
'new' => 'boolean_value',
|
||||
'featured' => 'boolean_value',
|
||||
'visible_individually' => 'boolean_value',
|
||||
'status' => 'boolean_value',
|
||||
'short_description' => 'text_value',
|
||||
'description' => 'text_value',
|
||||
'price' => 'float_value',
|
||||
'cost' => 'float_value',
|
||||
'special_price' => 'float_value',
|
||||
'special_price_from' => 'date_value',
|
||||
'special_price_to' => 'date_value',
|
||||
'meta_title' => 'text_value',
|
||||
'meta_keywords' => 'text_value',
|
||||
'meta_description' => 'text_value',
|
||||
'width' => 'integer_value',
|
||||
'height' => 'integer_value',
|
||||
'depth' => 'integer_value',
|
||||
'weight' => 'integer_value',
|
||||
'color' => 'integer_value',
|
||||
'size' => 'integer_value',
|
||||
'brand' => 'text_value',
|
||||
'guest_checkout' => 'boolean_value',
|
||||
];
|
||||
if (!array_key_exists($attribute, $attributes)) {
|
||||
return null;
|
||||
}
|
||||
return $attributes[$attribute];
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to generate products for testing
|
||||
*
|
||||
* @param int $productType
|
||||
* @param array $configs
|
||||
* @param array $productStates
|
||||
*
|
||||
* @return \Webkul\Product\Models\Product
|
||||
*/
|
||||
public function haveProduct(int $productType, array $configs = [], array $productStates = []): Product
|
||||
{
|
||||
$I = $this;
|
||||
|
||||
switch ($productType) {
|
||||
case self::DOWNLOADABLE_PRODUCT:
|
||||
$product = $I->haveDownloadableProduct($configs, $productStates);
|
||||
break;
|
||||
|
||||
case self::VIRTUAL_PRODUCT:
|
||||
$product = $I->haveVirtualProduct($configs, $productStates);
|
||||
break;
|
||||
|
||||
case self::SIMPLE_PRODUCT:
|
||||
default:
|
||||
$product = $I->haveSimpleProduct($configs, $productStates);
|
||||
}
|
||||
|
||||
if ($product !== null) {
|
||||
Event::dispatch('catalog.product.create.after', $product);
|
||||
}
|
||||
|
||||
return $product;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $configs
|
||||
* @param array $productStates
|
||||
*
|
||||
* @return \Webkul\Product\Models\Product
|
||||
*/
|
||||
private function haveSimpleProduct(array $configs = [], array $productStates = []): Product
|
||||
{
|
||||
$I = $this;
|
||||
if (!in_array('simple', $productStates)) {
|
||||
$productStates = array_merge($productStates, ['simple']);
|
||||
}
|
||||
|
||||
/** @var Product $product */
|
||||
$product = $I->createProduct($configs['productAttributes'] ?? [], $productStates);
|
||||
|
||||
$I->createAttributeValues($product->id, $configs['attributeValues'] ?? []);
|
||||
|
||||
$I->createInventory($product->id, $configs['productInventory'] ?? []);
|
||||
|
||||
return $product->refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $configs
|
||||
* @param array $productStates
|
||||
*
|
||||
* @return \Webkul\Product\Models\Product
|
||||
*/
|
||||
private function haveVirtualProduct(array $configs = [], array $productStates = []): Product
|
||||
{
|
||||
$I = $this;
|
||||
if (!in_array('simple', $productStates)) {
|
||||
$productStates = array_merge($productStates, ['virtual']);
|
||||
}
|
||||
|
||||
/** @var Product $product */
|
||||
$product = $I->createProduct($configs['productAttributes'] ?? [], $productStates);
|
||||
|
||||
$I->createAttributeValues($product->id, $configs['attributeValues'] ?? []);
|
||||
|
||||
$I->createInventory($product->id, $configs['productInventory'] ?? []);
|
||||
|
||||
return $product->refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $configs
|
||||
* @param array $productStates
|
||||
*
|
||||
* @return \Webkul\Product\Models\Product
|
||||
*/
|
||||
private function haveDownloadableProduct(array $configs = [], array $productStates = []): Product
|
||||
{
|
||||
$I = $this;
|
||||
if (!in_array('downloadable', $productStates)) {
|
||||
$productStates = array_merge($productStates, ['downloadable']);
|
||||
}
|
||||
|
||||
/** @var Product $product */
|
||||
$product = $I->createProduct($configs['productAttributes'] ?? [], $productStates);
|
||||
|
||||
$I->createAttributeValues($product->id, $configs['attributeValues'] ?? []);
|
||||
|
||||
$I->createDownloadableLink($product->id);
|
||||
|
||||
return $product->refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $attributes
|
||||
* @param array $states
|
||||
*
|
||||
* @return \Webkul\Product\Models\Product
|
||||
*/
|
||||
private function createProduct(array $attributes = [], array $states = []): Product
|
||||
{
|
||||
return factory(Product::class)->states($states)->create($attributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $productId
|
||||
* @param array $inventoryConfig
|
||||
*/
|
||||
private function createInventory(int $productId, array $inventoryConfig = []): void
|
||||
{
|
||||
$I = $this;
|
||||
$I->have(ProductInventory::class, array_merge($inventoryConfig, [
|
||||
'product_id' => $productId,
|
||||
'inventory_source_id' => 1,
|
||||
]));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $productId
|
||||
*/
|
||||
private function createDownloadableLink(int $productId): void
|
||||
{
|
||||
$I = $this;
|
||||
$link = $I->have(ProductDownloadableLink::class, [
|
||||
'product_id' => $productId,
|
||||
]);
|
||||
|
||||
$I->have(ProductDownloadableLinkTranslation::class, [
|
||||
'product_downloadable_link_id' => $link->id,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $productId
|
||||
* @param array $attributeValues
|
||||
*/
|
||||
private function createAttributeValues(int $productId, array $attributeValues = []): void
|
||||
{
|
||||
$I = $this;
|
||||
$productAttributeValues = [
|
||||
'sku',
|
||||
'url_key',
|
||||
'tax_category_id',
|
||||
'price',
|
||||
'cost',
|
||||
'name',
|
||||
'new',
|
||||
'visible_individually',
|
||||
'featured',
|
||||
'status',
|
||||
'guest_checkout',
|
||||
'short_description',
|
||||
'description',
|
||||
'meta_title',
|
||||
'meta_keywords',
|
||||
'meta_description',
|
||||
'weight',
|
||||
];
|
||||
foreach ($productAttributeValues as $attribute) {
|
||||
$data = ['product_id' => $productId];
|
||||
if (array_key_exists($attribute, $attributeValues)) {
|
||||
$fieldName = self::getAttributeFieldName($attribute);
|
||||
if (!array_key_exists($fieldName, $data)) {
|
||||
$data[$fieldName] = $attributeValues[$attribute];
|
||||
} else {
|
||||
$data = [$fieldName => $attributeValues[$attribute]];
|
||||
}
|
||||
}
|
||||
$I->have(ProductAttributeValue::class, $data, $attribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -96,11 +96,11 @@ class ChannelController extends Controller
|
|||
|
||||
unset($data['seo']);
|
||||
|
||||
Event::fire('core.channel.create.before');
|
||||
Event::dispatch('core.channel.create.before');
|
||||
|
||||
$channel = $this->channelRepository->create($data);
|
||||
|
||||
Event::fire('core.channel.create.after', $channel);
|
||||
Event::dispatch('core.channel.create.after', $channel);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.channels.create-success'));
|
||||
|
||||
|
|
@ -153,11 +153,11 @@ class ChannelController extends Controller
|
|||
|
||||
$data['home_seo'] = json_encode($data['seo']);
|
||||
|
||||
Event::fire('core.channel.update.before', $id);
|
||||
Event::dispatch('core.channel.update.before', $id);
|
||||
|
||||
$channel = $this->channelRepository->update($data, $id);
|
||||
|
||||
Event::fire('core.channel.update.after', $channel);
|
||||
Event::dispatch('core.channel.update.after', $channel);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.channels.update-success'));
|
||||
|
||||
|
|
@ -178,11 +178,11 @@ class ChannelController extends Controller
|
|||
session()->flash('error', trans('admin::app.settings.channels.last-delete-error'));
|
||||
} else {
|
||||
try {
|
||||
Event::fire('core.channel.delete.before', $id);
|
||||
Event::dispatch('core.channel.delete.before', $id);
|
||||
|
||||
$this->channelRepository->delete($id);
|
||||
|
||||
Event::fire('core.channel.delete.after', $id);
|
||||
Event::dispatch('core.channel.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.channels.delete-success'));
|
||||
|
||||
|
|
|
|||
|
|
@ -72,11 +72,11 @@ class CurrencyController extends Controller
|
|||
'name' => 'required'
|
||||
]);
|
||||
|
||||
Event::fire('core.channel.create.before');
|
||||
Event::dispatch('core.channel.create.before');
|
||||
|
||||
$currency = $this->currencyRepository->create(request()->all());
|
||||
|
||||
Event::fire('core.currency.create.after', $currency);
|
||||
Event::dispatch('core.currency.create.after', $currency);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.currencies.create-success'));
|
||||
|
||||
|
|
@ -109,11 +109,11 @@ class CurrencyController extends Controller
|
|||
'name' => 'required'
|
||||
]);
|
||||
|
||||
Event::fire('core.currency.update.before', $id);
|
||||
Event::dispatch('core.currency.update.before', $id);
|
||||
|
||||
$currency = $this->currencyRepository->update(request()->all(), $id);
|
||||
|
||||
Event::fire('core.currency.update.after', $currency);
|
||||
Event::dispatch('core.currency.update.after', $currency);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.currencies.update-success'));
|
||||
|
||||
|
|
@ -134,11 +134,11 @@ class CurrencyController extends Controller
|
|||
session()->flash('warning', trans('admin::app.settings.currencies.last-delete-error'));
|
||||
} else {
|
||||
try {
|
||||
Event::fire('core.currency.delete.before', $id);
|
||||
Event::dispatch('core.currency.delete.before', $id);
|
||||
|
||||
$this->currencyRepository->delete($id);
|
||||
|
||||
Event::fire('core.currency.delete.after', $id);
|
||||
Event::dispatch('core.currency.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.currencies.delete-success'));
|
||||
|
||||
|
|
@ -164,11 +164,11 @@ class CurrencyController extends Controller
|
|||
|
||||
foreach ($indexes as $key => $value) {
|
||||
try {
|
||||
Event::fire('core.currency.delete.before', $value);
|
||||
Event::dispatch('core.currency.delete.before', $value);
|
||||
|
||||
$this->currencyRepository->delete($value);
|
||||
|
||||
Event::fire('core.currency.delete.after', $value);
|
||||
Event::dispatch('core.currency.delete.after', $value);
|
||||
} catch(\Exception $e) {
|
||||
$suppressFlash = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class ExchangeRateController extends Controller
|
|||
|
||||
/**
|
||||
* ExchangeRateRepository instance
|
||||
*
|
||||
*
|
||||
* @var Object
|
||||
*/
|
||||
protected $exchangeRateRepository;
|
||||
|
|
@ -90,11 +90,11 @@ class ExchangeRateController extends Controller
|
|||
'rate' => 'required|numeric'
|
||||
]);
|
||||
|
||||
Event::fire('core.exchange_rate.create.before');
|
||||
Event::dispatch('core.exchange_rate.create.before');
|
||||
|
||||
$exchangeRate = $this->exchangeRateRepository->create(request()->all());
|
||||
|
||||
Event::fire('core.exchange_rate.create.after', $exchangeRate);
|
||||
Event::dispatch('core.exchange_rate.create.after', $exchangeRate);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.exchange_rates.create-success'));
|
||||
|
||||
|
|
@ -129,11 +129,11 @@ class ExchangeRateController extends Controller
|
|||
'rate' => 'required|numeric'
|
||||
]);
|
||||
|
||||
Event::fire('core.exchange_rate.update.before', $id);
|
||||
Event::dispatch('core.exchange_rate.update.before', $id);
|
||||
|
||||
$exchangeRate = $this->exchangeRateRepository->update(request()->all(), $id);
|
||||
|
||||
Event::fire('core.exchange_rate.update.after', $exchangeRate);
|
||||
Event::dispatch('core.exchange_rate.update.after', $exchangeRate);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.exchange_rates.update-success'));
|
||||
|
||||
|
|
@ -190,13 +190,13 @@ class ExchangeRateController extends Controller
|
|||
session()->flash('error', trans('admin::app.settings.exchange_rates.last-delete-error'));
|
||||
} else {
|
||||
try {
|
||||
Event::fire('core.exchange_rate.delete.before', $id);
|
||||
Event::dispatch('core.exchange_rate.delete.before', $id);
|
||||
|
||||
$this->exchangeRateRepository->delete($id);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.exchange_rates.delete-success'));
|
||||
|
||||
Event::fire('core.exchange_rate.delete.after', $id);
|
||||
Event::dispatch('core.exchange_rate.delete.after', $id);
|
||||
|
||||
return response()->json(['message' => true], 200);
|
||||
} catch (\Exception $e) {
|
||||
|
|
|
|||
|
|
@ -73,11 +73,11 @@ class LocaleController extends Controller
|
|||
'direction' => 'in:ltr,rtl'
|
||||
]);
|
||||
|
||||
Event::fire('core.locale.create.before');
|
||||
Event::dispatch('core.locale.create.before');
|
||||
|
||||
$locale = $this->localeRepository->create(request()->all());
|
||||
|
||||
Event::fire('core.locale.create.after', $locale);
|
||||
Event::dispatch('core.locale.create.after', $locale);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.locales.create-success'));
|
||||
|
||||
|
|
@ -111,11 +111,11 @@ class LocaleController extends Controller
|
|||
'direction' => 'in:ltr,rtl'
|
||||
]);
|
||||
|
||||
Event::fire('core.locale.update.before', $id);
|
||||
Event::dispatch('core.locale.update.before', $id);
|
||||
|
||||
$locale = $this->localeRepository->update(request()->all(), $id);
|
||||
|
||||
Event::fire('core.locale.update.after', $locale);
|
||||
Event::dispatch('core.locale.update.after', $locale);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.locales.update-success'));
|
||||
|
||||
|
|
@ -136,11 +136,11 @@ class LocaleController extends Controller
|
|||
session()->flash('error', trans('admin::app.settings.locales.last-delete-error'));
|
||||
} else {
|
||||
try {
|
||||
Event::fire('core.locale.delete.before', $id);
|
||||
Event::dispatch('core.locale.delete.before', $id);
|
||||
|
||||
$this->localeRepository->delete($id);
|
||||
|
||||
Event::fire('core.locale.delete.after', $id);
|
||||
Event::dispatch('core.locale.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.locales.delete-success'));
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use Webkul\Core\Eloquent\Repository;
|
|||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Container\Container as App;
|
||||
use Webkul\Core\Repositories\ChannelRepository;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
/**
|
||||
* Slider Repository
|
||||
|
|
@ -55,7 +56,7 @@ class SliderRepository extends Repository
|
|||
*/
|
||||
public function save(array $data)
|
||||
{
|
||||
Event::fire('core.settings.slider.create.before', $id);
|
||||
Event::dispatch('core.settings.slider.create.before', $data);
|
||||
|
||||
$channelName = $this->channelRepository->find($data['channel_id'])->name;
|
||||
|
||||
|
|
@ -65,7 +66,7 @@ class SliderRepository extends Repository
|
|||
$image = false;
|
||||
|
||||
if (isset($data['image'])) {
|
||||
$image = $first = array_first($data['image'], function ($value, $key) {
|
||||
$image = $first = Arr::first($data['image'], function ($value, $key) {
|
||||
if ($value)
|
||||
return $value;
|
||||
else
|
||||
|
|
@ -87,7 +88,7 @@ class SliderRepository extends Repository
|
|||
|
||||
$slider = $this->create($data);
|
||||
|
||||
Event::fire('core.settings.slider.create.after', $slider);
|
||||
Event::dispatch('core.settings.slider.create.after', $slider);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -98,7 +99,7 @@ class SliderRepository extends Repository
|
|||
*/
|
||||
public function updateItem(array $data, $id)
|
||||
{
|
||||
Event::fire('core.settings.slider.update.before', $id);
|
||||
Event::dispatch('core.settings.slider.update.before', $id);
|
||||
|
||||
$channelName = $this->channelRepository->find($data['channel_id'])->name;
|
||||
|
||||
|
|
@ -107,7 +108,7 @@ class SliderRepository extends Repository
|
|||
$uploaded = $image = false;
|
||||
|
||||
if (isset($data['image'])) {
|
||||
$image = $first = array_first($data['image'], function ($value, $key) {
|
||||
$image = $first = Arr::first($data['image'], function ($value, $key) {
|
||||
return $value ? $value : false;
|
||||
});
|
||||
}
|
||||
|
|
@ -130,7 +131,7 @@ class SliderRepository extends Repository
|
|||
|
||||
$slider = $this->update($data, $id);
|
||||
|
||||
Event::fire('core.settings.slider.update.after', $slider);
|
||||
Event::dispatch('core.settings.slider.update.after', $slider);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ class AddressController extends Controller
|
|||
/**
|
||||
* CustomerAddressRepository object
|
||||
*
|
||||
* @param \Webkul\Customer\Repositories\CustomerAddressRepository $customerAddressRepository
|
||||
* @param \Webkul\Customer\Repositories\CustomerAddressRepository $customerAddressRepository
|
||||
*
|
||||
* @var Object
|
||||
*/
|
||||
protected $customerAddressRepository;
|
||||
|
|
@ -59,7 +60,9 @@ class AddressController extends Controller
|
|||
*/
|
||||
public function create()
|
||||
{
|
||||
return view($this->_config['view']);
|
||||
return view($this->_config['view'], [
|
||||
'defaultCountry' => config('app.default_country'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -75,11 +78,11 @@ class AddressController extends Controller
|
|||
|
||||
$this->validate(request(), [
|
||||
'address1' => 'string|required',
|
||||
'country' => 'string|required',
|
||||
'state' => 'string|required',
|
||||
'city' => 'string|required',
|
||||
'country' => 'string|required',
|
||||
'state' => 'string|required',
|
||||
'city' => 'string|required',
|
||||
'postcode' => 'required',
|
||||
'phone' => 'required'
|
||||
'phone' => 'required',
|
||||
]);
|
||||
|
||||
$cust_id['customer_id'] = $this->customer->id;
|
||||
|
|
@ -108,14 +111,18 @@ class AddressController extends Controller
|
|||
public function edit($id)
|
||||
{
|
||||
$address = $this->customerAddressRepository->findOneWhere([
|
||||
'id' => $id,
|
||||
'customer_id' => auth()->guard('customer')->user()->id
|
||||
'id' => $id,
|
||||
'customer_id' => auth()->guard('customer')->user()->id,
|
||||
]);
|
||||
|
||||
if (! $address)
|
||||
if (! $address) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
return view($this->_config['view'], compact('address'));
|
||||
return view($this->_config['view'], array_merge(
|
||||
compact('address'),
|
||||
['defaultCountry' => config('app.default_country')]
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -130,18 +137,18 @@ class AddressController extends Controller
|
|||
|
||||
$this->validate(request(), [
|
||||
'address1' => 'string|required',
|
||||
'country' => 'string|required',
|
||||
'state' => 'string|required',
|
||||
'city' => 'string|required',
|
||||
'country' => 'string|required',
|
||||
'state' => 'string|required',
|
||||
'city' => 'string|required',
|
||||
'postcode' => 'required',
|
||||
'phone' => 'required'
|
||||
'phone' => 'required',
|
||||
]);
|
||||
|
||||
$data = collect(request()->input())->except('_token')->toArray();
|
||||
|
||||
$addresses = $this->customer->addresses;
|
||||
|
||||
foreach($addresses as $address) {
|
||||
foreach ($addresses as $address) {
|
||||
if ($id == $address->id) {
|
||||
session()->flash('success', trans('shop::app.customer.account.address.edit.success'));
|
||||
|
||||
|
|
@ -157,7 +164,8 @@ 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
|
||||
* To change the default address or make the default address, by default when first address is
|
||||
* created will be the default address
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
|
|
@ -185,8 +193,8 @@ class AddressController extends Controller
|
|||
public function destroy($id)
|
||||
{
|
||||
$address = $this->customerAddressRepository->findOneWhere([
|
||||
'id' => $id,
|
||||
'customer_id' => auth()->guard('customer')->user()->id
|
||||
'id' => $id,
|
||||
'customer_id' => auth()->guard('customer')->user()->id,
|
||||
]);
|
||||
|
||||
if (! $address)
|
||||
|
|
|
|||
|
|
@ -98,11 +98,11 @@ class RegistrationController extends Controller
|
|||
$verificationData['token'] = md5(uniqid(rand(), true));
|
||||
$data['token'] = $verificationData['token'];
|
||||
|
||||
Event::fire('customer.registration.before');
|
||||
Event::dispatch('customer.registration.before');
|
||||
|
||||
$customer = $this->customerRepository->create($data);
|
||||
|
||||
Event::fire('customer.registration.after', $customer);
|
||||
Event::dispatch('customer.registration.after', $customer);
|
||||
|
||||
if ($customer) {
|
||||
if (core()->getConfigData('customer.settings.email.verification')) {
|
||||
|
|
|
|||
|
|
@ -57,27 +57,33 @@ class ResetPasswordController extends Controller
|
|||
*/
|
||||
public function store()
|
||||
{
|
||||
$this->validate(request(), [
|
||||
'token' => 'required',
|
||||
'email' => 'required|email',
|
||||
'password' => 'required|confirmed|min:6',
|
||||
]);
|
||||
|
||||
$response = $this->broker()->reset(
|
||||
request(['email', 'password', 'password_confirmation', 'token']), function ($customer, $password) {
|
||||
$this->resetPassword($customer, $password);
|
||||
}
|
||||
);
|
||||
|
||||
if ($response == Password::PASSWORD_RESET) {
|
||||
return redirect()->route($this->_config['redirect']);
|
||||
}
|
||||
|
||||
return back()
|
||||
->withInput(request(['email']))
|
||||
->withErrors([
|
||||
'email' => trans($response)
|
||||
try {
|
||||
$this->validate(request(), [
|
||||
'token' => 'required',
|
||||
'email' => 'required|email',
|
||||
'password' => 'required|confirmed|min:6',
|
||||
]);
|
||||
|
||||
$response = $this->broker()->reset(
|
||||
request(['email', 'password', 'password_confirmation', 'token']), function ($customer, $password) {
|
||||
$this->resetPassword($customer, $password);
|
||||
}
|
||||
);
|
||||
|
||||
if ($response == Password::PASSWORD_RESET) {
|
||||
return redirect()->route($this->_config['redirect']);
|
||||
}
|
||||
|
||||
return back()
|
||||
->withInput(request(['email']))
|
||||
->withErrors([
|
||||
'email' => trans($response)
|
||||
]);
|
||||
} catch(\Exception $e) {
|
||||
session()->flash('error', trans($e->getMessage()));
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ class SessionController extends Controller
|
|||
}
|
||||
|
||||
//Event passed to prepare cart after login
|
||||
Event::fire('customer.after.login', request('email'));
|
||||
Event::dispatch('customer.after.login', request('email'));
|
||||
|
||||
return redirect()->intended(route($this->_config['redirect']));
|
||||
}
|
||||
|
|
@ -100,7 +100,7 @@ class SessionController extends Controller
|
|||
{
|
||||
auth()->guard('customer')->logout();
|
||||
|
||||
Event::fire('customer.after.logout', $id);
|
||||
Event::dispatch('customer.after.logout', $id);
|
||||
|
||||
return redirect()->route($this->_config['redirect']);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,7 +110,11 @@ class WishlistController extends Controller
|
|||
return redirect()->back();
|
||||
}
|
||||
} else {
|
||||
session()->flash('warning', trans('customer::app.wishlist.already'));
|
||||
$this->wishlistRepository->findOneWhere([
|
||||
'product_id' => $data['product_id']
|
||||
])->delete();
|
||||
|
||||
session()->flash('success', trans('customer::app.wishlist.removed'));
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
|
@ -170,7 +174,7 @@ class WishlistController extends Controller
|
|||
} catch (\Exception $e) {
|
||||
session()->flash('warning', $e->getMessage());
|
||||
|
||||
return redirect()->route('shop.productOrCategory.index', ['slug' => $wishlistItem->product->url_key]);
|
||||
return redirect()->route('shop.productOrCategory.index', $wishlistItem->product->url_key);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ class RegistrationEmail extends Mailable
|
|||
public function build()
|
||||
{
|
||||
return $this->to($this->data['email'])
|
||||
->from(config('mail.from'))
|
||||
->subject(trans('shop::app.mail.customer.registration.customer-registration'))
|
||||
->view('shop::emails.customer.registration')->with('data', $this->data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ class VerificationEmail extends Mailable
|
|||
public function build()
|
||||
{
|
||||
return $this->to($this->verificationData['email'])
|
||||
->from(config('mail.from'))
|
||||
->subject(trans('shop::app.mail.customer.verification.subject'))
|
||||
->view('shop::emails.customer.verification-email')->with('data', ['email' => $this->verificationData['email'], 'token' => $this->verificationData['token']]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ class CustomerResetPassword extends ResetPassword
|
|||
}
|
||||
|
||||
return (new MailMessage)
|
||||
->from(config('mail.from'))
|
||||
->subject(__('shop::app.mail.forget-password.subject') )
|
||||
->view('shop::emails.customer.forget-password', [
|
||||
'user_name' => $notifiable->name,
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ class CustomerAddressRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
Event::fire('customer.addresses.create.before');
|
||||
Event::dispatch('customer.addresses.create.before');
|
||||
|
||||
if ( isset($data['default_address']) ) {
|
||||
$data['default_address'] = 1;
|
||||
|
|
@ -47,7 +47,7 @@ class CustomerAddressRepository extends Repository
|
|||
|
||||
$address = $this->model->create($data);
|
||||
|
||||
Event::fire('customer.addresses.create.after', $address);
|
||||
Event::dispatch('customer.addresses.create.after', $address);
|
||||
|
||||
return $address;
|
||||
}
|
||||
|
|
@ -61,7 +61,7 @@ class CustomerAddressRepository extends Repository
|
|||
{
|
||||
$address = $this->find($id);
|
||||
|
||||
Event::fire('customer.addresses.update.before', $id);
|
||||
Event::dispatch('customer.addresses.update.before', $id);
|
||||
|
||||
if (isset($data['default_address']) ) {
|
||||
$data['default_address'] = 1;
|
||||
|
|
@ -80,8 +80,8 @@ class CustomerAddressRepository extends Repository
|
|||
$address->update($data);
|
||||
}
|
||||
|
||||
Event::fire('customer.addresses.update.after', $id);
|
||||
Event::dispatch('customer.addresses.update.after', $id);
|
||||
|
||||
return $address;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Inventory\Models\InventorySource;
|
||||
|
||||
$factory->define(InventorySource::class, function (Faker $faker) {
|
||||
$now = date("Y-m-d H:i:s");
|
||||
$code = $faker->unique()->word;
|
||||
return [
|
||||
'code' => $faker->unique()->word,
|
||||
'name' => $code,
|
||||
'description' => $faker->sentence,
|
||||
'contact_name' => $faker->name,
|
||||
'contact_email' => $faker->safeEmail,
|
||||
'contact_number' => $faker->phoneNumber,
|
||||
'country' => $faker->countryCode,
|
||||
'state' => $faker->state,
|
||||
'city' => $faker->city,
|
||||
'street' => $faker->streetAddress,
|
||||
'postcode' => $faker->postcode,
|
||||
'priority' => 0,
|
||||
'status' => 1,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
];
|
||||
});
|
||||
|
|
@ -84,11 +84,11 @@ class InventorySourceController extends Controller
|
|||
|
||||
$data['status'] = !isset($data['status']) ? 0 : 1;
|
||||
|
||||
Event::fire('inventory.inventory_source.create.before');
|
||||
Event::dispatch('inventory.inventory_source.create.before');
|
||||
|
||||
$inventorySource = $this->inventorySourceRepository->create($data);
|
||||
|
||||
Event::fire('inventory.inventory_source.create.after', $inventorySource);
|
||||
Event::dispatch('inventory.inventory_source.create.after', $inventorySource);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.inventory_sources.create-success'));
|
||||
|
||||
|
|
@ -133,11 +133,11 @@ class InventorySourceController extends Controller
|
|||
|
||||
$data['status'] = !isset($data['status']) ? 0 : 1;
|
||||
|
||||
Event::fire('inventory.inventory_source.update.before', $id);
|
||||
Event::dispatch('inventory.inventory_source.update.before', $id);
|
||||
|
||||
$inventorySource = $this->inventorySourceRepository->update($data, $id);
|
||||
|
||||
Event::fire('inventory.inventory_source.update.after', $inventorySource);
|
||||
Event::dispatch('inventory.inventory_source.update.after', $inventorySource);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.inventory_sources.update-success'));
|
||||
|
||||
|
|
@ -158,11 +158,11 @@ class InventorySourceController extends Controller
|
|||
session()->flash('error', trans('admin::app.settings.inventory_sources.last-delete-error'));
|
||||
} else {
|
||||
try {
|
||||
Event::fire('inventory.inventory_source.delete.before', $id);
|
||||
Event::dispatch('inventory.inventory_source.delete.before', $id);
|
||||
|
||||
$this->inventorySourceRepository->delete($id);
|
||||
|
||||
Event::fire('inventory.inventory_source.delete.after', $id);
|
||||
Event::dispatch('inventory.inventory_source.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.settings.inventory_sources.delete-success'));
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,261 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Product\Models\Product;
|
||||
use Webkul\Product\Models\ProductAttributeValue;
|
||||
use Webkul\Attribute\Models\AttributeOption;
|
||||
|
||||
$factory->defineAs(ProductAttributeValue::class, 'sku', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'text_value' => $faker->uuid,
|
||||
'attribute_id' => 1,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'name', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'locale' => 'en', //$faker->languageCode,
|
||||
'channel' => 'default',
|
||||
'text_value' => $faker->words(2, true),
|
||||
'attribute_id' => 2,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'url_key', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'text_value' => $faker->unique()->slug,
|
||||
'attribute_id' => 3,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'tax_category_id', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'channel' => 'default',
|
||||
'integer_value' => null, // ToDo
|
||||
'attribute_id' => 4,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'new', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'boolean_value' => 1,
|
||||
'attribute_id' => 5,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'featured', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'boolean_value' => 1,
|
||||
'attribute_id' => 6,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'visible_individually', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'boolean_value' => 1,
|
||||
'attribute_id' => 7,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'status', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'boolean_value' => 1,
|
||||
'attribute_id' => 8,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'short_description', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'locale' => 'en', //$faker->languageCode,
|
||||
'channel' => 'default',
|
||||
'text_value' => $faker->sentence,
|
||||
'attribute_id' => 9,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'description', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'locale' => 'en', //$faker->languageCode,
|
||||
'channel' => 'default',
|
||||
'text_value' => $faker->sentences(3, true),
|
||||
'attribute_id' => 10,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'price', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'float_value' => $faker->randomFloat(4, 0, 1000),
|
||||
'attribute_id' => 11,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'cost', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'channel' => 'default',
|
||||
'float_value' => $faker->randomFloat(4, 0, 10),
|
||||
'attribute_id' => 12,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'special_price', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'float_value' => $faker->randomFloat(4, 0, 100),
|
||||
'attribute_id' => 13,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'special_price_from', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'channel' => 'default',
|
||||
'date_value' => $faker->dateTimeBetween('-5 days', 'now', 'Europe/Berlin'),
|
||||
'attribute_id' => 14,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'special_price_to', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'channel' => 'default',
|
||||
'date_value' => $faker->dateTimeBetween('now', '+ 5 days', 'Europe/Berlin'),
|
||||
'attribute_id' => 15,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'meta_title', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'locale' => 'en', //$faker->languageCode,
|
||||
'channel' => 'default',
|
||||
'text_value' => $faker->words(2, true),
|
||||
'attribute_id' => 16,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'meta_keywords', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'locale' => 'en', //$faker->languageCode,
|
||||
'channel' => 'default',
|
||||
'text_value' => $faker->words(5, true),
|
||||
'attribute_id' => 17,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'meta_description', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'locale' => 'en', //$faker->languageCode,
|
||||
'channel' => 'default',
|
||||
'text_value' => $faker->sentence,
|
||||
'attribute_id' => 18,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'width', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'integer_value' => $faker->numberBetween(1, 50),
|
||||
'attribute_id' => 19,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'height', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'integer_value' => $faker->numberBetween(1, 50),
|
||||
'attribute_id' => 20,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'depth', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'integer_value' => $faker->numberBetween(1, 50),
|
||||
'attribute_id' => 21,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'weight', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'integer_value' => $faker->numberBetween(1, 50),
|
||||
'attribute_id' => 22,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'color', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'integer_value' => $faker->numberBetween(1, 5),
|
||||
'attribute_id' => 23,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'size', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'integer_value' => $faker->numberBetween(1, 5),
|
||||
'attribute_id' => 24,
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'brand', function (Faker $faker) {
|
||||
return [
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'attribute_id' => 25,
|
||||
'integer_value' => function () {
|
||||
return factory(AttributeOption::class)->create()->id;
|
||||
},
|
||||
];
|
||||
});
|
||||
$factory->defineAs(ProductAttributeValue::class, 'guest_checkout', function ( Faker $faker) {
|
||||
return [
|
||||
'product_id' => function() {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'boolean_value' => 1,
|
||||
'attribute_id' => 26,
|
||||
];
|
||||
});
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Product\Models\Product;
|
||||
use Webkul\Product\Models\ProductDownloadableLink;
|
||||
|
||||
$factory->define(ProductDownloadableLink::class, function (Faker $faker) {
|
||||
$now = date("Y-m-d H:i:s");
|
||||
$filename = 'ProductImageExampleForUpload.jpg';
|
||||
$filepath = '/tests/_data/';
|
||||
return [
|
||||
'url' => '',
|
||||
'file' => $filepath . $filename,
|
||||
'file_name' => $filename,
|
||||
'type' => 'file',
|
||||
'price' => 0.0000,
|
||||
'downloads' => $faker->randomNumber(1),
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
];
|
||||
});
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Product\Models\ProductDownloadableLink;
|
||||
use Webkul\Product\Models\ProductDownloadableLinkTranslation;
|
||||
|
||||
$factory->define(ProductDownloadableLinkTranslation::class, function (Faker $faker) {
|
||||
return [
|
||||
'locale' => 'en',
|
||||
'title' => $faker->word,
|
||||
'product_downloadable_link_id' => function () {
|
||||
return factory(ProductDownloadableLink::class)->create()->id;
|
||||
},
|
||||
];
|
||||
});
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Product\Models\Product;
|
||||
|
||||
$factory->define(Product::class, function (Faker $faker) {
|
||||
$now = date("Y-m-d H:i:s");
|
||||
return [
|
||||
'sku' => $faker->uuid,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
'attribute_family_id' => 1,
|
||||
];
|
||||
});
|
||||
|
||||
$factory->state(Product::class, 'simple', [
|
||||
'type' => 'simple',
|
||||
]);
|
||||
|
||||
$factory->state(Product::class, 'virtual', [
|
||||
'type' => 'virtual',
|
||||
]);
|
||||
|
||||
$factory->state(Product::class, 'downloadable', [
|
||||
'type' => 'downloadable',
|
||||
]);
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Factory $factory */
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
use Webkul\Inventory\Models\InventorySource;
|
||||
use Webkul\Product\Models\Product;
|
||||
use Webkul\Product\Models\ProductInventory;
|
||||
|
||||
$factory->define(ProductInventory::class, function (Faker $faker) {
|
||||
return [
|
||||
'qty' => $faker->numberBetween(1, 20),
|
||||
'product_id' => function () {
|
||||
return factory(Product::class)->create()->id;
|
||||
},
|
||||
'inventory_source_id' => function () {
|
||||
return factory(InventorySource::class)->create()->id;
|
||||
},
|
||||
];
|
||||
});
|
||||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Helpers;
|
|||
|
||||
use Webkul\Product\Repositories\ProductRepository as Product;
|
||||
use Webkul\Attribute\Repositories\AttributeFamilyRepository as AttributeFamily;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class GenerateProduct
|
||||
{
|
||||
|
|
@ -41,7 +42,7 @@ class GenerateProduct
|
|||
'code' => 'default'
|
||||
]);
|
||||
|
||||
$sku = str_random(10);
|
||||
$sku = Str::random(10);
|
||||
$data['sku'] = strtolower($sku);
|
||||
$data['attribute_family_id'] = $attributeFamily->first()->id;
|
||||
$data['type'] = 'simple';
|
||||
|
|
@ -51,23 +52,22 @@ class GenerateProduct
|
|||
unset($data);
|
||||
|
||||
$faker = \Faker\Factory::create();
|
||||
|
||||
$date = date('Y-m-d');
|
||||
$date = \Carbon\Carbon::parse($date);
|
||||
$specialFrom = $date->toDateString();
|
||||
$specialTo = $date->addDays(7)->toDateString();
|
||||
|
||||
foreach ($attributes as $attribute) {
|
||||
if ($attribute->type == 'text') {
|
||||
if ($attribute->code == 'width' || $attribute->code == 'height' || $attribute->code == 'depth' || $attribute->code == 'weight') {
|
||||
foreach ($attributes as $attribute) {
|
||||
if ($attribute->type == 'text') {
|
||||
if ($attribute->code == 'width' || $attribute->code == 'height' || $attribute->code == 'depth' || $attribute->code == 'weight') {
|
||||
$data[$attribute->code] = $faker->randomNumber(3);
|
||||
} else if ($attribute->code == 'url_key') {
|
||||
} else if ($attribute->code == 'url_key') {
|
||||
$data[$attribute->code] = strtolower($sku);
|
||||
} else if ($attribute->code != 'sku') {
|
||||
$data[$attribute->code] = $faker->name;
|
||||
} else {
|
||||
$data[$attribute->code] = $sku;
|
||||
}
|
||||
$data[$attribute->code] = $sku;
|
||||
}
|
||||
} else if ($attribute->type == 'textarea') {
|
||||
$data[$attribute->code] = $faker->text;
|
||||
|
||||
|
|
@ -99,7 +99,7 @@ class GenerateProduct
|
|||
} else {
|
||||
$data[$attribute->code] = "";
|
||||
}
|
||||
} else if ($attribute->type == 'multiselect') {
|
||||
} else if ($attribute->type == 'multiselect') {
|
||||
if ($options->count()) {
|
||||
$option = $options->first()->id;
|
||||
|
||||
|
|
@ -152,7 +152,7 @@ class GenerateProduct
|
|||
];
|
||||
|
||||
$updated = $this->product->update($data, $product->id);
|
||||
|
||||
|
||||
return $updated;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ class ProductController extends Controller
|
|||
*/
|
||||
public function sync()
|
||||
{
|
||||
Event::fire('products.datagrid.sync', true);
|
||||
Event::dispatch('products.datagrid.sync', true);
|
||||
|
||||
return redirect()->route('admin.catalog.products.index');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ class ReviewController extends Controller
|
|||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
|
|
@ -56,7 +56,7 @@ class ReviewController extends Controller
|
|||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\View\View
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
|
|
@ -73,11 +73,11 @@ class ReviewController extends Controller
|
|||
*/
|
||||
public function update($id)
|
||||
{
|
||||
Event::fire('customer.review.update.before', $id);
|
||||
Event::dispatch('customer.review.update.before', $id);
|
||||
|
||||
$this->productReviewRepository->update(request()->all(), $id);
|
||||
|
||||
Event::fire('customer.review.update.after', $id);
|
||||
Event::dispatch('customer.review.update.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.update-success', ['name' => 'Review']));
|
||||
|
||||
|
|
@ -95,11 +95,11 @@ class ReviewController extends Controller
|
|||
$productReview = $this->productReviewRepository->findOrFail($id);
|
||||
|
||||
try {
|
||||
Event::fire('customer.review.delete.before', $id);
|
||||
Event::dispatch('customer.review.delete.before', $id);
|
||||
|
||||
$this->productReviewRepository->delete($id);
|
||||
|
||||
Event::fire('customer.review.delete.after', $id);
|
||||
Event::dispatch('customer.review.delete.after', $id);
|
||||
|
||||
session()->flash('success', trans('admin::app.response.delete-success', ['name' => 'Review']));
|
||||
|
||||
|
|
@ -127,11 +127,11 @@ class ReviewController extends Controller
|
|||
|
||||
foreach ($indexes as $key => $value) {
|
||||
try {
|
||||
Event::fire('customer.review.delete.before', $value);
|
||||
Event::dispatch('customer.review.delete.before', $value);
|
||||
|
||||
$this->productReviewRepository->delete($value);
|
||||
|
||||
Event::fire('customer.review.delete.after', $value);
|
||||
Event::dispatch('customer.review.delete.after', $value);
|
||||
} catch(\Exception $e) {
|
||||
$suppressFlash = true;
|
||||
|
||||
|
|
@ -173,11 +173,11 @@ class ReviewController extends Controller
|
|||
try {
|
||||
if ($data['massaction-type'] == 'update') {
|
||||
if ($data['update-options'] == 1) {
|
||||
Event::fire('customer.review.update.before', $value);
|
||||
Event::dispatch('customer.review.update.before', $value);
|
||||
|
||||
$review->update(['status' => 'approved']);
|
||||
|
||||
Event::fire('customer.review.update.after', $review);
|
||||
Event::dispatch('customer.review.update.after', $review);
|
||||
} else if ($data['update-options'] == 0) {
|
||||
$review->update(['status' => 'pending']);
|
||||
} else if ($data['update-options'] == 2) {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace Webkul\Product\Providers;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factory as EloquentFactory;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Webkul\Product\Models\ProductProxy;
|
||||
use Webkul\Product\Observers\ProductObserver;
|
||||
|
|
@ -32,14 +33,21 @@ class ProductServiceProvider extends ServiceProvider
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
public function register(): void
|
||||
{
|
||||
$this->registerConfig();
|
||||
|
||||
$this->registerCommands();
|
||||
|
||||
$this->registerEloquentFactoriesFrom(__DIR__ . '/../Database/Factories');
|
||||
}
|
||||
|
||||
public function registerConfig() {
|
||||
/**
|
||||
* Register Configuration
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function registerConfig(): void {
|
||||
$this->mergeConfigFrom(
|
||||
dirname(__DIR__) . '/Config/product_types.php', 'product_types'
|
||||
);
|
||||
|
|
@ -47,10 +55,24 @@ class ProductServiceProvider extends ServiceProvider
|
|||
|
||||
/**
|
||||
* Register the console commands of this package
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function registerCommands()
|
||||
protected function registerCommands(): void
|
||||
{
|
||||
if ($this->app->runningInConsole())
|
||||
if ($this->app->runningInConsole()) {
|
||||
$this->commands([PriceUpdate::class,]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register factories.
|
||||
*
|
||||
* @param string $path
|
||||
* @return void
|
||||
*/
|
||||
protected function registerEloquentFactoriesFrom($path): void
|
||||
{
|
||||
$this->app->make(EloquentFactory::class)->load($path);
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
namespace Webkul\Product\Repositories;
|
||||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* ProductBundleOptionProduct Repository
|
||||
|
|
@ -28,9 +29,9 @@ class ProductBundleOptionProductRepository extends Repository
|
|||
|
||||
if (isset($data['products'])) {
|
||||
$this->setIsDefaultFlag($data);
|
||||
|
||||
|
||||
foreach ($data['products'] as $bundleOptionProductId => $bundleOptionProductInputs) {
|
||||
if (str_contains($bundleOptionProductId, 'product_')) {
|
||||
if (Str::contains($bundleOptionProductId, 'product_')) {
|
||||
$this->create(array_merge([
|
||||
'product_bundle_option_id' => $productBundleOption->id,
|
||||
], $bundleOptionProductInputs));
|
||||
|
|
@ -56,14 +57,14 @@ class ProductBundleOptionProductRepository extends Repository
|
|||
{
|
||||
if (! count($data['products']))
|
||||
return;
|
||||
|
||||
|
||||
$haveIsDefaulFlag = false;
|
||||
|
||||
foreach ($data['products'] as $key => $product) {
|
||||
if (isset($product['is_default']) && $product['is_default']) {
|
||||
$haveIsDefaulFlag = true;
|
||||
} else {
|
||||
$data['products'][$key]['is_default'] = 0;
|
||||
$data['products'][$key]['is_default'] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Repositories;
|
|||
|
||||
use Illuminate\Container\Container as App;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* ProductBundleOption Repository
|
||||
|
|
@ -52,7 +53,7 @@ class ProductBundleOptionRepository extends Repository
|
|||
|
||||
if (isset($data['bundle_options'])) {
|
||||
foreach ($data['bundle_options'] as $bundleOptionId => $bundleOptionInputs) {
|
||||
if (str_contains($bundleOptionId, 'option_')) {
|
||||
if (Str::contains($bundleOptionId, 'option_')) {
|
||||
$productBundleOption = $this->create(array_merge([
|
||||
'product_id' => $product->id,
|
||||
], $bundleOptionInputs));
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Repositories;
|
|||
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Product Downloadable Link Reposotory
|
||||
|
|
@ -54,7 +55,7 @@ class ProductDownloadableLinkRepository extends Repository
|
|||
|
||||
if (isset($data['downloadable_links'])) {
|
||||
foreach ($data['downloadable_links'] as $linkId => $data) {
|
||||
if (str_contains($linkId, 'link_')) {
|
||||
if (Str::contains($linkId, 'link_')) {
|
||||
$this->create(array_merge([
|
||||
'product_id' => $product->id,
|
||||
], $data));
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Repositories;
|
|||
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Product Downloadable Sample Reposotory
|
||||
|
|
@ -52,7 +53,7 @@ class ProductDownloadableSampleRepository extends Repository
|
|||
|
||||
if (isset($data['downloadable_samples'])) {
|
||||
foreach ($data['downloadable_samples'] as $sampleId => $data) {
|
||||
if (str_contains($sampleId, 'sample_')) {
|
||||
if (Str::contains($sampleId, 'sample_')) {
|
||||
$this->create(array_merge([
|
||||
'product_id' => $product->id,
|
||||
], $data));
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Repositories;
|
|||
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Webkul\Product\Repositories\ProductRepository;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Product Grouped Product Repository
|
||||
|
|
@ -29,7 +30,7 @@ class ProductGroupedProductRepository extends Repository
|
|||
|
||||
if (isset($data['links'])) {
|
||||
foreach ($data['links'] as $linkId => $linkInputs) {
|
||||
if (str_contains($linkId, 'link_')) {
|
||||
if (Str::contains($linkId, 'link_')) {
|
||||
$this->create(array_merge([
|
||||
'product_id' => $product->id,
|
||||
], $linkInputs));
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Repositories;
|
|||
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Product Image Reposotory
|
||||
|
|
@ -37,7 +38,7 @@ class ProductImageRepository extends Repository
|
|||
$file = 'images.' . $imageId;
|
||||
$dir = 'product/' . $product->id;
|
||||
|
||||
if (str_contains($imageId, 'image_')) {
|
||||
if (Str::contains($imageId, 'image_')) {
|
||||
if (request()->hasFile($file)) {
|
||||
$this->create([
|
||||
'path' => request()->file($file)->store($dir),
|
||||
|
|
|
|||
|
|
@ -58,13 +58,13 @@ class ProductRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
Event::fire('catalog.product.create.before');
|
||||
Event::dispatch('catalog.product.create.before');
|
||||
|
||||
$typeInstance = app(config('product_types.' . $data['type'] . '.class'));
|
||||
|
||||
$product = $typeInstance->create($data);
|
||||
|
||||
Event::fire('catalog.product.create.after', $product);
|
||||
Event::dispatch('catalog.product.create.after', $product);
|
||||
|
||||
return $product;
|
||||
}
|
||||
|
|
@ -77,7 +77,7 @@ class ProductRepository extends Repository
|
|||
*/
|
||||
public function update(array $data, $id, $attribute = "id")
|
||||
{
|
||||
Event::fire('catalog.product.update.before', $id);
|
||||
Event::dispatch('catalog.product.update.before', $id);
|
||||
|
||||
$product = $this->find($id);
|
||||
|
||||
|
|
@ -86,7 +86,7 @@ class ProductRepository extends Repository
|
|||
if (isset($data['channels']))
|
||||
$product['channels'] = $data['channels'];
|
||||
|
||||
Event::fire('catalog.product.update.after', $product);
|
||||
Event::dispatch('catalog.product.update.after', $product);
|
||||
|
||||
return $product;
|
||||
}
|
||||
|
|
@ -97,11 +97,11 @@ class ProductRepository extends Repository
|
|||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
Event::fire('catalog.product.delete.before', $id);
|
||||
Event::dispatch('catalog.product.delete.before', $id);
|
||||
|
||||
parent::delete($id);
|
||||
|
||||
Event::fire('catalog.product.delete.after', $id);
|
||||
Event::dispatch('catalog.product.delete.after', $id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ class Bundle extends AbstractType
|
|||
}
|
||||
|
||||
if (! $haveRequiredOptions)
|
||||
$minPrice = min($minPrices);
|
||||
$minPrice = count($minPrices) ? min($minPrices) : 0;
|
||||
|
||||
return $minPrice;
|
||||
}
|
||||
|
|
@ -405,7 +405,9 @@ class Bundle extends AbstractType
|
|||
*/
|
||||
public function prepareForCart($data)
|
||||
{
|
||||
$data['bundle_options'] = array_filter($this->validateBundleOptionForCart($data['bundle_options']));
|
||||
|
||||
if (isset($data['bundle_options']))
|
||||
$data['bundle_options'] = array_filter($this->validateBundleOptionForCart($data['bundle_options']));
|
||||
|
||||
if (! isset($data['bundle_options']) || ! count($data['bundle_options']))
|
||||
return trans('shop::app.checkout.cart.integrity.missing_options');
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Webkul\Product\Type;
|
|||
|
||||
use Webkul\Product\Models\ProductAttributeValue;
|
||||
use Webkul\Product\Models\ProductFlat;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Class Configurable.
|
||||
|
|
@ -96,7 +97,7 @@ class Configurable extends AbstractType
|
|||
|
||||
if (isset($data['variants'])) {
|
||||
foreach ($data['variants'] as $variantId => $variantData) {
|
||||
if (str_contains($variantId, 'variant_')) {
|
||||
if (Str::contains($variantId, 'variant_')) {
|
||||
$permutation = [];
|
||||
|
||||
foreach ($product->super_attributes as $superAttribute) {
|
||||
|
|
|
|||
|
|
@ -22,14 +22,14 @@ class Downloadable extends AbstractType
|
|||
{
|
||||
/**
|
||||
* ProductDownloadableLinkRepository instance
|
||||
*
|
||||
*
|
||||
* @var ProductDownloadableLinkRepository
|
||||
*/
|
||||
protected $productDownloadableLinkRepository;
|
||||
|
||||
/**
|
||||
* ProductDownloadableSampleRepository instance
|
||||
*
|
||||
*
|
||||
* @var ProductDownloadableSampleRepository
|
||||
*/
|
||||
protected $productDownloadableSampleRepository;
|
||||
|
|
@ -39,11 +39,11 @@ class Downloadable extends AbstractType
|
|||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $skipAttributes = ['width', 'height', 'depth', 'weight'];
|
||||
protected $skipAttributes = ['width', 'height', 'depth', 'weight', 'guest_checkout'];
|
||||
|
||||
/**
|
||||
* These blade files will be included in product edit page
|
||||
*
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $additionalViews = [
|
||||
|
|
@ -111,7 +111,7 @@ class Downloadable extends AbstractType
|
|||
|
||||
if (request()->route()->getName() != 'admin.catalog.products.massupdate') {
|
||||
$this->productDownloadableLinkRepository->saveLinks($data, $product);
|
||||
|
||||
|
||||
$this->productDownloadableSampleRepository->saveSamples($data, $product);
|
||||
}
|
||||
|
||||
|
|
@ -127,11 +127,11 @@ class Downloadable extends AbstractType
|
|||
{
|
||||
if (! $this->product->status)
|
||||
return false;
|
||||
|
||||
|
||||
if ($this->product->downloadable_links()->count())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -177,7 +177,7 @@ class Downloadable extends AbstractType
|
|||
|
||||
return $products;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param array $options1
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue