webpress/product-manager

There is no license information available for the latest version (3.1.87) of this package.

Webpress product manager

This package's canonical repository appears to be gone and the package has been frozen as a result.

3.1.87 2022-06-17 10:29 UTC

README

Product management package for managing product in laravel framework

Installation

Composer

To include the package in your project, Please run following command.

composer require vicoders/product_management

Service Provider

In your config/app.php add the following Service Providers to the end of the providers array:

'providers' => [
        ...
    VCComponent\Laravel\Product\Providers\ProductServiceProvider::class,
    VCComponent\Laravel\Product\Providers\ProductRouteProvider::class,
],

Config and Migration

Run the following commands to publish configuration and migration files.

php artisan vendor:publish --provider="VCComponent\Laravel\Product\Providers\ProductServiceProvider"
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
php artisan vendor:publish --provider "Prettus\Repository\Providers\RepositoryServiceProvider"

Create tables:

php artisan migrate

Environment

In .env file, we need some configuration.

API_PREFIX=api
API_VERSION=v1
API_NAME="Your API Name"
API_DEBUG=false

Configuration

URL namespace

To avoid duplication with your application's api endpoints, the package has a default namespace for its routes which is product-management. For example:

{{url}}/api/product-management/admin/product

You can modify the package url namespace to whatever you want by modifying the PRODUCT_COMPONENT_NAMESPACE variable in .env file.

PRODUCT_COMPONENT_NAMESPACE="your-namespace"

Model and Transformer

You can use your own model and transformer class by modifying the configuration file config\product.php

'models'          => [
    'product' => App\Entities\Product::class,
],

'transformers'    => [
    'product' => App\Transformers\ProductTransformer::class,
],

Your Product model class must implements VCComponent\Laravel\Product\Contracts\ProductSchema and VCComponent\Laravel\Product\Contracts\ProductManagement

<?php

namespace App\Entities;

use Illuminate\Database\Eloquent\Model;
use Prettus\Repository\Contracts\Transformable;
use Prettus\Repository\Traits\TransformableTrait;
use VCComponent\Laravel\Product\Contracts\ProductManagement;
use VCComponent\Laravel\Product\Contracts\ProductSchema;
use VCComponent\Laravel\Product\Traits\ProductManagementTrait;
use VCComponent\Laravel\Product\Traits\ProductSchemaTrait;

class Product extends Model implements Transformable, ProductSchema, ProductManagement
{
    use TransformableTrait, ProductSchemaTrait, ProductManagementTrait;

    const STATUS_PENDING = 1;
    const STATUS_ACTIVE  = 2;

    protected $fillable = [
        'name',
        'description',
        'status',
        'slug',
        'price',
    ];
}

Auth middleware

Configure auth middleware in configuration file config\product.php

'auth_middleware' => [
        'admin'    => [
            'middleware' => 'jwt.auth',
            'except'     => ['index'],
        ],
        'frontend' => [
            'middleware' => 'jwt.auth',
            'except'     => ['index'],
        ],
],

If your has additional fields, just add the schema to the Product model class.

public function schema()
{
    return [
        'regular_price' => [
            'type' => 'text',
            'rule' => ['nullable'],
        ]
    ];
}

Query functions provide

Repository

List of query functions

Find By Field

public function findProductByField($field, $value)

Find products by condition array

public function findByWhere(array $where, $number = 10, $order_by = 'order', $order = 'asc');

public function findByWherePaginate(array $where, $number = 10, $order_by = 'order', $order = 'asc')
// Find products by condition array withPaginate

Get product by id

public function getProductByID($product_id);

Get product image list by size

public function getProductMedias($product_id, $image_dimension= '');

Get product link

public function getProductUrl($product_id);

Get related products in the same category

public function getRelatedProducts($product_id, array $where = [], $number = 10, $order_by = 'order', $order = 'asc');

public function getRelatedProductsPaginate($product_id, array $where = [], $number = 10, $order_by = 'order', $order = 'asc');
// get related products of the same category with pagination

get products by category

public function getProductsWithCategory($category_id, array $where = [], $number = 10, $order_by = 'order', $order = 'asc', $columns = ['*']);

public function getProductsWithCategoryPaginate($category_id, array $where = [], $number = 10, $order_by = 'order', $order = 'asc', $columns = ['*']);
// get products by pagination category

Search product by keyword

public function getSearchResult($key_word,array $list_field  = ['name'], array $where = [], $category_id = 0,$number = 10,$order_by = 'order', $order = 'asc', $columns = ['*']);

public function getSearchResultPaginate($key_word, array $list_field  = ['name'], array $where = [], $category_id = 0,$number = 10,$order_by = 'order', $order = 'asc', $columns = ['*']);
// Search product by keyword with pagination

Use

At controller use PostRepository and add function __construct

use VCComponent\Laravel\Product\Repositories\ProductRepository;
public function __construct(ProductRepository $productRepo) 
{
    $this->productRepo = $productRepo;
}

