160 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @package   FOF
 | |
|  * @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 | |
|  * @license   GNU General Public License version 3, or later
 | |
|  */
 | |
| 
 | |
| namespace FOF40\Render;
 | |
| 
 | |
| defined('_JEXEC') || die;
 | |
| 
 | |
| use FOF40\Container\Container;
 | |
| 
 | |
| /**
 | |
|  * Renderer class for use with Akeeba FEF
 | |
|  *
 | |
|  * Renderer options
 | |
|  *
 | |
|  * wrapper_id           The ID of the wrapper DIV. Default: akeeba-rendered-fef
 | |
|  * linkbar_style        Style for linkbars: joomla3|classic. Default: joomla3
 | |
|  * load_fef             Load FEF CSS? Set to false if you are loading it outside the renderer. Default: true
 | |
|  * load_fef_js          Load FEF JS? Set to false if you are loading it outside the rendered. Default: true
 | |
|  * load_fef_js_minimal  Load the minimal FEF JS (without features depending on FEF CSS)? Default: inverse of load_fef
 | |
|  * fef_reset            Should I reset the CSS styling for basic HTML elements inside the FEF container? Default: true
 | |
|  * fef_dark             Should I load the FEF Dark Mode CSS and supporting JS? Default: 0 (no). Options: 1 (yes and
 | |
|  *                      activate immediately), -1 (include dark.css but not enable by default, also enables auto mode
 | |
|  *                      for Safari)
 | |
|  * custom_css           Comma-separated list of custom CSS files to load _after_ the main FEF CSS file, e.g.
 | |
|  *                      media://com_foo/css/bar.min.css,media://com_foo/css/baz.min.css
 | |
|  * remove_wrapper_classes  Comma-separated list of classes to REMOVE from the container
 | |
|  * add_wrapper_classes     Comma-separated list of classes to ADD to the container
 | |
|  *
 | |
|  * Note: when Dark Mode is enabled the class akeeba-renderer-fef--dark is applied to the container DIV. You can use
 | |
|  * remove_wrapper_classes to remove it e.g. when you want it to be enabled only through a JavaScript-powered toggle.
 | |
|  *
 | |
|  * @package FOF40\Render
 | |
|  */
 | |
| class FEF extends Joomla
 | |
| {
 | |
| 	public function __construct(Container $container)
 | |
| 	{
 | |
| 		parent::__construct($container);
 | |
| 
 | |
| 		$helperFile = JPATH_SITE . '/media/fef/fef.php';
 | |
| 
 | |
| 		if (!class_exists('AkeebaFEFHelper') && is_file($helperFile))
 | |
| 		{
 | |
| 			include_once $helperFile;
 | |
| 		}
 | |
| 
 | |
| 		$this->priority = 20;
 | |
| 		$this->enabled  = class_exists('AkeebaFEFHelper');
 | |
| 	}
 | |
| 
 | |
| 	public function initialise(string $view, string $task): void
 | |
| 	{
 | |
| 		$useReset    = $this->getOption('fef_reset', 1);
 | |
| 		$useFefCss   = $this->getOption('load_fef', 1);
 | |
| 		$useFefJs    = $this->getOption('load_fef_js', 1);
 | |
| 		$minimalJs   = $this->getOption('load_fef_js_minimal', $useFefCss ? 0 : 1);
 | |
| 		$useDarkMode = $this->getOption('fef_dark', 0);
 | |
| 
 | |
| 		if (class_exists('AkeebaFEFHelper'))
 | |
| 		{
 | |
| 			if ($useFefCss)
 | |
| 			{
 | |
| 				\AkeebaFEFHelper::loadCSSFramework((bool) $useReset, (bool) $useDarkMode != 0);
 | |
| 			}
 | |
| 
 | |
| 			if ($useFefJs)
 | |
| 			{
 | |
| 				\AkeebaFEFHelper::loadJSFramework((bool) $minimalJs);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Unlike the Joomla renderer we do NOT load jQuery unless explicitly enabled
 | |
| 		$loadJQuery = $this->getOption('load_jquery', false);
 | |
| 		$this->setOption('load_jquery', $loadJQuery ? 1 : 0);
 | |
| 
 | |
| 		parent::initialise($view, $task);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Opens the FEF styling wrapper element. Our component's output will be inside this wrapper.
 | |
| 	 *
 | |
| 	 * @param   array  $classes  An array of additional CSS classes to add to the outer page wrapper element.
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	protected function openPageWrapper(array $classes): void
 | |
| 	{
 | |
| 		$useDarkMode = $this->getOption('fef_dark', false);
 | |
| 
 | |
| 		if (($useDarkMode == 1) && !in_array('akeeba-renderer-fef--dark', $classes))
 | |
| 		{
 | |
| 			$classes[] = 'akeeba-renderer-fef--dark';
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * Remove wrapper classes. By default these are classes for the Joomla 3 sidebar which is not used in FEF
 | |
| 		 * components anymore.
 | |
| 		 */
 | |
| 		$removeClasses = $this->getOption('remove_wrapper_classes', [
 | |
| 			'j-toggle-main',
 | |
| 			'j-toggle-transition',
 | |
| 			'row-fluid',
 | |
| 		]);
 | |
| 
 | |
| 		if (!is_array($removeClasses))
 | |
| 		{
 | |
| 			$removeClasses = explode(',', $removeClasses);
 | |
| 		}
 | |
| 
 | |
| 		$removeClasses = array_map('trim', $removeClasses);
 | |
| 
 | |
| 		foreach ($removeClasses as $class)
 | |
| 		{
 | |
| 			$x = array_search($class, $classes);
 | |
| 
 | |
| 			if ($x !== false)
 | |
| 			{
 | |
| 				unset($classes[$x]);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Add the following classes to the wrapper div
 | |
| 		$addClasses = $this->getOption('add_wrapper_classes', '');
 | |
| 
 | |
| 		if (!is_array($addClasses))
 | |
| 		{
 | |
| 			$addClasses = explode(',', $addClasses);
 | |
| 		}
 | |
| 
 | |
| 		$addClasses    = array_map('trim', $addClasses);
 | |
| 		$customClasses = implode(' ', array_unique(array_merge($classes, $addClasses)));
 | |
| 
 | |
| 		$id = $this->getOption('wrapper_id', 'akeeba-renderer-fef');
 | |
| 		$id = empty($id) ? "" : sprintf(' id="%s"', $id);
 | |
| 
 | |
| 		echo <<< HTML
 | |
| <div id="akeeba-renderer-fef" class="akeeba-renderer-fef $customClasses"$id>
 | |
| 
 | |
| HTML;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Close the FEF styling wrapper element.
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	protected function closePageWrapper(): void
 | |
| 	{
 | |
| 		echo <<< HTML
 | |
| </div>
 | |
| 
 | |
| HTML;
 | |
| 
 | |
| 	}
 | |
| }
 |