Jump to content
spip93

Erreur "Trying to get property of non-object"

Recommended Posts

Bonjour à tous et à toutes,

En regardant dans les logs errors d'un des sites que j'administre, sous Prestashop 1.6.1.5, j'ai plusieurs erreurs dont celle-ci :

Trying to get property of non-object in /home/xxxxxxx/www/xxxxxxx/classes/Tools.php on line 1222

Et voici les lignes de codes du fichier tools.php :

public static function getAdminTokenLite($tab, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }
        return Tools::getAdminToken($tab.(int)Tab::getIdFromClassName($tab).(int)$context->employee->id);
    }

(La ligne 1222 étant la ligne commençant par return Tools)

J'ai le même problème que Kerlin il y a quelques jours

Sauriez-vous quel est le problème et surtout comment le régler SVP ?

D'avance merci

Share this post


Link to post
Share on other sites

A votre avis, quel est l'objet concerné dans cette ligne ?

Share this post


Link to post
Share on other sites

Ben non moi je vois 

$context->employee->id

donc soit pas de context (peu probable) soit pas d'employé (plus crédible) donc un module ou un bout de code qui cherche un employée là où il n'y en a pas^^ ou un fichier ajax mal écrit

Share this post


Link to post
Share on other sites

Comment je peux retrouver "le module ou le bout de code qui cherche un employée là où il n'y en a pas" ? Et ensuite (si et quand je retrouve le module ou le bout de code en question) ? Qu'est-ce que je dois faire ?

Est-ce que je pourrais supprimer le bout de code qui pose problème ?

.(int)$context->employee->id

Share this post


Link to post
Share on other sites

Euh... je ne suis pas dans votre boutique...

- Commencer par activer le mode debug qui vous en dira plus sur la pile d'appel

- Suivant la page où l'erreur survient, regarder les modules qui y sont liés

- depuis quand l'erreur est arrivée ? Quelles modifications/ajouts/amj ont été effectuées ?

Share this post


Link to post
Share on other sites

J'ai (peut-être) trouvé une solution.

Comme ça bloque quand

$context->employee->id

est appelé, je me suis dit qu'il fallait lui donner un id d'employé.

Le problème c'est que comme tools.php est dans le dossier classes, si je fais une modif dans ce fichier, ça sautera à la première MAJ de Presta (même si je compte pas en faire de sitôt).

Pour éviter ça,  dans /override/classes, j'ai créé un fichier tools.php

Dans ce fichier tools.php, j'ai mis le code suivant :

<?php

class Tools extends ToolsCore
{
    public static function getAdminTokenLite($tab, Context $context = null)
    {
        $id_employe = Db::getInstance()->getValue('SELECT `id_employee` FROM `ps_employee` WHERE `lastname`=\'Nom_employe\'');
    
        if (!$context) {
            $context = Context::getContext();
        }
        
        if(empty($context->employee)) {
            $context->employee = new Employee($id_employe);
        }
        
        return Tools::getAdminToken($tab.(int)Tab::getIdFromClassName($tab).(int)$context->employee->id);
    }
}

Ensuite, pour que l'override soit pris en compte, je suis allé dans /cache/ et j'ai supprimé le fichier class-index.php (que Presta a regénéré derrière).

Ça a l'air de fonctionner.

J'espère que ça aidera d'autres personnes ;)

Bonne journée

Share this post


Link to post
Share on other sites

Ben oui mais ce n'est pas la vraie solution, il faudrait mieux trouver le fichier ajax incorrect et le corriger...

Share this post


Link to post
Share on other sites

Bonjour,
Je m'immisce dans ce poste car j'ai un problème similaire. Voici les erreurs que j'ai :

Et voici les 2 lignes en question dans le fichier file.product.tpl.php :

<?php $_smarty_tpl->tpl_vars['featureName'] = new Smarty_variable((($_smarty_tpl->tpl_vars['featureName']->value).($_smarty_tpl->tpl_vars['feature']->value['name'])).("x"), null, 0);?>

<?php $_smarty_tpl->tpl_vars['featureValue'] = new Smarty_variable((($_smarty_tpl->tpl_vars['featureValue']->value).($_smarty_tpl->tpl_vars['feature']->value['value'])).("x"), null, 0);?>

Ce que je comprends pas c'est que les erreurs sont dans file.product.tpl.php alors que la page de référence (https://www.wikao.fr/7-tableaux-peinture) est une page catégorie. Les erreurs en question devraient soit se situer dans file.product-list.tpl.php soit faire référence à une page produit, PAS une page catégorie, non ?

Qu'est-ce que vous en pensez ? Comment je peux corriger ces 2 erreurs ?

Share this post


Link to post
Share on other sites

C'est normal, le referer indique d'où vient l'internaute, donc il arrive d'une page catégorie et a cliqué sur un produit.

Dans votre product.tpl il faut vérifier que la variable existe avant de l'utiliser...

{if isset($featureName)} .... {/if}

ou

