PageRenderTime 62ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/code/administrator/components/com_jce/install.php

https://github.com/janssit/logopedie-vuegen.be
PHP | 1147 lines | 768 code | 217 blank | 162 comment | 154 complexity | 7e985ebf356b703fa2fe1cd8e4590ceb MD5 | raw file
Possible License(s): MIT, JSON, 0BSD, GPL-2.0, BSD-3-Clause, LGPL-2.1
  1. <?php
  2. /**
  3. * @package JCE
  4. * @copyright Copyright (c) 2009-2013 Ryan Demmer. All rights reserved.
  5. * @license GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  6. * JCE is free software. This version may have been modified pursuant
  7. * to the GNU General Public License, and as distributed it includes or
  8. * is derivative of works licensed under the GNU General Public License or
  9. * other free or open source software licenses.
  10. */
  11. defined('_JEXEC') or die('RESTRICTED');
  12. // try to set time limit
  13. @set_time_limit(0);
  14. // try to increase memory limit
  15. if ((int) ini_get('memory_limit') < 32) {
  16. @ini_set('memory_limit', '32M');
  17. }
  18. abstract class WFInstall {
  19. public static function install($installer) {
  20. error_reporting(E_ERROR | E_WARNING);
  21. // load languages
  22. $language = JFactory::getLanguage();
  23. $language->load('com_jce', JPATH_ADMINISTRATOR, null, true);
  24. $language->load('com_jce.sys', JPATH_ADMINISTRATOR, null, true);
  25. // get manifest
  26. $manifest = $installer->getManifest();
  27. $new_version = (string) $manifest->version;
  28. // Joomla! 1.5
  29. if (!defined('JPATH_PLATFORM') && !$new_version) {
  30. $new_version = (string) $manifest->document->getElementByPath('version')->data();
  31. }
  32. // get version from xml file
  33. if (!$manifest) {
  34. $manifest = JApplicationHelper::parseXMLInstallFile($installer->getPath('manifest'));
  35. if (is_array($manifest)) {
  36. $new_version = $manifest['version'];
  37. }
  38. }
  39. $state = false;
  40. // the current version
  41. $current_version = $new_version;
  42. if (defined('JPATH_PLATFORM')) {
  43. $xml_file = $installer->getPath('extension_administrator') . '/jce.xml';
  44. // check for an xml file
  45. if (is_file($xml_file)) {
  46. if ($xml = JApplicationHelper::parseXMLInstallFile($xml_file)) {
  47. $current_version = $xml['version'];
  48. }
  49. }
  50. } else {
  51. if (basename($installer->getPath('manifest')) == 'legacy.xml') {
  52. $xml_file = JPATH_PLUGINS . '/editors/jce.xml';
  53. // check for an xml file
  54. if ($xml = JApplicationHelper::parseXMLInstallFile($xml_file)) {
  55. $current_version = $xml['version'];
  56. } else {
  57. // check for old tables
  58. if (self::checkTable('#__jce_groups')) {
  59. $current_version = '1.5.0';
  60. }
  61. // check for old tables
  62. if (self::checkTable('#__jce_profiles')) {
  63. $current_version = '2.0.0beta1';
  64. }
  65. }
  66. }
  67. }
  68. // install profiles etc.
  69. $state = self::installProfiles();
  70. // perform upgrade
  71. if (version_compare($current_version, $new_version, '<')) {
  72. $state = self::upgrade($current_version);
  73. }
  74. // Add device column
  75. if (self::checkTableColumn('#__wf_profiles', 'device') === false) {
  76. $db = JFactory::getDBO();
  77. switch (strtolower($db->name)) {
  78. case 'mysql':
  79. case 'mysqli':
  80. $query = 'ALTER TABLE #__wf_profiles CHANGE `description` `description` TEXT';
  81. $db->setQuery($query);
  82. $db->query();
  83. // Change types field to TEXT
  84. $query = 'ALTER TABLE #__wf_profiles CHANGE `types` `types` TEXT';
  85. $db->setQuery($query);
  86. $db->query();
  87. // Add device field - MySQL
  88. $query = 'ALTER TABLE #__wf_profiles ADD `device` VARCHAR(255) AFTER `area`';
  89. break;
  90. case 'sqlsrv':
  91. case 'sqlazure':
  92. case 'sqlzure':
  93. $query = 'ALTER TABLE #__wf_profiles ADD `device` NVARCHAR(250)';
  94. break;
  95. case 'postgresql':
  96. $query = 'ALTER TABLE #__wf_profiles ADD "device" character varying(255) NOT NULL';
  97. break;
  98. }
  99. $db->setQuery($query);
  100. $db->query();
  101. }
  102. if ($state) {
  103. // legacy (JCE 1.5) cleanup
  104. if (!defined('JPATH_PLATFORM')) {
  105. self::legacyCleanup();
  106. }
  107. $message = '<div id="jce"><style type="text/css" scoped="scoped">' . file_get_contents(dirname(__FILE__) . '/media/css/install.css') . '</style>';
  108. $message .= '<h2>' . JText::_('WF_ADMIN_TITLE') . ' ' . $new_version . '</h2>';
  109. $message .= '<ul class="install">';
  110. $message .= '<li class="success">' . JText::_('WF_ADMIN_DESC') . '<li>';
  111. // install packages (editor plugin, quickicon etc)
  112. $packages = $installer->getPath('source') . '/packages';
  113. // install additional packages
  114. if (is_dir($packages)) {
  115. $message .= self::installPackages($packages);
  116. }
  117. $message .= '</ul>';
  118. $message .= '</div>';
  119. $installer->set('message', $message);
  120. // post-install
  121. self::addIndexfiles(array(dirname(__FILE__), JPATH_SITE . '/components/com_jce', JPATH_PLUGINS . '/jce'));
  122. } else {
  123. $installer->abort();
  124. return false;
  125. }
  126. }
  127. private static function paramsToObject($data) {
  128. $registry = new JRegistry();
  129. $registry->loadIni($data);
  130. return $registry->toObject();
  131. }
  132. private static function loadXMLFile($file) {
  133. $xml = null;
  134. // Disable libxml errors and allow to fetch error information as needed
  135. libxml_use_internal_errors(true);
  136. if (is_file($file)) {
  137. // Try to load the xml file
  138. $xml = simplexml_load_file($file);
  139. }
  140. return $xml;
  141. }
  142. // Upgrade from JCE 1.5.x
  143. private static function upgradeLegacy() {
  144. $app = JFactory::getApplication();
  145. $db = JFactory::getDBO();
  146. $admin = JPATH_ADMINISTRATOR . '/components/com_jce';
  147. $site = JPATH_SITE . '/components/com_jce';
  148. //require_once($admin . '/helpers/parameter.php');
  149. // check for groups table / data
  150. if (self::checkTable('#__jce_groups') && self::checkTableContents('#__jce_groups')) {
  151. jimport('joomla.plugin.helper');
  152. // get plugin
  153. $plugin = JPluginHelper::getPlugin('editors', 'jce');
  154. // get JCE component
  155. $table = JTable::getInstance('component');
  156. $table->loadByOption('com_jce');
  157. // process params to JSON string
  158. $params = self::paramsToObject($table->params);
  159. // set params
  160. $table->params = json_encode(array('editor' => $params));
  161. // store
  162. $table->store();
  163. // get all groups data
  164. $query = 'SELECT * FROM #__jce_groups';
  165. $db->setQuery($query);
  166. $groups = $db->loadObjectList();
  167. // get all plugin data
  168. $query = 'SELECT id, name, icon FROM #__jce_plugins';
  169. $db->setQuery($query);
  170. $plugins = $db->loadAssocList('id');
  171. $map = array(
  172. 'advlink' => 'link',
  173. 'advcode' => 'source',
  174. 'tablecontrols' => 'table',
  175. 'cut,copy,paste' => 'clipboard',
  176. 'paste' => 'clipboard',
  177. 'search,replace' => 'searchreplace',
  178. 'cite,abbr,acronym,del,ins,attribs' => 'xhtmlxtras',
  179. 'styleprops' => 'style',
  180. 'readmore,pagebreak' => 'article',
  181. 'ltr,rtl' => 'directionality',
  182. 'insertlayer,moveforward,movebackward,absolute' => 'layer'
  183. );
  184. if (self::createProfilesTable()) {
  185. foreach ($groups as $group) {
  186. $row = JTable::getInstance('profiles', 'WFTable');
  187. $rows = array();
  188. // transfer row ids to names
  189. foreach (explode(';', $group->rows) as $item) {
  190. $icons = array();
  191. foreach (explode(',', $item) as $id) {
  192. // spacer
  193. if ($id == '00') {
  194. $icon = 'spacer';
  195. } else {
  196. if (isset($plugins[$id])) {
  197. $icon = $plugins[$id]['icon'];
  198. // map old icon names to new
  199. if (array_key_exists($icon, $map)) {
  200. $icon = $map[$icon];
  201. }
  202. }
  203. }
  204. $icons[] = $icon;
  205. }
  206. $rows[] = implode(',', $icons);
  207. }
  208. // re-assign rows
  209. $row->rows = implode(';', $rows);
  210. $names = array('anchor');
  211. // add lists
  212. if (preg_match('#(numlist|bullist)#', $row->rows)) {
  213. $names[] = 'lists';
  214. }
  215. // add charmap
  216. if (strpos($row->rows, 'charmap') !== false) {
  217. $names[] = 'charmap';
  218. }
  219. // transfer plugin ids to names
  220. foreach (explode(',', $group->plugins) as $id) {
  221. if (isset($plugins[$id])) {
  222. $name = $plugins[$id]['name'];
  223. // map old icon names to new
  224. if (array_key_exists($name, $map)) {
  225. $name = $map[$name];
  226. }
  227. $names[] = $name;
  228. }
  229. }
  230. // re-assign plugins
  231. $row->plugins = implode(',', $names);
  232. // convert params to JSON
  233. $params = self::paramsToObject($group->params);
  234. $data = new StdClass();
  235. // Add lists plugin
  236. $buttons = array();
  237. if (strpos($row->rows, 'numlist') !== false) {
  238. $buttons[] = 'numlist';
  239. // replace "numlist" with "lists"
  240. $row->rows = str_replace('numlist', 'lists', $row->rows);
  241. }
  242. if (strpos($row->rows, 'bullist') !== false) {
  243. $buttons[] = 'bullist';
  244. // replace "bullist" with "lists"
  245. if (strpos($row->rows, 'lists') === false) {
  246. $row->rows = str_replace('bullist', 'lists', $row->rows);
  247. }
  248. }
  249. // remove bullist and numlist
  250. $row->rows = str_replace(array('bullist', 'numlist'), '', $row->rows);
  251. // add lists buttons parameter
  252. if (!empty($buttons)) {
  253. $params->lists_buttons = $buttons;
  254. }
  255. // convert parameters
  256. foreach ($params as $key => $value) {
  257. $parts = explode('_', $key);
  258. $node = array_shift($parts);
  259. // special consideration for imgmanager_ext!!
  260. if (strpos($key, 'imgmanager_ext_') !== false) {
  261. $node = $node . '_' . array_shift($parts);
  262. }
  263. // convert some nodes
  264. if (isset($map[$node])) {
  265. $node = $map[$node];
  266. }
  267. $key = implode('_', $parts);
  268. if ($value !== '') {
  269. if (!isset($data->$node) || !is_object($data->$node)) {
  270. $data->$node = new StdClass();
  271. }
  272. // convert Link parameters
  273. if ($node == 'link' && $key != 'target') {
  274. $sub = $key;
  275. $key = 'links';
  276. if (!isset($data->$node->$key)) {
  277. $data->$node->$key = new StdClass();
  278. }
  279. if (preg_match('#^(content|contacts|static|weblinks|menu)$#', $sub)) {
  280. if (!isset($data->$node->$key->joomlalinks)) {
  281. $data->$node->$key->joomlalinks = new StdClass();
  282. $data->$node->$key->joomlalinks->enable = 1;
  283. }
  284. $data->$node->$key->joomlalinks->$sub = $value;
  285. } else {
  286. $data->$node->$key->$sub = new StdClass();
  287. $data->$node->$key->$sub->enable = 1;
  288. }
  289. } else {
  290. $data->$node->$key = $value;
  291. }
  292. }
  293. }
  294. // re-assign params
  295. $row->params = json_encode($data);
  296. // re-assign other values
  297. $row->name = $group->name;
  298. $row->description = $group->description;
  299. $row->users = $group->users;
  300. $row->types = $group->types;
  301. $row->components = $group->components;
  302. $row->published = $group->published;
  303. $row->ordering = $group->ordering;
  304. // add area data
  305. if ($row->name == 'Default') {
  306. $row->area = 0;
  307. }
  308. if ($row->name == 'Front End') {
  309. $row->area = 1;
  310. }
  311. if (self::checkTable('#__wf_profiles')) {
  312. $name = $row->name;
  313. // check for existing profile
  314. $query = 'SELECT id FROM #__wf_profiles' . ' WHERE name = ' . $db->Quote($name);
  315. $db->setQuery($query);
  316. // create name copy if exists
  317. while ($db->loadResult()) {
  318. $name = JText::sprintf('WF_PROFILES_COPY_OF', $name);
  319. $query = 'SELECT id FROM #__wf_profiles' . ' WHERE name = ' . $db->Quote($name);
  320. $db->setQuery($query);
  321. }
  322. // set name
  323. $row->name = $name;
  324. }
  325. if (!$row->store()) {
  326. $app->enqueueMessage('Conversion of group data failed : ' . $row->name, 'error');
  327. } else {
  328. $app->enqueueMessage('Conversion of group data successful : ' . $row->name);
  329. }
  330. unset($row);
  331. }
  332. // If profiles table empty due to error, install profiles data
  333. if (!self::checkTableContents('#__wf_profiles')) {
  334. self::installProfiles();
  335. } else {
  336. // add Blogger profile
  337. self::installProfile('Blogger');
  338. // add Mobile profile
  339. self::installProfile('Mobile');
  340. }
  341. } else {
  342. return false;
  343. }
  344. // Install profiles
  345. } else {
  346. self::installProfiles();
  347. }
  348. // Remove Plugins menu item
  349. $query = 'DELETE FROM #__components' . ' WHERE admin_menu_link = ' . $db->Quote('option=com_jce&type=plugins');
  350. $db->setQuery($query);
  351. $db->query();
  352. // Update Component Name
  353. $query = 'UPDATE #__components' . ' SET name = ' . $db->Quote('COM_JCE') . ' WHERE ' . $db->Quote('option') . '=' . $db->Quote('com_jce') . ' AND parent = 0';
  354. $db->setQuery($query);
  355. $db->query();
  356. // Fix links for other views and edit names
  357. $menus = array('install' => 'installer', 'group' => 'profiles', 'groups' => 'profiles', 'config' => 'config');
  358. $row = JTable::getInstance('component');
  359. foreach ($menus as $k => $v) {
  360. $query = 'SELECT id FROM #__components' . ' WHERE admin_menu_link = ' . $db->Quote('option=com_jce&type=' . $k);
  361. $db->setQuery($query);
  362. $id = $db->loadObject();
  363. if ($id) {
  364. $row->load($id);
  365. $row->name = $v;
  366. $row->admin_menu_link = 'option=com_jce&view=' . $v;
  367. if (!$row->store()) {
  368. $mainframe->enqueueMessage('Unable to update Component Links for view : ' . strtoupper($v), 'error');
  369. }
  370. }
  371. }
  372. // remove old admin language files
  373. $folders = JFolder::folders(JPATH_ADMINISTRATOR . '/language', '.', false, true, array('.svn', 'CVS', 'en-GB'));
  374. foreach ($folders as $folder) {
  375. $name = basename($folder);
  376. $files = array($name . '.com_jce.ini', $name . '.com_jce.menu.ini', $name . '.com_jce.xml');
  377. foreach ($files as $file) {
  378. if (is_file($folder . '/' . $file)) {
  379. @JFile::delete($folder . '/' . $file);
  380. }
  381. }
  382. }
  383. // remove old site language files
  384. $folders = JFolder::folders(JPATH_SITE . '/language', '.', false, true, array('.svn', 'CVS', 'en-GB'));
  385. foreach ($folders as $folder) {
  386. $files = JFolder::files($folder, '^' . basename($folder) . '\.com_jce([_a-z0-9]+)?\.(ini|xml)$', false, true);
  387. @JFile::delete($files);
  388. }
  389. // remove legacy admin folders
  390. $folders = array('cpanel', 'config', 'css', 'groups', 'plugins', 'img', 'installer', 'js');
  391. foreach ($folders as $folder) {
  392. if (is_dir($admin . '/' . $folder)) {
  393. @JFolder::delete($admin . '/' . $folder);
  394. }
  395. }
  396. // remove legacy admin files
  397. $files = array('editor.php', 'helper.php', 'updater.php');
  398. foreach ($files as $file) {
  399. if (is_file($admin . '/' . $file)) {
  400. @JFile::delete($admin . '/' . $file);
  401. }
  402. }
  403. // remove legacy admin folders
  404. $folders = array('controller', 'css', 'js');
  405. foreach ($folders as $folder) {
  406. if (is_dir($site . '/' . $folder)) {
  407. @JFolder::delete($site . '/' . $folder);
  408. }
  409. }
  410. // remove legacy admin files
  411. $files = array('popup.php');
  412. foreach ($files as $file) {
  413. if (is_file($site . '/' . $file)) {
  414. @JFile::delete($site . '/' . $file);
  415. }
  416. }
  417. if (!defined('JPATH_PLATFORM')) {
  418. // remove old plugin folder
  419. $path = JPATH_PLUGINS . '/editors';
  420. if (is_dir($path . '/jce')) {
  421. @JFolder::delete($path . '/jce');
  422. }
  423. }
  424. return true;
  425. }
  426. private static function installProfile($name) {
  427. $db = JFactory::getDBO();
  428. $query = $db->getQuery(true);
  429. if (is_object($query)) {
  430. $query->select('COUNT(id)')->from('#__wf_profiles')->where('name = ' . $db->Quote($name));
  431. } else {
  432. $query = 'SELECT COUNT(id) FROM #__wf_profiles WHERE name = ' . $db->Quote($name);
  433. }
  434. $db->setQuery($query);
  435. $id = $db->loadResult();
  436. if (!$id) {
  437. // Blogger
  438. $file = JPATH_ADMINISTRATOR . '/components/com_jce/models/profiles.xml';
  439. $xml = self::loadXMLFile($file);
  440. if ($xml) {
  441. foreach ($xml->profiles->children() as $profile) {
  442. if ((string) $profile->attributes()->name == $name) {
  443. $row = JTable::getInstance('profiles', 'WFTable');
  444. require_once(JPATH_ADMINISTRATOR . '/components/com_jce/models/profiles.php');
  445. $groups = WFModelProfiles::getUserGroups((int) $profile->children('area'));
  446. foreach ($profile->children() as $item) {
  447. switch ((string) $item->getName()) {
  448. case 'types':
  449. $row->types = implode(',', $groups);
  450. break;
  451. case 'area':
  452. $row->area = (int) $item;
  453. break;
  454. case 'rows':
  455. $row->rows = (string) $item;
  456. break;
  457. case 'plugins':
  458. $row->plugins = (string) $item;
  459. break;
  460. default:
  461. $key = $item->getName();
  462. $row->$key = (string) $item;
  463. break;
  464. }
  465. }
  466. $row->store();
  467. }
  468. }
  469. }
  470. }
  471. }
  472. /**
  473. * Upgrade database tables and remove legacy folders
  474. * @return Boolean
  475. */
  476. private static function upgrade($version) {
  477. $app = JFactory::getApplication();
  478. $db = JFactory::getDBO();
  479. jimport('joomla.filesystem.folder');
  480. jimport('joomla.filesystem.file');
  481. $admin = JPATH_ADMINISTRATOR . '/components/com_jce';
  482. $site = JPATH_SITE . '/components/com_jce';
  483. // add tables path
  484. JTable::addIncludePath($admin . '/tables');
  485. // upgrade from 1.5.x to 2.0.0 (only in Joomla! 1.5)
  486. if (version_compare($version, '2.0.0', '<') && !defined('JPATH_PLATFORM')) {
  487. return self::upgradeLegacy();
  488. }// end JCE 1.5 upgrade
  489. // Remove folders
  490. $folders = array(
  491. // Remove JQuery folders from admin
  492. $admin . '/media/css/jquery',
  493. $admin . '/media/js/jquery',
  494. // remove plugin package folder
  495. $admin . '/plugin',
  496. // remove legend view
  497. $admin . '/views/legend',
  498. // remove controller from site
  499. $site . '/controller',
  500. // Remove plugin language files (incorporated into main language file)
  501. $site . '/editor/tiny_mce/plugins/article/langs',
  502. $site . '/editor/tiny_mce/plugins/imgmanager/langs',
  503. $site . '/editor/tiny_mce/plugins/link/langs',
  504. $site . '/editor/tiny_mce/plugins/searchreplace/langs',
  505. $site . '/editor/tiny_mce/plugins/style/langs',
  506. $site . '/editor/tiny_mce/plugins/table/langs',
  507. $site . '/editor/tiny_mce/plugins/xhtmlxtras/langs',
  508. // remove paste folder
  509. $site . '/editor/tiny_mce/plugins/paste',
  510. // remove jquery
  511. $site . '/editor/libraries/js/jquery',
  512. // remove browser extension
  513. $site . '/editor/extensions/browser',
  514. // remove browser langs
  515. $site . '/editor/tiny_mce/plugins/browser/langs',
  516. // remove packages
  517. $admin . '/packages',
  518. // remove tinymce langs
  519. $site . '/editor/tiny_mce/langs',
  520. // remove dragupload folder (ranamed to upload)
  521. $site . '/editor/tiny_mce/plugins/dragupload'
  522. );
  523. foreach ($folders as $folder) {
  524. if (JFolder::exists($folder)) {
  525. @JFolder::delete($folder);
  526. }
  527. }
  528. // Remove files
  529. $files = array(
  530. // remove javascript files from admin (moved to site)
  531. $admin . '/media/js/colorpicker.js',
  532. $admin . '/media/js/help.js',
  533. $admin . '/media/js/html5.js',
  534. $admin . '/media/js/select.js',
  535. $admin . '/media/js/tips.js',
  536. // remove legend.js
  537. $admin . '/media/js/legend.js',
  538. // remove css files from admin (moved to site)
  539. $admin . '/media/css/help.css',
  540. $admin . '/media/css/select.css',
  541. $admin . '/media/css/tips.css',
  542. // remove legend model
  543. $admin . '/models/legend.php',
  544. // remove extension adapter
  545. $admin . '/adapters/extension.php',
  546. // remove error class from site (moved to admin)
  547. $site . '/editor/libraries/classes/error.php',
  548. // remove popup file
  549. $site . '/popup.php',
  550. // remove anchor from theme (moved to plugins)
  551. $site . '/editor/tiny_mce/themes/advanced/css/anchor.css',
  552. $site . '/editor/tiny_mce/themes/advanced/css/js/anchor.js',
  553. $site . '/editor/tiny_mce/themes/advanced/css/tmpl/anchor.php',
  554. // remove redundant file
  555. $site . '/editor/tiny_mce/themes/advanced/css/skins/default/img/items.gif',
  556. // remove search files from file browser (renamed to filter)
  557. $site . '/editor/extensions/browser/css/search.css',
  558. $site . '/editor/extensions/browser/js/search.js',
  559. $site . '/editor/extensions/browser/search.php',
  560. // remove dilg language file from theme (incorporated into main dlg file)
  561. $site . '/editor/tiny_mce/themes/advanced/langs/en_dlg.js',
  562. // remove old jquery UI
  563. $site . '/editor/libraries/jquery/js/jquery-ui-1.9.0.custom.min.js',
  564. // remove "theme" files
  565. $site . '/editor/libraries/classes/theme.php',
  566. $site . '/editor/tiny_mce/themes/advanced/theme.php',
  567. // remove system helper
  568. $admin . '/helpers/system.php',
  569. // remove tools helper
  570. $admin . '/helpers/tools.php',
  571. // old language files
  572. $site . '/language/en-GB/en-GB.com_jce_advlink.ini',
  573. $site . '/language/en-GB/en-GB.com_jce_browser.ini',
  574. $site . '/language/en-GB/en-GB.com_jce_imgmanager.ini',
  575. $site . '/language/en-GB/en-GB.com_jce_media.ini',
  576. $site . '/language/en-GB/en-GB.com_jce_paste.ini',
  577. $site . '/language/en-GB/en-GB.com_jce_spellchecker.ini',
  578. // remove redundant parameter.js
  579. $admin . '/media/js/parameter.js',
  580. // remove build.xml files
  581. $site . '/editor/extensions/filesystem/build.xml',
  582. $site . '/editor/extensions/links/build.xml',
  583. $site . '/editor/extensions/popups/build.xml',
  584. // remove legend.css
  585. $admin . '/media/css/legend.css'
  586. );
  587. foreach ($files as $file) {
  588. if (JFile::exists($file)) {
  589. @JFile::delete($file);
  590. }
  591. }
  592. // 2.1 - Add visualblocks plugin
  593. if (version_compare($version, '2.1', '<')) {
  594. $profiles = self::getProfiles();
  595. $profile = JTable::getInstance('Profiles', 'WFTable');
  596. if (!empty($profiles)) {
  597. foreach ($profiles as $item) {
  598. $profile->load($item->id);
  599. if (strpos($profile->rows, 'visualblocks') === false) {
  600. $profile->rows = str_replace('visualchars', 'visualchars,visualblocks', $profile->rows);
  601. }
  602. if (strpos($profile->plugins, 'visualblocks') === false) {
  603. $profile->plugins = str_replace('visualchars', 'visualchars,visualblocks', $profile->plugins);
  604. }
  605. $profile->store();
  606. }
  607. }
  608. }
  609. // 2.1.1 - Add anchor plugin
  610. if (version_compare($version, '2.1.1', '<')) {
  611. $profiles = self::getProfiles();
  612. $profile = JTable::getInstance('Profiles', 'WFTable');
  613. if (!empty($profiles)) {
  614. foreach ($profiles as $item) {
  615. $profile->load($item->id);
  616. // add anchor to end of plugins list
  617. if (strpos($profile->rows, 'anchor') !== false) {
  618. $profile->plugins .= ',anchor';
  619. }
  620. $profile->store();
  621. }
  622. }
  623. }
  624. // 2.2.1 - Add "Blogger" profile
  625. if (version_compare($version, '2.2.1', '<')) {
  626. self::installProfile('Blogger');
  627. }
  628. // 2.2.1 to 2.2.5 - Remove K2Links partial install
  629. if (version_compare($version, '2.2.1', '>') && version_compare($version, '2.2.5', '<')) {
  630. $path = $site . '/editor/extensions/links';
  631. if (is_file($path . '/k2links.php') && is_file($path . '/k2links.xml') && !is_dir($path . '/k2links')) {
  632. @JFile::delete($path . '/k2links.php');
  633. @JFile::delete($path . '/k2links.xml');
  634. }
  635. }
  636. // replace some profile row items
  637. if (version_compare($version, '2.2.8', '<')) {
  638. $profiles = self::getProfiles();
  639. $profile = JTable::getInstance('Profiles', 'WFTable');
  640. if (!empty($profiles)) {
  641. foreach ($profiles as $item) {
  642. $profile->load($item->id);
  643. $profile->rows = str_replace('paste', 'clipboard', $profile->rows);
  644. $profile->plugins = str_replace('paste', 'clipboard', $profile->plugins);
  645. $data = json_decode($profile->params, true);
  646. // swap paste data to 'clipboard'
  647. if ($data && array_key_exists('paste', $data)) {
  648. $params = array();
  649. // add 'paste_' prefix
  650. foreach ($data['paste'] as $k => $v) {
  651. $params['paste_' . $k] = $v;
  652. }
  653. // remove paste parameters
  654. unset($data['paste']);
  655. // assign new params to clipboard
  656. $data['clipboard'] = $params;
  657. }
  658. $profile->params = json_encode($data);
  659. $profile->store();
  660. }
  661. }
  662. }
  663. if (version_compare($version, '2.3.0beta', '<')) {
  664. // add Mobile profile
  665. self::installProfile('Mobile');
  666. }
  667. if (version_compare($version, '2.2.9', '<') || version_compare($version, '2.3.0beta3', '<')) {
  668. $profiles = self::getProfiles();
  669. $profile = JTable::getInstance('Profiles', 'WFTable');
  670. if (!empty($profiles)) {
  671. foreach ($profiles as $item) {
  672. $profile->load($item->id);
  673. $buttons = array('buttons' => array());
  674. if (strpos($profile->rows, 'numlist') !== false) {
  675. $buttons['buttons'][] = 'numlist';
  676. $profile->rows = str_replace('numlist', 'lists', $profile->rows);
  677. }
  678. if (strpos($profile->rows, 'bullist') !== false) {
  679. $buttons['buttons'][] = 'bullist';
  680. if (strpos($profile->rows, 'lists') === false) {
  681. $profile->rows = str_replace('bullist', 'lists', $profile->rows);
  682. }
  683. }
  684. // remove bullist and numlist
  685. $profile->rows = str_replace(array('bullist', 'numlist'), '', $profile->rows);
  686. // replace multiple commas with a single one
  687. $profile->rows = preg_replace('#,+#', ',', $profile->rows);
  688. // fix rows
  689. $profile->rows = str_replace(',;', ';', $profile->rows);
  690. if (!empty($buttons['buttons'])) {
  691. $profile->plugins .= ',lists';
  692. $data = json_decode($profile->params, true);
  693. $data['lists'] = $buttons;
  694. $profile->params = json_encode($data);
  695. $profile->store();
  696. }
  697. }
  698. }
  699. }
  700. // transfer charmap to a plugin
  701. if (version_compare($version, '2.3.2', '<')) {
  702. $profiles = self::getProfiles();
  703. $table = JTable::getInstance('Profiles', 'WFTable');
  704. if (!empty($profiles)) {
  705. foreach ($profiles as $item) {
  706. $table->load($item->id);
  707. if (strpos($table->rows, 'charmap') !== false) {
  708. $table->plugins .= ',charmap';
  709. $table->store();
  710. }
  711. }
  712. }
  713. }
  714. return true;
  715. }
  716. private static function getProfiles() {
  717. $db = JFactory::getDBO();
  718. $query = $db->getQuery();
  719. if (is_object($query)) {
  720. $query->select('id')->from('#__wf_profiles');
  721. } else {
  722. $query = 'SELECT id FROM #__wf_profiles';
  723. }
  724. $db->setQuery($query);
  725. return $db->loadObjectList();
  726. }
  727. private static function createProfilesTable() {
  728. include_once (dirname(__FILE__) . '/includes/base.php');
  729. include_once (dirname(__FILE__) . '/models/profiles.php');
  730. $profiles = new WFModelProfiles();
  731. if (method_exists($profiles, 'createProfilesTable')) {
  732. return $profiles->createProfilesTable();
  733. }
  734. return false;
  735. }
  736. private static function installProfiles() {
  737. include_once (dirname(__FILE__) . '/includes/base.php');
  738. include_once (dirname(__FILE__) . '/models/profiles.php');
  739. $profiles = new WFModelProfiles();
  740. if (method_exists($profiles, 'installProfiles')) {
  741. return $profiles->installProfiles();
  742. }
  743. return false;
  744. }
  745. /**
  746. * Install additional packages
  747. * @return Array or false
  748. * @param object $path[optional] Path to package folder
  749. */
  750. private static function installPackages($source) {
  751. jimport('joomla.installer.installer');
  752. $db = JFactory::getDBO();
  753. $result = '';
  754. JTable::addIncludePath(JPATH_LIBRARIES . '/joomla/database/table');
  755. $packages = array(
  756. 'editor' => array('jce'),
  757. 'quickicon' => array('jcefilebrowser'),
  758. 'module' => array('mod_jcefilebrowser')
  759. );
  760. foreach ($packages as $folder => $element) {
  761. // Joomla! 2.5
  762. if (defined('JPATH_PLATFORM')) {
  763. if ($folder == 'module') {
  764. continue;
  765. }
  766. // Joomla! 1.5
  767. } else {
  768. if ($folder == 'quickicon') {
  769. continue;
  770. }
  771. }
  772. $installer = new JInstaller();
  773. $installer->setOverwrite(true);
  774. if ($installer->install($source . '/' . $folder)) {
  775. if (method_exists($installer, 'loadLanguage')) {
  776. $installer->loadLanguage();
  777. }
  778. if ($installer->message) {
  779. $result .= '<li class="success">' . JText::_($installer->message, $installer->message) . '</li>';
  780. }
  781. // enable quickicon
  782. if ($folder == 'quickicon') {
  783. $plugin = JTable::getInstance('extension');
  784. foreach ($element as $item) {
  785. $id = $plugin->find(array('type' => 'plugin', 'folder' => $folder, 'element' => $item));
  786. $plugin->load($id);
  787. $plugin->publish();
  788. }
  789. }
  790. // enable module
  791. if ($folder == 'module') {
  792. $module = JTable::getInstance('module');
  793. $id = self::getModule('mod_jcefilebrowser');
  794. $module->load($id);
  795. $module->position = 'icon';
  796. $module->ordering = 100;
  797. $module->published = 1;
  798. $module->store();
  799. }
  800. // rename editor manifest
  801. if ($folder == 'editor') {
  802. $manifest = $installer->getPath('manifest');
  803. if (basename($manifest) == 'legacy.xml') {
  804. // rename legacy.xml to jce.xml
  805. JFile::move($installer->getPath('extension_root') . '/' . basename($manifest), $installer->getPath('extension_root') . '/jce.xml');
  806. }
  807. }
  808. // add index files
  809. if ($folder == 'editor' && !defined('JPATH_PLATFORM')) {
  810. self::addIndexfiles(array($installer->getPath('extension_root') . '/jce'));
  811. } else {
  812. self::addIndexfiles(array($installer->getPath('extension_root')));
  813. }
  814. } else {
  815. $result .= '<li class="error">' . JText::_($installer->message, $installer->message) . '</li>';
  816. }
  817. }
  818. return $result;
  819. }
  820. private static function getModule($name) {
  821. // Joomla! 2.5
  822. if (defined('JPATH_PLATFORM')) {
  823. $module = JTable::getInstance('extension');
  824. return $module->find(array('type' => 'module', 'element' => $name));
  825. // Joomla! 1.5
  826. } else {
  827. $db = JFactory::getDBO();
  828. $query = 'SELECT id FROM #__modules' . ' WHERE module = ' . $db->Quote($name);
  829. $db->setQuery($query);
  830. return $db->loadResult();
  831. }
  832. }
  833. private static function getPlugin($folder, $element) {
  834. // Joomla! 2.5
  835. if (defined('JPATH_PLATFORM')) {
  836. $plugin = JTable::getInstance('extension');
  837. return $plugin->find(array('type' => 'plugin', 'folder' => $folder, 'element' => $element));
  838. // Joomla! 1.5
  839. } else {
  840. $plugin = JTable::getInstance('plugin');
  841. $db = JFactory::getDBO();
  842. $query = 'SELECT id FROM #__plugins' . ' WHERE folder = ' . $db->Quote($folder) . ' AND element = ' . $db->Quote($element);
  843. $db->setQuery($query);
  844. return $db->loadResult();
  845. }
  846. }
  847. private static function addIndexfiles($paths) {
  848. jimport('joomla.filesystem.folder');
  849. jimport('joomla.filesystem.file');
  850. // get the base file
  851. $file = JPATH_ADMINISTRATOR . '/components/com_jce/index.html';
  852. if (is_file($file)) {
  853. foreach ((array) $paths as $path) {
  854. if (is_dir($path)) {
  855. // admin component
  856. $folders = JFolder::folders($path, '.', true, true);
  857. foreach ($folders as $folder) {
  858. JFile::copy($file, $folder . '/' . basename($file));
  859. }
  860. }
  861. }
  862. }
  863. }
  864. private static function legacyCleanup() {
  865. $db = JFactory::getDBO();
  866. $query = 'DROP TABLE IF EXISTS #__jce_groups';
  867. $db->setQuery($query);
  868. $db->query();
  869. $query = 'DROP TABLE IF EXISTS #__jce_plugins';
  870. $db->setQuery($query);
  871. $db->query();
  872. $query = 'DROP TABLE IF EXISTS #__jce_extensions';
  873. $db->setQuery($query);
  874. $db->query();
  875. }
  876. private static function checkTable($table) {
  877. $db = JFactory::getDBO();
  878. $tables = $db->getTableList();
  879. if (!empty($tables)) {
  880. // swap array values with keys, convert to lowercase and return array keys as values
  881. $tables = array_keys(array_change_key_case(array_flip($tables)));
  882. $app = JFactory::getApplication();
  883. $match = str_replace('#__', strtolower($app->getCfg('dbprefix', '')), $table);
  884. return in_array($match, $tables);
  885. }
  886. // try with query
  887. $query = $db->getQuery(true);
  888. if (is_object($query)) {
  889. $query->select('COUNT(id)')->from($table);
  890. } else {
  891. $query = 'SELECT COUNT(id) FROM ' . $table;
  892. }
  893. $db->setQuery($query);
  894. return $db->query();
  895. }
  896. /**
  897. * Check table contents
  898. * @return integer
  899. * @param string $table Table name
  900. */
  901. private static function checkTableContents($table) {
  902. $db = JFactory::getDBO();
  903. $query = $db->getQuery(true);
  904. if (is_object($query)) {
  905. $query->select('COUNT(id)')->from($table);
  906. } else {
  907. $query = 'SELECT COUNT(id) FROM ' . $table;
  908. }
  909. $db->setQuery($query);
  910. return $db->loadResult();
  911. }
  912. private static function checkTableColumn($table, $column) {
  913. $db = JFactory::getDBO();
  914. // use built in function
  915. if (method_exists($db, 'getTableColumns')) {
  916. $fields = $db->getTableColumns($table);
  917. } else {
  918. $db->setQuery('DESCRIBE ' . $table);
  919. if (method_exists($db, 'loadColumn')) {
  920. $fields = $db->loadColumn();
  921. } else {
  922. $fields = $db->loadResultArray();
  923. }
  924. // we need to check keys not values
  925. $fields = array_flip($fields);
  926. }
  927. return array_key_exists($column, $fields);
  928. }
  929. }
  930. ?>