Jump to content
rquantin

BackOffice Ajout d'un filtre dans la liste des produits

Recommended Posts

Bonjour,

 

Je cherche une solution pour pouvoir filtrer ma liste de produits dans->Catalogue->Produits

De base dans PS, il y a la possibilité de chercher soit par catégorie ou divers filtre en tête de colonne.

 

J'aimerais ajouter dans cette en-entête, a coté de <État>, le filtre sur les produits <Disponible à la vente>.

 

Quelqu'un a-t-il une solution ou a-t-il déjà manipuler le tableau du back office pour m'orienter dans ma recherche.

 

Merci d'avance.

QR

Share this post


Link to post
Share on other sites

Bonjour,

 

Merci herve25 pour cette solution,

 

Je l'ai essayé mais j'ai un problème sur la requête que je n'arrive pas à identifier:

 

 

<?php
class AdminProductsController extends AdminProductsControllerCore
{
    
    public function __construct()
    {
        
        parent::__construct();
        
        // On joint la table ps_product_shop
        $this->_join .= ' LEFT JOIN '._DB_PREFIX_.'product_shop sa ON ( a.id_product = sa.id_product )';
        
        //Ajout du champs dans la liste des champs affichés dans l'amdin
        $this->fields_list['available_for_order'] = array(
            'title' => $this->l('Dispo'),

            'active' => 'available_for_order',
            'filter_key' => 'ps!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',

            'orderby' => 'false'

        );
    }
}

 

 

Lors de l'affichage dans le back office il y a une erreur de requête car effectivement le champ "available_for_order" ce trouve aussi bien dans la table "ps_product" que dans la table "ps_product_shop".

De plus la table "product_shop" est déjà en déclaration LEFT JOIN dans le controllers est-il nécéssaire de la remettre?

 

Merci pour vos retour.

 

CT 

Share this post


Link to post
Share on other sites

Effectivement le join n'est pas nécessaire dans votre cas car les données sont déjà présentes.

Voici donc un code qui fonctionne :

<?php
class AdminProductsController extends AdminProductsControllerCore
{

    public function __construct()
    {
        parent::__construct();

        //Ajout du champs dans la liste des champs affichés dans l'amdin
        $this->fields_list['available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'available_for_order',
            'filter_key' => 'a!available_for_order', // remplace a par sa pour récupérer les données de la table product_shop
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'

        );
    }
}
?>

Share this post


Link to post
Share on other sites

Merci pour la réponse,

 

J'ai mis le code dans le override, mais j'ai maintenant un message dans le back:

 

 

  • Mauvaise requête SQL
    Column 'available_for_order' in where clause is ambiguous

 

De quoi ça peut venir ?

Share this post


Link to post
Share on other sites

