Modulshop - Eine große Auswahl an neuen und hilfreichen Modulen für die modified eCommerce Shopsoftware
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: automatischer Artikelimport per PHP Datei

    xmerlin

    • Neu im Forum
    • Beiträge: 3
    • Geschlecht:
    automatischer Artikelimport per PHP Datei
    am: 12. August 2012, 12:00:44
    Hallo,
    ich befasse mich schon seid einiger Zeit mit der Importfunktion der aktuellen xtc Version. Über das Admin Backend kann ich die erstellten CSV Dateien auch problemlos importieren, leider nur manuell. Ich haben schon sämtliche Foren durchsucht um Hilfe zu bekommen, bislang ohne Erfolg.

    Ich habe mir gedacht, dass ich die csv_backend.php einfach mit den nötigen (GET/POST) Parametern aufrufe, das klappt aber nicht.

    Hat jemand eine Idee oder eine andere Lösung für das Problem ?

    Danke schonmal im vorraus.

    Hier mein Script :

    Code: PHP  [Auswählen]
            $host = 'xxx.xxx.xxx.xxx';
            $path = '/admin/csv_backend.php?action=import';
            $data = 'select_file=xxx.csv&select_content=products';
            $fp = fsockopen($host, 80, $errno, $errstr, 30);
            if (!$fp) {
                    echo $buffer .= "$errstr ($errno)<br />\n";
            } else {
                    $out = "POST ".$path." HTTP/1.1\r\n";
                    $out .= "Host: ".$host."\r\n";
                    $out .= "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n";
                    $out .= "Content-Length: ".strlen($data)."\r\n";

                    $out .= "Connection: Close\r\n\r\n";
                    $out .= $data;

                    fwrite($fp, $out);

                    while (!feof($fp)) {
                            $buffer .= fgets($fp, 128);
                    }
                    fclose($fp);
            }



    Linkback: https://www.modified-shop.org/forum/index.php?topic=21685.0

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: automatischer Artikelimport per PHP Datei
    Antwort #1 am: 12. August 2012, 12:38:59
    Hallo xmerlin,
    falls die Lösung was kosten darf, hätte ich was für dich.

    Besten Gruß

    h-h-h

    xmerlin

    • Neu im Forum
    • Beiträge: 3
    • Geschlecht:
    Re: automatischer Artikelimport per PHP Datei
    Antwort #2 am: 13. August 2012, 09:25:06
    Hallo,

    erstmal Danke für die schnelle Reaktion.

    Kosten sind natürlich relativ. Einen gewissen Betrag ist es mir schon wert. Was hast Du denn im Angebot ?

    Gruß xmerlin

    Bonsai

    • Viel Schreiber
    • Beiträge: 4.127
    • Geschlecht:
    Re: automatischer Artikelimport per PHP Datei
    Antwort #3 am: 29. Mai 2014, 18:43:25
    Da das einzige zum Thema dieser Thread war, als ich vor diesem Problem stand, hier meine Lösung:

    Bei mir liegen im root des shops 2 php files.

    Damit keiner Mist baut lasse ich nur die feste IP unseres Büros zu.
    (Wer keine feste IP hat, kann diese Datei automatisch generieren und per sftp hochladen)
    ipcheck.php:
    Code: PHP  [Auswählen]
    <?php
    // security -- only allow IP adress of our office
    if (getenv('REMOTE_ADDR') != "xxx.xxx.xxx.xxx") die ("Access denied!");
    ?>

    Dieses File kann man z.B. in ein PHP script auf einem lokalen Webserver im eigenen Büro einbauen.
    Ich kopiere per SFTP die Produktbilder und die import.csv auf den Webserver im Internet und rufe dann dieses Script auf mit
    echo file_get_contents("https://www.example.com/upload_products.php");
    Code: PHP  [Auswählen]
    <?php

    // security -- only allow IP adress of our office
    include('ipcheck.php');


    // filename of input file
    $filename = 'import.csv';

    // tell modified shop code, we have a secure access
    define ("_VALID_XTC","OK");
    // tell import class our delimeter and textsign
    define ('CSV_SEPERATOR',"\t"); // I use tab here (make sure your import.csv doesn't contain any tab inside a cell!!!)
    define ('CSV_TEXTSIGN','#');    // I use # here (make sure your import.csv doesn't contain any # inside a cell!!!)

    // include
    require('includes/application_top.php');
    require('admin/includes/classes/import.php');
    require('inc/xtc_format_filesize.inc.php');
    require('inc/xtc_get_customers_statuses.inc.php');


    // import data
    $handler = new xtcImport($filename);
    $mapping=$handler->map_file($handler->generate_map());
    $import=$handler->import($mapping);

    // output success and/or failure
    if ($import)
    {
     if ($import[0])
     {
      echo '<table width="100%"  border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                    <td class="messageStackSuccess">'
    ;

                                    if (isset($import[0]['prod_new'])) echo 'Neue Artikel:'.$import[0]['prod_new'].'<br />';
                                    if (isset($import[0]['cat_new'])) echo 'Neue Kategorien:'.$import[0]['cat_new'].'<br />';
                                    if (isset($import[0]['prod_upd'])) echo 'Aktualisierte Artikel:'.$import[0]['prod_upd'].'<br />';
                                    if (isset($import[0]['cat_upd'])) echo 'Aktualisierte Kategorien:'.$import[0]['cat_upd'].'<br />';
                                    if (isset($import[0]['cat_touched'])) echo 'Betroffene Kategorien:'.$import[0]['cat_touched'].'<br />';
                                    if (isset($import[2])) echo $import[2];

      echo '                </td>
                            </tr>
                    </table>'
    ;
     }

     if (isset($import[1]) && $import[1][0]!='')
     {
      echo '<table width="100%"  border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                    <td class="messageStackError">'
    ;

                                    for ($i=0;$i<count($import[1]);$i++)
                                    {
                                            echo $import[1][$i].'<br />';
                                    }


      echo '                </td>
                            </tr>
                    </table>'
    ;
     }

    }

    ?>

    Im Prinzip macht das exakt das was passiert, wenn man im Backend die Import Funktion nutzt.
    Teile des Codes sind aus dem Shop kopiert und nur geringfügig angepasst.

    Achja, bevor jetzt jemand motzt "Funktioniert nicht". Die Import Klasse ist (obwohl der Fehler letztes Jahr schon gefunden und hier im Forum behoben wurde) in der aktuellen Version des Shops leider unbrauchbar, da die Gruppenberechtigungen für den Admin fehlen. Ich empfehle dringend die import.php zu reparieren bevor man die nutzt. Wer zusätzliche Datenbankfelder eingebaut hat, muss die sowieso nochmal anpacken. (Fehlt leider im Tutorial "Zusätzliche Datenbankfelder einbauen")

    Muss man das eigentlich verstehen warum der Bugfix nicht ins Release eingeflossen ist?  :mhhh:

    Was noch folgt ist, das Imageprocessing würde ich gerne noch automatisiert anwerfen, ich denke hier noch über die sinnvollste Variante nach.

    webald

    • modified Team
    • Beiträge: 2.791
    Re: automatischer Artikelimport per PHP Datei
    Antwort #4 am: 30. Mai 2014, 08:54:30
    wir übertragen die Bilder per HTTP. Auf dem Webserver liegt eine Datei, die etwa so aussieht:
    Code: PHP  [Auswählen]
    <?php

    include('../includes/configure.php');
    include('../includes/database_tables.php');
    // Store DB-Querys in a Log File
    define('STORE_DB_TRANSACTIONS', 'false');
    // Database
    require_once (DIR_FS_INC.'xtc_db_connect.inc.php');
    require_once (DIR_FS_INC.'xtc_db_close.inc.php');
    require_once (DIR_FS_INC.'xtc_db_error.inc.php');
    require_once (DIR_FS_INC.'xtc_db_perform.inc.php');
    require_once (DIR_FS_INC.'xtc_db_query.inc.php');
    require_once (DIR_FS_INC.'xtc_db_queryCached.inc.php');
    require_once (DIR_FS_INC.'xtc_db_fetch_array.inc.php');
    require_once (DIR_FS_INC.'xtc_db_num_rows.inc.php');
    require_once (DIR_FS_INC.'xtc_db_data_seek.inc.php');
    require_once (DIR_FS_INC.'xtc_db_insert_id.inc.php');
    require_once (DIR_FS_INC.'xtc_db_free_result.inc.php');
    require_once (DIR_FS_INC.'xtc_db_fetch_fields.inc.php');
    require_once (DIR_FS_INC.'xtc_db_output.inc.php');
    require_once (DIR_FS_INC.'xtc_db_input.inc.php');
    require_once (DIR_FS_INC.'xtc_db_prepare_input.inc.php');
    require_once (DIR_FS_INC.'xtc_get_top_level_domain.inc.php');
    require_once (DIR_FS_INC.'xtc_validate_password.inc.php');
    require_once (DIR_FS_INC.'xtc_not_null.inc.php');
    // require_once ('../admin/includes/functions/general.php');

    // make a connection to the database... now
    xtc_db_connect() or die('Unable to connect to database server!');

    // security
    define('_VALID_XTC',true);
    include('../admin/includes/classes/categories.php');
    include ('../admin/includes/functions/general.php');
    include('../admin/includes/configure.php');
    include('../admin/includes/classes/image_manipulator_GD2.php');

    /* Zugriff prüfen */
    $mail_address = $_GET['email_address'];
    $password = $_GET['password'];
    $tempfile = $_FILES['file']['tmp_name'];
            $art = $_GET['article'];
    $check_customer_query = xtc_db_query("select customers_id, customers_firstname,customers_lastname, customers_password, customers_email_address from customers where customers_status='0' AND customers_email_address = '".xtc_db_input($mail_address)."'");
    if (xtc_db_num_rows($check_customer_query) > 0) {
            $check_customer = xtc_db_fetch_array($check_customer_query);
            // Check that password is good
            if (xtc_validate_password($password, $check_customer['customers_password'])) {

    /* Dateispeicherung */
    if(is_uploaded_file($tempfile))
    {
            echo $tempfile;
            echo $art;
            $handle = fopen($tempfile, "r");
            /* $fp=fopen($art . "_uploaded.file","w"); */
            $fp=fopen("../images/product_images/original_images/" . $art,"w");
            $contents = fread($handle, filesize($tempfile));
            fwrite($fp,$contents);
            fclose($handle);
                           
                            $products_image_name=$art;
                            // set application wide parameters
                            $configuration_query = xtc_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from ' . TABLE_CONFIGURATION . '');
                            while ($configuration = xtc_db_fetch_array($configuration_query)) {
                                    define($configuration['cfgKey'], $configuration['cfgValue']);
                            }
                           
                            //echo DIR_FS_CATALOG_ORIGINAL_IMAGES . $products_image_name. '|' .PRODUCT_IMAGE_THUMBNAIL_WIDTH. '|' .PRODUCT_IMAGE_THUMBNAIL_HEIGHT. '|' .DIR_FS_CATALOG_THUMBNAIL_IMAGES . $products_image_name. '|' .IMAGE_QUALITY    ;      
                            require('../admin/includes/' . 'product_thumbnail_images.php');
                            require('../admin/includes/' . 'product_info_images.php');
                            require('../admin/includes/' . 'product_popup_images.php');
    }
            }
    }
    echo "|||". $tempfile ."|||". $art ."|||". $mail_address . "|||" .$vstranserror. "|||";
    echo '<form action="" method="post" ENCTYPE="multipart/form-data">
    <input type="file" name="file" size="30">
    <input name="email_address" size="96">
    <input name="password" size="40">
    <input name="article" size="20">
    <input type="submit" value="Upload">
    </form>'
    ;
    ?>

    Wir rufen das ganze aus einem .NET Programm aus der WAWI auf.

    Bonsai

    • Viel Schreiber
    • Beiträge: 4.127
    • Geschlecht:
    Re: automatischer Artikelimport per PHP Datei
    Antwort #5 am: 30. Mai 2014, 09:16:47
    Ich lade mit den beiden Funktionen die Daten, also Bilder und CSV File hoch (vom lokalen Webserver):
    Für die Net_SFTP Klasse muss man die phpseclib includieren http://phpseclib.sourceforge.net/

    Code: PHP  [Auswählen]
    function upload_products() {
            // we upload all pictures and the import.csv
            global $FTP_server;
            global $FTP_user;
            global $FTP_pass;
            global $FTP_remoteimages;
            global $delim;
            global $sep;

            // connect
            if ($SFTP_connection = New Net_SFTP($FTP_server, 22)) {
                    echo "<p>FTP Verbindung  mit Server " . $FTP_server . " aufgebaut</p>";
            } else {
                    die ("<p class='error'>FEHLER: keine Verbindung zum FTP Server </p>" . $FTP_server);
            }
            // authenticate
            if ($SFTP_connection->login($FTP_user, $FTP_pass)) {
                    echo "<p>Erfolgreich am FTP Server " . $FTP_server . " authentifiziert</p>";
            } else {
                    die ("<p class='error'>FEHLER: Authentifizierung am FTP Server"  . $FTP_server . " fehlgeschlagen!</p>");
            }

            // change remote dir
            if (!$SFTP_connection->chdir($FTP_remoteimages)) {
                    die ("FEHLER: FTP Remoteverzeichnis " . $FTP_remoteimages . " nicht gefunden!");
            }
            // get csv data for picture names
            $csv = read_csv();
            // upload pictures
            $local_path = $_SERVER['DOCUMENT_ROOT'] . "/Lexware_connector/images/";
            foreach ($csv['p_image'] as $filename) {
                    if (!$SFTP_connection->put($filename,$local_path . $filename, NET_SFTP_LOCAL_FILE)) {
                            die("<p class='error'>ERROR: Konnte Datei $filename nicht auf den Server $FTP_server hochladen!</p>");
                    } else {
                            echo "<p>Datei $filename erfolgreich zum Server $FTP_server hochgeladen.</p>\n";
                    }
            }
           
            // now the CSV
            // change remote dir
            if (!$SFTP_connection->chdir('/modifiedshop/import')) {
                    die ("FEHLER: FTP Remoteverzeichnis /modifiedshop/import nicht gefunden!");
            }
            // upload file
            $local_path = $_SERVER['DOCUMENT_ROOT'] . "/Lexware_connector/outfile/";
            if (!$SFTP_connection->put("import.csv",$local_path . "import.csv", NET_SFTP_LOCAL_FILE)) {
                    die("<p class='error'>ERROR: Konnte Datei import.csv nicht auf den Server $FTP_server hochladen!</p>");
            } else {
                    echo "<p>Datei import.csv erfolgreich zum Server $FTP_server hochgeladen.</p>\n";
            }
    }

    function read_csv() {
            global $sep;
            global $delim;
            // loop over whole CSV and return array with all data
            if (! $handle = fopen("outfile/import.csv", "r")) die("<p class='error'>ERROR: CSV Datei nicht lesbar!</p>\n");

            // first get headlines
            $headlines = fgetcsv($handle,0,$delim,$sep);
            // now the data
            $y = 0;
            while (($line = fgetcsv($handle,0,$delim,$sep)) !== false) {
                    for ( $x = 0; $x < count($headlines); $x++ ) {
                            $csv[$headlines[$x]][$y]=$line[$x];
                    }
                    $y++;
            }
            fclose($handle);
            return $csv;
    }
     

    Nur das imageprocessing fehlt mir noch ..... mal sehen ob ich das heute noch hin bekomme.
    2 Antworten
    2725 Aufrufe
    06. Januar 2011, 19:26:00 von swolfram [templatix]
    0 Antworten
    2329 Aufrufe
    30. Dezember 2012, 18:01:38 von mwdragon
    1 Antworten
    2692 Aufrufe
    07. April 2012, 18:12:35 von web28
    4 Antworten
    4004 Aufrufe
    16. Juli 2012, 09:44:47 von Tomm
               
    anything