Location: PHPKode > projects > AcyMailing > back/classes/template.php
<?php
/**
 * @copyright	Copyright (C) 2009-2011 ACYBA SARL - All rights reserved.
 * @license		http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL
 */
defined('_JEXEC') or die('Restricted access');
?>
<?php
class templateClass extends acymailingClass{
  var $tables = array('template');
  var $pkey = 'tempid';
  var $namekey = 'alias';
  var $templateNames = array();
  function get($tempid){
    $this->database->setQuery('SELECT * FROM '.acymailing::table('template').' WHERE tempid = '.intval($tempid).' LIMIT 1');
    $template = $this->database->loadObject();
    return $this->_prepareTemplate($template);
  }
	function copy(){
		JRequest::checkToken() or die( 'Invalid Token' );
		$cids = JRequest::getVar( 'cid', array(), '', 'array' );
		$db =& JFactory::getDBO();
		$time = time();
		foreach($cids as $oneId){
			$query = 'INSERT IGNORE INTO `#__acymailing_template` (`name`, `description`, `body`, `altbody`, `created`, `published`, `premium`, `ordering`, `namekey`, `styles`)';
			$query .= ' SELECT CONCAT(`name`,\'_copy\'), `description`, `body`, `altbody`, '.$time.', `published`, `premium`, `ordering`, CONCAT(`namekey`,\'copy'.$time.'\'), `styles` FROM `#__acymailing_template` WHERE `tempid` = '.(int) $oneId;
			$db->setQuery($query);
			$db->query();
		}
		$orderClass = acymailing::get('helper.order');
		$orderClass->pkey = 'tempid';
		$orderClass->table = 'template';
		$orderClass->reOrder();
		return $this->listing();
	}
  function getDefault(){
    $this->database->setQuery('SELECT * FROM '.acymailing::table('template').' WHERE premium = 1 AND published = 1 ORDER BY ordering ASC LIMIT 1');
    $template = $this->database->loadObject();
    return $this->_prepareTemplate($template);
  }
  function _prepareTemplate($template){
  	if(!isset($template->styles)) return $template;
    if(empty($template->styles)){
      $template->styles = array();
    }else{
      $template->styles = unserialize($template->styles);
    }
    return $template;
  }
  function saveForm(){
	$app =& JFactory::getApplication();
    $template = null;
    $template->tempid = acymailing::getCID('tempid');
    $formData = JRequest::getVar( 'data', array(), '', 'array' );
    foreach($formData['template'] as $column => $value){
      acymailing::secureField($column);
      $template->$column = strip_tags($value);
    }
    $styles = JRequest::getVar('styles',array(),'','array');
    foreach($styles as $class => $oneStyle){
		$styles[$class] = str_replace('"',"'",$oneStyle);
      if(empty($oneStyle)) unset($styles[$class]);
    }
    $newStyles = JRequest::getVar('otherstyles',array(),'','array');
    if(!empty($newStyles)){
    	foreach($newStyles['classname'] as $id => $className){
    		if(!empty($className) AND $className != JText::_('CLASS_NAME') AND !empty($newStyles['style'][$id]) AND $newStyles['style'][$id] != JText::_('CSS_STYLE')){
    			$styles[$className] = str_replace('"',"'",$newStyles['style'][$id]);
    		}
    	}
    }
    $template->styles = serialize($styles);

    $template->body = JRequest::getVar('editor_body','','','string',JREQUEST_ALLOWRAW);
    if(!empty($styles['color_bg'])){
    	$pat1 = '#^([^<]*<[^>]*background-color:)([^;">]{1,30})#i';
    	$found = false;
    	if(preg_match($pat1,$template->body)){
    		$template->body = preg_replace($pat1,'$1'.$styles['color_bg'],$template->body);
    		$found = true;
    	}
    	$pat2 = '#^([^<]*<[^>]*bgcolor=")([^;">]{1,10})#i';
    	if(preg_match($pat2,$template->body)){
    		$template->body = preg_replace($pat2,'$1'.$styles['color_bg'],$template->body);
    		$found = true;
    	}
    	if(!$found){
    		$template->body = '<div style="background-color:'.$styles['color_bg'].';" width="100%">'.$template->body.'</div>';
    	}
    }
	$pregreplace = array();
	$pregreplace['#<tr([^>"]*>([^<]*<td[^>]*>[ \n\s]*<img[^>]*>[ \n\s]*</ *td[^>]*>[ \n\s]*)*</ *tr)#Uis'] = '<tr style="line-height: 0px;" $1';
	$pregreplace['#<td(((?!style|>).)*>[ \n\s]*<img[^>]*>[ \n\s]*</ *td)#Uis'] = '<td style="line-height: 0px;" $1';
	$newbody = preg_replace(array_keys($pregreplace),$pregreplace,$template->body);
	if(!empty($newbody)) $template->body = $newbody;
    $template->description = JRequest::getVar('editor_description','','','string',JREQUEST_ALLOWRAW);
    $tempid = $this->save($template);
    if(!$tempid) return false;
    if(empty($template->tempid)){
      $orderClass = acymailing::get('helper.order');
      $orderClass->pkey = 'tempid';
      $orderClass->table = 'template';
      $orderClass->reOrder();
    }
    JRequest::setVar( 'tempid', $tempid);
    return true;
  }
  function save($element){
    if(empty($element->tempid)){
      if(empty($element->namekey)) $element->namekey = time().JFilterOutput::stringURLSafe($element->name);
    }else{
    	 if(file_exists(ACYMAILING_MEDIA.'css'.DS.'template_'.intval($element->tempid).'.css')){
    	 	jimport('joomla.filesystem.file');
    	 	if(!JFile::delete(ACYMAILING_MEDIA.'css'.DS.'template_'.intval($element->tempid).'.css')){
    	 		echo acymailing::display('Could not delete the file '.ACYMAILING_MEDIA.'css'.DS.'template_'.intval($element->tempid).'.css','error');
    	 	}
    	 }
    }
    if(!empty($element->styles) AND !is_string($element->styles))  $element->styles = serialize($element->styles);
    return parent::save($element);
  }
	function detecttemplates($folder){
		$allFiles = JFolder::files($folder);
		if(!empty($allFiles)){
			foreach($allFiles as $oneFile){
				if(preg_match('#^.*(html|htm)$#i',$oneFile)){
					if($this->installtemplate($folder.DS.$oneFile)) return true;
				}
			}
		}
		$status = false;
		$allFolders = JFolder::folders($folder);
		if(!empty($allFolders)){
			foreach($allFolders as $oneFolder){
				$status = $this->detecttemplates($folder.DS.$oneFolder) || $status;
			}
		}
		return $status;
	}
	function buildCSS($style,$stylesheet){
		$inline = '';
		if(!empty($style)){
			foreach($style as $class => $style){
				if(preg_match('#^tag_(.*)$#',$class,$result)){
					if(!empty($style))	$inline.= $result[1].' { '.$style.' } '."\n";
				}elseif($class != 'color_bg'){
					if(!empty($style)) $inline.= '.'.$class.' {'.$style.'} '."\n";
				}
			}
		}
		if(version_compare(PHP_VERSION, '5.0.0', '>=') && class_exists('DOMDocument') && function_exists('mb_convert_encoding')){
			$inline .= 'a img{ border:0px; text-decoration:none;} '."\n";
			$inline .= $stylesheet;
		}
		return $inline;
	}
  function installtemplate($filepath){
		$fileContent = file_get_contents($filepath);
		$newTemplate = null;
		$newTemplate->name = trim(preg_replace('#[^a-z0-9]#i',' ',substr(dirname($filepath),strpos($filepath,'_template'))));
		if(preg_match('#< *title[^>]*>(.*)< */ *title *>#Uis',$fileContent,$results)) $newTemplate->name = $results[1];
		$newFolder =preg_replace('#[^a-z0-9]#i','_',strtolower($newTemplate->name));
		$newTemplateFolder = $newFolder;
		$i = 1;
		while(is_dir(ACYMAILING_TEMPLATE.$newTemplateFolder)){
			$newTemplateFolder = $newFolder.'_'.$i;
			$i++;
		}
		$newTemplate->namekey = rand(0,10000).$newTemplateFolder;
		$moveResult = JFolder::move(dirname($filepath),ACYMAILING_TEMPLATE.$newTemplateFolder);
		if($moveResult !== true){
			acymailing::display(array('Error moving folder from '.dirname($filepath).' to '.ACYMAILING_TEMPLATE.$newTemplateFolder,$moveResult),'error');
			return false;
		}
		if(!file_exists(ACYMAILING_TEMPLATE.$newTemplateFolder.DS.'index.html')){
			JFile::write(ACYMAILING_TEMPLATE.$newTemplateFolder.DS.'index.html','<html><body bgcolor="#FFFFFF"></body></html>');
		}
		$fileContent = preg_replace('#(href|src|action|background)[ ]*=[ ]*\"(?!(https?://|\#|mailto:|/))(?:\.\./|\./)?#','$1="media/com_acymailing/templates/'.$newTemplateFolder.'/',$fileContent);
		if(preg_match('#< *body[^>]*>(.*)< */ *body *>#Uis',$fileContent,$results)){ $newTemplate->body = $results[1];}else{$newTemplate->body = $fileContent;}
		if(preg_match('#< *style[^>]*>(.*)< */ *style *>#Uis',$fileContent,$results)){
			$newTemplate->stylesheet = preg_replace('#(<!--|-->)#s','',$results[1]);
			if(preg_match('#body *\{[^\}]*background-color:([^;]*);#Uis',$newTemplate->stylesheet,$backgroundresults)){
				$newTemplate->styles['color_bg'] = trim($backgroundresults[1]);
				$newTemplate->stylesheet = preg_replace('#(body *\{[^\}]*)background-color:[^;]*;#Uis','$1',$newTemplate->stylesheet);
			}
			$quickstyle = array('tag_h1' => 'h1','tag_h2' => 'h2', 'tag_h3' => 'h3','tag_h4' => 'h4','tag_h5' => 'h5','tag_h6' => 'h6','tag_a' => 'a','tag_ul' => 'ul','tag_li' => 'li','acymailing_unsub' => '\.acymailing_unsub','acymailing_online' => '\.acymailing_online','acymailing_title' => '\.acymailing_title','acymailing_content' => '\.acymailing_content','acymailing_readmore' => '\.acymailing_readmore');
			foreach($quickstyle as $styledb => $oneStyle){
				if(preg_match('#'.$oneStyle.' *{([^}]*)}#Uis',$newTemplate->stylesheet,$quickstyleresults)){
					$newTemplate->styles[$styledb] = trim(str_replace(array("\n","\r","\t","\s"),' ',$quickstyleresults[1]));
					$newTemplate->stylesheet = preg_replace('#'.$oneStyle.' *{[^}]*}#Uis','',$newTemplate->stylesheet);
				}
			}
		}
		if(!empty($newTemplate->styles['color_bg'])){
	    	$pat1 = '#^([^<]*<[^>]*background-color:)([^;">]{1,10})#i';
	    	$found = false;
	    	if(preg_match($pat1,$newTemplate->body)){
	    		$newTemplate->body = preg_replace($pat1,'$1'.$newTemplate->styles['color_bg'],$newTemplate->body);
	    		$found = true;
	    	}
	    	$pat2 = '#^([^<]*<[^>]*bgcolor=")([^;">]{1,10})#i';
	    	if(preg_match($pat2,$newTemplate->body)){
	    		$newTemplate->body = preg_replace($pat2,'$1'.$newTemplate->styles['color_bg'],$newTemplate->body);
	    		$found = true;
	    	}
	    	if(!$found){
	    		$newTemplate->body = '<div style="background-color:'.$newTemplate->styles['color_bg'].';" width="100%">'.$newTemplate->body.'</div>';
	    	}
    	}
    	$allFiles = JFolder::files(ACYMAILING_TEMPLATE.$newTemplateFolder);
    	$thumbnail = '';
    	$acypict = acymailing::get('helper.acypict');
    	$acypict->maxHeight = 190;
    	$acypict->maxWidth = 170;
    	foreach($allFiles as $oneFile){
    		if(preg_match('#(thumbnail|screenshot|muestra)#i',$oneFile)){
				if($acypict->available()){
					$newPict = $acypict->generateThumbnail(ACYMAILING_TEMPLATE.$newTemplateFolder.DS.$oneFile);
					if($newPict) $oneFile = basename($newPict['file']);
				}
    			$newTemplate->description = '<img src="media/com_acymailing/templates/'.$newTemplateFolder.'/'.$oneFile.'" />';
    			break;
    		}
    	}
		static $order = 0;
		if(empty($order)){
			$this->database->setQuery('SELECT MAX(ordering) FROM `#__acymailing_template`');
			$order =$this->database->loadResult();
		}
		$order++;
		$newTemplate->ordering = $order;
		$this->save($newTemplate);
		$this->templateNames[] = $newTemplate->name;
		return true;
  }
}
Return current item: AcyMailing