2011-03-09 987 views
12

Estoy usando namespaces.PHP Namespace 5.3 y WordPress Widget

intento crear un widget de WordPress (http://codex.wordpress.org/Widgets_API)

Con espacios de nombres A continuación se presenta un error porque los argumentos no se pueden pasar (y sin espacios de nombres es obvio que funciona como habitual)

namespace a\b\c; 
class whatever extends \WP_Widget { 
    function whatever() { 
    parent::WP_Widget('name1', 'name2'); 
    } 
// .. other functions left out 
} 
add_action('widgets_init', 
create_function('', 'return register_widget("a\b\c\whatever");')); 

uhm ... ¿cuál es la sintaxis correcta para 'parent :: WP_Widget' utilizando espacios de nombres?

(el mensaje de error completo es:

Warning: Missing argument 2 for WP_Widget::__construct(), called in 
C:\xampp\htdocs\wp2\wp-includes\widgets.php on line 324 and defined in 
C:\xampp\htdocs\wp2\wp-includes\widgets.php on line 93 

)

Y el depurador no muestra nada ha pasado:

Variables in local scope (#14) 
$control_options = Undefined 
$id_base = boolean false 
$name = Undefined 
$widget_options = Undefined 

(sólo el $ nombre es requerido)

+1

mensaje exacto aquí. Al mirar el código, no parece que haya nada malo. Además, ¿por qué usas parent y no solo $ this-> WP_Widget? Y, por último, ¿WP_Widget es un constructor de la clase WP_Widget? ¿Por qué la función tiene el mismo nombre que la clase? Si es un constructor, entonces mejor use __construct() – Dmitri

+0

no: existe, la fábrica de widgets es parte de WordPress desde 2.8: si hace clic en Eclipse en WP_Widget obtendrá la definición en la que está ... http: // core. svn.wordpress.org/trunk/wp-includes/widgets DEBE ser sobrescrito y no por _construct, vea el código fuente (no puedo ayudar, no lo escribí) – edelwater

+0

@dmitri: both parent :: WP_Widget y $ this-> WP_Widget deliver el mismo error, ambas variantes se usan en la web. WP_Widget es la función que debe sobrescribirse según el CODEX. – edelwater

Respuesta

4

Se me parece que el problema no está en los espacios de nombres, el siguiente código funciona como un encanto:

<?php 
namespace Foo; 

class Bar { 
    function __construct($foo) { 
     echo "$foo\n"; 
    } 
} 

namespace Foo\Bar; 

class Foo extends \Foo\Bar { 
    function __construct() { 
     parent::__construct("This should work."); 
    } 
} 

$foo = new \Foo\Bar\Foo(); 

Si recibe un mensaje de error, que podría ser útil para afirmar lo que dice.

+0

@ berry-langerak: Es bueno saber que no es mi sintaxis GRIN. ¿Entonces que es eso? La clase principal es la predeterminada: core.svn.wordpress.org/trunk/wp-includes/widgets – edelwater

+1

Parece que Wordpress tiene un método proxy para los viejos constructores tipo PHP 4 (yugh). Es posible que desee considerar el uso de parent :: __ construct() en su lugar. Además, cuando llame a __construct(), asegúrese de llamarlo con * al menos * dos parámetros. –

+0

La función __construct hizo el truco gracias! – edelwater

3

¿Desea llamar a un método principal? Sólo tiene que utilizar parent::MethodName();

Si desea llamar al constructor padre, utilizar parent::__construct() - si su constructor se nombró como la clase, cambie su nombre por __construct que es el nombre preferido para un constructor durante años ...

+0

gracias, me falta algo que ya estoy usando parent :: WP_Widget() pero probablemente estoy pasando por alto algo? – edelwater

20

En cuanto a la documentación located here parece que solo se requiere el nombre pero la forma en que funciona PHP debe tener también definidas las variables previas.

tienes dos maneras de crear la clase:

  • A:
    • WP_Widget __construct ([string $id_base = false], string $name, [array $widget_options = array()], [array $control_options = array()])
  • B:
    • WP_Widget WP_Widget ([ $id_base = false], $name, [ $widget_options = array()], [ $control_options = array()])

De preferencia siempre se debe utilizar el método __construct para inicializar el objeto, me gustaría volver a escribir su código de este modo:

namespace a\b\c; 

class whatever extends \WP_Widget 
{ 
    function __construct() 
    { 
     parent::__construct('name1', 'name2'); 
    } 

    /* 
     * Other methods! 
    */ 
} 

El método WP_Widget::WP_Widget(..) es para PHP4 solamente, y no debe ser usado en PHP 5 o mas alto.

Ahora parece que estás usando PHP 5.3 como los que utilizan espacios de nombres para que pueda hacer lo siguiente:

add_action('widgets_init', function() { 
    return register_widget(new a\b\c\whatever); 
}); 
+0

la función __construct hizo el truco gracias, la respuesta fue solo un minuto más tarde que la baya, así que marqué la baya como respuesta. – edelwater

+0

la adición de register_widget no funciona con \ a \ b \ c \ en ella ya que está en el ámbito del espacio de nombres. Si elimino la parte del espacio de nombres, aparece "Advertencia: tipo de compensación ilegal en C: \ xampp \ htdocs \ wp2 \ wp-includes \ widgets.php en la línea 324" así que ... uso el código en la pregunta por el momento y lo haré verifique más adelante cómo hacer esto. Gracias. – edelwater

+1

Simplemente encapsula el 'a \ b \ c \ whatever' dentro de una cadena y elimina la nueva palabra clave, puede deberse a la forma en que Wordpress usa el valor. – RobertPitt

0

No consumo Wordpress, sino de mirar esto se parece a su debido a un mal diseño de Wordpress. Parecen usar la función estática WP_Widget que funciona como fábrica, pero comparte el mismo nombre que el nombre de la clase. Deberían haberlo llamado fábrica si realmente es solo una fábrica.

Además, a partir de lo que publicaste en tu comentario, tal vez necesites crear una función estática WP_Widget() en tu subclase y luego ni siquiera llamar al padre. Si la secuencia de comandos realmente quiere que anule el WP_Widget, esto es lo que debe hacer.

Pero, de nuevo, nunca he usado Wordpress, es difícil de decir sin mirar el guión.

Debe publicar el código de error exacto aquí.

+0

He publicado el código de error exacto completo, puedo agregar el rastro de la pila? – edelwater

2

Esto funcionó bien para mí: mensaje de error

add_action('widgets_init', function() {     
    register_widget('\a\b\c\whatever'); 
});