#15

Product support

Visit this product's website for support.

Categories

  • E-Commerce
  • Marketing

New FREE Shopaholic Bootstrap Theme Available!

Free E-Commerce Bootstrap for Shopaholic theme is now available on October's marketplace. Check out the theme's live demo version. It demonstrates what you can build with Shopaholic and will soon have support for all our plugins and extensions. We will also constantly update it to cover all Shopaholic functionality.

Coupon Giveaway! Test our paid plugins at minimal price!

We have 100 coupons for those who want to test our paid plugins. Curious? Just let us know at [email protected]!

Live Demo

You can visit our Live Demo site. Sign in to backend using: login - manager, password - manager. You can deploy the demo site locally. To do so, you need to clone the repository, follow the steps from the "Installation guide", install the plugins. As a result, you will receive a copy of the demo site with a full database. Having a ready-made demo site example, you can easily learn how to operate the plugins.

Large Catalog Performance Live Demo

If you would like to know how our plugins perform with large catalogs of products, you can visit our Large Catalog Live Demo that has 21 000 products, 68 000 offers and 210 000 variations of property values.

Below are the performance characteristics for server setup: Dual Core CPU with 4GB of RAM.

For a catalog containing 210 products

Catalog page load time: 100-150 ms

Product list filtering time: 80-100 ms

For a catalog containing 21 000 products

Catalog page load time: 900-1100 ms

Product list filtering time: 500-600 ms

Support

Please join us on #shopaholic channel in October CMS slack chat in order to have quick support on all our products. You will also get all newest updates and insights about our existing and upcoming products!

If you have any specific requests, suggestions or ideas please do not hesitate to send us a message, it will help us make our products even better.

If you don't have access to octobercms.slack.com, please register here

Required Plugins

Recommended Plugins

General information

Shopaholic is a great solution designed to showcase products in your online store provided for you free of charge. It’s a catalogue with built-in functionality and tools to provide customers with basic online shopping experience that can be extended through extra plugins. The additional plugins can be used to build a full-fledged marketplace, while the basic Shopaholic solution is not overcrowded with unnecessary components. This minimalistic approach coincides with October CMS’ philosophy. So you may add functionality to your online shop as you go.

Common Tasks

Shopaholic lets you implement the following eCommerce features:

  • Display the category hierarchy with interactive menus
  • Display the product catalogue
  • Apply filters by category or brand, sort products by price or new additions
  • Display the product, category and brand pages
  • Product Offers (allows to create selectable options for products with different characteristics, such as color, size, etc.);
  • Display promo blocks anywhere throughout the website and advertise products, product offers, discounted products, coupons, campaings, etc.

With the help of Shopaholic’s standard functions, combining them together it’s also possible to solve many other non-trivial tasks, such as displaying blocks of random products, displaying the cheapest and most expensive products, etc.

Features:

Products. Products have basic properties and standard description. Customers can preview the short or open the product’s full description, view single images or the full gallery for a certain product.

Product Offers. Shopaholic allows to implement variations of products for the customer to choose from. With this functionality you may provide custom features and parameters for products which allow customers to choose a product with individual characteristics (for instance, technical specifications). You don’t have to create separate products of the same type. Instead, you create one product and several offers that allow customers to choose from a list of options or configure the product’s parameters to their individual needs. With this feature you can also show the current price and the price before discount.

Properties. Shopaholic allows to display simple product descriptions without any customizable features, e.g. a certain vacuum cleaner model, as well as complex product offers, like smartphones with a choice of colors, RAM capacity, and other properties.

This feature can be extended by the Properties for Shopaholic plugin which allows to create product specifications for a certain industry.

Brands & Categories. Shopaholic allows to group products by brand, category and subcategory. Products can also be filtered and displayed accordingly.

Promo blocks. Promo blocks are sections of content that you can place throughout your eCommerce website and advertise products, offers, discounts, campaigns, and other activity.

Filters. Basic Filtering and sorting features. The plugin allows basic filtering by categories, subcategories or brands and sorting by new additions and price. This functionality can be extended by the Properties for Shopaholic plugin, allowing to filter and display products according to the special properties and specifications created using the plugin.

Integration with RainLab Translate plugin. The Translate plugin allows Shopaholic to be multilingual. So you can build your online store and display your content in various languages.

Extra Plugins

The functionality of your online catalogue built using our plugin may be further extended by our additional plugins. We ensure the high quality of our plugins and provide you with full support. All of our plugins have extensive documentation. The quality of our plugins goes through rigorous testing, we have launched automated testing for all of our plugins. Our code conforms with the best writing and structuring practices. All this guarantees the stable work of our plugins after they are updated with new functionality and ensures their smooth integration.

Orders for Shopaholic plugin (free)

Plugin adds a shopping cart with functionalities to: add and remove products, move to checkout, choose the delivery and payment methods, send e-mails to customers after creating an order.

Properties for Shopaholic plugin

Plugin allows to create custom product properties specifically for the store's specialization (whether it’s a hardware store or clothing retail shop).

Filter for Shopaholic plugin

Plugin introduces complex filtering features where you can create filters by brand, category and other properties, including the special properties provided by the Properties plugin. Complex filters allow you to customize the way you filter your products, e.g. use checkboxes and radiobuttons, Add unique custom filters, tweak them to your specific needs, and much more.

Search for Shopaholic plugin

Plugin provides your Shopaholic solution with a powerful search engine. Whether your users are searching for a specific product, brand or just need to find what they desire by typing in a related phrase - the plugin provides tools to cater all these cases.

Sphinx for Shopaholic plugin (free)

Sphinx for Shopaholic adds supreme search capabilities to your project powered by Sphinx search engine.

Buddies plugin

Plugin provides basic authorization and authentication features, abilities to display error messages and create custom user profile settings (like sex, company, email, job position, phone number and others)

Omnipay for Shopaholic plugin (free)

Plugin adds integration with laravel-omnipay package to your online store.

Paypal for Shopaholic plugin

Adds integration with Paypal payment gateway to your eCommerce store.

Tags for Shopaholic plugin

Plugin allows binding products by tags and displaying groups of products.

Popularity for Shopaholic plugin

Allows calculating product popularity. Adds sorting products by popularity.

Accessories for Shopaholic plugin

Plugin allows to bind products and assign them as an accessory to another product.

Reviews for Shopaholic plugin

Plugin allows clients to post reviews for products on your online shop or marketplace. Customers have the opportunity to review products and rate them (rating range can be set by the admin, for instance from 1 to 5 stars). The plugin allows displaying the product’s overall rating and sorting products by rating.

Related Products for Shopaholic plugin

Plugin allows binding similar products to a certain product.

Compare for Shopaholic

Compare multiple products and display the information to your customers with Shopaholic.

Viewed Products for Shopaholic

Plugin allows you to display the history of viewed products for clients.

Discounts for Shopaholic

A highly customizable and flexible discount system to your Shopaholic store

Coupons for Shopaholic

Create coupons and advertise products with this powerful Shopaholic extension. Choose from 22 available promotional mechanisms to drive sales on your Shopaholic store.

Campaigns for Shopaholic

Create promotional campaigns for holiday seasons and other events on your online store. Choose from 22 available promotional mechanisms.

Plugins that are coming soon:

  • Wish List for Shopaholic – Allows users to build up a wish list of products;
  • Stickers for Shopaholic – functionality to add stickers to products (new, hot price, sale);
  • Stores for Shopaholic – Allows to bind products offers to a retail store, group stores by region;
  • Gifts for Shopaholic – functionality to bind gifts to products;
  • Multicurrency for Shopaholic – functionality to set the product price in different currencies.

Get involved and contribute to the project

If you’d like to help us improve the project, you can do so in the following ways:

You can also visit LOVATA’s GitHub page.

Shopaholic – no drinking, just shopping :)

License

© 2018, LOVATA Software Development Company under GNU GPL v3.

Developed by Andrey Kharanenka.

These plugin(s) are required for the plugin:

The following themes use this plugin:

Product settings

First steps

Let's start getting acquainted with plugin and take the first steps with quick start guide:

  • Step 1: It works!
  • Step 2: Create product page.
  • Step 3: Render the catalog menu using the category tree.
  • Step 4: Create category page with render list of child categories.
  • Step 5: Create catalog page with render list of products.

The full plugin documentation is available here.

ProductList component

The component allows to work with ProductCollection class objects.

Method list

make($arElementIDList = null)

Example: render of product list

Get collection of product, apply sorting, filter by flag "active" and category ID.

{% set obCategory = CategoryPage.get() %}

{% set obProductList = ProductList.make().sort(ProductList.getSorting()).active().category(obCategory.id) %}
{% if obProductList.isNotEmpty() %}
    <div class="product-list-wrapper">
        {% for obProduct in obProductList %}
            <div data-id="{{ obProduct.id }}">
                <h1>{{ obProduct.name }}</h1>
                {% if obProduct.preview_image is not empty %}
                    <img src="{{ obProduct.preview_image.path }}" title="{{ obProduct.preview_image.title }}" alt="{{ obProduct.preview_image.description }}">
                {% endif %}
                <div>{{ obProduct.preview_text }}</div>
            </div>
        {% endfor %}
    </div>
{% endif %}

Get collection of products, apply filter by flag "active" and category ID + Pagination component.

{% set obCategory = CategoryPage.get() %}

