Reading list Switch to dark mode

    Import product image to Joomla VirtueMart from base64 string

    Updated 8 January 2019

    In Joomla VirtueMart 3.0.x we can add a product image corresponding to a Joomla VirtueMart product id. The listed article describes the product image upload and its entries to be made at Joomla VirtueMart from a base64 converted string for an image.

    As you will see, Joomla VirtueMart takes configurations and particular name convention to create and save an image at its end, that are covered in the listed code.

    <?php
    /**
     * Webkul Software.
     *
     * @category  Webkul
     * @author    Webkul
     * @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
     * @license   https://store.webkul.com/license.html
     */
    // no direct access
    defined('_JEXEC') or die('Restricted access');
    if(!class_exists('VmConfig')){
    	require(JPATH_ADMINISTRATOR.'/components/com_virtuemart/helpers/config.php');
    }
    if(!class_exists('Img2Thumb')){
    	require(JPATH_ADMINISTRATOR.'/components/com_virtuemart/helpers/img2thumb.php');
    }
    
    /**
     * saveImageToVirtuemart 				save base64 string to virtuemart product
     * @param  string 	$base64_string        		image converted to base64 string
     * @param  int 		$virtuemart_product_id 		virtuemart product id
     * @return none                        
     */
    function saveImageToVirtuemart($base64_string, $virtuemart_product_id){
    	$img_name = md5(time().uniqid());
    	$extension = 'jpg';
    
    	//get to be save media path
    	$media_product_path = VmConfig::get('media_product_path') == ''?'images/stories/virtuemart/typeless/' : VmConfig::get('media_product_path');
    
    	//get to be save media thumb path
    	$media_product_thumb_path = VmConfig::get('media_product_path') == ''? 'images/stories/virtuemart/product/resized/images/stories/virtuemart/typeless/' : VmConfig::get('media_product_path').'resized/';
    	$save_file_url = JPATH_SITE.'/'.$media_product_path;
    	$file_name = $img_name.'.'.$extension;
    
    	//final media path with name and extension
    	$output_file = $save_file_url.$file_name;
    
    	// save image to directory
    	writeImageToDirectory($base64_string, $output_file);
    
    	$img_width = (int)(VmConfig::get('img_width') == 0? 90: VmConfig::get('img_width'));
    	$img_height = (int)(VmConfig::get('img_height') == 0? 90: VmConfig::get('img_height'));
    	$thumb_fileout = $save_file_url.'resized/'.$img_name .'_'.$img_width.'x'.$img_height.'.' . $extension;
    	// convert and save thumb media
    	$objthumb = new Img2Thumb($output_file, $img_width, $img_height, $thumb_fileout,'', 255, 255, 255);
    	$file_url = $media_product_path.$img_name.'.'.$extension;
    	$file_url_thumb = $media_product_thumb_path.$img_name .'_'.$img_width.'x'.$img_height.'.' . $extension;
    
    	// get login user id
    	$user = JFactory::getUser();
    	$userId = $user->get( 'id' );
    
    	// insert to VM medias
    	$db = JFactory::getDbo();
    	$query = $db->getQuery(true);
    	$columns = array('virtuemart_vendor_id', 'file_title', 'file_mimetype', 'file_type', 'file_url', 'file_url_thumb', 'file_is_product_image', 'file_is_downloadable', 'file_is_forSale', 'shared', 'published', 'created_by', 'modified_by', 'locked_on', 'locked_by');
    	$values = array(1,$db->quote($file_name), $db->quote('image/jpeg'), $db->quote('product'), $db->quote($file_url), $db->quote($file_url_thumb), 0, 0, 0, 0, 1, (int)$userId, (int)$userId, $db->quote('0000-00-00 00:00:00'), 0);
    	$query->insert($db->quoteName('#__virtuemart_medias'))
    		->columns($db->quoteName($columns))
    		->values(implode(',', $values));	
    	$db->setQuery($query);
    	$imgsuccess = $db->execute();
    
    	// insert to VMProductMedias, pass VMproduct id in second parameter
    	if($imgsuccess){
    		saveToVmProductMedias($db->insertid(), $virtuemart_product_id);
    	}
    }
    
    /**
     * writeImageToDirectory 			save image file to directory
     * @param  string $base64_string 		base64 encoded string
     * @param  string $output_file   		final media path with name and extension
     * @return none
     */
    function writeImageToDirectory($base64_string, $output_file) {
    	$file = fopen($output_file , 'w') or die(JText::sprintf('COM_VIRTUEMART_ERP_CAN_NOT_OPEN', $output_file));
    	fwrite($file, base64_decode($base64_string));
    	fclose($file);
    }
    
    /**
     * saveToVmProductMedias 			save thumd image of product
     * @param  int 	 $insertid              	last media insert id
     * @param  int 	 $virtuemart_product_id 	product id
     * @return none                  
     */
    function saveToVmProductMedias($insertid, $virtuemart_product_id){
    	$db = JFactory::getDbo();
    	$query=$db->getQuery(true);
    	$columns=array($db->quoteName('id'),$db->quoteName('virtuemart_product_id'),$db->quoteName('virtuemart_media_id'),$db->quoteName('ordering'));
    	$values=array($db->quote(''),$db->quote($virtuemart_product_id),$db->quote($insertid),$db->quote(''));
    	$query->insert($db->quoteName('#__virtuemart_product_medias'))
    	      ->columns($columns)
    	      ->values(implode(',',$values));
    	$db->setQuery($query);
    	$db->execute();	
    }
    

    Usage

    Manual image upload is useful in many extensions, mostly connectors where data from an end has to be imported into VitueMart. One of it has been implemented in –

    Virtuemart Odoo Connector

    For any query regarding Joomla virtuemart plug-ins and add-ons you can communicate with us at:
    https://webkul.uvdesk.com/en/customer/create-ticket/

    Start your headless eCommerce
    now.
    Find out More

    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    Be the first to comment.

    Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home

    Table of Content