primo commit
This commit is contained in:
		
							
								
								
									
										219
									
								
								administrator/components/com_jem/models/housekeeping.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								administrator/components/com_jem/models/housekeeping.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,219 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @package    JEM | ||||
|  * @copyright  (C) 2013-2024 joomlaeventmanager.net | ||||
|  * @copyright  (C) 2005-2009 Christoph Lukes | ||||
|  * @license    https://www.gnu.org/licenses/gpl-3.0 GNU/GPL | ||||
|  */ | ||||
|  | ||||
| defined('_JEXEC') or die; | ||||
|  | ||||
| use Joomla\CMS\Factory; | ||||
| use Joomla\CMS\Language\Text; | ||||
| use Joomla\CMS\MVC\Model\BaseDatabaseModel; | ||||
| use Joomla\CMS\Filesystem\File; | ||||
| use Joomla\CMS\Log\Log; | ||||
| use Joomla\CMS\Filesystem\Folder; | ||||
| use Joomla\CMS\Client\ClientHelper; | ||||
| use Joomla\CMS\Filesystem\Path; | ||||
| use Joomla\CMS\Filter\InputFilter; | ||||
|  | ||||
| jimport('joomla.filesystem.file'); | ||||
|  | ||||
| /** | ||||
|  * Housekeeping-Model | ||||
|  */ | ||||
| class JemModelHousekeeping extends BaseDatabaseModel | ||||
| { | ||||
| 	const EVENTS = 1; | ||||
| 	const VENUES = 2; | ||||
| 	const CATEGORIES = 3; | ||||
|  | ||||
| 	/** | ||||
| 	 * Map logical name to folder and db names | ||||
| 	 * @var stdClass | ||||
| 	 */ | ||||
| 	private $map = null; | ||||
|  | ||||
| 	/** | ||||
| 	 * Constructor | ||||
| 	 */ | ||||
| 	public function __construct() | ||||
| 	{ | ||||
| 		parent::__construct(); | ||||
|  | ||||
| 		$map = array(); | ||||
| 		$map[JemModelHousekeeping::EVENTS] = array("folder" => "events", "table" => "events", "field" => "datimage"); | ||||
| 		$map[JemModelHousekeeping::VENUES] = array("folder" => "venues", "table" => "venues", "field" => "locimage"); | ||||
| 		$map[JemModelHousekeeping::CATEGORIES] = array("folder" => "categories", "table" => "categories", "field" => "image"); | ||||
| 		$this->map = $map; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Method to delete the images | ||||
| 	 * | ||||
| 	 * @access public | ||||
| 	 * @return int | ||||
| 	 */ | ||||
| 	public function delete($type) | ||||
| 	{ | ||||
| 		// Set FTP credentials, if given | ||||
| 		jimport('joomla.client.helper'); | ||||
| 		ClientHelper::setCredentialsFromRequest('ftp'); | ||||
|  | ||||
| 		// Get some data from the request | ||||
| 		$images	= $this->getImages($type); | ||||
| 		$folder = $this->map[$type]['folder']; | ||||
|  | ||||
| 		$count = count($images); | ||||
| 		$fail = 0; | ||||
|  | ||||
| 		foreach ($images as $image) | ||||
| 		{ | ||||
| 			if ($image !== InputFilter::getInstance()->clean($image, 'path')) { | ||||
| 				Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_UNABLE_TO_DELETE').' '.htmlspecialchars($image, ENT_COMPAT, 'UTF-8'), 'warning'); | ||||
| 				$fail++; | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			$fullPath = Path::clean(JPATH_SITE.'/images/jem/'.$folder.'/'.$image); | ||||
| 			$fullPaththumb = Path::clean(JPATH_SITE.'/images/jem/'.$folder.'/small/'.$image); | ||||
|  | ||||
| 			if (is_file($fullPath)) { | ||||
| 				File::delete($fullPath); | ||||
| 				if (File::exists($fullPaththumb)) { | ||||
| 					File::delete($fullPaththumb); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$deleted = $count - $fail; | ||||
|  | ||||
| 		return $deleted; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Deletes zombie cats_event_relations with no existing event or category | ||||
| 	 * @return boolean | ||||
| 	 */ | ||||
| 	public function cleanupCatsEventRelations() | ||||
| 	{ | ||||
| 		$db = Factory::getContainer()->get('DatabaseDriver'); | ||||
|  | ||||
| 		$db->setQuery('DELETE cat FROM #__jem_cats_event_relations as cat' | ||||
| 				.' LEFT OUTER JOIN #__jem_events as e ON cat.itemid = e.id' | ||||
| 				.' WHERE e.id IS NULL'); | ||||
| 		$db->execute(); | ||||
|  | ||||
| 		$db->setQuery('DELETE cat FROM #__jem_cats_event_relations as cat' | ||||
| 				.' LEFT OUTER JOIN #__jem_categories as c ON cat.catid = c.id' | ||||
| 				.' WHERE c.id IS NULL'); | ||||
| 		$db->execute(); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Truncates JEM tables with exception of settings table | ||||
| 	 */ | ||||
| 	public function truncateAllData() | ||||
| 	{ | ||||
| 		$result = true; | ||||
| 		$tables = array('attachments', 'categories', 'cats_event_relations', 'events', 'groupmembers', 'groups', 'register', 'venues'); | ||||
| 		$db = Factory::getContainer()->get('DatabaseDriver'); | ||||
|  | ||||
| 		foreach ($tables as $table) { | ||||
| 			$db->setQuery('TRUNCATE #__jem_'.$table); | ||||
|  | ||||
| 			if ($db->execute() === false) { | ||||
| 				// report but continue | ||||
| 				JemHelper::addLogEntry('Error truncating #__jem_'.$table, __METHOD__, Log::ERROR); | ||||
| 				$result = false; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		$categoryTable = $this->getTable('category', 'JemTable'); | ||||
| 		$categoryTable->addRoot(); | ||||
|  | ||||
| 		return $result; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Method to count the cat_relations table | ||||
| 	 * | ||||
| 	 * @access public | ||||
| 	 * @return int | ||||
| 	 */ | ||||
| 	public function getCountcats() | ||||
| 	{ | ||||
| 		$db = Factory::getContainer()->get('DatabaseDriver'); | ||||
| 		$query = $db->getQuery(true); | ||||
| 		$query->select(array('*')); | ||||
| 		$query->from('#__jem_cats_event_relations'); | ||||
| 		$db->setQuery($query); | ||||
| 		$db->execute(); | ||||
|  | ||||
| 		$total = $db->loadObjectList(); | ||||
|  | ||||
| 		return is_array($total) ? count($total) : 0; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Method to determine the images to delete | ||||
| 	 * | ||||
| 	 * @access private | ||||
| 	 * @return array | ||||
| 	 */ | ||||
| 	private function getImages($type) | ||||
| 	{ | ||||
| 		$images = array_diff($this->getAvailable($type), $this->getAssigned($type)); | ||||
|  | ||||
| 		return $images; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Method to determine the assigned images | ||||
| 	 * | ||||
| 	 * @access private | ||||
| 	 * @return array | ||||
| 	 */ | ||||
| 	private function getAssigned($type) | ||||
| 	{ | ||||
| 		$query = 'SELECT '.$this->map[$type]['field'].' FROM #__jem_'.$this->map[$type]['table']; | ||||
|  | ||||
| 		$this->_db->setQuery($query); | ||||
| 		$assigned = $this->_db->loadColumn(); | ||||
|  | ||||
| 		return $assigned; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Method to determine the unassigned images | ||||
| 	 * | ||||
| 	 * @access private | ||||
| 	 * @return array | ||||
| 	 */ | ||||
| 	private function getAvailable($type) | ||||
| 	{ | ||||
| 		// Initialize variables | ||||
| 		$basePath = JPATH_SITE.'/images/jem/'.$this->map[$type]['folder']; | ||||
|  | ||||
| 		$images = array (); | ||||
|  | ||||
| 		// Get the list of files and folders from the given folder | ||||
| 		$fileList = Folder::files($basePath); | ||||
|  | ||||
| 		// Iterate over the files if they exist | ||||
| 		if ($fileList !== false) { | ||||
| 			foreach ($fileList as $file) | ||||
| 			{ | ||||
| 				if (is_file($basePath.'/'.$file) && substr($file, 0, 1) != '.') { | ||||
| 					$images[] = $file; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return $images; | ||||
| 	} | ||||
| } | ||||
| ?> | ||||
		Reference in New Issue
	
	Block a user