예제 #1
0
 /**
  * Upgrade database tables and remove legacy folders
  * @return Boolean
  */
 private static function upgrade($version)
 {
     $app = JFactory::getApplication();
     $db = JFactory::getDBO();
     jimport('joomla.filesystem.folder');
     jimport('joomla.filesystem.file');
     $admin = JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jce';
     $site = JPATH_SITE . DS . 'components' . DS . 'com_jce';
     require_once $admin . DS . 'helpers' . DS . 'parameter.php';
     // add tables path
     JTable::addIncludePath($admin . DS . 'tables');
     // upgrade from 1.5.x to 2.0.0 (only in Joomla! 1.5)
     if (version_compare($version, '2.0.0', '<') && !defined('JPATH_PLATFORM')) {
         // check for groups table / data
         if (self::checkTable('#__jce_groups') && self::checkTableContents('#__jce_groups')) {
             jimport('joomla.plugin.helper');
             // get plugin
             $plugin = JPluginHelper::getPlugin('editors', 'jce');
             // get JCE component
             $table = JTable::getInstance('component');
             $table->loadByOption('com_jce');
             // process params to JSON string
             $params = WFParameterHelper::toObject($table->params);
             // set params
             $table->params = json_encode(array('editor' => $params));
             // store
             $table->store();
             // get all groups data
             $query = 'SELECT * FROM #__jce_groups';
             $db->setQuery($query);
             $groups = $db->loadObjectList();
             // get all plugin data
             $query = 'SELECT id, name, icon FROM #__jce_plugins';
             $db->setQuery($query);
             $plugins = $db->loadAssocList('id');
             $map = array('advlink' => 'link', 'advcode' => 'source', 'tablecontrols' => 'table', 'styleprops' => 'style');
             if (self::createProfilesTable()) {
                 foreach ($groups as $group) {
                     $row = JTable::getInstance('profiles', 'WFTable');
                     $rows = array();
                     // transfer row ids to names
                     foreach (explode(';', $group->rows) as $item) {
                         $icons = array();
                         foreach (explode(',', $item) as $id) {
                             // spacer
                             if ($id == '00') {
                                 $icon = 'spacer';
                             } else {
                                 if (isset($plugins[$id])) {
                                     $icon = $plugins[$id]['icon'];
                                     // map old icon names to new
                                     if (isset($map[$icon])) {
                                         $icon = $map[$icon];
                                     }
                                 }
                             }
                             $icons[] = $icon;
                         }
                         $rows[] = str_replace(array('cite,abbr,acronym,del,ins,attribs', 'search,replace', 'ltr,rtl', 'readmore,pagebreak', 'cut,copy,paste'), array('xhtmlxtras', 'searchreplace', 'directionality', 'article', 'paste'), implode(',', $icons));
                     }
                     // re-assign rows
                     $row->rows = implode(';', $rows);
                     $names = array('anchor');
                     // transfer plugin ids to names
                     foreach (explode(',', $group->plugins) as $id) {
                         if (isset($plugins[$id])) {
                             $name = $plugins[$id]['name'];
                             // map old icon names to new
                             if (isset($map[$name])) {
                                 $name = $map[$name];
                             }
                             $names[] = $name;
                         }
                     }
                     // re-assign plugins
                     $row->plugins = implode(',', $names);
                     // convert params to JSON
                     $params = WFParameterHelper::toObject($group->params);
                     $data = new StdClass();
                     foreach ($params as $key => $value) {
                         $parts = explode('_', $key);
                         $node = array_shift($parts);
                         // special consideration for imgmanager_ext!!
                         if (strpos($key, 'imgmanager_ext_') !== false) {
                             $node = $node . '_' . array_shift($parts);
                         }
                         // convert some nodes
                         if (isset($map[$node])) {
                             $node = $map[$node];
                         }
                         $key = implode('_', $parts);
                         if ($value !== '') {
                             if (!isset($data->{$node}) || !is_object($data->{$node})) {
                                 $data->{$node} = new StdClass();
                             }
                             // convert Link parameters
                             if ($node == 'link' && $key != 'target') {
                                 $sub = $key;
                                 $key = 'links';
                                 if (!isset($data->{$node}->{$key})) {
                                     $data->{$node}->{$key} = new StdClass();
                                 }
                                 if (preg_match('#^(content|contacts|static|weblinks|menu)$#', $sub)) {
                                     if (!isset($data->{$node}->{$key}->joomlalinks)) {
                                         $data->{$node}->{$key}->joomlalinks = new StdClass();
                                         $data->{$node}->{$key}->joomlalinks->enable = 1;
                                     }
                                     $data->{$node}->{$key}->joomlalinks->{$sub} = $value;
                                 } else {
                                     $data->{$node}->{$key}->{$sub} = new StdClass();
                                     $data->{$node}->{$key}->{$sub}->enable = 1;
                                 }
                             } else {
                                 $data->{$node}->{$key} = $value;
                             }
                         }
                     }
                     // re-assign params
                     $row->params = json_encode($data);
                     // re-assign other values
                     $row->name = $group->name;
                     $row->description = $group->description;
                     $row->users = $group->users;
                     $row->types = $group->types;
                     $row->components = $group->components;
                     $row->published = $group->published;
                     $row->ordering = $group->ordering;
                     // add area data
                     if ($row->name == 'Default') {
                         $row->area = 0;
                     }
                     if ($row->name == 'Front End') {
                         $row->area = 1;
                     }
                     if (self::checkTable('#__wf_profiles')) {
                         $name = $row->name;
                         // check for existing profile
                         $query = 'SELECT id FROM #__wf_profiles' . ' WHERE name = ' . $db->Quote($name);
                         $db->setQuery($query);
                         // create name copy if exists
                         while ($db->loadResult()) {
                             $name = JText::sprintf('WF_PROFILES_COPY_OF', $name);
                             $query = 'SELECT id FROM #__wf_profiles' . ' WHERE name = ' . $db->Quote($name);
                             $db->setQuery($query);
                         }
                         // set name
                         $row->name = $name;
                     }
                     if (!$row->store()) {
                         $app->enqueueMessage('Conversion of group data failed : ' . $row->name, 'error');
                     } else {
                         $app->enqueueMessage('Conversion of group data successful : ' . $row->name);
                     }
                     unset($row);
                 }
                 // Drop tables
                 $query = 'DROP TABLE IF EXISTS #__jce_groups';
                 $db->setQuery($query);
                 $db->query();
                 // If profiles table empty due to error, install profiles data
                 if (!self::checkTableContents('#__wf_profiles')) {
                     self::installProfiles();
                 }
             } else {
                 return false;
             }
             // Install profiles
         } else {
             self::installProfiles();
         }
         // Drop tables
         $query = 'DROP TABLE IF EXISTS #__jce_plugins';
         $db->setQuery($query);
         $db->query();
         // Drop tables
         $query = 'DROP TABLE IF EXISTS #__jce_extensions';
         $db->setQuery($query);
         $db->query();
         // Remove Plugins menu item
         $query = 'DELETE FROM #__components' . ' WHERE admin_menu_link = ' . $db->Quote('option=com_jce&type=plugins');
         $db->setQuery($query);
         $db->query();
         // Update Component Name
         $query = 'UPDATE #__components' . ' SET name = ' . $db->Quote('COM_JCE') . ' WHERE ' . $db->Quote('option') . '=' . $db->Quote('com_jce') . ' AND parent = 0';
         $db->setQuery($query);
         $db->query();
         // Fix links for other views and edit names
         $menus = array('install' => 'installer', 'group' => 'profiles', 'groups' => 'profiles', 'config' => 'config');
         $row = JTable::getInstance('component');
         foreach ($menus as $k => $v) {
             $query = 'SELECT id FROM #__components' . ' WHERE admin_menu_link = ' . $db->Quote('option=com_jce&type=' . $k);
             $db->setQuery($query);
             $id = $db->loadObject();
             if ($id) {
                 $row->load($id);
                 $row->name = $v;
                 $row->admin_menu_link = 'option=com_jce&view=' . $v;
                 if (!$row->store()) {
                     $mainframe->enqueueMessage('Unable to update Component Links for view : ' . strtoupper($v), 'error');
                 }
             }
         }
         // remove old admin language files
         $folders = JFolder::folders(JPATH_ADMINISTRATOR . DS . 'language', '.', false, true, array('.svn', 'CVS', 'en-GB'));
         foreach ($folders as $folder) {
             $name = basename($folder);
             $files = array($name . '.com_jce.ini', $name . '.com_jce.menu.ini', $name . '.com_jce.xml');
             foreach ($files as $file) {
                 if (is_file($folder . DS . $file)) {
                     @JFile::delete($folder . DS . $file);
                 }
             }
         }
         // remove old site language files
         $folders = JFolder::folders(JPATH_SITE . DS . 'language', '.', false, true, array('.svn', 'CVS', 'en-GB'));
         foreach ($folders as $folder) {
             $files = JFolder::files($folder, '^' . basename($folder) . '\\.com_jce([_a-z0-9]+)?\\.(ini|xml)$', false, true);
             @JFile::delete($files);
         }
         // remove legacy admin folders
         $folders = array('cpanel', 'config', 'css', 'groups', 'plugins', 'img', 'installer', 'js');
         foreach ($folders as $folder) {
             if (is_dir($admin . DS . $folder)) {
                 @JFolder::delete($admin . DS . $folder);
             }
         }
         // remove legacy admin files
         $files = array('editor.php', 'helper.php', 'updater.php');
         foreach ($files as $file) {
             if (is_file($admin . DS . $file)) {
                 @JFile::delete($admin . DS . $file);
             }
         }
         // remove legacy admin folders
         $folders = array('controller', 'css', 'js');
         foreach ($folders as $folder) {
             if (is_dir($site . DS . $folder)) {
                 @JFolder::delete($site . DS . $folder);
             }
         }
         // remove legacy admin files
         $files = array('popup.php');
         foreach ($files as $file) {
             if (is_file($site . DS . $file)) {
                 @JFile::delete($site . DS . $file);
             }
         }
         if (!defined('JPATH_PLATFORM')) {
             // remove old plugin folder
             $path = JPATH_PLUGINS . DS . 'editors';
             if (is_dir($path . DS . 'jce')) {
                 @JFolder::delete($path . DS . 'jce');
             }
         }
         return true;
     }
     // end JCE 1.5 upgrade
     // cleanup javascript and css files moved to site
     if (version_compare($version, '2.0.10', '<')) {
         $path = $admin . DS . 'media';
         $scripts = array('colorpicker.js', 'help.js', 'html5.js', 'select.js', 'tips.js');
         foreach ($scripts as $script) {
             if (is_file($path . DS . 'js' . DS . $script)) {
                 @JFile::delete($path . DS . 'js' . DS . $script);
             }
         }
         if (is_dir($path . DS . 'js' . DS . 'jquery')) {
             @JFolder::delete($path . DS . 'js' . DS . 'jquery');
         }
         $styles = array('help.css', 'select.css', 'tips.css');
         foreach ($styles as $style) {
             if (is_file($path . DS . 'css' . DS . $style)) {
                 @JFile::delete($path . DS . 'css' . DS . $style);
             }
         }
         // delete jquery
         if (is_dir($path . DS . 'css' . DS . 'jquery')) {
             @JFolder::delete($path . DS . 'css' . DS . 'jquery');
         }
         // remove popup controller
         if (is_dir($site . DS . 'controller')) {
             @JFolder::delete($site . DS . 'controller');
         }
     }
     // delete error.php file
     if (version_compare($version, '2.0.12', '<')) {
         if (is_file($site . DS . 'editor' . DS . 'libraries' . DS . 'classes' . DS . 'error.php')) {
             @JFile::delete($site . DS . 'editor' . DS . 'libraries' . DS . 'classes' . DS . 'error.php');
         }
     }
     // remove old jQuery and jQuery UI versions
     if (version_compare($version, '2.0.20', '<')) {
         $path = $site . DS . 'editor' . DS . 'libraries' . DS . 'js' . DS . 'jquery';
         $files = array('jquery-1.7.1.min.js', 'jquery-ui-1.8.17.custom.min.js', 'jquery-ui-layout.js');
         foreach ($files as $file) {
             if (is_file($path . DS . $file)) {
                 @JFile::delete($path . DS . $file);
             }
         }
     }
     if (version_compare($version, '2.1', '<')) {
         if (is_dir($admin . DS . 'plugin')) {
             @JFolder::delete($admin . DS . 'plugin');
         }
         // Add Visualblocks plugin
         $query = 'SELECT id FROM #__wf_profiles';
         $db->setQuery($query);
         $profiles = $db->loadObjectList();
         $profile = JTable::getInstance('Profiles', 'WFTable');
         if (!empty($profiles)) {
             foreach ($profiles as $item) {
                 $profile->load($item->id);
                 if (strpos($profile->rows, 'visualblocks') === false) {
                     $profile->rows = str_replace('visualchars', 'visualchars,visualblocks', $profile->rows);
                 }
                 if (strpos($profile->plugins, 'visualblocks') === false) {
                     $profile->plugins = str_replace('visualchars', 'visualchars,visualblocks', $profile->plugins);
                 }
                 $profile->store();
             }
         }
     }
     if (version_compare($version, '2.1.1', '<')) {
         @JFile::delete($admin . DS . 'classes' . DS . 'installer.php');
         // Add Visualblocks plugin
         $query = 'SELECT id FROM #__wf_profiles';
         $db->setQuery($query);
         $profiles = $db->loadObjectList();
         $profile = JTable::getInstance('Profiles', 'WFTable');
         if (!empty($profiles)) {
             foreach ($profiles as $item) {
                 $profile->load($item->id);
                 // add anchor to end of plugins list
                 if (strpos($profile->rows, 'anchor') !== false) {
                     $profile->plugins .= ',anchor';
                 }
                 $profile->store();
             }
         }
         // delete old anchor stuff
         $theme = $site . DS . 'editor' . DS . 'tiny_mce' . DS . 'themes' . DS . 'advanced';
         foreach (array('css/anchor.css', 'js/anchor.js', 'tmpl/anchor.php', 'skins/default/img/items.gif') as $item) {
             if (JFile::exists($theme . DS . $item)) {
                 @JFile::delete($theme . DS . $item);
             }
         }
         // delete popup.php
         if (is_file($site . DS . 'popup.php')) {
             @JFile::delete($site . DS . 'popup.php');
         }
     }
     return true;
 }
