J'ai récemment migré mon module vers Drupal7 (sur la version PHP 5.3.1) et maintenant je reçois les erreurs suivantes:
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
J'ai également essayé de mettre à niveau d'autres modules et noyau vers les dernières versions mentionnées ici http://drupal.org/node/1022736
entité 7.x-1.x-dev (2011-jan-24), vues 7.x-3.x-dev (2011-jan-22), Drupal core 7.x-dev ( 24 janvier 2011), Profil2 7.x-1.0-beta1, Références 7.x-2.x-dev (2011-janv.-14), Outils ..x-1.0- alpha2
Je ne suis pas capable de comprendre ce qui cause exactement cette erreur?
Modifier:
Selon http://php.net/manual/en/function.array-flip.php ,
array_flip () retourne un tableau dans l'ordre inverse, c'est-à-dire les clés de trans deviennent des valeurs et les valeurs de trans deviennent des clés.
Notez que les valeurs de trans doivent être des clés valides, c’est-à-dire des nombres entiers ou des chaînes. Un avertissement sera émis si un La valeur de la valeur est incorrecte et la paire clé/valeur en question ne le sera pas être retourné.
J'ai fait la var_dump($ids);
avant la ligne 178 dans entity.inc ($passed_ids = !empty($ids) ? array_flip($ids) : FALSE;
)
Et il me semble que la paire clé/valeur est toujours au format correct (?).
array
0 =>
array
'nid' => string '6' (length=1)
array
0 =>
array
'uid' => string '1' (length=1)
array
0 => string '0' (length=1)
array
0 =>
array
'nid' => string '7' (length=1)
array
0 =>
array
'nid' => string '4' (length=1)
array
0 =>
array
'nid' => string '8' (length=1)
La cause la plus courante de cette erreur est l'utilisation d'une fonction something_load () avec un tableau en argument. Ceci n'est plus supporté car les fonctions load_multiple () doivent maintenant être utilisées pour cela.
Exemple en D6:
<?php
// Using array with the id was already discouraged in D6 but still worked.
$user = user_load(array('uid' => 1));
$user = user_load(array('name' => 'admin'));
?>
Drupal 7:
<?php
// Argument to a load() function *must* be a single id
$user = user_load(1);
// Querying for another attribute is a bit more complex.
// Note that using reset(user_load_multiple() directly is not E_STRICT compatible.
$users = user_load_multiple(array(), array('name' => 'admin'));
$user = reset($users);
?>
Ainsi, le moyen le plus simple d’attraper ces problèmes est de rechercher "_load (array").
J'ai rencontré la même erreur array_flip ce week-end en essayant de mettre à niveau un module personnalisé vers Drupal 7. Le problème est qu'un tableau imbriqué est en train d'être transmis à DrupalDefaultEntityController, mais il attend un tableau simple d'entiers ou de chaînes. Dans mon cas, je passais dans un tableau imbriqué à EntityFieldQuery, alors qu'il ne voulait qu'un tableau d'entiers.
Pour mieux retrouver le code qui appelle DrupalDefaultEntityController, essayez d'insérer ce qui suit avant la ligne 178 dans entity.inc:
drupal_set_message(var_export(debug_backtrace(), TRUE));
... ou de préférence, installez le module Devel et essayez d'insérer les éléments suivants:
dpm( debug_backtrace() );
Le problème se pose lorsque vous utilisez l'accès au champ Groupes organiques (Groupes organiques 7.x-1.3)
Vous pouvez généralement désactiver ce sous-module, sauf si vous effectuez un contrôle d'accès au niveau du champ avec OG.
Cela peut également arriver lorsque vous appelez entity_load avec un tableau qui n'est pas un tableau d'identificateurs d'entité comme second argument - voir http://api.drupal.org/api/drupal/includes--common.inc/function/ entity_load/7 et http://drupal.org/node/1160566 pour comprendre pourquoi.
Vu un problème similaire dans notre utilisation du dernier module page_title. Pour l'instant, nous venons de désactiver le module et l'erreur a été corrigée.
Voir: http://www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/
Cela pourrait être un problème de codage incorrect (par exemple, charger des entités non valides ou exécuter un ancien code Drupal 6 dans Drupal 7):
Dépannage:
print_r(debug_backtrace())
,gitk
, git log --patch
, etc.).drush --contrib --no-empty --upgrade7x coder-review
).Sinon, vous pouvez déboguer votre code en définissant le hook temporaire suivant:
/**
* Implements hook_watchdog().
*/
function foo_watchdog($log_entry) {
if ($log_entry['type'] == 'php' && $log_entry['severity'] <= WATCHDOG_WARNING) {
// Old school
var_dump(debug_backtrace()); // Optionally add: exit();
// Devel: Log the backtrace into temporary file: drupal_debug.txt
// Locate via: $ drush eval "echo file_directory_temp() . '/drupal_debug.txt'"
function_exists('dd') && dd(debug_backtrace());
}
}
Effacez le cache avant de le tester.
Il va imprimer la trace sur chaque avertissement ou erreur PHP avec des arguments, de sorte que vous puissiez trouver vos paramètres non valides qui ont été passés dans le noyau de Drupal.
Utilisez-vous le module d'insertion? Voir http://drupal.org/node/850946 .
En ce qui concerne des erreurs spécifiques telles que celle-ci, je pense que vous feriez mieux de chercher dans la file d'attente des problèmes sur drupal.org que de demander à SO.
Exemple de bon usage:
<?php
$user=user_load(arg(1));
$username=$user->name;
print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username));
?>
J'ai également reçu ce message lorsque je tentais par erreur de charger plusieurs nœuds via node_load_multiple ($ nids), où $ nids n'était pas un tableau d'identificateurs de nœud.
Par exemple, en utilisant le résultat d'un EntityFieldQuery et en appelant node_load_multiple ($ result ['node']) au lieu de node_load_multiple (array_keys ($ result ['node'])).