Jump to content

Comment faire apparaitre le Code-barres EAN-13 ou JAN dans le catalogue produit du BO


Recommended Posts

Coucou les prestanautes,

Est-il possible de faire apparaitre, le Code-barres EAN-13 ou JAN, dans la liste du catalogue des produits du BO ?

Car j'aimerais, voir apparaitre cette colonne quand j'ouvre mon fichier .csv de mon catalogue.

Amicalement.

Lilou

Link to comment
Share on other sites

Surtout pas d'override sinon vous allez êtes embêté pour faire vos mises à jour, c'est une très mauvaise pratique. A n'utilisez que lorsqu'aucun hook n'est disponible pour y greffer un module.

Vous pouvez faire un module pour ajouter autant de colonne que vous souhaitez mais il faut connaitre la version de prestashop que vous utilisez.

Module pour prestashop 1.6, à mettre ici : modules/displayproductean/displayproductean.php

<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

class DisplayProductEan extends Module
{
    /**
     * @var array list of hooks used
     */
    public $hooks = [
        'actionAdminProductsListingFieldsModifier',
        'actionAdminProductsListingResultsModifier',
    ];

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->name = 'displayproductean';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Janett';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.6.1.0',
            'max' => '1.6.1.99',
        ];

        parent::__construct();

        $this->displayName = $this->l('Display EAN13 on Product list');
        $this->description = $this->l('Adds EAN13 on Product list');
    }

    /**
     * Install Module.
     *
     * @return bool
     */
    public function install()
    {
        return parent::install()
            && $this->registerHook($this->hooks);
    }

    /**
     * Append custom fields.
     *
     * @param array $params
     */
    public function hookActionAdminProductsListingFieldsModifier(array $params)
    {
        // If hook is called in AdminController::processFilter() we have to check existence
        if (isset($params['select'])) {
            $params['select'] .= ', a.ean13';
        }

        $params['fields']['ean13'] = [
            'title' => $this->l('Barcode'),
            'align' => 'text-center',
            'class' => 'fixed-width-xs',
        ];
    }

    /**
     * Set additional data.
     *
     * @param array $params
     */
    public function hookActionAdminProductsListingResultsModifier(array $params)
    {
        foreach ($params['list'] as $key => $fields) {
            if (isset($fields['ean13'])) {
                $params['list'][$key]['ean13'] = empty($fields['ean13']) ? '-' : $fields['ean13'];
            }
        }
    }
}

Pour prestashop 1.7, il faut procéder différemment.

La prochaine fois, préciser votre version !

Edited by Janett (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 1 year later...
Le 20/06/2019 à 4:07 PM, Janett a dit :

Surtout pas d'override sinon vous allez êtes embêté pour faire vos mises à jour, c'est une très mauvaise pratique. A n'utilisez que lorsqu'aucun hook n'est disponible pour y greffer un module.

Vous pouvez faire un module pour ajouter autant de colonne que vous souhaitez mais il faut connaitre la version de prestashop que vous utilisez.

Module pour prestashop 1.6, à mettre ici : modules/displayproductean/displayproductean.php


<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

class DisplayProductEan extends Module
{
    /**
     * @var array list of hooks used
     */
    public $hooks = [
        'actionAdminProductsListingFieldsModifier',
        'actionAdminProductsListingResultsModifier',
    ];

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->name = 'displayproductean';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Janett';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.6.1.0',
            'max' => '1.6.1.99',
        ];

        parent::__construct();

        $this->displayName = $this->l('Display EAN13 on Product list');
        $this->description = $this->l('Adds EAN13 on Product list');
    }

    /**
     * Install Module.
     *
     * @return bool
     */
    public function install()
    {
        return parent::install()
            && $this->registerHook($this->hooks);
    }

    /**
     * Append custom fields.
     *
     * @param array $params
     */
    public function hookActionAdminProductsListingFieldsModifier(array $params)
    {
        // If hook is called in AdminController::processFilter() we have to check existence
        if (isset($params['select'])) {
            $params['select'] .= ', a.ean13';
        }

        $params['fields']['ean13'] = [
            'title' => $this->l('Barcode'),
            'align' => 'text-center',
            'class' => 'fixed-width-xs',
        ];
    }

    /**
     * Set additional data.
     *
     * @param array $params
     */
    public function hookActionAdminProductsListingResultsModifier(array $params)
    {
        foreach ($params['list'] as $key => $fields) {
            if (isset($fields['ean13'])) {
                $params['list'][$key]['ean13'] = empty($fields['ean13']) ? '-' : $fields['ean13'];
            }
        }
    }
}

Pour prestashop 1.7, il faut procéder différemment.

La prochaine fois, préciser votre version !

