public function getProducts($currentProductId)
 {
     $result = array();
     $api = new EcwidProductApi(self::$storeId);
     $currentProduct = $api->get_product($currentProductId);
     if (!isset($currentProduct["categories"])) {
         return $result;
     }
     $categoryId = null;
     foreach ($currentProduct["categories"] as $category) {
         //if (strpos($category["name"], self::MOD_PEFIX) === 0) {
         $categoryId = $category["id"];
         self::$currentCategory = $category;
         break;
         //}
     }
     if ($categoryId === null) {
         return $result;
     }
     // get products data
     $products = $api->get_products_by_category_id($categoryId);
     if (!$products) {
         return $result;
     }
     $products = self::filterSimilarProducts($currentProduct, $products, 3);
     // get detail info for products
     $params = array();
     foreach ($products as $i => $product) {
         $params[$i] = array("alias" => "p" . $i, "action" => "product", "params" => array("id" => $product["id"]));
     }
     $batchResult = $api->get_batch_request($params);
     if (!$batchResult) {
         return $result;
     }
     // find real category (for real url to related product)
     foreach ($products as $i => $product) {
         $res = $batchResult["p" . $i];
         $realCategory = null;
         foreach ($res["categories"] as $category) {
             //if (strpos($category["name"], self::RELATED_PEFIX) !== 0) {
             $realCategory = $category;
             break;
             //}
         }
         $products[$i]["realCategory"] = $realCategory;
         $products[$i]["details"] = $res;
         $products[$i]["siteProductUrl"] = self::getProductUrl($products[$i]);
     }
     $result = $products;
     return $result;
 }
<?php

define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);
define('ABSOLUTE_PATH', dirname(__FILE__));
define('RELATIVE_PATH', 'modules' . DS . 'mod_ecwid_similarproducts');
define('JPATH_BASE', str_replace(RELATIVE_PATH, "", ABSOLUTE_PATH));
require_once JPATH_BASE . DS . 'includes' . DS . 'defines.php';
require_once JPATH_BASE . DS . 'includes' . DS . 'framework.php';
require_once dirname(__FILE__) . DS . 'helper.php';
$rokecwidPath = JPATH_SITE . DS . 'components' . DS . 'com_rokecwid' . DS . 'helpers';
require_once $rokecwidPath . DS . 'ecwid_product_api.php';
require_once $rokecwidPath . DS . 'ecwid_catalog.php';
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
modEcwidSimilarProducts::init();
$productId = JRequest::getVar("product");
$products = modEcwidSimilarProducts::getProducts($productId);
$productsTable = modEcwidSimilarProducts::getTable($products);
$category = modEcwidSimilarProducts::$currentCategory;
$tmpu = parse_url($category["url"]);
$category["url"] = modEcwidSimilarProducts::$siteCatalogPath . "#" . $tmpu["fragment"];
require dirname(__FILE__) . DS . 'tmpl' . DS . 'products.php';
<?php

// no direct access
defined('_JEXEC') or die('Restricted access');
require_once dirname(__FILE__) . DS . 'helper.php';
$rokecwidPath = JPATH_SITE . DS . 'components' . DS . 'com_rokecwid' . DS . 'helpers';
if (!file_exists($rokecwidPath . DS . 'ecwid_catalog.php') || !file_exists($rokecwidPath . DS . 'ecwid_product_api.php')) {
    print "Need rokecwid component api files (ecwid_catalog.php, ecwid_product_api.php)\n    for this module";
} else {
    modEcwidSimilarProducts::init();
    modEcwidSimilarProducts::addCustomHeaders();
    $modulePath = modEcwidSimilarProducts::$path;
    $basePath = JURI::base();
    $storeId = modEcwidSimilarProducts::$storeId;
    require JModuleHelper::getLayoutPath('mod_ecwid_similarproducts');
}