{if !empty($featureName} ... {/if} et pareil pour l'autre variable $featureValue

Share this post


Link to post
Share on other sites

Ok, ça marche. Merci !
 

Par contre, dans le fichier product.tpl, j'ai pourtant ceci :

{if isset($features) && $features}
			<!-- Data sheet -->
			<section class="page-product-box">
				<h3 class="page-product-heading">{l s='Data sheet'}</h3>
				<table class="table-data-sheet">
                	{$dimensionsname = ''}
                    {$dimensionsvalue = ''}
					{foreach from=$features item=feature}
					
						{if isset($feature.value)}
                            {if ($feature.name=="Hauteur (en cm)") OR ($feature.name=="Largeur (en cm)") OR ($feature.name=="Profondeur (en cm)")}
                                {$feature.name=$feature.name|substr:0:4|cat:"."}
                                {$featureName=$featureName|cat:$feature.name|cat:"x"}
                                {$featureValue=$featureValue|cat:$feature.value|cat:"x"}
                            {elseif $feature.name=="Dimensions (en cm)"}
                            	{$otherdimensionName=$feature.name|escape:'html':'UTF-8'}
                                {$otherdimensionValue=$feature.value|escape:'html':'UTF-8'}
                            {else}
                            <tr class="{cycle values="odd,even"}">
                                <td>{$feature.name|escape:'html':'UTF-8'}</td>
                                <td>{$feature.value|escape:'html':'UTF-8'}</td>
                            {/if}
                            </tr>
                        {/if}
					
                    
					{/foreach}
                    <tr class="{cycle values="odd,even"}">
                    {if $featureValue!=""}
                        <td>Dimensions en cm ({$featureName|substr:0:-3})</td><td>{$featureValue|substr:0:-1}</td>
                    {/if}
                    </tr>
				</table>
			</section>

J'ai pourtant des if isset, alors pourquoi ces erreurs ?

Share this post


Link to post
Share on other sites

Ben c'est du code maison pas trop bien écrit ça...

 {$featureName=$featureName|cat:$feature.name|cat:"x"}

A quel moment $featureName est assigné/déclaré dans votre code ?

$toto = $toto + 'texte';

What is $toto ?

Share this post


Link to post
Share on other sites

Désolé, c'est mon prédécesseur qui a écrit ça => j'hérite d'un site en partie bugué

Du coup, après

{$dimensionsname = ''}
{$dimensionsvalue = ''}

et avant

{foreach from=$features item=feature}

J'ai mis ceci :

{$featureName = ''}
{$featureValue = ''}

Par contre, depuis je n'ai plus l'erreur dans file.product.tpl.php, mais j'ai l'impression que ça a déplacé le problème, parce que depuis que j'ai mis ça, j'ai le nombre d'erreurs suivantes qui a augmenté :

  • Undefined index: featureName in /home/wikao/www/www.wikao.fr/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 738
  • Trying to get property of non-object in /home/wikao/www/www.wikao.fr/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 738
  • Undefined index: featureValue in /home/wikao/www/www.wikao.fr/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 739
  • Trying to get property of non-object in /home/wikao/www/www.wikao.fr/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()'d code on line 739

Avec, les lignes de code suivantes entre les lignes 722 et 739 dans le fichier smarty_internal_templatebase.php :

/**
     * Return internal filter name
     *
     * @param  callback $function_name
     *
     * @return string   internal filter name
     */
    public function _get_filter_name($function_name)
    {
        if (is_array($function_name)) {
            $_class_name = (is_object($function_name[0]) ?
                get_class($function_name[0]) : $function_name[0]);

            return $_class_name . '_' . $function_name[1];
        } else {
            return $function_name;
        }
    }

Je vois pas où est le rapport entre featureName et featureValue et le code ci-dessus.

Avez-vous une idée ? Est-ce qu'il y a un lien de cause à effet entre les erreurs dans product.tpl et celles (maintenant) dans smarty_internal_templatebase.php ?

Edited by wikao (see edit history)

Share this post


Link to post
Share on other sites

Il faut revoir vos bases et comment on assigne une variable Smarty dans un tpl...

{assign var="featureName" value=""}

Share this post


Link to post
Share on other sites

Pour revoir les bases encore faut-il que je les ai. Je suis déjà débutant en PHP, alors en smarty ... C'est un copain développeur qui m'a soufflé ces lignes de codes.

Si je savais suffisamment développer, je ne serais pas ici à poser mes questions à la c... et les sites que j'administre ne seraient pas sous Presta mais en full PHP.

(Ne le prenez pas mal, mais) Je vous remercie d'en tenir compte quand vous répondez aux posts (pas seulement aux miens), parce que ce qui peut vous paraitre évident/élémentaire, ou comme faisant partie des "bases", ne l'est pas (forcément) pour nous autres, pauvres mortels, souvent débutants.

Ceci étant, merci pour votre aide ;)

Share this post


Link to post
Share on other sites

Ok, alors la doc Smarty elle est là https://www.smarty.net/docsv2/en/

Ce qui me surprend toujours ce sont les gens qui écrivent du code et viennent nous dire "Ca ne fonctionne pas"

Moi je n'ai qu'un regard extérieur et j'ignore votre pédigrée mais je lis le code que vous nous soumettez et ce que je vois m'inquiète plus qu'autre chose...

Perso je n'ai jamais fait d'étude en informatique, mais avant d'écrire quoi que ce soit j'ai essayé de comprendre en observant le code existant et en lisant les docs. La base du truc, c'est la logique :) 

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