Trying to write a plugin for Fabrik

Phoca PDF - creating PDF documents in Joomla! CMS
pollen8
Phoca Newbie
Phoca Newbie
Posts: 7
Joined: 06 Aug 2009, 16:27

Trying to write a plugin for Fabrik

Post by pollen8 »

HI

I'm trying to set up a plugin for use with fabrik but I'm pretty stuck I've set up a skeleton phoca system plugin that I've installed successfully. To do that I copied the content plugin's files and changed the occurances of content to fabrik.

But I don't see how the core phocaPDF code can ever call my plugin?

For example In libraries/joomla/document/phocapdf/phocapdf.php render(): lines 143 - 156

there is:

Code: Select all

switch ($option) {
			case 'com_content':
		
				$results = $dispatcher->trigger('onBeforeDisplayPDFContent', array (&$pdf, &$content, &$this));

			break;
			
			case 'com_phocamenu':
			
				$results = $dispatcher->trigger('onBeforeDisplayPDFRestaurantMenu', array (&$pdf, &$content, &$this));
				
			break;
		}
so it looks like my option (com_fabrik) is never going to get called and it wont write out its buffer into the pdf document.

By changing the code to:

Code: Select all

$t = JString::ucfirst(str_replace('com_', '', $option));
switch ($option) {
			default:
				$results = $dispatcher->trigger('onBeforeDisplayPDF'.$t, array (&$pdf, &$content, &$this));
				break;
			case 'com_content':
		
				$results = $dispatcher->trigger('onBeforeDisplayPDFContent', array (&$pdf, &$content, &$this));

			break;
			
			case 'com_phocamenu':
			
				$results = $dispatcher->trigger('onBeforeDisplayPDFRestaurantMenu', array (&$pdf, &$content, &$this));
				
			break;
		}
Everything works fine

Below is the modified render function that I used which works

Code: Select all

