Hola.
Estoy usando drupal en un hosting que usa php5.0.3 y me he topado con un problema que parece ser habitual.
Drupal no está preparado para esta versión y he sufrido mensajes de error del tipo
"Fatal error: Only variables can be passed by reference in *"
y como no soy programador experimentado, me ha traido de cabeza.
He encontrado una explicación en http://drupal.org/node/32881
Resulta que php5 no permite pasar como argumento por referencia nada que no sea una variable, y en drupal hay algunos
intentos de pasar constantes por referencia, o algo parecido. No termino de entenderlo bién porque mi
inglés es muy muy precario.
Yo he conseguido que el sitio me funcione haciendo lo siguiente:
1) Localizar el fichero y la linea que genera el error.
Eso es facil, la linea de error te da la información.
2) Identificar la función que requiere una variable que no se le proporciona.
-Mirar que funciones contiene la linea. La mayor parte de las veces es solo una.
-Averiguar que prototipo tiene la función que creemos que da el problema. Esto lo hago llendo a
http://drupaldocs.org/api
y ahí busco la función conflictiva, veo su prototipo e identifico el parámetro problemático.
Ese parámetro llevará un "&" delante -indicativo de que se pasa por referencia-.
3) Guardar el valor del parámetro que se le pasa a la función en una variable. Hay que escribir esta línea antes
de la que genera el error.
Supongamos que el parámetro es "micadenaliteral".Habria que hacer $variable="micadenaliteral";
Supongamos que el parámetro es otra función. Habria que hacer $variable=unafución(argumento);
O sea, de forma general sería $variable=la_expresion_que_sea_y_que_tiene_un_valor
4) Subtituir, en la funcion que da el error, el argumento que no era una variable por la variable.
5) Subir el archivo corregido al sitio correspondiente y actualizar la página que no funcionaba.
Un ejemplo:
El error:
Fatal error: Only variables can be passed by reference in
/Library/Apache2/htdocs/drupal/modules/system.module on line 649
La linea 649 de system.module es:
file_check_directory(variable_get('file_directory_path', 'files'), FILE_CREATE_DIRECTORY, 'file_directory_path');
La funcion file_check_directory es candidata a problemática. Busco su prototipo en http://drupaldocs.org/api y veo que
es:
file_check_directory(&$directory, $mode = 0, $form_item = NULL)
y veo que el primer argumento se pasa por referencia (tiene un & delante)
Dejo el código como sigue:
$variable=variable_get('file_directory_path');
file_check_directory($variable, FILE_CREATE_DIRECTORY, 'file_directory_path');
Y ya está arreglado.
En http://drupal.org/node/26033 se habla de parches para solucionar estos problemas, pero a mi me cuesta
mucho entender lo que dice.
Supongo que dan una mejor solución que la que yo propongo.
Si alguien fuera tan amable de leerselo y explicar para que sirven exactamente y como se aplican estos parches
le estaría muy agradecido.
Saludos.
pues si vamos al
pues si vamos al quick&dirty...
Original
file_check_directory($directory, $mode = 0, $form_item = NULL)
QyD:
file_check_directory($foo = $directory, $mode = 0, $form_item = NULL)
es una solución :)
Jairo Enrique Serrano Castañeda
Ingeniero de Sistemas
Que significa
Que significa quick&dirty?
Tu solución no funciona en todos los casos.
En el caso de la linea 713 no me funcionó. No se php y no se porqué, pero tuve que guardar el valor de la expresión "arg(4)" en una variable y luego usarla en la función en substitución del original.
¿No hay una solución más general que no obligue a ir corrigiendo código línea a línea?