Errore fatale: Classe non trovata in

19 nov 2014, 17:47:10
Visualizzazioni: 28.2K
Voti: 2

Sto lavorando su un plugin per 'agganciare' un provider di pagamento aggiuntivo in un sistema di checkout.

Ho una classe gtpCheckoutData nel mio functions.php che calcola i prezzi.

Nel mio plugin voglio utilizzare i dati da questa classe gtpCheckoutData, ma quando lo faccio ottengo:

Errore fatale: Classe gtpCheckoutData non trovata in

Il codice del mio plugin:

class gtpMollieGateway {
   private $mollie, $price;

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

       // QUESTO È IL 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() );
       }
   }
}

La mia classe gtpCheckoutData in 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
Tutte le risposte alla domanda 2
2

I plugin si caricano prima dei temi. Gli hook più precoci disponibili per i plugin sono plugins_loaded (o muplugins_loaded per i mu-plugin), mentre i temi vengono eseguiti sugli hook after_setup_theme e successivi. Quindi è meglio caricare il file [che contiene la classe] su un hook specifico nel tuo plugin. Probabilmente è meglio caricarlo con una priorità inferiore a quella predefinita 10. Di seguito uso 5 per renderlo disponibile alle callback in esecuzione con la priorità predefinita. Questo è più sicuro per i tuoi utenti perché potrebbero non aggiungere una priorità e quindi la callback verrebbe eseguita su 10 e l'errore verrebbe generato (di nuovo).

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

Poi, nel file functions.php del tuo tema puoi semplicemente fare affidamento sulla classe. Inoltre evita di duplicare il tuo codice (e mantenerlo in due posti) e non necessita di inutili controlli class_exists che riducono solo le prestazioni. Inoltre è prevedibile dove la tua classe è disponibile e pronta per l'uso.

Tieni presente che l'attuale standard FIG PSR-4 non consente più di una classe per file (e nient'altro al suo interno). Seguire questo rende il tuo setup più futuro-proof in quanto il tuo codice è pronto per i namespace. (L'attuale versione di PHP è la 5.6 e la 5.3 è alla fine del suo ciclo di vita).

19 nov 2014 18:37:41
Commenti

Grazie per la tua ottima risposta! L'unico problema che ottengo è che get_gtp_option() è una funzione creata in functions.php. Quindi ricevo di nuovo un errore.

Robbert Robbert
19 nov 2014 18:44:48

@Robbert Per favore aggiorna la tua domanda con maggiori dettagli, poi menzionami qui così posso comprendere completamente il tuo problema.

kaiser kaiser
19 nov 2014 18:50:34
1

I plugin vengono caricati prima del functions.php. Se possibile, dovresti includere la classe nel tuo plugin.

Mi sono trovato in situazioni in cui una classe faceva parte del tema, ma era necessaria anche in un plugin dove non potevo dare per scontato che la classe fosse inclusa nel tema. In questi casi, ho semplicemente incluso la classe in entrambi i posti e l'ho racchiusa in un controllo "class_exists".

In questo modo:

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

    // Metodi e Proprietà della Classe
 }
}

Potresti anche includere la classe una sola volta negli MU Plugins, che vengono caricati prima degli altri plugin.

19 nov 2014 17:59:46
Commenti

Nessun problema. Come ha detto Kaiser nella sua risposta, dover mantenere due file separati della stessa classe non è l'ideale. Tuttavia, se stai utilizzando la classe in altri punti del tema, non puoi dare per scontato che il plugin sia presente e attivato.

SkyShab SkyShab
19 nov 2014 19:03:57