function render( $cache = false, $params = array()) {
		
		// Define - must be called before calling the plugin (because plugin includes definition file of tcpdf,
		// so it must be defined before
		define('K_TCPDF_EXTERNAL_CONFIG', true);
		define("K_PATH_MAIN", JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'assets'.DS.'tcpdf');// Installation path		
		define("K_PATH_URL", JPATH_BASE);// URL path
		define("K_PATH_FONTS", JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'fonts'.DS);// Fonts path
		define("K_PATH_CACHE", K_PATH_MAIN.DS.'cache'.DS);// Cache directory path
		$urlPath = JURI::base(true) . '/administrator/components/com_phocapdf/assets/tcpdf/';// Cache URL path
		define("K_PATH_URL_CACHE", $urlPath.'cache/');
		define("K_PATH_IMAGES", K_PATH_MAIN.DS.'images'.DS);// Images path
		define("K_BLANK_IMAGE", K_PATH_IMAGES.DS."_blank.png");// Blank image path
		define("K_CELL_HEIGHT_RATIO", 1.25);// Cell height ratio
		define("K_TITLE_MAGNIFICATION", 1.3);// Magnification scale for titles
		define("K_SMALL_RATIO", 2/3);// Reduction scale for small font
		define("HEAD_MAGNIFICATION", 1.1);// Magnication scale for head
		define('PDF_PAGE_FORMAT', 'A4');// page format
		define('PDF_PAGE_ORIENTATION', 'P');// page orientation (P=portrait, L=landscape)
		define('PDF_CREATOR', 'Phoca PDF');// document creator
		define('PDF_AUTHOR', 'Phoca PDF');// document author
		define('PDF_HEADER_TITLE', 'Phoca PDF');// header title
		define('PDF_HEADER_STRING', "Phoca PDF");// header description string
		//define('PDF_HEADER_LOGO', 'tcpdf_logo.jpg');// image logo
		//define('PDF_HEADER_LOGO_WIDTH', 30);// header logo image width [mm]
		define('PDF_UNIT', 'mm');// document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch]
		define('PDF_header_margin', 10);// header margin
		define('PDF_footer_margin', 10);// footer margin
		define('PDF_MARGIN_TOP', 27);// top margin
		define('PDF_MARGIN_BOTTOM', 25);// bottom margin
		define('PDF_MARGIN_LEFT', 15);// left margin
		define('PDF_MARGIN_RIGHT', 15);// right margin
		define('PDF_FONT_NAME_MAIN', 'freemono');// main font name
		define('PDF_FONT_SIZE_MAIN', 10);// main font size
		define('PDF_FONT_NAME_DATA', 'freemono');// data font name
		define('PDF_FONT_SIZE_DATA', 8);// data font size
		define('PDF_IMAGE_SCALE_RATIO', 4);// Ratio used to scale the images

		
		// LOADING OF HELPER FILES (extended TCPDF library), LISTENING TO Phoca PDF Plugins
		$option = JRequest::getCmd('option');		
		
		$t = JString::ucfirst(str_replace('com_', '', $option));
		
		switch ($option) {
			default:
				require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'helpers'.DS.'phocapdf.php');
				require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'assets'.DS.'tcpdf'.DS.'tcpdf.php');
				$content 	= new JObject();
				// Get info from Phoca PDF Content Plugin
				$dispatcher	= &JDispatcher::getInstance();
				JPluginHelper::importPlugin('system');
				$results 	= $dispatcher->trigger('onBeforeCreatePDF'.$t, array (&$content));
				$pdf = new TCPDF($content->page_orientation, 'mm', $content->page_format, true, 'UTF-8', $content->use_cache);
				break;
			case 'com_content':
				
				$content 	= new JObject();
				// Get info from Phoca PDF Content Plugin
				$dispatcher	= &JDispatcher::getInstance();
				JPluginHelper::importPlugin('system');
				$results 	= $dispatcher->trigger('onBeforeCreatePDFContent', array (&$content));
			
				if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'helpers'.DS.'phocapdfcontenttcpdf.php')) {
					require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'helpers'.DS.'phocapdfcontenttcpdf.php');
					$pdf = new PhocaPDFContentTCPDF($content->page_orientation, 'mm', $content->page_format, true, 'UTF-8', $content->use_cache);
				} else {
					return JError::raiseError('PDF ERROR', 'Document cannot be created - Loading of Phoca PDF library (Content) failed');
				}
			break;
			
			case 'com_phocamenu':
			
				// Get info from Phoca PDF Restaurant Menu Plugin
				$content 	= new JObject();
				$dispatcher	= &JDispatcher::getInstance();
				JPluginHelper::importPlugin('phocapdf');
				$results 	= $dispatcher->trigger('onBeforeCreatePDFRestaurantMenu', array (&$content));
				
				if (JFile::exists(JPATH_SITE.DS.'plugins'.DS.'phocapdf'.DS.'restaurantmenu.php')) {
					require_once(JPATH_SITE.DS.'plugins'.DS.'phocapdf'.DS.'restaurantmenu.php');
					$pdf = new PhocaPDFRestaurantMenuTCPDF($content->page_orientation, 'mm', $content->page_format, true, 'UTF-8', $content->use_cache);
				} else {
					return JError::raiseError('PDF ERROR', 'Document cannot be created - Loading of Phoca PDF Plugin (Restaurant Menu) failed');
				}
			break;
			
			/*default:
				return JError::raiseError('PDF ERROR', 'Document cannot be created (No known option)');*/
			break;
		}
		
		
		$pdf->SetMargins($content->margin_left, $content->margin_top, $content->margin_right);
		
		$pdf->SetAutoPageBreak(TRUE, $content->margin_bottom);
		$pdf->setCellHeightRatio($content->site_cell_height);
		$pdf->setFont($content->font_type);
		
		$siteFontColor = $pdf->convertHTMLColorToDec($content->site_font_color);
		$pdf->SetTextColor($siteFontColor['R'], $siteFontColor['G'], $siteFontColor['B']);
		
		$pdf->setPageFormat($content->page_format, $content->page_orientation);
		$pdf->SetHeaderMargin($content->header_margin);
		$pdf->SetFooterMargin($content->footer_margin);
		$pdf->setImageScale($content->image_scale);
		
		
		// PDF Metadata
		$pdf->SetCreator(PDF_CREATOR);
		
		
		
		
		// Content
		switch ($option) {
			default:
				$results = $dispatcher->trigger('onBeforeDisplayPDF'.$t, array (&$pdf, &$content, &$this));
				break;
			case 'com_content':
		
				$results = $dispatcher->trigger('onBeforeDisplayPDFContent', array (&$pdf, &$content, &$this));

			break;
			
			case 'com_phocamenu':
			
				$results = $dispatcher->trigger('onBeforeDisplayPDFRestaurantMenu', array (&$pdf, &$content, &$this));
				
			break;
		}
		
		// Called from administrator area (administrator calls frontend view, but it still administrator area)
		$adminView	= JRequest::getVar('admin', 0, '', 'int');
		if ($adminView == 1) { 
			$content->pdf_destination = 'S';
		}
		
	
		if ($content->pdf_destination == 'D' || $content->pdf_destination == 'I') {
			$pdf->Output($content->pdf_name, $content->pdf_destination);
			return true;
		}
				
		$data = $pdf->Output($content->pdf_name, $content->pdf_destination);

		// Set document type headers
		parent::render();
		JResponse::setHeader('Content-disposition', 'inline; filename="'.$this->getName().'.pdf"', true);

		//Close and output PDF document
		return $data;
	}
