Удалить устаревшие серверы обновления при обновлении расширений

Оцените материал
(1 Голосовать)

   Очень странно, но в Joomla невозможно обновить адрес сервера обновлений у какого либо расширения. Получается если при обновлении например компонента, у новой версии в файле манифесте изменить адрес сервера, то добавится еще один. 

   Старый адрес можно удалить при установке или обновлении расширений. Достаточно добавить к расширению файл script.php и прописать в методе preflight перебор и удаление записей о всех серверах обновляемого расширения.

 

    public function preflight($type, $parent)
	{
		$db = \JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('extension_id');
        $query->from($db->quoteName('#__extensions'));
        $query->where('element = "com_amgallery"'); // Ваше расширение!
        $db->setQuery($query);
		$listid = $db->loadObjectList();
		foreach($listid as $lid)
		{
			$query = $db->getQuery(true);
			$query->select('update_site_id');
			$query->from($db->quoteName('#__update_sites_extensions'));
			$query->where('extension_id = '.$lid->extension_id );
			$db->setQuery($query);
			$listsite = $db->loadObjectList();
			
			foreach($listsite as $lsite)
			{
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__update_sites'));
				$query->where('update_site_id = '.$lsite->update_site_id );
				$db->setQuery($query);
				$result = $db->execute();
			}
			
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__update_sites_extensions'));
			$query->where('extension_id = '.$lid->extension_id );
			$db->setQuery($query);
			$result = $db->execute();
		}
	}

 

   Измените в коде имя расширения на свое. Таким образом мы можем удалить перед установкой/обновлении все записи о всех серверах. А те которые прописаны в файле манифесте будут добавлены уже в процессе установки/обновлении.

   Ну и весь код файла script.php.

 

// No direct access
defined( '_JEXEC' ) or die;

class Com_MycomInstallerScript
{
	/**
	 * Метод для установки компонента.
	 * @param object $parent класс, который вызывает этом метод.
	 * @return void
	 */
	public function install($parent)
	{
		//$parent->getParent()->setRedirectURL('index.php?option=com_mycom');
	}

	/**
	 * Метод для удаления компонента.
	 * @param object $parent класс, который вызывает этом метод.
	 * @return void
	 */
	public function uninstall($parent)
	{
		\JFactory::getApplication()->enqueueMessage(JText::_('COM_MYCOM_UNINSTALL_TEXT'));
		\JFactory::getApplication()->enqueueMessage(JText::_('COM_MYCOM_SCRIPT_UNINSTALL_MESS'));
	}

	/**
	 * Метод для обновления компонента.
	 * @param object $parent класс, который вызывает этом метод.
	 * @return void
	 */
	public function update($parent)
	{
		
	}

	/**
	 * Метод, который исполняется до install/update/uninstall.
	 * @param object $type тип изменений: install, update или discover_install
	 * @param object $parent класс, который вызывает этом метод.
	 * @return void
	 */
	public function preflight($type, $parent)
	{
		$db = \JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('extension_id');
        $query->from($db->quoteName('#__extensions'));
        $query->where('element = "com_mycom"'); // Ваше расширении!
        $db->setQuery($query);
		$listid = $db->loadObjectList();
		foreach($listid as $lid)
		{
			$query = $db->getQuery(true);
			$query->select('update_site_id');
			$query->from($db->quoteName('#__update_sites_extensions'));
			$query->where('extension_id = '.$lid->extension_id );
			$db->setQuery($query);
			$listsite = $db->loadObjectList();
			
			foreach($listsite as $lsite)
			{
				$query = $db->getQuery(true);
				$query->delete($db->quoteName('#__update_sites'));
				$query->where('update_site_id = '.$lsite->update_site_id );
				$db->setQuery($query);
				$result = $db->execute();
			}
			
			$query = $db->getQuery(true);
			$query->delete($db->quoteName('#__update_sites_extensions'));
			$query->where('extension_id = '.$lid->extension_id );
			$db->setQuery($query);
			$result = $db->execute();
		}
	}

	/**
	 * Метод, который исполняется после install/update/uninstall.
	 * @param object $type тип изменений: install, update или discover_install
	 * @param object $parent класс, который вызывает этом метод.
	 * @return void
	 */
	public function postflight($type, $parent)
	{
		\JFactory::getApplication()->enqueueMessage(JText::_('COM_MYCOM_SCRIPT_POSTFLIGHT_' . strtoupper($type) . '_TEXT'). ' v.'.$parent->get('manifest')->version);
	}
}
Авторизуйтесь, чтобы получить возможность оставлять комментарии