home page start
This commit is contained in:
parent
a127e80bd4
commit
9489f49958
2
artisan
2
artisan
|
|
@ -28,7 +28,7 @@ $app = require_once __DIR__.'/bootstrap/app.php';
|
|||
|
|
||||
*/
|
||||
|
||||
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
|
||||
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
|
||||
|
||||
$status = $kernel->handle(
|
||||
$input = new Symfony\Component\Console\Input\ArgvInput,
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ $app = require_once __DIR__.'/bootstrap/app.php';
|
|||
|
|
||||
*/
|
||||
|
||||
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
|
||||
$kernel = $app->make('Illuminate\Contracts\Http\Kernel');
|
||||
|
||||
$response = $kernel->handle(
|
||||
$request = Illuminate\Http\Request::capture()
|
||||
|
|
|
|||
|
|
@ -80,7 +80,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
$combiner->registerBundle('~/modules/backend/formwidgets/colorpicker/assets/less/colorpicker.less');
|
||||
$combiner->registerBundle('~/modules/backend/formwidgets/permissioneditor/assets/less/permissioneditor.less');
|
||||
$combiner->registerBundle('~/modules/backend/formwidgets/markdowneditor/assets/less/markdowneditor.less');
|
||||
$combiner->registerBundle('~/modules/backend/formwidgets/sensitive/assets/less/sensitive.less');
|
||||
|
||||
/*
|
||||
* Rich Editor is protected by DRM
|
||||
|
|
@ -165,16 +164,10 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
'backend.manage_editor' => [
|
||||
'label' => 'system::lang.permissions.manage_editor',
|
||||
'tab' => 'system::lang.permissions.name',
|
||||
'roles' => UserRole::CODE_DEVELOPER,
|
||||
],
|
||||
'backend.manage_own_editor' => [
|
||||
'label' => 'system::lang.permissions.manage_own_editor',
|
||||
'tab' => 'system::lang.permissions.name',
|
||||
],
|
||||
'backend.manage_branding' => [
|
||||
'label' => 'system::lang.permissions.manage_branding',
|
||||
'tab' => 'system::lang.permissions.name',
|
||||
'roles' => UserRole::CODE_DEVELOPER,
|
||||
],
|
||||
'media.manage_media' => [
|
||||
'label' => 'backend::lang.permissions.manage_media',
|
||||
|
|
@ -209,7 +202,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
$manager->registerFormWidget('Backend\FormWidgets\TagList', 'taglist');
|
||||
$manager->registerFormWidget('Backend\FormWidgets\MediaFinder', 'mediafinder');
|
||||
$manager->registerFormWidget('Backend\FormWidgets\NestedForm', 'nestedform');
|
||||
$manager->registerFormWidget('Backend\FormWidgets\Sensitive', 'sensitive');
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -679,10 +679,9 @@ nav#layout-mainmenu .toolbar-item:before {left:-12px}
|
|||
nav#layout-mainmenu .toolbar-item:after {right:-12px}
|
||||
nav#layout-mainmenu .toolbar-item.scroll-active-before:before {color:#fff}
|
||||
nav#layout-mainmenu .toolbar-item.scroll-active-after:after {color:#fff}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action {margin:0}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action:first-child {margin-left:21px}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action i {font-size:20px}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action a {position:relative;padding:0 10px;top:-1px}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview {margin:0 0 0 21px}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview i {font-size:20px}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview a {position:relative;padding:0 10px;top:-1px}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account {margin-right:0}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account >a {padding:0 15px 0 10px;font-size:13px;position:relative}
|
||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account.highlight >a {z-index:600}
|
||||
|
|
@ -707,8 +706,8 @@ nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after {c
|
|||
nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider {height:1px;width:100%;background-color:#e0e0e0}
|
||||
nav#layout-mainmenu.navbar-mode-inline,
|
||||
nav#layout-mainmenu.navbar-mode-inline_no_icons {height:60px}
|
||||
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-quick-action a,
|
||||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-quick-action a {height:60px;line-height:60px}
|
||||
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-preview a,
|
||||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-preview a {height:60px;line-height:60px}
|
||||
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-account >a,
|
||||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-account >a {height:60px;line-height:60px}
|
||||
nav#layout-mainmenu.navbar-mode-inline ul li .mainmenu-accountmenu,
|
||||
|
|
@ -731,7 +730,7 @@ nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:last-child,
|
|||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:last-child {margin-right:0}
|
||||
nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon {display:none !important}
|
||||
nav#layout-mainmenu.navbar-mode-tile {height:78px}
|
||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-quick-action a {height:78px;line-height:78px}
|
||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-preview a {height:78px;line-height:78px}
|
||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-account >a {height:78px;line-height:78px}
|
||||
nav#layout-mainmenu.navbar-mode-tile ul li .mainmenu-accountmenu {top:88px}
|
||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
|
||||
|
|
@ -750,14 +749,14 @@ nav#layout-mainmenu .menu-toggle .menu-toggle-title {margin-left:10px}
|
|||
nav#layout-mainmenu .menu-toggle:hover .menu-toggle-icon {opacity:1}
|
||||
body.mainmenu-open nav#layout-mainmenu .menu-toggle-icon {opacity:1}
|
||||
nav#layout-mainmenu.navbar-mode-collapse {padding-left:0;height:45px}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-quick-action a {height:45px;line-height:45px}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-preview a {height:45px;line-height:45px}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu {top:55px}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu:after {right:13px}
|
||||
nav#layout-mainmenu.navbar-mode-collapse ul.nav {display:none}
|
||||
nav#layout-mainmenu.navbar-mode-collapse .menu-toggle {display:inline-block;color:#fff !important}
|
||||
@media (max-width:769px) {nav#layout-mainmenu.navbar {padding-left:0;height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-quick-action a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu {top:55px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0 }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after {right:13px }nav#layout-mainmenu.navbar ul.nav {display:none }nav#layout-mainmenu.navbar .menu-toggle {display:inline-block;color:#fff !important }}
|
||||
@media (max-width:769px) {nav#layout-mainmenu.navbar {padding-left:0;height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-preview a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu {top:55px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0 }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after {right:13px }nav#layout-mainmenu.navbar ul.nav {display:none }nav#layout-mainmenu.navbar .menu-toggle {display:inline-block;color:#fff !important }}
|
||||
.mainmenu-collapsed {position:absolute;height:100%;top:0;left:0;margin:0;background:#000}
|
||||
.mainmenu-collapsed >div {display:block;height:100%}
|
||||
.mainmenu-collapsed >div ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ body.mainmenu-open {
|
|||
height: @height;
|
||||
|
||||
ul.mainmenu-toolbar {
|
||||
li.mainmenu-quick-action {
|
||||
li.mainmenu-preview {
|
||||
a {
|
||||
height: @height;
|
||||
line-height: @height;
|
||||
|
|
@ -191,12 +191,8 @@ nav#layout-mainmenu {
|
|||
//
|
||||
|
||||
ul.mainmenu-toolbar {
|
||||
li.mainmenu-quick-action {
|
||||
margin: 0;
|
||||
|
||||
&:first-child {
|
||||
margin-left: 21px;
|
||||
}
|
||||
li.mainmenu-preview {
|
||||
margin: 0 0 0 21px;
|
||||
|
||||
i {
|
||||
font-size: 20px;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ use Backend\Behaviors\ImportExportController\TranscodeFilter;
|
|||
use Illuminate\Database\Eloquent\MassAssignmentException;
|
||||
use League\Csv\Reader as CsvReader;
|
||||
use League\Csv\Writer as CsvWriter;
|
||||
use League\Csv\EscapeFormula as CsvEscapeFormula;
|
||||
use October\Rain\Parse\League\EscapeFormula as CsvEscapeFormula;
|
||||
use ApplicationException;
|
||||
use SplTempFileObject;
|
||||
use Exception;
|
||||
|
|
@ -624,7 +624,9 @@ class ImportExportController extends ControllerBehavior
|
|||
$csv->setDelimiter($options['delimiter']);
|
||||
$csv->setEnclosure($options['enclosure']);
|
||||
$csv->setEscape($options['escape']);
|
||||
$csv->addFormatter(new CsvEscapeFormula());
|
||||
|
||||
// Temporary until upgrading to league/csv >= 9.1.0 (will be $csv->addFormatter($formatter))
|
||||
$formatter = new CsvEscapeFormula();
|
||||
|
||||
/*
|
||||
* Add headers
|
||||
|
|
@ -660,6 +662,9 @@ class ImportExportController extends ControllerBehavior
|
|||
$record[] = $value;
|
||||
}
|
||||
|
||||
// Temporary until upgrading to league/csv >= 9.1.0
|
||||
$record = $formatter($record);
|
||||
|
||||
$csv->insertOne($record);
|
||||
}
|
||||
|
||||
|
|
@ -803,9 +808,9 @@ class ImportExportController extends ControllerBehavior
|
|||
|
||||
if (
|
||||
$options['encoding'] !== null &&
|
||||
$reader->supportsStreamFilter()
|
||||
$reader->isActiveStreamFilter()
|
||||
) {
|
||||
$reader->addStreamFilter(sprintf(
|
||||
$reader->appendStreamFilter(sprintf(
|
||||
'%s%s:%s',
|
||||
TranscodeFilter::FILTER_NAME,
|
||||
strtolower($options['encoding']),
|
||||
|
|
|
|||
|
|
@ -297,6 +297,16 @@ class ListController extends ControllerBehavior
|
|||
return call_user_func_array([$this->controller, 'onDelete'], func_get_args());
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate checked identifiers
|
||||
*/
|
||||
$checkedIds = post('checked');
|
||||
|
||||
if (!$checkedIds || !is_array($checkedIds) || !count($checkedIds)) {
|
||||
Flash::error(Lang::get('backend::lang.list.delete_selected_empty'));
|
||||
return $this->controller->listRefresh();
|
||||
}
|
||||
|
||||
/*
|
||||
* Establish the list definition
|
||||
*/
|
||||
|
|
@ -308,20 +318,6 @@ class ListController extends ControllerBehavior
|
|||
|
||||
$listConfig = $this->controller->listGetConfig($definition);
|
||||
|
||||
/*
|
||||
* Validate checked identifiers
|
||||
*/
|
||||
$checkedIds = post('checked');
|
||||
|
||||
if (!$checkedIds || !is_array($checkedIds) || !count($checkedIds)) {
|
||||
Flash::error(Lang::get(
|
||||
(!empty($listConfig->noRecordsDeletedMessage))
|
||||
? $listConfig->noRecordsDeletedMessage
|
||||
: 'backend::lang.list.delete_selected_empty'
|
||||
));
|
||||
return $this->controller->listRefresh();
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the model
|
||||
*/
|
||||
|
|
@ -348,18 +344,10 @@ class ListController extends ControllerBehavior
|
|||
$record->delete();
|
||||
}
|
||||
|
||||
Flash::success(Lang::get(
|
||||
(!empty($listConfig->deleteMessage))
|
||||
? $listConfig->deleteMessage
|
||||
: 'backend::lang.list.delete_selected_success'
|
||||
));
|
||||
Flash::success(Lang::get('backend::lang.list.delete_selected_success'));
|
||||
}
|
||||
else {
|
||||
Flash::error(Lang::get(
|
||||
(!empty($listConfig->noRecordsDeletedMessage))
|
||||
? $listConfig->noRecordsDeletedMessage
|
||||
: 'backend::lang.list.delete_selected_empty'
|
||||
));
|
||||
Flash::error(Lang::get('backend::lang.list.delete_selected_empty'));
|
||||
}
|
||||
|
||||
return $this->controller->listRefresh($definition);
|
||||
|
|
|
|||
|
|
@ -669,9 +669,8 @@ class RelationController extends ControllerBehavior
|
|||
$config->defaultSort = $this->getConfig('view[defaultSort]');
|
||||
$config->recordsPerPage = $this->getConfig('view[recordsPerPage]');
|
||||
$config->showCheckboxes = $this->getConfig('view[showCheckboxes]', !$this->readOnly);
|
||||
$config->recordUrl = $this->getConfig('view[recordUrl]');
|
||||
$config->customViewPath = $this->getConfig('view[customViewPath]');
|
||||
$config->noRecordsMessage = $this->getConfig('view[noRecordsMessage]');
|
||||
$config->recordUrl = $this->getConfig('view[recordUrl]', null);
|
||||
$config->customViewPath = $this->getConfig('view[customViewPath]', null);
|
||||
|
||||
$defaultOnClick = sprintf(
|
||||
"$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s')",
|
||||
|
|
@ -819,7 +818,6 @@ class RelationController extends ControllerBehavior
|
|||
$config->showSorting = $this->getConfig('manage[showSorting]', !$isPivot);
|
||||
$config->defaultSort = $this->getConfig('manage[defaultSort]');
|
||||
$config->recordsPerPage = $this->getConfig('manage[recordsPerPage]');
|
||||
$config->noRecordsMessage = $this->getConfig('manage[noRecordsMessage]');
|
||||
|
||||
if ($this->viewMode == 'single') {
|
||||
$config->showCheckboxes = false;
|
||||
|
|
@ -1115,7 +1113,7 @@ class RelationController extends ControllerBehavior
|
|||
$this->relationObject->add($newModel, $sessionKey);
|
||||
}
|
||||
elseif ($this->viewMode == 'single') {
|
||||
$newModel = $this->viewModel = $this->viewWidget->model = $this->manageWidget->model;
|
||||
$newModel = $this->manageWidget->model;
|
||||
$this->viewWidget->setFormValues($saveData);
|
||||
|
||||
/*
|
||||
|
|
@ -1125,15 +1123,6 @@ class RelationController extends ControllerBehavior
|
|||
$newModel->save(null, $this->manageWidget->getSessionKey());
|
||||
}
|
||||
|
||||
if ($this->relationType === 'hasOne') {
|
||||
// Unassign previous relation if one is already assigned
|
||||
$relation = $this->relationObject->getParent()->{$this->relationName} ?? null;
|
||||
|
||||
if ($relation) {
|
||||
$this->relationObject->remove($relation, $sessionKey);
|
||||
}
|
||||
}
|
||||
|
||||
$this->relationObject->add($newModel, $sessionKey);
|
||||
|
||||
/*
|
||||
|
|
@ -1168,11 +1157,7 @@ class RelationController extends ControllerBehavior
|
|||
}
|
||||
}
|
||||
elseif ($this->viewMode == 'single') {
|
||||
// Ensure that the view widget model is the same instance as the manage widget model
|
||||
// since they will technically be different object instances in this context as
|
||||
// $viewWidet->model is populated by $this->relationObject->getResults() and
|
||||
// $manageWidget->model is populated by $this->relationModel->find($manageId);
|
||||
$this->viewModel = $this->viewWidget->model = $this->manageWidget->model;
|
||||
$this->viewModel = $this->manageWidget->model;
|
||||
|
||||
$this->viewWidget->setFormValues($saveData);
|
||||
$this->viewModel->save(null, $this->manageWidget->getSessionKey());
|
||||
|
|
@ -1256,15 +1241,6 @@ class RelationController extends ControllerBehavior
|
|||
*/
|
||||
elseif ($this->viewMode == 'single') {
|
||||
if ($recordId && ($model = $this->relationModel->find($recordId))) {
|
||||
if ($this->relationType === 'hasOne') {
|
||||
// Unassign previous relation if one is already assigned
|
||||
$relation = $this->relationObject->getParent()->{$this->relationName} ?? null;
|
||||
|
||||
if ($relation) {
|
||||
$this->relationObject->remove($relation, $sessionKey);
|
||||
}
|
||||
}
|
||||
|
||||
$this->relationObject->add($model, $sessionKey);
|
||||
$this->viewWidget->setFormValues($model->attributes);
|
||||
|
||||
|
|
@ -1333,11 +1309,7 @@ class RelationController extends ControllerBehavior
|
|||
}
|
||||
}
|
||||
|
||||
// Reinitialise the form with a blank model
|
||||
$this->initRelation($this->model);
|
||||
|
||||
$this->viewWidget->setFormValues([]);
|
||||
$this->viewModel = $this->relationModel;
|
||||
}
|
||||
|
||||
return $this->relationRefresh();
|
||||
|
|
|
|||
|
|
@ -214,10 +214,7 @@ class ReorderController extends ControllerBehavior
|
|||
$model = $this->controller->reorderGetModel();
|
||||
$modelTraits = class_uses($model);
|
||||
|
||||
if (
|
||||
isset($modelTraits[\October\Rain\Database\Traits\Sortable::class]) ||
|
||||
$model->isClassExtendedWith(\October\Rain\Database\Behaviors\Sortable::class)
|
||||
) {
|
||||
if (isset($modelTraits[\October\Rain\Database\Traits\Sortable::class])) {
|
||||
$this->sortMode = 'simple';
|
||||
}
|
||||
elseif (isset($modelTraits[\October\Rain\Database\Traits\NestedTree::class])) {
|
||||
|
|
@ -225,7 +222,7 @@ class ReorderController extends ControllerBehavior
|
|||
$this->showTree = true;
|
||||
}
|
||||
else {
|
||||
throw new ApplicationException('The model must implement the Sortable trait/behavior or the NestedTree trait.');
|
||||
throw new ApplicationException('The model must implement the NestedTree or Sortable traits.');
|
||||
}
|
||||
|
||||
return $model;
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ class FormField
|
|||
/**
|
||||
* @var string Specifies a comment to accompany the field
|
||||
*/
|
||||
public $comment = '';
|
||||
public $comment;
|
||||
|
||||
/**
|
||||
* @var string Specifies the comment position.
|
||||
|
|
@ -139,7 +139,7 @@ class FormField
|
|||
/**
|
||||
* @var string Specifies a message to display when there is no value supplied (placeholder).
|
||||
*/
|
||||
public $placeholder = '';
|
||||
public $placeholder;
|
||||
|
||||
/**
|
||||
* @var array Contains a list of attributes specified in the field configuration.
|
||||
|
|
|
|||
|
|
@ -28,11 +28,6 @@ class NavigationManager
|
|||
*/
|
||||
protected $items;
|
||||
|
||||
/**
|
||||
* @var QuickActionItem[] List of registered quick actions.
|
||||
*/
|
||||
protected $quickActions;
|
||||
|
||||
protected $contextSidenavPartials = [];
|
||||
|
||||
protected $contextOwner;
|
||||
|
|
@ -59,9 +54,6 @@ class NavigationManager
|
|||
*/
|
||||
protected function loadItems()
|
||||
{
|
||||
$this->items = [];
|
||||
$this->quickActions = [];
|
||||
|
||||
/*
|
||||
* Load module items
|
||||
*/
|
||||
|
|
@ -76,19 +68,12 @@ class NavigationManager
|
|||
|
||||
foreach ($plugins as $id => $plugin) {
|
||||
$items = $plugin->registerNavigation();
|
||||
$quickActions = $plugin->registerQuickActions();
|
||||
|
||||
if (!is_array($items) && !is_array($quickActions)) {
|
||||
if (!is_array($items)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_array($items)) {
|
||||
$this->registerMenuItems($id, $items);
|
||||
}
|
||||
if (is_array($quickActions)) {
|
||||
$this->registerQuickActions($id, $quickActions);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @event backend.menu.extendItems
|
||||
|
|
@ -106,21 +91,17 @@ class NavigationManager
|
|||
Event::fire('backend.menu.extendItems', [$this]);
|
||||
|
||||
/*
|
||||
* Sort menu items and quick actions
|
||||
* Sort menu items
|
||||
*/
|
||||
uasort($this->items, static function ($a, $b) {
|
||||
return $a->order - $b->order;
|
||||
});
|
||||
uasort($this->quickActions, static function ($a, $b) {
|
||||
return $a->order - $b->order;
|
||||
});
|
||||
|
||||
/*
|
||||
* Filter items and quick actions that the user lacks permission for
|
||||
* Filter items user lacks permission for
|
||||
*/
|
||||
$user = BackendAuth::getUser();
|
||||
$this->items = $this->filterItemPermissions($user, $this->items);
|
||||
$this->quickActions = $this->filterItemPermissions($user, $this->quickActions);
|
||||
|
||||
foreach ($this->items as $item) {
|
||||
if (!$item->sideMenu || !count($item->sideMenu)) {
|
||||
|
|
@ -202,6 +183,10 @@ class NavigationManager
|
|||
*/
|
||||
public function registerMenuItems($owner, array $definitions)
|
||||
{
|
||||
if (!$this->items) {
|
||||
$this->items = [];
|
||||
}
|
||||
|
||||
$validator = Validator::make($definitions, [
|
||||
'*.label' => 'required',
|
||||
'*.icon' => 'required_without:*.iconSvg',
|
||||
|
|
@ -335,21 +320,6 @@ class NavigationManager
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove multiple side menu items
|
||||
*
|
||||
* @param string $owner
|
||||
* @param string $code
|
||||
* @param array $sideCodes
|
||||
* @return void
|
||||
*/
|
||||
public function removeSideMenuItems($owner, $code, $sideCodes)
|
||||
{
|
||||
foreach ($sideCodes as $sideCode) {
|
||||
$this->removeSideMenuItem($owner, $code, $sideCode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a single main menu item
|
||||
* @param string $owner
|
||||
|
|
@ -376,12 +346,8 @@ class NavigationManager
|
|||
*/
|
||||
public function listMainMenuItems()
|
||||
{
|
||||
if ($this->items === null && $this->quickActions === null) {
|
||||
$this->loadItems();
|
||||
}
|
||||
|
||||
if ($this->items === null) {
|
||||
return [];
|
||||
$this->loadItems();
|
||||
}
|
||||
|
||||
foreach ($this->items as $item) {
|
||||
|
|
@ -463,137 +429,6 @@ class NavigationManager
|
|||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers quick actions in the main navigation.
|
||||
*
|
||||
* Quick actions are single purpose links displayed to the left of the user menu in the
|
||||
* backend main navigation.
|
||||
*
|
||||
* The argument is an array of the quick action items. The array keys represent the
|
||||
* quick action item codes, specific for the plugin/module. Each element in the
|
||||
* array should be an associative array with the following keys:
|
||||
* - label - specifies the action label localization string key, used as a tooltip, required.
|
||||
* - icon - an icon name from the Font Awesome icon collection, required if iconSvg is unspecified.
|
||||
* - iconSvg - a custom SVG icon to use for the icon, required if icon is unspecified.
|
||||
* - url - the back-end relative URL the quick action item should point to, required.
|
||||
* - permissions - an array of permissions the back-end user should have, optional.
|
||||
* The item will be displayed if the user has any of the specified permissions.
|
||||
* - order - a position of the item in the menu, optional.
|
||||
*
|
||||
* @param string $owner Specifies the quick action items owner plugin or module in the format Author.Plugin.
|
||||
* @param array $definitions An array of the quick action item definitions.
|
||||
* @return void
|
||||
* @throws SystemException If the validation of the quick action configuration fails
|
||||
*/
|
||||
public function registerQuickActions($owner, array $definitions)
|
||||
{
|
||||
$validator = Validator::make($definitions, [
|
||||
'*.label' => 'required',
|
||||
'*.icon' => 'required_without:*.iconSvg',
|
||||
'*.url' => 'required'
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
$errorMessage = 'Invalid quick action item detected in ' . $owner . '. Contact the plugin author to fix (' . $validator->errors()->first() . ')';
|
||||
if (Config::get('app.debug', false)) {
|
||||
throw new SystemException($errorMessage);
|
||||
}
|
||||
|
||||
Log::error($errorMessage);
|
||||
}
|
||||
|
||||
$this->addQuickActionItems($owner, $definitions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dynamically add an array of quick action items
|
||||
*
|
||||
* @param string $owner
|
||||
* @param array $definitions
|
||||
* @return void
|
||||
*/
|
||||
public function addQuickActionItems($owner, array $definitions)
|
||||
{
|
||||
foreach ($definitions as $code => $definition) {
|
||||
$this->addQuickActionItem($owner, $code, $definition);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dynamically add a single quick action item
|
||||
*
|
||||
* @param string $owner
|
||||
* @param string $code
|
||||
* @param array $definition
|
||||
* @return void
|
||||
*/
|
||||
public function addQuickActionItem($owner, $code, array $definition)
|
||||
{
|
||||
$itemKey = $this->makeItemKey($owner, $code);
|
||||
|
||||
if (isset($this->quickActions[$itemKey])) {
|
||||
$definition = array_merge((array) $this->quickActions[$itemKey], $definition);
|
||||
}
|
||||
|
||||
$item = array_merge($definition, [
|
||||
'code' => $code,
|
||||
'owner' => $owner
|
||||
]);
|
||||
|
||||
$this->quickActions[$itemKey] = QuickActionItem::createFromArray($item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the instance of a specified quick action item.
|
||||
*
|
||||
* @param string $owner
|
||||
* @param string $code
|
||||
* @return QuickActionItem
|
||||
* @throws SystemException
|
||||
*/
|
||||
public function getQuickActionItem(string $owner, string $code)
|
||||
{
|
||||
$itemKey = $this->makeItemKey($owner, $code);
|
||||
|
||||
if (!array_key_exists($itemKey, $this->quickActions)) {
|
||||
throw new SystemException('No quick action item found with key ' . $itemKey);
|
||||
}
|
||||
|
||||
return $this->quickActions[$itemKey];
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a single quick action item
|
||||
*
|
||||
* @param $owner
|
||||
* @param $code
|
||||
* @return void
|
||||
*/
|
||||
public function removeQuickActionItem($owner, $code)
|
||||
{
|
||||
$itemKey = $this->makeItemKey($owner, $code);
|
||||
unset($this->quickActions[$itemKey]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of quick action items.
|
||||
*
|
||||
* @return array
|
||||
* @throws SystemException
|
||||
*/
|
||||
public function listQuickActionItems()
|
||||
{
|
||||
if ($this->items === null && $this->quickActions === null) {
|
||||
$this->loadItems();
|
||||
}
|
||||
|
||||
if ($this->quickActions === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $this->quickActions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the navigation context.
|
||||
* The function sets the navigation owner, main menu item code and the side menu item code.
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@
|
|||
"authors": [
|
||||
{
|
||||
"name": "Alexey Bobkov",
|
||||
"email": "aleksey.bobkov@gmail.com",
|
||||
"role": "Co-founder"
|
||||
"email": "aleksey.bobkov@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Samuel Georges",
|
||||
"email": "daftspunky@gmail.com",
|
||||
"role": "Co-founder"
|
||||
"email": "daftspunky@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Luke Towers",
|
||||
|
|
@ -24,10 +22,9 @@
|
|||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.2",
|
||||
"php": ">=7.0",
|
||||
"composer/installers": "~1.0",
|
||||
"october/rain": "~1.1.0",
|
||||
"laravel/framework": "~6.0"
|
||||
"october/rain": "~1.0.469"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ class Preferences extends Controller
|
|||
*/
|
||||
public function formExtendFields($form)
|
||||
{
|
||||
if (!$this->user->hasAccess('backend.manage_own_editor')) {
|
||||
if (!$this->user->hasAccess('backend.manage_editor')) {
|
||||
$form->removeTab('backend::lang.backend_preferences.code_editor');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ scopes:
|
|||
label: backend::lang.user.superuser
|
||||
type: switch
|
||||
conditions:
|
||||
- is_superuser = 0
|
||||
- is_superuser = 1
|
||||
- is_superuser = false
|
||||
- is_superuser = true
|
||||
|
||||
login_date:
|
||||
label: backend::lang.user.last_login
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
<?php namespace Backend\Database\Seeds;
|
||||
|
||||
use Str;
|
||||
use Seeder;
|
||||
use Eloquent;
|
||||
|
||||
|
|
@ -9,22 +8,12 @@ class DatabaseSeeder extends Seeder
|
|||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return string
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$adminPassword = Str::random(22);
|
||||
Eloquent::unguard();
|
||||
|
||||
Eloquent::unguarded(function () use ($adminPassword) {
|
||||
// Generate a random password for the seeded admin account
|
||||
$adminSeeder = new \Backend\Database\Seeds\SeedSetupAdmin;
|
||||
$adminSeeder->setDefaults([
|
||||
'password' => $adminPassword
|
||||
]);
|
||||
$this->call($adminSeeder);
|
||||
});
|
||||
|
||||
return 'The following password has been automatically generated for the "admin" account: '
|
||||
. "<fg=yellow;options=bold>${adminPassword}</>";
|
||||
$this->call('Backend\Database\Seeds\SeedSetupAdmin');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,24 +2,12 @@
|
|||
|
||||
use October\Rain\Support\Facade;
|
||||
|
||||
/**
|
||||
* @method static string uri()
|
||||
* @method static string url(string $path = null, array $parameters = [], bool $secure = null)
|
||||
* @method static string baseUrl(string $path = null)
|
||||
* @method static string skinAsset(string $path = null)
|
||||
* @method static \Illuminate\Http\RedirectResponse redirect(string $path, int $status = 302, array $headers = [], bool $secure = null)
|
||||
* @method static \Illuminate\Http\RedirectResponse redirectGuest(string $path, int $status = 302, array $headers = [], bool $secure = null)
|
||||
* @method static \Illuminate\Http\RedirectResponse redirectIntended(string $path, int $status = 302, array $headers = [], bool $secure = null)
|
||||
* @method static string date($dateTime, array $options = [])
|
||||
* @method static string dateTime($dateTime, array $options = [])
|
||||
*
|
||||
* @see \Backend\Helpers\Backend
|
||||
*/
|
||||
class Backend extends Facade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*
|
||||
* @see \Backend\Helpers\Backend
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
|
|
|
|||
|
|
@ -2,22 +2,14 @@
|
|||
|
||||
use October\Rain\Support\Facade;
|
||||
|
||||
/**
|
||||
* @method static void registerCallback(callable $callback)
|
||||
* @method static void registerPermissions(string $owner, array $definitions)
|
||||
* @method static void removePermission(string $owner, string $code)
|
||||
* @method static array listPermissions()
|
||||
* @method static array listTabbedPermissions()
|
||||
* @method static array listPermissionsForRole(string $role, bool $includeOrphans = true)
|
||||
* @method static boolean hasPermissionsForRole(string $role)
|
||||
*
|
||||
* @see \Backend\Classes\AuthManager
|
||||
*/
|
||||
class BackendAuth extends Facade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*
|
||||
* Resolves to:
|
||||
* - Backend\Classes\AuthManager
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
|
|
|
|||
|
|
@ -2,36 +2,14 @@
|
|||
|
||||
use October\Rain\Support\Facade;
|
||||
|
||||
/**
|
||||
* @method static void registerCallback(callable $callback)
|
||||
* @method static void registerMenuItems(string $owner, array $definitions)
|
||||
* @method static void addMainMenuItems(string $owner, array $definitions)
|
||||
* @method static void addMainMenuItem(string $owner, $code, array $definition)
|
||||
* @method static \Backend\Classes\MainMenuItem getMainMenuItem(string $owner, string $code)
|
||||
* @method static void removeMainMenuItem(string $owner, string $code)
|
||||
* @method static void addSideMenuItems(string $owner, string $code, array $definitions)
|
||||
* @method static bool addSideMenuItem(string $owner, string $code, string $sideCode, array $definition)
|
||||
* @method static bool removeSideMenuItem(string $owner, string $code, string $sideCode)
|
||||
* @method static \Backend\Classes\MainMenuItem[] listMainMenuItems()
|
||||
* @method static \Backend\Classes\SideMenuItem[] listSideMenuItems(string|null $owner = null, string|null $code = null)
|
||||
* @method static void setContext(string $owner, string $mainMenuItemCode, string|null $sideMenuItemCode = null)
|
||||
* @method static void setContextOwner(string $owner)
|
||||
* @method static void setContextMainMenu(string $mainMenuItemCode)
|
||||
* @method static object getContext()
|
||||
* @method static void setContextSideMenu(string $sideMenuItemCode)
|
||||
* @method static bool isMainMenuItemActive(\Backend\Classes\MainMenuItem $item)
|
||||
* @method static \Backend\Classes\MainMenuItem|null getActiveMainMenuItem()
|
||||
* @method static bool isSideMenuItemActive(\Backend\Classes\SideMenuItem $item)
|
||||
* @method static void registerContextSidenavPartial(string $owner, string $mainMenuItemCode, string $partial)
|
||||
* @method static mixed getContextSidenavPartial(string $owner, string $mainMenuItemCode)
|
||||
*
|
||||
* @see \Backend\Classes\NavigationManager
|
||||
*/
|
||||
class BackendMenu extends Facade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*
|
||||
* Resolves to:
|
||||
* - Backend\Classes\NavigationManager
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
|
|
|
|||
|
|
@ -248,6 +248,16 @@ class Repeater extends FormWidgetBase
|
|||
}
|
||||
}
|
||||
|
||||
if (!$this->childAddItemCalled && $currentValue === null) {
|
||||
$this->formWidgets = [];
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->childAddItemCalled && !isset($currentValue[$this->childIndexCalled])) {
|
||||
// If no value is available but a child repeater has added an item, add a "stub" repeater item
|
||||
$this->makeItemFormWidget($this->childIndexCalled);
|
||||
}
|
||||
|
||||
// Ensure that the minimum number of items are preinitialized
|
||||
// ONLY DONE WHEN NOT IN GROUP MODE
|
||||
if (!$this->useGroups && $this->minItems > 0) {
|
||||
|
|
@ -263,16 +273,6 @@ class Repeater extends FormWidgetBase
|
|||
}
|
||||
}
|
||||
|
||||
if (!$this->childAddItemCalled && $currentValue === null) {
|
||||
$this->formWidgets = [];
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->childAddItemCalled && !isset($currentValue[$this->childIndexCalled])) {
|
||||
// If no value is available but a child repeater has added an item, add a "stub" repeater item
|
||||
$this->makeItemFormWidget($this->childIndexCalled);
|
||||
}
|
||||
|
||||
if (!is_array($currentValue)) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -186,19 +186,6 @@ class RichEditor extends FormWidgetBase
|
|||
{
|
||||
$result = [];
|
||||
|
||||
/**
|
||||
* @event backend.richeditor.listTypes
|
||||
* Register additional "page link types" to the RichEditor FormWidget
|
||||
*
|
||||
* Example usage:
|
||||
*
|
||||
* Event::listen('backend.richeditor.listTypes', function () {
|
||||
* return [
|
||||
* 'my-identifier' => 'author.plugin::lang.richeditor.link_types.my_identifier',
|
||||
* ];
|
||||
* });
|
||||
*
|
||||
*/
|
||||
$apiResult = Event::fire('backend.richeditor.listTypes');
|
||||
if (is_array($apiResult)) {
|
||||
foreach ($apiResult as $typeList) {
|
||||
|
|
@ -218,28 +205,6 @@ class RichEditor extends FormWidgetBase
|
|||
protected function getPageLinks($type)
|
||||
{
|
||||
$result = [];
|
||||
|
||||
/**
|
||||
* @event backend.richeditor.getTypeInfo
|
||||
* Register additional "page link types" to the RichEditor FormWidget
|
||||
*
|
||||
* Example usage:
|
||||
*
|
||||
* Event::listen('backend.richeditor.getTypeInfo', function ($type) {
|
||||
* if ($type === 'my-identifier') {
|
||||
* return [
|
||||
* 'https://example.com/page1' => 'Page 1',
|
||||
* 'https://example.com/parent-page' => [
|
||||
* 'title' => 'Parent Page',
|
||||
* 'links' => [
|
||||
* 'https://example.com/child-page' => 'Child Page',
|
||||
* ],
|
||||
* ],
|
||||
* ];
|
||||
* }
|
||||
* });
|
||||
*
|
||||
*/
|
||||
$apiResult = Event::fire('backend.richeditor.getTypeInfo', [$type]);
|
||||
if (is_array($apiResult)) {
|
||||
foreach ($apiResult as $typeInfo) {
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@
|
|||
targetWidth,
|
||||
targetHeight
|
||||
|
||||
if (!this.options.thumbnailWidth && !this.options.thumbnailHeight) {
|
||||
if (!this.options.thumbnailWidth && !this.options.thumbnailWidth) {
|
||||
targetWidth = targetHeight = 100
|
||||
}
|
||||
else if (this.options.thumbnailWidth) {
|
||||
|
|
|
|||
|
|
@ -214,14 +214,14 @@ class Backend
|
|||
$contents = file_get_contents($assetFile);
|
||||
|
||||
// Find all assets that are compiled in this file
|
||||
preg_match_all('/^=require\s+([A-z0-9-_+\.\/]+)[\n|\r\n|$]/m', $contents, $matches, PREG_SET_ORDER);
|
||||
preg_match_all('/^=require\s+([A-z0-9-_+\.\/]+)$/m', $contents, $matches, PREG_SET_ORDER);
|
||||
|
||||
// Determine correct asset path
|
||||
$directory = str_replace(basename($file), '', $file);
|
||||
|
||||
if (count($matches)) {
|
||||
$results = array_map(function ($match) use ($directory) {
|
||||
return str_replace('/', DIRECTORY_SEPARATOR, $directory . $match[1]);
|
||||
return $directory . $match[1];
|
||||
}, $matches);
|
||||
|
||||
foreach ($results as $i => $result) {
|
||||
|
|
|
|||
|
|
@ -2,15 +2,12 @@
|
|||
|
||||
return [
|
||||
'auth' => [
|
||||
'title' => 'Admin-Bereich',
|
||||
'invalid_login' => 'Die Angaben stimmen nicht mit unseren Aufzeichnungen überein. Überprüfen Sie diese und versuchen Sie es noch einmal.',
|
||||
'title' => 'Admin-Bereich'
|
||||
],
|
||||
'field' => [
|
||||
'invalid_type' => 'Ungültiger Feldtyp :type.',
|
||||
'options_method_invalid_model' => 'Das Attribut ":field" löst sich nicht zu einen gültigen Model auf. Probiere die options Methode der Model-Klasse :model explicit zu definieren.',
|
||||
'options_method_not_exists' => 'Die Modell-Klasse :model muss eine Methode :method() mit Rückgabe der Werte von ":field" besitzen.',
|
||||
'options_static_method_invalid_value' => "Die statische Methode ':method()' in der Klasse :class hat kein valides Optionsarray zurückgegeben.",
|
||||
'colors_method_not_exists' => "Die Modellklasse :model muss eine Methode :method() definieren, welche html color (HEX) codes für das ':field' Formularfeld zurückgibt.",
|
||||
'options_method_not_exists' => 'Die Model-Klasse :model muss eine Methode :method() mit Rückgabe der Werte von ":field" besitzen.',
|
||||
],
|
||||
'widget' => [
|
||||
'not_registered' => "Ein Widget namens ':name' wurde nicht registriert",
|
||||
|
|
@ -18,11 +15,6 @@ return [
|
|||
],
|
||||
'page' => [
|
||||
'untitled' => "Unbenannt",
|
||||
'404' => [
|
||||
'label' => 'Seite nicht gefunden',
|
||||
'help' => "Die von Ihnen angeforderte Seite konnte nicht gefunden werden.",
|
||||
'back_link' => 'Zurück zur vorigen Seite',
|
||||
],
|
||||
'access_denied' => [
|
||||
'label' => "Zugriff verweigert",
|
||||
'help' => "Sie haben nicht die erforderlichen Berechtigungen, um diese Seite zu sehen.",
|
||||
|
|
@ -36,23 +28,14 @@ return [
|
|||
],
|
||||
'partial' => [
|
||||
'not_found_name' => "Das Partial ':name' wurde nicht gefunden.",
|
||||
'invalid_name' => 'Ungültiger Partial: :name.',
|
||||
],
|
||||
'ajax_handler' => [
|
||||
'invalid_name' => 'Ungültiger AJAX handler: :name.',
|
||||
'not_found' => "AJAX handler ':name' wurde nicht gefunden.",
|
||||
],
|
||||
'account' => [
|
||||
'impersonate_confirm' => 'Sind Sie sicher, dass Sie sich als dieser Benutzer anmelden wollen? Sie können zu Ihrem ursprünglichen Zustand zurückkehren, indem Sie sich abmelden.',
|
||||
'impersonate_success' => 'Sie sind jetzt als dieser Benutzer angemeldet',
|
||||
'signed_in_as' => 'Angemeldet als :full_name',
|
||||
'sign_out' => 'Abmelden',
|
||||
'login' => 'Anmelden',
|
||||
'reset' => 'Zurücksetzen',
|
||||
'restore' => 'Wiederherstellen',
|
||||
'login_placeholder' => 'Benutzername',
|
||||
'password_placeholder' => 'Passwort',
|
||||
'remember_me' => 'Angemeldet bleiben',
|
||||
'forgot_password' => "Passwort vergessen?",
|
||||
'enter_email' => "Bitte E-Mail-Adresse eingeben",
|
||||
'enter_login' => "Bitte Benutzernamen eingeben",
|
||||
|
|
@ -129,8 +112,6 @@ return [
|
|||
'last_name' => 'Nachname',
|
||||
'full_name' => 'Kompletter Name',
|
||||
'email' => 'E-Mail',
|
||||
'role_field' => 'Rolle',
|
||||
'role_comment' => 'Rollen definieren Benutzerberechtigungen, die auf Benutzerebene auf der Registerkarte Berechtigungen überschrieben werden können.',
|
||||
'groups' => 'Gruppen',
|
||||
'groups_comment' => 'Geben Sie hier die Gruppenzugehörigkeit an',
|
||||
'avatar' => 'Avatar',
|
||||
|
|
@ -167,25 +148,9 @@ return [
|
|||
'return' => 'Zurück zur Gruppen-Übersicht',
|
||||
'users_count' => 'Benutzer',
|
||||
],
|
||||
'role' => [
|
||||
'name' => 'Rolle',
|
||||
'name_field' => 'Name',
|
||||
'name_comment' => 'Der Name wird in der Rollenliste auf dem Administratorformular angezeigt.',
|
||||
'description_field' => 'Beschreibung',
|
||||
'code_field' => 'Code',
|
||||
'code_comment' => 'Geben Sie einen eindeutigen Code an, wenn Sie mit der API auf das Rollenobjekt zugreifen möchten.',
|
||||
'menu_label' => 'Rollen verwalten',
|
||||
'list_title' => 'Rollen verwalten',
|
||||
'new' => 'Neue Rolle',
|
||||
'delete_confirm' => 'Diese Administratorrolle löschen?',
|
||||
'return' => 'Zurück zur Rollenliste',
|
||||
'users_count' => 'Benutzer',
|
||||
],
|
||||
'preferences' => [
|
||||
'not_authenticated' => 'Zum Speichern oder Anzeigen dieser Einstellungen liegt kein Nutzerkonto vor'
|
||||
],
|
||||
'trashed_hint_title' => 'Dieses Konto wurde gelöscht.',
|
||||
'trashed_hint_desc' => 'Dieses Konto wurde gelöscht und kann nicht mehr angemeldet werden. Um es wiederherzustellen, klicken Sie auf das Symbol "Benutzer wiederherstellen" unten rechts',
|
||||
]
|
||||
],
|
||||
'list' => [
|
||||
'default_title' => 'Auflisten',
|
||||
|
|
@ -230,11 +195,6 @@ return [
|
|||
'remove_confirm' => 'Sind Sie sicher?',
|
||||
'remove_file' => 'Datei entfernen',
|
||||
],
|
||||
'repeater' => [
|
||||
'add_new_item' => 'Neues Element hinzufügen',
|
||||
'min_items_failed' => ':name erfordert ein Minimum an :min Elementen, aber es wurden nur :items bereitgestellt',
|
||||
'max_items_failed' => ':name lässt nur bis zu :max Elemente zu, :items wurden bereitgestellt',
|
||||
],
|
||||
'form' => [
|
||||
'create_title' => "Neuer :name",
|
||||
'update_title' => "Bearbeite :name",
|
||||
|
|
@ -352,8 +312,6 @@ return [
|
|||
'permissions' => 'Verzeichnis :name oder ein Unterverzeichnis kann nicht von PHP beschrieben werden. Bitte setzen Sie die korrekten Rechte für den Webserver in diesem Verzeichnis.',
|
||||
'extension' => 'Die PHP Erweiterung :name ist nicht installiert. Bitte installieren Sie diese Library und aktivieren Sie die Erweiterung.',
|
||||
'plugin_missing' => 'Das Plugin :name hat eine Abhängigkeit die nicht installiert ist. Bitte installieren Sie alle benötigten Plugins.',
|
||||
'debug' => 'Der Debug-Modus ist aktiviert. Dies wird für Produktionsinstallationen nicht empfohlen.',
|
||||
'decompileBackendAssets' => 'Assets im Backend sind derzeit dekompiliert. Dies wird für Produktionsinstallationen nicht empfohlen.',
|
||||
],
|
||||
'editor' => [
|
||||
'menu_label' => 'Editor Einstellungen',
|
||||
|
|
@ -409,8 +367,6 @@ return [
|
|||
'minimal' => 'Minimal',
|
||||
'full' => 'Vollständig',
|
||||
],
|
||||
'paragraph_formats' => 'Absatzformatierungen',
|
||||
'paragraph_formats_comment' => 'Die Optionen, welche in der Dropdown-Liste für Absatzformatierungen angezeigt werden.',
|
||||
],
|
||||
'tooltips' => [
|
||||
'preview_website' => 'Vorschau der Webseite'
|
||||
|
|
@ -430,8 +386,6 @@ return [
|
|||
'brand' => 'Brand',
|
||||
'logo' => 'Logo',
|
||||
'logo_description' => 'Lade ein eigenes Logo hoch, das im Backend verwendet werden soll.',
|
||||
'favicon' => 'Favicon',
|
||||
'favicon_description' => 'Laden Sie ein benutzerdefiniertes Favicon zur Verwendung im Back-End hoch',
|
||||
'app_name' => 'App-Name',
|
||||
'app_name_description' => 'Dieser Name wird als Titel des Backends angezeigt.',
|
||||
'app_tagline' => 'App-Tagline',
|
||||
|
|
@ -445,7 +399,6 @@ return [
|
|||
'navigation' => 'Navigation',
|
||||
'menu_mode' => 'Menustyles',
|
||||
'menu_mode_inline' => 'Inline',
|
||||
'menu_mode_inline_no_icons' => 'Inline (ohne Icons)',
|
||||
'menu_mode_tile' => 'Tiles',
|
||||
'menu_mode_collapsed' => 'Collapsed'
|
||||
],
|
||||
|
|
@ -550,7 +503,6 @@ return [
|
|||
],
|
||||
'permissions' => [
|
||||
'manage_media' => 'Medien verwalten',
|
||||
'allow_unsafe_markdown' => 'Unsicheres Markdown verwenden (kann Javascript enthalten)',
|
||||
],
|
||||
'mediafinder' => [
|
||||
'label' => 'Media Finder',
|
||||
|
|
@ -582,12 +534,7 @@ return [
|
|||
'multiple_selected' => 'Mehrere Dateien ausgewählt.',
|
||||
'uploading_file_num' => 'Lade :number Datei(en)...',
|
||||
'uploading_complete' => 'Upload vollständig',
|
||||
'uploading_error' => 'Upload fehlgeschlagen',
|
||||
'type_blocked' => 'Der verwendete Dateityp ist aus Sicherheitsgründen gesperrt.',
|
||||
'order_by' => 'Sortieren nach',
|
||||
'direction' => 'Direction',
|
||||
'direction_asc' => 'Aufsteigend',
|
||||
'direction_desc' => 'Absteigend',
|
||||
'folder' => 'Ordner',
|
||||
'no_files_found' => 'Keine entsprechenden Dateien gefunden.',
|
||||
'delete_empty' => 'Bitte Wählen Sie Dateien zum Löschen aus.',
|
||||
|
|
@ -610,11 +557,11 @@ return [
|
|||
'restore' => 'Alle Änderungen rückgängig machen',
|
||||
'resize' => 'Größe anpassen...',
|
||||
'selection_mode_normal' => 'Normal',
|
||||
'selection_mode_fixed_ratio' => 'Festes Verhältnis',
|
||||
'selection_mode_fixed_size' => 'Feste Größe',
|
||||
'selection_mode_fixed_ratio' => 'Fixes Verhältnis',
|
||||
'selection_mode_fixed_size' => 'Fixe Größe',
|
||||
'height' => 'Höhe',
|
||||
'width' => 'Breite',
|
||||
'selection_mode' => 'Auswahlmodus',
|
||||
'selection_mode' => 'Selection mode',
|
||||
'resize_image' => 'Bildgröße anpassen',
|
||||
'image_size' => 'Dimensionen:',
|
||||
'selected_size' => 'Ausgewählt:'
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ return [
|
|||
'invalid_type' => 'Invalid field type used :type.',
|
||||
'options_method_invalid_model' => "The attribute ':field' does not resolve to a valid model. Try specifying the options method for model class :model explicitly.",
|
||||
'options_method_not_exists' => "The model class :model must define a method :method() returning options for the ':field' form field.",
|
||||
'options_static_method_invalid_value' => "The static method ':method()' on :class did not return a valid options array.",
|
||||
'colors_method_not_exists' => "The model class :model must define a method :method() returning html color HEX codes for the ':field' form field.",
|
||||
],
|
||||
'widget' => [
|
||||
|
|
@ -373,7 +372,6 @@ return [
|
|||
'editor' => [
|
||||
'menu_label' => 'Editor settings',
|
||||
'menu_description' => 'Customize the global editor preferences, such as font size and color scheme.',
|
||||
'preview' => 'Preview',
|
||||
'font_size' => 'Font size',
|
||||
'tab_size' => 'Tab size',
|
||||
'use_hard_tabs' => 'Indent using tabs',
|
||||
|
|
|
|||
|
|
@ -307,11 +307,11 @@ return [
|
|||
'auto_closing' => 'Cerrado de etiquetas automático',
|
||||
'show_invisibles' => 'Mostrar caracteres invisibles',
|
||||
'show_gutter' => 'Mostrar numeros de línea',
|
||||
'basic_autocompletion' => 'Autocompletado Basico (Ctrl + Espacio)',
|
||||
'live_autocompletion' => 'Autocompletado en Vivo',
|
||||
'enable_snippets' => 'Activar uso de Snippets',
|
||||
'display_indent_guides' => 'Mostrar Guias de Identado',
|
||||
'show_print_margin' => 'Mostrar Margen de impresión',
|
||||
'basic_autocompletion'=> 'Autocompletado Basico (Ctrl + Espacio)',
|
||||
'live_autocompletion'=> 'Autocompletado en Vivo',
|
||||
'enable_snippets'=> 'Activar uso de Snippets',
|
||||
'display_indent_guides'=> 'Mostrar Guias de Identado',
|
||||
'show_print_margin'=> 'Mostrar Margen de impresión',
|
||||
'mode_off' => 'Off',
|
||||
'mode_fluid' => 'Fluido',
|
||||
'40_characters' => '40 Caracteres',
|
||||
|
|
@ -396,8 +396,7 @@ return [
|
|||
'filter' => [
|
||||
'all' => 'todo',
|
||||
'options_method_not_exists' => "La clase de modelo :model debe definir un método :method() para regresar opciones para el filtro ':filter'.",
|
||||
'date_all' => 'todo el período',
|
||||
'number_all' => 'todos los números'
|
||||
'date_all' => 'todo el período'
|
||||
],
|
||||
'import_export' => [
|
||||
'upload_csv_file' => '1. Subir un archivo CSV',
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ return [
|
|||
'preview_no_record_message' => 'Nessun record selezionato.',
|
||||
'select' => 'Seleziona',
|
||||
'select_all' => 'seleziona tutto',
|
||||
'select_none' => 'deseleziona tutto',
|
||||
'select_none' => 'non selezionare niente',
|
||||
'select_placeholder' => 'seleziona',
|
||||
'insert_row' => 'Inserisci riga',
|
||||
'insert_row_below' => 'Inserisci riga sotto',
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ return [
|
|||
'invalid_type' => 'Ongeldig type veld: :type.',
|
||||
'options_method_invalid_model' => "Het attribuut ':field' levert geen geldig model op. Probeer de opties methode expliciet te specifieren voor modelklasse :model.",
|
||||
'options_method_not_exists' => 'De modelklasse :model moet de methode :method() definiëren met daarin opties voor het veld ":field".',
|
||||
'options_static_method_invalid_value' => "De statische methode ':method()' in :class leverde geen geldige array met opties op.",
|
||||
'colors_method_not_exists' => 'De modelklasse :model moet de methode :method() definiëren met daarin html HEX kleurcodes voor het veld ":field".',
|
||||
],
|
||||
'widget' => [
|
||||
|
|
@ -373,7 +372,6 @@ return [
|
|||
'editor' => [
|
||||
'menu_label' => 'Editor instellingen',
|
||||
'menu_description' => 'Beheer editor instellingen, zoals lettergrootte en kleurschema.',
|
||||
'preview' => 'Voorbeeldweergave',
|
||||
'font_size' => 'Lettergrootte',
|
||||
'tab_size' => 'Tab grootte',
|
||||
'use_hard_tabs' => 'Inspringen met tabs',
|
||||
|
|
@ -408,7 +406,6 @@ return [
|
|||
'label' => 'Label',
|
||||
'class_name' => 'Class naam',
|
||||
'markup_tags' => 'Opmaak HTML-tags',
|
||||
'markup_tag' => 'Opmaak HTML-tag',
|
||||
'allowed_empty_tags' => 'Toegestane lege HTML-tags',
|
||||
'allowed_empty_tags_comment' => 'Een lijst van HTML-tags die niet worden verwijderd als ze leeg zijn.',
|
||||
'allowed_tags' => 'Toegestane HTML-tags',
|
||||
|
|
@ -419,7 +416,6 @@ return [
|
|||
'remove_tags_comment' => 'Een lijst van HTML-tags die samen met hun inhoud worden verwijderd.',
|
||||
'line_breaker_tags' => 'Line breaker tags',
|
||||
'line_breaker_tags_comment' => 'Een lijst van HTML-tags waartussen een line breaker element wordt geplaatst.',
|
||||
'toolbar_options' => 'Toolbar opties',
|
||||
'toolbar_buttons' => 'Toolbar knoppen',
|
||||
'toolbar_buttons_comment' => 'De toolbar knoppen die standaard getoond worden door de Rich Editor.',
|
||||
'toolbar_buttons_preset' => 'Voeg preset toe voor toolbar knoppen:',
|
||||
|
|
@ -428,11 +424,9 @@ return [
|
|||
'minimal' => 'Minimaal',
|
||||
'full' => 'Volledig',
|
||||
],
|
||||
'paragraph_formats' => 'Paragraaf formaten',
|
||||
'paragraph_formats_comment' => 'De opties die in de "Paragraaf formaat" lijst zullen verschijnen.',
|
||||
],
|
||||
'tooltips' => [
|
||||
'preview_website' => 'Voorbeeldweergave website',
|
||||
'preview_website' => 'Voorvertoning website',
|
||||
],
|
||||
'mysettings' => [
|
||||
'menu_label' => 'Mijn instellingen',
|
||||
|
|
|
|||
|
|
@ -7,9 +7,8 @@ return [
|
|||
],
|
||||
'field' => [
|
||||
'invalid_type' => 'Использован неверный тип поля: :type.',
|
||||
'options_method_invalid_model' => "Атрибут ':field' не соответствует допустимой модели. Попробуйте явно указать метод параметров для класса :model .",
|
||||
'options_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий опции для поля формы ':field'.",
|
||||
'colors_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий HTML цвет в HEX для поля формы ':field'.",
|
||||
'colors_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий HTML цвет в HEX для поля формы ':field'."
|
||||
],
|
||||
'widget' => [
|
||||
'not_registered' => "Класс виджета ':name' не зарегистрирован.",
|
||||
|
|
@ -25,12 +24,12 @@ return [
|
|||
'access_denied' => [
|
||||
'label' => 'Доступ запрещен',
|
||||
'help' => 'У вас нет необходимых прав для просмотра этой страницы.',
|
||||
'cms_link' => 'Перейти к CMS',
|
||||
'cms_link' => 'Перейти к CMS'
|
||||
],
|
||||
'no_database' => [
|
||||
'label' => 'Отсутствует база данных',
|
||||
'help' => "Для доступа к серверу требуется база данных. Проверьте, что база данных настроена и перенесена, прежде чем повторять попытку.",
|
||||
'cms_link' => 'Вернуться на главную страницу',
|
||||
'cms_link' => 'Вернуться на главную страницу'
|
||||
],
|
||||
],
|
||||
'partial' => [
|
||||
|
|
@ -42,12 +41,6 @@ return [
|
|||
'not_found' => "AJAX обработчик ':name' не найден.",
|
||||
],
|
||||
'account' => [
|
||||
'impersonate' => 'Имперсонация пользователя',
|
||||
'impersonate_confirm' => 'Вы уверены, что хотите имперсонировать себя в качестве этого пользователя? Вы сможете вернуться в исходное состояние выйдя из системы.',
|
||||
'impersonate_success' => 'Теперь вы имперсонированы как этот пользователь',
|
||||
'impersonate_working' => 'Имперсонация...',
|
||||
'impersonating' => 'Имперсонация :full_name',
|
||||
'stop_impersonating' => 'Остановить имперсонацию',
|
||||
'signed_in_as' => 'Выполнен вход как :full_name',
|
||||
'sign_out' => 'Выйти',
|
||||
'login' => 'Вход',
|
||||
|
|
@ -57,9 +50,9 @@ return [
|
|||
'password_placeholder' => 'пароль',
|
||||
'remember_me' => 'Оставаться в системе',
|
||||
'forgot_password' => 'Забыли пароль?',
|
||||
'enter_email' => 'Введите ваш Email',
|
||||
'enter_email' => 'Введите вашу почту',
|
||||
'enter_login' => 'Введите ваш Логин',
|
||||
'email_placeholder' => 'email',
|
||||
'email_placeholder' => 'почта',
|
||||
'enter_new_password' => 'Введите новый пароль',
|
||||
'password_reset' => 'Сбросить пароль',
|
||||
'restore_success' => 'На вашу электронную почту отправлено сообщение с инструкциями для восстановления пароля.',
|
||||
|
|
@ -70,7 +63,7 @@ return [
|
|||
'apply' => 'Применить',
|
||||
'cancel' => 'Отменить',
|
||||
'delete' => 'Удалить',
|
||||
'ok' => 'OK',
|
||||
'ok' => 'OK'
|
||||
],
|
||||
'dashboard' => [
|
||||
'menu_label' => 'Панель управления',
|
||||
|
|
@ -99,7 +92,7 @@ return [
|
|||
'expand_all' => 'Развернуть всё',
|
||||
'status' => [
|
||||
'widget_title_default' => 'Статус системы',
|
||||
'update_available' => '{0} нет новых обновлений!|{1} доступно новое обновление!|[2,Inf] доступны новые обновления!',
|
||||
'update_available' => '{0} нет новый обновлений!|{1} доступно новое обновление!|[2,Inf] доступны новые обновления!',
|
||||
'updates_pending' => 'Доступны обновления',
|
||||
'updates_nil' => 'Используется последняя версия',
|
||||
'updates_link' => 'Обновить',
|
||||
|
|
@ -109,7 +102,7 @@ return [
|
|||
'core_build' => 'Сборка',
|
||||
'event_log' => 'Лог событий',
|
||||
'request_log' => 'Лог запросов',
|
||||
'app_birthday' => 'Онлайн с',
|
||||
'app_birthday' => 'Онлайн с'
|
||||
],
|
||||
'welcome' => [
|
||||
'widget_title_default' => 'Добро пожаловать',
|
||||
|
|
@ -118,7 +111,7 @@ return [
|
|||
'first_sign_in' => 'Это первый раз, когда вы вошли в систему.',
|
||||
'last_sign_in' => 'Последний раз вы заходили',
|
||||
'view_access_logs' => 'Посмотреть лог доступа',
|
||||
'nice_message' => 'Хорошего дня!',
|
||||
'nice_message' => 'Хорошего дня!'
|
||||
],
|
||||
],
|
||||
'user' => [
|
||||
|
|
@ -170,7 +163,7 @@ return [
|
|||
'new' => 'Добавить группу',
|
||||
'delete_confirm' => 'Вы действительно хотите удалить эту группу администраторов?',
|
||||
'return' => 'Вернуться к списку групп',
|
||||
'users_count' => 'Пользователи',
|
||||
'users_count' => 'Пользователи'
|
||||
],
|
||||
'role' => [
|
||||
'name' => 'Роль',
|
||||
|
|
@ -184,10 +177,10 @@ return [
|
|||
'new' => 'Новая роль',
|
||||
'delete_confirm' => 'Удалить эту роль администратора?',
|
||||
'return' => 'Вернуться к списку ролей',
|
||||
'users_count' => 'Пользователи',
|
||||
'users_count' => 'Пользователи'
|
||||
],
|
||||
'preferences' => [
|
||||
'not_authenticated' => 'Невозможно загрузить или сохранить настройки для неавторизованного пользователя.',
|
||||
'not_authenticated' => 'Невозможно загрузить или сохранить настройки для неавторизованного пользователя.'
|
||||
],
|
||||
'trashed_hint_title' => 'Этот аккаунт был удален',
|
||||
'trashed_hint_desc' => 'Этот аккаунт был удален и не может быть авторизован. Чтобы восстановить его, нажмите иконку восстановления пользователя в правом нижнем углу.',
|
||||
|
|
@ -221,7 +214,7 @@ return [
|
|||
'delete_selected_confirm' => 'Удалить выбранные записи?',
|
||||
'delete_selected_success' => 'Выбранные записи успешно удалены.',
|
||||
'column_switch_true' => 'Да',
|
||||
'column_switch_false' => 'Нет',
|
||||
'column_switch_false' => 'Нет'
|
||||
],
|
||||
'fileupload' => [
|
||||
'attachment' => 'Приложение',
|
||||
|
|
@ -233,7 +226,7 @@ return [
|
|||
'upload_file' => 'Загрузить файл',
|
||||
'upload_error' => 'Ошибка загрузки',
|
||||
'remove_confirm' => 'Вы уверены?',
|
||||
'remove_file' => 'Удалить файл',
|
||||
'remove_file' => 'Удалить файл'
|
||||
],
|
||||
'repeater' => [
|
||||
'add_new_item' => 'Добавить новый объект',
|
||||
|
|
@ -299,16 +292,15 @@ return [
|
|||
'delete_row' => 'Удалить строку',
|
||||
'concurrency_file_changed_title' => 'Файл был изменен',
|
||||
'concurrency_file_changed_description' => 'Файл,редактируемый вами, был изменен другим пользователем. Вы можете перезагрузить файл и потерять ваши изменения или перезаписать его',
|
||||
'return_to_list' => 'Вернуться к списку',
|
||||
'return_to_list' => 'Вернуться к списку'
|
||||
],
|
||||
'recordfinder' => [
|
||||
'find_record' => 'Найти запись',
|
||||
'invalid_model_class' => 'Предоставленный класс модели ":modelClass" для поиска записи является недействительным',
|
||||
'cancel' => 'Отмена',
|
||||
'cancel' => 'Отмена'
|
||||
],
|
||||
'pagelist' => [
|
||||
'page_link' => 'Ссылка на страницу',
|
||||
'select_page' => 'Выберите страницу...',
|
||||
'select_page' => 'Выберите страницу...'
|
||||
],
|
||||
'relation' => [
|
||||
'missing_config' => "Поведение отношения не имеет конфигурации для ':config'.",
|
||||
|
|
@ -341,11 +333,11 @@ return [
|
|||
'link_name' => 'Соединение :name',
|
||||
'unlink' => 'Отвязать',
|
||||
'unlink_name' => 'Разъединение :name',
|
||||
'unlink_confirm' => 'Вы уверены?',
|
||||
'unlink_confirm' => 'Вы уверены?'
|
||||
],
|
||||
'reorder' => [
|
||||
'default_title' => 'Сортировать записи',
|
||||
'no_records' => 'Нет доступных записей для сортировки.',
|
||||
'no_records' => 'Нет доступных записей для сортировки.'
|
||||
],
|
||||
'model' => [
|
||||
'name' => 'Модель',
|
||||
|
|
@ -363,7 +355,6 @@ return [
|
|||
'extension' => 'Расширение PHP :name не установлено. Установите эту библиотеку и активируйте расширение.',
|
||||
'plugin_missing' => 'Плагин :name имеет зависимость. Установите этот плагин.',
|
||||
'debug' => 'Режим отладки включен. Это не рекомендуется для рабочих инсталяций.',
|
||||
'decompileBackendAssets' => 'Ассеты в бэкенде в настоящее время декомпилированы. Это не рекомендуется для рабочих инсталяций.',
|
||||
],
|
||||
'editor' => [
|
||||
'menu_label' => 'Настройки редактора',
|
||||
|
|
@ -402,7 +393,6 @@ return [
|
|||
'label' => 'Название',
|
||||
'class_name' => 'Класс',
|
||||
'markup_tags' => 'Теги разметки',
|
||||
'markup_tag' => 'Тег разметки',
|
||||
'allowed_empty_tags' => 'Разрешенные пустые теги',
|
||||
'allowed_empty_tags_comment' => 'Список тегов, которые не будут удаляться, если внутри них нет содержания.',
|
||||
'allowed_tags' => 'Разрешенные теги',
|
||||
|
|
@ -413,29 +403,20 @@ return [
|
|||
'remove_tags_comment' => 'Список тегов, которые будут удалены вместе с их содержанием.',
|
||||
'line_breaker_tags' => 'Теги с переводом строки',
|
||||
'line_breaker_tags_comment' => 'Список тегов, в которых будет использоваться тег перевода строки',
|
||||
'toolbar_options' => 'Опции панели инструментов',
|
||||
'toolbar_buttons' => 'Кнопки панели инструментов',
|
||||
'toolbar_buttons_comment' => 'Кнопки панели инструментов, которые будут отображаться в Rich Editor по умолчанию.',
|
||||
'toolbar_buttons_preset' => 'Вставить предустановленный набор кнопок панели инструментов:',
|
||||
'toolbar_buttons_presets' => [
|
||||
'default' => 'По умолчанию',
|
||||
'minimal' => 'Минимальный',
|
||||
'full' => 'Полный',
|
||||
],
|
||||
'paragraph_formats' => 'Форматы абзацев',
|
||||
'paragraph_formats_comment' => 'Опции появляющиеся в выпадающем списке Форматы абзацев.',
|
||||
'toolbar_buttons_comment' => 'Кнопки панели инструментов, которые будут отображаться в Rich Editor по умолчанию.'
|
||||
],
|
||||
'tooltips' => [
|
||||
'preview_website' => 'Просмотр сайта',
|
||||
'preview_website' => 'Просмотр сайта'
|
||||
],
|
||||
'mysettings' => [
|
||||
'menu_label' => 'Мои настройки',
|
||||
'menu_description' => 'Управление настройками учетной записи администратора.',
|
||||
'menu_description' => 'Управление настройками учетной записи администратора.'
|
||||
],
|
||||
'myaccount' => [
|
||||
'menu_label' => 'Мой аккаунт',
|
||||
'menu_description' => 'Управление личной информацией (имя, почта, пароль)',
|
||||
'menu_keywords' => 'безопасность логин',
|
||||
'menu_keywords' => 'безопасность логин'
|
||||
],
|
||||
'branding' => [
|
||||
'menu_label' => 'Персонализация панели управления',
|
||||
|
|
@ -460,7 +441,7 @@ return [
|
|||
'menu_mode_inline' => 'Строчный',
|
||||
'menu_mode_inline_no_icons' => 'Строчный (без иконок)',
|
||||
'menu_mode_tile' => 'Плитка',
|
||||
'menu_mode_collapsed' => 'Схлопнутый',
|
||||
'menu_mode_collapsed' => 'Схлопнутый'
|
||||
],
|
||||
'backend_preferences' => [
|
||||
'menu_label' => 'Настройки панели управления',
|
||||
|
|
@ -470,7 +451,7 @@ return [
|
|||
'timezone' => 'Часовой пояс',
|
||||
'timezone_comment' => 'Выводить даты в выбранном часовом поясе.',
|
||||
'locale' => 'Язык',
|
||||
'locale_comment' => 'Выберите желаемый язык панели управления.',
|
||||
'locale_comment' => 'Выберите желаемый язык панели управления.'
|
||||
],
|
||||
'access_log' => [
|
||||
'hint' => 'В этом журнале отображается список успешных попыток авторизаций администраторов. Записи хранятся :days дней.',
|
||||
|
|
@ -483,13 +464,13 @@ return [
|
|||
'ip_address' => 'IP адрес',
|
||||
'first_name' => 'Имя',
|
||||
'last_name' => 'Фамилия',
|
||||
'email' => 'Email',
|
||||
'email' => 'Почта'
|
||||
],
|
||||
'filter' => [
|
||||
'all' => 'все',
|
||||
'options_method_not_exists' => "Модель класса :model должна определить метод :method() возвращающего варианты для фильтра ':filter'.",
|
||||
'date_all' => 'весь период',
|
||||
'number_all' => 'все номера',
|
||||
'number_all' => 'все номера'
|
||||
],
|
||||
'import_export' => [
|
||||
'upload_csv_file' => '1. Загрузка CSV-файл',
|
||||
|
|
@ -560,14 +541,12 @@ return [
|
|||
'iso_8859_13' => 'ISO-8859-13 (Latin-7, Baltic Rim)',
|
||||
'iso_8859_14' => 'ISO-8859-14 (Latin-8, Celtic)',
|
||||
'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)',
|
||||
'windows_1250' => 'Windows-1250 (CP1250, Central and Eastern European)',
|
||||
'windows_1251' => 'Windows-1251 (CP1251)',
|
||||
'windows_1252' => 'Windows-1252 (CP1252)'
|
||||
]
|
||||
],
|
||||
'permissions' => [
|
||||
'manage_media' => 'Загрузка и управление медиаконтентом - изображениями, видео, звуками, документами',
|
||||
'allow_unsafe_markdown' => 'Использовать небезопасный Markdown (может включать Javascript)',
|
||||
],
|
||||
'mediafinder' => [
|
||||
'label' => 'Поиск медиа',
|
||||
|
|
@ -635,6 +614,6 @@ return [
|
|||
'selection_mode' => 'Режим выделения',
|
||||
'resize_image' => 'Изменение размера изображения',
|
||||
'image_size' => 'Размер изображения:',
|
||||
'selected_size' => 'Выбрано:',
|
||||
'selected_size' => 'Выбрано:'
|
||||
],
|
||||
];
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ return [
|
|||
'invalid_type' => 'Uporabljen je neveljaven tip polja :type.',
|
||||
'options_method_invalid_model' => "Atribut ':field' ne ustreza veljavnemu modelu. Poskusite natančno določiti možnosti metode za model :model.",
|
||||
'options_method_not_exists' => "Model :model mora vsebovati metodo :method(), ki vrača možnosti za polje ':field' na obrazcu.",
|
||||
'options_static_method_invalid_value' => "Statična metoda ':method()' v razredu :class ni vrnila veljavnih možnosti.",
|
||||
'colors_method_not_exists' => "Model :model mora vsebovati metodo :method(), ki vrača HTML barvne kode v HEX formatu za polje ':field' na obrazcu.",
|
||||
],
|
||||
'widget' => [
|
||||
|
|
@ -49,10 +48,6 @@ return [
|
|||
'impersonate_working' => 'Impersoniram...',
|
||||
'impersonating' => 'Impersonacija uporabnika :full_name',
|
||||
'stop_impersonating' => 'Prekliči impersonacijo',
|
||||
'unsuspend' => 'Odsuspendiraj',
|
||||
'unsuspend_confirm' => 'Ali ste prepričani, da želite odsuspendirati tega uporabnika?',
|
||||
'unsuspend_success' => 'Uporabnik je odsuspendiran.',
|
||||
'unsuspend_working' => 'Odsuspendiram...',
|
||||
'signed_in_as' => 'Prijavljeni ste kot :full_name',
|
||||
'sign_out' => 'Odjava',
|
||||
'login' => 'Prijava',
|
||||
|
|
@ -407,7 +402,6 @@ return [
|
|||
'label' => 'Opis',
|
||||
'class_name' => 'Oznaka razreda',
|
||||
'markup_tags' => 'Označevalne oznake',
|
||||
'markup_tag' => 'Označevalna oznaka',
|
||||
'allowed_empty_tags' => 'Dovoljene prazne oznake',
|
||||
'allowed_empty_tags_comment' => 'Seznam oznak, ki niso odstranjene, če v njih ni vsebine.',
|
||||
'allowed_tags' => 'Dovoljene oznake',
|
||||
|
|
@ -418,7 +412,6 @@ return [
|
|||
'remove_tags_comment' => 'Seznam oznak, ki so odstranjene skupaj z njihovo vsebino.',
|
||||
'line_breaker_tags' => 'Oznake prekinitve vrstic',
|
||||
'line_breaker_tags_comment' => 'Seznam oznak, ki se uporabljajo za postavitev elementa prekinitve med vrstice.',
|
||||
'toolbar_options' => 'Nastavitve orodne vrstice',
|
||||
'toolbar_buttons' => 'Gumbi orodne vrstice',
|
||||
'toolbar_buttons_comment' => 'Gumbi orodne vrstice, ki se privzeto prikažejo v urejevalniku. [fullscreen, bold, italic, underline, strikeThrough, subscript, superscript, fontFamily, fontSize, |, color, emoticons, inlineStyle, paragraphStyle, |, paragraphFormat, align, formatOL, formatUL, outdent, indent, quote, insertHR, -, insertLink, insertImage, insertVideo, insertAudio, insertFile, insertTable, undo, redo, clearFormatting, selectAll, html]',
|
||||
'toolbar_buttons_preset' => 'Vstavite prednastavljeno konfiguracijo gumbov orodne vrstice:',
|
||||
|
|
@ -427,8 +420,6 @@ return [
|
|||
'minimal' => 'Minimalno',
|
||||
'full' => 'Polno',
|
||||
],
|
||||
'paragraph_formats' => 'Formati odstavkov',
|
||||
'paragraph_formats_comment' => 'Možnosti, ki se prikažejo v spustnem seznamu Format odstavka.',
|
||||
],
|
||||
'tooltips' => [
|
||||
'preview_website' => 'Ogled spletne strani',
|
||||
|
|
@ -479,7 +470,7 @@ return [
|
|||
],
|
||||
'access_log' => [
|
||||
'hint' => 'Ta dnevnik beleži seznam uspešnih prijav administratorjev. Zapisi se hranijo :days dni.',
|
||||
'menu_label' => 'Dnevnik dostopov',
|
||||
'menu_label' => 'Dnevnik dostopa',
|
||||
'menu_description' => 'Prikaz seznama uspešnih prijav administratorjev.',
|
||||
'id' => 'ID',
|
||||
'created_at' => 'Datum in čas',
|
||||
|
|
@ -567,12 +558,11 @@ return [
|
|||
'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)',
|
||||
'windows_1250' => 'Windows-1250 (CP1250, Central and Eastern European)',
|
||||
'windows_1251' => 'Windows-1251 (CP1251)',
|
||||
'windows_1252' => 'Windows-1252 (CP1252)',
|
||||
],
|
||||
'windows_1252' => 'Windows-1252 (CP1252)'
|
||||
]
|
||||
],
|
||||
'permissions' => [
|
||||
'manage_media' => 'Nalaganje in upravljanje z media vsebinami - slike, video posnetki, zvočni posnetki, dokumenti',
|
||||
'allow_unsafe_markdown' => 'Dovoli uporabo nevarnih označb (lahko vključi Javascript)',
|
||||
],
|
||||
'mediafinder' => [
|
||||
'label' => 'Media brskalnik',
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ return [
|
|||
'widget_width' => '寬度',
|
||||
'full_width' => '全部寬度',
|
||||
'add_widget' => '新增元件',
|
||||
'manage_widgets' => '管理元件',
|
||||
'widget_inspector_title' => '元件設定',
|
||||
'widget_inspector_description' => '設定報表元件',
|
||||
'widget_columns_label' => '寬度 :columns',
|
||||
|
|
@ -63,12 +62,6 @@ return [
|
|||
'widget_new_row_description' => '把元件放到新列',
|
||||
'widget_title_label' => '元件標題',
|
||||
'widget_title_error' => '需要元件標題',
|
||||
'reset_layout' => '重置版面',
|
||||
'reset_layout_confirm' => '確定重置為預設版面?',
|
||||
'reset_layout_success' => '版面已重置。',
|
||||
'make_default' => '設定為預設',
|
||||
'make_default_confirm' => '確定將此版面設定為預設?',
|
||||
'make_default_success' => '已設定此版面為預設。',
|
||||
'status' => [
|
||||
'widget_title_default' => '系統狀態',
|
||||
'update_available' => '{0} 更新可用!|{1} 更新可用!|[2,Inf] 更新可用!'
|
||||
|
|
@ -177,7 +170,7 @@ return [
|
|||
'field_off' => '關',
|
||||
'field_on' => '開',
|
||||
'add' => '增加',
|
||||
'apply' => '確定',
|
||||
'apply' => '應用',
|
||||
'cancel' => '取消',
|
||||
'close' => '關閉',
|
||||
'confirm' => '確認',
|
||||
|
|
@ -304,9 +297,7 @@ return [
|
|||
'email' => 'Email'
|
||||
],
|
||||
'filter' => [
|
||||
'all' => '全部',
|
||||
'date_all' => '全部區間',
|
||||
'number_all' => '全部數目',
|
||||
'all' => '全部'
|
||||
],
|
||||
'permissions' => [
|
||||
'manage_media' => 'Upload and manage media contents - images, videos, sounds, documents'
|
||||
|
|
@ -325,10 +316,10 @@ return [
|
|||
'display' => '顯示',
|
||||
'filter_everything' => '所有',
|
||||
'filter_images' => '圖片',
|
||||
'filter_video' => '影片',
|
||||
'filter_audio' => '音訊',
|
||||
'filter_video' => '視頻',
|
||||
'filter_audio' => '音頻',
|
||||
'filter_documents' => '文檔',
|
||||
'library' => '媒體庫',
|
||||
'library' => '庫',
|
||||
'size' => '大小',
|
||||
'title' => '標題',
|
||||
'last_modified' => '最近修改',
|
||||
|
|
@ -341,7 +332,7 @@ return [
|
|||
'multiple_selected' => '多選.',
|
||||
'uploading_file_num' => '上傳 :number 檔案...',
|
||||
'uploading_complete' => '上傳完畢',
|
||||
'order_by' => '排列方式',
|
||||
'order_by' => '排序',
|
||||
'folder' => '檔案夾',
|
||||
'no_files_found' => '沒找到您請求的檔案.',
|
||||
'delete_empty' => '請選擇刪除項.',
|
||||
|
|
@ -371,9 +362,6 @@ return [
|
|||
'selection_mode' => '選擇模式',
|
||||
'resize_image' => '調整圖片',
|
||||
'image_size' => '圖片大小:',
|
||||
'selected_size' => '選中:',
|
||||
'direction' => '順序',
|
||||
'direction_asc' => '升冪',
|
||||
'direction_desc' => '降冪',
|
||||
'selected_size' => '選中:'
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -9,6 +9,6 @@
|
|||
<?php endif ?>
|
||||
<?php if (EditorSetting::isConfigured()): ?>
|
||||
<style>
|
||||
<?= strip_tags(EditorSetting::renderCss()) ?>
|
||||
<?= EditorSetting::renderCss() ?>
|
||||
</style>
|
||||
<?php endif ?>
|
||||
|
|
|
|||
|
|
@ -49,24 +49,15 @@
|
|||
</div>
|
||||
<div class="toolbar-item toolbar-item-account">
|
||||
<ul class="mainmenu-toolbar">
|
||||
<?php foreach (BackendMenu::listQuickActionItems() as $item): ?>
|
||||
<li class="mainmenu-quick-action with-tooltip">
|
||||
<li class="mainmenu-preview with-tooltip">
|
||||
<a
|
||||
href="<?= $item->url ?>"
|
||||
title="<?= e(trans($item->label)) ?>"
|
||||
<?= Html::attributes($item->attributes) ?>
|
||||
>
|
||||
|
||||
<?php if ($item->iconSvg): ?>
|
||||
<img
|
||||
src="<?= Url::asset($item->iconSvg) ?>"
|
||||
class="svg-icon" loading="lazy" width="20" height="20" />
|
||||
<?php endif ?>
|
||||
|
||||
<i class="<?= $item->iconSvg ? 'svg-replace' : null ?> <?= $item->icon ?>"></i>
|
||||
href="<?= Url::to('/') ?>"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
title="<?= e(trans('backend::lang.tooltips.preview_website')) ?>">
|
||||
<i class="icon-crosshairs"></i>
|
||||
</a>
|
||||
</li>
|
||||
<?php endforeach ?>
|
||||
<li class="mainmenu-account with-tooltip">
|
||||
<a
|
||||
href="javascript:;" onclick="$.oc.layout.toggleAccountMenu(this)"
|
||||
|
|
|
|||
|
|
@ -48,7 +48,8 @@ class AccessLog extends Model
|
|||
$records = static::where('user_id', $user->id)
|
||||
->orderBy('created_at', 'desc')
|
||||
->limit(2)
|
||||
->get();
|
||||
->get()
|
||||
;
|
||||
|
||||
if (!count($records)) {
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ use Lang;
|
|||
use Model;
|
||||
use Response;
|
||||
use League\Csv\Writer as CsvWriter;
|
||||
use League\Csv\EscapeFormula as CsvEscapeFormula;
|
||||
use October\Rain\Parse\League\EscapeFormula as CsvEscapeFormula;
|
||||
use ApplicationException;
|
||||
use SplTempFileObject;
|
||||
|
||||
|
|
@ -112,7 +112,8 @@ abstract class ExportModel extends Model
|
|||
$csv->setEscape($options['escape']);
|
||||
}
|
||||
|
||||
$csv->addFormatter(new CsvEscapeFormula());
|
||||
// Temporary until upgrading to league/csv >= 9.1.0 (will be $csv->addFormatter($formatter))
|
||||
$formatter = new CsvEscapeFormula();
|
||||
|
||||
/*
|
||||
* Add headers
|
||||
|
|
@ -127,6 +128,10 @@ abstract class ExportModel extends Model
|
|||
*/
|
||||
foreach ($results as $result) {
|
||||
$data = $this->matchDataToColumns($result, $columns);
|
||||
|
||||
// Temporary until upgrading to league/csv >= 9.1.0
|
||||
$data = $formatter($data);
|
||||
|
||||
$csv->insertOne($data);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ use Str;
|
|||
use Lang;
|
||||
use Model;
|
||||
use League\Csv\Reader as CsvReader;
|
||||
use League\Csv\Statement as CsvStatement;
|
||||
|
||||
/**
|
||||
* Model used for importing data
|
||||
|
|
@ -109,6 +108,11 @@ abstract class ImportModel extends Model
|
|||
*/
|
||||
$reader = CsvReader::createFromPath($filePath, 'r');
|
||||
|
||||
// Filter out empty rows
|
||||
$reader->addFilter(function (array $row) {
|
||||
return count($row) > 1 || reset($row) !== null;
|
||||
});
|
||||
|
||||
if ($options['delimiter'] !== null) {
|
||||
$reader->setDelimiter($options['delimiter']);
|
||||
}
|
||||
|
|
@ -121,11 +125,15 @@ abstract class ImportModel extends Model
|
|||
$reader->setEscape($options['escape']);
|
||||
}
|
||||
|
||||
if ($options['firstRowTitles']) {
|
||||
$reader->setOffset(1);
|
||||
}
|
||||
|
||||
if (
|
||||
$options['encoding'] !== null &&
|
||||
$reader->supportsStreamFilter()
|
||||
$reader->isActiveStreamFilter()
|
||||
) {
|
||||
$reader->addStreamFilter(sprintf(
|
||||
$reader->appendStreamFilter(sprintf(
|
||||
'%s%s:%s',
|
||||
TranscodeFilter::FILTER_NAME,
|
||||
strtolower($options['encoding']),
|
||||
|
|
@ -133,19 +141,8 @@ abstract class ImportModel extends Model
|
|||
));
|
||||
}
|
||||
|
||||
// Create reader statement
|
||||
$stmt = (new CsvStatement)
|
||||
->where(function (array $row) {
|
||||
// Filter out empty rows
|
||||
return count($row) > 1 || reset($row) !== null;
|
||||
});
|
||||
|
||||
if ($options['firstRowTitles']) {
|
||||
$stmt = $stmt->offset(1);
|
||||
}
|
||||
|
||||
$result = [];
|
||||
$contents = $stmt->process($reader);
|
||||
$contents = $reader->fetch();
|
||||
foreach ($contents as $row) {
|
||||
$result[] = $this->processImportRow($row, $matches);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ class User extends UserBase
|
|||
public $rules = [
|
||||
'email' => 'required|between:6,255|email|unique:backend_users',
|
||||
'login' => 'required|between:2,255|unique:backend_users',
|
||||
'password' => 'required:create|min:4|confirmed',
|
||||
'password_confirmation' => 'required_with:password|min:4'
|
||||
'password' => 'required:create|between:4,255|confirmed',
|
||||
'password_confirmation' => 'required_with:password|between:4,255'
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -193,31 +193,3 @@ div.control-componentlist {
|
|||
.nav.selector-group li.active {
|
||||
border-left-color: @brand-secondary;
|
||||
}
|
||||
|
||||
//
|
||||
// Fancy breadcrumb
|
||||
//
|
||||
body.breadcrumb-fancy .control-breadcrumb,
|
||||
.control-breadcrumb.breadcrumb-fancy {
|
||||
background-color: mix(black, saturate(@brand-secondary, 20%), 16%);
|
||||
|
||||
li {
|
||||
background-color: mix(black, saturate(@brand-secondary, 20%), 31%);
|
||||
|
||||
&:last-child {
|
||||
background-color: mix(black, saturate(@brand-secondary, 20%), 16%);
|
||||
|
||||
&::before {
|
||||
border-left-color: mix(black, saturate(@brand-secondary, 20%), 16%);
|
||||
}
|
||||
}
|
||||
|
||||
&::after {
|
||||
border-left-color: mix(black, saturate(@brand-secondary, 20%), 31%);
|
||||
}
|
||||
|
||||
&:not(:last-child)::before {
|
||||
border-left-color: @brand-secondary;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ tabs:
|
|||
|
||||
editor_preview:
|
||||
type: partial
|
||||
label: backend::lang.editor.preview
|
||||
tab: backend::lang.backend_preferences.code_editor
|
||||
path: field_editor_preview
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ App::before(function ($request) {
|
|||
'middleware' => ['web'],
|
||||
'prefix' => Config::get('cms.backendUri', 'backend')
|
||||
], function () {
|
||||
Route::any('{slug?}', 'Backend\Classes\BackendController@run')->where('slug', '(.*)?');
|
||||
Route::any('{slug}', 'Backend\Classes\BackendController@run')->where('slug', '(.*)?');
|
||||
})
|
||||
;
|
||||
|
||||
|
|
|
|||
|
|
@ -1283,7 +1283,6 @@ class Form extends WidgetBase
|
|||
{
|
||||
/*
|
||||
* Advanced usage, supplied options are callable
|
||||
* [\Path\To\Class, methodName]
|
||||
*/
|
||||
if (is_array($fieldOptions) && is_callable($fieldOptions)) {
|
||||
$fieldOptions = call_user_func($fieldOptions, $this, $field);
|
||||
|
|
@ -1329,22 +1328,6 @@ class Form extends WidgetBase
|
|||
* Field options are an explicit method reference
|
||||
*/
|
||||
elseif (is_string($fieldOptions)) {
|
||||
// \Path\To\Class::staticMethodOptions
|
||||
if (str_contains($fieldOptions, '::')) {
|
||||
$options = explode('::', $fieldOptions);
|
||||
if (count($options) === 2 && class_exists($options[0]) && method_exists($options[0], $options[1])) {
|
||||
$result = $options[0]::{$options[1]}();
|
||||
if (!is_array($result)) {
|
||||
throw new ApplicationException(Lang::get('backend::lang.field.options_static_method_invalid_value', [
|
||||
'class' => $options[0],
|
||||
'method' => $options[1]
|
||||
]));
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
// $model->{$fieldOptions}()
|
||||
if (!$this->objectMethodExists($this->model, $fieldOptions)) {
|
||||
throw new ApplicationException(Lang::get('backend::lang.field.options_method_not_exists', [
|
||||
'model' => get_class($this->model),
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@ use October\Rain\Html\Helper as HtmlHelper;
|
|||
use October\Rain\Router\Helper as RouterHelper;
|
||||
use System\Helpers\DateTime as DateTimeHelper;
|
||||
use System\Classes\PluginManager;
|
||||
use System\Classes\MediaLibrary;
|
||||
use System\Classes\ImageResizer;
|
||||
use Backend\Classes\ListColumn;
|
||||
use Backend\Classes\WidgetBase;
|
||||
use October\Rain\Database\Model;
|
||||
|
|
@ -524,7 +522,7 @@ class Lists extends WidgetBase
|
|||
/*
|
||||
* Apply sorting
|
||||
*/
|
||||
if (($sortColumn = $this->getSortColumn()) && !$this->showTree && in_array($sortColumn, array_keys($this->getVisibleColumns()))) {
|
||||
if (($sortColumn = $this->getSortColumn()) && !$this->showTree) {
|
||||
if (($column = array_get($this->allColumns, $sortColumn)) && $column->valueFrom) {
|
||||
$sortColumn = $this->isColumnPivot($column)
|
||||
? 'pivot_' . $column->valueFrom
|
||||
|
|
@ -1189,42 +1187,6 @@ class Lists extends WidgetBase
|
|||
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process an image value
|
||||
* @return string
|
||||
*/
|
||||
protected function evalImageTypeValue($record, $column, $value)
|
||||
{
|
||||
$config = $column->config;
|
||||
|
||||
// Get config options with defaults
|
||||
$width = isset($config['width']) ? $config['width'] : 50;
|
||||
$height = isset($config['height']) ? $config['height'] : 50;
|
||||
$options = isset($config['options']) ? $config['options'] : [];
|
||||
|
||||
// Handle attachMany relationships
|
||||
if (isset($record->attachMany[$column->columnName])) {
|
||||
$image = $value->first();
|
||||
|
||||
// Handle attachOne relationships
|
||||
} elseif (isset($record->attachOne[$column->columnName])) {
|
||||
$image = $value;
|
||||
|
||||
// Handle absolute URLs
|
||||
} elseif (str_contains($value, '://')) {
|
||||
$image = $value;
|
||||
|
||||
// Assume all other values to be from the media library
|
||||
} else {
|
||||
$image = MediaLibrary::url($value);
|
||||
}
|
||||
|
||||
if (!is_null($image)) {
|
||||
$imageUrl = ImageResizer::filterGetUrl($image, $width, $height, $options);
|
||||
return "<img src='$imageUrl' width='$width' height='$height' />";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process as number, proxy to text
|
||||
* @return string
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
<div
|
||||
id="<?= $this->getId(); ?>"
|
||||
class="control-filter <?= $cssClasses ?>"
|
||||
data-control="filterwidget"
|
||||
data-options-handler="<?= $this->getEventHandler('onFilterGetOptions') ?>"
|
||||
|
|
|
|||
|
|
@ -1,15 +1,11 @@
|
|||
<?php namespace Cms;
|
||||
|
||||
use App;
|
||||
use Url;
|
||||
use Lang;
|
||||
use File;
|
||||
use Event;
|
||||
use Backend;
|
||||
use BackendMenu;
|
||||
use BackendAuth;
|
||||
use Backend\Models\UserRole;
|
||||
use Cms\Classes\Theme as CmsTheme;
|
||||
use Backend\Classes\WidgetManager;
|
||||
use October\Rain\Support\ModuleServiceProvider;
|
||||
use System\Classes\SettingsManager;
|
||||
|
|
@ -58,10 +54,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
|
||||
$this->bootMenuItemEvents();
|
||||
$this->bootRichEditorEvents();
|
||||
|
||||
if (App::runningInBackend()) {
|
||||
$this->bootBackendLocalization();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -175,19 +167,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
]
|
||||
]
|
||||
]);
|
||||
|
||||
$manager->registerQuickActions('October.Cms', [
|
||||
'preview' => [
|
||||
'label' => 'backend::lang.tooltips.preview_website',
|
||||
'icon' => 'icon-crosshairs',
|
||||
'url' => Url::to('/'),
|
||||
'order' => 10,
|
||||
'attributes' => [
|
||||
'target' => '_blank',
|
||||
'rel' => 'noopener noreferrer',
|
||||
],
|
||||
],
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -305,20 +284,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Boots localization from an active theme for backend items.
|
||||
*/
|
||||
protected function bootBackendLocalization()
|
||||
{
|
||||
$theme = CmsTheme::getActiveTheme();
|
||||
|
||||
$langPath = $theme->getPath() . '/lang';
|
||||
|
||||
if (File::isDirectory($langPath)) {
|
||||
Lang::addNamespace('themes.' . $theme->getId(), $langPath);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers events for menu items.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -4,11 +4,10 @@ use File;
|
|||
use Lang;
|
||||
use Config;
|
||||
use Request;
|
||||
use ApplicationException;
|
||||
use ValidationException;
|
||||
use Cms\Helpers\File as FileHelper;
|
||||
use October\Rain\Extension\Extendable;
|
||||
use October\Rain\Filesystem\PathResolver;
|
||||
use ApplicationException;
|
||||
use ValidationException;
|
||||
|
||||
/**
|
||||
* The CMS theme asset file class.
|
||||
|
|
@ -286,15 +285,14 @@ class Asset extends Extendable
|
|||
$fileName = $this->fileName;
|
||||
}
|
||||
|
||||
// Limit paths to those under the assets directory
|
||||
$directory = $this->theme->getPath() . '/' . $this->dirName . '/';
|
||||
$filePath = $directory . $fileName;
|
||||
|
||||
// Limit paths to those under the theme's assets directory
|
||||
if (!PathResolver::within($filePath, $directory)) {
|
||||
$path = realpath($directory . $fileName);
|
||||
if (!starts_with($path, $directory)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return PathResolver::resolve($filePath);
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -316,8 +316,7 @@ class CmsCompoundObject extends CmsObject
|
|||
|
||||
self::$objectComponentPropertyMap = $objectComponentMap;
|
||||
|
||||
$expiresAt = now()->addMinutes(Config::get('cms.parsedPageCacheTTL', 10));
|
||||
Cache::put($key, base64_encode(serialize($objectComponentMap)), $expiresAt);
|
||||
Cache::put($key, base64_encode(serialize($objectComponentMap)), Config::get('cms.parsedPageCacheTTL', 10));
|
||||
|
||||
if (array_key_exists($componentName, $objectComponentMap[$objectCode])) {
|
||||
return $objectComponentMap[$objectCode][$componentName];
|
||||
|
|
|
|||
|
|
@ -4,12 +4,11 @@ use App;
|
|||
use Lang;
|
||||
use Event;
|
||||
use Config;
|
||||
use Exception;
|
||||
use ValidationException;
|
||||
use ApplicationException;
|
||||
use Cms\Contracts\CmsObject as CmsObjectContract;
|
||||
use October\Rain\Filesystem\PathResolver;
|
||||
use October\Rain\Halcyon\Model as HalcyonModel;
|
||||
use Cms\Contracts\CmsObject as CmsObjectContract;
|
||||
use ApplicationException;
|
||||
use ValidationException;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* This is a base class for all CMS objects - content files, pages, partials and layouts.
|
||||
|
|
@ -235,15 +234,7 @@ class CmsObject extends HalcyonModel implements CmsObjectContract
|
|||
$fileName = $this->fileName;
|
||||
}
|
||||
|
||||
$directory = $this->theme->getPath() . '/' . $this->getObjectTypeDirName() . '/';
|
||||
$filePath = $directory . $fileName;
|
||||
|
||||
// Limit paths to those under the corresponding theme directory
|
||||
if (!PathResolver::within($filePath, $directory)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return PathResolver::resolve($filePath);
|
||||
return $this->theme->getPath().'/'.$this->getObjectTypeDirName().'/'.$fileName;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
<?php namespace Cms\Classes;
|
||||
|
||||
use ApplicationException;
|
||||
use October\Rain\Support\Collection as CollectionBase;
|
||||
|
||||
/**
|
||||
|
|
@ -38,32 +37,15 @@ class CmsObjectCollection extends CollectionBase
|
|||
|
||||
/**
|
||||
* Returns objects whose properties match the supplied value.
|
||||
*
|
||||
* Note that this deviates from Laravel 6's Illuminate\Support\Traits\EnumeratesValues::where() method signature,
|
||||
* which uses ($key, $operator = null, $value = null) as parameters and that this class extends.
|
||||
*
|
||||
* To ensure backwards compatibility with our current Halcyon functionality, this method retains the original
|
||||
* parameters and functions the same way as before, with handling for the $value and $strict parameters to ensure
|
||||
* they match the previously expected formats. This means that you cannot use operators for "where" queries on
|
||||
* CMS object collections.
|
||||
*
|
||||
* @param string $property
|
||||
* @param string $value
|
||||
* @param bool $strict
|
||||
* @return static
|
||||
*/
|
||||
public function where($property, $value = null, $strict = null)
|
||||
public function where($property, $value, $strict = true)
|
||||
{
|
||||
if (empty($value) || !is_string($value)) {
|
||||
throw new ApplicationException('You must provide a string value to compare with when executing a "where" '
|
||||
. 'query for CMS object collections.');
|
||||
}
|
||||
|
||||
if (!isset($strict) || !is_bool($strict)) {
|
||||
$strict = true;
|
||||
}
|
||||
|
||||
return $this->filter(function ($object) use ($property, $value, $strict) {
|
||||
|
||||
if (!array_key_exists($property, $object->settings)) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ class CodeParser
|
|||
$body = preg_replace('/^\s*function/m', 'public function', $body);
|
||||
|
||||
$namespaces = [];
|
||||
$pattern = '/(use\s+[a-z0-9_\\\\]+(\s+as\s+[a-z0-9_]+)?;(\r\n|\n)?)/mi';
|
||||
$pattern = '/(use\s+[a-z0-9_\\\\]+(\s+as\s+[a-z0-9_]+)?;\n?)/mi';
|
||||
preg_match_all($pattern, $body, $namespaces);
|
||||
$body = preg_replace($pattern, '', $body);
|
||||
|
||||
|
|
@ -141,15 +141,14 @@ class CodeParser
|
|||
$fileContents = '<?php '.PHP_EOL;
|
||||
|
||||
foreach ($namespaces[0] as $namespace) {
|
||||
// Only allow compound or aliased use statements
|
||||
if (str_contains($namespace, '\\') || str_contains($namespace, ' as ')) {
|
||||
$fileContents .= trim($namespace).PHP_EOL;
|
||||
if (str_contains($namespace, '\\')) {
|
||||
$fileContents .= $namespace;
|
||||
}
|
||||
}
|
||||
|
||||
$fileContents .= 'class '.$className.$parentClass.PHP_EOL;
|
||||
$fileContents .= '{'.PHP_EOL;
|
||||
$fileContents .= trim($body).PHP_EOL;
|
||||
$fileContents .= $body.PHP_EOL;
|
||||
$fileContents .= '}'.PHP_EOL;
|
||||
|
||||
$this->validate($fileContents);
|
||||
|
|
@ -225,8 +224,7 @@ class CodeParser
|
|||
$cached = $this->getCachedInfo() ?: [];
|
||||
$cached[$this->filePath] = $cacheItem;
|
||||
|
||||
$expiresAt = now()->addMinutes(1440);
|
||||
Cache::put($this->dataCacheKey, base64_encode(serialize($cached)), $expiresAt);
|
||||
Cache::put($this->dataCacheKey, base64_encode(serialize($cached)), 1440);
|
||||
|
||||
self::$cache[$this->filePath] = $result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
<?php namespace Cms\Classes;
|
||||
|
||||
use Lang;
|
||||
use BackendAuth;
|
||||
use ApplicationException;
|
||||
use October\Rain\Filesystem\Definitions as FileDefinitions;
|
||||
|
||||
|
|
@ -198,12 +197,6 @@ class Page extends CmsCompoundObject
|
|||
}
|
||||
|
||||
$page = self::loadCached($theme, $item->reference);
|
||||
|
||||
// Remove hidden CMS pages from menus when backend user is logged out
|
||||
if ($page && $page->is_hidden && !BackendAuth::getUser()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$controller = Controller::getController() ?: new Controller;
|
||||
$pageUrl = $controller->pageUrl($item->reference, [], false);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,11 @@ class Partial extends CmsCompoundObject
|
|||
*/
|
||||
protected $dirName = 'partials';
|
||||
|
||||
/**
|
||||
* @var array Allowable file extensions. TEMPORARY! DO NOT INCLUDE in Build 1.1.x, workaround for unsupported code
|
||||
*/
|
||||
protected $allowedExtensions = ['htm', 'html', 'css', 'js', 'svg'];
|
||||
|
||||
/**
|
||||
* Returns name of a PHP class to us a parent for the PHP class created for the object's PHP section.
|
||||
* @return string Returns the class name.
|
||||
|
|
|
|||
|
|
@ -127,11 +127,10 @@ class Router
|
|||
: $fileName;
|
||||
|
||||
$key = $this->getUrlListCacheKey();
|
||||
$expiresAt = now()->addMinutes(Config::get('cms.urlCacheTtl', 1));
|
||||
Cache::put(
|
||||
$key,
|
||||
base64_encode(serialize($urlList)),
|
||||
$expiresAt
|
||||
Config::get('cms.urlCacheTtl', 1)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -252,8 +251,7 @@ class Router
|
|||
|
||||
$this->urlMap = $map;
|
||||
if ($cacheable) {
|
||||
$expiresAt = now()->addMinutes(Config::get('cms.urlCacheTtl', 1));
|
||||
Cache::put($key, base64_encode(serialize($map)), $expiresAt);
|
||||
Cache::put($key, base64_encode(serialize($map)), Config::get('cms.urlCacheTtl', 1));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -158,8 +158,7 @@ class Theme
|
|||
if ($checkDatabase && App::hasDatabase()) {
|
||||
try {
|
||||
try {
|
||||
$expiresAt = now()->addMinutes(1440);
|
||||
$dbResult = Cache::remember(self::ACTIVE_KEY, $expiresAt, function () {
|
||||
$dbResult = Cache::remember(self::ACTIVE_KEY, 1440, function () {
|
||||
return Parameter::applyKey(self::ACTIVE_KEY)->value('value');
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@
|
|||
"authors": [
|
||||
{
|
||||
"name": "Alexey Bobkov",
|
||||
"email": "aleksey.bobkov@gmail.com",
|
||||
"role": "Co-founder"
|
||||
"email": "aleksey.bobkov@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Samuel Georges",
|
||||
"email": "daftspunky@gmail.com",
|
||||
"role": "Co-founder"
|
||||
"email": "daftspunky@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Luke Towers",
|
||||
|
|
@ -24,10 +22,9 @@
|
|||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.2",
|
||||
"php": ">=7.0",
|
||||
"composer/installers": "~1.0",
|
||||
"october/rain": "~1.1.0",
|
||||
"laravel/framework": "~6.0"
|
||||
"october/rain": "~1.0.469"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
|
|
|||
|
|
@ -103,11 +103,8 @@ class ThemeOptions extends Controller
|
|||
|
||||
/**
|
||||
* Default to the active theme if user doesn't have access to manage all themes
|
||||
*
|
||||
* @param string $dirName
|
||||
* @return string
|
||||
*/
|
||||
protected function getDirName(string $dirName = null)
|
||||
protected function getDirName($dirName = null)
|
||||
{
|
||||
/*
|
||||
* Only the active theme can be managed without this permission
|
||||
|
|
|
|||
|
|
@ -2,16 +2,12 @@
|
|||
|
||||
use October\Rain\Support\Facade;
|
||||
|
||||
/**
|
||||
* @method static string url(string $path = null)
|
||||
*
|
||||
* @see \Cms\Helpers\Cms
|
||||
*/
|
||||
class Cms extends Facade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*
|
||||
* @see \Cms\Helpers\Cms
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
|
|
|
|||
|
|
@ -10,24 +10,12 @@ return [
|
|||
'invalid_file_extension'=>'Ungültige Dateiendung: :invalid. Erlaubt sind: :allowed.',
|
||||
'error_deleting' => 'Fehler beim Löschen der Template-Datei ":name".',
|
||||
'delete_success' => 'Templates wurden erfolgreich gelöscht: :count.',
|
||||
'file_name_required' => 'Ein Dateiname ist erforderlich.',
|
||||
'safe_mode_enabled' => 'Der abgesicherte Modus ist derzeit aktiviert. Die Bearbeitung des PHP-Codes von CMS-Templates ist deaktiviert. Um den abgesicherten Modus zu deaktivieren, setzen Sie den Konfigurationswert `cms.enableSafeMode` auf `false`.',
|
||||
],
|
||||
'dashboard' => [
|
||||
'active_theme' => [
|
||||
'widget_title_default' => 'Website',
|
||||
'online' => 'Online',
|
||||
'maintenance' => 'In der Wartung',
|
||||
'manage_themes' => 'Themes Verwalten',
|
||||
'customize_theme' => 'Theme anpassen',
|
||||
],
|
||||
'file_name_required' => 'Ein Dateiname ist erforderlich.'
|
||||
],
|
||||
'theme' => [
|
||||
'not_found_name' => "Das Theme ':name' konnte nicht gefunden werden.",
|
||||
'by_author' => 'Von :name',
|
||||
'active' => [
|
||||
'not_set' => "Aktives Theme nicht definiert",
|
||||
'not_found' => 'Aktives Theme wurde nicht gefunden.',
|
||||
],
|
||||
'edit' => [
|
||||
'not_set' => "Edit Theme nicht definiert",
|
||||
|
|
@ -47,8 +35,6 @@ return [
|
|||
'homepage_placeholder' => 'Webseiten URL',
|
||||
'code_label' => 'Code',
|
||||
'code_placeholder' => 'Ein einzigartiger Code genutzt bei der Weiterverbreitung dieses Themes',
|
||||
'preview_image_label' => 'Bildvorschau',
|
||||
'preview_image_placeholder' => 'Der Pfad des Theme-Vorschaubildes.',
|
||||
'dir_name_label' => 'Verzeichnisname',
|
||||
'dir_name_create_label' => 'Name des Zielverzeichnisses',
|
||||
'theme_label' => 'Theme',
|
||||
|
|
@ -98,8 +84,7 @@ return [
|
|||
'settings_menu' => 'Wartungsmodus',
|
||||
'settings_menu_description' => 'Konfigurieren Sie den Wartungsmodus.',
|
||||
'is_enabled' => 'Wartungsmodus aktivieren',
|
||||
'is_enabled_comment' => 'Sobald aktiviert, werden Besucher die unten ausgewählte Seite sehen.',
|
||||
'hint' => 'Im Wartungsmodus wird die Wartungsseite für Besucher angezeigt, die nicht im Back-End-Bereich angemeldet sind.',
|
||||
'is_enabled_comment' => 'Sobald aktiviert, werden Besucher die unten ausgewählte Seite sehen.'
|
||||
],
|
||||
'page' => [
|
||||
'not_found_name' => "Die Seite ':name' konnte nicht gefunden werden",
|
||||
|
|
@ -112,22 +97,16 @@ return [
|
|||
'help' => "Entschuldigung, ein Fehler trat auf, sodass die gewünschte Seite nicht angezeigt werden kann.",
|
||||
],
|
||||
'menu_label' => 'Seiten',
|
||||
'unsaved_label' => 'Ungespeicherte Seite(n)',
|
||||
'no_list_records' => 'Keine Seiten gefunden',
|
||||
'new' => 'Neue Seite',
|
||||
'invalid_url' => 'Ungültiges URL-Format. Die URL muss mit einem Slash beginnen und darf nur Ziffern, lateinische Zeichen und die folgenden Symbole beinhalten: ._-[]:?|/+*^$',
|
||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Seiten wirklich löschen?',
|
||||
'delete_confirm_single' => 'Wollen Sie diese Seite wirklich löschen?',
|
||||
'no_layout' => '-- Kein Layout --',
|
||||
'cms_page' => 'CMS Seite',
|
||||
'title' => 'Seitentitel',
|
||||
'url' => 'Seiten-URL',
|
||||
'file_name' => 'Seiten-Dateiname',
|
||||
'no_layout' => '-- Kein Layout --'
|
||||
],
|
||||
'layout' => [
|
||||
'not_found_name' => "Das Layout ':name' wurde nicht gefunden",
|
||||
'menu_label' => 'Layouts',
|
||||
'unsaved_label' => 'Ungespeicherte(s) Layout(s)',
|
||||
'no_list_records' => 'Keine Layouts gefunden',
|
||||
'new' => 'Neues Layout',
|
||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Layouts wirklich löschen?',
|
||||
|
|
@ -137,7 +116,6 @@ return [
|
|||
'not_found_name' => "Das Partial ':name' wurde nicht gefunden.",
|
||||
'invalid_name' => "Ungültiger Partial-Name: :name.",
|
||||
'menu_label' => 'Partials',
|
||||
'unsaved_label' => 'Ungespeicherte(s) Partial(s)',
|
||||
'no_list_records' => 'Keine Partials gefunden',
|
||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Partials wirklich löschen?',
|
||||
'delete_confirm_single' => 'Wollen Sie das ausgewählte Partial wirklich löschen?',
|
||||
|
|
@ -146,7 +124,6 @@ return [
|
|||
'content' => [
|
||||
'not_found_name' => "Die Inhaltsdatei ':name' wurde nicht gefunden.",
|
||||
'menu_label' => 'Inhalt',
|
||||
'unsaved_label' => 'Ungespeicherter Inhalt',
|
||||
'no_list_records' => 'Keine Inhaltsdateien gefunden',
|
||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Inhalte und Verzeichnisse wirklich löschen?',
|
||||
'delete_confirm_single' => 'Wollen Sie diese Inhaltsdatei wirklich löschen?',
|
||||
|
|
@ -181,34 +158,18 @@ return [
|
|||
'hidden' => 'Versteckt',
|
||||
'hidden_comment' => 'Versteckte Seiten können nur von eingeloggten Backend-Benutzern genutzt werden.',
|
||||
'enter_fullscreen' => 'In den Vollbildmodus wechseln',
|
||||
'exit_fullscreen' => 'Vollbildmodus beenden',
|
||||
'open_searchbox' => 'Suchfeld öffnen',
|
||||
'close_searchbox' => 'Suchfeld schließen',
|
||||
'open_replacebox' => 'Ersetzen-Feld öffnen',
|
||||
'close_replacebox' => 'Ersetzen-Feld schließen',
|
||||
'commit' => 'Commit',
|
||||
'reset' => 'Zurücksetzen',
|
||||
'commit_confirm' => 'Sind Sie sicher, dass Sie Ihre Änderungen an dieser Datei auf das Dateisystem übertragen wollen? Dies wird die bestehende Datei auf dem Dateisystem überschreiben',
|
||||
'reset_confirm' => 'Sind Sie sicher, dass Sie diese Datei auf die Kopie zurücksetzen wollen, die sich auf dem Dateisystem befindet? Dadurch wird sie vollständig durch die Datei ersetzt, die sich auf dem Dateisystem befindet.',
|
||||
'committing' => 'Committing',
|
||||
'resetting' => 'Zurücksetzen',
|
||||
'commit_success' => 'Der :type wurde auf das Dateisystem übertragen',
|
||||
'reset_success' => 'Der :type wurde auf die Dateisystemversion zurückgesetzt',
|
||||
'exit_fullscreen' => 'Vollbildmodus beenden'
|
||||
],
|
||||
'asset' => [
|
||||
'menu_label' => "Assets",
|
||||
'unsaved_label' => 'Ungespeicherte(s) Asset(s)',
|
||||
'drop_down_add_title' => 'Hinzufügen...',
|
||||
'drop_down_operation_title' => 'Aktion...',
|
||||
'upload_files' => 'Datei(en) hochladen',
|
||||
'create_file' => 'Datei erstellen',
|
||||
'create_directory' => 'Verzeichnis erstellen',
|
||||
'directory_popup_title' => 'Neues Verzeichnis',
|
||||
'directory_name' => 'Verzeichnisname',
|
||||
'rename' => 'Umbenennen',
|
||||
'delete' => 'Löschen',
|
||||
'move' => 'Verschieben',
|
||||
'select' => 'Auswählen',
|
||||
'new' => 'Neue Datei',
|
||||
'rename_popup_title' => 'Umbenennen',
|
||||
'rename_new_name' => 'Neuer Name',
|
||||
|
|
@ -235,8 +196,6 @@ return [
|
|||
'error_moving_file' => 'Fehler beim Verschieben der Datei :file',
|
||||
'error_moving_directory' => 'Fehler beim Verschieben des Verzeichnisses :dir',
|
||||
'error_deleting_directory' => 'Fehler beim Löschen des Originalverzeichnisses :dir',
|
||||
'no_list_records' => 'Keine Dateien gefunden',
|
||||
'delete_confirm' => 'Ausgewählte Dateien oder Verzeichnisse löschen?',
|
||||
'path' => 'Pfad'
|
||||
],
|
||||
'component' => [
|
||||
|
|
@ -249,17 +208,12 @@ return [
|
|||
'invalid_request' => "Aufgrund ungültiger Komponentendaten kann das Template nicht gespeichert werden.",
|
||||
'no_records' => 'Keine Komponenten gefunden',
|
||||
'not_found' => "Die Komponente ':name' wurde nicht gefunden.",
|
||||
'no_default_partial' => "Diese Komponente hat keinen 'default' Partial",
|
||||
'method_not_found' => "Die Komponente ':name' enthält keine Methode mit Namen ':method'.",
|
||||
'soft_component_description' => 'Diese Komponente fehlt, aber Sie ist optional.',
|
||||
],
|
||||
'template' => [
|
||||
'invalid_type' => "Unbekannter Template-Typ.",
|
||||
'not_found' => "Das angeforderte Template wurde nicht gefunden.",
|
||||
'saved'=> "Das Template wurde erfolgreich gespeichert.",
|
||||
'no_list_records' => 'Keine Einträge gefunden',
|
||||
'delete_confirm' => 'Ausgewählte Templates löschen?',
|
||||
'order_by' => 'Sortieren nach',
|
||||
'saved'=> "Das Template wurde erfolgreich gespeichert."
|
||||
],
|
||||
'permissions' => [
|
||||
'name' => 'Cms',
|
||||
|
|
@ -269,35 +223,5 @@ return [
|
|||
'manage_layouts' => 'Layouts verwalten',
|
||||
'manage_partials' => 'Partials verwalten',
|
||||
'manage_themes' => 'Themes verwalten',
|
||||
'manage_theme_options' => 'Konfigurieren Sie Anpassungsoptionen für das aktive Theme',
|
||||
],
|
||||
'theme_log' => [
|
||||
'hint' => 'Dieses Protokoll zeigt alle Änderungen an, die von Administratoren im Back-End-Bereich am Theme vorgenommen wurden.',
|
||||
'menu_label' => 'Theme Protokoll',
|
||||
'menu_description' => 'Zeigen Sie die am aktiven Theme vorgenommenen Änderungen an.',
|
||||
'empty_link' => 'Leeres Theme Protokoll',
|
||||
'empty_loading' => 'Leeren des Theme Protokolls...',
|
||||
'empty_success' => 'Theme Protokoll',
|
||||
'return_link' => 'Zurück zum Theme Protokoll',
|
||||
'id' => 'ID',
|
||||
'id_label' => 'Protokoll ID',
|
||||
'created_at' => 'Datum & Zeit',
|
||||
'user' => 'Benutzer',
|
||||
'type' => 'Typ',
|
||||
'type_create' => 'Erstellen',
|
||||
'type_update' => 'Aktualisieren',
|
||||
'type_delete' => 'Löschen',
|
||||
'theme_name' => 'Theme',
|
||||
'theme_code' => 'Theme Code',
|
||||
'old_template' => 'Template (Alt)',
|
||||
'new_template' => 'Template (Neu)',
|
||||
'template' => 'Template',
|
||||
'diff' => 'Änderungen',
|
||||
'old_value' => 'Alter Wert',
|
||||
'new_value' => 'Neuer Wert',
|
||||
'preview_title' => 'Templateänderungen',
|
||||
'template_updated' => 'Template wurde aktualisiert',
|
||||
'template_created' => 'Template wurde erstellt',
|
||||
'template_deleted' => 'Template wurde gelöscht',
|
||||
],
|
||||
];
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ return [
|
|||
'error_deleting' => 'Fout bij het verwijderen van template: ":name". Controleer de schrijfrechten.',
|
||||
'delete_success' => 'Templates zijn succesvol verwijderd: :count.',
|
||||
'file_name_required' => 'Het invullen van een bestandsnaam is verplicht.',
|
||||
'safe_mode_enabled' => 'Veilige modus is op dit moment ingeschakeld.',
|
||||
'safe_mode_enabled' => 'Beveiligde modus is op dit moment ingeschakeld.',
|
||||
],
|
||||
'dashboard' => [
|
||||
'active_theme' => [
|
||||
|
|
@ -245,12 +245,11 @@ return [
|
|||
'no_description' => 'Geen beschrijving opgegeven',
|
||||
'alias' => 'Alias',
|
||||
'alias_description' => 'Een unieke naam voor dit component voor gebruik in de code van een pagina of layout.',
|
||||
'validation_message' => 'Een alias voor de component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.',
|
||||
'validation_message' => 'Een alias voor het component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.',
|
||||
'invalid_request' => 'De template kan niet worden opgeslagen vanwege ongeldige componentgegevens.',
|
||||
'no_records' => 'Geen componenten gevonden',
|
||||
'not_found' => 'De component \':name\' is niet gevonden.',
|
||||
'no_default_partial' => "De component bevat geen 'standaard' sjabloon",
|
||||
'method_not_found' => 'De component \':name\' bevat geen \':method\' methode.',
|
||||
'not_found' => 'Het component \':name\' is niet gevonden.',
|
||||
'method_not_found' => 'Het component \':name\' bevat geen \':method\' methode.',
|
||||
'soft_component' => 'Soft Component',
|
||||
'soft_component_description' => 'Dit component ontbreekt, maar is optioneel.',
|
||||
],
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ return [
|
|||
'error_deleting' => "Невозможно удалить файл шаблона ':name'. Пожалуйста, проверьте права на запись.",
|
||||
'delete_success' => 'Шаблоны были успешно удалены: :count.',
|
||||
'file_name_required' => 'Пожалуйста, укажите имя файла шаблона.',
|
||||
'safe_mode_enabled' => 'В настоящий момент включен безопасный режим.',
|
||||
'safe_mode_enabled' => 'В настоящий момент включен безопасный режим.'
|
||||
],
|
||||
'dashboard' => [
|
||||
'active_theme' => [
|
||||
|
|
@ -19,7 +19,7 @@ return [
|
|||
'online' => 'Онлайн',
|
||||
'maintenance' => 'в разработке',
|
||||
'manage_themes' => 'Управление темами',
|
||||
'customize_theme' => 'Настройка темы',
|
||||
'customize_theme' => 'Настройка Темы'
|
||||
],
|
||||
],
|
||||
'theme' => [
|
||||
|
|
@ -27,12 +27,12 @@ return [
|
|||
'by_author' => 'Создано :name',
|
||||
'active' => [
|
||||
'not_set' => 'Активная тема не установлена.',
|
||||
'not_found' => 'Активная тема не найдена.',
|
||||
'not_found' => 'Активная тема не найдена.'
|
||||
],
|
||||
'edit' => [
|
||||
'not_set' => 'Тема для редактирования не установлена.',
|
||||
'not_found' => 'Тема для редактирования не найдена.',
|
||||
'not_match' => 'Объект, который вы пытаетесь открыть, не принадлежит редактируемой теме. Пожалуйста, обновите страницу.',
|
||||
'not_match' => 'Объект, который вы пытаетесь открыть, не принадлежит редактируемой теме. Пожалуйста, обновите страницу.'
|
||||
],
|
||||
'settings_menu' => 'Фронтенд темы',
|
||||
'settings_menu_description' => 'Управление темой интерфейса',
|
||||
|
|
@ -55,7 +55,7 @@ return [
|
|||
'theme_title' => 'Темы',
|
||||
'activate_button' => 'Активировать',
|
||||
'active_button' => 'Активировано',
|
||||
'customize_theme' => 'Настройка темы',
|
||||
'customize_theme' => 'Настройка Темы',
|
||||
'customize_button' => 'Настроить',
|
||||
'duplicate_button' => 'Дублировать',
|
||||
'duplicate_title' => 'Дублировать тему',
|
||||
|
|
@ -83,7 +83,7 @@ return [
|
|||
'delete_theme_success' => 'Удаление темы успешно завершено!',
|
||||
'create_title' => 'Создать тему',
|
||||
'create_button' => 'Создать',
|
||||
'create_new_blank_theme' => 'Создать новую пустую тему',
|
||||
'create_new_blank_theme' => 'Создать новый бланк темы',
|
||||
'create_theme_success' => 'Создание темы успешно завершено!',
|
||||
'create_theme_required_name' => 'Пожалуйста, укажите имя для темы.',
|
||||
'new_directory_name_label' => 'Директория темы',
|
||||
|
|
@ -92,24 +92,24 @@ return [
|
|||
'dir_name_taken' => 'Указанный каталог уже существует.',
|
||||
'find_more_themes' => 'Найти еще темы',
|
||||
'saving' => 'Сохранение темы...',
|
||||
'return' => 'Вернуться к списку тем',
|
||||
'return' => 'Вернуться к списку тем'
|
||||
],
|
||||
'maintenance' => [
|
||||
'settings_menu' => 'Режим обслуживания',
|
||||
'settings_menu_description' => 'Управление режимом работы сайта.',
|
||||
'is_enabled' => 'Включить режим обслуживания',
|
||||
'is_enabled_comment' => 'При активации этого режима посетители сайта увидят страницу выбранную ниже.',
|
||||
'hint' => 'Режим обслуживания покажет страницу обслуживания для посетителей, которые не вошли в бэкенд.',
|
||||
'hint' => 'Режим обслуживания покажет страницу обслуживания для посетителей, которые не авторизовались в CMS.'
|
||||
],
|
||||
'page' => [
|
||||
'not_found_name' => "Страница ':name' не найдена",
|
||||
'not_found' => [
|
||||
'label' => 'Страница не найдена',
|
||||
'help' => 'Запрошенная страница не найдена.',
|
||||
'help' => 'Запрошенная страница не найдена.'
|
||||
],
|
||||
'custom_error' => [
|
||||
'label' => 'Ошибка на странице',
|
||||
'help' => 'К сожалению, страница не может быть отображена из-за ошибки.',
|
||||
'help' => 'К сожалению, страница не может быть отображена из-за ошибки.'
|
||||
],
|
||||
'menu_label' => 'Страницы',
|
||||
'unsaved_label' => 'Несохранённая(е) страница(ы)',
|
||||
|
|
@ -122,46 +122,46 @@ return [
|
|||
'cms_page' => 'CMS страница',
|
||||
'title' => 'Заголовок страницы',
|
||||
'url' => 'Страница URL',
|
||||
'file_name' => 'Имя файла страницы',
|
||||
'file_name' => 'Имя файла страницы'
|
||||
],
|
||||
'layout' => [
|
||||
'not_found_name' => "Не удалось найти макет с именем :name.",
|
||||
'menu_label' => 'Макеты',
|
||||
'unsaved_label' => 'Несохранённый(е) макет(ы)',
|
||||
'no_list_records' => 'Макет не найдено',
|
||||
'new' => 'Новый макет',
|
||||
'delete_confirm_multiple' => 'Удалить выделенные макеты?',
|
||||
'delete_confirm_single' => 'Удалить этот макет?',
|
||||
'not_found_name' => "Не удалось найти шаблон (layout) с именем :name.",
|
||||
'menu_label' => 'Шаблоны',
|
||||
'unsaved_label' => 'Несоsхранённый(е) макет(ы)',
|
||||
'no_list_records' => 'Шаблоны не найдены',
|
||||
'new' => 'Новый шаблон',
|
||||
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные шаблоны?',
|
||||
'delete_confirm_single' => 'Вы действительно хотите удалить этот шаблон?'
|
||||
],
|
||||
'partial' => [
|
||||
'not_found_name' => "Не удалось найти фрагмент с именем :name.",
|
||||
'invalid_name' => 'Ошибка в имени фрагмента :name.',
|
||||
'not_found_name' => "Не удалось найти шаблон (partial) с именем :name.",
|
||||
'invalid_name' => 'Ошибка в имени шаблона (partial) :name.',
|
||||
'menu_label' => 'Фрагменты',
|
||||
'unsaved_label' => 'Несохранённый(е) фрагмент(ы)',
|
||||
'no_list_records' => 'Фрагменты не найдены',
|
||||
'delete_confirm_multiple' => 'Удалить выделенные фрагменты?',
|
||||
'delete_confirm_single' => 'Удалить этот фрагмент?',
|
||||
'new' => 'Новый фрагмент',
|
||||
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные фрагменты?',
|
||||
'delete_confirm_single' => 'Вы действительно хотите удалить этот фрагмент?',
|
||||
'new' => 'Новый фрагмент'
|
||||
],
|
||||
'content' => [
|
||||
'not_found_name' => "Не удалось найти контент-файл: ':name'.",
|
||||
'menu_label' => 'Контент',
|
||||
'unsaved_label' => 'Несохранённый контент',
|
||||
'no_list_records' => 'Контент-файлы не найдены',
|
||||
'not_found_name' => "Не удалось найти файл содержимого (content file): ':name'.",
|
||||
'menu_label' => 'Содержимое',
|
||||
'unsaved_label' => 'Несохранённое содержимое',
|
||||
'no_list_records' => 'Файлы с содержимым не найдены',
|
||||
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные файлы?',
|
||||
'delete_confirm_single' => 'Вы действительно хотите удалить этот файл?',
|
||||
'new' => 'Новый контент-файл',
|
||||
'new' => 'Новый файл содержимого'
|
||||
],
|
||||
'ajax_handler' => [
|
||||
'invalid_name' => 'Ошибка в имени обработчика AJAX: :name.',
|
||||
'not_found' => "Обработчик AJAX не найден: ':name'.",
|
||||
'not_found' => "Обработчик AJAX не найден: ':name'."
|
||||
],
|
||||
'cms' => [
|
||||
'menu_label' => 'CMS',
|
||||
'menu_label' => 'CMS'
|
||||
],
|
||||
'sidebar' => [
|
||||
'add' => 'Добавить',
|
||||
'search' => 'Поиск...',
|
||||
'search' => 'Поиск...'
|
||||
],
|
||||
'editor' => [
|
||||
'settings' => 'Настройки',
|
||||
|
|
@ -182,21 +182,13 @@ return [
|
|||
'hidden_comment' => 'Скрытые страницы доступны только для вошедших в систему пользователей.',
|
||||
'enter_fullscreen' => 'Войти в полноэкранный режим',
|
||||
'exit_fullscreen' => 'Выйти из полноэкранного режима',
|
||||
'open_searchbox' => 'Открыть окно поиска',
|
||||
'open_searchbox' => 'Открыть поле поиска',
|
||||
'close_searchbox' => 'Закрыть окно поиска',
|
||||
'open_replacebox' => 'Открыть поле "Заменить"',
|
||||
'close_replacebox' => 'Закрыть поле "Заменить"',
|
||||
'commit' => 'Зафиксировать',
|
||||
'reset' => 'Сброс',
|
||||
'commit_confirm' => 'Вы уверены, что хотите сохранить изменения этого файла в файловой системе? Это перезапишет существующий в файловой системе файл',
|
||||
'reset_confirm' => 'Вы уверены, что хотите сбросить этот файл до копии, которая находится в файловой системе? Это полностью заменит его файлом, который находится в файловой системе.',
|
||||
'committing' => 'Зафиксировать',
|
||||
'resetting' => 'Сбросить',
|
||||
'commit_success' => ':type был зафиксирован в файловой системе',
|
||||
'reset_success' => ':type был сброшен до версии из файловой системы',
|
||||
'close_replacebox' => 'Закрыть Заменить коробку'
|
||||
],
|
||||
'asset' => [
|
||||
'menu_label' => 'Ассеты',
|
||||
'menu_label' => 'Ресурсы',
|
||||
'unsaved_label' => 'Несохранённый(е) файл(ы)',
|
||||
'drop_down_add_title' => 'Добавить...',
|
||||
'drop_down_operation_title' => 'Действие...',
|
||||
|
|
@ -237,7 +229,7 @@ return [
|
|||
'error_deleting_directory' => 'Не удалось удалить директорию :dir',
|
||||
'no_list_records' => 'Файлы не найдены',
|
||||
'delete_confirm' => 'Удалить выбранные файлы или каталоги?',
|
||||
'path' => 'Путь',
|
||||
'path' => 'Путь'
|
||||
],
|
||||
'component' => [
|
||||
'menu_label' => 'Компоненты',
|
||||
|
|
@ -249,10 +241,7 @@ return [
|
|||
'invalid_request' => 'Шаблон не может быть сохранен, так как запрос содержит поврежденную информацию о компонентах.',
|
||||
'no_records' => 'Компоненты не найдены',
|
||||
'not_found' => "Компонент ':name' не найден.",
|
||||
'no_default_partial' => "Этот компонент не имеет 'default' фрагмента (partial)",
|
||||
'method_not_found' => "Компонент ':name' не содержит метод ':method'.",
|
||||
'soft_component' => 'Мягкий компонент',
|
||||
'soft_component_description' => 'Этот компонент отсутствует, но он не является обязательным.',
|
||||
'method_not_found' => "Компонент ':name' не содержит метод ':method'."
|
||||
],
|
||||
'template' => [
|
||||
'invalid_type' => 'Неизвестный тип шаблона.',
|
||||
|
|
@ -260,17 +249,17 @@ return [
|
|||
'saved' => 'Шаблон был успешно сохранен.',
|
||||
'no_list_records' => 'Записи не найдены',
|
||||
'delete_confirm' => 'Удалить выбранные шаблоны?',
|
||||
'order_by' => 'Сортировать по',
|
||||
'order_by' => 'Сортировать по'
|
||||
],
|
||||
'permissions' => [
|
||||
'name' => 'CMS',
|
||||
'manage_content' => 'Управление контент-файлами сайта',
|
||||
'manage_assets' => 'Управление ассетами сайта - изображениями, JavaScript и CSS файлами',
|
||||
'manage_pages' => 'Создание, редактирование и удаление страниц сайта',
|
||||
'manage_layouts' => 'Создание, редактирование и удаление CMS макетами',
|
||||
'manage_partials' => 'Создание, редактирование и удаление CMS фрагментами',
|
||||
'manage_themes' => 'Активация, деактивация и конфигурация CMS тем',
|
||||
'manage_theme_options' => 'Настройка параметров для активной темы',
|
||||
'name' => 'Управление CMS',
|
||||
'manage_content' => 'Управление контентом',
|
||||
'manage_assets' => 'Управление файлами',
|
||||
'manage_pages' => 'Управление страницами',
|
||||
'manage_layouts' => 'Управление шаблонами',
|
||||
'manage_partials' => 'Управление фрагментами',
|
||||
'manage_themes' => 'Управление темами',
|
||||
'manage_theme_options' => 'Настроить текущую тему CMS',
|
||||
],
|
||||
'theme_log' => [
|
||||
'hint' => 'В этом журнале отображаются изменения, внесенные в тему администраторами во внутренней области CMS.',
|
||||
|
|
@ -299,6 +288,6 @@ return [
|
|||
'preview_title' => 'Изменение шаблона',
|
||||
'template_updated' => 'Шаблон обновлен',
|
||||
'template_created' => 'Шаблон был создан',
|
||||
'template_deleted' => 'Шаблон был удален',
|
||||
],
|
||||
'template_deleted' => 'Шаблон был удален'
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -46,8 +46,8 @@ return [
|
|||
'dir_name_create_label' => '目標主題目錄',
|
||||
'theme_label' => '主題',
|
||||
'theme_title' => '主題',
|
||||
'activate_button' => '啟用',
|
||||
'active_button' => '啟用',
|
||||
'activate_button' => '激活',
|
||||
'active_button' => '激活',
|
||||
'customize_theme' => '自訂主題',
|
||||
'customize_button' => '自訂',
|
||||
'duplicate_button' => '複製',
|
||||
|
|
@ -110,10 +110,7 @@ return [
|
|||
'invalid_url' => '不合法的URL格式. URL可以正斜槓開頭, 包含數字, 拉丁字母和下面的字元: ._-[]:?|/+*^$',
|
||||
'delete_confirm_multiple' => '真的想要刪除選擇的頁面嗎?',
|
||||
'delete_confirm_single' => '真的想要刪除這個頁面嗎?',
|
||||
'no_layout' => '-- 沒有佈局 --',
|
||||
'title' => '頁面標題',
|
||||
'url' => '頁面網址',
|
||||
'file_name' => '頁面檔案名稱',
|
||||
'no_layout' => '-- 沒有佈局 --'
|
||||
],
|
||||
'layout' => [
|
||||
'not_found_name' => "佈局 ':name' 找不到",
|
||||
|
|
@ -171,8 +168,8 @@ return [
|
|||
'content' => '內容',
|
||||
'hidden' => '隱藏',
|
||||
'hidden_comment' => '隱藏頁面只能被登錄的後台使用者訪問.',
|
||||
'enter_fullscreen' => '進入全螢幕模式',
|
||||
'exit_fullscreen' => '退出全螢幕模式',
|
||||
'enter_fullscreen' => '進入全屏模式',
|
||||
'exit_fullscreen' => '退出全屏模式'
|
||||
],
|
||||
'asset' => [
|
||||
'menu_label' => '資源',
|
||||
|
|
@ -184,12 +181,12 @@ return [
|
|||
'create_directory' => '新建目錄',
|
||||
'directory_popup_title' => '新目錄',
|
||||
'directory_name' => '目錄名',
|
||||
'rename' => '重新命名',
|
||||
'rename' => '重命名',
|
||||
'delete' => '刪除',
|
||||
'move' => '移動',
|
||||
'select' => '選擇',
|
||||
'new' => '新檔案',
|
||||
'rename_popup_title' => '重新命名',
|
||||
'rename_popup_title' => '重命名',
|
||||
'rename_new_name' => '新名稱',
|
||||
'invalid_path' => '路徑名稱只能包含數字, 拉丁字母和以下字元: _-/',
|
||||
'error_deleting_file' => '刪除檔案 :name 錯誤.',
|
||||
|
|
@ -198,7 +195,7 @@ return [
|
|||
'invalid_name' => '名稱只能包含數字, 拉丁字母, 空格和以下字元: _-',
|
||||
'original_not_found' => '原始檔案或目錄找不到',
|
||||
'already_exists' => '檔案或目錄已存在',
|
||||
'error_renaming' => '重新命名檔案或目錄錯誤',
|
||||
'error_renaming' => '重命名檔案或目錄錯誤',
|
||||
'name_cant_be_empty' => '名稱不能為空',
|
||||
'too_large' => '上傳的檔案太大. 最大檔案大小是 :max_size',
|
||||
'type_not_allowed' => '只有下面的檔案類型是允許的: :allowed_types',
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ App::before(function ($request) {
|
|||
* The CMS module intercepts all URLs that were not
|
||||
* handled by the back-end modules.
|
||||
*/
|
||||
Route::any('{slug?}', 'Cms\Classes\CmsController@run')->where('slug', '(.*)?')->middleware('web');
|
||||
Route::any('{slug}', 'Cms\Classes\CmsController@run')->where('slug', '(.*)?')->middleware('web');
|
||||
|
||||
/**
|
||||
* @event cms.route
|
||||
|
|
|
|||
|
|
@ -190,8 +190,7 @@ trait UrlMaker
|
|||
'mtime' => @File::lastModified($filePath)
|
||||
];
|
||||
|
||||
$expiresAt = now()->addMinutes(Config::get('cms.parsedPageCacheTTL', 1440));
|
||||
Cache::put($key, serialize($cached), $expiresAt);
|
||||
Cache::put($key, serialize($cached), Config::get('cms.parsedPageCacheTTL', 1440));
|
||||
|
||||
return static::$urlPageName = $baseFileName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ use Cms\Classes\Controller;
|
|||
use Cms\Classes\ComponentBase;
|
||||
use Illuminate\Pagination\Paginator;
|
||||
use Illuminate\Support\Collection;
|
||||
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
|
||||
use Illuminate\Support\Debug\HtmlDumper;
|
||||
use Symfony\Component\VarDumper\Cloner\VarCloner;
|
||||
use October\Rain\Database\Model;
|
||||
|
||||
|
|
|
|||
|
|
@ -97,14 +97,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a default samesite config value for invalid values
|
||||
*/
|
||||
if (!in_array(strtolower(Config::get('session.same_site')), ['lax', 'strict', 'none'])) {
|
||||
Config::set('session.same_site', 'Lax');
|
||||
}
|
||||
|
||||
Paginator::useBootstrapThree();
|
||||
Paginator::defaultSimpleView('system::pagination.simple-default');
|
||||
|
||||
/*
|
||||
|
|
@ -143,7 +135,7 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
protected function registerPrivilegedActions()
|
||||
{
|
||||
$requests = ['/combine/', '@/system/updates', '@/system/install', '@/backend/auth'];
|
||||
$commands = ['october:up', 'october:update', 'october:env', 'october:version'];
|
||||
$commands = ['october:up', 'october:update'];
|
||||
|
||||
/*
|
||||
* Requests
|
||||
|
|
@ -258,8 +250,6 @@ class ServiceProvider extends ModuleServiceProvider
|
|||
$this->registerConsoleCommand('october.env', 'System\Console\OctoberEnv');
|
||||
$this->registerConsoleCommand('october.install', 'System\Console\OctoberInstall');
|
||||
$this->registerConsoleCommand('october.passwd', 'System\Console\OctoberPasswd');
|
||||
$this->registerConsoleCommand('october.version', 'System\Console\OctoberVersion');
|
||||
$this->registerConsoleCommand('october.manifest', 'System\Console\OctoberManifest');
|
||||
|
||||
$this->registerConsoleCommand('plugin.install', 'System\Console\PluginInstall');
|
||||
$this->registerConsoleCommand('plugin.remove', 'System\Console\PluginRemove');
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ return [
|
|||
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
|
||||
'Event' => Illuminate\Support\Facades\Event::class,
|
||||
'Hash' => Illuminate\Support\Facades\Hash::class,
|
||||
'Input' => Illuminate\Support\Facades\Input::class,
|
||||
'Lang' => Illuminate\Support\Facades\Lang::class,
|
||||
'Log' => Illuminate\Support\Facades\Log::class,
|
||||
'Mail' => Illuminate\Support\Facades\Mail::class,
|
||||
|
|
@ -29,6 +30,7 @@ return [
|
|||
'Storage' => Illuminate\Support\Facades\Storage::class,
|
||||
'Url' => Illuminate\Support\Facades\URL::class, // Preferred
|
||||
'URL' => Illuminate\Support\Facades\URL::class,
|
||||
'Validator' => Illuminate\Support\Facades\Validator::class,
|
||||
'View' => Illuminate\Support\Facades\View::class,
|
||||
|
||||
/*
|
||||
|
|
@ -40,7 +42,6 @@ return [
|
|||
'Config' => October\Rain\Support\Facades\Config::class,
|
||||
'Seeder' => October\Rain\Database\Updates\Seeder::class,
|
||||
'Flash' => October\Rain\Support\Facades\Flash::class,
|
||||
'Input' => October\Rain\Support\Facades\Input::class,
|
||||
'Form' => October\Rain\Support\Facades\Form::class,
|
||||
'Html' => October\Rain\Support\Facades\Html::class,
|
||||
'Http' => October\Rain\Support\Facades\Http::class,
|
||||
|
|
@ -51,7 +52,6 @@ return [
|
|||
'Twig' => October\Rain\Support\Facades\Twig::class,
|
||||
'DbDongle' => October\Rain\Support\Facades\DbDongle::class,
|
||||
'Schema' => October\Rain\Support\Facades\Schema::class,
|
||||
'Validator' => October\Rain\Support\Facades\Validator::class,
|
||||
'Cms' => Cms\Facades\Cms::class,
|
||||
'Backend' => Backend\Facades\Backend::class,
|
||||
'BackendMenu' => Backend\Facades\BackendMenu::class,
|
||||
|
|
@ -60,12 +60,4 @@ return [
|
|||
'SystemException' => October\Rain\Exception\SystemException::class,
|
||||
'ApplicationException' => October\Rain\Exception\ApplicationException::class,
|
||||
'ValidationException' => October\Rain\Exception\ValidationException::class,
|
||||
|
||||
/*
|
||||
* Fallback aliases
|
||||
*/
|
||||
// Input facade was removed in Laravel 6 - we are keeping it in the Rain library for backwards compatibility.
|
||||
'Illuminate\Support\Facades\Input' => October\Rain\Support\Facades\Input::class,
|
||||
// Illuminate's HtmlDumper was "dumped" in Laravel 6 - we'll route this to Symfony's HtmlDumper as Laravel have done.
|
||||
'Illuminate\Support\Debug\HtmlDumper' => Symfony\Component\VarDumper\Dumper\HtmlDumper::class,
|
||||
];
|
||||
|
|
|
|||
|
|
@ -69,8 +69,7 @@ var fieldElement=$form.find('[name="'+fieldName+'"], [name="'+fieldName+'[]"], [
|
|||
if(fieldElement.length>0){var _event=jQuery.Event('ajaxInvalidField')
|
||||
$(window).trigger(_event,[fieldElement.get(0),fieldName,fieldMessages,isFirstInvalidField])
|
||||
if(isFirstInvalidField){if(!_event.isDefaultPrevented())fieldElement.focus()
|
||||
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)
|
||||
$el.trigger('ajaxDone')},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
||||
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
||||
if($.type(selector)=='string'&&selector.charAt(0)=='@'){$(selector.substring(1)).append(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||
else if($.type(selector)=='string'&&selector.charAt(0)=='^'){$(selector.substring(1)).prepend(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||
else{$(selector).trigger('ajaxBeforeReplace')
|
||||
|
|
|
|||
|
|
@ -69,8 +69,7 @@ var fieldElement=$form.find('[name="'+fieldName+'"], [name="'+fieldName+'[]"], [
|
|||
if(fieldElement.length>0){var _event=jQuery.Event('ajaxInvalidField')
|
||||
$(window).trigger(_event,[fieldElement.get(0),fieldName,fieldMessages,isFirstInvalidField])
|
||||
if(isFirstInvalidField){if(!_event.isDefaultPrevented())fieldElement.focus()
|
||||
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)
|
||||
$el.trigger('ajaxDone')},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
||||
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
||||
if($.type(selector)=='string'&&selector.charAt(0)=='@'){$(selector.substring(1)).append(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||
else if($.type(selector)=='string'&&selector.charAt(0)=='^'){$(selector.substring(1)).prepend(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||
else{$(selector).trigger('ajaxBeforeReplace')
|
||||
|
|
|
|||
|
|
@ -288,11 +288,6 @@ if (window.jQuery.request !== undefined) {
|
|||
*/
|
||||
handleRedirectResponse: function(url) {
|
||||
window.location.assign(url)
|
||||
// Indicate that the AJAX request is finished if we're still on the current page
|
||||
// so that the loading indicator for redirects that cause a browser to download
|
||||
// a file instead of leave the page will properly stop.
|
||||
// @see https://github.com/octobercms/october/issues/5055
|
||||
$el.trigger('ajaxDone')
|
||||
},
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ if ($.oc === undefined) $.oc = {}
|
|||
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
|
||||
$.oc.langMessages['zh-tw'] = $.extend(
|
||||
$.oc.langMessages['zh-tw'] || {},
|
||||
{"markdowneditor":{"formatting":"\u683c\u5f0f","quote":"\u5f15\u8a00","code":"\u7a0b\u5f0f\u78bc","header1":"\u6a19\u984c\u4e00","header2":"\u6a19\u984c\u4e8c","header3":"\u6a19\u984c\u4e09","header4":"\u6a19\u984c\u56db","header5":"\u6a19\u984c\u4e94","header6":"\u6a19\u984c\u516d","bold":"\u7c97\u9ad4","italic":"\u659c\u9ad4","unorderedlist":"\u9805\u76ee\u6e05\u55ae","orderedlist":"\u6578\u5b57\u6e05\u55ae","video":"\u5f71\u7247","image":"\u5716\u7247","link":"\u9023\u7d50","horizontalrule":"\u63d2\u5165\u6c34\u5e73\u7dda","fullscreen":"\u5168\u87a2\u5e55","preview":"\u9810\u89bd"},"mediamanager":{"insert_link":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u9023\u7d50","insert_image":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u5716\u7247","insert_video":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u5f71\u7247","insert_audio":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u97f3\u8a0a","invalid_file_empty_insert":"\u8acb\u9078\u64c7\u6a94\u6848\u4ee5\u63d2\u5165\u9023\u7d50\u3002","invalid_file_single_insert":"\u8acb\u9078\u64c7\u4e00\u500b\u6a94\u6848\u3002","invalid_image_empty_insert":"\u8acb\u9078\u64c7\u63d2\u5165\u7684\u5716\u7247\u3002","invalid_video_empty_insert":"\u8acb\u9078\u64c7\u63d2\u5165\u7684\u5f71\u7247\u3002","invalid_audio_empty_insert":"\u8acb\u9078\u64c7\u63d2\u5165\u7684\u97f3\u8a0a\u3002"},"alert":{"confirm_button_text":"\u78ba\u8a8d","cancel_button_text":"\u53d6\u6d88","widget_remove_confirm":"\u78ba\u5b9a\u79fb\u9664\u6b64\u5143\u4ef6\uff1f"},"datepicker":{"previousMonth":"\u4e0a\u500b\u6708","nextMonth":"\u4e0b\u500b\u6708","months":["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],"weekdays":["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],"weekdaysShort":["\u9031\u65e5","\u9031\u4e00","\u9031\u4e8c","\u9031\u4e09","\u9031\u56db","\u9031\u4e94","\u9031\u516d"]},"colorpicker":{"choose":"\u78ba\u5b9a"},"filter":{"group":{"all":"\u5168\u90e8"},"scopes":{"apply_button_text":"\u78ba\u5b9a","clear_button_text":"\u6e05\u9664"},"dates":{"all":"\u5168\u90e8","filter_button_text":"\u7be9\u9078","reset_button_text":"\u91cd\u7f6e","date_placeholder":"\u65e5\u671f","after_placeholder":"\u5728\u6b64\u4e4b\u5f8c","before_placeholder":"\u5728\u6b64\u4e4b\u524d"},"numbers":{"all":"\u5168\u90e8","filter_button_text":"\u7be9\u9078","reset_button_text":"\u91cd\u7f6e","min_placeholder":"\u6700\u5c0f\u503c","max_placeholder":"\u6700\u5927\u503c"}},"eventlog":{"show_stacktrace":"Show the stacktrace","hide_stacktrace":"Hide the stacktrace","tabs":{"formatted":"Formatted","raw":"Raw"},"editor":{"title":"Source code editor","description":"Your operating system should be configured to listen to one of these URL schemes.","openWith":"Open with","remember_choice":"Remember selected option for this session","open":"Open","cancel":"Cancel"}}}
|
||||
{"markdowneditor":{"formatting":"Formatting","quote":"Quote","code":"Code","header1":"Header 1","header2":"Header 2","header3":"Header 3","header4":"Header 4","header5":"Header 5","header6":"Header 6","bold":"Bold","italic":"Italic","unorderedlist":"Unordered List","orderedlist":"Ordered List","video":"Video","image":"Image","link":"Link","horizontalrule":"Insert Horizontal Rule","fullscreen":"Full screen","preview":"Preview"},"mediamanager":{"insert_link":"Insert Media Link","insert_image":"Insert Media Image","insert_video":"Insert Media Video","insert_audio":"Insert Media Audio","invalid_file_empty_insert":"Please select file to insert a links to.","invalid_file_single_insert":"Please select a single file.","invalid_image_empty_insert":"Please select image(s) to insert.","invalid_video_empty_insert":"Please select a video file to insert.","invalid_audio_empty_insert":"Please select an audio file to insert."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Cancel","widget_remove_confirm":"Remove this widget?"},"datepicker":{"previousMonth":"Previous Month","nextMonth":"Next Month","months":["January","February","March","April","May","June","July","August","September","October","November","December"],"weekdays":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"weekdaysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},"colorpicker":{"choose":"Ok"},"filter":{"group":{"all":"all"},"scopes":{"apply_button_text":"Apply","clear_button_text":"Clear"},"dates":{"all":"all","filter_button_text":"Filter","reset_button_text":"Reset","date_placeholder":"Date","after_placeholder":"After","before_placeholder":"Before"},"numbers":{"all":"all","filter_button_text":"Filter","reset_button_text":"Reset","min_placeholder":"Min","max_placeholder":"Max"}},"eventlog":{"show_stacktrace":"Show the stacktrace","hide_stacktrace":"Hide the stacktrace","tabs":{"formatted":"Formatted","raw":"Raw"},"editor":{"title":"Source code editor","description":"Your operating system should be configured to listen to one of these URL schemes.","openWith":"Open with","remember_choice":"Remember selected option for this session","open":"Open","cancel":"Cancel"}}}
|
||||
);
|
||||
|
||||
//! moment.js locale configuration v2.22.2
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@
|
|||
this.updateClasses()
|
||||
|
||||
if (location.hash && this.$tabsContainer.is('[data-linkable]')) {
|
||||
$('li > a[href="' + location.hash + '"]', this.$tabsContainer).tab('show')
|
||||
$('li > a[href=' + location.hash + ']', this.$tabsContainer).tab('show')
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4597,7 +4597,7 @@ if(tabUrl){window.history.replaceState({},'Tab link reference',tabUrl)}})
|
|||
if(this.options.slidable){this.$pagesContainer.touchwipe({wipeRight:function(){self.prev();},wipeLeft:function(){self.next();},preventDefaultEvents:false,min_move_x:60});}
|
||||
this.$tabsContainer.toolbar({scrollClassContainer:this.$el})
|
||||
this.updateClasses()
|
||||
if(location.hash&&this.$tabsContainer.is('[data-linkable]')){$('li > a[href="'+location.hash+'"]',this.$tabsContainer).tab('show')}}
|
||||
if(location.hash&&this.$tabsContainer.is('[data-linkable]')){$('li > a[href='+location.hash+']',this.$tabsContainer).tab('show')}}
|
||||
Tab.prototype.initTab=function(li){var
|
||||
$tabs=$('>li',this.$tabsContainer),tabIndex=$tabs.index(li),time=new Date().getTime(),targetId=this.tabId+'-tab-'+tabIndex+time,$anchor=$('a',li)
|
||||
$anchor.data('target','#'+targetId).attr('data-target','#'+targetId).attr('data-toggle','tab')
|
||||
|
|
|
|||
|
|
@ -10,11 +10,11 @@ use Route;
|
|||
use Config;
|
||||
use Request;
|
||||
use Response;
|
||||
use October\Rain\Assetic\Asset\FileAsset;
|
||||
use October\Rain\Assetic\Asset\AssetCache;
|
||||
use October\Rain\Assetic\Asset\AssetCollection;
|
||||
use October\Rain\Assetic\Cache\FilesystemCache;
|
||||
use October\Rain\Assetic\Factory\AssetFactory;
|
||||
use Assetic\Asset\FileAsset;
|
||||
use Assetic\Asset\AssetCache;
|
||||
use Assetic\Asset\AssetCollection;
|
||||
use Assetic\Factory\AssetFactory;
|
||||
use October\Rain\Parse\Assetic\FilesystemCache;
|
||||
use System\Helpers\Cache as CacheHelper;
|
||||
use ApplicationException;
|
||||
use DateTime;
|
||||
|
|
@ -126,22 +126,22 @@ class CombineAssets
|
|||
/*
|
||||
* Register JavaScript filters
|
||||
*/
|
||||
$this->registerFilter('js', new \October\Rain\Assetic\Filter\JavascriptImporter);
|
||||
$this->registerFilter('js', new \October\Rain\Parse\Assetic\JavascriptImporter);
|
||||
|
||||
/*
|
||||
* Register CSS filters
|
||||
*/
|
||||
$this->registerFilter('css', new \October\Rain\Assetic\Filter\CssImportFilter);
|
||||
$this->registerFilter(['css', 'less', 'scss'], new \October\Rain\Assetic\Filter\CssRewriteFilter);
|
||||
$this->registerFilter('less', new \October\Rain\Assetic\Filter\LessCompiler);
|
||||
$this->registerFilter('scss', new \October\Rain\Assetic\Filter\ScssCompiler);
|
||||
$this->registerFilter('css', new \Assetic\Filter\CssImportFilter);
|
||||
$this->registerFilter(['css', 'less', 'scss'], new \Assetic\Filter\CssRewriteFilter);
|
||||
$this->registerFilter('less', new \October\Rain\Parse\Assetic\LessCompiler);
|
||||
$this->registerFilter('scss', new \October\Rain\Parse\Assetic\ScssCompiler);
|
||||
|
||||
/*
|
||||
* Minification filters
|
||||
*/
|
||||
if ($this->useMinify) {
|
||||
$this->registerFilter('js', new \October\Rain\Assetic\Filter\JSMinFilter);
|
||||
$this->registerFilter(['css', 'less', 'scss'], new \October\Rain\Assetic\Filter\StylesheetMinify);
|
||||
$this->registerFilter('js', new \Assetic\Filter\JSMinFilter);
|
||||
$this->registerFilter(['css', 'less', 'scss'], new \October\Rain\Parse\Assetic\StylesheetMinify);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?php namespace System\Classes;
|
||||
|
||||
use Log;
|
||||
use View;
|
||||
use Config;
|
||||
use Cms\Classes\Theme;
|
||||
|
|
@ -7,7 +8,6 @@ use Cms\Classes\Router;
|
|||
use Cms\Classes\Controller as CmsController;
|
||||
use October\Rain\Exception\ErrorHandler as ErrorHandlerBase;
|
||||
use October\Rain\Exception\SystemException;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
/**
|
||||
* System Error Handler, this class handles application exception events.
|
||||
|
|
@ -34,6 +34,18 @@ class ErrorHandler extends ErrorHandlerBase
|
|||
// return parent::handleException($proposedException);
|
||||
// }
|
||||
|
||||
/**
|
||||
* We are about to display an error page to the user,
|
||||
* if it is an SystemException, this event should be logged.
|
||||
* @return void
|
||||
*/
|
||||
public function beforeHandleError($exception)
|
||||
{
|
||||
if ($exception instanceof SystemException) {
|
||||
Log::error($exception);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks up an error page using the CMS route "/error". If the route does not
|
||||
* exist, this function will use the error view found in the Cms module.
|
||||
|
|
@ -62,7 +74,7 @@ class ErrorHandler extends ErrorHandlerBase
|
|||
}
|
||||
|
||||
// Extract content from response object
|
||||
if ($result instanceof Response) {
|
||||
if ($result instanceof \Symfony\Component\HttpFoundation\Response) {
|
||||
$result = $result->getContent();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -134,11 +134,10 @@ class MediaLibrary
|
|||
$folderContents = $this->scanFolderContents($fullFolderPath);
|
||||
|
||||
$cached[$fullFolderPath] = $folderContents;
|
||||
$expiresAt = now()->addMinutes(Config::get('cms.storage.media.ttl', 10));
|
||||
Cache::put(
|
||||
$this->cacheKey,
|
||||
base64_encode(serialize($cached)),
|
||||
$expiresAt
|
||||
Config::get('cms.storage.media.ttl', 10)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -536,7 +535,7 @@ class MediaLibrary
|
|||
*/
|
||||
public function getPathUrl($path)
|
||||
{
|
||||
$path = $this->validatePath($path, true);
|
||||
$path = $this->validatePath($path);
|
||||
|
||||
$fullPath = $this->storagePath . implode("/", array_map("rawurlencode", explode("/", $path)));
|
||||
|
||||
|
|
|
|||
|
|
@ -120,29 +120,6 @@ class PluginBase extends ServiceProviderBase
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers back-end quick actions for this plugin.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function registerQuickActions()
|
||||
{
|
||||
$configuration = $this->getConfigurationFromYaml();
|
||||
if (array_key_exists('quickActions', $configuration)) {
|
||||
$quickActions = $configuration['quickActions'];
|
||||
|
||||
if (is_array($quickActions)) {
|
||||
array_walk_recursive($quickActions, function (&$item, $key) {
|
||||
if ($key === 'url') {
|
||||
$item = Backend::url($item);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return $quickActions;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers any back-end permissions used by this plugin.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -238,6 +238,18 @@ class PluginManager
|
|||
ComposerManager::instance()->autoload($pluginPath . '/vendor');
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable plugin registration for restricted pages, unless elevated
|
||||
*/
|
||||
if (self::$noInit && !$plugin->elevated) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the plugin's register() method
|
||||
*/
|
||||
$plugin->register();
|
||||
|
||||
/*
|
||||
* Register configuration path
|
||||
*/
|
||||
|
|
@ -254,18 +266,6 @@ class PluginManager
|
|||
View::addNamespace($pluginNamespace, $viewsPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable plugin registration for restricted pages, unless elevated
|
||||
*/
|
||||
if (self::$noInit && !$plugin->elevated) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the plugin's register() method
|
||||
*/
|
||||
$plugin->register();
|
||||
|
||||
/*
|
||||
* Add init, if available
|
||||
*/
|
||||
|
|
@ -346,24 +346,15 @@ class PluginManager
|
|||
|
||||
/**
|
||||
* Returns an array with all enabled plugins
|
||||
* The index is the plugin namespace, the value is the plugin information object.
|
||||
*
|
||||
* @return array [$code => $pluginObj]
|
||||
* @return array
|
||||
*/
|
||||
public function getPlugins()
|
||||
{
|
||||
return array_diff_key($this->plugins, $this->disabledPlugins);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array will all plugins detected on the filesystem
|
||||
*
|
||||
* @return array [$code => $pluginObj]
|
||||
*/
|
||||
public function getAllPlugins()
|
||||
{
|
||||
return $this->plugins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a plugin registration class based on its namespace (Author\Plugin).
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,12 +1,10 @@
|
|||
<?php namespace System\Classes;
|
||||
|
||||
use Lang;
|
||||
use Config;
|
||||
use Response;
|
||||
use Exception;
|
||||
use SystemException;
|
||||
use ApplicationException;
|
||||
use Illuminate\Routing\Controller as ControllerBase;
|
||||
use Exception;
|
||||
use Response;
|
||||
|
||||
/**
|
||||
* The is the master controller for system related routing.
|
||||
|
|
@ -14,7 +12,7 @@ use Illuminate\Routing\Controller as ControllerBase;
|
|||
*
|
||||
* @see System\Classes\CombineAssets Asset combiner class
|
||||
* @package october\system
|
||||
* @author Alexey Bobkov, Samuel Georges, Luke Towers
|
||||
* @author Alexey Bobkov, Samuel Georges
|
||||
*/
|
||||
class SystemController extends ControllerBase
|
||||
{
|
||||
|
|
@ -37,49 +35,9 @@ class SystemController extends ControllerBase
|
|||
$combiner = CombineAssets::instance();
|
||||
|
||||
return $combiner->getContents($cacheId);
|
||||
} catch (Exception $ex) {
|
||||
}
|
||||
catch (Exception $ex) {
|
||||
return Response::make('/* '.e($ex->getMessage()).' */', 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes an image using the provided configuration
|
||||
* and returns a redirect to the resized image
|
||||
*
|
||||
* @param string $identifier The identifier used to retrieve the image configuration
|
||||
* @param string $encodedUrl The double-encoded URL of the resized image, see https://github.com/octobercms/october/issues/3592#issuecomment-671017380
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function resizer(string $identifier, string $encodedUrl)
|
||||
{
|
||||
$resizedUrl = ImageResizer::getValidResizedUrl($identifier, $encodedUrl);
|
||||
if (empty($resizedUrl)) {
|
||||
return response('Invalid identifier or redirect URL', 400);
|
||||
}
|
||||
|
||||
// Attempt to process the resize
|
||||
try {
|
||||
$resizer = ImageResizer::fromIdentifier($identifier);
|
||||
$resizer->resize();
|
||||
} catch (SystemException $ex) {
|
||||
// If the resizing failed with a SystemException, it was most
|
||||
// likely because it is in progress or has already finished
|
||||
// although it could also be because the cache system used to store
|
||||
// configuration data is broken
|
||||
if (Config::get('cache.default', 'file') === 'array') {
|
||||
throw new Exception('Image resizing requires a persistent cache driver, "array" is not supported. Try changing config/cache.php -> default to a persistent cache driver.');
|
||||
}
|
||||
} catch (Exception $ex) {
|
||||
// If it failed for any other reason, restore the config so that
|
||||
// the resizer route will continue to work until it succeeds
|
||||
if ($resizer) {
|
||||
$resizer->storeConfig();
|
||||
}
|
||||
|
||||
// Rethrow the exception
|
||||
throw $ex;
|
||||
}
|
||||
|
||||
return redirect()->to($resizedUrl);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,11 @@ class UpdateManager
|
|||
{
|
||||
use \October\Rain\Support\Traits\Singleton;
|
||||
|
||||
/**
|
||||
* @var array The notes for the current operation.
|
||||
*/
|
||||
protected $notes = [];
|
||||
|
||||
/**
|
||||
* @var \Illuminate\Console\OutputStyle
|
||||
*/
|
||||
|
|
@ -89,11 +94,6 @@ class UpdateManager
|
|||
*/
|
||||
protected $repository;
|
||||
|
||||
/**
|
||||
* @var array An array of messages returned by migrations / seeders. Returned at the end of the update process.
|
||||
*/
|
||||
protected $messages = [];
|
||||
|
||||
/**
|
||||
* Initialize this singleton.
|
||||
*/
|
||||
|
|
@ -167,9 +167,6 @@ class UpdateManager
|
|||
}
|
||||
}
|
||||
|
||||
// Print messages returned by migrations / seeders
|
||||
$this->printMessages();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
@ -348,13 +345,13 @@ class UpdateManager
|
|||
/*
|
||||
* Rollback modules
|
||||
*/
|
||||
if (isset($this->notesOutput)) {
|
||||
$this->migrator->setOutput($this->notesOutput);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
$rolledBack = $this->migrator->rollback($paths, ['pretend' => false]);
|
||||
|
||||
foreach ($this->migrator->getNotes() as $note) {
|
||||
$this->note($note);
|
||||
}
|
||||
|
||||
if (count($rolledBack) == 0) {
|
||||
break;
|
||||
}
|
||||
|
|
@ -366,41 +363,23 @@ class UpdateManager
|
|||
}
|
||||
|
||||
/**
|
||||
* Determines build number from source manifest.
|
||||
*
|
||||
* This will return an array with the following information:
|
||||
* - `build`: The build number we determined was most likely the build installed.
|
||||
* - `modified`: Whether we detected any modifications between the installed build and the manifest.
|
||||
* - `confident`: Whether we are at least 60% sure that this is the installed build. More modifications to
|
||||
* to the code = less confidence.
|
||||
* - `changes`: If $detailed is true, this will include the list of files modified, created and deleted.
|
||||
*
|
||||
* @param bool $detailed If true, the list of files modified, added and deleted will be included in the result.
|
||||
* @return array
|
||||
*/
|
||||
public function getBuildNumberManually($detailed = false)
|
||||
{
|
||||
$source = new SourceManifest();
|
||||
$manifest = new FileManifest(null, null, true);
|
||||
|
||||
// Find build by comparing with source manifest
|
||||
return $source->compare($manifest, $detailed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the build number in the database.
|
||||
*
|
||||
* @param bool $detailed If true, the list of files modified, added and deleted will be included in the result.
|
||||
* Asks the gateway for the lastest build number and stores it.
|
||||
* @return void
|
||||
*/
|
||||
public function setBuildNumberManually($detailed = false)
|
||||
public function setBuildNumberManually()
|
||||
{
|
||||
$build = $this->getBuildNumberManually($detailed);
|
||||
$postData = [];
|
||||
|
||||
if ($build['confident']) {
|
||||
$this->setBuild($build['build'], null, $build['modified']);
|
||||
if (Config::get('cms.edgeUpdates', false)) {
|
||||
$postData['edge'] = 1;
|
||||
}
|
||||
|
||||
$result = $this->requestServerData('ping', $postData);
|
||||
|
||||
$build = (int) array_get($result, 'pong', 420);
|
||||
|
||||
$this->setBuild($build);
|
||||
|
||||
return $build;
|
||||
}
|
||||
|
||||
|
|
@ -424,13 +403,13 @@ class UpdateManager
|
|||
*/
|
||||
public function migrateModule($module)
|
||||
{
|
||||
if (isset($this->notesOutput)) {
|
||||
$this->migrator->setOutput($this->notesOutput);
|
||||
}
|
||||
$this->migrator->run(base_path() . '/modules/' . strtolower($module) . '/database/migrations');
|
||||
|
||||
$this->note($module);
|
||||
|
||||
$this->migrator->run(base_path() . '/modules/'.strtolower($module).'/database/migrations');
|
||||
foreach ($this->migrator->getNotes() as $note) {
|
||||
$this->note(' - ' . $note);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
|
@ -448,11 +427,7 @@ class UpdateManager
|
|||
}
|
||||
|
||||
$seeder = App::make($className);
|
||||
$return = $seeder->run();
|
||||
|
||||
if (isset($return) && (is_string($return) || is_array($return))) {
|
||||
$this->addMessage($className, $return);
|
||||
}
|
||||
$seeder->run();
|
||||
|
||||
$this->note(sprintf('<info>Seeded %s</info> ', $module));
|
||||
return $this;
|
||||
|
|
@ -487,14 +462,12 @@ class UpdateManager
|
|||
* Sets the build number and hash
|
||||
* @param string $hash
|
||||
* @param string $build
|
||||
* @param bool $modified
|
||||
* @return void
|
||||
*/
|
||||
public function setBuild($build, $hash = null, $modified = false)
|
||||
public function setBuild($build, $hash = null)
|
||||
{
|
||||
$params = [
|
||||
'system::core.build' => $build,
|
||||
'system::core.modified' => $modified,
|
||||
'system::core.build' => $build
|
||||
];
|
||||
|
||||
if ($hash) {
|
||||
|
|
@ -545,9 +518,13 @@ class UpdateManager
|
|||
|
||||
$this->note($name);
|
||||
|
||||
$this->versionManager->setNotesOutput($this->notesOutput);
|
||||
$this->versionManager->resetNotes()->setNotesOutput($this->notesOutput);
|
||||
|
||||
$this->versionManager->updatePlugin($plugin);
|
||||
if ($this->versionManager->updatePlugin($plugin) !== false) {
|
||||
foreach ($this->versionManager->getNotes() as $note) {
|
||||
$this->note($note);
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
|
@ -736,8 +713,7 @@ class UpdateManager
|
|||
}
|
||||
|
||||
$data = $this->requestServerData($type . '/popular');
|
||||
$expiresAt = now()->addMinutes(60);
|
||||
Cache::put($cacheKey, base64_encode(serialize($data)), $expiresAt);
|
||||
Cache::put($cacheKey, base64_encode(serialize($data)), 60);
|
||||
|
||||
foreach ($data as $product) {
|
||||
$code = array_get($product, 'code', -1);
|
||||
|
|
@ -826,11 +802,35 @@ class UpdateManager
|
|||
{
|
||||
if ($this->notesOutput !== null) {
|
||||
$this->notesOutput->writeln($message);
|
||||
} else {
|
||||
$this->notes[] = $message;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the notes for the last operation.
|
||||
* @return array
|
||||
*/
|
||||
public function getNotes()
|
||||
{
|
||||
return $this->notes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the notes store.
|
||||
* @return self
|
||||
*/
|
||||
public function resetNotes()
|
||||
{
|
||||
$this->notesOutput = null;
|
||||
|
||||
$this->notes = [];
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an output stream for writing notes.
|
||||
* @param Illuminate\Console\Command $output
|
||||
|
|
@ -1015,50 +1015,4 @@ class UpdateManager
|
|||
{
|
||||
return Config::get('database.migrations', 'migrations');
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a message from a specific migration or seeder.
|
||||
*
|
||||
* @param string|object $class
|
||||
* @param string|array $message
|
||||
* @return void
|
||||
*/
|
||||
protected function addMessage($class, $message)
|
||||
{
|
||||
if (is_object($class)) {
|
||||
$class = get_class($class);
|
||||
}
|
||||
if (!isset($this->messages[$class])) {
|
||||
$this->messages[$class] = [];
|
||||
}
|
||||
|
||||
if (is_string($message)) {
|
||||
$this->messages[$class][] = $message;
|
||||
} else if (is_array($message)) {
|
||||
array_merge($this->messages[$class], $message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints collated messages from the migrations and seeders
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function printMessages()
|
||||
{
|
||||
if (!count($this->messages)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add a line break
|
||||
$this->note('');
|
||||
|
||||
foreach ($this->messages as $class => $messages) {
|
||||
$this->note(sprintf('<info>%s reported:</info>', $class));
|
||||
|
||||
foreach ($messages as $message) {
|
||||
$this->note(' - ' . (string) $message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,12 @@ class VersionManager
|
|||
const HISTORY_TYPE_COMMENT = 'comment';
|
||||
const HISTORY_TYPE_SCRIPT = 'script';
|
||||
|
||||
/**
|
||||
* The notes for the current operation.
|
||||
* @var array
|
||||
*/
|
||||
protected $notes = [];
|
||||
|
||||
/**
|
||||
* @var \Illuminate\Console\OutputStyle
|
||||
*/
|
||||
|
|
@ -83,7 +89,7 @@ class VersionManager
|
|||
|
||||
// No updates needed
|
||||
if ($currentVersion == $databaseVersion) {
|
||||
$this->note(' - <info>Nothing to update.</info>');
|
||||
$this->note('- <info>Nothing to update.</info>');
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -140,7 +146,7 @@ class VersionManager
|
|||
foreach ($comments as $comment) {
|
||||
$this->applyDatabaseComment($code, $version, $comment);
|
||||
|
||||
$this->note(sprintf(' - <info>v%s: </info> %s', $version, $comment));
|
||||
$this->note(sprintf('- <info>v%s: </info> %s', $version, $comment));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -420,7 +426,6 @@ class VersionManager
|
|||
* Execute the database PHP script
|
||||
*/
|
||||
$updateFile = $this->pluginManager->getPluginPath($code) . '/updates/' . $script;
|
||||
|
||||
$this->updater->packDown($updateFile);
|
||||
|
||||
Db::table('system_plugin_history')
|
||||
|
|
@ -503,11 +508,35 @@ class VersionManager
|
|||
{
|
||||
if ($this->notesOutput !== null) {
|
||||
$this->notesOutput->writeln($message);
|
||||
} else {
|
||||
$this->notes[] = $message;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the notes for the last operation.
|
||||
* @return array
|
||||
*/
|
||||
public function getNotes()
|
||||
{
|
||||
return $this->notes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the notes store.
|
||||
* @return self
|
||||
*/
|
||||
public function resetNotes()
|
||||
{
|
||||
$this->notesOutput = null;
|
||||
|
||||
$this->notes = [];
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an output stream for writing notes.
|
||||
* @param Illuminate\Console\Command $output
|
||||
|
|
@ -521,7 +550,8 @@ class VersionManager
|
|||
}
|
||||
|
||||
/**
|
||||
* Extract script and comments from version details
|
||||
* @param $details
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function extractScriptsAndComments($details): array
|
||||
|
|
@ -536,8 +566,7 @@ class VersionManager
|
|||
$scripts = array_values(array_filter($details, function ($detail) use ($fileNamePattern) {
|
||||
return preg_match($fileNamePattern, $detail);
|
||||
}));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$comments = (array)$details;
|
||||
$scripts = [];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,13 +8,11 @@
|
|||
"authors": [
|
||||
{
|
||||
"name": "Alexey Bobkov",
|
||||
"email": "aleksey.bobkov@gmail.com",
|
||||
"role": "Co-founder"
|
||||
"email": "aleksey.bobkov@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Samuel Georges",
|
||||
"email": "daftspunky@gmail.com",
|
||||
"role": "Co-founder"
|
||||
"email": "daftspunky@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Luke Towers",
|
||||
|
|
@ -24,10 +22,9 @@
|
|||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.2",
|
||||
"php": ">=7.0",
|
||||
"composer/installers": "~1.0",
|
||||
"october/rain": "~1.1.0",
|
||||
"laravel/framework": "~6.0"
|
||||
"october/rain": "~1.0.469"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
<?php namespace System\Console;
|
||||
|
||||
use App;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
/**
|
||||
|
|
@ -328,7 +327,7 @@ class OctoberEnv extends Command
|
|||
*/
|
||||
protected function writeToConfigFile($content)
|
||||
{
|
||||
file_put_contents(rtrim(App::make('path.config'), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $this->config . '.php', $content);
|
||||
file_put_contents(config_path($this->config . '.php'), $content);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -336,7 +335,7 @@ class OctoberEnv extends Command
|
|||
*/
|
||||
protected function lines()
|
||||
{
|
||||
return file(rtrim(App::make('path.config'), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $this->config . '.php');
|
||||
return file(config_path($this->config . '.php'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -370,7 +369,7 @@ class OctoberEnv extends Command
|
|||
'SESSION_DRIVER' => 'driver',
|
||||
],
|
||||
'queue' => [
|
||||
'QUEUE_CONNECTION' => 'default',
|
||||
'QUEUE_DRIVER' => 'default',
|
||||
],
|
||||
'mail' => [
|
||||
'MAIL_DRIVER' => 'driver',
|
||||
|
|
|
|||
|
|
@ -36,29 +36,16 @@ class OctoberFresh extends Command
|
|||
return;
|
||||
}
|
||||
|
||||
$themeRemoved = false;
|
||||
$pluginRemoved = false;
|
||||
|
||||
$demoThemePath = themes_path().'/demo';
|
||||
|
||||
if (File::exists($demoThemePath)) {
|
||||
File::deleteDirectory($demoThemePath);
|
||||
$themeRemoved = true;
|
||||
}
|
||||
|
||||
$demoPluginPath = plugins_path().'/october/demo';
|
||||
if (File::exists($demoPluginPath)) {
|
||||
Artisan::call('plugin:remove', ['name' => 'October.Demo', '--force' => true]);
|
||||
$pluginRemoved = true;
|
||||
}
|
||||
File::deleteDirectory($demoThemePath);
|
||||
|
||||
if ($themeRemoved && $pluginRemoved) {
|
||||
$this->info('Demo theme and plugin have been removed! Enjoy a fresh start.');
|
||||
} elseif ($themeRemoved) {
|
||||
$this->info('Demo theme has been removed! Enjoy a fresh start.');
|
||||
} elseif ($pluginRemoved) {
|
||||
$this->info('Demo plugin has been removed! Enjoy a fresh start.');
|
||||
} else {
|
||||
$this->info('Demo theme and plugin have already been removed.');
|
||||
$this->info('Demo has been removed! Enjoy a fresh start.');
|
||||
}
|
||||
else {
|
||||
$this->error('Demo theme is already removed.');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@ class OctoberMirror extends Command
|
|||
protected $directories = [
|
||||
'storage/app/uploads/public',
|
||||
'storage/app/media',
|
||||
'storage/app/resized',
|
||||
'storage/temp/public',
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ use Symfony\Component\Console\Input\InputOption;
|
|||
*/
|
||||
class OctoberUpdate extends Command
|
||||
{
|
||||
|
||||
/**
|
||||
* The console command name.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?php namespace System\Console;
|
||||
|
||||
use App;
|
||||
use Lang;
|
||||
use File;
|
||||
use Config;
|
||||
|
|
@ -8,8 +9,8 @@ use Symfony\Component\Console\Input\InputOption;
|
|||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use System\Classes\UpdateManager;
|
||||
use System\Classes\CombineAssets;
|
||||
use Exception;
|
||||
use System\Models\Parameter;
|
||||
use System\Models\File as FileModel;
|
||||
|
||||
/**
|
||||
* Console command for other utility commands.
|
||||
|
|
@ -26,6 +27,7 @@ use System\Models\File as FileModel;
|
|||
* - compile less: Compile registered LESS files only.
|
||||
* - compile scss: Compile registered SCSS files only.
|
||||
* - compile lang: Compile registered Language files only.
|
||||
* - set build: Pull the latest stable build number from the update gateway and set it as the current build number.
|
||||
* - set project --projectId=<id>: Set the projectId for this october instance.
|
||||
*
|
||||
* @package october\system
|
||||
|
|
@ -108,10 +110,31 @@ class OctoberUtil extends Command
|
|||
|
||||
protected function utilSetBuild()
|
||||
{
|
||||
$this->comment('NOTE: This command is now deprecated. Please use "php artisan october:version" instead.');
|
||||
$this->comment('');
|
||||
$this->comment('-');
|
||||
|
||||
return $this->call('october:version');
|
||||
/*
|
||||
* Skip setting the build number if no database is detected to set it within
|
||||
*/
|
||||
if (!App::hasDatabase()) {
|
||||
$this->comment('No database detected - skipping setting the build number.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$build = UpdateManager::instance()->setBuildNumberManually();
|
||||
$this->comment('*** October sets build: '.$build);
|
||||
}
|
||||
catch (Exception $ex) {
|
||||
$this->comment('*** You were kicked from #october by Ex: ('.$ex->getMessage().')');
|
||||
}
|
||||
|
||||
$this->comment('-');
|
||||
sleep(1);
|
||||
$this->comment('Ping? Pong!');
|
||||
$this->comment('-');
|
||||
sleep(1);
|
||||
$this->comment('Ping? Pong!');
|
||||
$this->comment('-');
|
||||
}
|
||||
|
||||
protected function utilCompileJs()
|
||||
|
|
@ -271,66 +294,7 @@ class OctoberUtil extends Command
|
|||
return;
|
||||
}
|
||||
|
||||
$uploadsDisk = Config::get('cms.storage.uploads.disk', 'local');
|
||||
if ($uploadsDisk !== 'local') {
|
||||
$this->error("Purging uploads is only supported on the 'local' disk, current uploads disk is $uploadsDisk");
|
||||
return;
|
||||
}
|
||||
|
||||
$totalCount = 0;
|
||||
$validFiles = FileModel::pluck('disk_name')->all();
|
||||
$uploadsPath = Config::get('filesystems.disks.local.root', storage_path('app')) . '/' . Config::get('cms.storage.uploads.folder', 'uploads');
|
||||
|
||||
// Recursive function to scan the directory for files and ensure they exist in system_files.
|
||||
$purgeFunc = function ($targetDir) use (&$purgeFunc, &$totalCount, $uploadsPath, $validFiles) {
|
||||
if ($files = File::glob($targetDir.'/*')) {
|
||||
if ($dirs = File::directories($targetDir)) {
|
||||
foreach ($dirs as $dir) {
|
||||
$purgeFunc($dir);
|
||||
|
||||
if (File::isDirectoryEmpty($dir) && is_writeable($dir)) {
|
||||
rmdir($dir);
|
||||
$this->info('Removed folder: '. str_replace($uploadsPath, '', $dir));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($files as $file) {
|
||||
if (!is_file($file)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip .gitignore files
|
||||
if ($file === '.gitignore') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip files unable to be purged
|
||||
if (!is_writeable($file)) {
|
||||
$this->warn('Unable to purge file: ' . str_replace($uploadsPath, '', $file));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip valid files
|
||||
if (in_array(basename($file), $validFiles)) {
|
||||
$this->warn('Skipped file in use: '. str_replace($uploadsPath, '', $file));
|
||||
continue;
|
||||
}
|
||||
|
||||
unlink($file);
|
||||
$this->info('Purged: '. str_replace($uploadsPath, '', $file));
|
||||
$totalCount++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$purgeFunc($uploadsPath);
|
||||
|
||||
if ($totalCount > 0) {
|
||||
$this->comment(sprintf('Successfully deleted %d invalid file(s), leaving %d valid files', $totalCount, count($validFiles)));
|
||||
} else {
|
||||
$this->comment('No files found to purge.');
|
||||
}
|
||||
// @todo
|
||||
}
|
||||
|
||||
protected function utilPurgeOrphans()
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ class ThemeSync extends Command
|
|||
|
||||
foreach ($userPaths as $userPath) {
|
||||
foreach ($themePaths as $themePath) {
|
||||
$pregMatch = '/^' . str_replace('/', '\/', $userPath) . '/i';
|
||||
$pregMatch = '/' . str_replace('/', '\/', $userPath) . '/i';
|
||||
|
||||
if ($userPath === $themePath || preg_match($pregMatch, $themePath)) {
|
||||
$paths[] = $themePath;
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
use Lang;
|
||||
use Flash;
|
||||
use Config;
|
||||
use Request;
|
||||
use Backend;
|
||||
use BackendMenu;
|
||||
use System\Classes\SettingsManager;
|
||||
|
|
@ -141,22 +139,6 @@ class Settings extends Controller
|
|||
return $this->formWidget->render($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the form widget used by this behavior.
|
||||
*
|
||||
* @return \Backend\Widgets\Form
|
||||
*/
|
||||
public function formGetWidget()
|
||||
{
|
||||
if (is_null($this->formWidget)) {
|
||||
$item = $this->findSettingItem();
|
||||
$model = $this->createModel($item);
|
||||
$this->initWidgets($model);
|
||||
}
|
||||
|
||||
return $this->formWidget;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the widgets used by this action
|
||||
* Model $model
|
||||
|
|
@ -187,22 +169,10 @@ class Settings extends Controller
|
|||
}
|
||||
|
||||
/**
|
||||
* Locates a setting item for a module or plugin.
|
||||
*
|
||||
* If none of the parameters are provided, they will be auto-guessed from the URL.
|
||||
*
|
||||
* @param string|null $author
|
||||
* @param string|null $plugin
|
||||
* @param string|null $code
|
||||
*
|
||||
* @return array
|
||||
* Locates a setting item for a module or plugin
|
||||
*/
|
||||
protected function findSettingItem($author = null, $plugin = null, $code = null)
|
||||
protected function findSettingItem($author, $plugin, $code)
|
||||
{
|
||||
if (is_null($author) || is_null($plugin)) {
|
||||
[$author, $plugin, $code] = $this->guessSettingItem();
|
||||
}
|
||||
|
||||
$manager = SettingsManager::instance();
|
||||
|
||||
$moduleOwner = $author;
|
||||
|
|
@ -217,23 +187,4 @@ class Settings extends Controller
|
|||
|
||||
return $item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Guesses the requested setting item from the current URL segments provided by the Request object.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function guessSettingItem()
|
||||
{
|
||||
$segments = Request::segments();
|
||||
|
||||
if (!empty(Config::get('cms.backendUri', 'backend'))) {
|
||||
array_splice($segments, 0, 4);
|
||||
} else {
|
||||
array_splice($segments, 0, 3);
|
||||
}
|
||||
|
||||
// Ensure there's at least 3 segments
|
||||
return array_pad($segments, 3, null);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,6 @@ class Updates extends Controller
|
|||
public function index()
|
||||
{
|
||||
$this->vars['coreBuild'] = Parameter::get('system::core.build');
|
||||
$this->vars['coreBuildModified'] = Parameter::get('system::core.modified', false);
|
||||
$this->vars['projectId'] = Parameter::get('system::project.id');
|
||||
$this->vars['projectName'] = Parameter::get('system::project.name');
|
||||
$this->vars['projectOwner'] = Parameter::get('system::project.owner');
|
||||
|
|
@ -450,15 +449,12 @@ class Updates extends Controller
|
|||
|
||||
/**
|
||||
* Contacts the update server for a list of necessary updates.
|
||||
*
|
||||
* @param bool $force Whether or not to force the redownload of existing tools
|
||||
* @return string The rendered "execute" partial
|
||||
*/
|
||||
public function onForceUpdate($force = true)
|
||||
public function onForceUpdate()
|
||||
{
|
||||
try {
|
||||
$manager = UpdateManager::instance();
|
||||
$result = $manager->requestUpdateList($force);
|
||||
$result = $manager->requestUpdateList(true);
|
||||
|
||||
$coreHash = array_get($result, 'core.hash', false);
|
||||
$coreBuild = array_get($result, 'core.build', false);
|
||||
|
|
@ -709,7 +705,7 @@ class Updates extends Controller
|
|||
'system::project.owner' => $result['owner'],
|
||||
]);
|
||||
|
||||
return $this->onForceUpdate(false);
|
||||
return $this->onForceUpdate();
|
||||
}
|
||||
catch (Exception $ex) {
|
||||
$this->handleError($ex);
|
||||
|
|
@ -881,7 +877,7 @@ class Updates extends Controller
|
|||
}
|
||||
|
||||
Flash::success(Lang::get("system::lang.plugins.{$bulkAction}_success"));
|
||||
return redirect()->refresh();
|
||||
return $this->listRefresh('manage');
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
<button
|
||||
type="submit"
|
||||
data-request="onSave"
|
||||
data-browser-validate
|
||||
data-request-data="redirect:0"
|
||||
data-hotkey="ctrl+s, cmd+s"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||
|
|
@ -20,6 +21,7 @@
|
|||
<button
|
||||
type="button"
|
||||
data-request="onSave"
|
||||
data-browser-validate
|
||||
data-request-data="close:1"
|
||||
data-hotkey="ctrl+enter, cmd+enter"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||
|
|
|
|||
|
|
@ -6,16 +6,16 @@
|
|||
data-handler="onLoadUpdates">
|
||||
<?= e(trans('system::lang.updates.check_label')) ?>
|
||||
</a>
|
||||
<a
|
||||
href="<?= Backend::url('system/updates/install') ?>"
|
||||
class="btn btn-success oc-icon-plus">
|
||||
<?= e(trans('system::lang.plugins.install')) ?>
|
||||
</a>
|
||||
<a
|
||||
href="<?= Backend::url('system/updates/install/themes') ?>"
|
||||
class="btn btn-success oc-icon-plus">
|
||||
<?= e(trans('system::lang.themes.install')) ?>
|
||||
</a>
|
||||
<a
|
||||
href="<?= Backend::url('system/updates/install') ?>"
|
||||
class="btn btn-success oc-icon-plus">
|
||||
<?= e(trans('system::lang.plugins.install')) ?>
|
||||
</a>
|
||||
<a
|
||||
href="<?= Backend::url('system/updates/manage') ?>"
|
||||
class="btn btn-default oc-icon-puzzle-piece">
|
||||
|
|
|
|||
|
|
@ -34,19 +34,7 @@
|
|||
<?php if ($coreBuild): ?>
|
||||
<div class="scoreboard-item title-value">
|
||||
<h4><?= e(trans('system::lang.updates.core_current_build')) ?></h4>
|
||||
<?php if ($coreBuildModified): ?>
|
||||
<p
|
||||
class="oc-icon-exclamation-circle"
|
||||
data-toggle="tooltip"
|
||||
data-placement="bottom"
|
||||
title="This build has been modified"
|
||||
>
|
||||
<?= $coreBuild ?>
|
||||
</p>
|
||||
<?php else: ?>
|
||||
<p><?= $coreBuild ?></p>
|
||||
<?php endif; ?>
|
||||
|
||||
<p class="description">
|
||||
<a
|
||||
href="javascript:;"
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ class DatabaseSeeder extends Seeder
|
|||
*/
|
||||
public function run()
|
||||
{
|
||||
Eloquent::unguarded(function () {
|
||||
Eloquent::unguard();
|
||||
|
||||
$this->call('System\Database\Seeds\SeedSetupMailLayouts');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -441,8 +441,7 @@ return [
|
|||
'manage_other_administrators' => 'Manage other administrators',
|
||||
'impersonate_users' => 'Impersonate users',
|
||||
'manage_preferences' => 'Manage backend preferences',
|
||||
'manage_editor' => 'Manage global code editor preferences',
|
||||
'manage_own_editor' => 'Manage personal code editor preferences',
|
||||
'manage_editor' => 'Manage code editor preferences',
|
||||
'view_the_dashboard' => 'View the dashboard',
|
||||
'manage_default_dashboard' => 'Manage the default dashboard',
|
||||
'manage_branding' => 'Customize the back-end',
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ return [
|
|||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'confirmed' => 'The :attribute confirmation does not match.',
|
||||
'date' => 'The :attribute is not a valid date.',
|
||||
'date_equals' => 'The :attribute must be a date equal to :date.',
|
||||
'date_format' => 'The :attribute does not match the format :format.',
|
||||
'different' => 'The :attribute and :other must be different.',
|
||||
'digits' => 'The :attribute must be :digits digits.',
|
||||
|
|
@ -40,22 +39,9 @@ return [
|
|||
'dimensions' => 'The :attribute has invalid image dimensions.',
|
||||
'distinct' => 'The :attribute field has a duplicate value.',
|
||||
'email' => 'The :attribute must be a valid email address.',
|
||||
'ends_with' => 'The :attribute must end with one of the following: :values.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'file' => 'The :attribute must be a file.',
|
||||
'filled' => 'The :attribute field must have a value.',
|
||||
'gt' => [
|
||||
'numeric' => 'The :attribute must be greater than :value.',
|
||||
'file' => 'The :attribute must be greater than :value kilobytes.',
|
||||
'string' => 'The :attribute must be greater than :value characters.',
|
||||
'array' => 'The :attribute must have more than :value items.',
|
||||
],
|
||||
'gte' => [
|
||||
'numeric' => 'The :attribute must be greater than or equal :value.',
|
||||
'file' => 'The :attribute must be greater than or equal :value kilobytes.',
|
||||
'string' => 'The :attribute must be greater than or equal :value characters.',
|
||||
'array' => 'The :attribute must have :value items or more.',
|
||||
],
|
||||
'image' => 'The :attribute must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'in_array' => 'The :attribute field does not exist in :other.',
|
||||
|
|
@ -64,18 +50,6 @@ return [
|
|||
'ipv4' => 'The :attribute must be a valid IPv4 address.',
|
||||
'ipv6' => 'The :attribute must be a valid IPv6 address.',
|
||||
'json' => 'The :attribute must be a valid JSON string.',
|
||||
'lt' => [
|
||||
'numeric' => 'The :attribute must be less than :value.',
|
||||
'file' => 'The :attribute must be less than :value kilobytes.',
|
||||
'string' => 'The :attribute must be less than :value characters.',
|
||||
'array' => 'The :attribute must have less than :value items.',
|
||||
],
|
||||
'lte' => [
|
||||
'numeric' => 'The :attribute must be less than or equal :value.',
|
||||
'file' => 'The :attribute must be less than or equal :value kilobytes.',
|
||||
'string' => 'The :attribute must be less than or equal :value characters.',
|
||||
'array' => 'The :attribute must not have more than :value items.',
|
||||
],
|
||||
'max' => [
|
||||
'numeric' => 'The :attribute may not be greater than :max.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
|
|
@ -91,7 +65,6 @@ return [
|
|||
'array' => 'The :attribute must have at least :min items.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'not_regex' => 'The :attribute format is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'regex' => 'The :attribute format is invalid.',
|
||||
|
|
@ -109,13 +82,11 @@ return [
|
|||
'string' => 'The :attribute must be :size characters.',
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
],
|
||||
'starts_with' => 'The :attribute must start with one of the following: :values.',
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'timezone' => 'The :attribute must be a valid zone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'url' => 'The :attribute format is invalid.',
|
||||
'uuid' => 'The :attribute must be a valid UUID.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ return [
|
|||
'fullscreen' => 'Pantalla completa',
|
||||
'preview' => 'Previsualizar'
|
||||
],
|
||||
|
||||
'mediamanager' => [
|
||||
'insert_link' => "Insertar Media Vínculo",
|
||||
'insert_image' => "Insertar Media Imagen",
|
||||
|
|
@ -44,10 +45,12 @@ return [
|
|||
'invalid_video_empty_insert' => "Por favor seleccione un archivo de video para insertar.",
|
||||
'invalid_audio_empty_insert' => "Por favor seleccione un archivo de audio para insertar.",
|
||||
],
|
||||
|
||||
'alert' => [
|
||||
'confirm_button_text' => 'OK',
|
||||
'cancel_button_text' => 'Cancelar'
|
||||
],
|
||||
|
||||
'datepicker' => [
|
||||
'previousMonth' => 'Mes Anterior',
|
||||
'nextMonth' => 'Mes Siguiente',
|
||||
|
|
@ -55,31 +58,21 @@ return [
|
|||
'weekdays' => ['Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'],
|
||||
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']
|
||||
],
|
||||
|
||||
'filter' => [
|
||||
'group' => [
|
||||
'all' => 'todos'
|
||||
],
|
||||
'scopes' => [
|
||||
'apply_button_text' => 'Aplicar',
|
||||
'clear_button_text' => 'Limpiar',
|
||||
],
|
||||
'dates' => [
|
||||
'all' => 'todas',
|
||||
'filter_button_text' => 'Filtrar',
|
||||
'all' => 'todos',
|
||||
'filter_button_text' => 'Filtro',
|
||||
'reset_button_text' => 'Restablecer',
|
||||
'date_placeholder' => 'Fecha',
|
||||
'after_placeholder' => 'Desde',
|
||||
'before_placeholder' => 'Hasta'
|
||||
],
|
||||
'numbers' => [
|
||||
'all' => 'todos',
|
||||
'filter_button_text' => 'Filtrar',
|
||||
'reset_button_text' => 'Restablecer',
|
||||
'min_placeholder' => 'Mínimo',
|
||||
'max_placeholder' => 'Máximo',
|
||||
'number_placeholder' => 'Número'
|
||||
],
|
||||
'after_placeholder' => 'Despues',
|
||||
'before_placeholder' => 'Antes'
|
||||
]
|
||||
],
|
||||
|
||||
'eventlog' => [
|
||||
'show_stacktrace' => 'Mostrar el seguimiento de la pila',
|
||||
'hide_stacktrace' => 'Ocultar el seguimiento de la pila',
|
||||
|
|
@ -91,7 +84,7 @@ return [
|
|||
'title' => 'Seleccione el editor de código fuente a usar',
|
||||
'description' => 'Su entorno de sistema operativo debe estar configurado para escuchar a uno de estos esquemas de URL.',
|
||||
'openWith' => 'Abrir con',
|
||||
'rememberChoice' => 'Recuerde la opción seleccionada para esta sesión del navegador',
|
||||
'rememberChoice' => 'Recuerde que la opción seleccionada para esta sesión del navegador',
|
||||
'open' => 'Abrir',
|
||||
'cancel' => 'Cancelar'
|
||||
]
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ return [
|
|||
'alpha_num' => 'Le champ :attribute ne peut contenir que des lettres et des chiffres.',
|
||||
'array' => 'Le champ :attribute doit être un groupe.',
|
||||
'before' => 'Le champ :attribute doit être une date avant le :date.',
|
||||
'before_or_equal' => 'Le champ :attribute doit être une date avant le ou égal à :date.',
|
||||
'before_or_equal' => 'LE champ :attribute doit être une date avant le ou égal à :date.',
|
||||
'between' => [
|
||||
'numeric' => 'Le champ :attribute doit être compris entre :min - :max.',
|
||||
'file' => 'Le champ :attribute doit être compris entre :min - :max kilooctets.',
|
||||
|
|
@ -36,8 +36,8 @@ return [
|
|||
'different' => 'Le champ :attribute et :other doivent être différents.',
|
||||
'digits' => 'Le champ :attribute doit être de :digits chiffres.',
|
||||
'digits_between' => 'Le champ :attribute doit être compris entre :min et :max chiffres.',
|
||||
'dimensions' => 'Le champ :attribute a des dimensions d’image invalides.',
|
||||
'distinct' => 'Le champ :attribute a une valeur en double..',
|
||||
'dimensions' => 'Le cahmp :attribute a des dimensions d’image invalides.',
|
||||
'distinct' => 'Le cahmp :attribute a une valeur en double..',
|
||||
'email' => 'Le format du champ :attribute n’est pas valide.',
|
||||
'exists' => 'Le champ :attribute sélectionné n’est pas valide.',
|
||||
'file' => 'Le champ :attribute doit être un fichier.',
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ return [
|
|||
'fullscreen' => 'Schermo intero',
|
||||
'preview' => 'Anteprima',
|
||||
],
|
||||
|
||||
'mediamanager' => [
|
||||
'insert_link' => "Inserisci collegamento elemento multimediale",
|
||||
'insert_image' => "Inserisci immagine",
|
||||
|
|
@ -44,28 +45,23 @@ return [
|
|||
'invalid_video_empty_insert' => "Si prega di selezionare un file video da inserire.",
|
||||
'invalid_audio_empty_insert' => "Si prega di selezionare un file audio da inserire.",
|
||||
],
|
||||
|
||||
'alert' => [
|
||||
'confirm_button_text' => 'OK',
|
||||
'cancel_button_text' => 'Annulla',
|
||||
'widget_remove_confirm' => 'Rimuovere questo widget?',
|
||||
],
|
||||
|
||||
'datepicker' => [
|
||||
'previousMonth' => 'Mese precedente',
|
||||
'nextMonth' => 'Mese successivo',
|
||||
'months' => ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
|
||||
'weekdays' => ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
|
||||
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
|
||||
],
|
||||
'colorpicker' => [
|
||||
'choose' => 'OK',
|
||||
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab']
|
||||
],
|
||||
|
||||
'filter' => [
|
||||
'group' => [
|
||||
'all' => 'tutti',
|
||||
],
|
||||
'scopes' => [
|
||||
'apply_button_text' => 'Applica',
|
||||
'clear_button_text' => 'Rimuovi',
|
||||
'all' => 'tutti'
|
||||
],
|
||||
'dates' => [
|
||||
'all' => 'tutte',
|
||||
|
|
@ -73,16 +69,10 @@ return [
|
|||
'reset_button_text' => 'Reimposta',
|
||||
'date_placeholder' => 'Data',
|
||||
'after_placeholder' => 'Dopo',
|
||||
'before_placeholder' => 'Prima',
|
||||
],
|
||||
'numbers' => [
|
||||
'all' => 'tutti',
|
||||
'filter_button_text' => 'Filtra',
|
||||
'reset_button_text' => 'Reset',
|
||||
'min_placeholder' => 'Min',
|
||||
'max_placeholder' => 'Max',
|
||||
],
|
||||
'before_placeholder' => 'Prima'
|
||||
]
|
||||
],
|
||||
|
||||
'eventlog' => [
|
||||
'show_stacktrace' => 'Visualizza la traccia dello stack',
|
||||
'hide_stacktrace' => 'Nascondi la traccia dello stack',
|
||||
|
|
@ -96,7 +86,7 @@ return [
|
|||
'openWith' => 'Apri con',
|
||||
'remember_choice' => 'Ricorda l\'opzione selezionata per questa sessione',
|
||||
'open' => 'Apri',
|
||||
'cancel' => 'Annulla',
|
||||
'cancel' => 'Annulla'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ return [
|
|||
"exists" => "Il valore di :attribute non è valido.",
|
||||
"image" => ":attribute deve essere un'immagine.",
|
||||
"in" => "Il valore di :attribute non è valido.",
|
||||
"integer" => ":attribute deve essere un numero intero.",
|
||||
"integer" => ":attribute deve essere un numero interno.",
|
||||
"ip" => ":attribute deve essere un indirizzo IP valido.",
|
||||
"max" => [
|
||||
"numeric" => ":attribute non può essere maggiore di :max.",
|
||||
|
|
|
|||
|
|
@ -331,8 +331,6 @@ return [
|
|||
'core_downloading' => 'Bestanden aan het downloaden',
|
||||
'core_extracting' => 'Bestanden aan het uitpakken',
|
||||
'core_set_build' => 'Bouwnummer bijwerken',
|
||||
'update_warnings_title' => 'Enkele problemen zijn gedetecteerd en vereisen aandacht:',
|
||||
'update_warnings_plugin_missing' => 'De :parent_code plugin vereist dat :code geinstalleerd is, alvorens deze zal werken',
|
||||
'changelog' => 'Logboek van wijzigingen',
|
||||
'changelog_view_details' => 'Bekijk details',
|
||||
'plugins' => 'Plugins',
|
||||
|
|
@ -440,9 +438,8 @@ return [
|
|||
'manage_mail_settings' => 'Beheer e-mailinstellingen',
|
||||
'manage_other_administrators' => 'Beheer mede-beheerders',
|
||||
'impersonate_users' => 'Inloggen als',
|
||||
'manage_preferences' => 'Beheer back-end voorkeuren',
|
||||
'manage_editor' => 'Beheer code editor voorkeuren',
|
||||
'manage_own_editor' => 'Beheer persoonlijk code editor voorkeuren',
|
||||
'manage_preferences' => 'Beheer back-end instellingen',
|
||||
'manage_editor' => 'Beheer code editor instellingen',
|
||||
'view_the_dashboard' => 'Toon dashboard',
|
||||
'manage_default_dashboard' => 'Beheer het standaard dashboard',
|
||||
'manage_branding' => 'Back-end aanpassen',
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ return [
|
|||
'boolean' => ':attribute moet ja of nee zijn.',
|
||||
'confirmed' => ':attribute bevestiging komt niet overeen.',
|
||||
'date' => ':attribute moet een datum bevatten.',
|
||||
'date_equals' => ':attribute moet een datum zijn gelijk aan :date.',
|
||||
'date_format' => ':attribute moet een geldig datum formaat bevatten.',
|
||||
'different' => ':attribute en :other moeten verschillend zijn.',
|
||||
'digits' => ':attribute moet bestaan uit :digits cijfers.',
|
||||
|
|
@ -40,22 +39,9 @@ return [
|
|||
'dimensions' => ':attribute heeft geen geldige afmetingen voor afbeeldingen.',
|
||||
'distinct' => ':attribute heeft een dubbele waarde.',
|
||||
'email' => ':attribute is geen geldig e-mailadres.',
|
||||
'ends_with' => ':attribute moet eindigen op een van de volgende waarden: :values.',
|
||||
'exists' => ':attribute bestaat niet.',
|
||||
'file' => ':attribute moet een bestand zijn.',
|
||||
'filled' => ':attribute is verplicht.',
|
||||
'gt' => [
|
||||
'numeric' => ':attribute moet groter zijn dan :value.',
|
||||
'file' => ':attribute moet groter zijn dan :value kilobyte.',
|
||||
'string' => ':attribute moet langer zijn dan :value karakters.',
|
||||
'array' => ':attribute moet meer dan :value items bevatten.',
|
||||
],
|
||||
'gte' => [
|
||||
'numeric' => ':attribute moet groter of gelijk zijn aan :value.',
|
||||
'file' => ':attribute moet minstens :value kilobyte groot zijn.',
|
||||
'string' => ':attribute moet minstens :value karakters lang zijn.',
|
||||
'array' => ':attribute moet minstens :value items bevatten.',
|
||||
],
|
||||
'image' => ':attribute moet een afbeelding zijn.',
|
||||
'in' => ':attribute is ongeldig.',
|
||||
'in_array' => ':attribute bestaat niet in :other.',
|
||||
|
|
@ -64,18 +50,6 @@ return [
|
|||
'ipv4' => ':attribute moet een geldig IPv4-adres zijn.',
|
||||
'ipv6' => ':attribute moet een geldig IPv6-adres zijn.',
|
||||
'json' => ':attribute moet een geldige JSON-string zijn.',
|
||||
'lt' => [
|
||||
'numeric' => ':attribute moet kleiner zijn dan :value.',
|
||||
'file' => ':attribute moet kleiner zijn dan :value kilobyte.',
|
||||
'string' => ':attribute moet korter zijn dan :value karakters.',
|
||||
'array' => ':attribute moet minder dan :value items bevatten.',
|
||||
],
|
||||
'lte' => [
|
||||
'numeric' => ':attribute moet kleiner of gelijk zijn aan :value.',
|
||||
'file' => ':attribute mag hoogstens :value kilobyte groot zijn.',
|
||||
'string' => ':attribute mag hoogstens :value karakters lang zijn.',
|
||||
'array' => ':attribute mag hoogstens :value items bevatten.',
|
||||
],
|
||||
'max' => [
|
||||
'numeric' => ':attribute mag niet hoger dan :max zijn.',
|
||||
'file' => ':attribute mag niet meer dan :max kilobytes zijn.',
|
||||
|
|
@ -90,8 +64,7 @@ return [
|
|||
'string' => ':attribute moet minimaal :min karakters zijn.',
|
||||
'array' => ':attribute moet minimaal :min items bevatten.',
|
||||
],
|
||||
'not_in' => 'De gekozen waarde van :attribute is ongeldig.',
|
||||
'not_regex' => 'Het formaat van :attribute is ongeldig.',
|
||||
'not_in' => 'Het formaat van :attribute is ongeldig.',
|
||||
'numeric' => ':attribute moet een nummer zijn.',
|
||||
'present' => ':attribute moet bestaan.',
|
||||
'regex' => ':attribute formaat is ongeldig.',
|
||||
|
|
@ -109,13 +82,11 @@ return [
|
|||
'string' => ':attribute moet :size karakters zijn.',
|
||||
'array' => ':attribute moet :size items bevatten.',
|
||||
],
|
||||
'starts_with' => ':attribute moet beginnen met een van de volgende waarden: :values.',
|
||||
'string' => ':attribute moet een tekenreeks zijn.',
|
||||
'timezone' => ':attribute moet een geldige tijdzone zijn.',
|
||||
'unique' => ':attribute is al in gebruik.',
|
||||
'uploaded' => 'Het uploaden van :attribute is mislukt.',
|
||||
'url' => ':attribute is geen geldige URL.',
|
||||
'uuid' => ':attribute moet een geldig UUID zijn.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ return [
|
|||
'link' => 'Ссылка',
|
||||
'horizontalrule' => 'Вставить горизонтальную черту',
|
||||
'fullscreen' => 'Полный экран',
|
||||
'preview' => 'Предпросмотр',
|
||||
'preview' => 'Предпросмотр'
|
||||
],
|
||||
'mediamanager' => [
|
||||
'insert_link' => "Вставить медиа-ссылку",
|
||||
|
|
@ -47,7 +47,7 @@ return [
|
|||
'alert' => [
|
||||
'confirm_button_text' => 'Ок',
|
||||
'cancel_button_text' => 'Отмена',
|
||||
'widget_remove_confirm' => 'Удалить этот виджет?',
|
||||
'widget_remove_confirm' => 'Удалить этот виджет?'
|
||||
],
|
||||
'datepicker' => [
|
||||
'previousMonth' => 'Предыдущий месяц',
|
||||
|
|
@ -61,11 +61,11 @@ return [
|
|||
],
|
||||
'filter' => [
|
||||
'group' => [
|
||||
'all' => 'все',
|
||||
'all' => 'все'
|
||||
],
|
||||
'scopes' => [
|
||||
'apply_button_text' => 'Применить',
|
||||
'clear_button_text' => 'Очистить',
|
||||
'clear_button_text' => 'Очистить'
|
||||
],
|
||||
'dates' => [
|
||||
'all' => 'все',
|
||||
|
|
@ -73,22 +73,22 @@ return [
|
|||
'reset_button_text' => 'Сбросить',
|
||||
'date_placeholder' => 'Дата',
|
||||
'after_placeholder' => 'После',
|
||||
'before_placeholder' => 'До',
|
||||
'before_placeholder' => 'До'
|
||||
],
|
||||
'numbers' => [
|
||||
'all' => 'все',
|
||||
'filter_button_text' => 'Фильтр',
|
||||
'reset_button_text' => 'Сброс',
|
||||
'min_placeholder' => 'Min',
|
||||
'max_placeholder' => 'Max',
|
||||
],
|
||||
'max_placeholder' => 'Max'
|
||||
]
|
||||
],
|
||||
'eventlog' => [
|
||||
'show_stacktrace' => 'Показать трассировку стека',
|
||||
'hide_stacktrace' => 'Скрыть трассировку стека',
|
||||
'tabs' => [
|
||||
'formatted' => 'Форматированный',
|
||||
'raw' => 'Исходный',
|
||||
'raw' => 'Исходный'
|
||||
],
|
||||
'editor' => [
|
||||
'title' => 'Редактор исходного кода',
|
||||
|
|
@ -96,7 +96,7 @@ return [
|
|||
'openWith' => 'Открыть с помощью',
|
||||
'remember_choice' => 'Запомнить выбранный вариант для этой сессии',
|
||||
'open' => 'Открыть',
|
||||
'cancel' => 'Отмена',
|
||||
'cancel' => 'Отмена'
|
||||
],
|
||||
],
|
||||
];
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue