PageRenderTime 57ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/class.emailtemplatemanager.php

https://github.com/korelogic/email_template_manager
PHP | 350 lines | 282 code | 43 blank | 25 comment | 51 complexity | f1ca232a234ca02310463236f63f94d2 MD5 | raw file
  1. <?php
  2. if(!defined('EMAILTEMPLATES')) define('EMAILTEMPLATES', WORKSPACE . "/email-templates");
  3. if(!defined('ETMDIR')) define('ETMDIR', EXTENSIONS . "/email_template_manager");
  4. require_once(TOOLKIT . '/class.manager.php');
  5. require_once(TOOLKIT . '/class.extensionmanager.php');
  6. require_once('class.emailtemplate.php');
  7. Class EmailTemplateManager{
  8. static $errorMsg = "";
  9. public static function load($handle){
  10. $classname = self::getClassNameFromHandle($handle);
  11. if(self::find($handle)){
  12. return new $classname;
  13. }
  14. else{
  15. return false;
  16. }
  17. }
  18. public static function find($handle){
  19. $filename = self::getFileNameFromHandle($handle);
  20. $classname = self::getClassNameFromHandle($handle);
  21. if(is_dir(EMAILTEMPLATES . "/$handle")){
  22. if(file_exists(EMAILTEMPLATES . "/$handle/$filename")){
  23. include_once(EMAILTEMPLATES . "/$handle/$filename");
  24. if(class_exists($classname)){
  25. return EMAILTEMPLATES . "/$handle/$filename";
  26. }
  27. else{
  28. self::$errorMsg = "Class $classname not set in file $filename";
  29. return false;
  30. }
  31. }
  32. else{
  33. self::$errorMsg = "File $filename not set for template $handle";
  34. return false;
  35. }
  36. }
  37. else{
  38. $found = false;
  39. foreach(ExtensionManager::listInstalledHandles() as $extension){
  40. if(is_dir(EXTENSIONS . '/' . $extension . '/email-templates/' . $handle)){
  41. if(file_exists(EXTENSIONS . '/' . $extension . "/email-templates/$handle/$filename")){
  42. include_once(EXTENSIONS . '/' . $extension . "/email-templates/$handle/$filename");
  43. if(class_exists($classname)){
  44. $found = true;
  45. return EXTENSIONS . '/' . $extension . "/email-templates/$handle";
  46. }
  47. else{
  48. self::$errorMsg = "Class $classname not set in file $filename";
  49. return false;
  50. }
  51. }
  52. else{
  53. self::$errorMsg = "File $filename not set for template $handle";
  54. return false;
  55. }
  56. }
  57. }
  58. if(!$found){
  59. self::$errorMsg = "Template $handle not found";
  60. return false;
  61. }
  62. }
  63. }
  64. public static function create($config){
  65. $handle = self::getHandleFromName($config['name']);
  66. if(!self::find($handle)){
  67. if(!is_dir(EMAILTEMPLATES . "/$handle")){
  68. mkdir(EMAILTEMPLATES . "/$handle");
  69. if(!self::_writeConfig($handle, self::_parseConfigTemplate($handle, $config), true)) return false;
  70. if(!self::_writeLayout($handle, 'Plain', file_get_contents(ETMDIR . '/content/templates/xsl-plain.tpl'), true)) return false;
  71. if(!self::_writeLayout($handle, 'HTML', file_get_contents(ETMDIR . '/content/templates/xsl-html.tpl'), true)) return false;
  72. Symphony::ExtensionManager()->notifyMembers('EmailTemplatePostCreate', '/extension/email_template_manager/', array('config'=>$config));
  73. return true;
  74. }
  75. else{
  76. self::$errorMsg = 'Dir ' . EMAILTEMPLATES . "/$handle already exists.";
  77. return false;
  78. }
  79. }
  80. else{
  81. self::$errorMsg = "Template $handle already exists.";
  82. return false;
  83. }
  84. }
  85. public static function editConfig($handle, $config){
  86. if($template = self::load($handle)){
  87. if($template->editable == true){
  88. if(self::_writeConfig($handle, self::_parseConfigTemplate($handle, $config))){
  89. $old_dir = dirname(self::find($handle));
  90. $new_dir = dirname($old_dir) . '/' . self::getHandleFromName($config['name']);
  91. if(self::getHandleFromName($config['name']) != $handle){
  92. if(!is_dir($new_dir)){
  93. if(!rename($old_dir, $new_dir)) return false;
  94. Symphony::ExtensionManager()->notifyMembers('EmailTemplatePostSave','/extension/email_template_manager/', array('old_handle' =>$handle, 'config'=>$config));
  95. return rename($new_dir . '/' . self::getFileNameFromHandle($handle), $new_dir . '/' . self::getFileNameFromHandle(self::getHandleFromName($config['name'])));
  96. }
  97. }
  98. return true;
  99. }
  100. else{
  101. return false;
  102. }
  103. }
  104. else{
  105. self::$errorMsg = "Template $handle is set to read-only mode.";
  106. return false;
  107. }
  108. }
  109. else{
  110. self::$errorMsg = "Template $handle can not be found.";
  111. return false;
  112. }
  113. }
  114. public static function editLayout($handle, $layout, $content){
  115. if($template = self::load($handle)){
  116. if(in_array($layout, array_keys($template->layouts), true)){
  117. return self::_writeLayout($handle, $layout, $content);
  118. }
  119. else{
  120. self::$errorMsg = "Layout $layout is not set with template $handle.";
  121. return false;
  122. }
  123. }
  124. else{
  125. self::$errorMsg = "Template $handle not found.";
  126. return false;
  127. }
  128. }
  129. public static function delete($handle){
  130. $dir = dirname(self::find($handle));
  131. if(is_dir($dir) && is_writeable($dir)){
  132. try{
  133. if(!(($files = @scandir($dir)) && count($files) <= 2)){
  134. foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $filename => $cur){
  135. if(is_dir($filename)){
  136. rmdir($filename);
  137. }
  138. elseif(is_file($filename)){
  139. unlink($filename);
  140. }
  141. }
  142. }
  143. return rmdir($dir);
  144. }
  145. catch(Exception $e){
  146. self::$errorMsg = "Directory $dir could not be removed. Please check permissions.";
  147. return false;
  148. }
  149. }
  150. else{
  151. self::$errorMsg = "Template $handle can not be found.";
  152. return false;
  153. }
  154. }
  155. public static function listAll(){
  156. $result = Array();
  157. foreach(new DirectoryIterator(EMAILTEMPLATES) as $dir){
  158. if($dir->isDir() && !$dir->isDot()){
  159. if(file_exists($dir->getPathname() . '/' . self::getFileNameFromHandle($dir->getFilename()))){
  160. $result[$dir->getFileName()] = self::load($dir->getFileName());
  161. }
  162. }
  163. }
  164. foreach(ExtensionManager::listInstalledHandles() as $extension){
  165. if(is_dir(EXTENSIONS . '/' . $extension . "/email-templates")){
  166. foreach(new DirectoryIterator(EXTENSIONS . '/' . $extension . "/email-templates") as $dir){
  167. if($dir->isDir() && !$dir->isDot()){
  168. if(file_exists($dir->getPathname() . '/' . self::getFileNameFromHandle($dir->getFilename()))){
  169. $result[$dir->getFileName()] = self::load($dir->getFileName());
  170. }
  171. }
  172. }
  173. }
  174. }
  175. ksort($result, SORT_STRING);
  176. return $result;
  177. }
  178. public static function getClassNameFromHandle($handle){
  179. return sprintf('%sEmailTemplate', str_replace('-', '_', ucfirst(strtolower($handle))));
  180. }
  181. public static function getHandleFromFilename($filename){
  182. return sscanf($filename, 'class.%[^.php].php');
  183. }
  184. public static function getFileNameFromHandle($handle){
  185. return sprintf('class.%s.php', strtolower($handle));
  186. }
  187. public static function getHandleFromName($name){
  188. return ltrim(strtolower(preg_replace('/[^a-zA-Z0-9\-]/', '', str_replace(' ', '-', $name))), "\x49..\x58");
  189. }
  190. public static function getFileNameFromLayout($layout = 'html'){
  191. return sprintf('template.%s.xsl', strtolower($layout));
  192. }
  193. public static function about($name){
  194. $classname = self::__getClassName($name);
  195. $path = self::__getDriverPath($name);
  196. if(!@file_exists($path)) return false;
  197. require_once($path);
  198. $handle = self::__getHandleFromFilename(basename($path));
  199. if(is_callable(array($classname, 'about'))){
  200. $about = call_user_func(array($classname, 'about'));
  201. return array_merge($about, array('handle' => $handle));
  202. }
  203. }
  204. /**
  205. * Writes configuration values to the template configuration file.
  206. *
  207. * The name of the template to write configuration values to
  208. * @param string $handle
  209. * The configuration to write
  210. * @param string $contents
  211. * The location to write to, defaults to the workspace dir
  212. * @param string $file
  213. * @param bool $overwrite
  214. *
  215. * @return bool
  216. */
  217. protected function _writeConfig($handle, $contents, $new = false){
  218. if($dir = ($new) ? EMAILTEMPLATES . '/' . $handle : dirname(self::find($handle))){
  219. if(is_dir($dir) && is_writeable($dir)){
  220. if((is_writeable($dir . '/' . self::getFileNameFromHandle($handle))) || !file_exists($dir . '/' . self::getFileNameFromHandle($handle))){
  221. file_put_contents($dir . '/' . self::getFileNameFromHandle($handle), $contents);
  222. return true;
  223. }
  224. else{
  225. return false;
  226. self::$errorMsg = "File $dir " . '/' . self::getFileNameFromHandle($handle) . " can not be written to. Please check permissions";
  227. }
  228. }
  229. else{
  230. self::$errorMsg = "Directory $dir does not exist, or is not writeable.";
  231. return false;
  232. }
  233. }
  234. else{
  235. self::$errorMsg = "Template $handle can not be found.";
  236. return false;
  237. }
  238. }
  239. /**
  240. * Writes the layout to the layout file.
  241. *
  242. * The name of the template containing the layout
  243. * @param string $handle
  244. * The layout to write to
  245. * @param string $layout
  246. * The content to write to the layout file
  247. * @param string $contents
  248. *
  249. * @return bool
  250. */
  251. protected function _writeLayout($handle, $layout, $contents, $new = false){
  252. if($dir = ($new) ? EMAILTEMPLATES . '/' . $handle : dirname(self::find($handle))){
  253. if(is_dir($dir) && is_writeable($dir)){
  254. if((is_writeable($dir . '/' . self::getFileNameFromLayout($layout))) || !file_exists($dir . '/' . self::getFileNameFromLayout($layout))){
  255. file_put_contents($dir . '/' . self::getFileNameFromLayout($layout), $contents);
  256. return true;
  257. }
  258. else{
  259. self::$errorMsg = "File $dir " . '/' . self::getFileNameFromLayout($layout) . " can not be written to. Please check permissions";
  260. return false;
  261. }
  262. }
  263. else{
  264. self::$errorMsg = "Directory $dir does not exist, or is not writeable.";
  265. return false;
  266. }
  267. }
  268. else{
  269. self::$errorMsg = "Template $handle can not be found.";
  270. return false;
  271. }
  272. }
  273. protected function _parseConfigTemplate($handle, $config){
  274. $default_config = Array(
  275. 'datasources'=>Array(
  276. ),
  277. 'layouts' => Array(
  278. 'html'=>'template.html.xsl',
  279. 'plain'=>'template.plain.xsl'
  280. )
  281. );
  282. $config = array_merge($default_config, $config);
  283. $config_template = file_get_contents(ETMDIR . '/content/templates/class.tpl', $config_template);
  284. $config_template = str_replace('<!-- CLASS NAME -->', self::getClassNameFromHandle(self::getHandleFromName($config['name'])), $config_template);
  285. $config_template = str_replace('<!-- NAME -->', addslashes($config['name']), $config_template);
  286. $config_template = str_replace('<!-- REPLYTONAME -->', addslashes($config['reply-to-name']), $config_template);
  287. $config_template = str_replace('<!-- REPLYTOEMAIL -->', addslashes($config['reply-to-email-address']), $config_template);
  288. $config_template = str_replace('<!-- RECIPIENTS -->', addslashes($config['recipients']), $config_template);
  289. $config_template = str_replace('<!-- VERSION -->', '1.0', $config_template);
  290. $config_template = str_replace('<!-- AUTHOR NAME -->', addslashes(Administration::instance()->Author->getFullName()), $config_template);
  291. $config_template = str_replace('<!-- AUTHOR WEBSITE -->', addslashes(URL), $config_template);
  292. $config_template = str_replace('<!-- AUTHOR EMAIL -->', addslashes(Administration::instance()->Author->get('email')), $config_template);
  293. $config_template = str_replace('<!-- RELEASE DATE -->', DateTimeObj::getGMT('c'), $config_template);
  294. $config_template = str_replace('<!-- SUBJECT -->', addslashes($config['subject']), $config_template);
  295. foreach($config['datasources'] as $ds){
  296. $datasources .= "\r\n \t\t\t'".addslashes($ds)."',";
  297. }
  298. $config_template = str_replace('<!-- DATASOURCES -->', $datasources, $config_template);
  299. foreach($config['layouts'] as $tp => $lt){
  300. $layouts .= "\r\n \t\t\t'$tp' => '".addslashes($lt)."',";
  301. }
  302. $config_template = str_replace('<!-- LAYOUTS -->', $layouts, $config_template);
  303. return $config_template;
  304. }
  305. }
  306. Class EmailTemplateManagerException extends Exception{
  307. }