Jump to content

Visualizar "Disponible para pedidos" y "Visible en" en el listado de productos del backoffice


Nubla2

Recommended Posts

Hola a todos;

Estoy modificando el listado de productos en el backoffice para añadir un par de columnas: "Disponible para pedidos" y "Visible en"

Ya he creado 2 columnas nuevas en \src\PrestaShopBundle\Resources\views\Admin\Product\CatalogPage\Lists\products_table.html.twig

Ahora estoy intentando llamar a estas opciones para mostrarlas, con product.visibility y product.available_for_order, pero no consigo que funcione.

Supongo porque no se llaman en el controller.

Alguien ha conseguido añadir nuevas columnas en el listado de productos?

Graciassssss

Link to comment
Share on other sites

Con el nuevo sistema de plantillas que usa ahora Prestashop la verdad es que resulta bastante complicado.

Te intento explicar, yo he añadido una columna para mostrar el precio con descuento:

Lo tienes que hacer desde un módulo. Hay que copiar el archivo que tú indicas:

\src\PrestaShopBundle\Resources\views\Admin\Product\CatalogPage\Lists\products_table.html.twig

en la siguiente ruta de tu módulo:

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

y luego editarlo y meter 1 hook propio para la cabecera de la columna (está al final del trozo del archivo que cito):

    <thead class="with-filters">
      {% 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">
            {{ "Image"|trans({}, 'Admin.Global') }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Name"|trans({}, 'Admin.Global'), 'name', orderBy, sortOrder) }}
          </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" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Price (tax excl.)"|trans({}, 'Admin.Catalog.Feature'), 'price', orderBy, sortOrder) }}
          </th> 
          <th scope="col" class="text-center" style="width: 9%">
            {{ "Price (tax incl.)"|trans({}, 'Admin.Catalog.Feature') }}
          </th>
          
          <!-- CUSTOM FIELD -->
		  {{ renderhook('AddFinalPriceHeader') }}
          

Luego hay que hacer lo mismo con el archivo que añade los productos a la tabla, copiarlo en nuestro módulo como el anterior y meter otro hook para insertar el valor en el listado de productos (también va al final del trozo que pongo):

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

    <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.image|raw }}</a>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.name|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        <td>
            {{ product.reference|default('') }}
        </td>
        <td>
            {{ product.name_category|default('') }}
        </td>
        <td class="text-center">
            <a href="{{ product.url|default('') }}#tab-step2">{{ product.price|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        <td class="text-center">
            <a href="{{ product.url|default('') }}#tab-step2">{{ product.price_final|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        
        <!-- CUSTOM FIELD -->
        {{ renderhook('AddFinalPriceValues', { 'product': product }) }}

 

Y finalmente dentro del módulo registrar los hooks y crear los métodos para añadir el contenido:

    public function install() {
        
        if ( !parent::install() || 
          !$this->registerHook('AddFinalPriceValues') ||
          !$this->registerHook('AddFinalPriceHeader') ) {
            return false;
        }
    
        return true;
    }

    public function hookAddFinalPriceHeader($params) {
      return $this->display(__FILE__,'views/templates/hook/AddFinalPriceHeader.tpl');
    }

    public function hookAddFinalPriceValues($params) {
      
	  /* Aquí hago los cálculos necesarios para sacar el precio final ($final_price) */
      $params['product']['price_final_with_discounts'] = Context::getContext()->currentLocale->formatPrice($final_price, 'EUR');;
      $this->context->smarty->assign('product',$params['product']);
      return $this->display(__FILE__,'views/templates/hook/AddFinalPriceValues.tpl');
    }

Finalmente se crean las vistas:

views/templates/hook/AddFinalPriceHeader.tpl:

<th class="text-center">{l s='Precio (desc. incl.)' mod='adminlistmod'}</th>

views/templates/hook/AddFinalPriceValues.tpl:

<td class="text-center">
  {$product.price_final_with_discounts}
</td>

Y eso es todo. Lo he simplificado bastante, y he quitado lo que no es pertinente en este caso (por ejemplo, el cálculo del precio con descuento, o el añadir un campo para poder filtrar por el contenido de la columna, como tienen otras). Aún así, es bastante lioso, si tienes alguna duda concreta pregunta.

En el caso del header de la tabla en realidad no sería necesario insertar el hook, se podría meter directamente el contenido de la vista dentro del archivo "products_table.html.twig", pero con el hook resulta más versátil y más fácil de cambiar por si se quiere modificar algo luego o añadir más columnas. También puedes prescindir incluso de las 2 vistas del final y enviar directamente el contenido desde el módulo, en los métodos de los hooks, con un simple "echo", pero eso ya a gusto del programador.

Edited by Prestafan33 (see edit history)
Link to comment
Share on other sites

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...