예제 #2
0
 function save()
 {
     // Check for request forgeries
     JRequest::checkToken() or die('RESTRICTED');
     $db = JFactory::getDBO();
     $row = JTable::getInstance('profiles', 'WFTable');
     $task = $this->getTask();
     // get components
     $components = JRequest::getVar('components', array(), 'post', 'array');
     // get usertypes
     $types = JRequest::getVar('types', array(), 'post', 'array');
     // get users
     $users = JRequest::getVar('users', array(), 'post', 'array');
     if (!$row->bind(JRequest::get('post'))) {
         JError::raiseError(500, $row->getError());
     }
     $row->types = implode(',', $types);
     $row->components = implode(',', $components);
     $row->users = implode(',', $users);
     $data = new StdClass();
     // get params array
     $params = JRequest::getVar('params', array(), 'POST', 'array');
     if (isset($params['editor'])) {
         $data->editor = WFParameterHelper::toObject($params['editor']);
     }
     $plugins = explode(',', $row->plugins);
     foreach ($plugins as $plugin) {
         // add plugin params to array
         if (isset($params[$plugin])) {
             $data->{$plugin} = WFParameterHelper::toObject($params[$plugin]);
         }
     }
     $row->params = json_encode($data);
     if (!$row->check()) {
         JError::raiseError(500, $row->getError());
     }
     if (!$row->store()) {
         JError::raiseError(500, $row->getError());
     }
     $row->checkin();
     switch ($task) {
         case 'apply':
             $msg = JText::sprintf('WF_PROFILES_SAVED_CHANGES', $row->name);
             $this->setRedirect('index.php?option=com_jce&view=profiles&task=edit&cid[]=' . $row->id, $msg);
             break;
         case 'save':
         default:
             $msg = JText::sprintf('WF_PROFILES_SAVED', $row->name);
             $this->setRedirect('index.php?option=com_jce&view=profiles', $msg);
             break;
     }
 }
