CSVSource.php Overload

Thema wurde von ff-webdesigner, 13. November 2023 erstellt.

  1. ff-webdesigner
    ff-webdesigner Erfahrener Benutzer
    Registriert seit:
    22. Januar 2014
    Beiträge:
    548
    Danke erhalten:
    53
    Danke vergeben:
    60
    Hallo beisammen,

    ich versuche gerade die Klasse CSVSource zu überladen. Ich brauche nur in den beiden Funktionen transform_to_csv und build_csv_line kleine anpassungen. Der Overload ist fertig unter /GXModules/ff-webdesigner/custom/Shop/Overloads/CSVSource/ff_CSVSource.inc.php und wird anscheinend auch geladen. Denn: unter /admin/csv.php bleibt der Hauptbereich leer anstatt die Export-Schemata anzuzeigen.

    Welche Teile der CSVSource.php brauche ich noch um das wieder zu richten?
     
  2. Anonymous
    Anonymous Administrator
    Mitarbeiter
    Registriert seit:
    26. April 2011
    Beiträge:
    1.954
    Danke erhalten:
    1.588
    Danke vergeben:
    339
    @ff-webdesigner Ohne den Inhalt deiner Overload Datei zu kennen, kann man das nicht sagen. Aber eine häufige Fehlerquelle ist, man vergisst das parent:: aufzurufen mit der Funktion die man überlädt.
     
  3. ff-webdesigner
    ff-webdesigner Erfahrener Benutzer
    Registriert seit:
    22. Januar 2014
    Beiträge:
    548
    Danke erhalten:
    53
    Danke vergeben:
    60
    ja, den Fehler hab ich definitiv auch einige Male gemacht. Ist aber hier nicht die Ursache. Dastimmt schon irgendwas vor Aufruf der zentralen Exportfunktionen nicht. Inhalt meines Overloads mit nur 5 minikleinen Anpassungen:

    PHP:

    class ff_CSVSource extends ff_CSVSource_parent
    {
      
        protected function 
    transform_to_csv($p_scheme_id, &$p_data_array$p_new_file)
        {
          
            
    // bringt auch nix parent::proceed();
            
    $t_return_value '';
            
    $t_success      true;
            
    $t_field_names  $this->v_scheme_model_array[$p_scheme_id]->get_sorted_field_names();
            
    $t_quotes       $this->v_scheme_model_array[$p_scheme_id]->v_data_array['field_quotes'];
            
    $t_separator    $this->v_scheme_model_array[$p_scheme_id]->v_data_array['field_separator'];
          
            
    $t_separator str_replace('\t'"\t"$t_separator);
          
            if (
    $p_new_file) {
                
    $t_data_array    = [];
                
    $t_data_array[0] = [];
              
                foreach (
    $t_field_names as $t_field_name) {
                    
    $t_data_array[0][$t_field_name] = $t_field_name;
                }
                
    // mod ff $p_scheme_id an build_csv_line übergeben
                
    $t_formatted $this->build_csv_line($t_data_array$t_field_names$t_separator$t_quotes$p_scheme_id);
              
                
    $t_success &= $this->write_data_set($t_formatted$t_return_value);
            }
            
    // mod ff $p_scheme_id an build_csv_line übergeben
            
    $t_formatted $this->build_csv_line($p_data_array$t_field_names$t_separator$t_quotes$p_scheme_id);
            
    $t_success   &= $this->write_data_set($t_formatted$t_return_value);
          
            return 
    $t_return_value;
        }
      
        
    // mod ff $p_scheme_id an build_csv_line übergeben
        
    protected function build_csv_line(&$p_data_array, &$p_field_names, &$p_delimiter, &$p_enclosure$p_scheme_id)
        {
            
    // bringt auch nix parent::proceed();
            
    $t_field_names_count count($p_field_names);
            
    $t_formatted         '';
            
    $counter=0;
            foreach (
    $p_data_array as $t_data_row) {
              
                
    // mod ff produkte mit bestand und Lagerort "Verfügungslager" exportieren
                
    if($p_scheme_id == "27")
                if(
    $t_data_row["Lagerbestand"] != "Lagerbestand"){
                    if(
    $t_data_row["Lagerbestand"] == "0.0000") continue;
                    if(
    strpos($t_data_row["Lagerort"],"Verfügungslager")===FALSE) continue;
                }
              
                foreach (
    $p_field_names as $t_field_name) {
                    
    $t_formatted .= $p_enclosure $this->escape_enclosure_character($t_data_row[$t_field_name],
                                                                                     
    $p_enclosure) . $p_enclosure;
                  
                    if (
    $t_field_name != $p_field_names[$t_field_names_count 1]) {
                        
    $t_formatted .= $p_delimiter;
                    } else {
                        
    $t_formatted .= "\n";
                    }
                }
                if (
    $counter 10000) break;
            }
          
            return 
    $t_formatted;
        }
    }
     
  4. Anonymous
    Anonymous Administrator
    Mitarbeiter
    Registriert seit:
    26. April 2011
    Beiträge:
    1.954
    Danke erhalten:
    1.588
    Danke vergeben:
    339
    Du musst nicht die parent::proceed aufrufen, sondern die parent::transform_to_csv damit dein Overload funktioniert und kein Fehler auftritt.

    Beim Überladen musst du immer die Elternmethode auch aufrufen, die du überlädst, sonst laufen die normalen Standardabläufe nicht mehr.
     
  5. ff-webdesigner
    ff-webdesigner Erfahrener Benutzer
    Registriert seit:
    22. Januar 2014
    Beiträge:
    548
    Danke erhalten:
    53
    Danke vergeben:
    60
    ahhhhh....wunderte mich schon dass die CSVSource.php als erste von 20 fertigen Overloads nicht die funktion proceed() hatte.

    hab den code der funktionen geändert in

    PHP:
    class ff_CSVSource extends ff_CSVSource_parent
    {
      
        protected function 
    transform_to_csv($p_scheme_id, &$p_data_array$p_new_file)
        {
          
            
    parent::transform_to_csv($p_scheme_id, &$p_data_array$p_new_file);
            
    // mein code
            
    return $t_return_value;
        }
      
        
    // mod ff $p_scheme_id an build_csv_line übergeben
        
    protected function build_csv_line(&$p_data_array, &$p_field_names, &$p_delimiter, &$p_enclosure$p_scheme_id)
        {
            
    parent::build_csv_line(&$p_data_array, &$p_field_names, &$p_delimiter, &$p_enclosure$p_scheme_id);
           
    // mein code
          
            
    return $t_formatted;
        }
    }
    Caches für Seiten und Module geleert. Auf der Seite /admin/csv.php bleibt leider der Hauptbereich weiter leer, auch wenn ich in parent:: keine parameter übergebe...
     
  6. Anonymous
    Anonymous Administrator
    Mitarbeiter
    Registriert seit:
    26. April 2011
    Beiträge:
    1.954
    Danke erhalten:
    1.588
    Danke vergeben:
    339
    Du musst den return Wert auch zurückgeben mit der Originalfunktion, das hatte ich in dem Beispiel schon so gebaut, dass es das tut.
     
  7. ff-webdesigner
    ff-webdesigner Erfahrener Benutzer
    Registriert seit:
    22. Januar 2014
    Beiträge:
    548
    Danke erhalten:
    53
    Danke vergeben:
    60
    mea culpa, ausfahren oben übersehen. aber auch dein code oben endet in leerem hauptbereich. ist nicht euer job sowas zu lösen. hoffe noch auf andere entwickler...

    ich denk auch der fehler liegt nicht in den methoden/funktionen. die werden ja erst beim exportieren aufgerufen. aber schon die seite die eigentlich die exportschemata anzeigen soll bleibt leer. da fehlt irgendwas anderes aus der CSVSource.php...
     
  8. Anonymous
    Anonymous Administrator
    Mitarbeiter
    Registriert seit:
    26. April 2011
    Beiträge:
    1.954
    Danke erhalten:
    1.588
    Danke vergeben:
    339
    @ff-webdesigner Das kann eine Kleinigkeit sein, die man jetzt aus den Code-Zeilen nicht sehen kann. Da müsste man dann auf dem Server direkt schauen wo das Problem liegt. Wenn du ein Ticket aufmachst, kann ich da kurz reinschauen, wenn du das in einem Testshop hast.
     
  9. ff-webdesigner
    ff-webdesigner Erfahrener Benutzer
    Registriert seit:
    22. Januar 2014
    Beiträge:
    548
    Danke erhalten:
    53
    Danke vergeben:
    60