THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Je souhaiterai ajouter au menu du back office un nouvel onglet déroulant (comme pour les orders).
Cet onglet listera si les produits sont publiés ou non, il y aura donc deux sous partie à mon onglet (published products et unpublished products, qui chacun aura une liste de produits selon sa visibilité).
Cependant pour le réaliser, j'ai du mal pour faire mon loop afin d'avoir ma liste composé de mes deux sous parties (qui seront basés sur la donnée "visible" en bd).

Merci d'avance pour votre aide.

Offline


j'ai du mal pour faire mon loop afin d'avoir ma liste composé de mes deux sous parties (qui seront basés sur la donnée "visible" en bd

Ce n'est pas clair.

Quelles sont les données manipulées par cette boucle ?


OpenStudio Toulouse

Offline


J'aurai aimé que mes sous parties puissent lister les produits en fonction de leur visibilités (0 ou 1, s'il sont publié ou non).
Je voulais d'abord afficher ces sous partie dans le menu a l'aide d'une loop  comme les sous parties de Orders (je ne suis pas sûre que je doivent suivre le même fonctionnement) .Cependant je ne sais pas comment m'y prendre pour afficher ces sous partie qui permetrai d'avoir le listing de produit.

Offline


Tu peux utiliser {count ... } (même syntaxe que {loop ... }) pour compter les produits.

Pour afficher les produits dans tes pages, une simple boucle produit fera l'affaire. La documentation est là : http://doc.thelia.net/en/documentation/ … oduct.html


OpenStudio Toulouse

Offline


Merci,
J'ai testé avec ce count
{count type="product" category="*" backend_context="1"}
Mais en mettant * pour recupérer les produits de toutes les category une erreur est retourné "invalid value for category"
Lorsque je met un id d'une category cela fonctionne.

Offline


'*' n'est pas une valeur valide pour le paramètre category.

Pour ne pas filtrer par catégorie, et donc obtenir les produits de toutes les catégories, il suffit de ne pas indiquer le paramètre "category".

Par contre, le paramètre "visible" devrait t'être utile, si j'ai bien tout compris.


OpenStudio Toulouse

Offline


Bonjour,

J'aurai aimé ajouter à ma liste, en plus de "visible" et "non visible", une sous catégorie "en attente" qui listera les produits en attentes de publication, cependant le paramètre "visible" est un boolean à 0 ou 1. je voudrais pouvoir modifier la valeur pour ajouter par exemple un 2 qui indiquerai la visibilité en attente.

Merci.

Offline


Tu dois écrire un module pour faire ça.


OpenStudio Toulouse

Offline


Est-ce que vous pourriez me donner des pistes sur la conception de ce module ? Dois-je créer un nouveau paramètre ?
Je ne vois pas trop comment m'y prendre...
Pour l'instant (sans module) je peux ajouter en bd la valeur 2 mais je ne peux pas la récupérer car elle n'est pas considérer comme valide dans le paramètre 
[Invalid value "2" for "visible" parameter in loop type: product, name: product_list]

Offline


Il faut créer un module qui va prendre en charge cette valeur supplémentaire, dans une table spécifique


OpenStudio Toulouse

Offline


Comment créer ce module, ce n'est pas très clair pour moi...
Que voulez-dire par table spécifique ? Le paramètre visible est dans la table product ...
Quels fichiers dois-je modifier (le loop product où le type est défini en "BooleanOrBothTypeArgument" ?) ou ajouter ? Pourrais-je avoir des indications sur le code ?

Offline


Il faut coder un module qui va gérer une table dans laquelle sera stocké ce nouvel été du produit. Il faudra ensuite utiliser les hooks du back-office pour permettre la saisie.


OpenStudio Toulouse

Offline


Je ne souhaite pas faire de "saisie" de cet état, je voudrait qu'à la création d'un produit que sa visibilité soit par défaut "en attente" (cet état serai par exemple à 2), afin de choisir plus tard si on le publie ou non.
Le problème vient du faite que, lorsque je fait mon test afin de récupérer l’état en bd et afficher le produit dans la bonne catégorie en fonction de sont état, la valeur 2 n'est pas valide et me retourne donc l'erreur suivante : [Invalid value "2" for "visible" parameter in loop type: product, name: product_list]

