2011-03-17 23 views
9

Después de haber escrito algunas clases de ayuda en Magento, ahora tengo este problema, estoy consiguiendo este errorMagento no encontrado

Fatal error: Clase 'Zend_Log' no se encuentra en aplicación \ code \ Local \ Uhma \ programa \ ayudante \ Data.php en la línea 33

en la línea 33 que tengo esta

function WBSAPI_OnceProbe() 
{ 
    return ($this->WBSAPI_CurlCall ("once?action=probe" , &$result));//LINE 33 
} 

la función que estoy llamando con el regreso es este

function WBSAPI_CurlCall ($service , &$result=null) 
{ 
    try { 
     $s = curl_init(); 
      curl_setopt($s,CURLOPT_URL,MYWBSAPIURL.$service); 
      curl_setopt($s,CURLOPT_POST,false); 
      curl_setopt($s, CURLOPT_RETURNTRANSFER, 1); 
      $output = curl_exec($s); 
      curl_close($s); 
     $result = json_decode ($output , TRUE); 
     if (!is_array($result)) return (false); 
     if (!key_exists('status',$result)) return (false); 
     if ($result['status'] != 0) return (false); 

     return (true); 
    } catch (Exception $e) { 
     return (false); 
    } 
} 

he estado en Google durante un tiempo, algunos dicen que es una función en mi ayudador que es sobrescribir una función a partir de magento, puse WBSAPI_ a todos mis funciones en el comienzo, así, no puede ser la causa, me siguen dando el mismo error y no sé qué más para intentar, necesita un poco de ayuda aquí

si puede ayudar, tengo algunas otras definiciones en mi archivo, algo como esto

define ('MYWBSAPIURL','wbsapi.withings.net/'); 
define ('MYAPIURL','scalews.withings.net/cgi-bin/'); 

define ('pound',0.453592); 
define ('inch', 0.0254); 
class Uhma_Program_Helper_Data extends Mage_Core_Helper_Abstract{ 
    //CLASS CONTENT 
} 

gracias

Respuesta

21

La razón por la que está recibiendo ese error es

  1. tiene código PHP que produce advertencias
  2. Magento se ejecuta con el manejo de errores manivela hasta 11
  3. Magento intenta registrar el error, y pueden' t encuentra la clase.

El código en cuestión es

$this->WBSAPI_CurlCall ("once?action=probe" , &$result)); 

Estás pasando una variable por referencia al tiempo de llamada (&$result). Eso ha sido depreciado en las versiones modernas de PHP. Sin manipulación de error personalizado, obtendrá una advertencia como algo

PHP Warning: Call-time pass-by-reference has been deprecated; 

Así que pasar, en $result sin la &. Dado que su método tiene el parámetro declarado en su prototipo como una referencia de paso a paso, al hacerlo no cambiará funcionalmente su código. Eso debería encargarse de su problema inmediato.

La razón más grande por la que Magento le está dando este error es su controlador de error personalizado.

#File: app/code/core/Mage/Core/functions.php 
function mageCoreErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    ... 
    if (Mage::getIsDeveloperMode()) { 
     throw new Exception($errorMessage); 
    } else { 
     Mage::log($errorMessage, Zend_Log::ERR); 
    } 
} 

Puesto que usted no está trabajando en developer mode, Magento intenta registrar un error utilizando la constante Zend_Log como su tipo. El problema es (o parece ser) que si el error ocurre demasiado pronto en el proceso de arranque/despacho de Magento, Zend_Log no se ha cargado aún y el autocargador no se ocupa de ello. Es por eso que estás obteniendo tu error.

debería corregir su código para no utilizar el paso de tiempo de llamada por referencia (elimine &$result de su código de llamada, pero no de las definiciones de funciones). Si no quieres hacer eso, podrías intentar incluir lib/Zend/Log.php anteriormente.Creo que es una mala idea, así que dejaré los hows como ejercicio para el lector.

Además, para aquellos que no estén familiarizados con el término "pasar tiempo de llamada por referencia", significa que se debe indicar que una variable debe pasarse por referencia al llamar al método.

foo(&$bar); 

pasando una referencia a una función

$bar = &baz; 
foo($bar); 

o declarar un parámetro de en el prototipo de un método que indica que se debe pasar por referencia

public function applyInApp(&$content) 
{ 
} 

sigue siendo código PHP legal.

+0

i eliminar todas las líneas en el que la llamada por referencia y no me obtener el error ahora, pero voy a tener que cambiar mi todo el código, o hay otra manera, tal vez la gestión de errores personalizada, ¿Cómo puedo hacer eso –

+0

si cambio & $ resultado a $ resultado, funcionará? –

+0

Respuesta actualizada con una explicación más amplia de lo que está sucediendo. Sí, elimine & $ result de las funciones de llamada, pero no la definición de la función. –

1

Asegúrate de que los nombres de tus métodos no sean genéricos. Descubrí que el problema era el nombre de uno de los métodos en mi clase personalizada. El método se llamaba getData(). Tan pronto como lo cambié de nombre, el problema fue resuelto. Entonces, lo más probable es que el problema esté en el nombre de su método. Intente cambiar el nombre de los nombres de las funciones sospechosas. Fuente:

http://www.netismine.com/magento/fatal-error-class-zend_log-not-found