Search This Blog

Sunday, February 27, 2011

Magento export porduct as text file with txt extension for feed or feeds

Hey there

Check the code below for Magento export porduct as text file with txt extension for feed or feeds

Magento - Export & Import Custom Product Options

The code

<?php
    // Load Magento
    require_once $_SERVER['DOCUMENT_ROOT'] . "/app/Mage.php";
    umask(0);
    Mage::app();
   
    // set Store ID
    $storeId         = Mage::app()->getStore()->getStoreId();
   
    // set loop start timer
    $starttime         = microtime();
    $startarray     = explode(" ", $starttime);
    $starttime         = $startarray[1] + $startarray[0];
   
    // get basic configuration
    $baseUrl         = Mage::app()->getStore($storeId)->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK);
    $baseMediaUrl     = Mage::getSingleton('catalog/product_media_config')->getBaseMediaUrl();
    $storeCharset    = Mage::getStoreConfig('design/head/default_charset');
   
    // set report email sender
    $from_email        = Mage::getStoreConfig('trans_email/ident_general/email');    // sender: general contact email
    $from_name        = Mage::getStoreConfig('trans_email/ident_general/name');    // sender: general contact name
   
    // set report email recipient from backend user "admin"
    Mage::getSingleton('core/session', array('name' => 'adminhtml'));
    $admin             = Mage::getModel('admin/user')->load(1);                     // load first administrator
    $to_email        = $admin->getEmail();                                        // recipient: admin email
    $to_name        = $admin->getFirstname() . ' ' . $admin->getLastname();        // recipient: admin name
   
    // set Google Base feed filename and directory
    $_feed_dir        = '/media/feed/';                                            // Feed directory
    $feedDir         = $_SERVER['DOCUMENT_ROOT'] . $_feed_dir;                    // Path to feed directory
    $gbaseFeed        = 'google_base_feed.txt';                                    // Google base feed filename
    $tmpCounter        = 'counter.txt';                                            // Temporary counter file
    $timer            = 'timer.txt';                                                // Temporary timer file
   
    // set log filename and directory
    $logDir            = $_SERVER['DOCUMENT_ROOT'] . '/var/log/';                    // Log directory
    $logFile        = $logDir . date('Y-m') . '-gbase-feed.log';                // Google base log filename
   
    // define basic file constants
    define('SAVE_FEED_LOCATION',     $feedDir . $gbaseFeed);                        // google base file
    define('SAVE_FEED_RELOAD',         $feedDir . $tmpCounter);                    // counter file
    define('SAVE_FEED_TIMER',        $feedDir . $timer);                            // timer file
               
    // make sure we don't time out
    @ini_set('max_execution_time', '0');
    @ini_set('max_input_time', '0');
    @set_time_limit(0);
    @ignore_user_abort(true);
   
    // set headers to Magento character set
    header('Content-Type: text/html; charset=' . $storeCharset);
       
    try
    {
       
        // create FEED directory in case it doesn't exist yet
        if (!file_exists($feedDir))
        {
            mkdir($feedDir, 0777);
        }
       
        // basic setup
        $reload_line         = (file_exists(SAVE_FEED_RELOAD)) ? file_get_contents(SAVE_FEED_RELOAD) : 0;
        $timer_line         = (file_exists(SAVE_FEED_TIMER)) ? file_get_contents(SAVE_FEED_TIMER) : 0;
        $handle                = ($reload_line == 0) ? fopen(SAVE_FEED_LOCATION, 'w') : fopen(SAVE_FEED_LOCATION, 'a+');
        $handle_reload         = fopen(SAVE_FEED_RELOAD, 'w');
        $handle_timer         = fopen(SAVE_FEED_TIMER, 'w');
       
        if ($reload_line == 0)
        {
            $heading         = array('id','title','description','link','image_link','price','brand','product_type','condition', 'c:product_code');
            $feed_line        = implode("\t", $heading) . "\r\n";
            fwrite($handle, $feed_line);
        }
       
        //---------------------- GET THE PRODUCTS   
        $visibility         =     array (
                                    Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
                                    Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
                                );
       
        $products = Mage::getModel('catalog/product')->getCollection();
        $products->addAttributeToFilter('status', 1);                     //enabled
        $products->addAttributeToFilter('visibility', $visibility);
        $products->addAttributeToSelect('sku');
        $prodIds = $products->getAllIds();
       
        foreach($prodIds as $productId)
        {
           
            if (($productId>=$reload_line) & ($productId<$reload_line+100))
            {
               
                // load product object
                $product                             = Mage::getModel('catalog/product');
                $product->load($productId);
               
                // populate product data array
                $product_data                         = array();   
                $product_data['sku']                = $product->getSku();   
                $product_data['title']                = $product->getName();
                $product_data['description']        = trim(ereg_replace("^[ \t\r\n]+|[ \t\r\n]+", " ", strip_tags($product->getShortDescription())));
                $product_data['link']                = $baseUrl . $product->getUrlKey() . Mage::getStoreConfig('catalog/seo/product_url_suffix') . '?source=googleps';
                $product_data['image_link']            = $baseMediaUrl . $product->getImage();
                $product_data['price']                = $product->getFinalPrice();
                $product_data['brand']                = $product->getAttributeText('manufacturer');   
                $product_data['product_type']         = '';
                $product_data['condition']            = 'new';
                $product_data['c:product_code']        = $product->getSku();
                   
                //get the product categories                   
                foreach($product->getCategoryIds() as $_categoryId)
                {
                    $category                         = Mage::getModel('catalog/category')->load($_categoryId);
                    $product_data['product_type']    .= $category->getName().', ';
                }
                $product_data['product_type']        = rtrim($product_data['product_type'],', ');       
   
                //sanitize data   
                foreach($product_data as $k=>$val)
                {
                    $bad                            = array('"',"\r\n","\n","\r","\t");
                    $good                            = array(""," "," "," ","");
                    $product_data[$k]                 = '"'.str_replace($bad,$good,$val).'"';
                }

                $feed_line                             = implode("\t", $product_data)."\r\n";
                fwrite($handle, $feed_line);
                fflush($handle);
                       
            }
        }

        //---------------------- WRITE THE FEED   
        fclose($handle);
        $feed_line_reload     = $reload_line + 100;
        fwrite($handle_reload, $feed_line_reload);
        fclose($handle_reload);
       
        // end of loop time
        $looptime             = microtime();
        $looparray             = explode(" ", $looptime);
        $looptime             = $looparray[1] + $looparray[0];
        $tmptime             = $looptime - $starttime;
       
        // sum of all passed loop times
        $feed_line_timer     = $timer_line + $tmptime;
        fwrite($handle_timer, $feed_line_timer);
        fclose($handle_timer);
    }
    catch(Exception $e)
    {
        //---------------------- LOG THE EXCEPTION   
        if (!file_exists($logDir))
        {
            mkdir($logDir, 0777);
        }
       
        if (!file_exists($logFile))
        {
            touch($logFile);
           
            $logHandle = fopen($logFile, 'w+');
           
            fwrite(              
                   $logHandle,
                   date('Y-m-d  H:i:s') . "  |  GOOGLE BASE FEED GENERATION PROBLEM\n\n" .
                   $e->getMessage() . "\n\n" .
                   "-------------------------------------------------------------------------------------------------------------------\n\n"
            );
           
            fclose($logHandle);        
        }
        else
        {
           
            $ini_handle     = fopen($logFile, "r");
            $ini_contents     = fread($ini_handle, filesize($logFile));
            fclose($ini_handle);
           
            $logHandle         = fopen($logFile, 'w+');
            fwrite(
                   $logHandle,
                   date('Y-m-d  H:i:s') . "  |  GOOGLE BASE FEED PROBLEM\n\n" .
                   $e->getMessage() . "\n\n" .
                   "-------------------------------------------------------------------------------------------------------------------\n\n" .
                   $ini_contents
            );
            fclose($logHandle);
           
        }
       
        //---------------------- SEND THE EXCEPTION    TO the ADMIN'S EMAIL
        $mail = new Zend_Mail($storeCharset);
        $mail->setBodyText($e->getMessage(), $storeCharset);
        $mail->setFrom($from_email, $from_name);
        $mail->addTo($to_email, $to_name);
        $mail->setSubject(date('Y-m-d') . ': Google base problem');
        try
        {
            $mail->send();
        }       
        catch(Exception $ex)
        {
            Mage::getSingleton('core/session')->addError('Cann\'t send the email. Try it later, please ...');
        }
       
        header('Content-Type: text/html; charset=' . $storeCharset);
        die($e->getMessage());
    }
    if (end($prodIds) < $reload_line)
    {
        // final feed generation time
        $totaltime         = round($feed_line_timer, 2); 
       
        // remove counter file
        @unlink(SAVE_FEED_RELOAD);
        @unlink(SAVE_FEED_TIMER);
       
        //---------------------- LOG THE SUCCESS   
        if (!file_exists($logDir))
        {
            mkdir($logDir, 0777);
        }
       
        if (!file_exists($logFile))
        {
            touch($logFile);
           
            $logHandle = fopen($logFile, 'w+');
           
            fwrite(              
                   $logHandle,
                   date('Y-m-d  H:i:s', filemtime ( SAVE_FEED_LOCATION ) ) . "  |  " . $gbaseFeed . "  |  " . count($prodIds) . " products exported  |  time: " . $totaltime . " seconds  |  size: " . format_bytes ( filesize ( SAVE_FEED_LOCATION ) ). "\n" .
                   "-------------------------------------------------------------------------------------------------------------------\n\n"
            );
           
            fclose($logHandle);        
        }
        else
        {
           
            $ini_handle     = fopen($logFile, "r");
            $ini_contents     = fread($ini_handle, filesize($logFile));
            fclose($ini_handle);
           
            $logHandle         = fopen($logFile, 'w+');
            fwrite(
                   $logHandle,
                   date('Y-m-d  H:i:s', filemtime ( SAVE_FEED_LOCATION ) ) . "  |  " . $gbaseFeed . "  |  " . count($prodIds) . " products exported  |  time: " . $totaltime . " seconds  |  size: " . format_bytes ( filesize ( SAVE_FEED_LOCATION ) ). "\n" .
                   "-------------------------------------------------------------------------------------------------------------------\n\n" .
                   $ini_contents
            );
            fclose($logHandle);
           
        }
       
        $log_handle     = fopen($logFile, "r");
        $log_contents     = fread($log_handle, filesize($logFile));
        fclose($log_handle);
       
        //---------------------- SEND THE LOG FILE TO ADMIN EVERY LAST DAY OF MONTH   
        if( date('d') == find_last_day(date('Y-m-d')) )
        {
           
            $mail = new Zend_Mail($storeCharset);
            $mail->setBodyText($log_contents, $storeCharset);
            $mail->setFrom($from_email, $from_name);
            $mail->addTo($to_email, $to_name);
            $mail->setSubject('Google base log from ' . date('m/Y') . ' period');
            try
            {
                $mail->send();
            }       
            catch(Exception $ex)
            {
                Mage::getSingleton('core/session')->addError('Cann\'t send the email. Try it later, please ...');
            }
           
        }
    }
    else
    {
        //---------------------- REFRESH SCRIPT TILL THE WHOLE FEED IS GENERATED
       
        curl_file_get_contents('http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']);

        // possible refresh variants

        //---------------------- script runs by web browser
        // header( 'refresh: 1; url=' . $_SERVER['PHP_SELF'] );
        // header('Location: '. $_SERVER['PHP_SELF']);
        // header("Location: http://$_SERVER[SERVER_NAME]" . substr($_SERVER["PHP_SELF"], 0, strrpos($_SERVER["PHP_SELF"], "/")) . "/");
        // echo '<META http-equiv="refresh" content="1; URL=' . $_SERVER['PHP_SELF'] . '">';
       
        //---------------------- script runs by cron
        // file_get_contents('http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']);
        // curl_header_refresh('http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']);
        // curl_file_get_contents('http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']);
       
    }
   
    function format_bytes($bytes, $precision = 2)
    {
        $units                 = array('B', 'KB', 'MB', 'GB', 'TB');
        $bytes                 = max($bytes, 0);
        $pow                 = floor(($bytes ? log($bytes) : 0) / log(1024));
        $pow                 = min($pow, count($units) - 1);
        $bytes                 /= pow(1024, $pow);
        return round($bytes, $precision) . ' ' . $units[$pow];
    }
   
    function find_last_day($anyDate)
    {
        //$anyDate            = '2009-08-25';                            // date format should be yyyy-mm-dd
        list($yr,$mn,$dt)    = split('-',$anyDate);                   
        $timeStamp            = mktime(0,0,0,$mn,1,$yr);               
        list($y,$m,$t)        = split('-',date('Y-m-t',$timeStamp));   
        $lastDayTimeStamp    = mktime(0,0,0,$m,$t,$y);               
        $lastDay            = date('d',$lastDayTimeStamp);           
        return $lastDay;
    }
   
    function curl_header_refresh($url)
    {
        $curl_init            = curl_init();
        curl_setopt($curl_init, CURLOPT_URL, $url);
        curl_setopt($curl_init, CURLOPT_HEADER, 0);
        $contents             = curl_exec($curl_init);
        curl_close($curl_init);
        return $contents;
    }
   
    function curl_file_get_contents($url)
    {
        $curl_init            = curl_init();                                            
        curl_setopt($curl_init, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl_init, CURLOPT_URL, $url);
        $contents             = curl_exec($curl_init);
        curl_close($curl_init);
        return $contents;
    }
   
?>


The Link
http://todd.be/notes/exporting-importing-magento-product-options
http://www.magentocommerce.com/boards/viewthread/153230/#t227283

No comments:

Post a Comment