Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP Klassenmethode werden ohne Aufruf ausgeführt

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] PHP Klassenmethode werden ohne Aufruf ausgeführt

    Hallo,

    vielleicht bin ich einfach zu doof es zu verstehen oder ich mache grundlegende Fehler, oder auch beides

    Folgende Situation:

    Ich habe eine Klasse die aufgerufen wird um Daten aus einer Datenbank abzufragen und an ein festes Backend weiterzugeben -> funktioniert prima

    Innerhalb dieser Klasse gibt es zwei "große" Methoden, eine zum anzeigen von Einstellungsparametern (letztendlich auch nur eine Datenbankabfrage und Umwandlung in Checkboxen, Dropdowns etc.) und eine die aus den Daten (abhängig von den Einstellungen) ein PDF erstellt.
    Beide Methoden funktionieren an sich so wie ich mir das gewünscht habe.

    Nun zur Problematik:

    Die Funktionen sollen jeweils NUR aufgerufen werden, wenn sie durch einen Buttonklick gestartet werden.
    Die Funktionen zum darstellen der Daten soll automatisch beim laden der Klasse aufgerufen werden (Daten werden angezeigt, durch Buttonklick Einstellungen laden und anzeigen, weiterer Buttonklick-> PDF erstellen)

    Wenn ich jetzt allerdings meine Klasse in das Backend lade werden auch nur die Daten angezeigt, ansonsten passiert nichts. Klicke ich auf den ersten Button werden sämtliche andere Methoden aufgerufen.

    Hier Auszüge aus dem Quelltext:

    Methoden um Daten anzuzeigen (funktioniert tadellos)

    PHP-Code:
    //Main DB-table
                
    protected $_table TABLE_ORDERS;
                
    //Language table
                
    protected $_table_lang null;
                
    //SEO table
                
    protected $_table_seo null;
                
    //Master key
                
    protected $_master_key 'orders_id';
                
    //Set default position for AI 
                 
    function setPosition ($position)
                    {
                        
    $this->position $position;
                    }    
                
    //Set parameters
                
    function _getParams() 
                    {
                        
    //Create array
                         
    $params = array();
        

                        
    /********************************/
                        /*******Create Userbuttons*******/
                        /********************************/
                        //Printbutton
                        //Initialize ExtJS
                        
    $extF = new ExtFunctions();
                        
    //ExtJS-Code
                        //adminHandler.php?load_section=xt_print_preview&plugin=xt_print_invoice&pg=overview
                        
    $u_js.= $extF->_RemoteWindow(TEXT_XT_PRINT_PREVIEW_HEADER,"Print Preview",_SRV_WEB_PLUGINS."xt_print_invoice/pages/print_preview.php"'', array(), 800600).' new_window.show();';
                        
    //Set UserButton options
                        
    $UserButtons['print'] = array('text' => 'TEXT_PRINT',
                                                      
    'style' => 'print',
                                                      
    'icon' => 'printer.png',
                                                      
    'acl' => 'edit',
                                                      
    'stm' => $u_js);
                        
    //Display Userbutton
                        
    $params['display_printBtn'] = true;
                         
    //Add all Userbuttons
                        
    $params['UserButtons'] = $UserButtons;
                         return 
    $params;
          
                    }
                function 
    _get($ID=0)
                    {
                        global 
    $xtPlugin,$db,$language,$language_content;
                        if(
    $this->position != 'admin') return false;
                        ..................................
                        
    $obj = new stdClass;
                        
    $obj->totalCount count($data);
                        
    $obj->data $data;
                        return 
    $obj;
                    } 
    Methode um die Einstellungen anzuzeigen:
    PHP-Code:
    public function xt_print_preview_settings()
                    {
                        
    $sel_orders_id $this->url_data['orders_id'];
                        
    //Globals
                        
    global $xtPlugin,$db,$language;
                        
    //Create Masterpanel
                        
    $settings_panel = new PhpExt_Panel();
                        
    //Settings of Masterpanel
                        
    $settings_panel
                            
    //No animation
                            
    ->setAnimCollapse(false)
                            
    //Autoscroll
                            
    ->setAutoScroll(true)
                            
    //Autowidth
                            
    ->setAutoWidth(true)
                            
    //Set Border
                            
    ->setBorder(true)
                            
    //Panel not collapsed
                            
    ->setCollapsed(false)
                            
    //Button alignment
                            
    ->setButtonAlign("PhpExt_Ext::EXT_HALIGN_CENTER")
                            
    //Panel not collapsible
                            
    ->setCollapsible(false)
                            
    //Panel not draggable
                            
    ->setDraggable(false)
                            
    //Title of Panel
                            
    ->setTitle(__define("TEXT_XT_PRINT_INVOICE_SETTINGS_HEADER"));
                        
    //Get Config from DB
                        
    $query "SELECT * FROM xt_print_invoice_config ORDER BY conf_id ASC";
                        
    //Execute query
                        
    $rs $db->Execute($query);
                        
    //If returned more than "0" Recordsets
                        
    if($rs->RecordCount() > 0)
                            {
                                
    //Create array for config
                                
    $conf = array();
                                
    //Create array for errors
                                
    $err = array();
                                
    //Read whole table row by row
                                
    while (!$rs->EOF)
                                    {
                                        
    //Check Type of config
                                        
    switch($rs->fields['conf_type'])
                                            {
                                                
    //Config type "textfield"
                                                
    case 'textfield':
                                                    
    //conf_name was not set -> ERROR
                                                    
    if(strlen($rs->fields['conf_name']) <= 0)
                                                        {
                                                            
    $err[] = array($rs->fields['conf_id'] => "conf_name not set");
                                                        }
                                                    
    //conf_value_text was not set -> ERROR
                                                    
    elseif(strlen($rs->fields['conf_value_text']))
                                                        {
                                                            
    $err[] = array($rs->fields['conf_id'] => "conf_value_name not set");
                                                        }
                                                    
    //All required fields are set -> Writing to config-array
                                                    
    else
                                                        {
                                                            
    $conf[] = array('conf_id'=>$rs->fields['conf_id'],
                                                                            
    'conf_name'=>$rs->fields['conf_name'],
                                                                            
    'conf_value'=>$rs->fields['conf_value'],
                                                                            
    'conf_value_text'=>$rs->fields['conf_value_text'],
                                                                            
    'conf_type'=>$rs->fields['conf_type']);
                                                        }
                                                    break;
                                                
    //Config type "text"
                                                
    case 'text':
                                                    
    //conf_name was not set -> ERROR
                                                    
    if(strlen($rs->fields['conf_name']) <= 0)
                                                        {
                                                            
    $err[] = array($rs->fields['conf_id'] => "conf_name not set");
                                                        }
                                                    
    //conf_value_text was not set -> ERROR
                                                    
    elseif(strlen($rs->fields['conf_value_text']))
                                                        {
                                                            
    $err[] = array($rs->fields['conf_id'] => "conf_value_name not set");
                                                        }
                                                    
    //All required fields are set -> Writing to config-array
                                                    
    else
                                                        {
                                                            
    $conf[] = array('conf_id'=>$rs->fields['conf_id'],
                                                                            
    'conf_name'=>$rs->fields['conf_name'],
                                                                            
    'conf_value'=>$rs->fields['conf_value'],
                                                                            
    'conf_value_text'=>$rs->fields['conf_value_text'],
                                                                            
    'conf_type'=>$rs->fields['conf_type']);
                                                        }
                                                    break;
                                                
    //Config type "text"
                                                
    case 'checkbox':
                                                    
    //conf_name was not set -> ERROR
                                                    
    if(strlen($rs->fields['conf_name']) <= 0)
                                                        {
                                                            
    $err[] = array($rs->fields['conf_id'] => "conf_name not set");
                                                        }
                                                    
    //All required fields are set -> Writing to config-array
                                                    
    else
                                                        {
                                                            
    $conf[] = array('conf_id'=>$rs->fields['conf_id'],
                                                                            
    'conf_name'=>$rs->fields['conf_name'],
                                                                            
    'conf_value'=>$rs->fields['conf_value'],
                                                                            
    'conf_value_text'=>$rs->fields['conf_value_text'],
                                                                            
    'conf_type'=>$rs->fields['conf_type']);
                                                            
    //Create PhpExt-Checkbox
                                                            
    $tempChk = new PhpExt_Form_Checkbox();
                                                            
    $labelTxt "TEXT_XT_PRINT_INVOICE_SETTINGS_LABEL_".strtoupper($rs->fields['conf_name']);
                                                            
    $tempChk
                                                            
    ->setChecked($rs->fields['conf_value'])
                                                            ->
    setBoxLabel(__define($labelTxt));
                                                            
    $settings_panel->addItem($tempChk);
                                                        }
                                                    break;
                                                case 
    'dropdown':
                                                    
    //Config type "text"
                                                    //Not yet implemented
                                                    
    break;
                                            }
                                        
    $rs->MoveNext();
                                    }
                            }
                        else
                            {
                                
    //Conf-Table is empty -> ERROR    
                            
    }
                        
    //Create Save-Button
                        
    $button_save = new PhpExt_Button();
                        
    $button_save->setText(__define("TEXT_XT_PRINT_INVOICE_SETTINGS_SAVE_BUTTON"));
                        
    $button_save->setHandler(xt_print_invoice_save_settings::saveSettings($conf));
                        
    //Add Items to Masterpanel
                        
    $settings_panel->addButton($button_save);
                        
    //Set rendering target of Masterpanel if no Errors
                        
    if(empty($err))
                            {
                                
    $settings_panel->setRenderTo('print_settings_order_id-'.$sel_orders_id);
                                
    $return "<script type='text/javascript'>";
                                
    //$return .= include(_SRV_WEB_ROOT . _SRV_WEB_PLUGINS . "xt_print_invoice/javascript/functions.js");//Include JS functions
                                
    $return .= PhpExt_Ext::OnReady($settings_panel->getJavascript(false'settings'));
                                
    $return .= "</script>";
                                
    $return .= "<div id='print_settings_order_id-".$sel_orders_id."'></div>";
                                return 
    $return;
                            }
                        else
                            {
                                
    $return "<h3>The following errors occured while loading settings:</h3>";
                                foreach(
    $err as $err_id => $err_msg)
                                    {
                                        
    $return .= "Config ID: ".$err_id.", Message: ".$err_msg;    
                                    }
                            }
                    } 
    Methode um Einstellungen zu speichern (wird direkt ausgeführt, bis auf das JavascriptSTM am Ende)
    PHP-Code:
    function saveSettings($conf_data)
                    {
                        global 
    $db;
                        for(
    $i=0;$i<count($conf_data);$i++)
                            {
                                
    $conf_id $conf_data[$i]['conf_id'];
                                
    $conf_value $conf_data[$i]['conf_value'];
                                
    $db->Execute("UPDATE xt_print_invoice_config SET conf_value = '$conf_value' WHERE conf_id = 'conf_id'");
                            }
                        
    $extF = new ExtFunctions();
                        
    $js $extF->MsgAlert(__define('TEXT_XT_PRINT_INVOICE_SETTINGS_SAVE_OK'));
                        return new 
    PhpExt_JavascriptStm("function(){".$js."}");
                    } 
    Methode um das Dokument zu erzeugen (ich erzeuge hier erstmal ein Word-Dokument, da das mit dem PDF noch nicht so hinhaut, soll hier aber nicht Thema sein...Die Methode wird sofort ausgeführt, das Dokument korrekt erzeugt, das restliche Skript wird abgebrochen!)

    PHP-Code:
    protected function xt_create_doc($settings)
                    {
                        global 
    $db;
                        
    $order_id $this->url_data['orders_id'];
                        
    $ADODB_FETCH_MODE ADODB_FETCH_ASSOC;
                        
    $rs $db->Execute("SELECT * FROM ".DB_PREFIX."_orders WHERE orders_id = '$order_id'");
                        if(
    $rs->RecordCount()==0)
                            {
                                return 
    'false';
                            }
                        elseif(
    $rs->RecordCount() > 0)
                            {
                                
    //create error variable
                                
    $err_xt_create "";
                                
    //load all fields into data var
                                
    $order_data $rs->fields;
                                
    //check if needed files exists
                                
    if(!file_exists(_SRV_WEBROOT _SRV_WEB_PLUGINS "xt_print_invoice/ext/VsTemplDocx.php"))
                                    {
                                        
    //File doesnt exist, log error variable
                                        
    $err_xt_create .= 'File "VsTemplDocx.php" was not found at ../ext/VsTemplDocx.php<br />';
                                    }
                                else
                                    {
                                        
    //file exists, load
                                        
    require(_SRV_WEBROOT _SRV_WEB_PLUGINS "xt_print_invoice/ext/VsTemplDocx.php");
                                    }
                                if(!
    file_exists(_SRV_WEBROOT _SRV_WEB_PLUGINS "xt_print_invoice/ext/zip/pclzip.lib.php"))
                                    {
                                        
    //File doesnt exist, log error variable
                                        
    $err_xt_create .= 'File "pclzip.lib.php" was not found at ../ext/zip/pclzip.lib.php<br />';
                                    }
                                
    //check if errors occured while loading files
                                
    if(empty($err_xt_create))
                                    {
                                        
    //no errors -> continue
                                        //delete errorlog
                                        
    unset($err_xt_create);
                                        
    //recreate errorlog
                                        
    $err_xt_create "";
                                        
    //get template
                                        
    $tplroot _SRV_WEBROOT _SRV_WEB_PLUGINS "xt_print_invoice/templates/";
                                        
    //$tplSrc = XT_PRINT_INVOICE_DOCX_TPL;
                                        
    $tplSrc $tplroot."tpl.docx";
                                        
    //set filename for output document
                                        //$docOutName = XT_PRINT_INVOICE_CREATE_DOCUMENT_PREFIX . $this->url_data['orders_id'];
                                        
    $docOutName "Rechnung ".$this->url_data['orders_id'];
                                        
    $assetsExtractDir "./tmp/";
                                        
    $tmpDoc VsTemplDocx::create(array('templname'=>$tplSrc,'fileOutPut'=>$docOutName,'tmppatch'=>$assetsExtractDir));
                                        
    //Get needed vars
                                        
    $company_name "...";
                                        
    $company_street "...";
                                        
    $company_postcode "...";
                                        
    $company_city "...";
                                        
    $delivery_gender "...";
                                        
    $delivery_firstname "...";
                                        
    $delivery_lastname "...";
                                        
    $delivery_street_address "...";
                                        
    $delivery_postcode "...";
                                        
    $delivery_city "...";
                                        
    //Add vars
                                        
    $tmpDoc->addParceDoc(array(
                                        
    'company_name'=>$company_name,
                                        
    'company_street'=>$company_street,
                                        
    'company_postcode'=>$company_postcode,
                                        
    'company_city'=>$company_city,
                                        
    'delivery_gender'=>$delivery_gender,
                                        
    'delivery_firstname'=>$delivery_firstname,
                                        
    'delivery_lastname'=>$delivery_lastname,
                                        
    'delivery_street_address'=>$delivery_street_address,
                                        
    'delivery_postcode'=>$delivery_postcode,
                                        
    'delivery_city'=>$delivery_city));
                                        
    //$tmpDoc->createDoc();
                                    
    }
                                elseif(!empty(
    $err_xt_create))
                                    {
                                        
    //errors occured, print errors
                                        
    echo "Errors occured during loading process of required libraries:<br />";
                                        echo 
    $err_xt_create;
                                    }
                                elseif(!isset(
    $err_xt_create))
                                    {
                                        
    //the error variable is not set
                                        
    $err_xt_create 'Fatal Error: Errorlog variable was not set!';
                                    }
                            }
                    } 
    Ich hoffe das ist jetzt hier nicht zuviel wirrwarr, wenn Fragen bestehen kann ich auch gerne noch etwas konkreter werden

    Danke schonmal für etwaige Hilfe


  • #2
    Ich würde vielleicht einfach mal debuggen, um zu sehen, was den Aufruf auslöst.

    Geht vielleicht per xdebug und IDE oder ansonsten so in der Art:

    - http://php.net/manual/en/function.debug-backtrace.php

    Kommentar


    • #3
      Okay, werde ich mal tun, heute leider keine Zeit aber ich melde mich dann Danke schonmal!

      Kommentar


      • #4
        Kann es sein, dass du modularer werden könntest bei deinen Funkionen?

        Auch wenn ich jetzt ein Wort mit sich selbst erkläre:
        Eine Funktion hat im allgemeinen nur eine Funktion.


        Es wäre dir sicherlich möglich deine Funktionen zu verkürzen. Was die Lesbarkeit meiner Meinung nach deutlichst verbessert.
        Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

        Kommentar


        • #5
          Du meinst in kleineren Schritten arbeiten? Ja da könntest du ziemlich Recht mit haben Werd ich mal dran arbeiten

          Kommentar


          • #6
            nur eine Datenbankabfrage und Umwandlung in Checkboxen, Dropdowns etc.
            Datenbankabfrage ist ne Funktion Umwandlung ist ne Funktion. Man dürfte sogar aus Umwandlung heraus verschiedene Funktionen aufrufen dürfen.

            Sprich
            PHP-Code:
            public funktion umwandlung($typ)
            {
                if(
            $typ "checkbox")
                {
                      
            checkboxWandler();
                }

            Besser noch mit nem switchcase möglicherweise.
            Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

            Kommentar


            • #7
              Alles klar, die Unterscheidung habe ich schon als switch ausgeführt:
              PHP-Code:
              //Check Type of config
                                                  
              switch($rs->fields['conf_type'])
                                                      {
                                                          
              //Config type "textfield"
                                                          
              case 'textfield':
                                                              
              //conf_name was not set -> ERROR
                                                              
              if(strlen($rs->fields['conf_name']) <= 0)
                                                                  {
                                                                      
              $err[] = array($rs->fields['conf_id'] => "conf_name not set");
                                                                  }
                                                              
              //conf_value_text was not set -> ERROR
                                                              
              elseif(strlen($rs->fields['conf_value_text']))
                                                                  {
                                                                      
              $err[] = array($rs->fields['conf_id'] => "conf_value_name not set");
                                                                  }
                                                              
              //All required fields are set -> Writing to config-array
                                                              
              else
                                                                  {
                                                                      
              $conf[] = array('conf_id'=>$rs->fields['conf_id'],
                                                                                      
              'conf_name'=>$rs->fields['conf_name'],
                                                                                      
              'conf_value'=>$rs->fields['conf_value'],
                                                                                      
              'conf_value_text'=>$rs->fields['conf_value_text'],
                                                                                      
              'conf_type'=>$rs->fields['conf_type']);
                                                                  }
                                                              break;
                                                          
              //Config type "text"
                                                          
              case 'text':
                                                              
              //conf_name was not set -> ERROR
                                                              
              if(strlen($rs->fields['conf_name']) <= 0)
                                                                  {
                                                                      
              $err[] = array($rs->fields['conf_id'] => "conf_name not set");
                                                                  }
                                                              
              //conf_value_text was not set -> ERROR
                                                              
              elseif(strlen($rs->fields['conf_value_text']))
                                                                  {
                                                                      
              $err[] = array($rs->fields['conf_id'] => "conf_value_name not set");
                                                                  }
                                                              
              //All required fields are set -> Writing to config-array
                                                              
              else
                                                                  {
                                                                      
              $conf[] = array('conf_id'=>$rs->fields['conf_id'],
                                                                                      
              'conf_name'=>$rs->fields['conf_name'],
                                                                                      
              'conf_value'=>$rs->fields['conf_value'],
                                                                                      
              'conf_value_text'=>$rs->fields['conf_value_text'],
                                                                                      
              'conf_type'=>$rs->fields['conf_type']);
                                                                  }
                                                              break;
                                                          
              //Config type "text"
                                                          
              case 'checkbox':
                                                              
              //conf_name was not set -> ERROR
                                                              
              if(strlen($rs->fields['conf_name']) <= 0)
                                                                  {
                                                                      
              $err[] = array($rs->fields['conf_id'] => "conf_name not set");
                                                                  }
                                                              
              //All required fields are set -> Writing to config-array
                                                              
              else
                                                                  {
                                                                      
              $conf[] = array('conf_id'=>$rs->fields['conf_id'],
                                                                                      
              'conf_name'=>$rs->fields['conf_name'],
                                                                                      
              'conf_value'=>$rs->fields['conf_value'],
                                                                                      
              'conf_value_text'=>$rs->fields['conf_value_text'],
                                                                                      
              'conf_type'=>$rs->fields['conf_type']);
                                                                      
              //Create PhpExt-Checkbox
                                                                      
              $tempChk = new PhpExt_Form_Checkbox();
                                                                      
              $labelTxt "TEXT_XT_PRINT_INVOICE_SETTINGS_LABEL_".strtoupper($rs->fields['conf_name']);
                                                                      
              $tempChk
                                                                      
              ->setChecked($rs->fields['conf_value'])
                                                                      ->
              setBoxLabel(__define($labelTxt));
                                                                      
              $settings_panel->addItem($tempChk);
                                                                  }
                                                              break;
                                                          case 
              'dropdown':
                                                              
              //Config type "text"
                                                              //Not yet implemented
                                                              
              break;
                                                      }
                                                  
              $rs->MoveNext();
                                              } 
              Du meinst aber sicherlich, das die Datenabfrage eine FUnktion sein sollte, die Unterscheidung eine Funktion und die Reaktion auf jede Unterscheidung, richtig? Das würde zumindest meinen Code leserlicher machen

              Das $conf Array könnte man ja dann global (Klassenweit) ausführen und nicht innerhalb der Funktion, so hätten alle Funktionen die mit dem Array arbeiten müssen trotzdem Zugriff, richtig?




              Nachtrag:

              Also durch debug_print_backtrace() bin ich schon soweit gekommen, das anscheinend durch den backendhandler der meine klasse ins backend lädt dort allerhand unsinn mit meinen funktionen anstellt.... der wichtige teil ist hier wohl:
              PHP-Code:
              xt_print_invoice->xt_print_preview_settings(Array ([_dc] =>  1417777963333,[load_section] => xt_print_invoice,[plugin] =>  xt_print_invoice,[pg] => xt_print_preview_settings,[orders_id] =>  3,[parentNode] => RemoteWindowTab2)) called at  [/mnt/webn/c1/06/54202506/htdocs/shop/xtFramework/admin/classes/class.ExtAdminHandler.php:334#2   ExtAdminHandler->display() called at  [/mnt/webn/c1/06/54202506/htdocs/shop/xtAdmin/adminHandler.php:0] 
              um das problem vielleicht zu "umgehen" anstatt es zu lösen (ich weiß, das ist eigentlich der falsche ansatz, aber am backend sollte ich vielleicht doch nicht rumcoden...) gibt es eine möglichkeit eine funktion innerhalb einer klasse als "exklusiv" zu definieren, das sie zum beispiel nur von innerhalb der klasse aufgerufen werden kann? nicht das jetzt gleich jeder nach "private" oder "protected" schreit, das habe ich bereits probiert, sowohl der backtrace
              PHP-Code:
              debug_print_backtrace(); 
              (in einer nicht direkt aufgerufenen funktion, die wird eigentlich nur per buttonklick aufgerufen) als auch eine testausgabe
              PHP-Code:
              echo "test"
              werden trotzdem ausgeführt, wenn die klasse geladen wird.
              allerdings wird die funktion wohl "nicht richtig" ausgeführt, denn der return-wert (in diesem fall ein jsStm mit einem alert) wird NICHT sofort ausgeführt, sondern korrekt erst dann wenn auf den Button geklickt wird... Ich versteh die Welt nicht mehr

              Kommentar


              • #8
                Ich würde mir an deiner Stelle überlegen ob es wirklich "global" sein muss oder ob du mit Factory/Singleton-Pattern arbeiten kannst was heißen würde du bekommst z.B. die DB-Verbindung von einer Factory-Klasse über die Connection-ID oder andere Services wie z.B. Config über eine statische Methode der Klasse.

                Alternativ könntest du die benötigten Objekte auch beim erstellen eines Objekts der Klasse also bei "new MeineKlasse();" übergeben und dann innerhalb der Klasse als eine private Klassenvariabele deklarieren.

                // @OT: Ich glaube aber das ersteres eher Best Practice wäre ... Sicher bin ich mir aber nicht ...
                Gruß,
                SebTM

                Kommentar


                • #9
                  Das mein Code unübersichtlich ist, ist ja noch ne ganz andere Nummer, daran arbeite ich, ich habe den problematischen Teil jetzt eingekreist, d.h. die ganze Klassenmechanik ist unwichtig, da die Funktion nicht vom backend oder der Klasse direkt aufgerufen wird, sondern vom Buttonhandler (wie unten beschrieben)

                  Hier der Backtrace:
                  PHP-Code:
                  #0 xt_print_invoice->saveSettings() called at [/mnt/webn/c1/06/54202506/htdocs/shop/plugins/xt_print_invoice/classes/class.xt_print_invoice.php:466] 
                  #1 xt_print_invoice->xt_print_preview_settings(Array ([_dc] => 1417778480801,[load_section] => xt_print_invoice,[plugin] => xt_print_invoice,[pg] => xt_print_preview_settings,[orders_id] => 3,[parentNode] => RemoteWindowTab2)) called at [/mnt/webn/c1/06/54202506/htdocs/shop/xtFramework/admin/classes/class.ExtAdminHandler.php:334] 
                  #2 ExtAdminHandler->display() called at [/mnt/webn/c1/06/54202506/htdocs/shop/xtAdmin/adminHandler.php:0] 
                  Die Zeile 466 die die Funktion aufruft ist der Handler

                  PHP-Code:
                  $button_save->setHandler($this->saveSettings()); 
                  Die Funktion "xt_print_preview_settings" wird korrekterweise durch den backend-Handler aufgerufen (RemoteWindowTab2 lädt automatisch die Sektion mit der Funktion) allerdings wird dadurch sofort die funktion "saveSettings" aufgerufen, die nur in einem Buttonhandler vorhanden ist:
                  PHP-Code:
                  $button_save = new PhpExt_Button();
                                      
                  $button_save->setText(__define("TEXT_XT_PRINT_INVOICE_SETTINGS_SAVE_BUTTON"));
                                      
                  $button_save->setHandler($this->saveSettings()); 
                  Die Problematik wird also vom PhpExt_Button erzeugt, dessen Handler nicht bei Buttonklick, sondern bei Funktionsaufruf ausgeführt wird...
                  Lasse ich den Handler aus (auskommentiert) wird die Funktion auch nicht mehr aufgerufen. Da ich mich vielleicht zu schnell auf PhpExt gestürzt habe ohne wirklich Ahnung davon zu haben...Kann mich jemand retten?

                  Kommentar


                  • #10
                    Ich bin ein böser, böser Mensch, ich habe einen Doppelpost :O

                    Ich bin etwas weiter gekommen, und zwar wenn ich das ganze folgendermaßen löse:

                    PHP-Code:
                    $button_save PhpExt_Button::createTextButton($button_save_title,new PhpExt_Handler(PhpExt_Javascript::stm(""))); 
                    Dann kann ich über das jsStm beliebig schalten und walten, ABER:
                    natürlich nur in js -.- da js ja clientseitig ist, php serverseitig, wird es wohl nicht möglich sein aus js eine php-funktion aufzurufen, noch in derselben klasse.
                    Meine Idee also: Warum nicht einfach das Fenster in der die Klasse geladen wird neu laden mit einer neuen Sektion, in dem Fall die "saveSettings" Sektion.
                    Problem: das komplette config Array müsste übergeben werden, quasi an sich selbst. Ist doch Schwachsinn oder?
                    Aber ne andere Lösung als neuladen fällt mir nicht ein...
                    Andererseits muss es doch wohl mit PhpExt eine Möglichkeit geben direkt Php-Funktionen aufzurufen oder nicht?

                    Kommentar


                    • #11
                      Ich hoffe ich hab es jetzt nicht überlesen - aber was soll deine Anwendung am Ende konrekt machen? Wieso nutzt du überhaupt dieses php-ext das 2008 das letzte mal geupdatet wurde?!
                      Gruß,
                      SebTM

                      Kommentar


                      • #12
                        Nein das hast du nicht überlesen, darüber hatten wir noch gar nicht gesprochen

                        Die "Anwendung" wird ein Plugin für das kostenlose Online-Shop-System "XT:Commerce", das in der Basisversion kostenlos ist, diverse Plugins allerdings einen Haufen Geld kosten, die wollen schließlich auch Geld verdienen. Jedoch gibt es eine Schnittstelle über die man eigene Plugins schreiben kann und die sowohl mit der DB als auch mit dem Front-/ bzw. Backend der Software zusammenarbeiten.
                        Da sind wir auch gleich beim nächsten Thema: Warum benutze ich eine völlig veraltete und dazu noch (meine persönliche Meinung) absolut umständliche Library namens Php-Ext.
                        Die Anwendung bietet die (keine Ahnung ob das so stimmt...) "Möglichkeit" Php-Ext oder das Sencha ExtJS zu benutzen. Um ehrlich zu sein, so blöd Php-Ext auch sein mag, es erschien mir einfacher als ExtJS.
                        Gibt es sonst irgendwelche Möglichkeiten die man nutzen könnte? Ich meine, ich kann auch ganze Bibliotheken in meine Klasse einbinden, ich war bloß zu faul nach etwas anderem zu suchen, wenn einem zwei Möglichkeiten quasi auf dem Silbertablett präsentiert werden.

                        Hier noch eine Beschreibung was mein Plugin letztendlich tun soll:

                        1. Die Datenbanktabelle "Bestellungen" auslesen, die Daten formatieren, in eine Word-Datei schreiben und zusätzlich (falls in den Einstellungen aktiviert) in PDF konvertieren. Es handelt sich hier quasi um eine Erstellung von Rechnungen oder Lieferscheinen.

                        2. Nachdem der ganze Quatsch funktioniert möchte ich es gerne einrichten, dass die Rechnungen auf Wunsch automatisch erstellt werden, sobald die Bestellung einen gewissen Status in der Datenbank erreicht. Bsp.: Man markiert die Bestellung als "Zahlung erhalten" oder als "Verschickt", dann erstellt das Plugin automatisch die Rechnung und speichert sie in einem Ordner. Ein weiterer Teil des Plugins soll es dann möglich machen diese zu drucken und auch als "bereits gedruckt" zu kennzeichnen.

                        Prinzipiell stellen mich die Funktionen an sich nicht vor ein Problem, die Integration ins Backend von XT:Commerce ist allerdings nicht ganz einfach. Dokumentation gibt es nicht oder nur teilweise, man hat sich zwar dazu entschieden User Plugins programmieren zu lassen, so ganz möchte man sich allerdings nicht in die Karten schauen lassen. Ist ja auch verständlich.

                        Also hier der neueste Stand zu meinem Plugin:

                        - Bestellungen werden ausgelesen und in einer Liste angezeigt, hierzu gibt es einen "Erstellen/Drucken"-Button für jeden Eintrag in der Liste

                        - Theoretisch kann ich die Daten schon in ein Word-Template einfügen und speichern und auch die Konvertierung in PDF funktioniert bereits

                        - Einstellungsmöglichkeiten (was soll in die Rechnung, wie soll das Plugin die Rechnung erstellen, Templatewahl, etc.) werden angezeigt und können verändert werden (zurück in die Datenbank kann ich es noch nicht schieben weil dieser sch**ß Button mit Php-Ext nicht funktioniert

                        - Es soll ein Preview angezeigt werden bevor die Rechnung tatsächlich gespeichert oder gedruckt wird. Hier stellt sich noch das Problem das ich inline nur das PDF anzeigen kann, letztendlich möchte ich es einrichten das in diesem Preview das Template nach Belieben verändert werden kann, davon bin ich aber noch weit entfernt und das soll hier auch kein Problem werden. Jedenfalls noch nicht


                        Ich hoffe jetzt sind alle Fragen erstmal beantwortet und ihr könnt mir irgendwie helfen, entweder mit Php-Ext, oder mit einer Alternative (für beides wäre ich sehr dankbar)


                        Noch ein abschließender Satz zum Schluss: Ja, das gehört theoretisch eher ins XT:Commerce-Forum, die Leute dort sind allerdings alles andere als hilfsbereit, kompetent oder freundlich, deshalb weigere ich mich das Forum dort zu benutzen (abgesehen davon das es dort eh keine Hilfe gibt) und für einen Support müsste ich eine Menge Geld im Monat abdrücken, klar ist nicht ob die mir in solchen Fragen dann helfen würden.

                        Kommentar


                        • #13
                          Schau dir AngularJS als Alternative zu ExtJS (bzw. PHP-EXT) an.
                          Wenn du Angular nicht sofort verstehst, dann gib dem Thema ein paar Stunden Zeit.
                          Standards - Best Practices - AwesomePHP - Guideline für WebApps

                          Kommentar


                          • #14
                            Zitat von rkr Beitrag anzeigen
                            Schau dir AngularJS als Alternative zu ExtJS (bzw. PHP-EXT) an.
                            Wenn du Angular nicht sofort verstehst, dann gib dem Thema ein paar Stunden Zeit.
                            Danke, das hat deutlich weitergeholfen!

                            Kommentar

                            Lädt...
                            X