diff --git a/Changelog.md b/Changelog.md index 859d0b21..39b3fc29 100644 --- a/Changelog.md +++ b/Changelog.md @@ -17,6 +17,8 @@ - Added the `withImages` method to the product search class (eager loads media) - Added the `channelables` table for being many-to-many polymorphic relationships with channels and arbitrary models - Added the `mapInto()` method to the `RelationAdjustmentCollection` class, which forwards the call to the underlying Eloquent collection +- Added the `Channelable` behavior to Foundation Product, MasterProduct and Taxonomy classes +- Added and extended Foundation Channel model that contains the known relationships to the "channelable" models ## 3.x Series diff --git a/src/Channel/Traits/Channelable.php b/src/Channel/Traits/Channelable.php new file mode 100644 index 00000000..2e1ea88d --- /dev/null +++ b/src/Channel/Traits/Channelable.php @@ -0,0 +1,26 @@ +morphToMany(Channel::class, 'channelable'); + } +} diff --git a/src/Foundation/Models/Channel.php b/src/Foundation/Models/Channel.php new file mode 100644 index 00000000..49eab516 --- /dev/null +++ b/src/Foundation/Models/Channel.php @@ -0,0 +1,57 @@ +morphToMany(ProductProxy::modelClass(), 'channelables'); + } + + public function masterProducts(): MorphToMany + { + return $this->morphToMany(MasterProductProxy::modelClass(), 'channelables'); + } + + public function shippingMethods(): MorphToMany + { + return $this->morphToMany(ShippingMethodProxy::modelClass(), 'channelables'); + } + + public function paymentMethods(): MorphToMany + { + return $this->morphToMany(PaymentMethodProxy::modelClass(), 'channelables'); + } + + public function taxonomies(): MorphToMany + { + return $this->morphToMany(TaxonomyProxy::modelClass(), 'channelables'); + } + + public function properties(): MorphToMany + { + return $this->morphToMany(PropertyProxy::modelClass(), 'channelables'); + } +} diff --git a/src/Foundation/Models/MasterProduct.php b/src/Foundation/Models/MasterProduct.php index 1ec458dc..1b399169 100644 --- a/src/Foundation/Models/MasterProduct.php +++ b/src/Foundation/Models/MasterProduct.php @@ -18,6 +18,7 @@ use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Vanilo\Category\Traits\HasTaxons; +use Vanilo\Channel\Traits\Channelable; use Vanilo\Foundation\Traits\LoadsMediaConversionsFromConfig; use Vanilo\MasterProduct\Models\MasterProduct as BaseMasterProduct; use Vanilo\Properties\Traits\HasPropertyValues; @@ -27,6 +28,7 @@ class MasterProduct extends BaseMasterProduct implements HasMedia { use BelongsToTaxCategory; + use Channelable; use InteractsWithMedia; use HasImagesFromMediaLibrary; use LoadsMediaConversionsFromConfig; diff --git a/src/Foundation/Models/Product.php b/src/Foundation/Models/Product.php index f2edab35..96c8469e 100644 --- a/src/Foundation/Models/Product.php +++ b/src/Foundation/Models/Product.php @@ -18,6 +18,7 @@ use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Vanilo\Category\Traits\HasTaxons; +use Vanilo\Channel\Traits\Channelable; use Vanilo\Contracts\Buyable; use Vanilo\Foundation\Traits\LoadsMediaConversionsFromConfig; use Vanilo\Product\Models\Product as BaseProduct; @@ -30,6 +31,7 @@ class Product extends BaseProduct implements Buyable, HasMedia { use BelongsToTaxCategory; use BuyableModel; + use Channelable; use InteractsWithMedia; use HasImagesFromMediaLibrary; use LoadsMediaConversionsFromConfig; diff --git a/src/Foundation/Models/Taxonomy.php b/src/Foundation/Models/Taxonomy.php index ec2f7eb6..c8bee2be 100644 --- a/src/Foundation/Models/Taxonomy.php +++ b/src/Foundation/Models/Taxonomy.php @@ -18,12 +18,14 @@ use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Vanilo\Category\Models\Taxonomy as BaseTaxonomy; +use Vanilo\Channel\Traits\Channelable; use Vanilo\Contracts\HasImages; use Vanilo\Foundation\Traits\LoadsMediaConversionsFromConfig; use Vanilo\Support\Traits\HasImagesFromMediaLibrary; class Taxonomy extends BaseTaxonomy implements HasMedia, HasImages { + use Channelable; use InteractsWithMedia; use HasImagesFromMediaLibrary; use LoadsMediaConversionsFromConfig; diff --git a/src/Foundation/Providers/ModuleServiceProvider.php b/src/Foundation/Providers/ModuleServiceProvider.php index db5297d0..e4e64355 100644 --- a/src/Foundation/Providers/ModuleServiceProvider.php +++ b/src/Foundation/Providers/ModuleServiceProvider.php @@ -25,12 +25,15 @@ use Vanilo\Category\Contracts\Taxonomy as TaxonomyContract; use Vanilo\Category\Models\TaxonomyProxy; use Vanilo\Category\Models\TaxonProxy; +use Vanilo\Channel\Contracts\Channel as ChannelContract; +use Vanilo\Channel\Models\ChannelProxy; use Vanilo\Checkout\Contracts\CheckoutDataFactory as CheckoutDataFactoryContract; use Vanilo\Foundation\Factories\CheckoutDataFactory; use Vanilo\Foundation\Factories\OrderFactory; use Vanilo\Foundation\Models\Address; use Vanilo\Foundation\Models\Cart; use Vanilo\Foundation\Models\CartItem; +use Vanilo\Foundation\Models\Channel; use Vanilo\Foundation\Models\Customer; use Vanilo\Foundation\Models\MasterProduct; use Vanilo\Foundation\Models\MasterProductVariant; @@ -70,6 +73,7 @@ public function boot() // Use the foundation's extended model classes $registerRouteModels = config('concord.register_route_models', true); + $this->concord->registerModel(ChannelContract::class, Channel::class, $registerRouteModels); $this->concord->registerModel(ProductContract::class, Product::class, $registerRouteModels); $this->concord->registerModel(AddressContract::class, Address::class, $registerRouteModels); $this->concord->registerModel(CustomerContract::class, Customer::class, $registerRouteModels); @@ -93,6 +97,7 @@ public function boot() 'order' => OrderProxy::modelClass(), 'cart' => CartProxy::modelClass(), 'shipment' => ShipmentProxy::modelClass(), + 'channel' => ChannelProxy::modelClass(), ]); ShippingFeeCalculators::register(FlatFeeCalculator::ID, FlatFeeCalculator::class);