예제 #3
0
 /**
  * Upgrade database tables and remove legacy folders
  * @return Boolean
  */
 function upgrade($version)
 {
     $mainframe = JFactory::getApplication();
     $db = JFactory::getDBO();
     wfimport('admin.helpers.parameter');
     wfimport('admin.helpers.xml');
     $base = dirname(dirname(__FILE__));
     // cleanup javascript and css files moved to site
     if (version_compare($version, '2.0.10', '<')) {
         $path = dirname(dirname(__FILE__)) . DS . 'media';
         $scripts = array('colorpicker.js', 'help.js', 'html5.js', 'select.js', 'tips.js');
         foreach ($scripts as $script) {
             if (is_file($path . DS . 'js' . DS . $script)) {
                 @JFile::delete($path . DS . 'js' . DS . $script);
             }
         }
         if (is_dir($path . DS . 'js' . DS . 'jquery')) {
             @JFolder::delete($path . DS . 'js' . DS . 'jquery');
         }
         $styles = array('help.css', 'select.css', 'tips.css');
         foreach ($styles as $style) {
             if (is_file($path . DS . 'css' . DS . $style)) {
                 @JFile::delete($path . DS . 'css' . DS . $style);
             }
         }
         // delete jquery
         if (is_dir($path . DS . 'css' . DS . 'jquery')) {
             @JFolder::delete($path . DS . 'css' . DS . 'jquery');
         }
         // remove popup controller
         if (is_dir(JPATH_SITE . DS . 'components' . DS . 'com_jce' . DS . 'controller')) {
             @JFolder::delete(JPATH_SITE . DS . 'components' . DS . 'com_jce' . DS . 'controller');
         }
     }
     if (version_compare($version, '2.0.0beta2', '<')) {
         if ($this->checkTable('#__jce_profiles')) {
             // get all groups data
             $query = 'SELECT * FROM #__jce_profiles';
             $db->setQuery($query);
             $profiles = $db->loadObjectList();
             if ($this->createProfilesTable()) {
                 $row = JTable::getInstance('profiles', 'WFTable');
                 foreach ($profiles as $profile) {
                     $row->bind($profile);
                     $row->store();
                 }
             }
             // Drop tables
             $query = 'DROP TABLE IF EXISTS #__jce_profiles';
             $db->setQuery($query);
             $db->query();
         }
     }
     // upgrade from 1.5.x to 2.0.0 (only in Joomla! 1.5)
     if (version_compare($version, '2.0.0', '<') && WF_JOOMLA15) {
         // check for groups table / data
         if ($this->checkTable('#__jce_groups') && $this->checkTableContents('#__jce_groups')) {
             // get plugin
             $plugin = JPluginHelper::getPlugin('editors', 'jce');
             // get JCE component
             $table = JTable::getInstance('component');
             $table->loadByOption('com_jce');
             // process params to JSON string
             $params = WFParameterHelper::toObject($table->params);
             // set params
             $table->params = json_encode(array('editor' => $params));
             // store
             $table->store();
             // get all groups data
             $query = 'SELECT * FROM #__jce_groups';
             $db->setQuery($query);
             $groups = $db->loadObjectList();
             // get all plugin data
             $query = 'SELECT id, name, icon FROM #__jce_plugins';
             $db->setQuery($query);
             $plugins = $db->loadAssocList('id');
             if ($this->createProfilesTable()) {
                 foreach ($groups as $group) {
                     $row = JTable::getInstance('profiles', 'WFTable');
                     // transfer row ids to names
                     foreach (explode(';', $group->rows) as $item) {
                         $icons = array();
                         foreach (explode(',', $item) as $id) {
                             // spacer
                             if ($id == '00') {
                                 $icons[] = 'spacer';
                             } else {
                                 if (isset($plugins[$id])) {
                                     $icons[] = $plugins[$id]['icon'];
                                 }
                             }
                         }
                         $rows[] = implode(',', $icons);
                     }
                     $group->rows = implode(';', $rows);
                     $names = array();
                     // transfer plugin ids to names
                     foreach (explode(',', $group->plugins) as $id) {
                         if (isset($plugins[$id])) {
                             $items[] = $plugins[$id]['name'];
                         }
                     }
                     $group->plugins = implode(',', $names);
                     // convert params to JSON
                     $params = WFParameterHelper::toObject($group->params);
                     $data = new StdClass();
                     foreach ($params as $key => $value) {
                         $parts = explode('_', $key);
                         $node = array_shift($parts);
                         // special consideration for imgmanager_ext!!
                         if (strpos($key, 'imgmanager_ext_') !== false) {
                             $node = $node . '_' . array_shift($parts);
                         }
                         // convert some keys
                         if ($key == 'advlink') {
                             $key = 'link';
                         }
                         $key = implode('_', $parts);
                         if ($value !== '') {
                             if (isset($data->{$node}) && is_object($data->{$node})) {
                                 $data->{$node}->{$key} = $value;
                             } else {
                                 $data->{$node} = new StdClass();
                                 $data->{$node}->{$key} = $value;
                             }
                         }
                     }
                     $group->params = json_encode($data);
                     // bind data
                     $row->bind($group);
                     // add area data
                     if ($row->name == 'Default') {
                         $row->area = 0;
                     }
                     if ($row->name == 'Front End') {
                         $row->area = 1;
                     }
                     if (!$row->store()) {
                         $mainframe->enqueueMessage('Conversion of group data failed : ' . $row->name, 'error');
                     }
                 }
                 // Drop tables
                 $query = 'DROP TABLE IF EXISTS #__jce_groups';
                 $db->setQuery($query);
                 $db->query();
                 // If profiles table empty due to error, install profiles data
                 if (!$this->checkTableContents('#__wf_profiles')) {
                     $this->installProfiles(true);
                 }
             } else {
                 return false;
             }
             // Install profiles
         } else {
             $this->installProfiles(true);
         }
         // Drop tables
         $query = 'DROP TABLE IF EXISTS #__jce_plugins';
         $db->setQuery($query);
         $db->query();
         // Drop tables
         $query = 'DROP TABLE IF EXISTS #__jce_extensions';
         $db->setQuery($query);
         $db->query();
         // Remove Plugins menu item
         $query = 'DELETE FROM #__components' . ' WHERE admin_menu_link = ' . $db->Quote('option=com_jce&type=plugins');
         $db->setQuery($query);
         $db->query();
         // Update Component Name
         $query = 'UPDATE #__components' . ' SET name = ' . $db->Quote('COM_JCE') . ' WHERE ' . $db->Quote('option') . '=' . $db->Quote('com_jce') . ' AND parent = 0';
         $db->setQuery($query);
         $db->query();
         // Fix links for other views and edit names
         $menus = array('install' => 'installer', 'group' => 'profiles', 'groups' => 'profiles', 'config' => 'config');
         $row = JTable::getInstance('component');
         foreach ($menus as $k => $v) {
             $query = 'SELECT id FROM #__components' . ' WHERE admin_menu_link = ' . $db->Quote('option=com_jce&type=' . $k);
             $db->setQuery($query);
             $id = $db->loadObject();
             if ($id) {
                 $row->load($id);
                 $row->name = $v;
                 $row->admin_menu_link = 'option=com_jce&view=' . $v;
                 if (!$row->store()) {
                     $mainframe->enqueueMessage('Unable to update Component Links for view : ' . strtoupper($v), 'error');
                 }
             }
         }
         $folders = JFolder::folders(JPATH_ADMINISTRATOR . DS . 'language', '.', false, true, array('.svn', 'CVS', 'en-GB'));
         // remove old admin language files
         foreach ($folders as $folder) {
             $name = basename($folder);
             $files = array($name . '.com_jce.ini', $name . '.com_jce.menu.ini', $name . '.com_jce.xml');
             foreach ($files as $file) {
                 if (is_file($folder . DS . $file)) {
                     @JFile::delete($folder . DS . $file);
                 }
             }
         }
         $folders = JFolder::folders(JPATH_SITE . DS . 'language', '.', false, true, array('.svn', 'CVS', 'en-GB'));
         // remove old site language files
         foreach ($folders as $folder) {
             $files = JFolder::files($folder, '^' . basename($folder) . '\\.com_jce([_a-z0-9]+)?\\.(ini|xml)$', false, true);
             @JFile::delete($files);
         }
     }
     // end JCE 1.5 upgrade
     return true;
 }