Soporte » Plugins y Hacks » Estructurar un plugin con sus opciones en condiciones

  • Saludos a todos/as.

    Antes de nada decir que me animo a escribir aquí (también trataré de ayudar en la medida de lo posible) a raíz del Wordcamp Sevilla 2012 así que algo se habrá hecho bien allí, ¿No?

    Vamos al tema, que espero no sea muy raro. Tengo varias dudas sobre cómo estructurar un plugin creado a base de clases PHP. Trabajo a partir de un boilerplate creado por Tom McFarlin en Github, por aquí. Es una cosa sencilla, con una buena estructura y tal. Mi duda viene a la hora de añadir una página en el panel de administración para las opciones del plugin. Sé cómo puedo hacerlo pero no sé cuál podría ser la mejor manera de hacerlo.

    Hasta ahora voy así:

    1. En __construct():

    add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );

    2. La función que añade el menú de opciones (nos interesa el submenú):

    function add_admin_menu() {
    
        	add_menu_page( __( 'Appointments', 'iw-reservation' ), __( 'Appointments', 'iw-reservation' ), 'read', 'reservations', array( $this, 'reservation_page_html' ) );
    
        	// Options submenu
    		add_submenu_page( 'reservations', __( 'Options', 'iw-reservation' ), __( 'options', 'iw-reservation' ), 'edit_reservations_options', 'reservation-options', array( $this, 'options_page_html' ) );
    
    	}

    Aquí ya tengo el primer dilema porque la función que renderiza la página de opciones es options_page_html, pero ¿Es mejor que esta función haga un require_once a otro fichero o por el contrario inserto el código en esta función? La primera opción no me gusta ya que estaríamos llamando a un fichero externo desde una clase que tiene una serie de funciones (ahora me explico mejor). La segunda opción se cargaría la encapsulación de la clase ya que estamos realizando acciones que a mi parecer no le corresponden a mi clase.

    3a. Aquí va mi opción actual, que es la segunda que he comentado:

    function options_page_html() {
    
    		?>
    
    		<div class="wrap">
    
    			<?php settings_errors( 'reservation_settings_error' ); ?>
    
    			<form id="form-reservation-options" method="post" enctype="multipart/form-data">
    
    				<?php
    					settings_fields('reservation_options');
    					do_settings_sections('reservation');
    				?>
    
    				<p class="submit">
    					<input id="reservation-submit-options-button" name="reservation_options[submit]" type="submit" class="button-primary" value="<?php esc_attr_e('Save Settings', 'iw-reservation'); ?>" />
    					<input name="reservation_options[reset]" type="submit" class="button-secondary" value="<?php esc_attr_e('Reset Defaults', 'iw-reservation'); ?>" />
    				</p>
    
    			</form>
    
    		</div>
    
    		<?php
    	}

    Ya que la he creado de esta manera las funciones que se encargan de ‘rellenar’ el formulario tales como register_setting(), add_settings_section() o add_settings_field() también irían en la misma clase del plugin y ya son muchas funciones que creo que no deberían ir metidas en la clase principal del plugin. No sé, me hago un lío.

    3b. La otra opción sería la siguiente:

    function options_page_html() {
    		echo '<div class="wrap">';
    
    		include_once( IWR_ADMIN_VIEW_PATH . '/options.php' );
    
    		echo '</div>';
    }

    Y dentro de dicho archivo, directamente usamos las funciones add_settings_section() y add_setting_field().

    Ugh, tampoco me gusta, pero no tengo claro si me estoy equivocando y es una buena opción.

    ¿Cómo lo hacéis vosotros? ¿Me explico bien? ¿Me enrollo demasiado? ¿Habéis llegado a leer hasta aquí?

    Gracias a todos!

  • El debate ‘Estructurar un plugin con sus opciones en condiciones’ está cerrado a nuevas respuestas.