Voici le test afin d'afficher les produits selon leur état (publié, non publié et en attente) dans chaque catégorie.
<li role="menuitem">
                <a class="clearfix"  href="{url path="admin/product_visibility" visible="1"}">
                    <span class="pull-left">{intl l="Published Products"}</span>
                    <span class="label label-default pull-right">{count type="product" visible="1" backend_context="1"}</span>
                </a>
            </li>
            <li role="menuitem">
                <a class="clearfix" href="{url path="admin/product_visibility" visible="0"}"">
                    <span class="pull-left">{intl l="Unpublished Products"}</span>
                    <span class="label label-default pull-right">{count type="product" visible="0" backend_context="1"}</span>
                </a>
            </li>
            <li role="menuitem">
                <a class="clearfix" href="{url path="admin/product_visibility" visible="2"}">
                    <span class="pull-left">{intl l="Pending Products"}</span>
                    <span class="label label-default pull-right">{count type="product" visible="2" backend_context="1"}</span>
                </a>
            </li>

Offline


Saisie ou pas, à moins de modifier le schéma de la base de données, le mapping Propel de la table product, la boucle Product (ce qui te couperais des mises à jour futures de Thelia), tu ne peux pas transformer magiquement un booléen (true/false) en entier (0, 1, 2).

Tu n'as pas d'autre choix que de gérer cet état non-standard dans une table spécifique, dans un  module. Pour écrire un module: http://doc.thelia.net/en/documentation/ … index.html

Je ne vois pas quoi te dire d'autre.


OpenStudio Toulouse

Offline


J'ai essayé d'ajouter ceci dans mon module Provider.
J'ai donc ajouter la fonction getHooks dans ma classe Provider :

class Provider extends BaseModule
{
    public function getHooks()   {
        return array(

            // Only register the title in the default language
            array(
                "type" => TemplateDefinition::BACK_OFFICE,
                "code" => "my_super_hook_name",
                "title" => "My hook",
                "description" => "My hook is really, really great",
            ),
        );
    } 

J'ai ajouté le config xml :

<hooks>
        <hook id="provider.hook.MyHook" class="Provider\Hook\MyHook" scope="request">
            <tag name="hook.event_listener" event="product.visibility" type="backoffice" method="onVisibility" />
        </hook>
    </hooks>

J'ai ensuite crée mon hook mais je ne sais pas vraiment ce à quoi va servir la fonction du hook ? :

class MyHook extends BaseHook
{
    public function onVisibility(HookRenderEvent  $event)
    {
        
    }
}

J'ai ensuite ajouté une colonne pending_visibility à la table Product (pending_visibility est par defaut à 1 et si visible est mis à 1 alors pending_visibility passera à 0 et il restera à 0 si visible est à 0 ce qui donne ça pour l'affichage dans chaque categorie :

  <li role="menuitem">
                <a class="clearfix"  href="{url path="admin/product_visibility" visible="1"}">
                    <span class="pull-left">{intl l="Published Products"}</span>
                    <span class="label label-default pull-right">{count type="product" visible="1" backend_context="1"}</span>
                </a>
            </li>
            <li role="menuitem">
                <a class="clearfix" href="{url path="admin/product_visibility" visible="0" pending_visibility="0"}"">
                    <span class="pull-left">{intl l="Unpublished Products"}</span>
                    <span class="label label-default pull-right">{count type="product" visible="0" backend_context="1"}</span>
                </a>
            </li>
            <li role="menuitem">
                <a class="clearfix" href="{url path="admin/product_visibility" visible="0" pending_visibility="1"}">
                    <span class="pull-left">{intl l="Pending Products"}</span>
                    <span class="label label-default pull-right">{count type="product" visible="0" pending_visibility="1" backend_context="1"}</span>
                </a>
            </li> 

)

Mais comment faire pour que mon parametre pending_visibility="1" soit pris en compte et comment puis-je récupérer les valeurs en bd ?

Offline


J'ai ensuite ajouté une colonne pending_visibility à la table Product

Il ne faut pas modifier une table du core de Thelia.

Il faut gérer cette information dans une table gérée par ton module.


OpenStudio Toulouse

Offline


J'ai maintenant créé une nouvelle table dans le shema xml et generer le model .

<?xml version="1.0" encoding="UTF-8"?>
<database defaultIdMethod="native" name="thelia"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="../../../core/vendor/propel/propel/resources/xsd/database.xsd" >

    <!-- See propel documentation on http://propelorm.org for all information about schema file-->

    <table name="pending_product" namespace="Provider\Model">
        <column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />

        <column defaultValue="1" name="pending_visibility" required="true" type="TINYINT" />

        <column name="product_id" required="true" type="INTEGER"/>
        <foreign-key foreignTable="product" name="fk_product_id" onDelete="CASCADE" onUpdate="RESTRICT">
            <reference foreign="id" local="product_id" />
        </foreign-key>

    </table>

    <external-schema filename="local/config/schema.xml" referenceOnly="true" />\
</database>

Comment faire pour que dans la table il y ai les id des produits existant et que les id des produits en création s'ajoutent aussi ?
et au niveau du hook que dois-je ajouter ? est-ce lui qui permettra que mon parametre pending_visibility="1" soit pris en compte ?