Error fatal: Clase no encontrada en

19 nov 2014, 17:47:10
Vistas: 28.2K
Votos: 2

Estoy trabajando en un plugin para 'conectar' un proveedor de pagos adicional en un sistema de pago.

Tengo una clase gtpCheckoutData en mi functions.php que calcula los precios.

En mi plugin quiero usar datos de esta clase gtpCheckoutData, pero cuando lo hago obtengo un:

Error fatal: Clase gtpCheckoutData no encontrada en

Mi código del plugin:

class gtpMollieGateway {
   private $mollie, $price;

   function __construct() {
       $this->mollie    = new Mollie_API_Client;

       // ESTE ES EL PROBLEMA
       $this->price     = new gtpCheckoutData;

       add_action( 'init', array( $this, 'gtpCreatePayment' ) );
   }

   function gtpCreatePayment() {
       if( isset( $_POST['checkout_submit'] ) ) {
           $payment     = $this->mollie->payments->create(array(
                'amount'        => $this->price->getPrice( 'inclusive' ),

           ));
           header( "Location: " . $payment->getPaymentUrl() );
       }
   }
}

Mi clase gtpCheckoutData en functions.php

class gtpCheckoutData {
    private $tax, $price;

    public function __construct() {
        $this->tax      = get_gtp_option( 'gtp_tax' ) / 100;
        $this->price    = $_SESSION['shopping_cart']['total_price'] + $_SESSION['shopping_cart']['shipping_price'];
        $this->shipping = $_SESSION['shopping_cart']['shipping_price'];
    }

    public function getPrice( $type ) {

        if( isset( $type ) ) {
            switch( $type ) {
                case 'exclusive' : 
                    $totalPrice = $this->price;
                    break;
                case 'tax' :
                    $totalPrice = $this->price * $this->tax;
                    break;  
                case 'inclusive' :
                    $totalPrice = $this->price * ( $this->tax + 1 );
                    break;
            }
            return $totalPrice;
        }
    }
}
0
Todas las respuestas a la pregunta 2
2

Los plugins se cargan antes que los temas. Los hooks más tempranos disponibles para los plugins son plugins_loaded (o muplugins_loaded para mu-plugins), mientras que los temas se ejecutan en after_setup_theme y hooks posteriores. Por lo tanto, es mejor cargar el archivo [que contiene la clase] en un hook específico en tu plugin. Probablemente sea mejor cargarlo con una prioridad más baja que la predeterminada 10. A continuación, uso 5 para que esté disponible para las funciones de callback que se ejecutan con la prioridad predeterminada. Esto es más seguro contra errores para tus usuarios, ya que podrían no añadir una prioridad y, por lo tanto, la función de callback se ejecutaría en 10 y se lanzaría el error (de nuevo).

add_action( 'after_setup_theme', function()
{
    require plugin_dir_path( __FILE__ ).'src/your-class.php';
}, 5 );

Luego, en el archivo functions.php de tu tema puedes simplemente confiar en la clase. También evita duplicar tu código (y mantenerlo en dos lugares) y no necesita comprobaciones innecesarias de class_exists que solo reducen el rendimiento. Además, es predecible dónde tu clase está disponible y lista para usar.

Ten en cuenta que el actual estándar FIG PSR-4 no permite más de una clase por archivo (y nada más allí). Seguir esto hace que tu configuración sea más preparada para el futuro, ya que tu código está listo para namespaces. (La versión actual de PHP es 5.6 y 5.3 está al final de su vida útil).

19 nov 2014 18:37:41
Comentarios

¡Gracias por tu gran respuesta! El único problema que tengo entonces es que get_gtp_option() es una función creada en functions.php. Así que vuelvo a obtener un error.

Robbert Robbert
19 nov 2014 18:44:48

@Robbert Por favor actualiza tu pregunta con más detalles, luego mencióname aquí para que pueda entender completamente tu problema.

kaiser kaiser
19 nov 2014 18:50:34
1

Los plugins se cargan antes que functions.php. Deberías incluir la clase en tu plugin si es posible.

He tenido escenarios donde una clase era parte del tema, pero también se necesitaba en un plugin donde no se podía asumir que la clase estaba incluida en el tema. En esos casos, simplemente incluía la clase en ambos lugares y la envolvía en una verificación de "clase existe".

Así:

if(!class_exists('My_Class'))
{
 class My_Class{

    // Métodos y Propiedades de la Clase
 }
}

También podrías incluir la clase solo una vez en los MU Plugins, que se cargan antes que los otros plugins.

19 nov 2014 17:59:46
Comentarios

No hay problema. Como Kaiser mencionó en su respuesta, tener que mantener dos archivos separados de la misma clase no es ideal. Sin embargo, si estás usando la clase en otros lugares del tema, no puedes asumir que el plugin está presente y activado.

SkyShab SkyShab
19 nov 2014 19:03:57