Hacer que una clase esté disponible a través de filtros de acciones

2

Estoy creando un complemento que muestra una vista con pestañas. La forma en que funciona actualmente es cuando el usuario hace clic en una pestaña class Loader lee el parámetro $_GET y crea una instancia de la clase específica para el contenido de esa pestaña. Ahora que estoy trabajando, quiero poder extender la funcionalidad de este complemento a otros. es decir, quiero que otro complemento pueda crear un nuevo tipo de pestaña. Cada una de mis clases de pestañas se deriva de una base abstracta, aunque puedo solucionar esto utilizando if_method_exists() .

¿Cómo puedo hacer que una instancia o el nombre de una clase esté disponible desde un segundo complemento a mi complemento?

Lo que quiero lograr es que mi clase Loader tenga disponible una lista de nombres de clase a partir de los cuales puede llenar las pestañas y luego crear la instancia cuando se selecciona esa pestaña.

    
pregunta Twifty 08.09.2013 - 11:10

1 respuesta

5

Cree algún tipo de registro donde otros complementos puedan registrar nuevas pestañas. Digamos que el controlador de la página de administración de su complemento se llama Main_Controller :

class Main_Controller {

    protected $tabs;

    public function __construct()
    {
        $this->tabs = new Tab_List;

        do_action( 'register_tabs', $this->tabs );
    }

    public function create_tabs() {
        $all_tabs = $this->tabs->get_tabs();

        if ( empty ( $all_tabs ) )
            return;

        foreach ( $all_tabs as $id => $tab ) {
            // print the tab
        }
    }
}

Tab_List es la lista con todas las pestañas registradas:

class Tab_List {

    protected $tabs = array();

    public function register( $id, Tab $tab ) {
        $this->tabs[ $id ] = $tab;
    }

    public function get_tabs() {
        return $this->tabs;
    }
}

El método register espera una instancia bien definida de una clase Tab :

class Tab {

    // Have to be replaced.
    protected $properties = array(
        'tab_title'        => 'MISSING TAB TITLE',
        'page_title'       => 'MISSING PAGE TITLE',
        'content_callback' => '__return_false',
        'save_callback'    => '__return_false'
    );

    public function __set( $name, $value ) {
        if ( isset ( $this->properties[ $name ] ) )
            $this->properties[ $name ] = $value;
    }

    public function __get( $name ) {
        if ( isset ( $this->properties[ $name ] ) )
            return $this->properties[ $name ];
    }
}

Ahora, otros complementos pueden registrar sus pestañas con un simple enlace:

add_action( 'register_tabs', function( Tab_List $tab_list )
{
    $data = new My_Color_Data;
    $view = new My_Color_View( $data );

    $my_tab = new Tab;
    $my_tab->tab_title = 'Colors';
    $my_tab->page_title = 'Set custom colors';
    $my_tab->content_callback = array( $view, 'print_tab' );
    $my_tab->save_callback    = array( $data, 'save_tab' );

    $tab_list->register( 'colors', $my_tab );
});

Las clases My_Color_Data y My_Color_View son personalizadas. Eso lo dejo a tu imaginación. :)

Ver también:

respondido por el fuxia 08.09.2013 - 11:46

Lea otras preguntas en las etiquetas