web-dev-qa-db-fra.com

Remarque: essayer d'obtenir la propriété d'un non-objet

Voici mon code:

function THEME_preprocess_block(&$variables) {
    $variables['user_profile'] = menu_get_object('user');
}

J'imprime le champ "nom" en utilisant print $user_profile->name, Et j'obtiens l'erreur suivante:

Remarque: Essayer d'obtenir la propriété d'un non-objet dans include () (ligne 71 de SITE\sites\all\themes\parce\block - block - 2.tpl.php).

J'ai supposé que $user_profile N'était pas un objet et j'ai essayé print render($user_profile['name']), ce qui m'a renvoyé:

Erreur fatale: impossible d'utiliser un objet de type stdClass

Que se passe-t-il? J'ai vérifié la référence Drupal référence API et menu_get_object() devrait me renvoyer un objet.

5
silkAdmin

Vous n'avez pas imprimé les numéros de ligne de la deuxième erreur, donc je ne sais pas s'ils se produisent sur la même ligne. Peut-être que votre avis vient d'autre chose.

Vous pouvez essayer d'imprimer la variable à l'aide de print_r, vardump, debug ou utilisez le module Devel qui crée des fonctions d'encapsulation comme dpm pour imprimer des variables avec Krumo.

Il devrait être impossible que la même variable soit un objet et ne soit pas un objet en même temps. Mais il est difficile d'en dire plus avec les informations que vous avez fournies.

Mise à jour:
D'après vos commentaires, je peux voir pourquoi vous obtenez les erreurs:

print $user_profile->field_country['und']['0']['value'];

Erreur >> Remarque: Index non défini: und ...

print $user_profile['field_country']['und']['0']['value'];

Fatal >> Impossible d'utiliser un objet de type stdClass comme tableau

Le problème que j'ai marqué dans le message d'erreur est que und n'est pas défini dans la valeur du champ. Donc $user_profile->field_country est ok mais $user_profile->field_country['und'] n'est pas défini. La raison pourrait être qu'il n'a pas de valeur définie ou que la langue du champ n'est pas indéfinie. Vous devriez comme je l'ai suggéré ci-dessus, imprimez la variable pour voir ce qu'elle contient.

4
googletorp

menu_get_object('user') vous renvoie un objet uniquement pour des URL spécifiques; si l'URL de la page où le bloc est visible est http://example.com/node/1 , la fonction ne vous renverra pas d'objet.

Comme indiqué dans la documentation:

menu_get_object() donne accès aux objets chargés par l'élément de routeur actuel. Par exemple, sur la page node /% node, le routeur charge l'objet% node et l'appel de menu_get_object() le renverra.

Dans votre cas, l'URL de la page doit correspondre à utilisateur /% utilisateur, comme dans le cas de http://example.com/user/1 , http://example.com/user/1/shortcuts , http://example.com/user/1/devel .

La fonction pourrait également ne pas retourner un objet lorsque le bloc est affiché dans une page de profil utilisateur et s'il y a des problèmes de chargement de l'objet utilisateur. Dans ce cas, la page de profil utilisateur ne serait pas correctement visualisée également, je suppose.

0
kiamlaluno