Файловый менеджер - Редактировать - /home/lmsyaran/public_html/joomla4/osl.tar
Назад
Config/Config.php 0000644 00000005665 15115511723 0007704 0 ustar 00 <?php /** * @package OSL * @subpackage Config * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Config; /** * Provide basic methods which help accessing to configuration data * * @package OSL * @subpackage Config * @since 1.0 */ class Config implements \ArrayAccess { /** * The config data container * * @var array */ protected $data; /** * OSFConfig constructor. * * @param array $data */ public function __construct(array $data = array()) { $this->data = $data; } /** * Retrieve data for a config option * * @param string $key The key of the config option * * @param mixed $default Default value if no data has been set for that config option * * @return mixed The config option value */ public function get($key, $default = null) { if (isset($this->data[$key])) { return $this->data[$key]; } return $default; } /** * Set data for a config option * * @param string $name The name of config option * @param mixed $value * * @return $this */ public function set($name, $value) { $this->data[$name] = $value; return $this; } /** * Define value for a config option. The value will only be set if there's no value for the name or if it is null. * * @param string $name Name of the value to define. * @param mixed $value Value to assign to the input. * * @return void * */ public function def($name, $value) { if (isset($this->data[$name])) { return; } $this->data[$name] = $value; } /** * @param mixed $offset * * @return mixed */ public function offsetExists($offset) { return isset($this->data[$offset]); } /** * @param mixed $offset * * @return mixed */ public function offsetGet($offset) { return $this->get($offset); } /** * @param mixed $offset * @param mixed $value * * @return mixed */ public function offsetSet($offset, $value) { $this->set($offset, $value); } /** * @param mixed $offset * * @return mixed */ public function offsetUnset($offset) { unset($this->data[$offset]); } /** * Magic method to get a config option value * * @param string * * @return mixed */ public function __get($name) { return $this->get($name); } /** * Set config option value * * @param string $name user-specified config option * * @param mixed $value user-specified config option value. * * @return void */ public function __set($name, $value) { $this->set($name, $value); } /** * Test existence of a config variable * * @param string * * @return boolean */ public function __isset($name) { return isset($this->data[$name]); } } Container/Container.php 0000644 00000017021 15115511723 0011123 0 ustar 00 <?php /** * @package OSL * @subpackage Container * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Container; use Exception; use Joomla\DI\Container as DIContainer; use OSL\Input\Input; use JFactory, JText, JComponentHelper; /** * DI Container for component * * @property string $option The name of the component (com_eventbooking) * @property string $componentName The name of the component without com_ (eventbooking) * @property string $componentNamespace The namespace of the component's classes (Ossolution\EventBooking) * @property string $feNamespace The frontend namespace of the component's classes (Ossolution\EventBooking\Site) * @property string $beNamespace The backend namespace of the component's classes (Ossolution\EventBooking\Admin) * @property string $namespace The namespace of the component's classes (Ossolution\EventBooking\Admin or Ossolution\EventBooking\Site), * depends on the current application being executued * * @property-read \OSL\Factory\Factory $factory The application object * @property-read \JApplicationCms $app The application object * @property-read \Joomla\Registry\Registry $appConfig The application configuration object * @property-read \JDocumentHtml $document The event dispatcher * @property-read \JEventDispatcher $eventDispatcher The event dispatcher * @property-read \JSession $session The session object * @property-read \JMail $mailer The mailer object * @property-read \JLanguage $language The language object * @property-read Input $input The input object * @property-read \JDatabaseDriver $db The database connection object * @property-read \OSL\Inflector\Inflector $inflector The string inflector * @property-read \JUser $user The user * * @property string $defaultView Default view * @property string $tablePrefix Database table prefix * @property string $languagePrefix Language Prefix * @property-read string $template The active template */ class Container extends DIContainer { /** * Store configuration values for container, use for child container * * @var array */ protected $values = array(); /** * Cache of created container instances * * @var array */ protected static $containerStore = array(); /** * Returns the container instance for a specific component. If the instance exists it returns the one already * constructed. * * @param string $option The name of the component, e.g. com_example * @param array $values Configuration override values * @param Container $parent Optional. Parent container (default: application container) * * @return Container * * @throws Exception */ public static function &getInstance($option, array $values = array(), Container $parent = null) { if (!isset(static::$containerStore[$option])) { $defaultValues = array( 'option' => $option, 'componentName' => substr($option, 4), 'componentNamespace' => 'Joomla\\Component\\' . ucfirst(substr($option, 4)), 'frontEndPath' => JPATH_ROOT . '/components/' . $option, 'backEndPath' => JPATH_ADMINISTRATOR . '/components/' . $option, 'defaultView' => substr($option, 4), 'tablePrefix' => '#__' . substr($option, 4) . '_', 'languagePrefix' => substr($option, 4), ); $values = array_merge($defaultValues, $values); if (empty($values['feNamespace'])) { $values['feNamespace'] = $values['componentNamespace'] . '\\Site'; } if (empty($values['beNamespace'])) { $values['beNamespace'] = $values['componentNamespace'] . '\\Admin'; } $namespace = JFactory::getApplication()->isClient('administrator') ? $values['beNamespace'] : $values['feNamespace']; $values['namespace'] = $namespace; $className = $namespace . '\\Container'; if (!class_exists($className, true)) { $className = __CLASS__; } self::$containerStore[$option] = new $className($values, $parent); } return self::$containerStore[$option]; } /** * Creates a new DI container. * * @param DIContainer $parent The parent DI container, optional * @param array $values */ public function __construct(array $values = array(), DIContainer $parent = null) { parent::__construct($parent); // Register the component to the PSR-4 auto-loader /** @var \Composer\Autoload\ClassLoader $autoLoader */ $autoLoader = include JPATH_LIBRARIES . '/vendor/autoload.php'; $autoLoader->setPsr4($values['feNamespace'] . '\\', $values['frontEndPath']); $autoLoader->setPsr4($values['beNamespace'] . '\\', $values['backEndPath']); foreach ($values as $key => $value) { $this->set($key, $value); } // Store the values, use for creating child container if needed $this->values = $values; // Register common used Joomla objects $this->registerServiceProvider(new \OSL\Provider\SystemProvider()); } /** * Create a child Container with a new property scope that * that has the ability to access the parent scope when resolving. * * @param array $values * * @return Container This object for chaining. * */ public function createChild($values = array()) { $values = array_merge($this->values, $values); return new static($values, $this); } /** * Magic getter for alternative syntax, e.g. $container->foo instead of $container->get('foo'). Allows for type * hinting using the property and property-read PHPdoc macros at the top of the container. * * @param string $name The key of the data storage * * @return mixed */ public function __get($name) { return $this->get($name); } /** * Magic setter for alternative syntax, e.g. $container->foo = $value instead of $container->set('foo', $value). * Allows for type hinting using the property and property-read PHPdoc macros at the top of the container. * * @param string $name The key of the data storage * @param mixed $value The value to set in the data storage */ public function __set($name, $value) { $this->set($name, $value); } } Container/ContainerAwareTrait.php 0000644 00000002066 15115511723 0013112 0 ustar 00 <?php /** * @package OSL * @subpackage Container * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Container; /** * Defines the trait for a Container Aware Class. * * @since 1.0 * */ trait ContainerAwareTrait { /** * DI Container * * @var Container * @since 1.0 */ protected $container; /** * Get the DI container. * * @return Container * * @since 1.0 * * @throws \UnexpectedValueException May be thrown if the container has not been set. */ public function getContainer() { if ($this->container) { return $this->container; } throw new \UnexpectedValueException('Container not set in ' . __CLASS__); } /** * Set the DI container. * * @param Container $container The DI container. * * @return mixed Returns itself to support chaining. * * @since 1.0 */ public function setContainer(Container $container) { $this->container = $container; return $this; } } Controller/AdminController.php 0000644 00000024507 15115511723 0012505 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Controller; use OSL\Container\Container; use Joomla\Utilities\ArrayHelper, JText, JRoute; defined('_JEXEC') or die; /** * Class AdminController * * Base class for a Joomla admin Controller. It handles add, edit, delete, publish, unpublish records.... */ class AdminController extends Controller { /** * The URL view item variable. * * @var string */ protected $viewItem; /** * The URL view list variable. * * @var string */ protected $viewList; /** * Constructor. * * @param array $config An optional associative array of configuration settings. * * @see OSFControlleAdmin */ public function __construct(Container $container, array $config = array()) { parent::__construct($container, $config); if (isset($config['view_item'])) { $this->viewItem = $config['view_item']; } else { $this->viewItem = $this->name; } if (isset($config['view_list'])) { $this->viewList = $config['view_list']; } else { $this->viewList = $this->container->inflector->pluralize($this->viewItem); } // Register tasks mapping $this->registerTask('apply', 'save'); $this->registerTask('save2new', 'save'); $this->registerTask('save2copy', 'save'); $this->registerTask('unpublish', 'publish'); $this->registerTask('orderup', 'reorder'); $this->registerTask('orderdown', 'reorder'); } /** * Display Form allows adding a new record */ public function add() { if ($this->allowAdd()) { $this->input->set('view', $this->viewItem); $this->input->set('edit', false); $this->display(); } else { $this->setMessage(JText::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED'), 'error'); $this->setRedirect(JRoute::_($this->getViewListUrl(), false)); return false; } } /** * Display Form allows editing record */ public function edit() { $cid = $this->input->get('cid', array(), 'array'); if (count($cid)) { $this->input->set('id', 0); } if ($this->allowEdit(array('id' => $this->input->getInt('id')))) { $this->input->set('view', $this->viewItem); $this->input->set('edit', false); $this->display(); } else { $this->setMessage(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'), 'error'); $this->setRedirect(JRoute::_($this->getViewListUrl(), false)); } } /** * Method to save a record. * * @return boolean True if successful, false otherwise. * */ public function save() { $this->csrfProtection(); $input = $this->input; $task = $this->getTask(); if ($task == 'save2copy') { $input->set('source_id', $input->getInt('id', 0)); $input->set('id', 0); $task = 'apply'; } $id = $input->getInt('id', 0); if ($this->allowSave(array('id' => $id))) { try { /* @var \OSL\Model\AdminModel $model */ $model = $this->getModel(); $model->store($this->input); if ($this->container->app->isClient('site') && $id == 0) { $langSuffix = '_SUBMIT_SAVE_SUCCESS'; } else { $langSuffix = '_SAVE_SUCCESS'; } $languagePrefix = $this->container->languagePrefix; $msg = JText::_(($this->container->language->hasKey($languagePrefix . $langSuffix) ? $languagePrefix : 'JLIB_APPLICATION') . $langSuffix); switch ($task) { case 'apply': $url = JRoute::_($this->getViewItemUrl($input->getInt('id', 0)), false); break; case 'save2new': $url = JRoute::_($this->getViewItemUrl(), false); break; default: $url = JRoute::_($this->getViewListUrl(), false); break; } $this->setRedirect($url, $msg); } catch (\Exception $e) { $this->setMessage($e->getMessage(), 'error'); $this->setRedirect(JRoute::_($this->getViewItemUrl($id), false)); } } else { $this->setMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error'); $this->setRedirect(JRoute::_($this->getViewListUrl(), false)); } } /** * Method to cancel an add/edit. We simply redirect users to view which display list of records * */ public function cancel() { $this->setRedirect(JRoute::_($this->getViewListUrl(), false)); } /** * Delete selected items * * @return void * */ public function delete() { // Check for request forgeries $this->csrfProtection(); // Get items to remove from the request. $cid = $this->input->get('cid', array(), 'array'); $cid = ArrayHelper::toInteger($cid); for ($i = 0, $n = count($cid); $i < $n; $i++) { if (!$this->allowDelete($cid[$i])) { unset($cid[$i]); } } $languagePrefix = $this->container->languagePrefix; if (count($cid)) { try { /* @var \OSL\Model\AdminModel $model */ $model = $this->getModel($this->name, array('ignore_request' => true)); $model->delete($cid); $this->setMessage(JText::plural($languagePrefix . '_N_ITEMS_DELETED', count($cid))); } catch (\Exception $e) { $this->setMessage($e->getMessage(), 'error'); } } else { $this->setMessage($languagePrefix . '_NO_ITEM_SELECTED', 'warning'); } $this->setRedirect(JRoute::_($this->getViewListUrl(), false)); } /** * Method to publish a list of items * * @return void */ public function publish() { // Check for request forgeries $this->csrfProtection(); // Get items to publish from the request. $cid = $this->input->get('cid', array(), 'array'); $data = array('publish' => 1, 'unpublish' => 0, 'archive' => 2); $task = $this->getTask(); $published = ArrayHelper::getValue($data, $task, 0, 'int'); $cid = ArrayHelper::toInteger($cid); for ($i = 0, $n = count($cid); $i < $n; $i++) { if (!$this->allowEditState($cid[$i])) { unset($cid[$i]); } } $languagePrefix = $this->container->languagePrefix; if (count($cid)) { try { /* @var \OSL\Model\AdminModel $model */ $model = $this->getModel($this->name, array('ignore_request' => true)); $model->publish($cid, $published); switch ($published) { case 0: $ntext = $languagePrefix . '_N_ITEMS_UNPUBLISHED'; break; case 1: $ntext = $languagePrefix . '_N_ITEMS_PUBLISHED'; break; case 2: $ntext = $languagePrefix . '_N_ITEMS_ARCHIVED'; break; } $this->setMessage(JText::plural($ntext, count($cid))); } catch (\Exception $e) { $msg = null; $this->setMessage($e->getMessage(), 'error'); } } else { $this->setMessage($languagePrefix . '_NO_ITEM_SELECTED', 'warning'); } $this->setRedirect(JRoute::_($this->getViewListUrl(), false)); } /** * Method to save the submitted ordering values for records via AJAX. * * @return void * * @since 2.0 */ public function save_order_ajax() { // Get the input $pks = $this->input->post->get('cid', array(), 'array'); $order = $this->input->post->get('order', array(), 'array'); // Sanitize the input $pks = ArrayHelper::toInteger($pks); $order = ArrayHelper::toInteger($order); // Get the model /* @var \OSL\Model\AdminModel $model */ $model = $this->getModel(); // Save the ordering $return = $model->saveorder($pks, $order); if ($return) { echo "1"; } // Close the application $this->container->app->close(); } /** * Method to check if you can add a new record. * * Extended classes can override this if necessary. * * @param array $data An array of input data. * * @return boolean * */ protected function allowAdd($data = array()) { return $this->container->user->authorise('core.create', $this->container->option); } /** * Method to check if you can edit a new record. * * Extended classes can override this if necessary. * * @param array $data An array of input data. * @param string $key The name of the key for the primary key; default is id. * * @return boolean */ protected function allowEdit($data = array(), $key = 'id') { return $this->container->user->authorise('core.edit', $this->container->option); } /** * Method to check if you can save a new or existing record. * * Extended classes can override this if necessary. * * @param array $data An array of input data. * @param string $key The name of the key for the primary key. * * @return boolean */ protected function allowSave($data, $key = 'id') { $recordId = isset($data[$key]) ? $data[$key] : '0'; if ($recordId) { return $this->allowEdit($data, $key); } else { return $this->allowAdd($data); } } /** * Method to check whether the current user is allowed to delete a record * * @param int $id Record ID * * @return boolean True if allowed to delete the record. Defaults to the permission for the component. * */ protected function allowDelete($id) { return $this->container->user->authorise('core.delete', $this->container->option); } /** * Method to check whether the current user can change status (publish, unpublish of a record) * * @param int $id Id of the record * * @return boolean True if allowed to change the state of the record. Defaults to the permission for the component. * */ protected function allowEditState($id) { return $this->container->user->authorise('core.edit.state', $this->container->option); } /** * Get url of the page which display list of records * * @return string */ protected function getViewListUrl() { return 'index.php?option=' . $this->container->option . '&view=' . $this->viewList; } /** * Get url of the page which allow adding/editing a record * * @param int $recordId * * @return string */ protected function getViewItemUrl($recordId = null) { $url = 'index.php?option=' . $this->container->option . '&view=' . $this->viewItem; if ($recordId) { $url .= '&id=' . $recordId; } return $url; } } Controller/Controller.php 0000644 00000030153 15115511723 0011526 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Controller; use ReflectionClass, ReflectionMethod, Exception; use OSL\Container\Container, OSL\Input\Input; defined('_JEXEC') or die; /** * Class Controller * * Base class for a Joomla Controller. Controller (Controllers are where you put all the actual code.) Provides basic * functionality, such as rendering views (aka displaying templates). */ class Controller { /** * Array which hold all the controller objects has been created * * @var array */ protected static $instances = []; /** * Name of the controller * * @var string */ protected $name; /** * Controller input * * @var Input */ protected $input; /** * Array of class methods * * @var array */ protected $methods = []; /** * Array which map a task with the method will be called * * @var array */ protected $taskMap = []; /** * Current or most recently performed task. * * @var string */ protected $task; /** * URL for redirection. * * @var string */ protected $redirect; /** * Redirect message. * * @var string */ protected $message = null; /** * Redirect message type. * * @var string */ protected $messageType = 'message'; /** * Method to get instance of a controller * * @param Container $container * @param array $config * * @return Controller * * @throws Exception */ public static function getInstance(Container $container, array $config = []) { $input = $container->input; // Handle task format controller.task $task = $input->get('task', ''); $lou= $input->get('layout', null); if ($task== $lou) { $task= ''; } $pos = strpos($task, '.'); if ($pos !== false) { $name = substr($task, 0, $pos); $task = substr($task, $pos + 1); $input->set('task', $task); } else { $name = $container->inflector->singularize($input->getCmd('view')); if (empty($name)) { $name = 'controller'; } } $option = $container->option; if (!isset(self::$instances[$option . $name])) { $config['name'] = $name; if ($task == '') { // Always use default controller for display task if (class_exists($container->namespace . '\\Override\\Controller\\Controller')) { $className = $container->namespace . '\\Override\\Controller\\Controller'; } else { $className = $container->namespace . '\\Controller\\Controller'; } self::$instances[$option . $name] = new $className($container, $config); } else { self::$instances[$option . $name] = $container->factory->createController($name, $config); } } return self::$instances[$option . $name]; } /** * Constructor. * * @param Container $container * * @param array $config An optional associative array of configuration settings. * * @throws Exception */ public function __construct(Container $container, array $config = []) { $this->container = $container; $input = $container->input; // Build the default taskMap based on the class methods $xMethods = get_class_methods('\\OSL\\Controller\Controller'); $r = new ReflectionClass($this); $rMethods = $r->getMethods(ReflectionMethod::IS_PUBLIC); foreach ($rMethods as $rMethod) { $mName = $rMethod->getName(); if (!in_array($mName, $xMethods) || $mName == 'display') { $this->taskMap[strtolower($mName)] = $mName; $this->methods[] = strtolower($mName); } } // Register controller default task if (isset($config['default_task'])) { $this->registerTask('__default', $config['default_task']); } else { $this->registerTask('__default', 'display'); } $this->name = $config['name']; $this->input = $input; $this->task = $input->getCmd('task', 'display'); $lou= $input->get('layout', null); if ($this->task== $lou) { $this->task= ''; } } /** * Execute the given task * * @return $this return itself to support changing * * @throws Exception */ public function execute() { $task = strtolower($this->task); if (empty($task)) { $task = 'display'; } if (isset($this->taskMap[$task])) { $this->task = $task; $doTask = $this->taskMap[$task]; $this->$doTask(); return $this; } throw new Exception(\JText::sprintf('JLIB_APPLICATION_ERROR_TASK_NOT_FOUND', $task), 404); } /** * Method to display a view * * This function is provide as a default implementation, in most cases * you will need to override it in your own controllers. * * @param boolean $cachable If true, the view output will be cached * * @param array $urlparams An array of safe url parameters and their variable types, for valid values see {@link JFilterInput::clean()}. * * @return Controller A RADController object to support chaining. */ public function display($cachable = false, array $urlparams = []) { $document = $this->container->document; if ($document instanceof \JDocument) { $viewType = $document->getType(); } else { $viewType = $this->input->getCmd('format', 'html'); } $viewName = $this->input->get('view', $this->container->defaultView); $viewLayout = $this->input->get('layout', 'default'); // Create view object $view = $this->getView($viewName, $viewType, $viewLayout); // If view has model, create the model, and assign it to the view if ($view->hasModel) { $model = $this->getModel($viewName); $view->setModel($model); } // Render the view $view->display(); return $this; } /** * Method to get a model object, loading it if required. * * @param string $name The model name. Optional. Default will be the controller name * * @param array $config Configuration array for model. Optional. * * @return \OSL\Model\Model The model. */ public function getModel($name = '', array $config = []) { // If name is not given, the model will has same name with controller if (empty($name)) { $name = $this->name; } $model = $this->container->factory->createModel($name, $config); // Populate model state from request data $model->populateState(); return $model; } /** * Method to get instance of a view * * @param string $name The view name * @param string $type The view type * @param string $layout The view layout * * @param array $config Configuration array for view. Optional. * * @return \OSL\View\HtmlView Reference to the view */ public function getView($name, $type = 'html', $layout = 'default', array $config = []) { // Merge config array with default config parameters $config['layout'] = $layout; $config['input'] = $this->input; if (!\JFolder::exists(JPATH_BASE . '/components/' . $this->container->option . '/View/' . ucfirst($name))) { throw new \Exception(\JText::sprintf('View %s not found', $name), 404); } if ($this->container->app->isClient('administrator')) { $config['is_admin_view'] = true; } // Set the default paths for finding the layout if it is not specified in the $config array if (empty($config['paths'])) { $paths = []; $paths[] = JPATH_THEMES . '/' . $this->container->template . '/html/' . $this->container->option . '/' . ucfirst($name); $paths[] = JPATH_BASE . '/components/' . $this->container->option . '/View/' . ucfirst($name) . '/tmpl'; $config['paths'] = $paths; } return $this->container->factory->createView($name, $type, $config); } /** * Sets the internal message that is passed with a redirect * * @param string $text Message to display on redirect. * * @param string $type Message type. Optional, defaults to 'message'. * * @return string Previous message */ public function setMessage($text, $type = 'message') { $previous = $this->message; $this->message = $text; $this->messageType = $type; return $previous; } /** * Set a URL for browser redirection. * * @param string $url URL to redirect to. * * @param string $msg Message to display on redirect. Optional, defaults to value set internally by controller, if any. * * @param string $type Message type. Optional, defaults to 'message' or the type set by a previous call to setMessage. * * @return Controller This object to support chaining. */ public function setRedirect($url, $msg = null, $type = null) { $this->redirect = $url; if ($msg !== null) { // Controller may have set this directly $this->message = $msg; } // Ensure the type is not overwritten by a previous call to setMessage. if (empty($type)) { if (empty($this->messageType)) { $this->messageType = 'message'; } } // If the type is explicitly set, set it. else { $this->messageType = $type; } return $this; } /** * Redirects the browser or returns false if no redirect is set. * * @return boolean False if no redirect exists. */ public function redirect() { if ($this->redirect) { /* @var \JApplicationCms $app */ $app = $this->container->get('app'); $app->enqueueMessage($this->message, $this->messageType); $app->redirect($this->redirect); } return false; } /** * Register (map) a task to a method in the class. * * @param string $task The task name * * @param string $method The name of the method in the derived class to perform for this task. * * @return Controller A Controller object to support chaining. */ public function registerTask($task, $method) { if (in_array(strtolower($method), $this->methods)) { $this->taskMap[strtolower($task)] = $method; } return $this; } /** * Get the application object. * * @return \JApplicationCms The application object. */ public function getApplication() { return $this->container->get('app'); } /** * Get the input object. * * @return Input The input object. */ public function getInput() { return $this->container->get('input'); } /** * Set controller input * * @param Input $input * * @return Input */ public function setInput(Input $input) { $currentInput = $this->input; $this->input = $input; $this->container->set('input', $input); $this->task = $input->getCmd('task', 'display'); return $currentInput; } /** * Get the last task that is being performed or was most recently performed. * * @return string The task that is being performed or was most recently performed. */ public function getTask() { return $this->task; } /** * Set the task for controller * * @param $task */ public function setTask($task) { $this->task = $task; } /** * Magic get method. Handles magic properties: * $this->app mapped to $this->container->app * $this->input mapped to $this->container->input * * @param string $name The property to fetch * * @return mixed|null */ public function __get($name) { $magicProperties = [ 'app', 'option', ]; if (in_array($name, $magicProperties)) { return $this->container->get($name); } // Property not found; raise error $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /** * Check token to prevent CSRF attack */ protected function csrfProtection($method = 'post') { \JSession::checkToken($method) or die(\JText::_('JINVALID_TOKEN')); } } Controller/Download.php 0000644 00000205156 15115511723 0011161 0 ustar 00 <?php /** * @package RAD * @subpackage Controller * * @copyright Copyright (C) 2015 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Controller; defined('_JEXEC') or die; trait Download { /** * Standard method to download file * * @param string $filePath * @param string $filename * @param bool $inline */ protected function processDownloadFile($filePath, $filename = null, $inline = false) { /* @var JApplicationCms $app */ $app = $this->getApplication(); if (!$filename) { $filename = basename($filePath); } $mimeType = $this->getMineType($filename); if (is_array($mimeType)) { $mimeType = $mimeType[0]; } $fileSize = @filesize($filePath); if ($inline) { $contentDisposition = 'inline'; } else { $contentDisposition = 'attachment'; } while (@ob_end_clean()) ; @clearstatcache(); $app->setHeader('Content-Type', $mimeType, true) ->setHeader('Content-Disposition', $contentDisposition . '; filename="' . $filename . '"', true) ->setHeader('Content-Transfer-Encoding', 'binary', true); if ($fileSize > 0) { $app->setHeader('Content-Length', $fileSize, true); } // Disable Cache $app->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true) ->setHeader('Expires', '0', true) ->setHeader('Pragma', 'no-cache', true); $app->sendHeaders(); flush(); if (!$fileSize) { // If the filesize is not reported, hope that readfile works @readfile($filePath); } else { // If the filesize is reported, use 1M chunks for echoing the data to the browser $blocksize = 1048576; //1M chunks $handle = @fopen($filePath, "r"); // Now we need to loop through the file and echo out chunks of file data if ($handle !== false) { while (!@feof($handle)) { echo @fread($handle, $blocksize); @ob_flush(); flush(); } } if ($handle !== false) { @fclose($handle); } } $app->close(); } /** * Get mimetype for a given filename * * @param $fileExt */ protected function getMineType($filename) { $mimeTypes = [ '3dm' => ['x-world/x-3dmf'], '3dmf' => ['x-world/x-3dmf'], '3dml' => ['text/vnd.in3d.3dml'], '3ds' => ['image/x-3ds'], '3g2' => ['video/3gpp2'], '3gp' => ['video/3gpp'], '7z' => ['application/x-7z-compressed'], 'a' => ['application/octet-stream'], 'aab' => ['application/x-authorware-bin'], 'aac' => ['audio/x-aac'], 'aam' => ['application/x-authorware-map'], 'aas' => ['application/x-authorware-seg'], 'abc' => ['text/vnd.abc'], 'abw' => ['application/x-abiword'], 'ac' => ['application/pkix-attr-cert'], 'acc' => ['application/vnd.americandynamics.acc'], 'ace' => ['application/x-ace-compressed'], 'acgi' => ['text/html'], 'acu' => ['application/vnd.acucobol'], 'acutc' => ['application/vnd.acucorp'], 'adp' => ['audio/adpcm'], 'aep' => ['application/vnd.audiograph'], 'afl' => ['video/animaflex'], 'afm' => ['application/x-font-type1'], 'afp' => ['application/vnd.ibm.modcap'], 'ahead' => ['application/vnd.ahead.space'], 'ai' => ['application/postscript'], 'aif' => ['audio/aiff', 'audio/x-aiff'], 'aifc' => ['audio/aiff', 'audio/x-aiff'], 'aiff' => ['audio/aiff', 'audio/x-aiff'], 'aim' => ['application/x-aim'], 'aip' => ['text/x-audiosoft-intra'], 'air' => ['application/vnd.adobe.air-application-installer-package+zip'], 'ait' => ['application/vnd.dvb.ait'], 'ami' => ['application/vnd.amiga.ami'], 'ani' => ['application/x-navi-animation'], 'aos' => ['application/x-nokia-9000-communicator-add-on-software'], 'apk' => ['application/vnd.android.package-archive'], 'appcache' => ['text/cache-manifest'], 'application' => ['application/x-ms-application'], 'apr' => ['application/vnd.lotus-approach'], 'aps' => ['application/mime'], 'arc' => ['application/x-freearc'], 'arj' => ['application/arj', 'application/octet-stream'], 'art' => ['image/x-jg'], 'asc' => ['application/pgp-signature'], 'asf' => ['video/x-ms-asf'], 'asm' => ['text/x-asm'], 'aso' => ['application/vnd.accpac.simply.aso'], 'asp' => ['text/asp'], 'asx' => ['application/x-mplayer2', 'video/x-ms-asf', 'video/x-ms-asf-plugin'], 'atc' => ['application/vnd.acucorp'], 'atom' => ['application/atom+xml'], 'atomcat' => ['application/atomcat+xml'], 'atomsvc' => ['application/atomsvc+xml'], 'atx' => ['application/vnd.antix.game-component'], 'au' => ['audio/basic'], 'avi' => ['application/x-troff-msvideo', 'video/avi', 'video/msvideo', 'video/x-msvideo'], 'avs' => ['video/avs-video'], 'aw' => ['application/applixware'], 'azf' => ['application/vnd.airzip.filesecure.azf'], 'azs' => ['application/vnd.airzip.filesecure.azs'], 'azw' => ['application/vnd.amazon.ebook'], 'bat' => ['application/x-msdownload'], 'bcpio' => ['application/x-bcpio'], 'bdf' => ['application/x-font-bdf'], 'bdm' => ['application/vnd.syncml.dm+wbxml'], 'bed' => ['application/vnd.realvnc.bed'], 'bh2' => ['application/vnd.fujitsu.oasysprs'], 'bin' => ['application/mac-binary', 'application/macbinary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'], 'blb' => ['application/x-blorb'], 'blorb' => ['application/x-blorb'], 'bm' => ['image/bmp'], 'bmi' => ['application/vnd.bmi'], 'bmp' => ['image/bmp', 'image/x-windows-bmp'], 'boo' => ['application/book'], 'book' => ['application/vnd.framemaker'], 'box' => ['application/vnd.previewsystems.box'], 'boz' => ['application/x-bzip2'], 'bpk' => ['application/octet-stream'], 'bsh' => ['application/x-bsh'], 'btif' => ['image/prs.btif'], 'buffer' => ['application/octet-stream'], 'bz' => ['application/x-bzip'], 'bz2' => ['application/x-bzip2'], 'c' => ['text/x-c'], 'c++' => ['text/plain'], 'c11amc' => ['application/vnd.cluetrust.cartomobile-config'], 'c11amz' => ['application/vnd.cluetrust.cartomobile-config-pkg'], 'c4d' => ['application/vnd.clonk.c4group'], 'c4f' => ['application/vnd.clonk.c4group'], 'c4g' => ['application/vnd.clonk.c4group'], 'c4p' => ['application/vnd.clonk.c4group'], 'c4u' => ['application/vnd.clonk.c4group'], 'cab' => ['application/vnd.ms-cab-compressed'], 'caf' => ['audio/x-caf'], 'cap' => ['application/vnd.tcpdump.pcap'], 'car' => ['application/vnd.curl.car'], 'cat' => ['application/vnd.ms-pki.seccat'], 'cb7' => ['application/x-cbr'], 'cba' => ['application/x-cbr'], 'cbr' => ['application/x-cbr'], 'cbt' => ['application/x-cbr'], 'cbz' => ['application/x-cbr'], 'cc' => ['text/plain', 'text/x-c'], 'ccad' => ['application/clariscad'], 'cco' => ['application/x-cocoa'], 'cct' => ['application/x-director'], 'ccxml' => ['application/ccxml+xml'], 'cdbcmsg' => ['application/vnd.contact.cmsg'], 'cdf' => ['application/cdf', 'application/x-cdf', 'application/x-netcdf'], 'cdkey' => ['application/vnd.mediastation.cdkey'], 'cdmia' => ['application/cdmi-capability'], 'cdmic' => ['application/cdmi-container'], 'cdmid' => ['application/cdmi-domain'], 'cdmio' => ['application/cdmi-object'], 'cdmiq' => ['application/cdmi-queue'], 'cdx' => ['chemical/x-cdx'], 'cdxml' => ['application/vnd.chemdraw+xml'], 'cdy' => ['application/vnd.cinderella'], 'cer' => ['application/pkix-cert', 'application/x-x509-ca-cert'], 'cfs' => ['application/x-cfs-compressed'], 'cgm' => ['image/cgm'], 'cha' => ['application/x-chat'], 'chat' => ['application/x-chat'], 'chm' => ['application/vnd.ms-htmlhelp'], 'chrt' => ['application/vnd.kde.kchart'], 'cif' => ['chemical/x-cif'], 'cii' => ['application/vnd.anser-web-certificate-issue-initiation'], 'cil' => ['application/vnd.ms-artgalry'], 'cla' => ['application/vnd.claymore'], 'class' => ['application/java', 'application/java-byte-code', 'application/x-java-class'], 'clkk' => ['application/vnd.crick.clicker.keyboard'], 'clkp' => ['application/vnd.crick.clicker.palette'], 'clkt' => ['application/vnd.crick.clicker.template'], 'clkw' => ['application/vnd.crick.clicker.wordbank'], 'clkx' => ['application/vnd.crick.clicker'], 'clp' => ['application/x-msclip'], 'cmc' => ['application/vnd.cosmocaller'], 'cmdf' => ['chemical/x-cmdf'], 'cml' => ['chemical/x-cml'], 'cmp' => ['application/vnd.yellowriver-custom-menu'], 'cmx' => ['image/x-cmx'], 'cod' => ['application/vnd.rim.cod'], 'com' => ['application/octet-stream', 'text/plain'], 'conf' => ['text/plain'], 'cpio' => ['application/x-cpio'], 'cpp' => ['text/x-c'], 'cpt' => ['application/x-compactpro', 'application/x-cpt'], 'crd' => ['application/x-mscardfile'], 'crl' => ['application/pkcs-crl', 'application/pkix-crl'], 'crt' => ['application/pkix-cert', 'application/x-x509-ca-cert', 'application/x-x509-user-cert'], 'crx' => ['application/x-chrome-extension'], 'cryptonote' => ['application/vnd.rig.cryptonote'], 'csh' => ['application/x-csh', 'text/x-script.csh'], 'csml' => ['chemical/x-csml'], 'csp' => ['application/vnd.commonspace'], 'css' => ['application/x-pointplus', 'text/css'], 'cst' => ['application/x-director'], 'csv' => ['text/csv'], 'cu' => ['application/cu-seeme'], 'curl' => ['text/vnd.curl'], 'cww' => ['application/prs.cww'], 'cxt' => ['application/x-director'], 'cxx' => ['text/x-c'], 'dae' => ['model/vnd.collada+xml'], 'daf' => ['application/vnd.mobius.daf'], 'dart' => ['application/vnd.dart'], 'dataless' => ['application/vnd.fdsn.seed'], 'davmount' => ['application/davmount+xml'], 'dbk' => ['application/docbook+xml'], 'dcr' => ['application/x-director'], 'dcurl' => ['text/vnd.curl.dcurl'], 'dd2' => ['application/vnd.oma.dd2+xml'], 'ddd' => ['application/vnd.fujixerox.ddd'], 'deb' => ['application/x-debian-package'], 'deepv' => ['application/x-deepv'], 'def' => ['text/plain'], 'deploy' => ['application/octet-stream'], 'der' => ['application/x-x509-ca-cert'], 'dfac' => ['application/vnd.dreamfactory'], 'dgc' => ['application/x-dgc-compressed'], 'dic' => ['text/x-c'], 'dif' => ['video/x-dv'], 'diff' => ['text/plain'], 'dir' => ['application/x-director'], 'dis' => ['application/vnd.mobius.dis'], 'dist' => ['application/octet-stream'], 'distz' => ['application/octet-stream'], 'djv' => ['image/vnd.djvu'], 'djvu' => ['image/vnd.djvu'], 'dl' => ['video/dl', 'video/x-dl'], 'dll' => ['application/x-msdownload'], 'dmg' => ['application/x-apple-diskimage'], 'dmp' => ['application/vnd.tcpdump.pcap'], 'dms' => ['application/octet-stream'], 'dna' => ['application/vnd.dna'], 'doc' => ['application/msword'], 'docm' => ['application/vnd.ms-word.document.macroenabled.12'], 'docx' => ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'], 'dot' => ['application/msword'], 'dotm' => ['application/vnd.ms-word.template.macroenabled.12'], 'dotx' => ['application/vnd.openxmlformats-officedocument.wordprocessingml.template'], 'dp' => ['application/vnd.osgi.dp'], 'dpg' => ['application/vnd.dpgraph'], 'dra' => ['audio/vnd.dra'], 'drw' => ['application/drafting'], 'dsc' => ['text/prs.lines.tag'], 'dssc' => ['application/dssc+der'], 'dtb' => ['application/x-dtbook+xml'], 'dtd' => ['application/xml-dtd'], 'dts' => ['audio/vnd.dts'], 'dtshd' => ['audio/vnd.dts.hd'], 'dump' => ['application/octet-stream'], 'dv' => ['video/x-dv'], 'dvb' => ['video/vnd.dvb.file'], 'dvi' => ['application/x-dvi'], 'dwf' => ['drawing/x-dwf (old)', 'model/vnd.dwf'], 'dwg' => ['application/acad', 'image/vnd.dwg', 'image/x-dwg'], 'dxf' => ['image/vnd.dxf'], 'dxp' => ['application/vnd.spotfire.dxp'], 'dxr' => ['application/x-director'], 'ecelp4800' => ['audio/vnd.nuera.ecelp4800'], 'ecelp7470' => ['audio/vnd.nuera.ecelp7470'], 'ecelp9600' => ['audio/vnd.nuera.ecelp9600'], 'ecma' => ['application/ecmascript'], 'edm' => ['application/vnd.novadigm.edm'], 'edx' => ['application/vnd.novadigm.edx'], 'efif' => ['application/vnd.picsel'], 'ei6' => ['application/vnd.pg.osasli'], 'el' => ['text/x-script.elisp'], 'elc' => ['application/x-bytecode.elisp (compiled elisp)', 'application/x-elc'], 'emf' => ['application/x-msmetafile'], 'eml' => ['message/rfc822'], 'emma' => ['application/emma+xml'], 'emz' => ['application/x-msmetafile'], 'env' => ['application/x-envoy'], 'eol' => ['audio/vnd.digital-winds'], 'eot' => ['application/vnd.ms-fontobject'], 'eps' => ['application/postscript'], 'epub' => ['application/epub+zip'], 'es' => ['application/x-esrehber'], 'es3' => ['application/vnd.eszigno3+xml'], 'esa' => ['application/vnd.osgi.subsystem'], 'esf' => ['application/vnd.epson.esf'], 'et3' => ['application/vnd.eszigno3+xml'], 'etx' => ['text/x-setext'], 'eva' => ['application/x-eva'], 'event-stream' => ['text/event-stream'], 'evy' => ['application/envoy', 'application/x-envoy'], 'exe' => ['application/x-msdownload'], 'exi' => ['application/exi'], 'ext' => ['application/vnd.novadigm.ext'], 'ez' => ['application/andrew-inset'], 'ez2' => ['application/vnd.ezpix-album'], 'ez3' => ['application/vnd.ezpix-package'], 'f' => ['text/plain', 'text/x-fortran'], 'f4v' => ['video/x-f4v'], 'f77' => ['text/x-fortran'], 'f90' => ['text/plain', 'text/x-fortran'], 'fbs' => ['image/vnd.fastbidsheet'], 'fcdt' => ['application/vnd.adobe.formscentral.fcdt'], 'fcs' => ['application/vnd.isac.fcs'], 'fdf' => ['application/vnd.fdf'], 'fe_launch' => ['application/vnd.denovo.fcselayout-link'], 'fg5' => ['application/vnd.fujitsu.oasysgp'], 'fgd' => ['application/x-director'], 'fh' => ['image/x-freehand'], 'fh4' => ['image/x-freehand'], 'fh5' => ['image/x-freehand'], 'fh7' => ['image/x-freehand'], 'fhc' => ['image/x-freehand'], 'fif' => ['application/fractals', 'image/fif'], 'fig' => ['application/x-xfig'], 'flac' => ['audio/flac'], 'fli' => ['video/fli', 'video/x-fli'], 'flo' => ['application/vnd.micrografx.flo'], 'flv' => ['video/x-flv'], 'flw' => ['application/vnd.kde.kivio'], 'flx' => ['text/vnd.fmi.flexstor'], 'fly' => ['text/vnd.fly'], 'fm' => ['application/vnd.framemaker'], 'fmf' => ['video/x-atomic3d-feature'], 'fnc' => ['application/vnd.frogans.fnc'], 'for' => ['text/plain', 'text/x-fortran'], 'fpx' => ['image/vnd.fpx', 'image/vnd.net-fpx'], 'frame' => ['application/vnd.framemaker'], 'frl' => ['application/freeloader'], 'fsc' => ['application/vnd.fsc.weblaunch'], 'fst' => ['image/vnd.fst'], 'ftc' => ['application/vnd.fluxtime.clip'], 'fti' => ['application/vnd.anser-web-funds-transfer-initiation'], 'funk' => ['audio/make'], 'fvt' => ['video/vnd.fvt'], 'fxp' => ['application/vnd.adobe.fxp'], 'fxpl' => ['application/vnd.adobe.fxp'], 'fzs' => ['application/vnd.fuzzysheet'], 'g' => ['text/plain'], 'g2w' => ['application/vnd.geoplan'], 'g3' => ['image/g3fax'], 'g3w' => ['application/vnd.geospace'], 'gac' => ['application/vnd.groove-account'], 'gam' => ['application/x-tads'], 'gbr' => ['application/rpki-ghostbusters'], 'gca' => ['application/x-gca-compressed'], 'gdl' => ['model/vnd.gdl'], 'geo' => ['application/vnd.dynageo'], 'gex' => ['application/vnd.geometry-explorer'], 'ggb' => ['application/vnd.geogebra.file'], 'ggt' => ['application/vnd.geogebra.tool'], 'ghf' => ['application/vnd.groove-help'], 'gif' => ['image/gif'], 'gim' => ['application/vnd.groove-identity-message'], 'gl' => ['video/gl', 'video/x-gl'], 'gml' => ['application/gml+xml'], 'gmx' => ['application/vnd.gmx'], 'gnumeric' => ['application/x-gnumeric'], 'gph' => ['application/vnd.flographit'], 'gpx' => ['application/gpx+xml'], 'gqf' => ['application/vnd.grafeq'], 'gqs' => ['application/vnd.grafeq'], 'gram' => ['application/srgs'], 'gramps' => ['application/x-gramps-xml'], 'gre' => ['application/vnd.geometry-explorer'], 'grv' => ['application/vnd.groove-injector'], 'grxml' => ['application/srgs+xml'], 'gsd' => ['audio/x-gsm'], 'gsf' => ['application/x-font-ghostscript'], 'gsm' => ['audio/x-gsm'], 'gsp' => ['application/x-gsp'], 'gss' => ['application/x-gss'], 'gtar' => ['application/x-gtar'], 'gtm' => ['application/vnd.groove-tool-message'], 'gtw' => ['model/vnd.gtw'], 'gv' => ['text/vnd.graphviz'], 'gxf' => ['application/gxf'], 'gxt' => ['application/vnd.geonext'], 'gz' => ['application/x-compressed', 'application/x-gzip'], 'gzip' => ['application/x-gzip', 'multipart/x-gzip'], 'h' => ['text/plain', 'text/x-h'], 'h261' => ['video/h261'], 'h263' => ['video/h263'], 'h264' => ['video/h264'], 'hal' => ['application/vnd.hal+xml'], 'hbci' => ['application/vnd.hbci'], 'hdf' => ['application/x-hdf'], 'help' => ['application/x-helpfile'], 'hgl' => ['application/vnd.hp-hpgl'], 'hh' => ['text/plain', 'text/x-h'], 'hlb' => ['text/x-script'], 'hlp' => ['application/hlp', 'application/x-helpfile', 'application/x-winhelp'], 'hpg' => ['application/vnd.hp-hpgl'], 'hpgl' => ['application/vnd.hp-hpgl'], 'hpid' => ['application/vnd.hp-hpid'], 'hps' => ['application/vnd.hp-hps'], 'hqx' => ['application/binhex', 'application/binhex4', 'application/mac-binhex', 'application/mac-binhex40', 'application/x-binhex40', 'application/x-mac-binhex40'], 'hta' => ['application/hta'], 'htc' => ['text/x-component'], 'htke' => ['application/vnd.kenameaapp'], 'htm' => ['text/html'], 'html' => ['text/html'], 'htmls' => ['text/html'], 'htt' => ['text/webviewhtml'], 'htx' => ['text/html'], 'hvd' => ['application/vnd.yamaha.hv-dic'], 'hvp' => ['application/vnd.yamaha.hv-voice'], 'hvs' => ['application/vnd.yamaha.hv-script'], 'i2g' => ['application/vnd.intergeo'], 'icc' => ['application/vnd.iccprofile'], 'ice' => ['x-conference/x-cooltalk'], 'icm' => ['application/vnd.iccprofile'], 'ico' => ['image/x-icon'], 'ics' => ['text/calendar'], 'idc' => ['text/plain'], 'ief' => ['image/ief'], 'iefs' => ['image/ief'], 'ifb' => ['text/calendar'], 'ifm' => ['application/vnd.shana.informed.formdata'], 'iges' => ['application/iges', 'model/iges'], 'igl' => ['application/vnd.igloader'], 'igm' => ['application/vnd.insors.igm'], 'igs' => ['application/iges', 'model/iges'], 'igx' => ['application/vnd.micrografx.igx'], 'iif' => ['application/vnd.shana.informed.interchange'], 'ima' => ['application/x-ima'], 'imap' => ['application/x-httpd-imap'], 'imp' => ['application/vnd.accpac.simply.imp'], 'ims' => ['application/vnd.ms-ims'], 'in' => ['text/plain'], 'inf' => ['application/inf'], 'ink' => ['application/inkml+xml'], 'inkml' => ['application/inkml+xml'], 'ins' => ['application/x-internett-signup'], 'install' => ['application/x-install-instructions'], 'iota' => ['application/vnd.astraea-software.iota'], 'ip' => ['application/x-ip2'], 'ipfix' => ['application/ipfix'], 'ipk' => ['application/vnd.shana.informed.package'], 'irm' => ['application/vnd.ibm.rights-management'], 'irp' => ['application/vnd.irepository.package+xml'], 'iso' => ['application/x-iso9660-image'], 'isu' => ['video/x-isvideo'], 'it' => ['audio/it'], 'itp' => ['application/vnd.shana.informed.formtemplate'], 'iv' => ['application/x-inventor'], 'ivp' => ['application/vnd.immervision-ivp'], 'ivr' => ['i-world/i-vrml'], 'ivu' => ['application/vnd.immervision-ivu'], 'ivy' => ['application/x-livescreen'], 'jad' => ['text/vnd.sun.j2me.app-descriptor'], 'jam' => ['application/vnd.jam'], 'jar' => ['application/java-archive'], 'jav' => ['text/plain', 'text/x-java-source'], 'java' => ['text/plain', 'text/x-java-source'], 'jcm' => ['application/x-java-commerce'], 'jfif' => ['image/jpeg', 'image/pjpeg'], 'jfif-tbnl' => ['image/jpeg'], 'jisp' => ['application/vnd.jisp'], 'jlt' => ['application/vnd.hp-jlyt'], 'jnlp' => ['application/x-java-jnlp-file'], 'joda' => ['application/vnd.joost.joda-archive'], 'jpe' => ['image/jpeg', 'image/pjpeg'], 'jpeg' => ['image/jpeg', 'image/pjpeg'], 'jpg' => ['image/jpeg', 'image/pjpeg'], 'jpgm' => ['video/jpm'], 'jpgv' => ['video/jpeg'], 'jpm' => ['video/jpm'], 'jps' => ['image/x-jps'], 'js' => ['application/javascript'], 'json' => ['application/json', 'text/plain'], 'jsonml' => ['application/jsonml+json'], 'jut' => ['image/jutvision'], 'kar' => ['audio/midi', 'music/x-karaoke'], 'karbon' => ['application/vnd.kde.karbon'], 'kfo' => ['application/vnd.kde.kformula'], 'kia' => ['application/vnd.kidspiration'], 'kil' => ['application/x-killustrator'], 'kml' => ['application/vnd.google-earth.kml+xml'], 'kmz' => ['application/vnd.google-earth.kmz'], 'kne' => ['application/vnd.kinar'], 'knp' => ['application/vnd.kinar'], 'kon' => ['application/vnd.kde.kontour'], 'kpr' => ['application/vnd.kde.kpresenter'], 'kpt' => ['application/vnd.kde.kpresenter'], 'kpxx' => ['application/vnd.ds-keypoint'], 'ksh' => ['application/x-ksh', 'text/x-script.ksh'], 'ksp' => ['application/vnd.kde.kspread'], 'ktr' => ['application/vnd.kahootz'], 'ktx' => ['image/ktx'], 'ktz' => ['application/vnd.kahootz'], 'kwd' => ['application/vnd.kde.kword'], 'kwt' => ['application/vnd.kde.kword'], 'la' => ['audio/nspaudio', 'audio/x-nspaudio'], 'lam' => ['audio/x-liveaudio'], 'lasxml' => ['application/vnd.las.las+xml'], 'latex' => ['application/x-latex'], 'lbd' => ['application/vnd.llamagraphics.life-balance.desktop'], 'lbe' => ['application/vnd.llamagraphics.life-balance.exchange+xml'], 'les' => ['application/vnd.hhe.lesson-player'], 'lha' => ['application/lha', 'application/octet-stream', 'application/x-lha'], 'lhx' => ['application/octet-stream'], 'link66' => ['application/vnd.route66.link66+xml'], 'list' => ['text/plain'], 'list3820' => ['application/vnd.ibm.modcap'], 'listafp' => ['application/vnd.ibm.modcap'], 'lma' => ['audio/nspaudio', 'audio/x-nspaudio'], 'lnk' => ['application/x-ms-shortcut'], 'log' => ['text/plain'], 'lostxml' => ['application/lost+xml'], 'lrf' => ['application/octet-stream'], 'lrm' => ['application/vnd.ms-lrm'], 'lsp' => ['application/x-lisp', 'text/x-script.lisp'], 'lst' => ['text/plain'], 'lsx' => ['text/x-la-asf'], 'ltf' => ['application/vnd.frogans.ltf'], 'ltx' => ['application/x-latex'], 'lua' => ['text/x-lua'], 'luac' => ['application/x-lua-bytecode'], 'lvp' => ['audio/vnd.lucent.voice'], 'lwp' => ['application/vnd.lotus-wordpro'], 'lzh' => ['application/octet-stream', 'application/x-lzh'], 'lzx' => ['application/lzx', 'application/octet-stream', 'application/x-lzx'], 'm' => ['text/plain', 'text/x-m'], 'm13' => ['application/x-msmediaview'], 'm14' => ['application/x-msmediaview'], 'm1v' => ['video/mpeg'], 'm21' => ['application/mp21'], 'm2a' => ['audio/mpeg'], 'm2v' => ['video/mpeg'], 'm3a' => ['audio/mpeg'], 'm3u' => ['audio/x-mpegurl'], 'm3u8' => ['application/x-mpegURL'], 'm4a' => ['audio/mp4'], 'm4p' => ['application/mp4'], 'm4u' => ['video/vnd.mpegurl'], 'm4v' => ['video/x-m4v'], 'ma' => ['application/mathematica'], 'mads' => ['application/mads+xml'], 'mag' => ['application/vnd.ecowin.chart'], 'maker' => ['application/vnd.framemaker'], 'man' => ['text/troff'], 'manifest' => ['text/cache-manifest'], 'map' => ['application/x-navimap'], 'mar' => ['application/octet-stream'], 'markdown' => ['text/x-markdown'], 'mathml' => ['application/mathml+xml'], 'mb' => ['application/mathematica'], 'mbd' => ['application/mbedlet'], 'mbk' => ['application/vnd.mobius.mbk'], 'mbox' => ['application/mbox'], 'mc' => ['application/x-magic-cap-package-1.0'], 'mc1' => ['application/vnd.medcalcdata'], 'mcd' => ['application/mcad', 'application/x-mathcad'], 'mcf' => ['image/vasa', 'text/mcf'], 'mcp' => ['application/netmc'], 'mcurl' => ['text/vnd.curl.mcurl'], 'md' => ['text/x-markdown'], 'mdb' => ['application/x-msaccess'], 'mdi' => ['image/vnd.ms-modi'], 'me' => ['text/troff'], 'mesh' => ['model/mesh'], 'meta4' => ['application/metalink4+xml'], 'metalink' => ['application/metalink+xml'], 'mets' => ['application/mets+xml'], 'mfm' => ['application/vnd.mfmp'], 'mft' => ['application/rpki-manifest'], 'mgp' => ['application/vnd.osgeo.mapguide.package'], 'mgz' => ['application/vnd.proteus.magazine'], 'mht' => ['message/rfc822'], 'mhtml' => ['message/rfc822'], 'mid' => ['application/x-midi', 'audio/midi', 'audio/x-mid', 'audio/x-midi', 'music/crescendo', 'x-music/x-midi'], 'midi' => ['application/x-midi', 'audio/midi', 'audio/x-mid', 'audio/x-midi', 'music/crescendo', 'x-music/x-midi'], 'mie' => ['application/x-mie'], 'mif' => ['application/x-frame', 'application/x-mif'], 'mime' => ['message/rfc822', 'www/mime'], 'mj2' => ['video/mj2'], 'mjf' => ['audio/x-vnd.audioexplosion.mjuicemediafile'], 'mjp2' => ['video/mj2'], 'mjpg' => ['video/x-motion-jpeg'], 'mk3d' => ['video/x-matroska'], 'mka' => ['audio/x-matroska'], 'mkd' => ['text/x-markdown'], 'mks' => ['video/x-matroska'], 'mkv' => ['video/x-matroska'], 'mlp' => ['application/vnd.dolby.mlp'], 'mm' => ['application/base64', 'application/x-meme'], 'mmd' => ['application/vnd.chipnuts.karaoke-mmd'], 'mme' => ['application/base64'], 'mmf' => ['application/vnd.smaf'], 'mmr' => ['image/vnd.fujixerox.edmics-mmr'], 'mng' => ['video/x-mng'], 'mny' => ['application/x-msmoney'], 'mobi' => ['application/x-mobipocket-ebook'], 'mod' => ['audio/mod', 'audio/x-mod'], 'mods' => ['application/mods+xml'], 'moov' => ['video/quicktime'], 'mov' => ['video/quicktime'], 'movie' => ['video/x-sgi-movie'], 'mp2' => ['audio/mpeg', 'audio/x-mpeg', 'video/mpeg', 'video/x-mpeg', 'video/x-mpeq2a'], 'mp21' => ['application/mp21'], 'mp2a' => ['audio/mpeg'], 'mp3' => ['audio/mpeg3', 'audio/x-mpeg-3', 'video/mpeg', 'video/x-mpeg'], 'mp4' => ['video/mp4'], 'mp4a' => ['audio/mp4'], 'mp4s' => ['application/mp4'], 'mp4v' => ['video/mp4'], 'mpa' => ['audio/mpeg', 'video/mpeg'], 'mpc' => ['application/vnd.mophun.certificate'], 'mpe' => ['video/mpeg'], 'mpeg' => ['video/mpeg'], 'mpg' => ['audio/mpeg', 'video/mpeg'], 'mpg4' => ['video/mp4'], 'mpga' => ['audio/mpeg'], 'mpkg' => ['application/vnd.apple.installer+xml'], 'mpm' => ['application/vnd.blueice.multipass'], 'mpn' => ['application/vnd.mophun.application'], 'mpp' => ['application/vnd.ms-project'], 'mpt' => ['application/vnd.ms-project'], 'mpv' => ['application/x-project'], 'mpx' => ['application/x-project'], 'mpy' => ['application/vnd.ibm.minipay'], 'mqy' => ['application/vnd.mobius.mqy'], 'mrc' => ['application/marc'], 'mrcx' => ['application/marcxml+xml'], 'ms' => ['text/troff'], 'mscml' => ['application/mediaservercontrol+xml'], 'mseed' => ['application/vnd.fdsn.mseed'], 'mseq' => ['application/vnd.mseq'], 'msf' => ['application/vnd.epson.msf'], 'msh' => ['model/mesh'], 'msi' => ['application/x-msdownload'], 'msl' => ['application/vnd.mobius.msl'], 'msty' => ['application/vnd.muvee.style'], 'mts' => ['model/vnd.mts'], 'mus' => ['application/vnd.musician'], 'musicxml' => ['application/vnd.recordare.musicxml+xml'], 'mv' => ['video/x-sgi-movie'], 'mvb' => ['application/x-msmediaview'], 'mwf' => ['application/vnd.mfer'], 'mxf' => ['application/mxf'], 'mxl' => ['application/vnd.recordare.musicxml'], 'mxml' => ['application/xv+xml'], 'mxs' => ['application/vnd.triscape.mxs'], 'mxu' => ['video/vnd.mpegurl'], 'my' => ['audio/make'], 'mzz' => ['application/x-vnd.audioexplosion.mzz'], 'n-gage' => ['application/vnd.nokia.n-gage.symbian.install'], 'n3' => ['text/n3'], 'nap' => ['image/naplps'], 'naplps' => ['image/naplps'], 'nb' => ['application/mathematica'], 'nbp' => ['application/vnd.wolfram.player'], 'nc' => ['application/x-netcdf'], 'ncm' => ['application/vnd.nokia.configuration-message'], 'ncx' => ['application/x-dtbncx+xml'], 'nfo' => ['text/x-nfo'], 'ngdat' => ['application/vnd.nokia.n-gage.data'], 'nif' => ['image/x-niff'], 'niff' => ['image/x-niff'], 'nitf' => ['application/vnd.nitf'], 'nix' => ['application/x-mix-transfer'], 'nlu' => ['application/vnd.neurolanguage.nlu'], 'nml' => ['application/vnd.enliven'], 'nnd' => ['application/vnd.noblenet-directory'], 'nns' => ['application/vnd.noblenet-sealer'], 'nnw' => ['application/vnd.noblenet-web'], 'npx' => ['image/vnd.net-fpx'], 'nsc' => ['application/x-conference'], 'nsf' => ['application/vnd.lotus-notes'], 'ntf' => ['application/vnd.nitf'], 'nvd' => ['application/x-navidoc'], 'nws' => ['message/rfc822'], 'nzb' => ['application/x-nzb'], 'o' => ['application/octet-stream'], 'oa2' => ['application/vnd.fujitsu.oasys2'], 'oa3' => ['application/vnd.fujitsu.oasys3'], 'oas' => ['application/vnd.fujitsu.oasys'], 'obd' => ['application/x-msbinder'], 'obj' => ['application/x-tgif'], 'oda' => ['application/oda'], 'odb' => ['application/vnd.oasis.opendocument.database'], 'odc' => ['application/vnd.oasis.opendocument.chart'], 'odf' => ['application/vnd.oasis.opendocument.formula'], 'odft' => ['application/vnd.oasis.opendocument.formula-template'], 'odg' => ['application/vnd.oasis.opendocument.graphics'], 'odi' => ['application/vnd.oasis.opendocument.image'], 'odm' => ['application/vnd.oasis.opendocument.text-master'], 'odp' => ['application/vnd.oasis.opendocument.presentation'], 'ods' => ['application/vnd.oasis.opendocument.spreadsheet'], 'odt' => ['application/vnd.oasis.opendocument.text'], 'oga' => ['audio/ogg'], 'ogg' => ['audio/ogg'], 'ogv' => ['video/ogg'], 'ogx' => ['application/ogg'], 'omc' => ['application/x-omc'], 'omcd' => ['application/x-omcdatamaker'], 'omcr' => ['application/x-omcregerator'], 'omdoc' => ['application/omdoc+xml'], 'onepkg' => ['application/onenote'], 'onetmp' => ['application/onenote'], 'onetoc' => ['application/onenote'], 'onetoc2' => ['application/onenote'], 'opf' => ['application/oebps-package+xml'], 'opml' => ['text/x-opml'], 'oprc' => ['application/vnd.palm'], 'org' => ['application/vnd.lotus-organizer'], 'osf' => ['application/vnd.yamaha.openscoreformat'], 'osfpvg' => ['application/vnd.yamaha.openscoreformat.osfpvg+xml'], 'otc' => ['application/vnd.oasis.opendocument.chart-template'], 'otf' => ['font/opentype'], 'otg' => ['application/vnd.oasis.opendocument.graphics-template'], 'oth' => ['application/vnd.oasis.opendocument.text-web'], 'oti' => ['application/vnd.oasis.opendocument.image-template'], 'otm' => ['application/vnd.oasis.opendocument.text-master'], 'otp' => ['application/vnd.oasis.opendocument.presentation-template'], 'ots' => ['application/vnd.oasis.opendocument.spreadsheet-template'], 'ott' => ['application/vnd.oasis.opendocument.text-template'], 'oxps' => ['application/oxps'], 'oxt' => ['application/vnd.openofficeorg.extension'], 'p' => ['text/x-pascal'], 'p10' => ['application/pkcs10', 'application/x-pkcs10'], 'p12' => ['application/pkcs-12', 'application/x-pkcs12'], 'p7a' => ['application/x-pkcs7-signature'], 'p7b' => ['application/x-pkcs7-certificates'], 'p7c' => ['application/pkcs7-mime', 'application/x-pkcs7-mime'], 'p7m' => ['application/pkcs7-mime', 'application/x-pkcs7-mime'], 'p7r' => ['application/x-pkcs7-certreqresp'], 'p7s' => ['application/pkcs7-signature'], 'p8' => ['application/pkcs8'], 'part' => ['application/pro_eng'], 'pas' => ['text/x-pascal'], 'paw' => ['application/vnd.pawaafile'], 'pbd' => ['application/vnd.powerbuilder6'], 'pbm' => ['image/x-portable-bitmap'], 'pcap' => ['application/vnd.tcpdump.pcap'], 'pcf' => ['application/x-font-pcf'], 'pcl' => ['application/vnd.hp-pcl', 'application/x-pcl'], 'pclxl' => ['application/vnd.hp-pclxl'], 'pct' => ['image/x-pict'], 'pcurl' => ['application/vnd.curl.pcurl'], 'pcx' => ['image/x-pcx'], 'pdb' => ['application/vnd.palm'], 'pdf' => ['application/pdf'], 'pfa' => ['application/x-font-type1'], 'pfb' => ['application/x-font-type1'], 'pfm' => ['application/x-font-type1'], 'pfr' => ['application/font-tdpfr'], 'pfunk' => ['audio/make'], 'pfx' => ['application/x-pkcs12'], 'pgm' => ['image/x-portable-graymap'], 'pgn' => ['application/x-chess-pgn'], 'pgp' => ['application/pgp-encrypted'], 'php' => ['text/x-php'], 'pic' => ['image/x-pict'], 'pict' => ['image/pict'], 'pkg' => ['application/octet-stream'], 'pki' => ['application/pkixcmp'], 'pkipath' => ['application/pkix-pkipath'], 'pko' => ['application/vnd.ms-pki.pko'], 'pl' => ['text/plain', 'text/x-script.perl'], 'plb' => ['application/vnd.3gpp.pic-bw-large'], 'plc' => ['application/vnd.mobius.plc'], 'plf' => ['application/vnd.pocketlearn'], 'pls' => ['application/pls+xml'], 'plx' => ['application/x-pixclscript'], 'pm' => ['image/x-xpixmap', 'text/x-script.perl-module'], 'pm4' => ['application/x-pagemaker'], 'pm5' => ['application/x-pagemaker'], 'pml' => ['application/vnd.ctc-posml'], 'png' => ['image/png'], 'pnm' => ['application/x-portable-anymap', 'image/x-portable-anymap'], 'portpkg' => ['application/vnd.macports.portpkg'], 'pot' => ['application/mspowerpoint', 'application/vnd.ms-powerpoint'], 'potm' => ['application/vnd.ms-powerpoint.template.macroenabled.12'], 'potx' => ['application/vnd.openxmlformats-officedocument.presentationml.template'], 'pov' => ['model/x-pov'], 'ppa' => ['application/vnd.ms-powerpoint'], 'ppam' => ['application/vnd.ms-powerpoint.addin.macroenabled.12'], 'ppd' => ['application/vnd.cups-ppd'], 'ppm' => ['image/x-portable-pixmap'], 'pps' => ['application/mspowerpoint', 'application/vnd.ms-powerpoint'], 'ppsm' => ['application/vnd.ms-powerpoint.slideshow.macroenabled.12'], 'ppsx' => ['application/vnd.openxmlformats-officedocument.presentationml.slideshow'], 'ppt' => ['application/mspowerpoint', 'application/powerpoint', 'application/vnd.ms-powerpoint', 'application/x-mspowerpoint'], 'pptm' => ['application/vnd.ms-powerpoint.presentation.macroenabled.12'], 'pptx' => ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], 'ppz' => ['application/mspowerpoint'], 'pqa' => ['application/vnd.palm'], 'prc' => ['application/x-mobipocket-ebook'], 'pre' => ['application/vnd.lotus-freelance'], 'prf' => ['application/pics-rules'], 'prt' => ['application/pro_eng'], 'ps' => ['application/postscript'], 'psb' => ['application/vnd.3gpp.pic-bw-small'], 'psd' => ['image/vnd.adobe.photoshop'], 'psf' => ['application/x-font-linux-psf'], 'pskcxml' => ['application/pskc+xml'], 'ptid' => ['application/vnd.pvi.ptid1'], 'pub' => ['application/x-mspublisher'], 'pvb' => ['application/vnd.3gpp.pic-bw-var'], 'pvu' => ['paleovu/x-pv'], 'pwn' => ['application/vnd.3m.post-it-notes'], 'pwz' => ['application/vnd.ms-powerpoint'], 'py' => ['text/x-script.phyton'], 'pya' => ['audio/vnd.ms-playready.media.pya'], 'pyc' => ['applicaiton/x-bytecode.python'], 'pyo' => ['application/x-python-code'], 'pyv' => ['video/vnd.ms-playready.media.pyv'], 'qam' => ['application/vnd.epson.quickanime'], 'qbo' => ['application/vnd.intu.qbo'], 'qcp' => ['audio/vnd.qcelp'], 'qd3' => ['x-world/x-3dmf'], 'qd3d' => ['x-world/x-3dmf'], 'qfx' => ['application/vnd.intu.qfx'], 'qif' => ['image/x-quicktime'], 'qps' => ['application/vnd.publishare-delta-tree'], 'qt' => ['video/quicktime'], 'qtc' => ['video/x-qtc'], 'qti' => ['image/x-quicktime'], 'qtif' => ['image/x-quicktime'], 'qwd' => ['application/vnd.quark.quarkxpress'], 'qwt' => ['application/vnd.quark.quarkxpress'], 'qxb' => ['application/vnd.quark.quarkxpress'], 'qxd' => ['application/vnd.quark.quarkxpress'], 'qxl' => ['application/vnd.quark.quarkxpress'], 'qxt' => ['application/vnd.quark.quarkxpress'], 'ra' => ['audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin', 'audio/x-realaudio'], 'ram' => ['audio/x-pn-realaudio'], 'rar' => ['application/x-rar-compressed'], 'ras' => ['application/x-cmu-raster', 'image/cmu-raster', 'image/x-cmu-raster'], 'rast' => ['image/cmu-raster'], 'rcprofile' => ['application/vnd.ipunplugged.rcprofile'], 'rdf' => ['application/rdf+xml'], 'rdz' => ['application/vnd.data-vision.rdz'], 'rep' => ['application/vnd.businessobjects'], 'res' => ['application/x-dtbresource+xml'], 'rexx' => ['text/x-script.rexx'], 'rf' => ['image/vnd.rn-realflash'], 'rgb' => ['image/x-rgb'], 'rif' => ['application/reginfo+xml'], 'rip' => ['audio/vnd.rip'], 'ris' => ['application/x-research-info-systems'], 'rl' => ['application/resource-lists+xml'], 'rlc' => ['image/vnd.fujixerox.edmics-rlc'], 'rld' => ['application/resource-lists-diff+xml'], 'rm' => ['application/vnd.rn-realmedia', 'audio/x-pn-realaudio'], 'rmi' => ['audio/midi'], 'rmm' => ['audio/x-pn-realaudio'], 'rmp' => ['audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin'], 'rms' => ['application/vnd.jcp.javame.midlet-rms'], 'rmvb' => ['application/vnd.rn-realmedia-vbr'], 'rnc' => ['application/relax-ng-compact-syntax'], 'rng' => ['application/ringing-tones', 'application/vnd.nokia.ringing-tone'], 'rnx' => ['application/vnd.rn-realplayer'], 'roa' => ['application/rpki-roa'], 'roff' => ['text/troff'], 'rp' => ['image/vnd.rn-realpix'], 'rp9' => ['application/vnd.cloanto.rp9'], 'rpm' => ['audio/x-pn-realaudio-plugin'], 'rpss' => ['application/vnd.nokia.radio-presets'], 'rpst' => ['application/vnd.nokia.radio-preset'], 'rq' => ['application/sparql-query'], 'rs' => ['application/rls-services+xml'], 'rsd' => ['application/rsd+xml'], 'rss' => ['application/rss+xml'], 'rt' => ['text/richtext', 'text/vnd.rn-realtext'], 'rtf' => ['application/rtf', 'application/x-rtf', 'text/richtext'], 'rtx' => ['application/rtf', 'text/richtext'], 'rv' => ['video/vnd.rn-realvideo'], 's' => ['text/x-asm'], 's3m' => ['audio/s3m'], 'saf' => ['application/vnd.yamaha.smaf-audio'], 'saveme' => ['aapplication/octet-stream'], 'sbk' => ['application/x-tbook'], 'sbml' => ['application/sbml+xml'], 'sc' => ['application/vnd.ibm.secure-container'], 'scd' => ['application/x-msschedule'], 'scm' => ['application/x-lotusscreencam', 'text/x-script.guile', 'text/x-script.scheme', 'video/x-scm'], 'scq' => ['application/scvp-cv-request'], 'scs' => ['application/scvp-cv-response'], 'scurl' => ['text/vnd.curl.scurl'], 'sda' => ['application/vnd.stardivision.draw'], 'sdc' => ['application/vnd.stardivision.calc'], 'sdd' => ['application/vnd.stardivision.impress'], 'sdkd' => ['application/vnd.solent.sdkm+xml'], 'sdkm' => ['application/vnd.solent.sdkm+xml'], 'sdml' => ['text/plain'], 'sdp' => ['application/sdp', 'application/x-sdp'], 'sdr' => ['application/sounder'], 'sdw' => ['application/vnd.stardivision.writer'], 'sea' => ['application/sea', 'application/x-sea'], 'see' => ['application/vnd.seemail'], 'seed' => ['application/vnd.fdsn.seed'], 'sema' => ['application/vnd.sema'], 'semd' => ['application/vnd.semd'], 'semf' => ['application/vnd.semf'], 'ser' => ['application/java-serialized-object'], 'set' => ['application/set'], 'setpay' => ['application/set-payment-initiation'], 'setreg' => ['application/set-registration-initiation'], 'sfd-hdstx' => ['application/vnd.hydrostatix.sof-data'], 'sfs' => ['application/vnd.spotfire.sfs'], 'sfv' => ['text/x-sfv'], 'sgi' => ['image/sgi'], 'sgl' => ['application/vnd.stardivision.writer-global'], 'sgm' => ['text/sgml', 'text/x-sgml'], 'sgml' => ['text/sgml', 'text/x-sgml'], 'sh' => ['application/x-bsh', 'application/x-sh', 'application/x-shar', 'text/x-script.sh'], 'shar' => ['application/x-bsh', 'application/x-shar'], 'shf' => ['application/shf+xml'], 'shtml' => ['text/html', 'text/x-server-parsed-html'], 'si' => ['text/vnd.wap.si'], 'sic' => ['application/vnd.wap.sic'], 'sid' => ['image/x-mrsid-image'], 'sig' => ['application/pgp-signature'], 'sil' => ['audio/silk'], 'silo' => ['model/mesh'], 'sis' => ['application/vnd.symbian.install'], 'sisx' => ['application/vnd.symbian.install'], 'sit' => ['application/x-sit', 'application/x-stuffit'], 'sitx' => ['application/x-stuffitx'], 'skd' => ['application/vnd.koan'], 'skm' => ['application/vnd.koan'], 'skp' => ['application/vnd.koan'], 'skt' => ['application/vnd.koan'], 'sl' => ['application/x-seelogo'], 'slc' => ['application/vnd.wap.slc'], 'sldm' => ['application/vnd.ms-powerpoint.slide.macroenabled.12'], 'sldx' => ['application/vnd.openxmlformats-officedocument.presentationml.slide'], 'slt' => ['application/vnd.epson.salt'], 'sm' => ['application/vnd.stepmania.stepchart'], 'smf' => ['application/vnd.stardivision.math'], 'smi' => ['application/smil+xml'], 'smil' => ['application/smil+xml'], 'smv' => ['video/x-smv'], 'smzip' => ['application/vnd.stepmania.package'], 'snd' => ['audio/basic', 'audio/x-adpcm'], 'snf' => ['application/x-font-snf'], 'so' => ['application/octet-stream'], 'sol' => ['application/solids'], 'spc' => ['application/x-pkcs7-certificates', 'text/x-speech'], 'spf' => ['application/vnd.yamaha.smaf-phrase'], 'spl' => ['application/x-futuresplash'], 'spot' => ['text/vnd.in3d.spot'], 'spp' => ['application/scvp-vp-response'], 'spq' => ['application/scvp-vp-request'], 'spr' => ['application/x-sprite'], 'sprite' => ['application/x-sprite'], 'spx' => ['audio/ogg'], 'sql' => ['application/x-sql'], 'src' => ['application/x-wais-source'], 'srt' => ['application/x-subrip'], 'sru' => ['application/sru+xml'], 'srx' => ['application/sparql-results+xml'], 'ssdl' => ['application/ssdl+xml'], 'sse' => ['application/vnd.kodak-descriptor'], 'ssf' => ['application/vnd.epson.ssf'], 'ssi' => ['text/x-server-parsed-html'], 'ssm' => ['application/streamingmedia'], 'ssml' => ['application/ssml+xml'], 'sst' => ['application/vnd.ms-pki.certstore'], 'st' => ['application/vnd.sailingtracker.track'], 'stc' => ['application/vnd.sun.xml.calc.template'], 'std' => ['application/vnd.sun.xml.draw.template'], 'step' => ['application/step'], 'stf' => ['application/vnd.wt.stf'], 'sti' => ['application/vnd.sun.xml.impress.template'], 'stk' => ['application/hyperstudio'], 'stl' => ['application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle'], 'stp' => ['application/step'], 'str' => ['application/vnd.pg.format'], 'stw' => ['application/vnd.sun.xml.writer.template'], 'sub' => ['text/vnd.dvb.subtitle'], 'sus' => ['application/vnd.sus-calendar'], 'susp' => ['application/vnd.sus-calendar'], 'sv4cpio' => ['application/x-sv4cpio'], 'sv4crc' => ['application/x-sv4crc'], 'svc' => ['application/vnd.dvb.service'], 'svd' => ['application/vnd.svd'], 'svf' => ['image/vnd.dwg', 'image/x-dwg'], 'svg' => ['image/svg+xml'], 'svgz' => ['image/svg+xml'], 'svr' => ['application/x-world', 'x-world/x-svr'], 'swa' => ['application/x-director'], 'swf' => ['application/x-shockwave-flash'], 'swi' => ['application/vnd.aristanetworks.swi'], 'sxc' => ['application/vnd.sun.xml.calc'], 'sxd' => ['application/vnd.sun.xml.draw'], 'sxg' => ['application/vnd.sun.xml.writer.global'], 'sxi' => ['application/vnd.sun.xml.impress'], 'sxm' => ['application/vnd.sun.xml.math'], 'sxw' => ['application/vnd.sun.xml.writer'], 't' => ['text/troff'], 't3' => ['application/x-t3vm-image'], 'taglet' => ['application/vnd.mynfc'], 'talk' => ['text/x-speech'], 'tao' => ['application/vnd.tao.intent-module-archive'], 'tar' => ['application/x-tar'], 'tbk' => ['application/toolbook', 'application/x-tbook'], 'tcap' => ['application/vnd.3gpp2.tcap'], 'tcl' => ['application/x-tcl', 'text/x-script.tcl'], 'tcsh' => ['text/x-script.tcsh'], 'teacher' => ['application/vnd.smart.teacher'], 'tei' => ['application/tei+xml'], 'teicorpus' => ['application/tei+xml'], 'tex' => ['application/x-tex'], 'texi' => ['application/x-texinfo'], 'texinfo' => ['application/x-texinfo'], 'text' => ['application/plain', 'text/plain'], 'tfi' => ['application/thraud+xml'], 'tfm' => ['application/x-tex-tfm'], 'tga' => ['image/x-tga'], 'tgz' => ['application/gnutar', 'application/x-compressed'], 'thmx' => ['application/vnd.ms-officetheme'], 'tif' => ['image/tiff', 'image/x-tiff'], 'tiff' => ['image/tiff', 'image/x-tiff'], 'tmo' => ['application/vnd.tmobile-livetv'], 'torrent' => ['application/x-bittorrent'], 'tpl' => ['application/vnd.groove-tool-template'], 'tpt' => ['application/vnd.trid.tpt'], 'tr' => ['text/troff'], 'tra' => ['application/vnd.trueapp'], 'trm' => ['application/x-msterminal'], 'ts' => ['video/MP2T'], 'tsd' => ['application/timestamped-data'], 'tsi' => ['audio/tsp-audio'], 'tsp' => ['application/dsptype', 'audio/tsplayer'], 'tsv' => ['text/tab-separated-values'], 'ttc' => ['application/x-font-ttf'], 'ttf' => ['application/x-font-ttf'], 'ttl' => ['text/turtle'], 'turbot' => ['image/florian'], 'twd' => ['application/vnd.simtech-mindmapper'], 'twds' => ['application/vnd.simtech-mindmapper'], 'txd' => ['application/vnd.genomatix.tuxedo'], 'txf' => ['application/vnd.mobius.txf'], 'txt' => ['text/plain'], 'u32' => ['application/x-authorware-bin'], 'udeb' => ['application/x-debian-package'], 'ufd' => ['application/vnd.ufdl'], 'ufdl' => ['application/vnd.ufdl'], 'uil' => ['text/x-uil'], 'ulx' => ['application/x-glulx'], 'umj' => ['application/vnd.umajin'], 'uni' => ['text/uri-list'], 'unis' => ['text/uri-list'], 'unityweb' => ['application/vnd.unity'], 'unv' => ['application/i-deas'], 'uoml' => ['application/vnd.uoml+xml'], 'uri' => ['text/uri-list'], 'uris' => ['text/uri-list'], 'urls' => ['text/uri-list'], 'ustar' => ['application/x-ustar', 'multipart/x-ustar'], 'utz' => ['application/vnd.uiq.theme'], 'uu' => ['application/octet-stream', 'text/x-uuencode'], 'uue' => ['text/x-uuencode'], 'uva' => ['audio/vnd.dece.audio'], 'uvd' => ['application/vnd.dece.data'], 'uvf' => ['application/vnd.dece.data'], 'uvg' => ['image/vnd.dece.graphic'], 'uvh' => ['video/vnd.dece.hd'], 'uvi' => ['image/vnd.dece.graphic'], 'uvm' => ['video/vnd.dece.mobile'], 'uvp' => ['video/vnd.dece.pd'], 'uvs' => ['video/vnd.dece.sd'], 'uvt' => ['application/vnd.dece.ttml+xml'], 'uvu' => ['video/vnd.uvvu.mp4'], 'uvv' => ['video/vnd.dece.video'], 'uvva' => ['audio/vnd.dece.audio'], 'uvvd' => ['application/vnd.dece.data'], 'uvvf' => ['application/vnd.dece.data'], 'uvvg' => ['image/vnd.dece.graphic'], 'uvvh' => ['video/vnd.dece.hd'], 'uvvi' => ['image/vnd.dece.graphic'], 'uvvm' => ['video/vnd.dece.mobile'], 'uvvp' => ['video/vnd.dece.pd'], 'uvvs' => ['video/vnd.dece.sd'], 'uvvt' => ['application/vnd.dece.ttml+xml'], 'uvvu' => ['video/vnd.uvvu.mp4'], 'uvvv' => ['video/vnd.dece.video'], 'uvvx' => ['application/vnd.dece.unspecified'], 'uvvz' => ['application/vnd.dece.zip'], 'uvx' => ['application/vnd.dece.unspecified'], 'uvz' => ['application/vnd.dece.zip'], 'vcard' => ['text/vcard'], 'vcd' => ['application/x-cdlink'], 'vcf' => ['text/x-vcard'], 'vcg' => ['application/vnd.groove-vcard'], 'vcs' => ['text/x-vcalendar'], 'vcx' => ['application/vnd.vcx'], 'vda' => ['application/vda'], 'vdo' => ['video/vdo'], 'vew' => ['application/groupwise'], 'vis' => ['application/vnd.visionary'], 'viv' => ['video/vivo', 'video/vnd.vivo'], 'vivo' => ['video/vivo', 'video/vnd.vivo'], 'vmd' => ['application/vocaltec-media-desc'], 'vmf' => ['application/vocaltec-media-file'], 'vob' => ['video/x-ms-vob'], 'voc' => ['audio/voc', 'audio/x-voc'], 'vor' => ['application/vnd.stardivision.writer'], 'vos' => ['video/vosaic'], 'vox' => ['application/x-authorware-bin'], 'vqe' => ['audio/x-twinvq-plugin'], 'vqf' => ['audio/x-twinvq'], 'vql' => ['audio/x-twinvq-plugin'], 'vrml' => ['application/x-vrml', 'model/vrml', 'x-world/x-vrml'], 'vrt' => ['x-world/x-vrt'], 'vsd' => ['application/vnd.visio'], 'vsf' => ['application/vnd.vsf'], 'vss' => ['application/vnd.visio'], 'vst' => ['application/vnd.visio'], 'vsw' => ['application/vnd.visio'], 'vtt' => ['text/vtt'], 'vtu' => ['model/vnd.vtu'], 'vxml' => ['application/voicexml+xml'], 'w3d' => ['application/x-director'], 'w60' => ['application/wordperfect6.0'], 'w61' => ['application/wordperfect6.1'], 'w6w' => ['application/msword'], 'wad' => ['application/x-doom'], 'wav' => ['audio/wav', 'audio/x-wav'], 'wax' => ['audio/x-ms-wax'], 'wb1' => ['application/x-qpro'], 'wbmp' => ['image/vnd.wap.wbmp'], 'wbs' => ['application/vnd.criticaltools.wbs+xml'], 'wbxml' => ['application/vnd.wap.wbxml'], 'wcm' => ['application/vnd.ms-works'], 'wdb' => ['application/vnd.ms-works'], 'wdp' => ['image/vnd.ms-photo'], 'web' => ['application/vnd.xara'], 'weba' => ['audio/webm'], 'webapp' => ['application/x-web-app-manifest+json'], 'webm' => ['video/webm'], 'webp' => ['image/webp'], 'wg' => ['application/vnd.pmi.widget'], 'wgt' => ['application/widget'], 'wiz' => ['application/msword'], 'wk1' => ['application/x-123'], 'wks' => ['application/vnd.ms-works'], 'wm' => ['video/x-ms-wm'], 'wma' => ['audio/x-ms-wma'], 'wmd' => ['application/x-ms-wmd'], 'wmf' => ['application/x-msmetafile'], 'wml' => ['text/vnd.wap.wml'], 'wmlc' => ['application/vnd.wap.wmlc'], 'wmls' => ['text/vnd.wap.wmlscript'], 'wmlsc' => ['application/vnd.wap.wmlscriptc'], 'wmv' => ['video/x-ms-wmv'], 'wmx' => ['video/x-ms-wmx'], 'wmz' => ['application/x-msmetafile'], 'woff' => ['application/x-font-woff'], 'word' => ['application/msword'], 'wp' => ['application/wordperfect'], 'wp5' => ['application/wordperfect', 'application/wordperfect6.0'], 'wp6' => ['application/wordperfect'], 'wpd' => ['application/wordperfect', 'application/x-wpwin'], 'wpl' => ['application/vnd.ms-wpl'], 'wps' => ['application/vnd.ms-works'], 'wq1' => ['application/x-lotus'], 'wqd' => ['application/vnd.wqd'], 'wri' => ['application/mswrite', 'application/x-wri'], 'wrl' => ['application/x-world', 'model/vrml', 'x-world/x-vrml'], 'wrz' => ['model/vrml', 'x-world/x-vrml'], 'wsc' => ['text/scriplet'], 'wsdl' => ['application/wsdl+xml'], 'wspolicy' => ['application/wspolicy+xml'], 'wsrc' => ['application/x-wais-source'], 'wtb' => ['application/vnd.webturbo'], 'wtk' => ['application/x-wintalk'], 'wvx' => ['video/x-ms-wvx'], 'x-png' => ['image/png'], 'x32' => ['application/x-authorware-bin'], 'x3d' => ['model/x3d+xml'], 'x3db' => ['model/x3d+binary'], 'x3dbz' => ['model/x3d+binary'], 'x3dv' => ['model/x3d+vrml'], 'x3dvz' => ['model/x3d+vrml'], 'x3dz' => ['model/x3d+xml'], 'xaml' => ['application/xaml+xml'], 'xap' => ['application/x-silverlight-app'], 'xar' => ['application/vnd.xara'], 'xbap' => ['application/x-ms-xbap'], 'xbd' => ['application/vnd.fujixerox.docuworks.binder'], 'xbm' => ['image/x-xbitmap', 'image/x-xbm', 'image/xbm'], 'xdf' => ['application/xcap-diff+xml'], 'xdm' => ['application/vnd.syncml.dm+xml'], 'xdp' => ['application/vnd.adobe.xdp+xml'], 'xdr' => ['video/x-amt-demorun'], 'xdssc' => ['application/dssc+xml'], 'xdw' => ['application/vnd.fujixerox.docuworks'], 'xenc' => ['application/xenc+xml'], 'xer' => ['application/patch-ops-error+xml'], 'xfdf' => ['application/vnd.adobe.xfdf'], 'xfdl' => ['application/vnd.xfdl'], 'xgz' => ['xgl/drawing'], 'xht' => ['application/xhtml+xml'], 'xhtml' => ['application/xhtml+xml'], 'xhvml' => ['application/xv+xml'], 'xif' => ['image/vnd.xiff'], 'xl' => ['application/excel'], 'xla' => ['application/excel', 'application/x-excel', 'application/x-msexcel'], 'xlam' => ['application/vnd.ms-excel.addin.macroenabled.12'], 'xlb' => ['application/excel', 'application/vnd.ms-excel', 'application/x-excel'], 'xlc' => ['application/excel', 'application/vnd.ms-excel', 'application/x-excel'], 'xld' => ['application/excel', 'application/x-excel'], 'xlf' => ['application/x-xliff+xml'], 'xlk' => ['application/excel', 'application/x-excel'], 'xll' => ['application/excel', 'application/vnd.ms-excel', 'application/x-excel'], 'xlm' => ['application/excel', 'application/vnd.ms-excel', 'application/x-excel'], 'xls' => ['application/excel', 'application/vnd.ms-excel', 'application/x-excel', 'application/x-msexcel'], 'xlsb' => ['application/vnd.ms-excel.sheet.binary.macroenabled.12'], 'xlsm' => ['application/vnd.ms-excel.sheet.macroenabled.12'], 'xlsx' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], 'xlt' => ['application/excel', 'application/x-excel'], 'xltm' => ['application/vnd.ms-excel.template.macroenabled.12'], 'xltx' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.template'], 'xlv' => ['application/excel', 'application/x-excel'], 'xlw' => ['application/excel', 'application/vnd.ms-excel', 'application/x-excel', 'application/x-msexcel'], 'xm' => ['audio/xm'], 'xml' => ['application/xml', 'text/xml'], 'xmz' => ['xgl/movie'], 'xo' => ['application/vnd.olpc-sugar'], 'xop' => ['application/xop+xml'], 'xpdl' => ['application/xml'], 'xpi' => ['application/x-xpinstall'], 'xpix' => ['application/x-vnd.ls-xpix'], 'xpl' => ['application/xproc+xml'], 'xpm' => ['image/x-xpixmap', 'image/xpm'], 'xpr' => ['application/vnd.is-xpr'], 'xps' => ['application/vnd.ms-xpsdocument'], 'xpw' => ['application/vnd.intercon.formnet'], 'xpx' => ['application/vnd.intercon.formnet'], 'xsl' => ['application/xml'], 'xslt' => ['application/xslt+xml'], 'xsm' => ['application/vnd.syncml+xml'], 'xspf' => ['application/xspf+xml'], 'xsr' => ['video/x-amt-showrun'], 'xul' => ['application/vnd.mozilla.xul+xml'], 'xvm' => ['application/xv+xml'], 'xvml' => ['application/xv+xml'], 'xwd' => ['image/x-xwd', 'image/x-xwindowdump'], 'xyz' => ['chemical/x-xyz'], 'xz' => ['application/x-xz'], 'yang' => ['application/yang'], 'yin' => ['application/yin+xml'], 'z' => ['application/x-compress', 'application/x-compressed'], 'z1' => ['application/x-zmachine'], 'z2' => ['application/x-zmachine'], 'z3' => ['application/x-zmachine'], 'z4' => ['application/x-zmachine'], 'z5' => ['application/x-zmachine'], 'z6' => ['application/x-zmachine'], 'z7' => ['application/x-zmachine'], 'z8' => ['application/x-zmachine'], 'zaz' => ['application/vnd.zzazz.deck+xml'], 'zip' => ['application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'], 'zir' => ['application/vnd.zul'], 'zirz' => ['application/vnd.zul'], 'zmm' => ['application/vnd.handheld-entertainment+xml'], 'zoo' => ['application/octet-stream'], 'zsh' => ['text/x-script.zsh'], '123' => ['application/vnd.lotus-1-2-3'], ]; $fileExt = strtolower(\JFile::getExt($filename)); return isset($mimeTypes[$fileExt]) ? $mimeTypes[$fileExt] : 'application/octet-stream'; } } Factory/Factory.php 0000644 00000011776 15115511723 0010310 0 ustar 00 <?php /** * @package OSL * @subpackage Config * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Factory; use JDatabaseDriver, JTable; use OSL\Container\Container; class Factory { /** * Component container * * @var Container */ protected $container; /** * Constructor. * * @param Container $container */ public function __construct(Container $container) { $this->container = $container; } /** * Method to create a controller instance * * @param string $name * @param array $config * @param string $section * * @return \OSL\Controller\Controller * * @throws \InvalidArgumentException * */ public function createController($name, $config = array(), $section = 'auto') { $section = strtolower($section); if ($section == 'auto') { $namespace = $this->container->namespace; } elseif ($section == 'site') { $namespace = $this->container->feNamespace; } elseif ($section == 'admin') { $namespace = $this->container->beNamespace; } else { throw new \InvalidArgumentException(printf('The provided section %s is invalid', $section)); } $classes = []; $classes[] = $namespace . '\\Override\\Controller\\' . ucfirst($name); $classes[] = $namespace . '\\Controller\\' . ucfirst($name); $classes[] = $namespace . '\\Controller\\Controller'; foreach ($classes as $class) { if (class_exists($class)) { $config['name'] = $name; return new $class($this->container, $config); } } throw new \InvalidArgumentException(printf('Could not find the controller %s ', $name)); } /** * Method to create a model instance * * @param string $name * @param array $config * @param string $section * * @return \OSL\Model\Model * * @throws \InvalidArgumentException */ public function createModel($name, $config = array(), $section = 'auto') { $section = strtolower($section); if ($section == 'auto') { $namespace = $this->container->namespace; } elseif ($section == 'site') { $namespace = $this->container->feNamespace; } elseif ($section == 'admin') { $namespace = $this->container->beNamespace; } else { throw new \InvalidArgumentException(printf('The provided section %s is invalid', $section)); } $classes = []; $classes[] = $namespace . '\\Override\\Model\\' . ucfirst($name); $classes[] = $namespace . '\\Model\\' . ucfirst($name); if ($this->container->inflector->isPlural($name)) { $classes[] = 'OSL\\Model\\ListModel'; } else { if ($this->container->app->isClient('administrator')) { $classes[] = 'OSL\\Model\\AdminModel'; } else { $classes[] = 'OSL\\Model\\Model'; } } $config['name'] = $name; foreach ($classes as $class) { if (class_exists($class)) { return new $class($this->container, $config); } } throw new \InvalidArgumentException(printf('Could not find the model %s', ucfirst($name))); } /** * Method to create a view instance * * @param string $name * @param string $type * @param array $config * @param string $section * * @return \OSL\View\AbstractView */ public function createView($name, $type = 'html', $config = array(), $section = 'auto') { $section = strtolower($section); if ($section == 'auto') { $namespace = $this->container->namespace; } elseif ($section == 'site') { $namespace = $this->container->feNamespace; } elseif ($section == 'admin') { $namespace = $this->container->beNamespace; } else { throw new \InvalidArgumentException(printf('The provided section %s is invalid', $section)); } $classes = []; $classes[] = $namespace . '\\Override\\View\\' . ucfirst($name) . '\\' . ucfirst($type);; $classes[] = $namespace . '\\View\\' . ucfirst($name) . '\\' . ucfirst($type);; if ($this->container->inflector->isPlural($name)) { $classes[] = 'OSL\\View\\ListView'; } else { $classes[] = 'OSL\\View\\ItemView'; } $config['name'] = $name; foreach ($classes as $class) { if (class_exists($class)) { return new $class($this->container, $config); } } throw new \InvalidArgumentException(printf('Could not find the view %s, type %s', ucfirst($name), ucfirst($type))); } /** * @param string $name * @param JDatabaseDriver $db * * @return JTable */ public function createTable($name, JDatabaseDriver $db = null) { $className = $this->container->beNamespace . '\\Table\\' . ucfirst($name); if (!class_exists($className)) { throw new \RuntimeException(sprintf('Table class %s does not exist', $name)); } if (is_null($db)) { $db = $this->container->db; } return new $className($db); } } Inflector/Inflector.php 0000644 00000032312 15115511723 0011131 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Inflector; defined('_JEXEC') or die; /** * An Inflector to pluralize and singularize English nouns. */ class Inflector { /** * Rules for pluralizing and singularizing of nouns. * * @var array */ protected $rules = array ( // Pluralization rules. The regex on the left transforms to the regex on the right. 'pluralization' => array( '/move$/i' => 'moves', '/sex$/i' => 'sexes', '/child$/i' => 'children', '/children$/i' => 'children', '/man$/i' => 'men', '/men$/i' => 'men', '/foot$/i' => 'feet', '/feet$/i' => 'feet', '/person$/i' => 'people', '/people$/i' => 'people', '/taxon$/i' => 'taxa', '/taxa$/i' => 'taxa', '/(quiz)$/i' => '$1zes', '/^(ox)$/i' => '$1en', '/oxen$/i' => 'oxen', '/(m|l)ouse$/i' => '$1ice', '/(m|l)ice$/i' => '$1ice', '/(matr|vert|ind|suff)ix|ex$/i' => '$1ices', '/(x|ch|ss|sh)$/i' => '$1es', '/([^aeiouy]|qu)y$/i' => '$1ies', '/(?:([^f])fe|([lr])f)$/i' => '$1$2ves', '/sis$/i' => 'ses', '/([ti]|addend)um$/i' => '$1a', '/([ti]|addend)a$/i' => '$1a', '/(alumn|formul)a$/i' => '$1ae', '/(alumn|formul)ae$/i' => '$1ae', '/(buffal|tomat|her)o$/i' => '$1oes', '/(bu)s$/i' => '$1ses', '/(campu)s$/i' => '$1ses', '/(alias|status)$/i' => '$1es', '/(octop|vir)us$/i' => '$1i', '/(octop|vir)i$/i' => '$1i', '/(gen)us$/i' => '$1era', '/(gen)era$/i' => '$1era', '/(ax|test)is$/i' => '$1es', '/s$/i' => 's', '/$/' => 's', ), // Singularization rules. The regex on the left transforms to the regex on the right. 'singularization' => array( '/cookies$/i' => 'cookie', '/moves$/i' => 'move', '/sexes$/i' => 'sex', '/children$/i' => 'child', '/men$/i' => 'man', '/feet$/i' => 'foot', '/people$/i' => 'person', '/taxa$/i' => 'taxon', '/databases$/i' => 'database', '/menus$/i' => 'menu', '/(quiz)zes$/i' => '\1', '/(matr|suff)ices$/i' => '\1ix', '/(vert|ind|cod)ices$/i' => '\1ex', '/^(ox)en/i' => '\1', '/(alias|status)es$/i' => '\1', '/(tomato|hero|buffalo)es$/i' => '\1', '/([octop|vir])i$/i' => '\1us', '/(gen)era$/i' => '\1us', '/(cris|^ax|test)es$/i' => '\1is', '/is$/i' => 'is', '/us$/i' => 'us', '/ias$/i' => 'ias', '/(shoe)s$/i' => '\1', '/(o)es$/i' => '\1e', '/(bus)es$/i' => '\1', '/(campus)es$/i' => '\1', '/([m|l])ice$/i' => '\1ouse', '/(x|ch|ss|sh)es$/i' => '\1', '/(m)ovies$/i' => '\1ovie', '/(s)eries$/i' => '\1eries', '/(v)ies$/i' => '\1ie', '/([^aeiouy]|qu)ies$/i' => '\1y', '/([lr])ves$/i' => '\1f', '/(tive)s$/i' => '\1', '/(hive)s$/i' => '\1', '/([^f])ves$/i' => '\1fe', '/(^analy)ses$/i' => '\1sis', '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => '\1\2sis', '/([ti]|addend)a$/i' => '\1um', '/(alumn|formul)ae$/i' => '$1a', '/(n)ews$/i' => '\1ews', '/(.*)ss$/i' => '\1ss', '/(.*)s$/i' => '\1', ), // Uncountable objects are always singular 'uncountable' => array( 'aircraft', 'cannon', 'deer', 'equipment', 'fish', 'information', 'money', 'moose', 'news', 'rice', 'series', 'sheep', 'species', 'swine', ) ); /** * Cache of pluralized and singularized nouns. * * @var array */ protected $cache = array( 'singularized' => array(), 'pluralized' => array() ); public function deleteCache() { $this->cache['pluralized'] = array(); $this->cache['singularized'] = array(); } /** * Add a word to the cache, useful to make exceptions or to add words in other languages. * * @param string $singular word. * @param string $plural word. * * @return void */ public function addWord($singular, $plural) { $this->cache['pluralized'][$singular] = $plural; $this->cache['singularized'][$plural] = $singular; } /** * Singular English word to plural. * * @param string $word word to pluralize. * * @return string Plural noun. */ public function pluralize($word) { // Get the cached noun of it exists if (isset($this->cache['pluralized'][$word])) { return $this->cache['pluralized'][$word]; } // Check if the noun is already in plural form, i.e. in the singularized cache if (isset($this->cache['singularized'][$word])) { return $word; } // Create the plural noun if (in_array($word, $this->rules['uncountable'])) { $_cache['pluralized'][$word] = $word; return $word; } foreach ($this->rules['pluralization'] as $regexp => $replacement) { $matches = null; $plural = preg_replace($regexp, $replacement, $word, -1, $matches); if ($matches > 0) { $_cache['pluralized'][$word] = $plural; return $plural; } } return $word; } /** * Plural English word to singular. * * @param string $word Word to singularize. * * @return string Singular noun. */ public function singularize($word) { // Get the cached noun of it exists if (isset($this->cache['singularized'][$word])) { return $this->cache['singularized'][$word]; } // Check if the noun is already in singular form, i.e. in the pluralized cache if (isset($this->cache['pluralized'][$word])) { return $word; } // Create the singular noun if (in_array($word, $this->rules['uncountable'])) { $_cache['singularized'][$word] = $word; return $word; } foreach ($this->rules['singularization'] as $regexp => $replacement) { $matches = null; $singular = preg_replace($regexp, $replacement, $word, -1, $matches); if ($matches > 0) { $_cache['singularized'][$word] = $singular; return $singular; } } return $word; } /** * Returns given word as CamelCased. * * Converts a word like "foo_bar" or "foo bar" to "FooBar". It * will remove non alphanumeric characters from the word, so * "who's online" will be converted to "WhoSOnline" * * @param string $word Word to convert to camel case. * * @return string UpperCamelCasedWord */ public function camelize($word) { $word = preg_replace('/[^a-zA-Z0-9\s]/', ' ', $word); $word = str_replace(' ', '', ucwords(strtolower(str_replace('_', ' ', $word)))); return $word; } /** * Converts a word "into_it_s_underscored_version" * * Convert any "CamelCased" or "ordinary Word" into an "underscored_word". * * @param string $word Word to underscore * * @return string Underscored word */ public function underscore($word) { $word = preg_replace('/(\s)+/', '_', $word); $word = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $word)); return $word; } /** * Convert any "CamelCased" word into an array of strings * * Returns an array of strings each of which is a substring of string formed * by splitting it at the camelcased letters. * * @param string $word Word to explode * * @return array Array of strings */ public function explode($word) { $result = explode('_', self::underscore($word)); return $result; } /** * Convert an array of strings into a "CamelCased" word. * * @param array $words Array to implode * * @return string UpperCamelCasedWord */ public function implode($words) { $result = self::camelize(implode('_', $words)); return $result; } /** * Returns a human-readable string from $word. * * Returns a human-readable string from $word, by replacing * underscores with a space, and by upper-casing the initial * character by default. * * @param string $word String to "humanize" * * @return string Human-readable word */ public function humanize($word) { $result = ucwords(strtolower(str_replace("_", " ", $word))); return $result; } /** * Returns camelBacked version of a string. Same as camelize but first char is lowercased. * * @param string $string String to be camelBacked. * * @return string * * @see camelize */ public function variablize($string) { $string = self::camelize(self::underscore($string)); $result = strtolower(substr($string, 0, 1)); $variable = preg_replace('/\\w/', $result, $string, 1); return $variable; } /** * Check to see if an English word is singular * * @param string $string The word to check * * @return boolean */ public function isSingular($string) { // Check cache assuming the string is plural. $singular = isset($this->cache['singularized'][$string]) ? $this->cache['singularized'][$string] : null; $plural = $singular && isset($this->cache['pluralized'][$singular]) ? $this->cache['pluralized'][$singular] : null; if ($singular && $plural) { return $plural != $string; } // If string is not in the cache, try to pluralize and singularize it. return self::singularize(self::pluralize($string)) == $string; } /** * Check to see if an Enlish word is plural. * * @param string $string String to be checked. * * @return boolean */ public function isPlural($string) { // Uncountable objects are always singular (e.g. information) if (in_array($string, $this->rules['uncountable'])) { return false; } // Check cache assuming the string is singular. $plural = isset($this->cache['pluralized'][$string]) ? $this->cache['pluralized'][$string] : null; $singular = $plural && isset($this->cache['singularized'][$plural]) ? $this->cache['singularized'][$plural] : null; if ($plural && $singular) { return $singular != $string; } // If string is not in the cache, try to singularize and pluralize it. return self::pluralize(self::singularize($string)) == $string; } /** * Gets a part of a CamelCased word by index. * * Use a negative index to start at the last part of the word (-1 is the * last part) * * @param string $string Word * @param integer $index Index of the part * @param string $default Default value * * @return string */ public function getPart($string, $index, $default = null) { $parts = self::explode($string); if ($index < 0) { $index = count($parts) + $index; } return isset($parts[$index]) ? $parts[$index] : $default; } } init.php 0000644 00000000637 15115511726 0006232 0 ustar 00 <?php /** * @package OSL * @subpackage Container * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ /** @var \Composer\Autoload\ClassLoader $autoLoader */ $autoLoader = include JPATH_LIBRARIES . '/vendor/autoload.php'; if ($autoLoader) { $autoLoader->setPsr4('OSL\\', __DIR__); } Input/Input.php 0000644 00000006026 15115511727 0007464 0 ustar 00 <?php /** * @package OSL * @subpackage Input * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Input; use JInput, JFilterInput; /** * Extends JInput class to allow getting raw data from Input object * * @property Input $get * @property Input $post */ class Input extends JInput { const INPUT_ALLOWRAW = 2; const INPUT_ALLOWHTML = 4; /** * Constructor. * * @param array $source Source data (Optional, default is $_REQUEST) * @param array $options Array of configuration parameters (Optional) * */ public function __construct($source = null, array $options = []) { if ($source instanceof JInput) { $reflection = new \ReflectionClass($source); $property = $reflection->getProperty('data'); $property->setAccessible(true); $source = $property->getValue($source); } if (!isset($options['filter'])) { //Set default filter so that getHtml can be returned properly if (version_compare(JVERSION, '4.0.0-dev', 'ge')) { //Set default filter so that getHtml can be returned properly $options['filter'] = JFilterInput::getInstance([], [], 1, 1); } else { $options['filter'] = JFilterInput::getInstance(null, null, 1, 1); } } parent::__construct($source, $options); } /** * * Get data from the input * * @param int $mask * * @return array */ public function getData($mask = Input::INPUT_ALLOWHTML) { if ($mask & 2) { return $this->data; } return $this->filter->clean($this->data, null); } /** * Set data for the input object. This is usually called when you get data, modify it, and then set it back * * @param $data */ public function setData(array $data) { $this->data = $data; } /** * Check to see if a variable is available in the input or not * * @param string $name the variable name * * @return boolean */ public function has($name) { if (isset($this->data[$name])) { return true; } return false; } /** * Remove a variable from input * * @param $name */ public function remove($name) { if (isset($this->data[$name])) { unset($this->data[$name]); } } /** * Magic method to get an input object * * @param mixed $name Name of the input object to retrieve. * * @return Input The request input object */ public function __get($name) { if (isset($this->inputs[$name])) { return $this->inputs[$name]; } $className = 'JInput' . ucfirst($name); if (class_exists($className)) { $this->inputs[$name] = new $className(null, $this->options); return $this->inputs[$name]; } $superGlobal = '_' . strtoupper($name); if (isset($GLOBALS[$superGlobal])) { $this->inputs[$name] = new Input($GLOBALS[$superGlobal], $this->options); return $this->inputs[$name]; } } } Model/AdminModel.php 0000644 00000035421 15115511727 0010340 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Model; use Exception; use Joomla\Registry\Registry, Joomla\String\StringHelper, JFactory, JPluginHelper, JLanguageMultilang, JTable, JApplicationHelper; use OSL\Container\Container, OSL\Input\Input; /** * Admin model class. It will handle tasks such as add, update, delete, publish, unpublish...items * * @package OSF * @subpackage Model * @since 1.0 */ class AdminModel extends Model { /** * Context, used to get user session data and also trigger plugin * * @var string */ protected $context; /** * The prefix to use with controller messages. * * @var string */ protected $languagePrefix = null; /** * This model trigger events or not. By default, set it to No to improve performance * * @var boolean */ protected $triggerEvents = false; /** * The event to trigger after deleting the data. * * @var string */ protected $eventAfterDelete = null; /** * The event to trigger after saving the data. * * @var string */ protected $eventAfterSave = null; /** * The event to trigger before deleting the data. * * @var string */ protected $eventBeforeDelete = null; /** * The event to trigger before saving the data. * * @var string */ protected $eventBeforeSave = null; /** * The event to trigger after changing the published state of the data. * * @var string */ protected $eventChangeState = null; /** * Name of plugin group which will be loaded to process the triggered event. * Default is component name * * @var string */ protected $pluginGroup = null; /** * Data for the item * * @var object */ protected $data = null; /** * Constructor. * * @param mixed $config An object store model configuration * * @see OSFModel */ public function __construct(Container $container, $config = []) { parent::__construct($container, $config); /**@var Registry $config * */ $this->context = $this->container->option . '.' . $this->name; //Insert the default model states for admin $this->state->insert('id', 'int', 0)->insert('cid', 'array', []); if ($this->triggerEvents) { $name = ucfirst($this->name); if (isset($config['plugin_group'])) { $this->pluginGroup = $config['plugin_group']; } elseif (empty($this->pluginGroup)) { //Plugin group should default to component name $this->pluginGroup = substr($this->container->option, 4); } //Initialize the events if (isset($config['event_after_delete'])) { $this->eventAfterDelete = $config['event_after_delete']; } elseif (empty($this->eventAfterDelete)) { $this->eventAfterDelete = 'on' . $name . 'AfterDelete'; } if (isset($config['event_after_save'])) { $this->eventAfterSave = $config['event_after_save']; } elseif (empty($this->eventAfterSave)) { $this->eventAfterSave = 'on' . $name . 'AfterSave'; } if (isset($config['event_before_delete'])) { $this->eventBeforeDelete = $config['event_before_delete']; } elseif (empty($this->eventBeforeDelete)) { $this->eventBeforeDelete = 'on' . $name . 'BeforeDelete'; } if (isset($config['event_before_save'])) { $this->eventBeforeSave = $config['event_before_save']; } elseif (empty($this->eventBeforeSave)) { $this->eventBeforeSave = 'on' . $name . 'BeforeSave'; } if (isset($config['event_change_state'])) { $this->eventChangeState = $config['event_change_state']; } elseif (empty($this->eventChangeState)) { $this->eventChangeState = 'on' . $name . 'ChangeState'; } } if (empty($this->languagePrefix)) { $this->languagePrefix = $this->container->languagePrefix; } } /** * Method to get the record data * * @return object */ public function getData() { if (empty($this->data)) { if (count($this->state->cid)) { $this->state->id = (int) $this->state->cid[0]; } if ($this->state->id) { $this->loadData(); } else { $this->initData(); } } return $this->data; } /** * Method to store a record * * @param Input $input * @param array $ignore * * @return bool * @throws Exception */ public function store($input, $ignore = []) { if ($this->triggerEvents) { JPluginHelper::importPlugin($this->pluginGroup); } $row = $this->getTable(); $isNew = true; $id = $input->getInt('id', 0); if ($id) { $isNew = false; $row->load($id); } // Pre-process the input data $this->beforeStore($row, $input, $isNew); if ($this->container->user->authorise('core.admin', 'com_pmform')) { $data = $input->getData(\OSL\Input\Input::INPUT_ALLOWRAW); } else { $data = $input->getData(); } $row->bind($data, $ignore); $this->prepareTable($row, $input->get('task')); $row->check(); if ($this->triggerEvents) { $this->container->app->triggerEvent($this->eventBeforeSave, [$row, $data, $isNew]); } $row->store(); if ($this->triggerEvents) { $this->container->app->triggerEvent($this->eventAfterSave, [$row, $data, $isNew]); } $input->set('id', $row->id); // Post process after the record stored into database $this->afterStore($row, $input, $isNew); } /** * Method to delete one or more records. * * @param array $cid * * @throws Exception */ public function delete($cid = []) { if (count($cid)) { if ($this->triggerEvents) { JPluginHelper::importPlugin($this->pluginGroup); } // Before delete $this->beforeDelete($cid); $row = $this->getTable(); foreach ($cid as $id) { if ($row->load($id)) { if ($this->triggerEvents) { $result = $this->container->app->triggerEvent($this->eventBeforeDelete, [$this->context, $row]); if (in_array(false, $result, true)) { throw new Exception($row->getError()); } } if (!$row->delete()) { throw new Exception($row->getError()); } if ($this->triggerEvents) { $this->container->app->triggerEvent($this->eventAfterDelete, [$this->context, $row]); } } else { throw new Exception($row->getError()); } } // Post process after records has been deleted from main table $this->afterDelete($cid); $this->cleanCache(); } } /** * Method to change the published state of one or more records. * * @param array $pks A list of the primary keys to change. * @param int $value The value of the published state. * * @throws Exception */ public function publish($pks, $value = 1) { $row = $this->getTable(); $pks = (array) $pks; $this->beforePublish($pks, $value); // Attempt to change the state of the records. if (!$row->publish($pks, $value, $this->container->user->get('id'))) { throw new Exception($row->getError()); } $this->afterPublish($pks, $value); if ($this->triggerEvents) { // Trigger the eventChangeState event. JPluginHelper::importPlugin($this->pluginGroup); $this->container->app->triggerEvent($this->eventChangeState, [$this->context, $pks, $value]); } // Clear the component's cache $this->cleanCache(); } /** * Saves the manually set order of records. * * @param array $pks An array of primary key ids. * * @param array $order An array contain ordering value of item corresponding with $pks array * * @return mixed * * @throws Exception */ public function saveorder($pks = null, $order = null) { $row = $this->getTable(); $conditions = []; // Update ordering values foreach ($pks as $i => $pk) { $row->load((int) $pk); if ($row->ordering != $order[$i]) { $row->ordering = $order[$i]; $row->store(); // Remember to reorder within position and client_id $condition = $this->getReorderConditions($row); $found = false; foreach ($conditions as $cond) { if ($cond[1] == $condition) { $found = true; break; } } if (!$found) { $conditions[] = [$row->id, $condition]; } } } // Execute reorder for each category. foreach ($conditions as $cond) { $row->load($cond[0]); $row->reorder($cond[1]); } // Clear the component's cache $this->cleanCache(); return true; } /** * Load the record from database * */ protected function loadData() { $db = $this->getDbo(); $query = $db->getQuery(true); $query->select('*') ->from($this->table) ->where('id = ' . (int) $this->state->id); $db->setQuery($query); $this->data = $db->loadObject(); } /** * Init the record dara object */ protected function initData() { $this->data = $this->getTable(); if (property_exists($this->data, 'published')) { $this->data->published = 1; } } /** * Method to change the title & alias, usually used on save2copy method * * @param $row the object being saved * * @param string $alias The alias. * * @param string $title The title. * * @return array Contains the modified title and alias. */ protected function generateNewTitle($row, $alias, $title) { $db = $this->getDbo(); $query = $db->getQuery(true); $query->select('COUNT(*)')->from($this->table); $conditions = $this->getReorderConditions($row); while (true) { $query->where('alias=' . $db->quote($alias)); if (count($conditions)) { $query->where($conditions); } $db->setQuery($query); $found = (int) $db->loadResult(); if ($found) { $title = StringHelper::increment($title); $alias = StringHelper::increment($alias, 'dash'); $query->clear('where'); } else { break; } } return [$title, $alias]; } /** * A protected method to get a set of ordering conditions. * * @param JTable $row A JTable object. * * @return array An array of conditions to add to ordering queries. * */ protected function getReorderConditions($row) { $conditions = []; if (property_exists($row, 'catid')) { $conditions[] = 'catid = ' . (int) $row->catid; } return $conditions; } /** * Prepare and sanitise the table data prior to saving. * * @param JTable $row A reference to a JTable object. * * @return void * */ protected function prepareTable($row, $task) { $user = $this->container->user; if (property_exists($row, 'title')) { $titleField = 'title'; } elseif (property_exists($row, 'name')) { $titleField = 'name'; } if (($task == 'save2copy') && $titleField) { if (property_exists($row, 'alias')) { //Need to generate new title and alias list ($title, $alias) = $this->generateNewTitle($row, $row->alias, $row->{$titleField}); $row->{$titleField} = $title; $row->alias = $alias; } else { $row->{$titleField} = StringHelper::increment($row->{$titleField}); } } if (property_exists($row, 'title')) { $row->title = htmlspecialchars_decode($row->title, ENT_QUOTES); } if (property_exists($row, 'name')) { $row->name = htmlspecialchars_decode($row->name, ENT_QUOTES); } if (property_exists($row, 'alias')) { if (empty($row->alias)) { $row->alias = $row->{$titleField}; } $row->alias = JApplicationHelper::stringURLSafe($row->alias); // Handle alias for extra languages if (JLanguageMultilang::isEnabled()) { // Build alias alias for other languages $languages = \OSL\Utils\Helper::getLanguages(); if (count($languages)) { foreach ($languages as $language) { $sef = $language->sef; if (!$row->{'alias_' . $sef}) { $row->{'alias_' . $sef} = JApplicationHelper::stringURLSafe($row->{$titleField . '_' . $sef}); } else { $row->{'alias_' . $sef} = JApplicationHelper::stringURLSafe($row->{'alias_' . $sef}); } } } } } if (empty($row->id)) { // Set ordering to the last item if not set if (property_exists($row, 'ordering') && empty($row->ordering)) { $db = $this->getDbo(); $query = $db->getQuery(true) ->select('MAX(ordering)') ->from($db->quoteName($this->table)); $conditions = $this->getReorderConditions($row); if (count($conditions)) { $query->where($conditions); } $db->setQuery($query); $max = $db->loadResult(); $row->ordering = $max + 1; } if (property_exists($row, 'created_date') && !$row->created_date) { $row->created_date = JFactory::getDate()->toSql(); } if (property_exists($row, 'created_by') && !$row->created_by) { $row->created_by = $user->get('id'); } } if (property_exists($row, 'modified_date') && !$row->modified_date) { $row->modified_date = JFactory::getDate()->toSql(); } if (property_exists($row, 'modified_by') && !$row->modified_by) { $row->modified_by = $user->get('id'); } if (property_exists($row, 'params') && is_array($row->params)) { $row->params = json_encode($row->params); } } /** * Give a chance for child class to pre-process the data * * @param $row * @param $input * @param $isNew bool */ protected function beforeStore($row, $input, $isNew) { } /** * Give a chance for child class to post-process the data * * @param $row * @param $input * @param $isNew bool */ protected function afterStore($row, $input, $isNew) { } /** * Give a chance for child class tp pre-process the delete. For example, delete the relation records * * @param array $cid Ids of deleted record */ protected function beforeDelete($cid) { } /** * Give a chance for child class tp post-process the delete. For example, delete the relation records * * @param array $cid Ids of deleted record */ protected function afterDelete($cid) { } /** * Give a chance for child class to pre-process the publish. * * @param array $cid * @param int $state */ protected function beforePublish($cid, $state) { } /** * Give a chance for child class to post-process the publish. * * @param array $cid * @param int $state */ protected function afterPublish($cid, $state) { } } Model/ListModel.php 0000644 00000022613 15115511727 0010222 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Model; use JDatabaseQuery, JPagination; use OSL\Container\Container; /** * Model class for handling lists of items. * * @package OSF * @subpackage Model * @since 1.0 */ class ListModel extends Model { /** * The query object of the model * * @var JDatabaseQuery */ protected $query; /** * List total * * @var integer */ protected $total; /** * Model list data * * @var array */ protected $data; /** * Pagination object * * @var JPagination */ protected $pagination; /** * Name of state field name, usually be tbl.state or tbl.published * * @var string */ protected $stateField; /** * List of fields which will be used for searching data from database table * * @var array */ protected $searchFields = array(); /** * Clear join clause for getTotal method * * @var bool */ protected $clearJoin = true; /** * Instantiate the model. * * @param mixed $config Model configuration data, could be an array or an OSFConfig object * */ public function __construct(Container $container, $config = array()) { parent::__construct($container, $config); $this->query = $this->db->getQuery(true); $fields = array_keys($this->db->getTableColumns($this->table)); if (in_array('ordering', $fields)) { $defaultOrdering = 'tbl.ordering'; } else { $defaultOrdering = 'tbl.id'; } if (in_array('published', $fields)) { $this->stateField = 'tbl.published'; } else { $this->stateField = 'tbl.state'; } if (isset($config['clear_join'])) { $this->clearJoin = $config['clear_join']; } $this->state->insert('limit', 'int', $this->container->appConfig->get('list_limit')) ->insert('limitstart', 'int', 0) ->insert('filter_order', 'cmd', $defaultOrdering) ->insert('filter_order_Dir', 'word', 'asc') ->insert('filter_search', 'string') ->insert('filter_state', 'string') ->insert('filter_access', 'int', 0) ->insert('filter_language', 'string'); if (isset($config['search_fields'])) { $this->searchFields = (array) $config['search_fields']; } else { // Build the search field array automatically, basically, we should search based on name, title, description if these fields are available if (in_array('name', $fields)) { $this->searchFields[] = 'tbl.name'; } if (in_array('title', $fields)) { $this->searchFields[] = 'tbl.title'; } if (in_array('alias', $fields)) { $this->searchFields[] = 'tbl.alias'; } } if (isset($config['remember_states'])) { $this->rememberStates = $config['remember_states']; } elseif ($this->container->app->isClient('administrator')) { $this->rememberStates = true; } } /** * Get a list of items * * @return array */ public function getData() { if (empty($this->data)) { $db = $this->getDbo(); $query = $this->buildListQuery(); $this->beforeQueryData($query); // Adjust the limitStart state property $limit = $this->state->limit; if ($limit) { $offset = $this->state->limitstart; $total = $this->getTotal(); //If the offset is higher than the total recalculate the offset if ($offset !== 0 && $total !== 0) { if ($offset >= $total) { $offset = floor(($total - 1) / $limit) * $limit; $this->state->limitstart = $offset; } } } $db->setQuery($query, $this->state->limitstart, $this->state->limit); $this->data = $db->loadObjectList(); $this->beforeReturnData($this->data); // Store the query so that it can be used in getTotal method if needed $this->query = $query; } return $this->data; } /** * Get total record. Child class should override this method if needed * * @return integer Number of records * */ public function getTotal() { if (empty($this->total)) { $db = $this->getDbo(); $query = $this->buildTotalQuery(); $this->beforeQueryTotal($query); $db->setQuery($query); $this->total = (int) $db->loadResult(); } return $this->total; } /** * Get pagination object * * @return JPagination */ public function getPagination() { // Lets load the content if it doesn't already exist if (empty($this->pagination)) { jimport('joomla.html.pagination'); $this->pagination = new JPagination($this->getTotal(), $this->state->limitstart, $this->state->limit); } return $this->pagination; } /** * Build the query object which is used to get list of records from database * * @return JDatabaseQuery */ protected function buildListQuery() { $query = $this->query; $this->buildQueryColumns($query) ->buildQueryFrom($query) ->buildQueryJoins($query) ->buildQueryWhere($query) ->buildQueryGroup($query) ->buildQueryHaving($query) ->buildQueryOrder($query); return $query; } /** * Build query object use to get total records from database * * @return JDatabaseQuery */ protected function buildTotalQuery() { $query = clone $this->query; $query->clear('select') ->clear('group') ->clear('having') ->clear('order') ->clear('limit') ->select('COUNT(*)'); // Clear join clause if needed if ($this->clearJoin) { $query->clear('join'); } return $query; } /** * Builds SELECT columns list for the query * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryColumns(JDatabaseQuery $query) { $query->select(array('tbl.*')); return $this; } /** * Builds FROM tables list for the query * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryFrom(JDatabaseQuery $query) { $query->from($this->table . ' AS tbl'); return $this; } /** * Builds JOINS clauses for the query * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryJoins(JDatabaseQuery $query) { return $this; } /** * Builds a WHERE clause for the query * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryWhere(JDatabaseQuery $query) { $user = $this->container->user; $db = $this->getDbo(); $state = $this->state; if ($state->filter_state == 'P') { $query->where($this->stateField . ' = 1'); } elseif ($state->filter_state == 'U') { $query->where($this->stateField . ' = 0'); } if ($state->filter_access) { $query->where('tbl.access = ' . (int) $state->filter_access); if (!$user->authorise('core.admin')) { $query->where('tbl.access IN (' . implode(',', $user->getAuthorisedViewLevels()) . ')'); } } if ($state->filter_search) { //Remove blank space from searching $state->filter_search = trim($state->filter_search); if (stripos($state->filter_search, 'id:') === 0) { $query->where('tbl.id = ' . (int) substr($state->filter_search, 3)); } else { $search = $db->quote('%' . $db->escape($state->filter_search, true) . '%', false); if (is_array($this->searchFields)) { $whereOr = array(); foreach ($this->searchFields as $searchField) { $whereOr[] = " LOWER($searchField) LIKE " . $search; } $query->where('(' . implode(' OR ', $whereOr) . ') '); } } } if ($state->filter_language && $state->filter_language != '*') { $query->where('tbl.language IN (' . $db->quote($state->filter_language) . ',' . $db->quote('*') . ', "")'); } return $this; } /** * Builds a GROUP BY clause for the query * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryGroup(JDatabaseQuery $query) { return $this; } /** * Builds a HAVING clause for the query * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryHaving(JDatabaseQuery $query) { return $this; } /** * Builds a generic ORDER BY clasue based on the model's state * * @param JDatabaseQuery $query * * @return $this */ protected function buildQueryOrder(JDatabaseQuery $query) { $sort = $this->state->filter_order; $direction = strtoupper($this->state->filter_order_Dir); if ($sort) { $query->order($sort . ' ' . $direction); } return $this; } /** * This method give child class a chance to adjust the query before it is run to return list of records * * @param JDatabaseQuery $query */ protected function beforeQueryData(JDatabaseQuery $query) { } /** * This method give child class a chance to adjust the query object before it is run to return total records * * @param JDatabaseQuery $query */ protected function beforeQueryTotal(JDatabaseQuery $query) { } /** * This method give child class to adjust the return data in getData method without having to override the * whole method * * @param array $rows */ protected function beforeReturnData($rows) { } } Model/Model.php 0000644 00000017257 15115511727 0007376 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Model; use Exception; use JDatabaseDriver, JText, JTable, JCache; use OSL\Container\Container; use OSL\Input\Input; class Model { /** * The model name * * @var string */ protected $name; /** * Model state * * @var State */ protected $state; /** * The database driver. * * @var JDatabaseDriver */ protected $db; /** * The name of the database table * * @var string */ protected $table; /** * Ignore request or not. If set to Yes, model states won't be set when it is created * * @var boolean */ protected $ignoreRequest = false; /** * Remember model states value in session * * @var boolean */ protected $rememberStates = false; /** * Constructor * * @param mixed $config Model configuration data, could be an array or an OSFConfig object * * @throws Exception */ public function __construct(Container $container, $config = []) { $this->container = $container; if (isset($config['name'])) { $this->name = $config['name']; } else { $r = null; if (!preg_match('/(.*)\\\\Model\\\\(.*)/i', get_class($this), $r)) { throw new Exception(JText::_('JLIB_APPLICATION_ERROR_MODEL_GET_NAME'), 500); } $this->name = $r[2]; } if (isset($config['db'])) { $this->db = $config['db']; } else { $this->db = $container->get('db'); } if (isset($config['state'])) { $this->state = $config['state']; } else { $this->state = new State(); } if (isset($config['table'])) { $this->table = $config['table']; } else { $this->table = $container->tablePrefix . strtolower($container->inflector->pluralize($this->name)); } if (isset($config['ignore_request'])) { $this->ignoreRequest = $config['ignore_request']; } if (isset($config['remember_states'])) { $this->rememberStates = $config['remember_states']; } $this->initialize(); } /** * Populate model state from input */ public function populateState() { if ($this->ignoreRequest) { return; } $input = $this->container->input; $data = $input->getData(); // Try to get the state properties data from user session if ($this->rememberStates) { $properties = $this->state->getProperties(); if (count($properties)) { $context = $this->container->option . '.' . $input->get('view', $this->container->defaultView) . '.'; foreach ($properties as $property) { $newState = $this->getUserStateFromRequest($input, $context . $property, $property); if ($newState != null) { $data[$property] = $newState; } } } } $this->setState($data); } /** * Get JTable object for the model * * @param string $name * * @return JTable */ public function getTable($name = '') { if (!$name) { $name = $this->container->inflector->singularize($this->name); } return $this->container->factory->createTable($name, $this->getDbo()); } /** * Set the model state properties * * @param string|array The name of the property, an array * * @param mixed $value The value of the property * * @return Model */ public function setState($property, $value = null) { $changed = false; if (is_array($property)) { foreach ($property as $key => $value) { if (isset($this->state->$key) && $this->state->$key != $value) { $changed = true; break; } } $this->state->setData($property); } else { if (isset($this->state->$property) && $this->state->$property != $value) { $changed = true; } $this->state->$property = $value; } if ($changed) { // Reset the data $this->data = null; $this->total = null; } return $this; } /** * Get the model state properties * * If no property name is given then the function will return an associative array of all properties. * * @param string $property The name of the property * * @param string $default The default value * * @return mixed <string, State> */ public function getState($property = null, $default = null) { $result = $default; if (is_null($property)) { $result = $this->state; } else { if (isset($this->state->$property)) { $result = $this->state->$property; } } return $result; } /** * Reset all cached data and reset the model state to it's default * * @param boolean $default If TRUE use defaults when resetting. Default is TRUE * * @return $this */ public function reset($default = true) { $this->data = null; $this->total = null; $this->state->reset($default); $this->query = $this->db->getQuery(true); return $this; } /** * Get the dbo * * @return JDatabaseDriver */ public function getDbo() { return $this->db; } /** * Get name of the model * * @return string */ public function getName() { return $this->name; } /** * This blank method give child class a chance to init the class further after being constructed */ protected function initialize() { } /** * Supports a simple form Fluent Interfaces. * Allows you to set states by * using the state name as the method name. * * For example : $model->filter_order('name')->filter_order_Dir('DESC')->limit(10)->getData(); * * @param string $method Method name * * @param array $args Array containing all the arguments for the original call * * @return $this */ public function __call($method, $args) { if (isset($this->state->$method)) { $this->state->set($method, $args[0]); return $this; } return null; } /** * Gets the value of a user state variable. * * @param Input $input The input object * @param string $key The key of the user state variable. * @param string $request The name of the variable passed in a request. * @param string $default The default value for the variable if not found. Optional. * @param string $type Filter for the variable, for valid values see {@link JFilterInput::clean()}. Optional. * * @return object The request user state. */ protected function getUserStateFromRequest($input, $key, $request, $default = null, $type = 'none') { $app = $this->container->app; $currentState = $app->getUserState($key, $default); $newState = $input->get($request, null, $type); // Save the new value only if it was set in this request. if ($newState !== null) { $app->setUserState($key, $newState); } else { $newState = $currentState; } return $newState; } /** * Clean the cache * * @param string $group The cache group * @param integer $client_id The ID of the client * * @return void * */ protected function cleanCache($group = null, $client_id = 0) { $conf = $this->container->appConfig; $options = [ 'defaultgroup' => ($group) ? $group : $this->container->option, 'cachebase' => ($client_id) ? JPATH_ADMINISTRATOR . '/cache' : $conf->get('cache_path', JPATH_SITE . '/cache')]; $cache = JCache::getInstance('callback', $options); $cache->clean(); // Trigger the onContentCleanCache event. if (!empty($this->eventCleanCache)) { $this->container->app->triggerEvent($this->eventCleanCache, $options); } } } Model/State.php 0000644 00000013446 15115511727 0007412 0 ustar 00 <?php /** * @package OSL * @subpackage Model * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Model; use JFilterInput; class State { /** * The state data container * * @var array */ protected $data = array(); /** * Set data for a state * * @param string $name The name of state * @param mixed $value * * @return $this */ public function set($name, $value) { if (isset($this->data[$name])) { $this->data[$name]->value = $value; } return $this; } /** * Retrieve data for a state * * @param string $name Name of the state * * @param mixed $default Default value if no data has been set for that state * * @return mixed The state value */ public function get($name, $default = null) { $result = $default; if (isset($this->data[$name])) { $result = $this->data[$name]->value; } return $result; } /** * Insert a new state * * @param string $name The name of the state * * @param mixed $filter The name of filter which will be used to sanitize the state value using JFilterInput * * @param mixed $default The default value of the state * * @return State */ public function insert($name, $filter, $default = null) { $state = new \stdClass(); $state->name = $name; $state->filter = $filter; $state->value = $default; $state->default = $default; $this->data[$name] = $state; return $this; } /** * Remove an existing state * * @param string $name The name of the state which will be removed * * @return $this */ public function remove($name) { if (isset($this->data[$name])) { unset($this->data[$name]); } return $this; } /** * Reset all state data and revert to the default state * * @param boolean $default If TRUE use defaults when resetting. If FALSE then null value will be used.Default is TRUE * * @return $this */ public function reset($default = true) { foreach ($this->data as $state) { $state->value = $default ? $state->default : null; } return $this; } /** * Set the state data * * This function will only filter values if we have a value. If the value * is an empty string it will be filtered to NULL. * * @param array $data An associative array of state values by name * * @return $this */ public function setData(array $data) { $filterInput = JFilterInput::getInstance(); // Special code for handle ajax ordering in Joomla 3 if (!empty($data['filter_full_ordering'])) { $parts = explode(' ', $data['filter_full_ordering']); $sort = $parts[0]; $direction = isset($parts[1]) ? $parts[1] : ''; $data['filter_order'] = $sort; $data['filter_order_Dir'] = $direction; } // Filter data foreach ($data as $key => $value) { if (isset($this->data[$key])) { $filter = $this->data[$key]->filter; // Only filter if we have a value if ($value !== null) { if ($value !== '') { // Check for a callback filter. if (strpos($filter, '::') !== false && is_callable(explode('::', $filter))) { $value = call_user_func(explode('::', $filter), $value); } // Filter using a callback function if specified. elseif (function_exists($filter)) { $value = call_user_func($filter, $value); } // Filter using JFilterInput. All HTML code is filtered by default. else { $value = $filterInput->clean($value, $filter); } } else { $value = null; } $this->data[$key]->value = $value; } } } return $this; } /** * Get the state data * * This function only returns states that have been been set. * * @return array An associative array of state values by name */ public function getData() { $data = array(); foreach ($this->data as $name => $state) { $data[$name] = $state->value; } return $data; } /** * Get list of state variables is being stored */ public function getProperties() { return array_keys($this->data); } /** * Get default value of a state * * @param string $name * * @return mixed the default state value */ public function getDefault($name) { return $this->data[$name]->default; } /** * Change default value (and therefore value) of an existing state * * @param $name * @param $default * * @return $this */ public function setDefault($name, $default) { if (isset($this->data[$name])) { $this->data[$name]->default = $default; $this->data[$name]->value = $default; } return $this; } /** * Magic method to get state value * * @param string * * @return mixed */ public function __get($name) { return $this->get($name); } /** * Set state value * * @param string $name The user-specified state name. * * @param mixed $value The user-specified state value. * * @return void */ public function __set($name, $value) { $this->set($name, $value); } /** * Test existence of a state variable * * @param string $name The state name * * @return boolean */ public function __isset($name) { return isset($this->data[$name]); } /** * Unset a state value * * @param string $name The state name. * * @return void */ public function __unset($name) { if (isset($this->data[$name])) { $this->data[$name]->value = $this->data[$name]->default; } } } Provider/SystemProvider.php 0000644 00000005400 15115511727 0012052 0 ustar 00 <?php /** * @package OSL * @subpackage Provider * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Provider; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use JFactory, JEventDispatcher, JComponentHelper; use OSL\Input\Input; class SystemProvider implements ServiceProviderInterface { public function register(Container $container) { // Joomla Application $container->share( 'app', function () { return JFactory::getApplication(); }, true ); // Joomla Application Configuration $container->share( 'appConfig', function () { return JFactory::getConfig(); }, true ); // Database $container->share( 'db', function () { return JFactory::getDbo(); }, true ); // Session $container->share( 'session', function () { return JFactory::getSession(); }, true ); // Language $container->share( 'language', function () { return JFactory::getLanguage(); }, true ); if (version_compare(JVERSION, '4.0.0-dev', '<')) { // Joomla Event Dispatcher $container->share( 'eventDispatcher', function () { return JEventDispatcher::getInstance(); }, true ); } // Joomla Mailer $container->share( 'mailer', function () { return JFactory::getMailer(); }, true ); // String Inflector $container->share( 'inflector', function () { return new \OSL\Inflector\Inflector(); }, true ); // Component params $container->share( 'params', function (Container $container) { return JComponentHelper::getParams($container->get('option')); }, true ); // Joomla Document $container->share( 'document', function () { return JFactory::getDocument(); }, true ); // Current Joomla User $container->share( 'user', function () { return JFactory::getUser(); }, true ); // Joomla Input $container->share( 'input', function () { if (version_compare(JVERSION, '4.0.0-dev', 'ge')) { $source = JFactory::getApplication()->input; } else { $source = null; } return new Input($source); } ); // OSL Factory $container->share('factory', function (Container $container) { return new \OSL\Factory\Factory($container); } ); // Current template $container->share('template', function (Container $container) { return $container->get('app')->getTemplate(); } ); } } Utils/Database.php 0000644 00000001552 15115511730 0010063 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Utils; use JDatabaseQuery; class Database { /** * Helper method to get fields from database table in case the site is multilingual * * @param \JDatabaseQuery $query * @param array $fields * @param string $fieldSuffix */ public static function getMultilingualFields(JDatabaseQuery $query, $fields = array(), $fieldSuffix) { foreach ($fields as $field) { $alias = $field; $dotPos = strpos($field, '.'); if ($dotPos !== false) { $alias = substr($field, $dotPos + 1); } $query->select($query->quoteName($field . $fieldSuffix, $alias)); } } } Utils/Helper.php 0000644 00000007716 15115511730 0007606 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Utils; use JComponentHelper, JFactory, JObject; class Helper { /** * Get list of language uses on the site * * @return array */ public static function getLanguages() { $db = JFactory::getDbo(); $query = $db->getQuery(true); $params = JComponentHelper::getParams('com_languages'); $default = $params->get('site', 'en-GB'); $query->select('lang_id, lang_code, title, `sef`') ->from('#__languages') ->where('published = 1') ->where('lang_code != ' . $db->quote($default)) ->order('ordering'); $db->setQuery($query); $languages = $db->loadObjectList(); return $languages; } /** * Get actions can be performed by the current user on the view of a component * * @param string $option Name of the component is being dispatched * * @return JObject Actions which can be performed by the current user */ public static function getActions($option) { $result = new JObject(); $user = JFactory::getUser(); $actions = array('core.admin', 'core.manage', 'core.create', 'core.edit', 'core.edit.own', 'core.edit.state', 'core.delete'); foreach ($actions as $action) { $result->set($action, $user->authorise($action, $option)); } return $result; } /** * Apply some fixes for request data, this method should be called before the dispatcher is called * * @return void */ public static function prepareRequestData() { //Remove cookie vars from request data $cookieVars = array_keys($_COOKIE); if (count($cookieVars)) { foreach ($cookieVars as $key) { if (!isset($_POST[$key]) && !isset($_GET[$key])) { unset($_REQUEST[$key]); } } } if (isset($_REQUEST['start']) && !isset($_REQUEST['limitstart'])) { $_REQUEST['limitstart'] = $_REQUEST['start']; } if (!isset($_REQUEST['limitstart'])) { $_REQUEST['limitstart'] = 0; } } /** * Convert payment amount to from one currency to other currency * * @param float $amount * * @param string $fromCurrency * * @param string $toCurrency * * @return float */ public static function convertPaymentAmount($amount, $fromCurrency, $toCurrency) { $http = \JHttpFactory::getHttp(); $url = 'http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=' . $toCurrency . $fromCurrency . '=X'; $response = $http->get($url); if ($response->code == 200) { $currencyData = explode(',', $response->body); $rate = floatval($currencyData[1]); if ($rate > 0) { $amount = $amount / $rate; } } return round($amount, 2); } /** * Credit Card Type * * Iterates through known/supported card brands to determine the brand of this card * * @param string $cardNumber * * @return string */ public static function getCardType($cardNumber) { $supportedCardTypes = array( 'visa' => '/^4\d{12}(\d{3})?$/', 'mastercard' => '/^(5[1-5]\d{4}|677189)\d{10}$/', 'discover' => '/^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/', 'amex' => '/^3[47]\d{13}$/', 'diners_club' => '/^3(0[0-5]|[68]\d)\d{11}$/', 'jcb' => '/^35(28|29|[3-8]\d)\d{12}$/', 'switch' => '/^6759\d{12}(\d{2,3})?$/', 'solo' => '/^6767\d{12}(\d{2,3})?$/', 'dankort' => '/^5019\d{12}$/', 'maestro' => '/^(5[06-8]|6\d)\d{10,17}$/', 'forbrugsforeningen' => '/^600722\d{10}$/', 'laser' => '/^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/', ); foreach ($supportedCardTypes as $brand => $val) { if (preg_match($val, $cardNumber)) { return $brand; } } return ''; } } Utils/Html.php 0000644 00000007224 15115511730 0007265 0 ustar 00 <?php /** * @package OSL * @subpackage Controller * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\Utils; use JFactory, JFormHelper; use JHtmlSidebar, JHtml, JText; class Html { /** * Add sub-menus which allow users to access to the other views in the component * * @param string $option Name of the component being dispatched * @param string $viewName Name of the view currently displayed */ public static function addSubMenus($option, $viewName) { $db = JFactory::getDbo(); $query = $db->getQuery(true); $baseLink = 'index.php?option=' . $option; $currentViewLink = 'index.php?option=' . $option . '&view=' . $viewName; $query->select('title, link') ->from('#__menu') ->where('link LIKE ' . $db->quote($baseLink . '%')) ->where('parent_id != 1') ->where('client_id = 1') ->order('id'); $db->setQuery($query); $rows = $db->loadObjectList(); foreach ($rows as $row) { JHtmlSidebar::addEntry(JText::_($row->title), $row->link, $row->link == $currentViewLink); } } /** * Get label of the field (including tooltip) * * @param $name * @param $title * @param string $tooltip * * @return string */ public static function getFieldLabel($name, $title, $tooltip = '') { $label = ''; $text = $title; // Build the class for the label. $class = !empty($tooltip) ? 'hasTooltip hasTip' : ''; // Add the opening label tag and main attributes attributes. $label .= '<label id="' . $name . '-lbl" for="' . $name . '" class="' . $class . '"'; // If a description is specified, use it to build a tooltip. if (!empty($tooltip)) { $label .= ' title="' . JHtml::tooltipText(trim($text, ':'), $tooltip, 0) . '"'; } $label .= '>' . $text . '</label>'; return $label; } /** * Get bootstrapped style boolean input * * @param $name * @param $value * * @return string */ /** * Get bootstrapped style boolean input * * @param $name * @param $value * * @return string */ public static function getBooleanInput($name, $value) { JHtml::_('jquery.framework'); $value = (int) $value; $field = JFormHelper::loadFieldType('Radio'); $element = new \SimpleXMLElement('<field />'); $element->addAttribute('name', $name); if (version_compare(JVERSION, '4.0.0-dev', '>=')) { $element->addAttribute('class', 'switcher'); $element->addAttribute('layout', 'joomla.form.field.radio.switcher'); } else { $element->addAttribute('class', 'radio btn-group btn-group-yesno'); } $element->addAttribute('default', '0'); $node = $element->addChild('option', 'JNO'); $node->addAttribute('value', '0'); $node = $element->addChild('option', 'JYES'); $node->addAttribute('value', '1'); $field->setup($element, $value); return $field->input; } /** * Generate User Input Select * * @param int $userId * @param string $name * @param array $attributes * * @return string */ public static function getUserInput($userId, $name = 'user_id', array $attributes = array()) { /* @var \JFormField $field */ $field = JFormHelper::loadFieldType('User'); $element = new \SimpleXMLElement('<field />'); $element->addAttribute('name', $name); $element->addAttribute('class', 'readonly'); foreach ($attributes as $key => $value) { $element->addAttribute($key, $value); } $field->setup($element, $userId); return $field->input; } } View/AbstractView.php 0000644 00000004412 15115511730 0010565 0 ustar 00 <?php /** * @package OSL * @subpackage View * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\View; use Exception, JText; use OSL\Container\Container; use OSL\Model\Model; /** * Class AbstractView * * Joomla CMS Base View Class */ abstract class AbstractView { /** * Name of the view * * @var string */ protected $name; /** * The model object. * * @var Model */ protected $model; /** * Determine the view has a model associated with it or not. * If set to No, no model will be created and assigned to the view method when the view is being created * * @var boolean */ public $hasModel = true; /** * Constructor * * @param Container $container * @param array $config * * @throws Exception */ public function __construct(Container $container, $config = array()) { $this->container = $container; // Set the view name if (isset($config['name'])) { $this->name = $config['name']; } else { $className = get_class($this); $r = null; if (!preg_match('/(.*)\\\\View\\\\(.*)\\\\(.*)/i', $className, $r)) { throw new Exception(JText::_('Could not detect the name from class' . $className), 500); } $this->name = $r[2]; } if (isset($config['has_model'])) { $this->hasModel = $config['has_model']; } $this->initialize(); } /** * Get name of the current view * * @return string */ public function getName() { return $this->name; } /** * Set the model object * * @param Model $model */ public function setModel(Model $model) { $this->model = $model; } /** * Get the model object * * @return Model */ public function getModel() { return $this->model; } /** * Method to escape output. * * @param string $output The output to escape. * * @return string The escaped output. * */ public function escape($output) { return $output; } /** * This blank method give child class a chance to init the class further after being constructed */ protected function initialize() { } } View/CsvView.php 0000644 00000000436 15115511730 0007557 0 ustar 00 <?php /** * @package OSL * @subpackage View * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\View; class CsvView extends AbstractView { } View/HtmlView.php 0000644 00000017143 15115511731 0007734 0 ustar 00 <?php /** * @package OSL * @subpackage View * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\View; use JUri, JPath; use OSL\Container\Container; jimport('joomla.filesystem.path'); /** * Class HtmlView * * @property-read \JDocumentHtml $document * @property-read \OSL\Input\Input $input * */ class HtmlView extends AbstractView { /** * The view layout. * * @var string */ protected $layout = 'default'; /** * The paths queue. * * @var array */ protected $paths = array(); /** * ID of the active menu item, use as default Itemid for links in the view * * @var int */ public $Itemid; /** * This is a front-end or back-end view. * We need this field to determine whether we need to addToolbar or build the filter * * @var boolean */ protected $isAdminView = false; /** * Options to allow hide default toolbar buttons from backend view * * @var array */ protected $hideButtons = array(); /** * JDocumentHtml document object, used to process meta data for menu item in frontend * * @var \JDocumentHtml */ protected $document = null; /** * Relative base URI * * @var string */ protected $relativeRootUri = null; /** * Absolute base URI * * @var string */ protected $rootUri = null; /** * Method to instantiate the view. * * @param array $config A named configuration array for object construction * */ public function __construct(Container $container, $config = array()) { parent::__construct($container, $config); if (isset($config['layout'])) { $this->layout = $config['layout']; } if (isset($config['paths'])) { $this->paths = $config['paths']; } if (isset($config['is_admin_view'])) { $this->isAdminView = $config['is_admin_view']; } else { $this->isAdminView = $this->container->app->isClient('administrator'); } if (isset($config['hide_buttons'])) { $this->paths = $config['hide_buttons']; } $this->Itemid = $this->input->getInt('Itemid', 0); // Uris used for link to resources like css, js, images $this->relativeRootUri = JUri::root(true) . '/'; $this->rootUri = JUri::root(); } /** * Method to display the view */ public function display() { echo $this->render(); } /** * Magic toString method that is a proxy for the render method. * * @return string */ public function __toString() { return $this->render(); } /** * Method to escape output. * * @param string $output The output to escape. * * @return string The escaped output. */ public function escape($output) { return htmlspecialchars($output, ENT_COMPAT, 'UTF-8'); } /** * Method to get the view layout. * * @return string The layout name. */ public function getLayout() { return $this->layout; } /** * Method to get the layout path. * * @param string $layout The layout name. * * @return mixed The layout file name if found, false otherwise. */ public function getPath($layout) { $path = ''; // Try to find the layout file with the following priority order: Device type, Joomla version, Default Layout $filesToFind = array($layout); foreach ($filesToFind as $fileLayout) { $file = JPath::clean($fileLayout . '.php'); $path = JPath::find($this->paths, $file); if ($path) { break; } } return $path; } /** * Method to get the view paths. * * @return array The paths queue. * */ public function getPaths() { return $this->paths; } /** * Method to render the view. * * @return string The rendered view. * * @throws \RuntimeException */ public function render() { $this->beforeRender(); // Get the layout path. $path = $this->getPath($this->getLayout()); // Check if the layout path was found. if (!$path) { throw new \RuntimeException('Layout Path Not Found'); } // Start an output buffer. ob_start(); // Load the layout. include $path; // Get the layout contents. return ob_get_clean(); } /** * Load sub-template for the current layout * * @param string $template * * @throws \RuntimeException * * @return string The output of sub-layout */ public function loadTemplate($template, $data = array()) { // Get the layout path. $path = $this->getPath($this->getLayout() . '_' . $template); // Check if the layout path was found. if (!$path) { throw new \RuntimeException('Layout Path Not Found'); } extract($data); // Start an output buffer. ob_start(); // Load the layout. include $path; // Get the layout contents. return ob_get_clean(); } /** * Load sub-template for the current layout * * @param string $layout * * @throws \RuntimeException * * @return string The output of sub-layout */ public function loadCommonLayout($layout, $data = array()) { // Get the layout path. $path = $this->getPath($layout); // Check if the layout path was found. if (!$path) { throw new \RuntimeException('Layout Path Not Found'); } extract($data); // Start an output buffer. ob_start(); // Load the layout. include $path; // Get the layout contents. return ob_get_clean(); } /** * Method to set the view layout. * * @param string $layout The layout name. * * @return HtmlView Method supports chaining. */ public function setLayout($layout) { $this->layout = $layout; return $this; } /** * Method to set the view paths. * * @param array $paths The paths queue. * * @return HtmlView Method supports chaining. * */ public function setPaths($paths) { $this->paths = $paths; return $this; } /** * Magic get method. Handles magic properties: * $this->document mapped to $this->container->document * * @param string $name The property to fetch * * @return mixed|null */ public function __get($name) { $magicProperties = array( 'document', 'input', ); if (in_array($name, $magicProperties)) { return $this->container->get($name); } } /** * Child class can use this method to get additional data needed for the view before it is rendered */ protected function beforeRender() { } /** * Set document meta data * * @param \Joomla\Registry\Registry $params * * @return void */ protected function setDocumentMetadata($params) { /* @var \JDocumentHtml $document */ $document = $this->container->document; $siteNamePosition = $this->container->appConfig->get('sitename_pagetitles'); $siteName = $this->container->appConfig->get('sitename'); if ($pageTitle = $params->get('page_title')) { if ($siteNamePosition == 0) { $document->setTitle($pageTitle); } elseif ($siteNamePosition == 1) { $document->setTitle($siteName . ' - ' . $pageTitle); } else { $document->setTitle($pageTitle . ' - ' . $siteName); } } if ($params->get('menu-meta_keywords')) { $document->setMetaData('keywords', $params->get('menu-meta_keywords')); } if ($params->get('menu-meta_description')) { $document->setDescription($params->get('menu-meta_description')); } if ($params->get('robots')) { $document->setMetaData('robots', $params->get('robots')); } } } View/ItemView.php 0000644 00000006576 15115511731 0007736 0 ustar 00 <?php /** * @package OSL * @subpackage View * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\View; use OSL\Utils\Html as HtmlUtils; use JHtml, JLanguageHelper, JToolbarHelper, JText; /** * Class ItemView * * Joomla CMS Item View Class. This class is used to display details information of an item * or display form allow add/editing items * * @property \OSL\Model\AdminModel $model * */ class ItemView extends HtmlView { /** * The model state. * * @var \OSL\Model\State */ protected $state; /** * The record which is being added/edited * * @var Object */ protected $item; /** * The array which keeps list of "list" options which will be displayed on the form * * @var array $lists */ protected $lists = array(); /** * Active languages use on the site * * @var array */ protected $languages = array(); /** * Method to prepare all the data for the view before it is displayed */ protected function beforeRender() { $this->state = $this->model->getState(); $this->item = $this->model->getData(); if (property_exists($this->item, 'published')) { $this->lists['published'] = HtmlUtils::getBooleanInput('published', $this->item->published); } if (property_exists($this->item, 'access')) { $this->lists['access'] = JHtml::_('access.level', 'access', $this->item->access, 'class="form-select"', false); } if (property_exists($this->item, 'language')) { $this->lists['language'] = JHtml::_('select.genericlist', JHtml::_('contentlanguage.existing', true, true), 'language', 'class="form-select"', 'value', 'text', $this->item->language); } $this->languages = JLanguageHelper::getLanguages(); if ($this->isAdminView) { $this->addToolbar(); } } /** * Add toolbar buttons for add/edit item form */ protected function addToolbar() { $helperClass = $this->container->componentNamespace . '\\Site\\Helper\\Helper'; if (is_callable($helperClass . '::getActions')) { $canDo = call_user_func(array($helperClass, 'getActions'), $this->name, $this->state); } else { $canDo = call_user_func(array('\\OSL\Utils\\Helper', 'getActions'), $this->container->option); } if ($this->item->id) { $toolbarTitle = $this->container->languagePrefix . '_' . $this->name . '_EDIT'; } else { $toolbarTitle = $this->container->languagePrefix . '_' . $this->name . '_NEW'; } JToolbarHelper::title(JText::_(strtoupper($toolbarTitle))); if (($canDo->get('core.edit') || ($canDo->get('core.create'))) && !in_array('save', $this->hideButtons)) { JToolbarHelper::apply('apply', 'JTOOLBAR_APPLY'); JToolbarHelper::save('save', 'JTOOLBAR_SAVE'); } if ($canDo->get('core.create') && !in_array('save2new', $this->hideButtons)) { JToolbarHelper::custom('save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false); } if ($this->item->id && $canDo->get('core.create') && !in_array('save2copy', $this->hideButtons)) { JToolbarHelper::save2copy('save2copy'); } if ($this->item->id) { JToolbarHelper::cancel('cancel', 'JTOOLBAR_CLOSE'); } else { JToolbarHelper::cancel('cancel', 'JTOOLBAR_CANCEL'); } } } View/JsonView.php 0000644 00000000437 15115511731 0007737 0 ustar 00 <?php /** * @package OSL * @subpackage View * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\View; class JsonView extends AbstractView { } View/ListView.php 0000644 00000007634 15115511731 0007747 0 ustar 00 <?php /** * @package OSL * @subpackage View * * @copyright Copyright (C) 2016 Ossolution Team, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ namespace OSL\View; use JHtml, JHtmlSidebar, JText, JToolbarHelper; /** * Joomla CMS View List class, used to render list of records from front-end or back-end of your component * * @package OSF * @subpackage View * @since 1.0 * * @property \OSL\Model\ListModel $model */ class ListView extends HtmlView { /** * The model state * * @var \OSL\Model\State */ protected $state; /** * List of records which will be displayed * * @var array */ protected $items; /** * The pagination object * * @var \JPagination */ protected $pagination; /** * The array which keeps list of "list" options which will used to display as the filter on the list * * @var array $lists */ protected $lists = array(); /** * The sidebar * * @var string */ protected $sidebar = ''; /** * Prepare the view before it is displayed * */ protected function beforeRender() { $this->state = $this->model->getState(); $this->items = $this->model->getData(); $this->pagination = $this->model->getPagination(); if ($this->isAdminView) { $this->lists['filter_state'] = str_replace('class="inputbox"', 'class="input-medium"', JHtml::_('grid.state', $this->state->filter_state)); $this->lists['filter_access'] = JHtml::_('access.level', 'filter_access', $this->state->filter_access, 'class="input-medium" onchange="submit();"', true); $this->lists['filter_language'] = JHtml::_('select.genericlist', JHtml::_('contentlanguage.existing', true, true), 'filter_language', ' onchange="submit();" ', 'value', 'text', $this->state->filter_language); $helperClass = $this->container->componentNamespace . '\\Site\\Helper\\Html'; if (is_callable($helperClass . '::addSubMenus')) { call_user_func(array($helperClass, 'addSubMenus'), $this->name); } else { \OSL\Utils\Html::addSubMenus($this->container->option, $this->name); } if (version_compare(JVERSION, '4.0.0-dev', '<')) { $this->sidebar = JHtmlSidebar::render(); } $this->addToolbar(); } } /** * Method to add toolbar buttons * */ protected function addToolbar() { $helperClass = $this->container->componentNamespace . '\\Site\\Helper\\Helper'; if (is_callable($helperClass . '::getActions')) { $canDo = call_user_func(array($helperClass, 'getActions'), $this->name, $this->state); } else { $canDo = call_user_func(array('\\OSL\Utils\\Helper', 'getActions'), $this->container->option); } $languagePrefix = $this->container->languagePrefix; JToolbarHelper::title(JText::_(strtoupper($languagePrefix . '_' . $this->container->inflector->singularize($this->name) . '_MANAGEMENT')), 'link ' . $this->name); if ($canDo->get('core.create') && !in_array('add', $this->hideButtons)) { JToolbarHelper::addNew('add', 'JTOOLBAR_NEW'); } if ($canDo->get('core.edit') && isset($this->items[0]) && !in_array('edit', $this->hideButtons)) { JToolbarHelper::editList('edit', 'JTOOLBAR_EDIT'); } if ($canDo->get('core.delete') && isset($this->items[0]) && !in_array('delete', $this->hideButtons)) { JToolbarHelper::deleteList(JText::_($languagePrefix . '_DELETE_CONFIRM'), 'delete'); } if ($canDo->get('core.edit.state') && !in_array('publish', $this->hideButtons)) { if (isset($this->items[0]->published) || isset($this->items[0]->state)) { JToolbarHelper::publish('publish', 'JTOOLBAR_PUBLISH', true); JToolbarHelper::unpublish('unpublish', 'JTOOLBAR_UNPUBLISH', true); } } if ($canDo->get('core.admin')) { JToolbarHelper::preferences($this->container->option); } } }
| ver. 1.4 |
Github
|
.
| PHP 8.1.33 | Генерация страницы: 0.19 |
proxy
|
phpinfo
|
Настройка