Bonjour,

cet ajout ean (et upc aussi) m’intéresse beaucoup pour ma boutique. Je suis en PS 1.7.6.5

J'ai essayer avec le générateur de module de prestashop en utilisant le Hook "Display new elements in the product form in Back Office" , mais je pense que ce n'est pas le bon Hook,  je n'obtiens rien de plus...

Pourriez-vous m'indiquer la marche à suivre sous PS 1.7 s'il vous plait

Merci

Link to comment
Share on other sites

  • 7 months later...
  • 8 months later...

Module pour PrestaShop 1.7 qui nécessite au minimum 3 fichiers désormais afin de surcharger les templates de la nouvelle page produit de la 1.7

modules/displayproductean/displayproductean.php

<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

class DisplayProductEan extends Module
{
    /**
     * @var array list of hooks used
     */
    public $hooks = [
        'actionAdminProductsListingFieldsModifier',
        'actionAdminProductsListingResultsModifier',
    ];

    /**
     * @var bool
     */
    private $isPrestaShop16;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->name = 'displayproductean';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Janett';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.6.1.0',
            'max' => '1.7.9.99',
        ];

        parent::__construct();

        $this->displayName = $this->l('Display EAN13 on Product list');
        $this->description = $this->l('Adds EAN13 on Product list');
        $this->isPrestaShop16 = (bool) version_compare(_PS_VERSION_, '1.7.0.0', '<=');
    }

    /**
     * Install Module.
     *
     * @return bool
     */
    public function install()
    {
        return parent::install()
            && $this->registerHook($this->hooks);
    }

    /**
     * Append custom fields.
     *
     * @param array $params
     */
    public function hookActionAdminProductsListingFieldsModifier(array &$params)
    {
        if ($this->isPrestaShop16) {
            // If hook is called in AdminController::processFilter() we have to check existence
            if (isset($params['select'])) {
                $params['select'] .= ', a.ean13';
            }

            $params['fields']['ean13'] = [
                'title' => $this->l('Barcode'),
                'align' => 'text-center',
                'class' => 'fixed-width-xs',
            ];
        } else {
            $params['sql_select']['ean13'] = [
                'table' => 'p',
                'field' => 'ean13',
                'filtering' => 'LIKE \'%%%s%%\'',
            ];

            // There no proper way currently to add custom filters
            // This tricks doesn't manage pagination and empty results
            $ean13_filter = Tools::getValue('filter_column_name_ean13');
            if (!empty($ean13_filter) && Validate::isEan13($ean13_filter)) {
                $params['sql_where'][] .= sprintf('p.ean13 LIKE "%%%s%%"', pSQL($ean13_filter));
            }
        }
    }

    /**
     * Set additional data.
     *
     * @param array $params
     */
    public function hookActionAdminProductsListingResultsModifier(array &$params)
    {
        if ($this->isPrestaShop16) {
            foreach ($params['list'] as $key => $fields) {
                if (isset($fields['ean13'])) {
                    $params['list'][$key]['ean13'] = empty($fields['ean13']) ? '-' : $fields['ean13'];
                }
            }
        }
    }
}

modules/displayproductean/views/PrestaShop/Admin/Product/CatalogPage/Lists/products_table.html.twig

{#**
 * Copyright since 2007 PrestaShop SA and Contributors
 * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License version 3.0
 * that is bundled with this package in the file LICENSE.md.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/AFL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * @author    PrestaShop SA and Contributors <contact@prestashop.com>
 * @copyright Since 2007 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
 *#}
{% extends '@!PrestaShop/Admin/Product/CatalogPage/Lists/products_table.html.twig' %}

{% block product_catalog_form_table_header %}
    <tr class="column-headers">
        <th scope="col" style="width: 2rem"></th>
        <th scope="col" style="width: 5rem">
            {{ ps.sortable_column_header("ID"|trans({}, 'Admin.Global'), 'id_product', orderBy, sortOrder) }}
        </th>
        <th scope="col">
            {{ ps.sortable_column_header("Name"|trans({}, 'Admin.Global'), 'name', orderBy, sortOrder) }}
        </th>
        <th scope="col">
            {{ "Image"|trans({}, 'Admin.Global') }}
        </th>
        <th scope="col" style="width: 9%">
            {{ ps.sortable_column_header("Reference"|trans({}, 'Admin.Global'), 'reference', orderBy, sortOrder) }}
        </th>
        <th scope="col">
            {{ ps.sortable_column_header("Category"|trans({}, 'Admin.Catalog.Feature'), 'name_category', orderBy, sortOrder) }}
        </th>
        <th scope="col">
            {{ ps.sortable_column_header("Ean 13"|trans({}, 'Admin.Global'), 'ean13', orderBy, sortOrder) }}
        </th>
        <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Price (tax excl.)"|trans({}, 'Admin.Catalog.Feature'), 'price', orderBy, sortOrder) }}
        </th>

        {% if 'PS_STOCK_MANAGEMENT'|configuration %}
            <th scope="col" class="text-center" style="width: 9%">
                {{ ps.sortable_column_header("Quantity"|trans({}, 'Admin.Catalog.Feature'), 'sav_quantity', orderBy, sortOrder) }}
            </th>
        {% else %}
            <th></th>
        {% endif %}

        <th scope="col" class="text-center">
            {{ ps.sortable_column_header("Status"|trans({}, 'Admin.Global'), 'active', orderBy, sortOrder) }}
        </th>
        {% if has_category_filter == true %}
            <th scope="col">
                {{ ps.sortable_column_header("Position"|trans({}, 'Admin.Global'), 'position') }}
            </th>
        {% endif %}
        <th scope="col" class="text-right" style="width: 3rem; padding-right: 2rem">
            {{ "Actions"|trans({}, 'Admin.Global') }}
        </th>
    </tr>
{% endblock %}

{% block product_catalog_form_table_filters %}
    <tr class="column-filters">
        <th colspan="2">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
                'input_name': "filter_column_id_product",
                'min': '0',
                'max': '1000000',
                'minLabel': "Min"|trans({}, 'Admin.Global'),
                'maxLabel': "Max"|trans({}, 'Admin.Global'),
                'value': filter_column_id_product,
            } %}
        </th>
        <th>
            <input
                    type="text"
                    class="form-control"
                    placeholder="{{ "Search name"|trans({}, 'Admin.Catalog.Help') }}"
                    name="filter_column_name"
                    value="{{ filter_column_name }}"
            />
        </th>
        <th>&nbsp;</th>
        <th>
            <input
                    type="text"
                    class="form-control"
                    placeholder="{{ "Search ref."|trans({}, 'Admin.Catalog.Help') }}"
                    name="filter_column_reference"
                    value="{{ filter_column_reference }}"
            />
        </th>
        <th>
            <input
                    type="text"
                    class="form-control"
                    placeholder="{{ "Search category"|trans({}, 'Admin.Catalog.Help') }}"
                    name="filter_column_name_category"
                    value="{{ filter_column_name_category }}"
            />
        </th>
        <th>
            <input
                    type="text"
                    class="form-control"
                    placeholder="{{ "Search ean13"|trans({}, 'Admin.Catalog.Help') }}"
                    name="filter_column_name_ean13"
                    value=""
            />
        </th>
        <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
                'input_name': "filter_column_price",
                'min': '0',
                'max': '1000000',
                'minLabel': "Min"|trans({}, 'Admin.Global'),
                'maxLabel': "Max"|trans({}, 'Admin.Global'),
                'value': filter_column_price,
            } %}
        </th>

        {% if 'PS_STOCK_MANAGEMENT'|configuration %}
            <th class="text-center">
                {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
                    'input_name': "filter_column_sav_quantity",
                    'min': '-1000000',
                    'max': '1000000',
                    'minLabel': "Min"|trans({}, 'Admin.Global'),
                    'maxLabel': "Max"|trans({}, 'Admin.Global'),
                    'value': filter_column_sav_quantity,
                } %}
            </th>
        {% else %}
            <th></th>
        {% endif %}

        <th id="product_filter_column_active" class="text-center">
            <div class="form-select">
                <select class="custom-select" name="filter_column_active">
                    <option value=""></option>
                    <option value="1"
                            {% if (filter_column_active is defined) and filter_column_active == '1' %}selected="selected"{% endif %}>
                        Active
                    </option>
                    <option value="0"
                            {% if (filter_column_active is defined) and filter_column_active == '0' %}selected="selected"{% endif %}>
                        Inactive
                    </option>
                </select>
            </div>
        </th>
        {% if has_category_filter == true %}
            <th>
                {% if not(activate_drag_and_drop) %}
                    <input type="button" class="btn btn-outline-secondary" name="products_filter_position_asc"
                           value="{{ "Reorder"|trans({}, 'Admin.Actions') }}" onclick="productOrderPrioritiesTable();"/>
                {% else %}
                    <input type="button" id="bulk_edition_save_keep" class="btn" onclick="bulkProductAction(this, 'edition');"
                           value="{{ "Save & refresh"|trans({}, 'Admin.Actions')|raw }}"/>
                {% endif %}

            </th>
        {% endif %}
        <th class="text-right" style="width: 5rem">
            <button
                    type="submit"
                    class="btn btn-primary"
                    name="products_filter_submit"
                    title="{{ "Search"|trans({}, 'Admin.Actions') }}"
            >
                <i class="material-icons">search</i>
                {{ "Search"|trans({}, 'Admin.Actions') }}
            </button>
            <button
                    type="reset"
                    class="btn btn-link"
                    name="products_filter_reset"
                    onclick="productColumnFilterReset($(this).closest('tr.column-filters'))"
                    title="{{ "Reset"|trans({}, 'Admin.Actions') }}"
            >
                <i class="material-icons">clear</i>
                {{ "Reset"|trans({}, 'Admin.Actions') }}
            </button>
        </th>
    </tr>
{% endblock %}

modules/displayproductean/views/PrestaShop/Admin/Product/CatalogPage/Lists/list.html.twig

{#**
 * Copyright since 2007 PrestaShop SA and Contributors
 * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License version 3.0
 * that is bundled with this package in the file LICENSE.md.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/AFL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * @author    PrestaShop SA and Contributors <contact@prestashop.com>
 * @copyright Since 2007 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
 *#}
{% extends '@!PrestaShop/Admin/Product/CatalogPage/Lists/list.html.twig' %}

{% block product_catalog_form_table_row %}
    <tr data-uniturl="{{ product.unit_action_url|default('#') }}" data-product-id="{{ product.id_product }}">
        <td class="checkbox-column form-group">
            <div class="md-checkbox md-checkbox-inline">
                <label>
                    <input type="checkbox" id="bulk_action_selected_products-{{ product.id_product }}"
                           name="bulk_action_selected_products[]" value="{{ product.id_product }}">
                    <i class="md-checkbox-control"></i>
                </label>
            </div>
        </td>
        <td>
            <label class="form-check-label" for="bulk_action_selected_products-{{ product.id_product }}">
                {{ product.id_product }}
            </label>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.name|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.image|raw }}</a>
        </td>
        <td>
            {{ product.reference|default('') }}
        </td>
        <td>
            {{ product.name_category|default('') }}
        </td>
        <td>
                {{ product.ean13|default('') }}
        </td>
        <td class="text-center">
            <a href="{{ product.url|default('') }}#tab-step2">{{ product.price|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>

        {% if 'PS_STOCK_MANAGEMENT'|configuration %}
            <td class="product-sav-quantity text-center" data-product-quantity-value="{{ product.sav_quantity|default('') }}">
                <a href="{{ product.url|default('') }}#tab-step3">
                    {% if product.sav_quantity is defined and product.sav_quantity > 0 %}
                        {{ product.sav_quantity }}
                    {% else %}
                        {{ product.sav_quantity|default('N/A'|trans({}, 'Admin.Global')) }}
                    {% endif %}
                </a>
            </td>
        {% else %}
            <td></td>
        {% endif %}
        <td class="text-center">
            {% if product.active|default(0) == 0 %}
                <a href="#" onclick="unitProductAction(this, 'activate'); return false;">
                    <i class="material-icons action-disabled">clear</i>
                </a>
            {% else %}
                <a href="#" onclick="unitProductAction(this, 'deactivate'); return false;">
                    <i class="material-icons action-enabled ">check</i>
                </a>
            {% endif %}
        </td>
        {% if product.position is defined %}
            <td {% if activate_drag_and_drop %}class="placeholder"{% endif %} style="cursor: pointer; cursor: hand;">
                {% if activate_drag_and_drop %}
                    <big><big></big></big>
                {% endif %}
                <span class="position">{{ product.position }}</span>
                <input type="hidden" name="mass_edit_action_sorted_products[]" value="{{ product.id_product }}"/>
                <input type="hidden" name="mass_edit_action_sorted_positions[]" value="{{ product.position }}"/>
            </td>
        {% endif %}
        <td class="text-right">
            <div class="btn-group-action">

                {% set buttons_action = [
                    {
                        "href": product.preview_url|default('#'),
                        "target": "_blank",
                        "icon": "remove_red_eye",
                        "label": "Preview"|trans({}, 'Admin.Actions')
                    }
                ] %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'duplicate');",
                        "icon": "content_copy",
                        "label": "Duplicate"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'delete');",
                        "icon": "delete",
                        "label": "Delete"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% include '@Product/CatalogPage/Forms/form_edit_dropdown.html.twig' with {
                    'button_id': "product_list_id_" ~ product.id_product ~ "_menu",
                    'default_item': {
                        "href": product.url|default('#'),
                        "icon": "mode_edit"
                    },
                    'right': true,
                    'items': buttons_action
                } %}
            </div>
        </td>
    </tr>
{% endblock %}

 

Link to comment
Share on other sites

  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...