Spade
Mini Shell
| Directory:~$ /home/lmsyaran/public_html/joomla4/ |
| [Home] [System Details] [Kill Me] |
PK�c�[���W��Config/Config.phpnu�[���<?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]);
}
}PK�c�[��i^Container/Container.phpnu�[���<?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);
}
}PK�c�[�s��66!Container/ContainerAwareTrait.phpnu�[���<?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;
}
}
PK�c�[�5b6G)G)Controller/AdminController.phpnu�[���<?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;
}
}PK�c�[A9�k0k0Controller/Controller.phpnu�[���<?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'));
}
}PK�c�[U�B�n
n
Controller/Download.phpnu�[���<?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';
}
}PK�c�[Tb!���Factory/Factory.phpnu�[���<?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);
}
}PK�c�[*>���4�4Inflector/Inflector.phpnu�[���<?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;
}
}PK�c�[�'3���init.phpnu�[���<?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__);
}
PK�c�[guInput/Input.phpnu�[���<?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];
}
}
}PK�c�[e�6�;;Model/AdminModel.phpnu�[���<?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)
{
}
}PK�c�[���%�%Model/ListModel.phpnu�[���<?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)
{
}
}
PK�c�[�z[ԯ�Model/Model.phpnu�[���<?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);
}
}
}PK�c�[}�'�&&Model/State.phpnu�[���<?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;
}
}
}PK�c�[�$Provider/SystemProvider.phpnu�[���<?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();
}
);
}
}PK�c�[�V�jjUtils/Database.phpnu�[���<?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));
}
}
}PK�c�[�~����Utils/Helper.phpnu�[���<?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 '';
}
}PK�c�[�Y���Utils/Html.phpnu�[���<?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;
}
}PK�c�[�.�
View/AbstractView.phpnu�[���<?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()
{
}
}PK�c�[ N��View/CsvView.phpnu�[���<?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
{
}PK�c�[��ccView/HtmlView.phpnu�[���<?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'));
}
}
}PK�c�[
��~
~
View/ItemView.phpnu�[���<?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');
}
}
}PK�c�[��ѢView/JsonView.phpnu�[���<?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
{
}PK�c�[6����View/ListView.phpnu�[���<?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);
}
}
}PK�c�[���W��Config/Config.phpnu�[���PK�c�[��i^�Container/Container.phpnu�[���PK�c�[�s��66!N*Container/ContainerAwareTrait.phpnu�[���PK�c�[�5b6G)G)�.Controller/AdminController.phpnu�[���PK�c�[A9�k0k0jXController/Controller.phpnu�[���PK�c�[U�B�n
n
�Controller/Download.phpnu�[���PK�c�[Tb!���ӓFactory/Factory.phpnu�[���PK�c�[*>���4�4�Inflector/Inflector.phpnu�[���PK�c�[�'3���%�init.phpnu�[���PK�c�[gu��Input/Input.phpnu�[���PK�c�[e�6�;;Q�Model/AdminModel.phpnu�[���PK�c�[���%�%�&Model/ListModel.phpnu�[���PK�c�[�z[ԯ�tLModel/Model.phpnu�[���PK�c�[}�'�&&bkModel/State.phpnu�[���PK�c�[�$ǂProvider/SystemProvider.phpnu�[���PK�c�[�V�jj�Utils/Database.phpnu�[���PK�c�[�~������Utils/Helper.phpnu�[���PK�c�[�Y���̡Utils/Html.phpnu�[���PK�c�[�.�
��View/AbstractView.phpnu�[���PK�c�[
N���View/CsvView.phpnu�[���PK�c�[��ccK�View/HtmlView.phpnu�[���PK�c�[
��~
~
��View/ItemView.phpnu�[���PK�c�[��Ѣ��View/JsonView.phpnu�[���PK�c�[6�����View/ListView.phpnu�[���PK��