{# Get product collection #}
{% set obProductList = ProductList.make().sort(ProductList.getSorting()).active().category(obCategory.id) %}

{# Get array with pagination buttons #}
{% set iPage = Pagination.getPageFromRequest() %}
{% set arPaginationList = Pagination.get(iPage, obProductList.count()) %}

{# Apply pagination to product collection and get array with product items #}
{% set arProductList = obProductList.page(iPage, Pagination.getCountPerPage()) %}

{% if arProductList is not empty %}

    {# Render product list #}
    <div class="product-list-wrapper">
        {% for obProduct in obProductList %}
            <div data-id="{{ obProduct.id }}">
                <h1>{{ obProduct.name }}</h1>
                {% if obProduct.preview_image is not empty %}
                    <img src="{{ obProduct.preview_image.path }}" title="{{ obProduct.preview_image.title }}" alt="{{ obProduct.preview_image.description }}">
                {% endif %}
                <div>{{ obProduct.preview_text }}</div>
            </div>
        {% endfor %}
    </div>

    {# Render pagination buttons #}
    {% if arPaginationList is not empty %}
        {% for arPagination in arPaginationList %}
            <a href="?page={{ arPagination.value }}" class="{{ arPagination.class }}">{{ arPagination.name }}</a>
        {% endfor %}
    {% endif %}
{% endif %}
getAvailableSorting()

Get array with available sorting keys (see).

getSorting()

Get active sorting key value.

onAjaxRequest()

Empty method for ajax request.

ProductPage/ProductData component

The component allows to work with ProductItem class objects.

Usage example:

[ProductPage]
slug = "{{ :slug }}"
==

{# Get product item #}
{% set obProduct = ProductPage.get() %}
<div data-id="{{ obProduct.id }}">
    <h1>{{ obProduct.name }}</h1>
    {% if obProduct.preview_image is not empty %}
        <img src="{{ obProduct.preview_image.path }}" title="{{ obProduct.preview_image.title }}" alt="{{ obProduct.preview_image.description }}">
    {% endif %}
    <span>Category: {{ obProduct.category.name }}</span>
    <span>Brand: {{ obProduct.brand.name }}</span>
    <span>Brand: {{ obProduct.brand.name }}</span>
    {% set obOffer = obProduct.offer.first() %}
    {% if obOffer.isNotEmpty()%}  
        <span>Price: {{ obOffer.price }} {{ obOffer.currency }}</span>
    {% endif %}
    <div>{{ obProduct.description|raw }}</div>
</div>

CategoryList component

The component allows to work with CategoryCollection class objects.

Method list

make($arElementIDList = null)

Example: render of category list

Get tree of categories. Example is used in render of category menu.

{% set obCategoryList = CategoryList.make().tree() %}
{% if obCategoryList.isNotEmpty() %}
    <ul class="category-menu-wrapper">
        {% for obCategory in obCategoryList if obCategory.product_count > 0 %}
            <li data-id="{{ obCategory.id }}">{{ obCategory.name }}
                {% if obCategory.children.isNotEmpty() %}
                    <ul class="category-child-menu-wrapper">
                        {% for obChildCategory in obCategory.children if obChildCategory.product_count > 0 %}
                            <li>{{ obChildCategory.name }}</li>
                        {% endfor %}
                    </ul>
                {% endif %}
            </li>
        {% endfor %}
    </ul>
{% endif %}

CategoryPage/CategoryData component

The component allows to work with CategoryItem class objects.

Usage example:

[CategoryPage]
slug = "{{ :slug }}"
==

{# Get category item #}
{% set obCategory = CategoryPage.get() %}
<div data-id="{{ obCategory.id }}">
    <h1>{{ obCategory.name }}</h1>
    {% if obCategory.preview_image is not empty %}
        <img src="{{ obCategory.preview_image.path }}" title="{{ obCategory.preview_image.title }}" alt="{{ obCategory.preview_image.description }}">
    {% endif %}
    <div>{{ obCategory.description|raw }}</div>
    {% if obCategory.children.isNotEmpty() %}
        <ul>
            {% for obChildCategory in obCategory.children %}
                <li>{{ obChildCategory.name }}</li>
            {% endfor %}
        </ul>
    {% endif %}
</div>

BrandList component

The component allows to work with BrandCollection class objects.

Method list

make($arElementIDList = null)

Example: render brand list

Get collection of brands, apply sorting + filter by flag "active"

{% set obBrandList = BrandList.make().sort().active() %}
{% if obBrandList.isNotEmpty() %}
    <div class="brand-list-wrapper">
        {% for obBrand in obBrandList %}
            <div data-id="{{ obBrand.id }}">
                <h1>{{ obBrand.name }}</h1>
                {% if obBrand.preview_image is not empty %}
                    <img src="{{ obBrand.preview_image.path }}" title="{{ obBrand.preview_image.title }}" alt="{{ obBrand.preview_image.description }}">
                {% endif %}
                <div>{{ obBrand.preview_text }}</div>
            </div>
        {% endfor %}
    </div>
{% endif %}

Get brand collection, apply sorting + filter by flag "active" + Pagination component

{# Get brand collection #}
{% set obBrandList = BrandList.make().sort().active() %}

{# Get array with pagination buttons #}
{% set iPage = Pagination.getPageFromRequest() %}
{% set arPaginationList = Pagination.get(iPage, obBrandList.count()) %}

{# Apply pagination to brand collection and get array with brand items #}
{% set arBrandList = obBrandList.page(iPage, Pagination.getCountPerPage()) %}

{% if arBrandList is not empty %}

    {# Render brand list #}
    <div class="brand-list-wrapper">
        {% for obBrand in obBrandList %}
            <div data-id="{{ obBrand.id }}">
                <h1>{{ obBrand.name }}</h1>
                {% if obBrand.preview_image is not empty %}
                    <img src="{{ obBrand.preview_image.path }}" title="{{ obBrand.preview_image.title }}" alt="{{ obBrand.preview_image.description }}">
                {% endif %}
                <div>{{ obBrand.preview_text }}</div>
            </div>
        {% endfor %}
    </div>

    {# Render pagination buttons #}
    {% if arPaginationList is not empty %}
        {% for arPagination in arPaginationList %}
            <a href="/{{ arPagination.value }}" class="{{ arPagination.class }}">{{ arPagination.name }}</a>
        {% endfor %}
    {% endif %}
{% endif %}

BrandPage/BrandData component

The component allows to work with BrandItem class objects.

Usage example:

[BrandPage]
slug = "{{ :slug }}"
==

{# Get brand item #}
{% set obBrand = BrandPage.get() %}
<div data-id="{{ obBrand.id }}">
    <h1>{{ obBrand.name }}</h1>
    {% if obBrand.preview_image is not empty %}
        <img src="{{ obBrand.preview_image.path }}" title="{{ obBrand.preview_image.title }}" alt="{{ obBrand.preview_image.description }}">
    {% endif %}
    <div>{{ obBrand.description|raw }}</div>
</div>

Breadcrumbs component

The component helps to render catalog breadcrumbs.

Method list

getByCategoryID($iCategoryID)

Example: render ob breadcrumbs for category page

The method helps to render breadcrumbs list of category page. The method returns with breadcrumbs items (field list: id, name, slug, active).

[CatalogBreadcrumbs]

[CategoryPage]
==

{% set obCategory = CategoryPage.get() %}
{% set arBreadcrumbs = CatalogBreadcrumbs.getByCategoryID(obCategory.id) %}
{% if arBreadcrumbs is not empty %}
    <ul>
        {% for arItem in arBreadcrumbs %}
            <li data-id="{{ arItem.id }}" class="{% if arItem.active %} _active {% endif %}">
                {{ arItem.name }}
            </li>
        {% endfor %}
    </ul>
{% endif %}
getByProductID($iProductID)

Example: render ob breadcrumbs for product page

The method helps to render breadcrumbs list of product page. The method returns array with breadcrumbs items (field list: id, name, slug, active). Result array has product data and category list.

[CatalogBreadcrumbs]

[ProductPage]
==

{% set obProduct = ProductPage.get() %}
{% set arBreadcrumbs = CatalogBreadcrumbs.getByProductID(obProduct.id) %}
{% if arBreadcrumbs is not empty %}
    <ul>
        {% for arItem in arBreadcrumbs %}
            <li data-id="{{ arItem.id }}" class="{% if arItem.active %} _active {% endif %}">
                {{ arItem.name }}
            </li>
        {% endfor %}
    </ul>
{% endif %}
  • Found the plugin useful on 27 Aug, 2018

    Shopaholic is a great shopping suite. The idea to has free basic plugins is great to starting a catalog or small shop site. And made it more powerful with the paid plugins. I use it on a couple of sites and I glad to work with this suite.

    Is great, good job !!!

  • Found the plugin useful on 24 Mar, 2018

    Is SEO planned? Or how to implement?

  • author

    Replied on 11 May, 2018

    Hi!

    Thank you for using Shopaholic! We're happy you enjoyed it!

    We have published a Mighty SEO plugin for managing SEO fields. You can also use other solutions (For example SEO Manager plugin).

  • Found the plugin useful on 23 Feb, 2018

    Database structure looks clean, the code looks clean. However, a Shopaholic them is a Must Have! Fortunately, we found your basic theme on github and installed it, but we are waiting for a mature theme. Now we are testing your plugins. Overall, is a great job!

  • author

    Replied on 6 Mar, 2018

    Hi!

    Thank you for using Shopaholic! We're happy you enjoyed it!

    As you mentioned there are no available themes in October Marketplace at the moment. Our main focus in the next few month is growing of Shopaholic functionality. After that, we plan to publish a lot of themes from simple basis theme to ready for use fully customizable theme.

    Besides, we help other developers to develop their own themes for Shopaholic ecosystem. Stay tuned!

  • Found the plugin useful on 22 Jan, 2018

    Hi, the project looks promising, I read the code, it looks clean. . Do you have the shop theme / pages so people can quickly try to use shopaholic? The backend side are nice, the examples are working, but it lacks the frontend pages to at least we can place order, pay and watch order status. . 22/1/18.

  • author

    Replied on 22 Jan, 2018

    Hi!

    Thank you for using Shopaholic! There is a long list of extensions for Shopaholic on our roadmap and we're focusing on them at the moment. As well we plan to publish a demo site with a large number of examples until the spring.

    Besides, we're in a collaboration with one of active October community members, who works on the theme with Shopaholic support.

    Stay tuned!

  • Found the plugin useful on 8 Dec, 2017

    I have insert the code for displaying product list but it doesn't display my products is there any configuration I need to setup? I also set to active all my products.

  • author

    Replied on 10 Dec, 2017

    Hi!

    Thank you for using Shopaholic! We've answered your question at your Github issue.

    Have a nice experience with Shopaholic! ;)

1.19.0

Added translatable slug in Product, Brand, Category, PromoBlock models.

Nov 18, 2018

1.18.0

Added German language. Thanks for contribution Gerald.

Nov 15, 2018

1.17.0

Added Japanese language. Thanks for contribution pikanji.

Nov 07, 2018

1.16.1

Added annotations of filterByDiscount(), filterByQuantity() methods to OfferCollection class.

Nov 05, 2018

1.16.0

Added block with description about import of product/offer properties from CSV file.

Nov 02, 2018

1.15.0

Added import product, offers, categories, brands from CSV file in backend. Requires Toolbox plugin version 1.18.0 and later

Nov 01, 2018

1.14.1

Remove vendor folder from plugin.

Oct 28, 2018

1.14.0

Added "additional_category" field to ProductItem class.

Oct 21, 2018

1.13.1

Added annotations for integration with Coupons for Shopaholic, Discounts for Shopaholic, Campaigns for Shopaholic plugins.

Oct 16, 2018

1.13.0

Added PromoBlock model. Promo blocks are sections of content that you can place throughout your eCommerce website and advertise products, offers, discounts, campaigns, and other activity. Added PromoBlockData, PromoBlockPage, PromoBlockList components. Added PromoBlockItem, PromoBlockCollection classes.

Oct 15, 2018

1.12.0

Added type returned by methods in AbstractStore * classes

Aug 07, 2018

1.11.3

Fix error in ProductCollection class, if product list by category is empty.

Jul 30, 2018

1.11.2

Fix work with *Store classes in *Handler classes.

Jul 11, 2018

1.11.1

Adding "field.additional_category" value to lang files. Fixed displaying "additional categories" field only for update/preview forms.

Jun 25, 2018

1.11.0

Adding getPageUrl() method to ProductItem, BrandItem classes.

Jun 24, 2018

1.10.0

Adding relation between Product model and additional categories. Adding ability to get list of products by category ID list, by the parent category ID.

Jun 22, 2018

1.9.0

Add PriceHelperTrait, TraitCached in models. Add active() method to CategoryCollection class. Move PriceHelper class from Shopaholic plugin to Toolbox plugin. Add new store classes. Refactoring *Store, *Item, *Collection classes. Requires Toolbox plugin version 1.10.0 and later.

Jun 21, 2018

1.8.0

Add integration with "Viewed products for Shopaholic" plugin

Mar 22, 2018

1.7.0

Added translation into French. Thanks for contribution philmarc.

Mar 16, 2018

1.6.0

Add integration with "Compare for Shopaholic"

Mar 11, 2018

1.5.0

Add integration with Search for Shopaholic / Sphinx for Shopaholic plugins

Feb 21, 2018

1.4.1

Update annotations for "Reviews for Shopaholic" plugin. Fix $dates array in Product model. Thanks for contribution Alexander Shapoval.

Feb 14, 2018

1.4.0

Replace code of product sorting by popularity and rating from Shopaholic to extension plugins. Add event "shopaholic.sorting.get.list" for custom sorting of products. Add integration with "Related products for Shopaholic" and "Accessories for Shopaholic" plugins

Feb 04, 2018

1.3.1

Fix: processing of the "nesting" flag for the menu type "catalog"

Jan 15, 2018

1.3.0

!!! Add menu types for integration with the StaticPage plugin. Add getPageUrl() method to the CategoryItem class. Requires Toolbox plugin version 1.4.0 and later. Thanks for contribution Alvaro Cánepa.

Jan 14, 2018

1.2.3

!!! Adding additional cache cleaning for the sorted list of brands, after the creation of a new brand. Requires Toolbox plugin version 1.3.0 and later.

Jan 08, 2018

1.2.2

Add additional cache cleaning after category reordering

Dec 15, 2017

1.2.1

Remove php short tags from offers/update.htm

Dec 15, 2017

1.2.0

preview_image, images fields in item classes returns \System\Models\File class objects. Add integration with "Reviews for Shopaholic" plugin

Dec 13, 2017

1.1.0

Add integration with "Popularity for Shopaholic" and "Tags for Shopaholic" plugins

Dec 08, 2017

1.0.0

Initialize plugin.

Dec 06, 2017