From 2c9b131fd3e5cfced8efc01d63807fc69b8fd7b7 Mon Sep 17 00:00:00 2001 From: rahulshukla-home Date: Thu, 19 Nov 2020 15:23:51 +0530 Subject: [PATCH] Enhancement #4250 done for default theme --- .../Admin/src/Resources/lang/ar/app.php | 8 +- .../Admin/src/Resources/lang/de/app.php | 6 + .../Admin/src/Resources/lang/en/app.php | 6 + .../Admin/src/Resources/lang/es/app.php | 8 +- .../Admin/src/Resources/lang/fa/app.php | 8 +- .../Admin/src/Resources/lang/it/app.php | 8 +- .../Admin/src/Resources/lang/nl/app.php | 6 + .../Admin/src/Resources/lang/pl/app.php | 8 +- .../Admin/src/Resources/lang/pt_BR/app.php | 8 +- .../Admin/src/Resources/lang/tr/app.php | 8 +- .../products/accordians/images.blade.php | 4 +- .../products/accordians/videos.blade.php | 198 ++++++++++++++++++ .../Product/src/Contracts/ProductVideo.php | 7 + ..._19_112228_create_product_videos_table.php | 34 +++ .../Product/src/Helpers/ProductVideo.php | 36 ++++ .../Webkul/Product/src/Models/Product.php | 8 + .../Webkul/Product/src/Models/ProductFlat.php | 8 + .../Product/src/Models/ProductVideo.php | 64 ++++++ .../Product/src/Models/ProductVideoProxy.php | 10 + .../src/Providers/ModuleServiceProvider.php | 1 + .../Repositories/ProductVideoRepository.php | 60 ++++++ .../Webkul/Product/src/Type/AbstractType.php | 16 +- packages/Webkul/Product/src/Type/Simple.php | 1 + .../views/products/view/gallery.blade.php | 44 +++- 24 files changed, 548 insertions(+), 17 deletions(-) create mode 100644 packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/videos.blade.php create mode 100644 packages/Webkul/Product/src/Contracts/ProductVideo.php create mode 100644 packages/Webkul/Product/src/Database/Migrations/2020_11_19_112228_create_product_videos_table.php create mode 100644 packages/Webkul/Product/src/Helpers/ProductVideo.php create mode 100644 packages/Webkul/Product/src/Models/ProductVideo.php create mode 100644 packages/Webkul/Product/src/Models/ProductVideoProxy.php create mode 100644 packages/Webkul/Product/src/Repositories/ProductVideoRepository.php diff --git a/packages/Webkul/Admin/src/Resources/lang/ar/app.php b/packages/Webkul/Admin/src/Resources/lang/ar/app.php index 46bd1a47a..5d7d294f8 100644 --- a/packages/Webkul/Admin/src/Resources/lang/ar/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/ar/app.php @@ -529,7 +529,13 @@ return [ 'checkbox' => 'خانة اختيار', 'multiselect' => 'تحديد متعدد', 'new-option' => 'خيار جديد', - 'is-default' => 'افتراضي' + 'is-default' => 'افتراضي', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/de/app.php b/packages/Webkul/Admin/src/Resources/lang/de/app.php index 2d9ae4349..966514549 100755 --- a/packages/Webkul/Admin/src/Resources/lang/de/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/de/app.php @@ -521,6 +521,12 @@ return [ 'multiselect' => 'Multiselect', 'new-option' => 'Neue Option', 'is-default' => 'Ist Standard', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index ed01931e0..0739c20ed 100755 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -533,6 +533,12 @@ return [ 'all-group' => 'All Groups', 'fixed' => 'Fixed', 'discount' => 'Discount', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/es/app.php b/packages/Webkul/Admin/src/Resources/lang/es/app.php index be4dd6c32..5e9b7de69 100644 --- a/packages/Webkul/Admin/src/Resources/lang/es/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/es/app.php @@ -522,7 +522,13 @@ return [ 'checkbox' => 'Opción múltiple', 'multiselect' => 'Lista de selección múltiple', 'new-option' => 'Nueva opción', - 'is-default' => 'Es predeterminada' + 'is-default' => 'Es predeterminada', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/fa/app.php b/packages/Webkul/Admin/src/Resources/lang/fa/app.php index 7a866f521..599392798 100644 --- a/packages/Webkul/Admin/src/Resources/lang/fa/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/fa/app.php @@ -527,7 +527,13 @@ return [ 'checkbox' => 'Checkbox', 'multiselect' => 'Multiselect', 'new-option' => 'New Option', - 'is-default' => 'Is Default' + 'is-default' => 'Is Default', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/it/app.php b/packages/Webkul/Admin/src/Resources/lang/it/app.php index 8f46592ab..24dc6f6f5 100644 --- a/packages/Webkul/Admin/src/Resources/lang/it/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/it/app.php @@ -530,7 +530,13 @@ return [ 'multiselect' => 'Multiselect', 'new-option' => 'Nuova Opzione', 'is-default' => 'È Predefinita', - 'actions' => 'Azioni' + 'actions' => 'Azioni', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/nl/app.php b/packages/Webkul/Admin/src/Resources/lang/nl/app.php index 410cd401a..e489a7fe5 100644 --- a/packages/Webkul/Admin/src/Resources/lang/nl/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/nl/app.php @@ -529,6 +529,12 @@ return [ 'multiselect' => 'Multiselect', 'new-option' => 'Nieuwe optie', 'is-default' => 'is standaard', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/pl/app.php b/packages/Webkul/Admin/src/Resources/lang/pl/app.php index 5d49b77a6..ffdc5680f 100644 --- a/packages/Webkul/Admin/src/Resources/lang/pl/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pl/app.php @@ -528,7 +528,13 @@ return [ 'checkbox' => 'Pole wyboru', 'multiselect' => 'Wielokrotny wybór', 'new-option' => 'Nowa opcja', - 'is-default' => 'Jest domyślny' + 'is-default' => 'Jest domyślny', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php index e7e7ea857..aaca46779 100755 --- a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php @@ -527,7 +527,13 @@ return [ 'checkbox' => 'Checkbox', 'multiselect' => 'Multiselect', 'new-option' => 'New Option', - 'is-default' => 'Is Default' + 'is-default' => 'Is Default', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/lang/tr/app.php b/packages/Webkul/Admin/src/Resources/lang/tr/app.php index f33256575..145cf9797 100644 --- a/packages/Webkul/Admin/src/Resources/lang/tr/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/tr/app.php @@ -523,7 +523,13 @@ return [ 'checkbox' => 'Onay Kutusu', 'multiselect' => 'Çoklu Seçim', 'new-option' => 'Yeni Seçenek', - 'is-default' => 'Varsayılan' + 'is-default' => 'Varsayılan', + 'remove-image-btn-title' => 'Remove Image', + 'videos' => 'Videos', + 'video' => 'Video', + 'add-video-btn-title' => 'Add Video', + 'remove-video-btn-title' => 'Remove Video', + 'not-support-video' => 'Your browser does not support the video tag.', ], 'attributes' => [ diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/images.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/images.blade.php index 7ace7eb1f..e7c721b47 100755 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/images.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/images.blade.php @@ -54,7 +54,9 @@ - + diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/videos.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/videos.blade.php new file mode 100644 index 000000000..08733908e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/videos.blade.php @@ -0,0 +1,198 @@ +{!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.videos.before', ['product' => $product]) !!} + + +
+ + {!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.videos.controls.before', ['product' => $product]) !!} + +
+ + + + + + @php $count=1 @endphp + @foreach ($errors->get('videos.*') as $key => $message) + @php echo str_replace($key, 'Video'.$count, $message[0]); $count++ @endphp + @endforeach + +
+ + {!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.videos.controls.after', ['product' => $product]) !!} + +
+
+ +{!! view_render_event('bagisto.admin.catalog.product.edit_form_accordian.videos.after', ['product' => $product]) !!} + +@push('scripts') + @parent + + + + + + + +@endpush \ No newline at end of file diff --git a/packages/Webkul/Product/src/Contracts/ProductVideo.php b/packages/Webkul/Product/src/Contracts/ProductVideo.php new file mode 100644 index 000000000..ac5ec3c76 --- /dev/null +++ b/packages/Webkul/Product/src/Contracts/ProductVideo.php @@ -0,0 +1,7 @@ +increments('id'); + $table->string('type')->nullable(); + $table->string('path'); + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_videos'); + } +} diff --git a/packages/Webkul/Product/src/Helpers/ProductVideo.php b/packages/Webkul/Product/src/Helpers/ProductVideo.php new file mode 100644 index 000000000..efab2e216 --- /dev/null +++ b/packages/Webkul/Product/src/Helpers/ProductVideo.php @@ -0,0 +1,36 @@ +videos as $video) { + if (! Storage::has($video->path)) { + continue; + } + + $videos[] = [ + 'type' => $video->type, + 'video_url' => Storage::url($video->path), + ]; + } + + return $videos; + } +} \ No newline at end of file diff --git a/packages/Webkul/Product/src/Models/Product.php b/packages/Webkul/Product/src/Models/Product.php index d21468362..269ebb6b2 100755 --- a/packages/Webkul/Product/src/Models/Product.php +++ b/packages/Webkul/Product/src/Models/Product.php @@ -143,6 +143,14 @@ class Product extends Model implements ProductContract return $this->hasMany(ProductImageProxy::modelClass(), 'product_id'); } + /** + * The videos that belong to the product. + */ + public function videos() + { + return $this->hasMany(ProductVideoProxy::modelClass(), 'product_id'); + } + /** * The images that belong to the product. */ diff --git a/packages/Webkul/Product/src/Models/ProductFlat.php b/packages/Webkul/Product/src/Models/ProductFlat.php index d2fb715aa..92a199407 100644 --- a/packages/Webkul/Product/src/Models/ProductFlat.php +++ b/packages/Webkul/Product/src/Models/ProductFlat.php @@ -126,6 +126,14 @@ class ProductFlat extends Model implements ProductFlatContract ->select('product_images.*'); } + /** + * The videos that belong to the product. + */ + public function videos() + { + return $this->product->videos(); + } + /** * Get all of the attributes for the attribute groups. */ diff --git a/packages/Webkul/Product/src/Models/ProductVideo.php b/packages/Webkul/Product/src/Models/ProductVideo.php new file mode 100644 index 000000000..054807783 --- /dev/null +++ b/packages/Webkul/Product/src/Models/ProductVideo.php @@ -0,0 +1,64 @@ +belongsTo(ProductProxy::modelClass()); + } + + /** + * Get image url for the product image. + */ + public function url() + { + return Storage::url($this->path); + } + + /** + * Get image url for the product image. + */ + public function getUrlAttribute() + { + return $this->url(); + } + + /** + * @param string $key + * + * @return bool + */ + public function isCustomAttribute($attribute) + { + return $this->attribute_family->custom_attributes->pluck('code')->contains($attribute); + } + + /** + * @return array + */ + public function toArray() + { + $array = parent::toArray(); + + $array['url'] = $this->url; + + return $array; + } +} \ No newline at end of file diff --git a/packages/Webkul/Product/src/Models/ProductVideoProxy.php b/packages/Webkul/Product/src/Models/ProductVideoProxy.php new file mode 100644 index 000000000..1a3472571 --- /dev/null +++ b/packages/Webkul/Product/src/Models/ProductVideoProxy.php @@ -0,0 +1,10 @@ +videos()->pluck('id'); + + if (isset($data['videos'])) { + foreach ($data['videos'] as $videoId => $video) { + $file = 'videos.' . $videoId; + $dir = 'product/' . $product->id; + + if ($video instanceof UploadedFile) { + if (request()->hasFile($file)) { + $this->create([ + 'path' => request()->file($file)->store($dir), + 'product_id' => $product->id, + 'type' => 'video' + ]); + } + } else { + if (is_numeric($index = $previousVideoIds->search($videoId))) { + $previousVideoIds->forget($index); + } + } + } + } + + foreach ($previousVideoIds as $videoId) { + if ($videoModel = $this->find($videoId)) { + Storage::delete($videoModel->path); + + $this->delete($videoId); + } + } + } +} \ No newline at end of file diff --git a/packages/Webkul/Product/src/Type/AbstractType.php b/packages/Webkul/Product/src/Type/AbstractType.php index be75cb2e5..947143398 100644 --- a/packages/Webkul/Product/src/Type/AbstractType.php +++ b/packages/Webkul/Product/src/Type/AbstractType.php @@ -11,6 +11,7 @@ use Webkul\Product\Repositories\ProductRepository; use Webkul\Attribute\Repositories\AttributeRepository; use Webkul\Product\Datatypes\CartItemValidationResult; use Webkul\Product\Repositories\ProductImageRepository; +use Webkul\Product\Repositories\ProductVideoRepository; use Webkul\Product\Repositories\ProductInventoryRepository; use Webkul\Product\Repositories\ProductAttributeValueRepository; @@ -47,10 +48,17 @@ abstract class AbstractType /** * ProductImageRepository instance * - * @var \Webkul\Product\Repositories\ProductInventoryRepository + * @var \Webkul\Product\Repositories\productImageRepository */ protected $productImageRepository; + /** + * ProductVideoRepository instance + * + * @var \Webkul\Product\Repositories\productVideoRepository + */ + protected $productVideoRepository; + /** * Product Image helper instance * @@ -140,6 +148,7 @@ abstract class AbstractType * @param \Webkul\Product\Repositories\ProductAttributeValueRepository $attributeValueRepository * @param \Webkul\Product\Repositories\ProductInventoryRepository $productInventoryRepository * @param \Webkul\Product\Repositories\ProductImageRepository $productImageRepository + * @param \Webkul\Product\Repositories\ProductVideoRepository $productVideoRepository * @param \Webkul\Product\Helpers\ProductImage $productImageHelper * * @return void @@ -150,6 +159,7 @@ abstract class AbstractType ProductAttributeValueRepository $attributeValueRepository, ProductInventoryRepository $productInventoryRepository, ProductImageRepository $productImageRepository, + ProductVideoRepository $productVideoRepository, ProductImage $productImageHelper ) { $this->attributeRepository = $attributeRepository; @@ -162,6 +172,8 @@ abstract class AbstractType $this->productImageRepository = $productImageRepository; + $this->productVideoRepository = $productVideoRepository; + $this->productImageHelper = $productImageHelper; } @@ -271,6 +283,8 @@ abstract class AbstractType $this->productImageRepository->uploadImages($data, $product); + $this->productVideoRepository->uploadVideos($data, $product); + app('Webkul\Product\Repositories\ProductCustomerGroupPriceRepository')->saveCustomerGroupPrices($data, $product); } diff --git a/packages/Webkul/Product/src/Type/Simple.php b/packages/Webkul/Product/src/Type/Simple.php index 67e34a67d..40934f562 100644 --- a/packages/Webkul/Product/src/Type/Simple.php +++ b/packages/Webkul/Product/src/Type/Simple.php @@ -22,6 +22,7 @@ class Simple extends AbstractType 'admin::catalog.products.accordians.categories', 'admin::catalog.products.accordians.channels', 'admin::catalog.products.accordians.product-links', + 'admin::catalog.products.accordians.videos', ]; /** diff --git a/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php b/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php index 5877b352e..fdaeeec2e 100755 --- a/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php @@ -1,7 +1,15 @@ @inject ('productImageHelper', 'Webkul\Product\Helpers\ProductImage') +@inject ('productVideoHelper', 'Webkul\Product\Helpers\ProductVideo') @inject ('wishListHelper', 'Webkul\Customer\Helpers\Wishlist') -getGalleryImages($product); ?> +getGalleryImages($product); + + $videos = $productVideoHelper->getVideos($product); + + $images = array_merge($images, $videos); +?> + {!! view_render_event('bagisto.shop.products.view.gallery.before', ['product' => $product]) !!} @@ -30,7 +38,12 @@
  • - + + +
  • - -
    - + + + @auth('customer') @php @@ -76,6 +92,10 @@ currentOriginalImageUrl: '', + currentVideoUrl: '', + + currentType: '', + counter: { up: 0, down: 0, @@ -114,11 +134,19 @@ }, changeImage: function(image) { - this.currentLargeImageUrl = image.large_image_url; + this.currentType = image.type; - this.currentOriginalImageUrl = image.original_image_url; + if (image.type == 'video') { + this.currentVideoUrl = image.video_url; - if ($(window).width() > 580) { + this.currentLargeImageUrl = image.large_image_url = image.video_url; + } else { + this.currentLargeImageUrl = image.large_image_url; + + this.currentOriginalImageUrl = image.original_image_url; + } + + if ($(window).width() > 580 && image.original_image_url) { $('img#pro-img').data('zoom-image', image.original_image_url).ezPlus(); } },