X-Cart PDF catalog module
This module is allow to generate the PDF catalog from your X-Cart data. The code is based on the TCPDF PHP class.
- You should download the latest stable release from http://sourceforge.net/projects/tcpdf/files/ and unzip it to the <x-cart dir>/include/tcpdf/
- You should create the <x-cart>/pdf dir and create the following 3 files inside. In additional the smarty plugin should be uploaded too.
- pdf/auth.php
- pdf/func.pdf.php
- pdf/pdf_catalog.php
- include/templater/plugins/function.get_categories_list.php
- At the old X-Cart (4.x), you should move your images to the file system. That's default in the newest X-Cart versions.
Please see the file content under this article.
- Now you should add 2 new language var: lbl_pdf_catalog_title and lbl_index. It's possible to make in the patch section of the admin area with the following sql:
INSERT INTO `xcart_languages` VALUES ('US','lbl_index','Index','Labels','Y');
INSERT INTO `xcart_languages` VALUES ('US','lbl_pdf_catalog','PDF catalog','Labels','Y');
- Please check the permission for the x-cart/catalog dir. It's should be writable. You can change the permissions by the “chmod 777 catalog” command.
- Now you are able to run the catalog generation by typing <you site url>/pdf/pdf_catalog.php, the pdf files will be generated to the “catalog” dir for each language.
Multi-language support
For the multi-language support it is required to have the appropriate font(s) for the TCPDF. If you are using the UTF-8 codepage, as suggested, you can simply download the following archive and unpack it to the include/tcpdf/fonts (it should be created already since you have the tcpdf uploaded). The file is pretty big - because the exotic languages are included to these fonts. Download
PDF catalog PHP files
x-cart/pdf/auth.php
<?php
define('AREA_TYPE', 'C');
@include_once "../top.inc.php";
if (!defined('DIR_CUSTOMER')) die("ERROR: Can not initiate application! Please check configuration.");
require_once $xcart_dir."/init.php";
x_load("backoffice");
$current_area="C";
include $xcart_dir."/include/get_language.php";
require $xcart_dir."/include/admin_security.php";
@include $xcart_dir."/modules/gold_auth.php";
include $xcart_dir."/include/check_useraccount.php";
#
# Single Mode always active for root account
#
if($user_account["flag"]=="RP") $single_mode=true;
x_session_save();
?>
You should be careful with the file below. We are selecting the data here for the catalogue and unfortunately the X-Cart API is changed from version to version. As the result the file is suitable for the last X-Cart version only. All of the difference with the old versions are marked by the ”# version” comment. You should review the code and uncomment the appropriate lines if it's required for your version.
x-cart/pdf/func.pdf.php
<?php
if (!defined('XCART_START')) die();
set_time_limit(86400);
func_set_memory_limit('512M');
error_reporting (E_ALL ^ E_NOTICE);
include_once $xcart_dir.'/include/tcpdf/config/lang/eng.php';
include_once $xcart_dir.'/include/tcpdf/tcpdf.php';
function func_get_pdf_data($categoryid) {
global $xcart_dir, $smarty, $sql_tbl, $shop_language;
$categories = func_get_categories_list($categoryid, true, 'level');
# kornev, for the old x-cart
if (is_array($categories['subcategories'])) $categories = $categories['subcategories'];
$current_area = 'C';
if ($categories)
foreach($categories as $ink=>$v) {
$search_data["products"] = array();
$search_data["products"]["categoryid"] = $v['categoryid'];
$search_data["products"]["search_in_subcategories"] = "";
$search_data["products"]["category_main"] = "Y";
$search_data["products"]["category_extra"] = "Y";
$search_data["products"]["forsale"] = "Y";
$do_not_use_navigation = 1;
$sort = 'productcode';
$sort_direction = $config['Appearance']['products_order_asc'] == 'Y';
$mode = "search";
include $xcart_dir."/include/search.php";
$categories[$ink]['products'] = $products;
}
return $categories;
}
class MYPDF extends TCPDF {
var $__products_links_counter = 1;
# kornev, removed in new pdf
public function convertHTMLColorToDec($str) {
return TCPDF_COLORS::convertHTMLColorToDec($str, $this->spot_colors);
}
public function H($text, $level = 1, $break = false) {
$this->Bookmark($text, $level-1);
$this->SetTextColorArray($this->convertHTMLColorToDec('#ffffff'));
$current_font = $this->FontSizePt;
$this->SetFontSize(16-$level);
$this->y += 2;
if ($level == 1) {
$this->SetFillColorArray($this->convertHTMLColorToDec('#5f94c0'));
$this->MultiCell(0, 0, $text, 0, 'L', 1);
}
else {
$this->SetFillColorArray($this->convertHTMLColorToDec('#5f94c0'));
$this->MultiCell($this->GetStringWidth($text)+3, 0, $text, 0, 'L', 1);
}
$this->y += 2;
$this->SetFontSize($current_font);
$this->SetTextColorArray($this->convertHTMLColorToDec('#000000'));
$this->SetFillColorArray($this->convertHTMLColorToDec('#ffffff'));
}
public function Footer() {
global $config;
$cur_y = $this->GetY();
$ormargins = $this->getOriginalMargins();
$this->SetTextColor(0, 0, 0);
$this->SetX($ormargins['right']);
$this->Cell(0, 0, func_get_langvar_by_name('lbl_pdf_catalog', null, false, true), 0, 0, 'L');
$this->SetX($ormargins['right']);
$this->Cell(0, 0, strftime($config["Appearance"]["date_format"], time()), 0, 0, 'R');
$pagenumtxt = " - ".$this->PageNo().' / '.$this->getAliasNbPages()." - ";
$this->SetY($cur_y);
//Print page number
$this->SetX($ormargins['center']);
$this->Cell(0, 0, $pagenumtxt, 0, 0, 'C');
}
function product($product) {
global $xcart_dir, $shop_language, $http_location;
$current_y = $this->y;
$current_x = $this->x;
$link = $this->AddLink();
$this->SetLink($link, $current_y, $this->getPage());
$this->__products_links[$product['productid']] = $link;
# in some of the versions the tmbn_image is not available
# trying to find the image by the url
if ($product['tmbn_image'])
$file = $xcart_dir.'/'.$product['tmbn_image'];
elseif ($product['tmbn_url'])
$file = $xcart_dir.'/'.trim(preg_replace('/'.preg_quote($http_location, '/').'/', '', $product['tmbn_url']), '/');
else
$file = '';
$width_image = $width = $this->pixelsToUnits(116);
$height_image = $height = $width*193/145;
if (is_file($file)) {
$image_params = @func_get_image_size($file);
$height_image = $image_params[2] * $width_image / $image_params[1];
if ($height_image > $height) {
$height_image = $height;
$width_image = $image_params[1] * $height_image / $image_params[2];
}
}
$px1 = $this->pixelsToUnits(1);
$this->Rect($this->x, $this->y, $width+2*$px1, $height+2*$px1, 'D', 0, $this->convertHTMLColorToDec('#acb7c7'));
if (is_file($file))
$this->Image($file, $this->x+$px1, $this->y+$px1, $width_image, $height_image);
$this->y += $height+4*$px1;
$this->Cell($this->pixelsToUnits(30), 0, $product['productcode']);
$this->y = $current_y + $height + $this->pixelsToUnits(15);
$this->x = $current_x;
$this->MultiCell($width, 0, $product['product'], 0, 'L');
$this->y = $current_y;
$this->x += $current_x + $width-$this->pixelsToUnits(5);
}
function end_product_row() {
$this->y += $this->pixelsToUnits(230);
$current_y = $this->y;
$this->x = $this->lMargin;
$this->checkPageBreak($this->pixelsToUnits(210));
if ($current_y > $this->y) $this->y = $this->tMargin;
}
function add_product_link($product) {
$this->SetTextColorArray($this->convertHTMLColorToDec('#0000ff'));
$link = $this->__products_links[$product['productid']];
if (!$link) return;
$this->Cell($this->pixelsToUnits(50), 0, $product['productcode'], 0, 0, 'L', 0, $link);
if ($this->__products_links_counter % 10 == 0) {
$this->Cell(0, 0, '', 0, 1);
$this->y += 1;
}
$this->__products_links_counter++;
}
}
function func_pdf_draw_categories(&$pdf, $categoryid) {
global $app_die;
$categories = func_get_pdf_data($categoryid);
$counter = 0;
if (is_array($categories))
foreach($categories as $ind=>$cat) {
$pdf->H($cat['category'], $cat['level'], ($counter != 0 && $cat['products']));
$counter++;
if ($cat['products']) {
$products = array_chunk($cat['products'], 4, true);
$size = count($products) - 1;
foreach($products as $k => $row) {
foreach($row as $product)
$pdf->product($product);
if ($size != $k)
$pdf->end_product_row();
else
$pdf->AddPage();
}
}
func_pdf_draw_categories($pdf, $cat['categoryid']);
unset($categories[$ind]);
}
}
function func_pdf_generate($template, $save_to_file) {
global $config, $smarty, $xcart_dir, $sql_tbl;
global $shop_language;
//$html = func_display($template, $smarty, false);
include_once $xcart_dir.'/include/templater/plugins/function.get_categories_list.php';
$font = null;//'arial';
$pdf = new MYPDF('A4', 'mm', 'P', true);
$pdf->setJPEGQuality(100);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor($config['Company']['company_name']);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(true);
$pdf->setFooterFont(Array($font, '', '10'));
$pdf->SetMargins('10', '10', '10');
$pdf->SetFooterMargin(10);
$pdf->setImageScale(1);
$pdf->setLanguageArray($l);
// $pdf->AliasNbPages();
$pdf->SetFont($font, '', 8);
$pdf->AddPage();
$pdf->SetAutoPageBreak(true, 10);
func_pdf_draw_categories($pdf, 0);
$search_data["products"] = array();
$search_data["products"]["forsale"] = "Y";
$do_not_use_navigation = 1;
$sort = 'productcode';
$sort_direction = $config['Appearance']['products_order_asc'] == 'Y';
$mode = "search";
include $xcart_dir."/include/search.php";
if ($products) {
$pdf->AddPage();
$pdf->H(func_get_langvar_by_name('lbl_index', null, false, true));
foreach($products as $product)
$pdf->add_product_link($product);
}
$pdf->Output($save_to_file, 'F');
}
?>
x-cart/pdf/pdf_catalog.php
<?php
include_once './auth.php';
if (is_file($xcart_dir."/include/common.php"))
include_once $xcart_dir."/include/common.php";
# for the 3.x branch - the categories should be used
else
include_once $xcart_dir."/include/categories.php";
include_once $xcart_dir."/pdf/func.pdf.php";
$saved_shop_language = $shop_language;
$smarty->assign('xcart_dir', $xcart_dir);
foreach($all_languages as $lng) {
$shop_language = $lng['code'];
$smarty->assign('shop_language', $shop_language);
$smarty->assign("content_language", $config["language_content"][$shop_language]);
func_pdf_generate('main/pdf_catalog/catalog.tpl', $xcart_dir.'/catalog/pdf_catalog_'.$lng['code'].'.pdf');
}
$shop_language = $saved_shop_language;
?>
include/templater/plugins/function.get_categories_list.php
<?php
function smarty_function_get_categories_list($params, &$smarty) {
global $app_dir, $sql_tbl, $config;
extract($params);
if (!isset($categoryid)) {
$smarty->trigger_error("assign: missing 'categoryid' parameter");
return;
}
$tmp = func_get_categories_list($categoryid, true, 'level', true);
$categories = $tmp['all_categories'];
$_inner_search = 1;
if ($categories)
foreach($categories as $ink=>$v) {
$search_data["products"] = array();
$search_data["products"]["categoryid"] = $v['categoryid'];
$search_data["products"]["search_in_subcategories"] = "";
$search_data["products"]["category_main"] = "Y";
$search_data["products"]["category_extra"] = "Y";
$search_data["products"]["forsale"] = "Y";
$view_all = 'Y';
$sort = $config["Appearance"]["products_order"];
$sort_direction = $config['Appearance']['products_order_asc'] == 'Y';
$mode = "search";
include $app_dir."/include/search.php";
$categories[$ink]['products'] = $products;
}
$smarty->assign('categories', $categories);
}
?>
Changelog
27 Dec 2013 - Adaptation for the new php versions 28 Jun 2011 - Adaptation for X-Cart v4.4.x and tcpdf v5.9