THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Ne sachant pas trop ce qui pose problème, j'ai renseigné ce titre là (en me disant qu'un jour quelqu'un qui aura la même erreur tomberait sur ce topic).

J'ai une loop qui ne fonctionne plus et je n'ai aucune idée pourquoi. Elle fait partie d'un module où il y a deux tables anciennement reliées entre elles par un champ que j'ai retiré récemment (et qui se trouvait dans l'autre table, pas celle qui pose problème). La loop en question :

class DimensionGroup extends BaseLoop implements PropelSearchLoopInterface {

    public $countable = true;
    public $timestampable = false;
    public $versionable = false;

    public function getArgDefinitions()
    {
        return new ArgumentCollection(
            Argument::createIntListTypeArgument("content", null, true)
        );
    }

    /**
     * @return CiterneoDimensionGroupQuery
     */
    public function buildModelCriteria() {
        $q = DimensionGroupQuery::create();
        $q->filterByContentId($this->getArgValue("content"));
        return $q;
    }

    public function parseResults(LoopResult $loopResult)
    {
        foreach ($loopResult->getResultDataCollection() as $dg) {
            $loopResultRow = new LoopResultRow($dg);
            $loopResultRow->set("ID", $dg->getId());
            $loopResultRow->set("CONTENT_ID", $dg->getContentId());
            $loopResultRow->set("APPLICATION", $dg->getApplication());
            $loopResultRow->set("VOLUME_MIN", $dg->getVolumeMin());
            $loopResultRow->set("VOLUME_MAX", $dg->getVolumeMax());
            $loopResult->addRow($loopResultRow);
        }
        return $loopResult;
    }

}

Le seul changement que cette loop a subi, c'est le rajout d'un champ "application", je n'ai pas touché aux méthodes "getArgDefinitions()" et "buildModelCriteria()".

Son utilisation dans le template ($contentId c'est le contenu Thelia dans lequel je me trouve et il a bien une valeur, pas de soucis de ce côté là) :

{loop type="dimension_group" name="content_dimension_groups" content=$contentId}
        {assign "groupApplication" $APPLICATION}
        {assign "min" $VOLUME_MIN}
        {assign "max" $VOLUME_MAX}
        <div class="dimension-group">
            <div class="heading">
                <div class="heading-label">
                    {intl l="From %min m<sup>3</sup> to %max m<sup>3</sup>" d="fo.citerneo" min=$VOLUME_MIN max=$VOLUME_MAX}
                </div>
                <div class="icon"></div>
                <div class="clearfix"></div>
            </div>
            <table class="content table text-center">
                <tr>
                    <th>{intl l="Volume" d="fo.citerneo"}</th>
                    <th>{intl l="Longueur" d="fo.citerneo"}</th>
                    <th>{intl l="Largeur" d="fo.citerneo"}</th>
                    <th>{intl l="Hauteur" d="fo.citerneo"}</th>
                </tr>
                {loop type="dimension" name="content_dimensions"}
                    {if $APPLICATION == $groupApplication}
                        {if $VOLUME <= $max && $VOLUME >= $min}
                            <tr>
                                <td>{$VOLUME} m<sup>3</sup></td>
                                <td>{format_number number=$LENGTH decimals="2"} m</td>
                                <td>{format_number number=$WIDTH decimals="2"} m</td>
                                <td>{format_number number=$HEIGHT decimals="2"} m</td>
                            </tr>
                        {/if}
                    {/if}
                {/loop}
            </table>
        </div>
        {/loop}

Et le message d'erreur entier :

Call to a member function addArguments() on null in ...\core\lib\Thelia\Core\Template\Element\BaseLoop.php on line 133

Une idée de ce qui ne va pas ? hmm

Last edited by HeishPi (05-07-2019 09:46:46)


Développeur web Junior

Offline


Sans la stack trace complète ça ne va pas être possible de t'aider.


OpenStudio Toulouse

Offline


Je ne sais malheureusement pas quoi te fournir de plus. Le problème se trouve sur une page de contenu qui appelle un autre petit template qu'on a et qui nous sert à afficher des tableaux (il contient la loop que j'ai montré précédemment).
Les logs n'affichent rien, j'ai simplement cette erreur directement sur le template :

Call to a member function addArguments() on null in ...\core\lib\Thelia\Core\Template\Element\BaseLoop.php on line 133

Après vérification, cette ligne dans BaseLoop.php est la suivante :

$this->args = $this->getArgDefinitions()->addArguments($this->getDefaultArgs(), false);

À la limite je peux te montrer à quoi ressemble les deux tables via le fichier schema.xml :

<table name="dimension_group" namespace="Dimension\Model">
        <column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />
        <column name="content_id" type="INTEGER" required="true" />
        <column name="application" type="VARCHAR" required="true" />
        <column name="volume_min" type="INTEGER" required="true" />
        <column name="volume_max" type="INTEGER" required="true" />
        <foreign-key foreignTable="content" name="fk_content_id">
            <reference local="content_id" foreign="id" />
        </foreign-key>
    </table>
    
    <table name="dimension" namespace="Dimension\Model">
        <column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />
        <column name="application" type="VARCHAR" required="true" />
        <column name="volume" type="FLOAT" required="true" />
        <column name="length" type="FLOAT" required="true" />
        <column name="width" type="FLOAT" required="true" />
        <column name="height" type="FLOAT" required="true" />
    </table>

EDIT : Finalement le problème venait de la loupe "dimension", celle qui est imbriquée dans la première loop. Le problème se trouvait directement dans sa classe. La voici :

class Dimension extends BaseLoop implements PropelSearchLoopInterface {

    public $countable = true;
    public $timestampable = false;
    public $versionable = false;

    public function getArgDefinitions()
    {
        return new ArgumentCollection(
            Argument::createAlphaNumStringListTypeArgument('application', null, true)
        );
    }

    /**
     * @return DimensionQuery
     */
    public function buildModelCriteria() {
        $q = CiterneoDimensionQuery::create();
        $q->filterByApplication($this->getArgValue("application"));
        return $q;
    }
    
    public function parseResults(LoopResult $loopResult)
    {
        foreach ($loopResult->getResultDataCollection() as $d) {
            $loopResultRow = new LoopResultRow($d);
            $loopResultRow->set("ID", $d->getId());
            $loopResultRow->set("APPLICATION", $d->getApplication());
            $loopResultRow->set("VOLUME", $d->getVolume());
            $loopResultRow->set("LENGTH", $d->getLength());
            $loopResultRow->set("WIDTH", $d->getWidth());
            $loopResultRow->set("HEIGHT", $d->getHeight());
            $loopResult->addRow($loopResultRow);
        }
        return $loopResult;
    }

}

Je viens de la modifier, je n'ai plus mon erreur et tout s'affiche correctement. C'était ma fonction buildModelCriteria() qui n'était pas bonne.

Last edited by HeishPi (05-07-2019 09:45:00)


Développeur web Junior

Offline


Voilà pourquoi je voulais la trace de l'exception. Les problèmes ne viennent pas forcément de là où on le croit.


OpenStudio Toulouse

Offline


Ne sachant pas exactement ce que t'entends par là, j'ai donné ce que j'ai pu ! Problème réglé de toute façon, je passe en [RESOLU] wink Merci tout de même !


Développeur web Junior

Offline


C'est justement la page Wikipedia sur laquelle je me suis retrouvé, mais je connaissais pas la fonction PHP qui permettait de le faire. Et quitte à chercher, je me suis dis "autant continuer à tenter des trucs tout seul, je vais bien finir par trouver" tongue


Développeur web Junior

Offline


Avec les bons outils tu trouves bien plus vite.


OpenStudio Toulouse