Quelle version de prestashop ?
( J'ai testé sur une 1.6.0.14 le code du message précédent sans erreur )
C'est le champ filter_key qui est important.

Share this post


Link to post
Share on other sites

Je viens de tester sur cette version et le code fonctionne très bien.
C'est la ligne :

'filter_key' => 'a!available_for_order',

 

qui permet d'éviter cette erreur.

Share this post


Link to post
Share on other sites

Je ne comprends pas ! 

Je viens de refaire le test avec ceci:

 

le fichier override:

<?php

class AdminProductsController extends AdminProductsControllerCore
{
 
    public function __construct()
    {
        parent::__construct();
 
        //Ajout du champs dans la liste des champs affichés dans l'amdin
        $this->fields_list['available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'available_for_order',
            'filter_key' => 'a!available_for_order', // remplace a par sa pour récupérer les données de la table product_shop
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'
 
        );
    }
}
?>
 
Voilà le résultat que me donne le BO:
 
 
  • Mauvaise requête SQL
    Column 'available_for_order' in where clause is ambiguous

Share this post


Link to post
Share on other sites

Effectivement au temps pour moi je n'avais pas testé le filtre jusqu'au bout.
En mettant le code suivant le filtrage fonctionne :


        $this->fields_list['a!available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'

        );

Par contre les images ne s'affichent plus.

Share this post


Link to post
Share on other sites

Résolu

 

Super !! il fonction impec! et j'ai les images aussi !

 

Merci beaucoup !

Share this post


Link to post
Share on other sites

Bonjour à tous,

 

Je relance ce sujet pour tenter de le mettre en œuvre, j'ai exactement le même besoin, celui d'afficher sur la liste des produits une colonne "Disponible à la vente".

Je ne suis pas développeur php et je n'ai pas beaucoup d'expérience de la surcharge.

 

- J'ai donc copié le fichier AdminProductsController.php dans le dossier override/controllers/admin/.

 

- J'ai essayé d'ajouter, dans ce fichier, le code tel quel, et j'ai une page blanche.

 

En tentant de comprendre le fichier AdminProductsController,

 

- j'ai essayé d'extraire du code proposé par Herve25, les lignes 

        //Ajout du champs dans la liste des champs affichés dans l'amdin
        $this->fields_list['available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order', // remplace a par sa pour récupérer les données de la table product_shop
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'
);

et de les mettre juste après la ligne 76 :

		parent::__construct();

Et là, la liste s'affiche bien, mais pas la colonne Dispo...

 

J'ai essayé différents trucs, soit je n'ai pas la colonne, soit j'ai un message erreur, soit une page blanche...

Je dois buter sur un problème de méthode de surcharge..

Je suis sur PS 1.6.0.14.

 

Vous avez une idée de ce que je ne fais pas bien ?

Merci pour votre aide.

Edited by pierrewebmaster (see edit history)

Share this post


Link to post
Share on other sites

Bonjour,

 

Essayez plutot avec le code du dernier message :

 $this->fields_list['a!available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'

        );

Lorsque vous faites une surcharge d'une classe inutile d'en reprendre tout le contenu.

Commencez uniquement avec ce code.

class AdminProductsController extends  AdminProductsControllerCore
{

}

Cordialement,

Share this post


Link to post
Share on other sites

Bonjour à tous

Merci herve25 pour cette réponse

 

Désolé pour le temps de réaction mais je dois aussi chercher un job :-(

 

Merci aussi pour le conseil de surcharge , mais je dois mal m'y prendre.

 

J'ai donc essayé de mettre dans mon fichier override/controllers/admin/AdminProductsController.php

class AdminProductsController extends AdminProductsControllerCore
{
	 $this->fields_list['a!available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'

        );
}

La liste des produits en BO m'affiche ça :

 

class AdminProductsController extends AdminProductsControllerCore { $this->fields_list['a!available_for_order'] = array( 'title' => $this->l('Dispo'), 'active' => 'a!available_for_order', 'filter_key' => 'a!available_for_order', 'align' => 'text-center', 'type' => 'bool', 'class' => 'fixed-width-sm', 'orderby' => 'false' ); }

 

J'ai essayé le code de rquantin avec votre correction comme ceci :

<?php
class AdminProductsController extends AdminProductsControllerCore
{
 
    public function __construct()
    {
        parent::__construct();
 
        //Ajout du champs dans la liste des champs affichés dans l'amdin
        $this->fields_list['a!available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'
        );
    }
}
?>

Et là, j'ai une page blanche.

 

Merci pour votre aide

PS 1.6.0.14

Share this post


Link to post
Share on other sites

Un petit up siouplait !

J'aurais vraiment besoin d'afficher une colonne Produits disponibles dans la liste des produits du BO et je suis une bille en php :mellow:

Auriez vous une idée pourquoi je n’arrive pas à surcharger cette liste ?

Pour vous rappeler ce à quoi j'arrive : soit une page blanche, soit l'affichage du code de la surcharge (post ci-dessus)

Merci de votre assistance

Share this post


Link to post
Share on other sites

Bonjour,

 

J'ai resté mon code, mais impossible de le faire fonctionner, malgré différents tests et modifications
Je ne sais pas si quelque chose à changé depuis, mais il faudra du coup chercher une autre piste.

Share this post


Link to post
Share on other sites

Bonjour, quand vous avez une page blanche c'est que vous avez des erreurs php, il faut donc afficher ces erreurs afin d'avoir des indices pour leurs résolutions...

Share this post


Link to post
Share on other sites

Excellente idée Alex

Ça me donne :
Fatal error: Class 'AdminProductsControllerCore' not found in /home/medianum/www/ps16test/override/controllers/admin/AdminProductsController.php on line 3

 

avec ce fichier override/controllers/admin/AdminProductsController.php :

<?php
class AdminProductsController extends AdminProductsControllerCore
{
 
    public function __construct()
    {
        parent::__construct();
 
        $this->fields_list['a!available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'

        );
    }
}
?>

J'ai un peu de mal à interpréter ce que cela signifie

Merci pour votre aide

Edited by pierrewebmaster (see edit history)

Share this post


Link to post
Share on other sites

Bonjour à tout hasard cela ne viendrais pas du '?>' en fin de ton fichier ?

 

Excellente idée Alex

Ça me donne :
Fatal error: Class 'AdminProductsControllerCore' not found in /home/medianum/www/ps16test/override/controllers/admin/AdminProductsController.php on line 3

 

avec ce fichier override/controllers/admin/AdminProductsController.php :

<?php
class AdminProductsController extends AdminProductsControllerCore
{
 
    public function __construct()
    {
        parent::__construct();
 
        $this->fields_list['a!available_for_order'] = array(
            'title' => $this->l('Dispo'),
            'active' => 'a!available_for_order',
            'filter_key' => 'a!available_for_order',
            'align' => 'text-center',
            'type' => 'bool',
            'class' => 'fixed-width-sm',
            'orderby' => 'false'

        );
    }
}
?>

J'ai un peu de mal à interpréter ce que cela signifie

Merci pour votre aide

Share this post


Link to post
Share on other sites

Oui effectivement, mais il n'est pas nécessairement géré dans le même fichier.

On peut notamment remarqué son absence des fichiers similaires à "AdminProductsController.php" comme (au hasard) "AdminCmsController.php".

On retrouve le "<?php" mais pas le "?>".

Cela n'est qu'une supposition qui peut ne pas changer grand chose.

En pretant attention aux détail de votre code, j'ai pensé qu'il pourrait être bien de tester le remplacement de la ligne:

"parent::__construct();"

par :

"AdminController::__construct();"

 

Cela reste plus proche de ce qui pourrait causer le message d'erreur "Fatal error: Class 'AdminProductsControllerCore' not found in /home/medianum/www/ps16test/override/controllers/admin/AdminProductsController.php on line 3"

Share this post


Link to post
Share on other sites

Bonjour GTraglia, bonjour à tous,

 

J'ai essayé donc sans le ?> et avec la modif "AdminController::__construct();"

Résultat quand j'appelle la liste des produits, il s'affiche ce qui me semble être le controler complet...

...et dans lequel je retrouve ce bout de code :

                                    [fields_list:protected] => Array
                                        (
                                            [a!available_for_order] => Array
                                                (
                                                    [title] => Dispo
                                                    [active] => a!available_for_order
                                                    [filter_key] => a!available_for_order
                                                    [align] => text-center
                                                    [type] => bool
                                                    [class] => fixed-width-sm
                                                    [orderby] => false
                                                )

                                        )

Cela veut-il dire que l'override s'intègre bien ? Peut-être une piste ?

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More