• Home
  • Blog
  • Joomla!
  • Solucionando o erro "Serialization of 'SimpleXMLElement' is not allowed"

Solucionando o erro "Serialization of 'SimpleXMLElement' is not allowed"

Usando o Joomla 2.5 com o Zend Server, ao tentar criar um novo módulo, me deparei com o seguinte erro:

500 - An error has occurred.
Serialization of 'SimpleXMLElement' is not allowed

Estranhamente, este erro ocorria algumas vezes, outra não.

O erro é disparado pelo método JArrayHelper::sortObjects(...), no uso da função usort(). Conforme algumas recomendações, utilizei a prática não muito saudável de usar o operador @, que obriga o server a ignorar mensagens de erro disparadas por um comando. O código da função ficou assim:

/**
 * Utility function to sort an array of objects on a given field
 *
 * @param   array  &$a             An array of objects
 * @param   mixed  $k              The key (string) or a array of key to sort on
 * @param   mixed  $direction      Direction (integer) or an array of direction to sort in [1 = Ascending] [-1 = Descending]
 * @param   mixed  $caseSensitive  Boolean or array of booleans to let sort occur case sensitive or insensitive
 * @param   mixed  $locale         Boolean or array of booleans to let sort occur using the locale language or not
 *
 * @return  array  The sorted array of objects
 *
 * @since   11.1
 */
public static function sortObjects(&$a, $k, $direction = 1, $caseSensitive = true, $locale = false)
{
	if (!is_array($locale) or !is_array($locale[0]))
	{
		$locale = array($locale);
	}
	self::$sortCase = (array) $caseSensitive;
	self::$sortDirection = (array) $direction;
	self::$sortKey = (array) $k;
	self::$sortLocale = $locale;
	// -------[ BUGFIX ]-----------------------------------------
	// Adicionei o operador '@', para ignorar mensagens de erro
	// geradas por este comando
	@usort($a, array(__CLASS__, '_sortObjects'));
	// ----------------------------------------------------------
	self::$sortCase = null;
	self::$sortDirection = null;
	self::$sortKey = null;
	self::$sortLocale = null;
	return $a;
}