For example

$product = $this->productRepo->findProductByField('name','product hot');
// get a product named hot product

$productWhere = $this->productRepo->findByWhere(['name'=>'product hot','status'=>1]);
// get a product named hot product and status = 1

$productWhere = $this->productRepo->findByWherePaginate(['name'=>'product hot','status'=>1]);
// get a product named hot product and status = 1 with paginate

$productById = $this->productRepo->getProductByID(1);
// get product with id = 1

$productMedia = $this->productRepo->getProductMedias(2);
// get a list of images of product with id = 2

$product = $this->productRepo->getProductUrl(1);
// get the product link with id = 1

$productsRelated = $this->productRepo->getRelatedProducts(1);
// get all products in the same category as the product with id = 1

$productsRelatedPaginate = $this->productRepo->getRelatedProductsPaginate(1);
// get all products of the same category as the product with id=1 with pagination

$productsWithCategory = $this->productRepo->getProductsWithCategory(1);
// get all products in category id = 1 

$productsWithCategoryPaginate = $this->productRepo->getProductsWithCategory(1);
// get all products of category id = 2  with pagination

$productsResult = $this->productRepo->getSearchResult('hot',['name','description']);
// get all products that contain "hot" in name or description field 

$productsResult = $this->productRepo->getSearchResult('hot',['name','description'],['status'=>1],3);
// get all product that contain "hot" in name or description field and have status = 1 field and belong to category with id = 3

$productsResult = $this->productRepo->getSearchResultPaginate('hot',['name','description'],['status'=>1],3);
// get all product that contain "hot" in name or description field and have status = 1 field and belong to category with id = 3 with paginate

Entity

List of entity query function

Scope a query to only include products of a given type.

public function scopeOfType($query, $type)

Get product collection by type.

public static function getByType($type = 'products')

Get product by type with pagination.

public static function getByTypeWithPagination($type = 'products', $per_page = 15)

Get product by type and id.

public static function findByType($id, $type = 'products')

Get product meta data.

public function getMetaField($key)

Scope a query to only include hot products.

public function scopeIsHot($query)

Scope a query to only include in stock products.

public function scopeInStock($query)

Scope a query to only include publisded products.

public function scopeIsPublished($query)

Scope a query to sort products by order column.

public function scopeSortByOrder($query, $order = 'desc')

Scope a query to sort products by published_date column.

public function scopeSortByPublishedDate($query, $order = 'desc')

Scope a query to sort products by sold quanlity.

public function scopeSortBySoldQuanlity($query, $order = 'desc')

Scope a query to search products of given key word. This function is also able to scope with categories, or tags.

public function scopeOfSearching($query, $search, $with_category = false, $with_tag = false)

Scope a query to include related products. This function is also able to scope with categories, or tags.

public function scopeOfRelatingTo($query, $product, $with_category = false, $with_tag = false)

Use entity query function

Use Trait.

namespace App\Model;

use VCComponent\Laravel\Product\Traits\ProductQueryTrait;

class Product 
{
    use ProductQueryTrait;
    \\
}

Extend VCComponent\Laravel\Product\Entities\Product Entity.

namespace App\Model;

use VCComponent\Laravel\Product\Entities\Product as BaseProduct;

class Product extends BaseProduct
{
    \\
}

Entity query function example

$product = Product::isPublished()->inStock()->with('categories')->sortBySoldQuanlity()->first();
$products = Product::ofType('product')->isPublished()->inStock()->ofRelatingTo($product, true)->get();

View

Your ProductListController controller class must extends VCComponent\Laravel\Product\Http\Controllers\Web\ProductListController as BaseProductListController implements VCComponent\Laravel\Product\Contracts\ViewProductListControllerInterface;

class ProductListController extends BaseProductListController implements ViewProductListControllerInterface
{
}

Your ProductDetailController controller class must extends VCComponent\Laravel\Product\Http\Controllers\Web\ProductDetailController as BaseProductDetailController implements VCComponent\Laravel\Product\Contracts\ViewProductDetailControllerInterface;

class ProductDetailController extends BaseProductDetailController implements ViewProductDetailControllerInterface
{
}

If you want change view default, you must add the view your to the Product controller class.

protected function view()
{
    return 'view-custom';
}

Routes

The api endpoint should have these format:

Verb URI
GET /api/{namespace}/admin/products
GET /api/{namespace}/admin/products/{id}
POST /api/{namespace}/admin/products
PUT /api/{namespace}/admin/products/{id}
DELETE /api/{namespace}/admin/products/{id}
PUT /api/{namespace}/admin/products/status/bulk
PUT /api/{namespace}/admin/products/status/{id}
---- ----
GET /api/{namespace}/
GET /api/{namespace}/{id}
POST /api/{namespace}/
PUT /api/{namespace}/{id}
DELETE /api/{namespace}/{id}
PUT /api/{namespace}/status/bulk
PUT /api/{namespace}/status/{id}