Esempio n. 1
0
function installExtension($name, $title, $type = 'component', $extra = array(), $reinstall = 0)
{
    $mainframe =& JFactory::getApplication();
    // Create database object
    $db =& JFactory::getDBO();
    $installed = 0;
    if (JV15) {
        if (function_exists('beforeInstall_15')) {
            beforeInstall_15($db);
        } else {
            if (function_exists('beforeInstall')) {
                beforeInstall($db);
            }
        }
        switch ($type) {
            case 'component':
                if ($reinstall) {
                    $query = 'DELETE FROM `#__components`' . ' WHERE `option` = ' . $db->quote('com_' . $name);
                    $db->setQuery($query);
                    $db->query();
                    $installed = 0;
                } else {
                    $query = 'SELECT id FROM `#__components`' . ' WHERE `option` = ' . $db->quote('com_' . $name) . ' LIMIT 1';
                    $db->setQuery($query);
                    $installed = $db->loadResult();
                }
                if (!$installed) {
                    $query = 'ALTER TABLE `#__components`' . ' AUTO_INCREMENT = 1';
                    $db->setQuery($query);
                    $db->query();
                    $row =& JTable::getInstance('component');
                    $row->name = $title;
                    $row->admin_menu_alt = $title;
                    $row->option = 'com_' . $name;
                    $row->link = 'option=com_' . $name;
                    $row->admin_menu_link = 'option=com_' . $name;
                    foreach ($extra as $key => $val) {
                        $row->{$key} = $val;
                    }
                    if (!$row->store()) {
                        $mainframe->enqueueMessage($row->getError(), 'error');
                        return;
                    }
                }
                break;
            case 'plugin':
                // Clean up possible garbage first
                $query = 'DELETE FROM `#__plugins`' . ' WHERE `element` = ' . $db->quote($name) . ' AND `folder` = \'\'';
                $db->setQuery($query);
                $db->query();
                $folder = $extra['folder'];
                if ($reinstall) {
                    $query = 'DELETE FROM `#__plugins`' . ' WHERE `element` = ' . $db->quote($name) . ' AND `folder` = ' . $db->quote($folder);
                    $db->setQuery($query);
                    $db->query();
                    $installed = 0;
                } else {
                    $query = 'SELECT id FROM `#__plugins`' . ' WHERE `element` = ' . $db->quote($name) . ' AND `folder` = ' . $db->quote($folder) . ' LIMIT 1';
                    $db->setQuery($query);
                    $installed = $db->loadResult();
                }
                if (!$installed) {
                    $query = 'ALTER TABLE `#__plugins`' . ' AUTO_INCREMENT = 1';
                    $db->setQuery($query);
                    $db->query();
                    $row =& JTable::getInstance('plugin');
                    $row->name = $title;
                    $row->element = $name;
                    $row->published = 1;
                    foreach ($extra as $key => $val) {
                        $row->{$key} = $val;
                    }
                    if (!$row->store()) {
                        $mainframe->enqueueMessage($row->getError(), 'error');
                        return;
                    }
                }
                break;
            case 'module':
                if ($reinstall) {
                    $query = 'DELETE FROM `#__modules`' . ' WHERE `module` = ' . $db->quote('mod_' . $name);
                    $db->setQuery($query);
                    $db->query();
                    $installed = 0;
                } else {
                    $query = 'SELECT id FROM `#__modules`' . ' WHERE `module` = ' . $db->quote('mod_' . $name) . ' LIMIT 1';
                    $db->setQuery($query);
                    $installed = $db->loadResult();
                }
                if (!$installed) {
                    $query = 'ALTER TABLE `#__modules`' . ' AUTO_INCREMENT = 1';
                    $db->setQuery($query);
                    $db->query();
                    $row =& JTable::getInstance('module');
                    $row->title = $title;
                    $row->module = 'mod_' . $name;
                    $row->ordering = $row->getNextOrder("position='left'");
                    $row->position = 'left';
                    $row->showtitle = 1;
                    foreach ($extra as $key => $val) {
                        $row->{$key} = $val;
                    }
                    if (!$row->store()) {
                        $mainframe->enqueueMessage($row->getError(), 'error');
                        return;
                    }
                    // Clean up possible garbage first
                    $query = 'DELETE FROM `#__modules_menu` WHERE `moduleid` = ' . (int) $row->id;
                    $db->setQuery($query);
                    $db->query();
                    // Time to create a menu entry for the module
                    $query = 'INSERT INTO `#__modules_menu` VALUES ( ' . (int) $row->id . ', 0 )';
                    $db->setQuery($query);
                    $db->query();
                }
                break;
        }
        if (function_exists('afterInstall_15')) {
            afterInstall_15($db);
        } else {
            if (function_exists('afterInstall')) {
                afterInstall($db);
            }
        }
    } else {
        if (function_exists('beforeInstall_16')) {
            beforeInstall_16($db);
        } else {
            if (function_exists('beforeInstall')) {
                beforeInstall($db);
            }
        }
        $where = array();
        $where[] = '`type` = ' . $db->quote($type);
        $element = $name;
        $folder = '';
        switch ($type) {
            case 'component':
                $element = 'com_' . $element;
                break;
            case 'plugin':
                $folder = isset($extra['folder']) ? $extra['folder'] : 'system';
                unset($extra['folder']);
                $where[] = '`folder` = ' . $db->quote($folder);
                break;
            case 'module':
                $element = 'mod_' . $element;
                if ($reinstall) {
                    $query = 'DELETE FROM `#__modules`' . ' WHERE `module` = ' . $db->quote($element);
                    $db->setQuery($query);
                    $db->query();
                    $installed = 0;
                } else {
                    $query = 'SELECT id FROM `#__modules`' . ' WHERE `module` = ' . $db->quote($element) . ' LIMIT 1';
                    $db->setQuery($query);
                    $installed = $db->loadResult();
                }
                if (!$installed) {
                    $query = 'ALTER TABLE `#__modules`' . ' AUTO_INCREMENT = 1';
                    $db->setQuery($query);
                    $db->query();
                    $row =& JTable::getInstance('module');
                    $row->title = $title;
                    $row->module = $element;
                    $row->ordering = $row->getNextOrder("position='left'");
                    $row->position = 'left';
                    $row->showtitle = 1;
                    $row->language = '*';
                    foreach ($extra as $key => $val) {
                        if (property_exists($row, $key)) {
                            $row->{$key} = $val;
                        }
                    }
                    if (!$row->store()) {
                        $mainframe->enqueueMessage($row->getError(), 'error');
                        return;
                    }
                    // Clean up possible garbage first
                    $query = 'DELETE FROM `#__modules_menu` WHERE `moduleid` = ' . (int) $row->id;
                    $db->setQuery($query);
                    $db->query();
                    // Time to create a menu entry for the module
                    $query = 'INSERT INTO `#__modules_menu` VALUES ( ' . (int) $row->id . ', 0 )';
                    $db->setQuery($query);
                    $db->query();
                }
                break;
        }
        $where[] = '`element` = ' . $db->quote($element);
        if ($reinstall) {
            $query = 'DELETE FROM `#__extensions`' . ' WHERE ' . implode(' AND ', $where);
            $db->setQuery($query);
            $db->query();
            $installed = 0;
        } else {
            $query = 'SELECT extension_id  FROM `#__extensions`' . ' WHERE ' . implode(' AND ', $where) . ' LIMIT 1';
            $db->setQuery($query);
            $installed = $db->loadResult();
        }
        $id = $installed;
        if (!$installed) {
            $query = 'ALTER TABLE `#__extensions`' . ' AUTO_INCREMENT = 1';
            $db->setQuery($query);
            $db->query();
            $row =& JTable::getInstance('extension');
            $row->name = strtoupper($name);
            $row->element = $name;
            $row->type = $type;
            $row->enabled = 1;
            $row->client_id = 0;
            $row->access = 1;
            switch ($type) {
                case 'component':
                    $row->name = strtoupper('com_' . $row->name);
                    $row->element = 'com_' . $row->element;
                    $row->access = 0;
                    $row->client_id = 1;
                    break;
                case 'plugin':
                    $row->name = strtoupper('plg_' . $folder . '_' . $row->name);
                    $row->folder = $folder;
                    break;
                case 'module':
                    $row->name = strtoupper('mod_' . $row->name);
                    $row->element = 'mod_' . $row->element;
                    break;
            }
            foreach ($extra as $key => $val) {
                if (property_exists($row, $key)) {
                    $row->{$key} = $val;
                }
            }
            if (!$row->store()) {
                $mainframe->enqueueMessage($row->getError(), 'error');
                return;
            }
            $id = $row->extension_id;
        }
        if (!$id) {
            return;
        }
        $installer = JInstaller::getInstance();
        $installer->refreshManifestCache($id);
        if ($type == 'component') {
            $query = 'DELETE FROM `#__menu`' . ' WHERE `link` = ' . $db->quote('index.php?option=com_' . $name);
            $db->setQuery($query);
            $db->query();
            $file = dirname(__FILE__) . DS . 'files' . DS . 'forced' . DS . 'administrator' . DS . 'components' . DS . 'com_' . $name . DS . $name . '.xml';
            $xml = JFactory::getXML($file);
            if (isset($xml->administration) && isset($xml->administration->menu)) {
                $menuElement = $xml->administration->menu;
                if ($menuElement) {
                    $data = array();
                    $data['menutype'] = 'menu';
                    $data['client_id'] = 1;
                    $data['title'] = (string) $menuElement;
                    $data['alias'] = $name;
                    $data['link'] = 'index.php?option=' . 'com_' . $name;
                    $data['type'] = 'component';
                    $data['published'] = 1;
                    $data['parent_id'] = 1;
                    $data['component_id'] = $id;
                    $attribs = $menuElement->attributes();
                    $data['img'] = (string) $attribs->img ? (string) $attribs->img : 'class:component';
                    $data['home'] = 0;
                    $data['language'] = '*';
                    $table = JTable::getInstance('menu');
                    if (!$table->setLocation(1, 'last-child') || !$table->bind($data) || !$table->check() || !$table->store()) {
                        $mainframe->enqueueMessage($table->getError(), 'error');
                        return;
                    }
                }
            }
        }
        if (function_exists('afterInstall_16')) {
            afterInstall_16($db);
        } else {
            if (function_exists('afterInstall')) {
                afterInstall($db);
            }
        }
    }
    $cookieName = JUtility::getHash('version_' . $name . '_version');
    setcookie($cookieName, '', 0);
    return $installed ? 2 : 1;
}
function installExtension( $name, $title, $type = 'component', $extra = array(), $reinstall = 0 )
{
	$mainframe =& JFactory::getApplication();

	// Create database object
	$db =& JFactory::getDBO();

	$installed = 0;

	if ( function_exists( 'beforeInstall_15' ) ) {
		beforeInstall_15( $db );
	} else if ( function_exists( 'beforeInstall' ) ) {
		beforeInstall( $db );
	}

	switch ( $type ) {
		case 'component':
			if ( $reinstall ) {
				$query = 'DELETE FROM `#__components`'
					.' WHERE `option` = '.$db->quote( 'com_'.$name );
				$db->setQuery( $query );
				$db->query();
				$installed = 0;
			} else {
				$query = 'SELECT `id` FROM `#__components`'
					.' WHERE `option` = '.$db->quote( 'com_'.$name )
					.' LIMIT 1';
				$db->setQuery( $query );
				$installed = (int) $db->loadResult();
			}

			if ( !$installed ) {
				$query = 'ALTER TABLE `#__components`'
					.' AUTO_INCREMENT = 1';
				$db->setQuery( $query );
				$db->query();

				$row =& JTable::getInstance( 'component' );
				$row->name = $title;
				$row->admin_menu_alt = $title;
				$row->option = 'com_'.$name;
				$row->link = 'option=com_'.$name;
				$row->admin_menu_link = 'option=com_'.$name;
				foreach ( $extra as $key => $val ) {
					$row->$key = $val;
				}

				if ( !$row->store() ) {
					$mainframe->enqueueMessage( $row->getError(), 'error' );
					return;
				}
			}

			break;

		case 'plugin':
			// Clean up possible garbage first
			$query = 'DELETE FROM `#__plugins`'
				.' WHERE `element` = '.$db->quote( $name )
				.' AND `folder` = \'\'';
			$db->setQuery( $query );
			$db->query();

			$folder = $extra['folder'];

			if ( $reinstall ) {
				$query = 'DELETE FROM `#__plugins`'
					.' WHERE `element` = '.$db->quote( $name )
					.' AND `folder` = '.$db->quote( $folder );
				$db->setQuery( $query );
				$db->query();
				$installed = 0;
			} else {
				$query = 'SELECT `id` FROM `#__plugins`'
					.' WHERE `element` = '.$db->quote( $name )
					.' AND `folder` = '.$db->quote( $folder )
					.' LIMIT 1';
				$db->setQuery( $query );
				$installed = (int) $db->loadResult();
			}

			if ( !$installed ) {
				$query = 'ALTER TABLE `#__plugins`'
					.' AUTO_INCREMENT = 1';
				$db->setQuery( $query );
				$db->query();

				$row =& JTable::getInstance( 'plugin' );
				$row->name = $title;
				$row->element = $name;
				$row->published = 1;
				foreach ( $extra as $key => $val ) {
					$row->$key = $val;
				}

				if ( !$row->store() ) {
					$mainframe->enqueueMessage( $row->getError(), 'error' );
					return;
				}
			}

			break;

		case 'module':
			if ( $reinstall ) {
				$query = 'DELETE FROM `#__modules`'
					.' WHERE `module` = '.$db->quote( 'mod_'.$name );
				$db->setQuery( $query );
				$db->query();
				$installed = 0;
			} else {
				$query = 'SELECT `id` FROM `#__modules`'
					.' WHERE `module` = '.$db->quote( 'mod_'.$name )
					.' LIMIT 1';
				$db->setQuery( $query );
				$installed = (int) $db->loadResult();
			}

			if ( !$installed ) {
				$query = 'ALTER TABLE `#__modules`'
					.' AUTO_INCREMENT = 1';
				$db->setQuery( $query );
				$db->query();

				$row =& JTable::getInstance( 'module' );
				$row->title = $title;
				$row->module = 'mod_'.$name;
				$row->ordering = $row->getNextOrder( "position='left'" );
				$row->position = 'left';
				$row->showtitle = 1;
				foreach ( $extra as $key => $val ) {
					$row->$key = $val;
				}

				if ( !$row->store() ) {
					$mainframe->enqueueMessage( $row->getError(), 'error' );
					return;
				}

				// Clean up possible garbage first
				$query = 'DELETE FROM `#__modules_menu` WHERE `moduleid` = '.( int ) $row->id;
				$db->setQuery( $query );
				$db->query();

				// Time to create a menu entry for the module
				$query = 'INSERT INTO `#__modules_menu` VALUES ( '.( int ) $row->id.', 0 )';
				$db->setQuery( $query );
				$db->query();
			}

			break;
	}

	if ( function_exists( 'afterInstall_15' ) ) {
		afterInstall_15( $db );
	} else if ( function_exists( 'afterInstall' ) ) {
		afterInstall( $db );
	}

	$cookieName = JUtility::getHash( 'version_'.$name.'_version' );
	setcookie( $cookieName, '', 0 );

	return ( $installed ) ? 2 : 1;
}