Perhaps I'm not understanding something about how the code works, if so can someone point me in the right direction

For completeness here is my plugin php file:

Code: Select all

<?php
/*
 * @package Joomla 1.5
 * @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
 *
 * @component Phoca Plugin
 * @copyright Copyright (C) Jan Pavelka www.phoca.cz
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL  
 *  
 */
defined('_JEXEC') or die('Restricted access');
jimport( 'joomla.plugin.plugin' );

class plgSystemPhocaPDFFabrik extends JPlugin
{
	function plgSystemPhocaPDFFabrik(& $subject, $config) {
		parent :: __construct($subject, $config);
	}
	
	
	function onAfterRender() {
		
		$plugin 		=& JPluginHelper::getPlugin('system', 'phocapdffabrik');
	 	$pluginP 		= new JParameter( $plugin->params );
		$pdfDestination	= $pluginP->get('pdf_destination', 'S');
		
		/*global $mainframe;
		if ($mainframe->isAdmin()) {
			return;
		}*/
		
		// IE 7 bug
		include_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_phocapdf'.DS.'helpers'.DS.'phocapdfbrowser.php');
		
		$document	= &JFactory::getDocument();
		$doctype	= $document->getType();
		if ($doctype == 'html') {
			$bodySite	= JResponse::getBody();
			
			if ($pdfDestination == 'I' || $pdfDestination == 'D') {
				// Remome OnClick
				$bodySite 	= preg_replace_callback('/<a(.+)href="(.*)format=pdf(.*)"(.+)onclick="(.*)"/Ui', array('plgSystemPhocaPDFFabrik', 'phocaPDFCallbackOnClick'), $bodySite);
			} else { 
				//$bodySite 	= preg_replace_callback('/<a(.+)href="(.*)format=pdf(.*)"/Ui', array('plgSystemPhocaPDFFabrik', 'phocaPDFCallback'), $bodySite);
				// IE 7 bug
				$bodySite 	= preg_replace_callback('/<a(.+)href="(.*)format=pdf(.*)"(.+)onclick="(.*)"/Ui', array('plgSystemPhocaPDFFabrik', 'phocaPDFCallbackOnClickIE'), $bodySite);
			}
			
			JResponse::setBody($bodySite);
		}
		return true;
	}

	function phocaPDFCallbackOnClick ($matches) {
	
		$a	= $matches[0];
		$b	= $matches[1];
		$c	= $matches[2];
		$d	= $matches[3];
		$e	= $matches[4];
		$f	= $matches[5];
		$replacement 	= '<a ' . $b .  'href="'. $c . 'format=phocapdf' . $d .'"'.$e.'';
		return $replacement;
	}
	
	function phocaPDFCallbackOnClickIE ($matches) {
	
		$a	= $matches[0];
		$b	= $matches[1];
		$c	= $matches[2];
		$d	= $matches[3];
		$e	= $matches[4];// IE 7 bug
		$f	= $matches[5];// IE 7 bug
		
		// IE 7 bug
		$browser = PhocaPDFHelperBrowser::browserDetection('browser');
        if ($browser == 'msie7' || $browser == 'msie8') {
           $replacement 	= '<a '. $b .  'href="'. $c . 'format=phocapdf' . $d .'"'.$e.'target="_blank" ';
        } else {
			$replacement 	= '<a ' . $b .  'href="'. $c . 'format=phocapdf' .$d.'"'.$e.'onclick="'.$f.'"';
		}
		return $replacement;
	}
	/*
	function phocaPDFCallback ($matches) {
	
		$a	= $matches[0];
		$b	= $matches[1];
		$c	= $matches[2];
		$d	= $matches[3];
		$replacement 	= '<a ' . $b .  'href="'. $c . 'format=phocapdf' . $d .'"';
		return $replacement;
	}*/
	
	function onBeforeCreatePDFFabrik(&$content) {
		$content->content = '';
		// load plugin params info
	 	$plugin  = &JPluginHelper::getPlugin('system', 'phocapdffabrik');
	 	$pluginP = new JParameter( $plugin->params );
		
		$content->margin_top		= $pluginP->get('margin_top', 27);
		$content->margin_left		= $pluginP->get('margin_left', 15);
		$content->margin_right		= $pluginP->get('margin_right', 15);
		$content->margin_bottom		= $pluginP->get('margin_bottom', 25);
		$content->site_font_color	= $pluginP->get('site_font_color', '#000000');
		$content->site_cell_height	= $pluginP->get('site_cell_height', 1.2);
		
		$content->font_type			= $pluginP->get('font_type', 'freemono');
		$content->page_format		= $pluginP->get('page_format', 'A4');
		$content->page_orientation	= $pluginP->get('page_orientation', 'L');
		
		$content->header_data		= $pluginP->get('header_data', '');
		$content->header_font_type	= $pluginP->get('header_font_type', 'freemono');
		$content->header_font_style	= $pluginP->get('header_font_style', '');
		$content->header_font_size	= $pluginP->get('header_font_size', 10);
		$content->header_margin		= $pluginP->get('header_margin', 5);
		
		$content->footer_font_type	= $pluginP->get('footer_font_type', 'freemono');
		$content->footer_font_style	= $pluginP->get('footer_font_style', '');
		$content->footer_font_size	= $pluginP->get('footer_font_size', 10);
		$content->footer_margin		= $pluginP->get('footer_margin', 15);
		
		$content->pdf_name			= $pluginP->get('pdf_name', 'Phoca PDF');
		$content->pdf_destination	= $pluginP->get('pdf_destination', 'S');
		$content->image_scale		= $pluginP->get('image_scale', 4);
		$content->display_plugin	= $pluginP->get('display_plugin', 0);
		$content->display_image		= $pluginP->get('display_image', 1);
		$content->use_cache			= $pluginP->get('use_cache', 0);
		
		
		//Extra values
		if ((int)$content->site_cell_height > 3) {
			$content->site_cell_height = 3;
		}
		if ((int)$content->margin_top > 200) {
			$content->margin_top = 200;
		}
		if ((int)$content->margin_left > 50) {
			$content->margin_left = 50;
		}
		if ((int)$content->margin_right > 50) {
			$content->margin_right = 50;
		}
		if ((int)$content->margin_bottom > 150) {
			$content->margin_bottom = 150;
		}
		if ((int)$content->header_font_size > 30) {
			$content->header_font_size = 30;
		}
		if ((int)$content->footer_font_size > 30) {
			$content->footer_font_size = 30;
		}
		if ((int)$content->header_margin > 50) {
			$content->header_margin = 50;
		}
		if ((int)$content->footer_margin > 50) {
			$content->footer_margin = 50;
		}
		if ((int)$content->image_scale < 0.5) {
			$content->image_scale = 0.5;
		}
		
		
		return true;
		
	}
	
	
	function onBeforeDisplayPDFFabrik(&$pdf, &$content, &$document) {
		$pdf->SetTitle($document->getTitle());
		$pdf->SetSubject($document->getDescription());
		$pdf->SetKeywords($document->getMetaData('keywords'));

		// - - - - - - - - - - - - - - - - 
		// HEADER
		if ($content->header_data != '') {
			$pdf->setHeaderData('' , 0, '', $content->header_data);
		} else {
			$pdf->setHeaderData('' , 0, $document->getTitle(), $document->getHeader());
		}
		$pdf->setHeaderFont(array($content->header_font_type, $content->header_font_style, $content->header_font_size));
		

		
		$lang = &JFactory::getLanguage();
		$font = $content->font_type;
		$pdf->setRTL($lang->isRTL());

	
		$pdf->setFooterFont(array($content->footer_font_type, $content->footer_font_style, $content->footer_font_size));
		// Initialize PDF Document
		$pdf->AliasNbPages();
		$pdf->AddPage();
		
		$documentOutput = $document->getBuffer();
		if ($content->display_plugin == 0) {
			$documentOutput 	= preg_replace_callback('/\{(.*)\}/Ui', array('plgSystemPhocaPDFFabrik', 'phocaPDFCallbackPlugin'), $documentOutput);
		}
		
		if ($content->display_image == 0) {
			$documentOutput 	= preg_replace_callback('/<img(.*)>/Ui', array('plgSystemPhocaPDFFabrik', 'phocaPDFCallbackImage'), $documentOutput);
		}
		
		
		// Build the PDF Document string from the document buffer
		$pdf->writeHTML($documentOutput , true);
		
		return true;
	}
	
	function phocaPDFCallbackPlugin ($matches) {
	
		// Don't display Plugin Code in PDF
		$a	= $matches[0];
		$replacement 	= '';
		return $replacement;
	}
	
	function phocaPDFCallbackImage ($matches) {
	
		// Don't display Images in PDF
		$a	= $matches[0];
		$replacement 	= '';
		return $replacement;
	}

}
?>
pollen8
Phoca Newbie
Phoca Newbie
Posts: 7
Joined: 06 Aug 2009, 16:27

Re: Trying to write a plugin for Fabrik

Post by pollen8 »

bump! - i have lots of people asking about this and unfortunately until these questions are answered I'm stuck :(
User avatar
Jan
Phoca Hero
Phoca Hero
Posts: 49125
Joined: 10 Nov 2007, 18:23
Location: Czech Republic
Contact:

Re: Trying to write a plugin for Fabrik

Post by Jan »

I am sorry but I don't know the fabric :-(

Jan
If you find Phoca extensions useful, please support the project
pollen8
Phoca Newbie
Phoca Newbie
Posts: 7
Joined: 06 Aug 2009, 16:27

Re: Trying to write a plugin for Fabrik

Post by pollen8 »

If you make the changes he suggests, then other peoples extensions can implement their own plugins to render custom content using Phoca PDF.
Or as I said in the first thread, maybe I don't understand how I am meant to write the Phoca PDF plug-in.
Either way no knowledge of Fabrik is required here, its a pure question about developing a Phoca PDF plug-in for any Joomla component.
Fastserv
Phoca Newbie
Phoca Newbie
Posts: 3
Joined: 19 Feb 2008, 09:24
Location: Germany

Re: Trying to write a plugin for Fabrik

Post by Fastserv »

No chance to get this answered?
User avatar
Jan
Phoca Hero
Phoca Hero
Posts: 49125
Joined: 10 Nov 2007, 18:23
Location: Czech Republic
Contact:

Re: Trying to write a plugin for Fabrik

Post by Jan »

Hi, I am little bit overloaded :( I cannot find time for answering all the posts so I cannot find time to see this in Phoca PDF for now :( :( :(
I hope somebody will help me to answer all the post in the forum :(

Jan
If you find Phoca extensions useful, please support the project
User avatar
Jan
Phoca Hero
Phoca Hero
Posts: 49125
Joined: 10 Nov 2007, 18:23
Location: Czech Republic
Contact:

Re: Trying to write a plugin for Fabrik

Post by Jan »

Hi, the problem is, I need to help with answering the posts. In my freetime I only can find time to answer all the posts here (and not all :-( ) If the posts will be answered I can develop new features :-(

Jan
If you find Phoca extensions useful, please support the project
pollen8
Phoca Newbie
Phoca Newbie
Posts: 7
Joined: 06 Aug 2009, 16:27

Re: Trying to write a plugin for Fabrik

Post by pollen8 »

I understand the time pressure issue, but its a shame. I've taken the time to find what I think is a solution, and I've posted what I think is the fix and simply asked you if that's correct.

I've seen several posts here about writing plug-ins for phocaPDF and none have ended successfully. If you took the time to read the code I posted, and if you accepted and added it to the codebase then your product would be stronger, people would be able to write plug-ins and you would have less questions to answer on this subject.
User avatar
Jan
Phoca Hero
Phoca Hero
Posts: 49125
Joined: 10 Nov 2007, 18:23
Location: Czech Republic
Contact:

Re: Trying to write a plugin for Fabrik

Post by Jan »

Hi, maybe you don't understand the situation. I am not able to read all the forum posts. To answer the posts I only read e.g. every second word only in the last post. There is so many questions so I am not able to answer all them. And if I answer some, I need to add very brief answer (I don't like it but there is no other solution), so studying the code is not possible for me :( . I am overloaded - I am answering the posts almost everday (on my holidays too) so no idea what will happen If I will be e.g. ill :idea: or if I will be run - down :-(

So if somebody will make some plugin, module or component, it is great, but I cannot check the code as I am not able to do :-(
If you find Phoca extensions useful, please support the project
daviesap
Phoca Newbie
Phoca Newbie
Posts: 7
Joined: 22 Mar 2010, 12:31

Re: Trying to write a plugin for Fabrik

Post by daviesap »

Sorry to bump this - but it is a great shame PhocaPDF doesn't work with Fabrik.

Fabrik is a great extension to Joomla - as is PhocaPDF - and I can see why people would want to use them together.

I know you're overloaded Jan - but any chance you can take a quick look at the code ? Happy to make a donation if it helps ! :) :)

Andrew
Post Reply