Jump to content

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

Link to comment
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 

Link to comment
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'

        );
    }
}
?>
Link to comment
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
Link to comment
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.

Link to comment
Share on other sites

  • 2 months later...

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)
Link to comment
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,

Link to comment
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

Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
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)
Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
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"

Link to comment
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 ?

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