📄 component.php
字号:
// Now lets load the uninstall file if there is one and execute the uninstall function if it exists.
$uninstallfileElement =& $this->manifest->getElementByPath('uninstallfile');
if (is_a($uninstallfileElement, 'JSimpleXMLElement')) {
// Element exists, does the file exist?
if (is_file($this->parent->getPath('extension_administrator').DS.$uninstallfileElement->data())) {
ob_start();
ob_implicit_flush(false);
require_once ($this->parent->getPath('extension_administrator').DS.$uninstallfileElement->data());
if (function_exists('com_uninstall')) {
if (com_uninstall() === false) {
JError::raiseWarning(100, 'Component Uninstall: '.JText::_('Custom Uninstall script unsuccessful'));
$retval = false;
}
}
$msg = ob_get_contents();
ob_end_clean();
if ($msg != '') {
$this->parent->set('extension.message', $msg);
}
}
}
/**
* ---------------------------------------------------------------------------------------------
* Database Processing Section
* ---------------------------------------------------------------------------------------------
*/
/*
* Let's run the uninstall queries for the component
* If backward compatibility is required - run queries in xml file
* If Joomla 1.5 compatible, with discreet sql files - execute appropriate
* file for utf-8 support or non-utf support
*/
$result = $this->parent->parseQueries($this->manifest->getElementByPath('uninstall/queries'));
if ($result === false) {
// Install failed, rollback changes
JError::raiseWarning(100, 'Component Uninstall: '.JText::_('SQL Error')." ".$db->stderr(true));
$retval = false;
} elseif ($result === 0) {
// no backward compatibility queries found - try for Joomla 1.5 type queries
// second argument is the utf compatible version attribute
$utfresult = $this->parent->parseSQLFiles($this->manifest->getElementByPath('uninstall/sql'));
if ($utfresult === false) {
// Install failed, rollback changes
JError::raiseWarning(100, 'Component Uninstall: '.JText::_('SQLERRORORFILE')." ".$db->stderr(true));
$retval = false;
}
}
$this->_removeAdminMenus($row);
/**
* ---------------------------------------------------------------------------------------------
* Filesystem Processing Section
* ---------------------------------------------------------------------------------------------
*/
// Let's remove language files and media in the JROOT/images/ folder that are
// associated with the component we are uninstalling
$this->parent->removeFiles($this->manifest->getElementByPath('media'));
$this->parent->removeFiles($this->manifest->getElementByPath('media'), 1);
$this->parent->removeFiles($this->manifest->getElementByPath('languages'));
$this->parent->removeFiles($this->manifest->getElementByPath('administration/languages'), 1);
// Now we need to delete the installation directories. This is the final step in uninstalling the component.
if (trim($row->option)) {
// Delete the component site directory
if (is_dir($this->parent->getPath('extension_site'))) {
if (!JFolder::delete($this->parent->getPath('extension_site'))) {
JError::raiseWarning(100, 'Component Uninstall: '.JText::_('Unable to remove the component site directory'));
$retval = false;
}
}
// Delete the component admin directory
if (is_dir($this->parent->getPath('extension_administrator'))) {
if (!JFolder::delete($this->parent->getPath('extension_administrator'))) {
JError::raiseWarning(100, 'Component Uninstall: '.JText::_('Unable to remove the component admin directory'));
$retval = false;
}
}
return $retval;
} else {
// No component option defined... cannot delete what we don't know about
JError::raiseWarning(100, 'Component Uninstall: Option field empty, cannot remove files');
return false;
}
}
/**
* Method to build menu database entries for a component
*
* @access private
* @return boolean True if successful
* @since 1.5
*/
function _buildAdminMenus()
{
// Get database connector object
$db =& $this->parent->getDBO();
// Initialize variables
$option = strtolower("com_".str_replace(" ", "", $this->get('name')));
// If a component exists with this option in the table than we don't need to add menus
$query = 'SELECT id' .
' FROM #__components' .
' WHERE `option` = '.$db->Quote($option);
$db->setQuery($query);
$exists = $db->loadResult();
// Check if menu items exist
if ($exists) {
// Don't do anything if overwrite has not been enabled
if ( ! $this->parent->getOverwrite() ) {
return true;
}
// Remove existing menu items if overwrite has been enabled
if ( $option ) {
$sql = 'DELETE FROM #__components WHERE `option` = '.$db->Quote($option);
$db->setQuery($sql);
if (!$db->query()) {
JError::raiseWarning(100, 'Component Install: '.$db->stderr(true));
}
}
}
// Ok, now its time to handle the menus. Start with the component root menu, then handle submenus.
$menuElement = & $this->adminElement->getElementByPath('menu');
if (is_a($menuElement, 'JSimpleXMLElement')) {
$db_name = $menuElement->data();
$db_link = "option=".$option;
$db_menuid = 0;
$db_parent = 0;
$db_admin_menu_link = "option=".$option;
$db_admin_menu_alt = $menuElement->data();
$db_option = $option;
$db_ordering = 0;
$db_admin_menu_img = ($menuElement->attributes('img')) ? $menuElement->attributes('img') : 'js/ThemeOffice/component.png';
$db_iscore = 0;
$db_params = $this->parent->getParams();
$db_enabled = 1;
$query = 'INSERT INTO #__components' .
' VALUES( "", '.$db->Quote($db_name).', '.$db->Quote($db_link).', '.(int) $db_menuid.',' .
' '.(int) $db_parent.', '.$db->Quote($db_admin_menu_link).', '.$db->Quote($db_admin_menu_alt).',' .
' '.$db->Quote($db_option).', '.(int) $db_ordering.', '.$db->Quote($db_admin_menu_img).',' .
' '.(int) $db_iscore.', '.$db->Quote($db_params).', '.(int) $db_enabled.' )';
$db->setQuery($query);
if (!$db->query()) {
// Install failed, rollback changes
$this->parent->abort('Component Install: '.$db->stderr(true));
return false;
}
$menuid = $db->insertid();
/*
* Since we have created a menu item, we add it to the installation step stack
* so that if we have to rollback the changes we can undo it.
*/
$this->parent->pushStep(array ('type' => 'menu', 'id' => $menuid));
} else {
/*
* No menu element was specified so lets first see if we have an admin menu entry for this component
* if we do.. then we obviously don't want to create one -- we'll just attach sub menus to that one.
*/
$query = 'SELECT id' .
' FROM #__components' .
' WHERE `option` = '.$db->Quote($option) .
' AND parent = 0';
$db->setQuery($query);
$menuid = $db->loadResult();
if (!$menuid) {
// No menu entry, lets just enter a component entry to the table.
$db_name = $this->get('name');
$db_link = "";
$db_menuid = 0;
$db_parent = 0;
$db_admin_menu_link = "";
$db_admin_menu_alt = $this->get('name');
$db_option = $option;
$db_ordering = 0;
$db_admin_menu_img = "";
$db_iscore = 0;
$db_params = $this->parent->getParams();
$db_enabled = 1;
$query = 'INSERT INTO #__components' .
' VALUES( "", '.$db->Quote($db_name).', '.$db->Quote($db_link).', '.(int) $db_menuid.',' .
' '.(int) $db_parent.', '.$db->Quote($db_admin_menu_link).', '.$db->Quote($db_admin_menu_alt).',' .
' '.$db->Quote($db_option).', '.(int) $db_ordering.', '.$db->Quote($db_admin_menu_img).',' .
' '.(int) $db_iscore.', '.$db->Quote($db_params).', '.(int) $db_enabled.' )';
$db->setQuery($query);
if (!$db->query()) {
// Install failed, rollback changes
$this->parent->abort('Component Install: '.$db->stderr(true));
return false;
}
$menuid = $db->insertid();
/*
* Since we have created a menu item, we add it to the installation step stack
* so that if we have to rollback the changes we can undo it.
*/
$this->parent->pushStep(array ('type' => 'menu', 'id' => $menuid));
}
}
/*
* Process SubMenus
*/
// Initialize submenu ordering value
$ordering = 0;
$submenu = $this->adminElement->getElementByPath('submenu');
if (!is_a($submenu, 'JSimpleXMLElement') || !count($submenu->children())) {
return true;
}
foreach ($submenu->children() as $child)
{
if (is_a($child, 'JSimpleXMLElement') && $child->name() == 'menu') {
$com =& JTable::getInstance('component');
$com->name = $child->data();
$com->link = '';
$com->menuid = 0;
$com->parent = $menuid;
$com->iscore = 0;
$com->admin_menu_alt = $child->data();
$com->option = $option;
$com->ordering = $ordering ++;
// Set the sub menu link
if ($child->attributes("link")) {
$com->admin_menu_link = str_replace('&', '&', $child->attributes("link"));
} else {
$request = array();
if ($child->attributes('act')) {
$request[] = 'act='.$child->attributes('act');
}
if ($child->attributes('task')) {
$request[] = 'task='.$child->attributes('task');
}
if ($child->attributes('controller')) {
$request[] = 'controller='.$child->attributes('controller');
}
if ($child->attributes('view')) {
$request[] = 'view='.$child->attributes('view');
}
if ($child->attributes('layout')) {
$request[] = 'layout='.$child->attributes('layout');
}
if ($child->attributes('sub')) {
$request[] = 'sub='.$child->attributes('sub');
}
$qstring = (count($request)) ? '&'.implode('&',$request) : '';
$com->admin_menu_link = "option=".$option.$qstring;
}
// Set the sub menu image
if ($child->attributes("img")) {
$com->admin_menu_img = $child->attributes("img");
} else {
$com->admin_menu_img = "js/ThemeOffice/component.png";
}
// Store the submenu
if (!$com->store()) {
// Install failed, rollback changes
$this->parent->abort('Component Install: '.JText::_('SQL Error')." ".$db->stderr(true));
return false;
}
/*
* Since we have created a menu item, we add it to the installation step stack
* so that if we have to rollback the changes we can undo it.
*/
$this->parent->pushStep(array ('type' => 'menu', 'id' => $com->id));
}
}
}
/**
* Method to remove admin menu references to a component
*
* @access private
* @param object $component Component table object
* @return boolean True if successful
* @since 1.5
*/
function _removeAdminMenus(&$row)
{
// Get database connector object
$db =& $this->parent->getDBO();
$retval = true;
// Delete the submenu items
$sql = 'DELETE ' .
' FROM #__components ' .
'WHERE parent = '.(int)$row->id;
$db->setQuery($sql);
if (!$db->query()) {
JError::raiseWarning(100, 'Component Uninstall: '.$db->stderr(true));
$retval = false;
}
// Next, we will delete the component object
if (!$row->delete($row->id)) {
JError::raiseWarning(100, 'Component Uninstall: '.JText::_('Unable to delete the component from the database'));
$retval = false;
}
return $retval;
}
/**
* Custom rollback method
* - Roll back the component menu item
*
* @access public
* @param array $arg Installation step to rollback
* @return boolean True on success
* @since 1.5
*/
function _rollback_menu($arg)
{
// Get database connector object
$db =& $this->parent->getDBO;
// Remove the entry from the #__components table
$query = 'DELETE ' .
' FROM `#__components` ' .
' WHERE id='.(int)$arg['id'];
$db->setQuery($query);
return ($db->query() !== false);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -