Eroare fatală: Clasa nu a fost găsită în

19 nov. 2014, 17:47:10
Vizualizări: 28.2K
Voturi: 2

Lucrez la un plugin pentru 'conectarea' unui furnizor suplimentar de plăți într-un sistem de checkout.

Am o clasă gtpCheckoutData în fișierul meu function.php care calculează prețurile.

În plugin-ul meu vreau să folosesc date din această clasă gtpCheckoutData, dar când fac asta primesc:

Eroare fatală: Clasa gtpCheckoutData nu a fost găsită în

Codul plugin-ului meu:

class gtpMollieGateway {
   private $mollie, $price;

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

       // ACEASTA ESTE 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() );
       }
   }
}

Clasa mea gtpCheckoutData din 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
Toate răspunsurile la întrebare 2
2

Plugin-urile se încarcă înaintea temelor. Primele hook-uri disponibile pentru plugin-uri sunt plugins_loaded (sau muplugins_loaded pentru mu-plugins), în timp ce temele rulează pe hook-urile after_setup_theme și cele ulterioare. Așadar, este mai bine să încarci fișierul [care conține clasa] pe un anumit hook în plugin-ul tău. Probabil cel mai bine este să-l încarci cu o prioritate mai mică decât cea implicită 10. Mai jos folosesc 5 pentru a o face disponibilă pentru callback-urile care rulează cu prioritatea implicită. Acest lucru este mai sigur pentru utilizatorii tăi, deoarece aceștia s-ar putea să nu adauge o prioritate și, prin urmare, callback-ul va rula pe 10 și eroarea va fi aruncată (din nou).

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

Apoi, în fișierul functions.php al temei tale, poți pur și simplu să te bazezi pe clasă. De asemenea, evită duplicarea codului tău (și întreținerea lui în două locuri) și nu necesită verificări inutile class_exists care doar reduc performanța. De asemenea, este predictibil unde clasa ta este disponibilă și gata de utilizare.

Ține minte că actualul standard FIG PSR-4 nu permite mai mult de o clasă pe fișier (și nimic altceva acolo). Urmând acest standard, configurația ta va fi mai viabilă în viitor, deoarece codul tău este gata pentru namespace-uri. (Versiunea curentă a PHP este 5.6, iar 5.3 a ajuns la sfârșitul vieții).

19 nov. 2014 18:37:41
Comentarii

Mulțumesc pentru răspunsul excelent! Singura problemă pe care o am atunci este că get_gtp_option() este o funcție creată în functions.php. Așa că apoi primesc din nou o eroare.

Robbert Robbert
19 nov. 2014 18:44:48

@Robbert Te rog să actualizezi întrebarea ta cu mai multe detalii, apoi dă-mi un semn aici ca să pot înțelege complet problema ta.

kaiser kaiser
19 nov. 2014 18:50:34
1

Plugin-urile sunt încărcate înainte de functions.php. Ar trebui să incluzi clasa în plugin-ul tău dacă este posibil.

Am întâlnit scenarii în care o clasă făcea parte din temă, dar era necesară și într-un plugin unde nu puteai presupune că clasa era inclusă în temă. În acele cazuri, pur și simplu am inclus clasa în ambele locuri și am închis-o într-o verificare "class exists".

Ca acesta:

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

    // Metode și Proprietăți ale Clasei
 }
}

Ai putea de asemenea include clasa o singură dată în MU Plugins, care este încărcat înaintea celorlalte plugin-uri.

19 nov. 2014 17:59:46
Comentarii

Nicio problemă. Așa cum a spus Kaiser în răspunsul său, a avea de întreținut două fișiere separate pentru aceeași clasă nu este ideal. Cu toate acestea, dacă folosești clasa în alte părți ale temei, nu poți presupune că plugin-ul este prezent și activat.

SkyShab SkyShab
19 nov. 2014 19:03:57