it-swarm.com.de

Schwerwiegender Fehler: Klasse in nicht gefunden

Ich arbeite an einem Plugin, mit dem ich einen zusätzlichen Zahlungsanbieter in ein Checkout-System einbinden kann.

Ich habe eine Klasse gtpCheckoutData in meiner function.php, die die Preise berechnet.

In meinem Plugin möchte ich Daten aus dieser gtpCheckoutData -Klasse verwenden, aber wenn ich das tue, erhalte ich Folgendes:

Schwerwiegender Fehler: Klasse gtpCheckoutData nicht gefunden in

Mein Plugin-Code:

class gtpMollieGateway {
   private $mollie, $price;

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

       // THIS IS THE PROBLEM
       $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() );
       }
   }
}

Meine gtpCheckoutData Klasse 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;
        }
    }
}
2
Robbert

Plugins werden vor functions.php geladen. Sie sollten die Klasse nach Möglichkeit in Ihr Plugin aufnehmen.

Ich hatte Szenarien, in denen eine Klasse Teil des Themas war, aber auch in einem Plugin benötigt wurde, in dem man nicht annehmen konnte, dass die Klasse im Thema enthalten war. In diesen Fällen habe ich die Klasse einfach an beiden Stellen eingefügt und sie in eine Prüfung "Klasse vorhanden" eingepackt.

So was:

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

    // Class Methods and Properties
 }
}

Sie können die Klasse auch nur einmal in MU-Plugins aufnehmen, die vor den anderen Plugins geladen werden.

1
SkyShab

Plugins werden vor Themen geladen. Die frühesten verfügbaren Hooks für Plugins sind plugins_loaded (oder muplugins_loaded für mu-plugins), während Designs mit after_setup_theme und späteren Hooks ausgeführt werden. Laden Sie die Datei [die die Klasse enthält] einfach auf einen bestimmten Hook in Ihrem Plugin. Es ist wahrscheinlich am besten, es mit einer niedrigeren Priorität als dem Standard-10 zu laden. Im Folgenden verwende ich 5, um es für Rückrufe verfügbar zu machen, die mit der Standardpriorität ausgeführt werden. Dies ist für Ihre Benutzer fehlersicherer, da sie möglicherweise keine Priorität hinzufügen und der Rückruf daher mit 10 ausgeführt wird und der Fehler (erneut) ausgegeben wird.

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

In der functions.php-Datei Ihres Themes können Sie sich dann einfach auf die Klasse verlassen. Außerdem wird vermieden, dass Ihr Code dupliziert wird (und an zwei Stellen aufbewahrt wird), und es sind keine unnötigen class_exists-Prüfungen erforderlich, die nur die Leistung beeinträchtigen. Es ist auch vorhersehbar, wo Ihre Klasse verfügbar und einsatzbereit ist.

Beachten Sie, dass der aktuelle FIG PSR-4-Standard nicht mehr als eine Klasse pro Datei zulässt (und nichts anderes dort). Dies macht Ihr Setup zukunftssicherer, da Ihr Code Namespace-fähig ist. (Die aktuelle PHP Version ist 5.6 und 5.3 ist am Ende des Lebens).

4
kaiser