Running Task i18n Textcollector Task GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Localisation, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Clear from all except '{title}', 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Copy '{title}' to other locales, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Unpublish (all locales), 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Unpublish and Archive (all locales), 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Save & Publish (all locales), 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Delete (all locales), 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Hide from '{title}', 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Show in '{title}', 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key All localisations have been cleared for '{title}'., 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Copied '{title}' to all other locales., 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Unpublished '{title}' from all locales., 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Archived '{title}' and all of its localisations., 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Deleted '{title}' and all of its localisations., 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Published '{title}' across all locales., 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Record '{title}' is now visible in {locale}, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Record '{title}' is now hidden in {locale}, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Delete\ArchiveRecordPolicy;
use TractorCow\Fluent\Model\Delete\DeleteFilterPolicy;
use TractorCow\Fluent\Model\Delete\DeleteLocalisationPolicy;
use TractorCow\Fluent\Model\Delete\DeleteRecordPolicy;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Decorates admin areas for localised items with extra actions.
*/
trait FluentAdminTrait
{
/**
* @param Form $form
* @param string $message
* @return HTTPResponse|string|DBHTMLText
*/
abstract public function actionComplete($form, $message);
/**
* Decorate actions with fluent-specific details
*
* @param FieldList $actions
* @param DataObject|Versioned $record
*/
protected function updateFluentActions(
FieldList $actions,
DataObject $record
) {
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
return;
}
// Skip if object isn't localised
if (!$record->hasExtension(FluentExtension::class)) {
return;
}
// Skip if record isn't saved
if (!$record->isInDB()) {
return;
}
// Flush data before checking actions
$record->flushCache(true);
// Skip if record is archived
$results = $record->invokeWithExtensions('isArchived');
$results = array_filter($results, function ($v) {
return !is_null($v);
});
$isArchived = $results ? min($results) : false;
if ($isArchived) {
return;
}
$locale = Locale::getCurrentLocale();
if (!$locale) {
// Potentially no Locales have been created in the system yet.
return;
}
$this->updateSaveAction($actions, $record);
$this->updateDeleteAction($actions, $record);
if (!$record->config()->get('batch_actions_enabled')) {
return;
}
// Build root tabset that makes up the menu
$rootTabSet = TabSet::create('FluentMenu')->setTemplate(
'FluentAdminTabSet'
);
$rootTabSet->addExtraClass(
'ss-ui-action-tabset action-menus fluent-actions-menu noborder'
);
// Add menu button
$moreOptions = Tab::create(
'FluentMenuOptions',
_t(__TRAIT__ . '.Localisation', 'Localisation')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
// Add menu items
$moreOptions->push(
FormAction::create(
'clearFluent',
_t(
__TRAIT__ . '.Label_clearFluent',
"Clear from all except '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'copyFluent',
_t(
__TRAIT__ . '.Label_copyFluent',
"Copy '{title}' to other locales",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-secondary')
);
// Versioned specific items
if ($record->hasExtension(Versioned::class)) {
$moreOptions->push(
FormAction::create(
'unpublishFluent',
_t(
__TRAIT__ . '.Label_unpublishFluent',
'Unpublish (all locales)'
)
)->addExtraClass('btn-secondary')
);
$moreOptions->push(
FormAction::create(
'archiveFluent',
_t(
__TRAIT__ . '.Label_archiveFluent',
'Unpublish and Archive (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
$moreOptions->push(
FormAction::create(
'publishFluent',
_t(
__TRAIT__ . '.Label_publishFluent',
'Save & Publish (all locales)'
)
)->addExtraClass('btn-primary')
);
} else {
$moreOptions->push(
FormAction::create(
'deleteFluent',
_t(
__TRAIT__ . '.Label_deleteFluent',
'Delete (all locales)'
)
)->addExtraClass('btn-outline-danger')
);
}
// Filtered specific actions
/** @var DataObject|FluentFilteredExtension $record */
if ($record->hasExtension(FluentFilteredExtension::class)) {
if ($record->isAvailableInLocale($locale)) {
$moreOptions->push(
FormAction::create(
'hideFluent',
_t(
__TRAIT__ . '.Label_hideFluent',
"Hide from '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-danger')
);
} else {
$moreOptions->push(
FormAction::create(
'showFluent',
_t(
__TRAIT__ . '.Label_showFluent',
"Show in '{title}'",
[
'title' => $locale->getTitle()
]
)
)->addExtraClass('btn-outline-primary')
);
}
}
// Make sure the menu isn't going to get cut off
$actions->insertBefore('RightGroup', $rootTabSet);
}
/**
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function clearFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// loop over all stages
// then loop over all locales, invoke DeleteLocalisationPolicy
$originalLocale = Locale::getCurrentLocale();
// Get the record
/** @var DataObject $record */
$record = $form->getRecord();
$record->flushCache(true);
// Loop over other Locales
$this->inEveryLocale(function (Locale $locale) use (
$record,
$originalLocale
) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
$this->inEveryStage(function () use ($record) {
// after loop, force delete base record with DeleteRecordPolicy
$policy = DeleteLocalisationPolicy::create();
$policy->delete($record);
});
});
$message = _t(
__TRAIT__ . '.ClearAllNotice',
"All localisations have been cleared for '{title}'.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Copy this record to other localisations (not published)
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function copyFluent($data, $form)
{
// Check permissions for adding global actions
if (!Permission::check(Locale::CMS_ACCESS_MULTI_LOCALE)) {
throw new HTTPResponse_Exception('Action not allowed', 403);
}
// Write current record to every other stage
/** @var DataObject|Versioned $record */
$record = $form->getRecord();
$record->flushCache(true);
$originalLocale = Locale::getCurrentLocale();
$this->inEveryLocale(function (Locale $locale) use ($record, $originalLocale) {
// Skip original locale
if ($locale->ID == $originalLocale->ID) {
return;
}
if ($record->hasExtension(Versioned::class)) {
$record->writeToStage(Versioned::DRAFT);
} else {
$record->forceChange();
$record->write();
}
});
$message = _t(
__TRAIT__ . '.CopyNotice',
"Copied '{title}' to all other locales.",
['title' => $record->Title]
);
$record->flushCache(true);
return $this->actionComplete($form, $message);
}
/**
* Unpublishes the current object from all locales
*
* @param array $data
* @param Form $form
* @return mixed
* @throws HTTPResponse_Exception
*/
public function unpublishFluent($data, $form)
{
// Chec..., /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentAdminTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\Model\RecordLocale;
trait FluentBadgeTrait
{
/**
* Add the Fluent state badge before any existing badges and return the result
*
* @param DBField|null $badgeField Existing badge to merge with
* @param DataObject $record
* @return DBField|null
*/
protected function addFluentBadge($badgeField, DataObject $record)
{
$fluentBadge = $this->getBadge($record);
if (!$fluentBadge) {
return $badgeField;
}
// Add fluent badge before any existing badges
$newBadge = DBField::create_field(
'HTMLFragment',
$fluentBadge . $badgeField
);
return $newBadge;
}
/**
* Given a record with Fluent enabled, return a badge that represents the state of it in the current locale
*
* @param DataObject|FluentExtension $record
* @return DBField|null
*/
public function getBadge(DataObject $record)
{
/** @var Locale $currentLocale */
$currentLocale = Locale::getCurrentLocale();
if (!$currentLocale) {
return null;
}
// Must have at least one fluent extension
if (!$record->has_extension(FluentExtension::class) &&
!$record->has_extension(FluentFilteredExtension::class)
) {
return null;
}
$badge = $this->generateBadgeHTML($record, $currentLocale);
return DBField::create_field('HTMLFragment', $badge);
}
/**
* @param DataObject $record
* @param Locale $locale
* @param array $extraProperties
* @return string
*/
protected function generateBadgeHTML(
DataObject $record,
$locale,
$extraProperties = []
) {
$info = RecordLocale::create($record, $locale);
// Build new badge
$badgeClasses = ['badge', 'fluent-badge'];
if ($info->IsDraft()) {
// If the object has been localised in the current locale, show a "localised" state
$badgeClasses[] = 'fluent-badge--default';
$tooltip = _t(
__TRAIT__ . '.BadgeLocalised',
'Localised in {locale}',
[
'locale' => $locale->getTitle()
]
);
} elseif ($info->getSourceLocale()) {
// If object is inheriting content from another locale show the source
$badgeClasses[] = 'fluent-badge--localised';
$tooltip = _t(
__TRAIT__ . '.BadgeInherited',
'Inherited from {locale}',
[
'locale' => $info->getSourceLocale()->getTitle()
]
);
} else {
// Otherwise the object is missing a content source and needs to be remedied
// by either localising or seting up a locale fallback
$badgeClasses[] = 'fluent-badge--invisible';
$tooltip = _t(
__TRAIT__ . '.BaggeInvisible',
'{type} has no available content in {locale}, localise the {type} or provide a locale fallback',
[
'type' => $record->i18n_singular_name(),
'locale' => $locale->getTitle(),
]
);
}
$attributes = array_merge(
[
'class' => implode(' ', $badgeClasses),
'title' => $tooltip
],
$extraProperties
);
return HTML::createTag('span', $attributes, $locale->getBadgeLabel());
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentBadgeTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Localised in {locale}, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\Model\RecordLocale;
trait FluentBadgeTrait
{
/**
* Add the Fluent state badge before any existing badges and return the result
*
* @param DBField|null $badgeField Existing badge to merge with
* @param DataObject $record
* @return DBField|null
*/
protected function addFluentBadge($badgeField, DataObject $record)
{
$fluentBadge = $this->getBadge($record);
if (!$fluentBadge) {
return $badgeField;
}
// Add fluent badge before any existing badges
$newBadge = DBField::create_field(
'HTMLFragment',
$fluentBadge . $badgeField
);
return $newBadge;
}
/**
* Given a record with Fluent enabled, return a badge that represents the state of it in the current locale
*
* @param DataObject|FluentExtension $record
* @return DBField|null
*/
public function getBadge(DataObject $record)
{
/** @var Locale $currentLocale */
$currentLocale = Locale::getCurrentLocale();
if (!$currentLocale) {
return null;
}
// Must have at least one fluent extension
if (!$record->has_extension(FluentExtension::class) &&
!$record->has_extension(FluentFilteredExtension::class)
) {
return null;
}
$badge = $this->generateBadgeHTML($record, $currentLocale);
return DBField::create_field('HTMLFragment', $badge);
}
/**
* @param DataObject $record
* @param Locale $locale
* @param array $extraProperties
* @return string
*/
protected function generateBadgeHTML(
DataObject $record,
$locale,
$extraProperties = []
) {
$info = RecordLocale::create($record, $locale);
// Build new badge
$badgeClasses = ['badge', 'fluent-badge'];
if ($info->IsDraft()) {
// If the object has been localised in the current locale, show a "localised" state
$badgeClasses[] = 'fluent-badge--default';
$tooltip = _t(
__TRAIT__ . '.BadgeLocalised',
'Localised in {locale}',
[
'locale' => $locale->getTitle()
]
);
} elseif ($info->getSourceLocale()) {
// If object is inheriting content from another locale show the source
$badgeClasses[] = 'fluent-badge--localised';
$tooltip = _t(
__TRAIT__ . '.BadgeInherited',
'Inherited from {locale}',
[
'locale' => $info->getSourceLocale()->getTitle()
]
);
} else {
// Otherwise the object is missing a content source and needs to be remedied
// by either localising or seting up a locale fallback
$badgeClasses[] = 'fluent-badge--invisible';
$tooltip = _t(
__TRAIT__ . '.BaggeInvisible',
'{type} has no available content in {locale}, localise the {type} or provide a locale fallback',
[
'type' => $record->i18n_singular_name(),
'locale' => $locale->getTitle(),
]
);
}
$attributes = array_merge(
[
'class' => implode(' ', $badgeClasses),
'title' => $tooltip
],
$extraProperties
);
return HTML::createTag('span', $attributes, $locale->getBadgeLabel());
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentBadgeTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\Model\RecordLocale;
trait FluentBadgeTrait
{
/**
* Add the Fluent state badge before any existing badges and return the result
*
* @param DBField|null $badgeField Existing badge to merge with
* @param DataObject $record
* @return DBField|null
*/
protected function addFluentBadge($badgeField, DataObject $record)
{
$fluentBadge = $this->getBadge($record);
if (!$fluentBadge) {
return $badgeField;
}
// Add fluent badge before any existing badges
$newBadge = DBField::create_field(
'HTMLFragment',
$fluentBadge . $badgeField
);
return $newBadge;
}
/**
* Given a record with Fluent enabled, return a badge that represents the state of it in the current locale
*
* @param DataObject|FluentExtension $record
* @return DBField|null
*/
public function getBadge(DataObject $record)
{
/** @var Locale $currentLocale */
$currentLocale = Locale::getCurrentLocale();
if (!$currentLocale) {
return null;
}
// Must have at least one fluent extension
if (!$record->has_extension(FluentExtension::class) &&
!$record->has_extension(FluentFilteredExtension::class)
) {
return null;
}
$badge = $this->generateBadgeHTML($record, $currentLocale);
return DBField::create_field('HTMLFragment', $badge);
}
/**
* @param DataObject $record
* @param Locale $locale
* @param array $extraProperties
* @return string
*/
protected function generateBadgeHTML(
DataObject $record,
$locale,
$extraProperties = []
) {
$info = RecordLocale::create($record, $locale);
// Build new badge
$badgeClasses = ['badge', 'fluent-badge'];
if ($info->IsDraft()) {
// If the object has been localised in the current locale, show a "localised" state
$badgeClasses[] = 'fluent-badge--default';
$tooltip = _t(
__TRAIT__ . '.BadgeLocalised',
'Localised in {locale}',
[
'locale' => $locale->getTitle()
]
);
} elseif ($info->getSourceLocale()) {
// If object is inheriting content from another locale show the source
$badgeClasses[] = 'fluent-badge--localised';
$tooltip = _t(
__TRAIT__ . '.BadgeInherited',
'Inherited from {locale}',
[
'locale' => $info->getSourceLocale()->getTitle()
]
);
} else {
// Otherwise the object is missing a content source and needs to be remedied
// by either localising or seting up a locale fallback
$badgeClasses[] = 'fluent-badge--invisible';
$tooltip = _t(
__TRAIT__ . '.BaggeInvisible',
'{type} has no available content in {locale}, localise the {type} or provide a locale fallback',
[
'type' => $record->i18n_singular_name(),
'locale' => $locale->getTitle(),
]
);
}
$attributes = array_merge(
[
'class' => implode(' ', $badgeClasses),
'title' => $tooltip
],
$extraProperties
);
return HTML::createTag('span', $attributes, $locale->getBadgeLabel());
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentBadgeTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Inherited from {locale}, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\Model\RecordLocale;
trait FluentBadgeTrait
{
/**
* Add the Fluent state badge before any existing badges and return the result
*
* @param DBField|null $badgeField Existing badge to merge with
* @param DataObject $record
* @return DBField|null
*/
protected function addFluentBadge($badgeField, DataObject $record)
{
$fluentBadge = $this->getBadge($record);
if (!$fluentBadge) {
return $badgeField;
}
// Add fluent badge before any existing badges
$newBadge = DBField::create_field(
'HTMLFragment',
$fluentBadge . $badgeField
);
return $newBadge;
}
/**
* Given a record with Fluent enabled, return a badge that represents the state of it in the current locale
*
* @param DataObject|FluentExtension $record
* @return DBField|null
*/
public function getBadge(DataObject $record)
{
/** @var Locale $currentLocale */
$currentLocale = Locale::getCurrentLocale();
if (!$currentLocale) {
return null;
}
// Must have at least one fluent extension
if (!$record->has_extension(FluentExtension::class) &&
!$record->has_extension(FluentFilteredExtension::class)
) {
return null;
}
$badge = $this->generateBadgeHTML($record, $currentLocale);
return DBField::create_field('HTMLFragment', $badge);
}
/**
* @param DataObject $record
* @param Locale $locale
* @param array $extraProperties
* @return string
*/
protected function generateBadgeHTML(
DataObject $record,
$locale,
$extraProperties = []
) {
$info = RecordLocale::create($record, $locale);
// Build new badge
$badgeClasses = ['badge', 'fluent-badge'];
if ($info->IsDraft()) {
// If the object has been localised in the current locale, show a "localised" state
$badgeClasses[] = 'fluent-badge--default';
$tooltip = _t(
__TRAIT__ . '.BadgeLocalised',
'Localised in {locale}',
[
'locale' => $locale->getTitle()
]
);
} elseif ($info->getSourceLocale()) {
// If object is inheriting content from another locale show the source
$badgeClasses[] = 'fluent-badge--localised';
$tooltip = _t(
__TRAIT__ . '.BadgeInherited',
'Inherited from {locale}',
[
'locale' => $info->getSourceLocale()->getTitle()
]
);
} else {
// Otherwise the object is missing a content source and needs to be remedied
// by either localising or seting up a locale fallback
$badgeClasses[] = 'fluent-badge--invisible';
$tooltip = _t(
__TRAIT__ . '.BaggeInvisible',
'{type} has no available content in {locale}, localise the {type} or provide a locale fallback',
[
'type' => $record->i18n_singular_name(),
'locale' => $locale->getTitle(),
]
);
}
$attributes = array_merge(
[
'class' => implode(' ', $badgeClasses),
'title' => $tooltip
],
$extraProperties
);
return HTML::createTag('span', $attributes, $locale->getBadgeLabel());
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentBadgeTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\Model\RecordLocale;
trait FluentBadgeTrait
{
/**
* Add the Fluent state badge before any existing badges and return the result
*
* @param DBField|null $badgeField Existing badge to merge with
* @param DataObject $record
* @return DBField|null
*/
protected function addFluentBadge($badgeField, DataObject $record)
{
$fluentBadge = $this->getBadge($record);
if (!$fluentBadge) {
return $badgeField;
}
// Add fluent badge before any existing badges
$newBadge = DBField::create_field(
'HTMLFragment',
$fluentBadge . $badgeField
);
return $newBadge;
}
/**
* Given a record with Fluent enabled, return a badge that represents the state of it in the current locale
*
* @param DataObject|FluentExtension $record
* @return DBField|null
*/
public function getBadge(DataObject $record)
{
/** @var Locale $currentLocale */
$currentLocale = Locale::getCurrentLocale();
if (!$currentLocale) {
return null;
}
// Must have at least one fluent extension
if (!$record->has_extension(FluentExtension::class) &&
!$record->has_extension(FluentFilteredExtension::class)
) {
return null;
}
$badge = $this->generateBadgeHTML($record, $currentLocale);
return DBField::create_field('HTMLFragment', $badge);
}
/**
* @param DataObject $record
* @param Locale $locale
* @param array $extraProperties
* @return string
*/
protected function generateBadgeHTML(
DataObject $record,
$locale,
$extraProperties = []
) {
$info = RecordLocale::create($record, $locale);
// Build new badge
$badgeClasses = ['badge', 'fluent-badge'];
if ($info->IsDraft()) {
// If the object has been localised in the current locale, show a "localised" state
$badgeClasses[] = 'fluent-badge--default';
$tooltip = _t(
__TRAIT__ . '.BadgeLocalised',
'Localised in {locale}',
[
'locale' => $locale->getTitle()
]
);
} elseif ($info->getSourceLocale()) {
// If object is inheriting content from another locale show the source
$badgeClasses[] = 'fluent-badge--localised';
$tooltip = _t(
__TRAIT__ . '.BadgeInherited',
'Inherited from {locale}',
[
'locale' => $info->getSourceLocale()->getTitle()
]
);
} else {
// Otherwise the object is missing a content source and needs to be remedied
// by either localising or seting up a locale fallback
$badgeClasses[] = 'fluent-badge--invisible';
$tooltip = _t(
__TRAIT__ . '.BaggeInvisible',
'{type} has no available content in {locale}, localise the {type} or provide a locale fallback',
[
'type' => $record->i18n_singular_name(),
'locale' => $locale->getTitle(),
]
);
}
$attributes = array_merge(
[
'class' => implode(' ', $badgeClasses),
'title' => $tooltip
],
$extraProperties
);
return HTML::createTag('span', $attributes, $locale->getBadgeLabel());
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentBadgeTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key {type} has no available content in {locale}, localise the {type} or provide a locale fallback, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\View\HTML;
use TractorCow\Fluent\Extension\FluentExtension;
use TractorCow\Fluent\Extension\FluentFilteredExtension;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\Model\RecordLocale;
trait FluentBadgeTrait
{
/**
* Add the Fluent state badge before any existing badges and return the result
*
* @param DBField|null $badgeField Existing badge to merge with
* @param DataObject $record
* @return DBField|null
*/
protected function addFluentBadge($badgeField, DataObject $record)
{
$fluentBadge = $this->getBadge($record);
if (!$fluentBadge) {
return $badgeField;
}
// Add fluent badge before any existing badges
$newBadge = DBField::create_field(
'HTMLFragment',
$fluentBadge . $badgeField
);
return $newBadge;
}
/**
* Given a record with Fluent enabled, return a badge that represents the state of it in the current locale
*
* @param DataObject|FluentExtension $record
* @return DBField|null
*/
public function getBadge(DataObject $record)
{
/** @var Locale $currentLocale */
$currentLocale = Locale::getCurrentLocale();
if (!$currentLocale) {
return null;
}
// Must have at least one fluent extension
if (!$record->has_extension(FluentExtension::class) &&
!$record->has_extension(FluentFilteredExtension::class)
) {
return null;
}
$badge = $this->generateBadgeHTML($record, $currentLocale);
return DBField::create_field('HTMLFragment', $badge);
}
/**
* @param DataObject $record
* @param Locale $locale
* @param array $extraProperties
* @return string
*/
protected function generateBadgeHTML(
DataObject $record,
$locale,
$extraProperties = []
) {
$info = RecordLocale::create($record, $locale);
// Build new badge
$badgeClasses = ['badge', 'fluent-badge'];
if ($info->IsDraft()) {
// If the object has been localised in the current locale, show a "localised" state
$badgeClasses[] = 'fluent-badge--default';
$tooltip = _t(
__TRAIT__ . '.BadgeLocalised',
'Localised in {locale}',
[
'locale' => $locale->getTitle()
]
);
} elseif ($info->getSourceLocale()) {
// If object is inheriting content from another locale show the source
$badgeClasses[] = 'fluent-badge--localised';
$tooltip = _t(
__TRAIT__ . '.BadgeInherited',
'Inherited from {locale}',
[
'locale' => $info->getSourceLocale()->getTitle()
]
);
} else {
// Otherwise the object is missing a content source and needs to be remedied
// by either localising or seting up a locale fallback
$badgeClasses[] = 'fluent-badge--invisible';
$tooltip = _t(
__TRAIT__ . '.BaggeInvisible',
'{type} has no available content in {locale}, localise the {type} or provide a locale fallback',
[
'type' => $record->i18n_singular_name(),
'locale' => $locale->getTitle(),
]
);
}
$attributes = array_merge(
[
'class' => implode(' ', $badgeClasses),
'title' => $tooltip
],
$extraProperties
);
return HTML::createTag('span', $attributes, $locale->getBadgeLabel());
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentBadgeTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DataQuery;
use SilverStripe\ORM\Queries\SQLSelect;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Shared functionality between both FluentExtension and FluentFilteredExtension
*
* @property DataObject $owner
*/
trait FluentObjectTrait
{
/**
* Add additional columns to localisation table
*
* @param $summaryColumns
* @see FluentObjectTrait::updateFluentCMSFields()
*/
abstract public function updateLocalisationTabColumns(&$summaryColumns);
/**
* Add additional configs to localisation table
*
* @param GridFieldConfig $config
*/
abstract public function updateLocalisationTabConfig(
GridFieldConfig $config
);
/**
* Gets list of all Locale dataobjects, linked to this record
*
* @return DataList|Locale[]
* @see Locale::getRecordLocale()
*/
public function LinkedLocales()
{
if (!$this->owner->ID) {
return null;
}
return Locale::get()->setDataQueryParam([
'FluentObjectID' => $this->owner->ID,
'FluentObjectClass' => get_class($this->owner)
]);
}
/**
* Amend freshly created DataQuery objects with the current locale and frontend status
*
* @param SQLSelect $query
* @param DataQuery $dataQuery
*/
public function augmentDataQueryCreation(
SQLSelect $query,
DataQuery $dataQuery
) {
$state = FluentState::singleton();
$dataQuery
->setQueryParam('Fluent.Locale', $state->getLocale())
->setQueryParam('Fluent.IsFrontend', $state->getIsFrontend());
}
/**
* Update CMS fields for fluent objects.
* These fields are added in addition to those added by specific extensions
*
* @param FieldList $fields
*/
protected function updateFluentCMSFields(FieldList $fields)
{
if (!$this->owner->ID) {
return;
}
// Avoid adding gridfield twice
if ($fields->dataFieldByName('RecordLocales')) {
return;
}
// Generate gridfield for handling localisations
$config = GridFieldConfig_Base::create();
/** @var GridFieldDataColumns $columns */
$columns = $config->getComponentByType(GridFieldDataColumns::class);
$summaryColumns = [
'Title' => 'Title',
'Locale' => 'Locale'
];
// Let extensions override columns
$this->owner->extend('updateLocalisationTabColumns', $summaryColumns);
$columns->setDisplayFields($summaryColumns);
// Let extensions override components
$this->owner->extend('updateLocalisationTabConfig', $config);
// Add gridfield to tab / fields
$gridField = GridField::create(
'RecordLocales',
'Locales',
$this->LinkedLocales(),
$config
);
if ($fields->hasTabSet()) {
$fields->addFieldToTab('Root.Locales', $gridField);
$fields
->fieldByName('Root.Locales')
->setTitle(_t(__TRAIT__ . '.TAB_LOCALISATION', 'Localisation'));
} else {
$fields->push($gridField);
}
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentObjectTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Localisation, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace TractorCow\Fluent\Extension\Traits;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DataQuery;
use SilverStripe\ORM\Queries\SQLSelect;
use TractorCow\Fluent\Model\Locale;
use TractorCow\Fluent\State\FluentState;
/**
* Shared functionality between both FluentExtension and FluentFilteredExtension
*
* @property DataObject $owner
*/
trait FluentObjectTrait
{
/**
* Add additional columns to localisation table
*
* @param $summaryColumns
* @see FluentObjectTrait::updateFluentCMSFields()
*/
abstract public function updateLocalisationTabColumns(&$summaryColumns);
/**
* Add additional configs to localisation table
*
* @param GridFieldConfig $config
*/
abstract public function updateLocalisationTabConfig(
GridFieldConfig $config
);
/**
* Gets list of all Locale dataobjects, linked to this record
*
* @return DataList|Locale[]
* @see Locale::getRecordLocale()
*/
public function LinkedLocales()
{
if (!$this->owner->ID) {
return null;
}
return Locale::get()->setDataQueryParam([
'FluentObjectID' => $this->owner->ID,
'FluentObjectClass' => get_class($this->owner)
]);
}
/**
* Amend freshly created DataQuery objects with the current locale and frontend status
*
* @param SQLSelect $query
* @param DataQuery $dataQuery
*/
public function augmentDataQueryCreation(
SQLSelect $query,
DataQuery $dataQuery
) {
$state = FluentState::singleton();
$dataQuery
->setQueryParam('Fluent.Locale', $state->getLocale())
->setQueryParam('Fluent.IsFrontend', $state->getIsFrontend());
}
/**
* Update CMS fields for fluent objects.
* These fields are added in addition to those added by specific extensions
*
* @param FieldList $fields
*/
protected function updateFluentCMSFields(FieldList $fields)
{
if (!$this->owner->ID) {
return;
}
// Avoid adding gridfield twice
if ($fields->dataFieldByName('RecordLocales')) {
return;
}
// Generate gridfield for handling localisations
$config = GridFieldConfig_Base::create();
/** @var GridFieldDataColumns $columns */
$columns = $config->getComponentByType(GridFieldDataColumns::class);
$summaryColumns = [
'Title' => 'Title',
'Locale' => 'Locale'
];
// Let extensions override columns
$this->owner->extend('updateLocalisationTabColumns', $summaryColumns);
$columns->setDisplayFields($summaryColumns);
// Let extensions override components
$this->owner->extend('updateLocalisationTabConfig', $config);
// Add gridfield to tab / fields
$gridField = GridField::create(
'RecordLocales',
'Locales',
$this->LinkedLocales(),
$config
);
if ($fields->hasTabSet()) {
$fields->addFieldToTab('Root.Locales', $gridField);
$fields
->fieldByName('Root.Locales')
->setTitle(_t(__TRAIT__ . '.TAB_LOCALISATION', 'Localisation'));
} else {
$fields->push($gridField);
}
}
}
, /app/vendor/tractorcow/silverstripe-fluent/src/Extension/Traits/FluentObjectTrait.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Bigfork\SilverStripeOAuth\Client\Form;
use Bigfork\SilverStripeOAuth\Client\Authenticator\Authenticator;
use Bigfork\SilverStripeOAuth\Client\Helper\Helper;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Config\Config;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Security\LoginForm as SilverStripeLoginForm;
class LoginForm extends SilverStripeLoginForm
{
public function __construct(
$controller,
$authenticatorClass,
$name,
$fields = null,
$actions = null
) {
$this->setController($controller);
$this->setAuthenticatorClass($authenticatorClass);
$this->setFormMethod('POST', true);
parent::__construct($controller, $name, new FieldList(), new FieldList());
$fields = $fields ?: $this->getFormFields();
$actions = $actions ?: $this->getFormActions();
$this->setFields($fields);
$this->setActions($actions);
$this->setTemplate('OAuthLoginForm');
}
public function getFormFields()
{
$request = $this->getRequest();
if ($request->getVar('BackURL')) {
$backURL = $request->getVar('BackURL');
} else {
$backURL = $request->getSession()->get('BackURL');
}
$fields = FieldList::create(
HiddenField::create('AuthenticationMethod', null, $this->getAuthenticatorClass(), $this)
);
if (isset($backURL)) {
$fields->push(HiddenField::create('BackURL', 'BackURL', $backURL));
}
$this->extend('updateFormFields', $fields);
return $fields;
}
public function getFormActions()
{
$actions = FieldList::create();
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
foreach ($providers as $provider => $config) {
$name = isset($config['name']) ? $config['name'] : $provider;
$text = _t(
self::class . '.BUTTON',
'Sign in with {provider}',
['provider' => $name]
);
$action = FormAction::create('authenticate_' . $provider, $text)
->setTemplate("FormAction_OAuth_{$provider}");
$actions->push($action);
}
$this->extend('updateFormActions', $actions);
return $actions;
}
/**
* Handle a submission for a given provider - build redirection
*
* @param string $name
* @return HTTPResponse
*/
public function handleProvider($name)
{
$this->extend('onBeforeHandleProvider', $name);
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
$config = $providers[$name];
$scope = isset($config['scopes']) ? $config['scopes'] : ['email']; // We need at least an email address!
$url = Helper::buildAuthorisationUrl($name, 'login', $scope);
return $this->getController()->redirect($url);
}
/**
* {@inheritdoc}
*/
public function hasMethod($method)
{
if (strpos($method, 'authenticate_') === 0) {
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
$name = substr($method, strlen('authenticate_'));
if (isset($providers[$name])) {
return true;
}
}
return parent::hasMethod($method);
}
/**
* {@inheritdoc}
*/
public function __call($method, $args)
{
if (strpos($method, 'authenticate_') === 0) {
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
$name = substr($method, strlen('authenticate_'));
if (isset($providers[$name])) {
return $this->handleProvider($name);
}
}
return parent::__call($method, $args);
}
/**
* The name of this login form, to display in the frontend
* Replaces Authenticator::get_name()
*
* @return string
*/
public function getAuthenticatorName()
{
return _t(Authenticator::class . '.TITLE', 'Social sign-on');
}
}
, /app/vendor/bigfork/silverstripe-oauth-login/src/Form/LoginForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Social sign-on, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Bigfork\SilverStripeOAuth\Client\Form;
use Bigfork\SilverStripeOAuth\Client\Authenticator\Authenticator;
use Bigfork\SilverStripeOAuth\Client\Helper\Helper;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Config\Config;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Security\LoginForm as SilverStripeLoginForm;
class LoginForm extends SilverStripeLoginForm
{
public function __construct(
$controller,
$authenticatorClass,
$name,
$fields = null,
$actions = null
) {
$this->setController($controller);
$this->setAuthenticatorClass($authenticatorClass);
$this->setFormMethod('POST', true);
parent::__construct($controller, $name, new FieldList(), new FieldList());
$fields = $fields ?: $this->getFormFields();
$actions = $actions ?: $this->getFormActions();
$this->setFields($fields);
$this->setActions($actions);
$this->setTemplate('OAuthLoginForm');
}
public function getFormFields()
{
$request = $this->getRequest();
if ($request->getVar('BackURL')) {
$backURL = $request->getVar('BackURL');
} else {
$backURL = $request->getSession()->get('BackURL');
}
$fields = FieldList::create(
HiddenField::create('AuthenticationMethod', null, $this->getAuthenticatorClass(), $this)
);
if (isset($backURL)) {
$fields->push(HiddenField::create('BackURL', 'BackURL', $backURL));
}
$this->extend('updateFormFields', $fields);
return $fields;
}
public function getFormActions()
{
$actions = FieldList::create();
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
foreach ($providers as $provider => $config) {
$name = isset($config['name']) ? $config['name'] : $provider;
$text = _t(
self::class . '.BUTTON',
'Sign in with {provider}',
['provider' => $name]
);
$action = FormAction::create('authenticate_' . $provider, $text)
->setTemplate("FormAction_OAuth_{$provider}");
$actions->push($action);
}
$this->extend('updateFormActions', $actions);
return $actions;
}
/**
* Handle a submission for a given provider - build redirection
*
* @param string $name
* @return HTTPResponse
*/
public function handleProvider($name)
{
$this->extend('onBeforeHandleProvider', $name);
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
$config = $providers[$name];
$scope = isset($config['scopes']) ? $config['scopes'] : ['email']; // We need at least an email address!
$url = Helper::buildAuthorisationUrl($name, 'login', $scope);
return $this->getController()->redirect($url);
}
/**
* {@inheritdoc}
*/
public function hasMethod($method)
{
if (strpos($method, 'authenticate_') === 0) {
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
$name = substr($method, strlen('authenticate_'));
if (isset($providers[$name])) {
return true;
}
}
return parent::hasMethod($method);
}
/**
* {@inheritdoc}
*/
public function __call($method, $args)
{
if (strpos($method, 'authenticate_') === 0) {
$providers = Config::inst()->get($this->getAuthenticatorClass(), 'providers');
$name = substr($method, strlen('authenticate_'));
if (isset($providers[$name])) {
return $this->handleProvider($name);
}
}
return parent::__call($method, $args);
}
/**
* The name of this login form, to display in the frontend
* Replaces Authenticator::get_name()
*
* @return string
*/
public function getAuthenticatorName()
{
return _t(Authenticator::class . '.TITLE', 'Social sign-on');
}
}
, /app/vendor/bigfork/silverstripe-oauth-login/src/Form/LoginForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Accordion\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Dynamic\Elements\Accordion\Model\AccordionPanel;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
/**
* Class ElementAccordion
* @package Dynamic\Elements\Accordion\Elements
*
* @property string $Content
*
* @method \SilverStripe\ORM\HasManyList Panels()
*/
class ElementAccordion extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-block-content';
/**
* @var string
*/
private static $table_name = 'ElementAccordion';
/**
* @var array
*/
private static $db = [
'Content' => 'HTMLText',
];
/**
* @var array
*/
private static $has_many = array(
'Panels' => AccordionPanel::class,
);
/**
* @var array
*/
private static $owns = [
'Panels',
];
/**
* @var bool
*/
private static $inline_editable = false;
/**
* @param bool $includerelations
* @return array
*/
public function fieldLabels($includerelations = true)
{
$labels = parent::fieldLabels($includerelations);
$labels['Content'] = _t(__CLASS__.'.ContentLabel', 'Intro');
$labels['Panels'] = _t(__CLASS__ . '.PanelsLabel', 'Panels');
return $labels;
}
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/* @var FieldList $fields */
$fields->removeByName(array(
'Sort',
));
$fields->dataFieldByName('Content')
->setDescription(_t(
__CLASS__.'.ContentDescription',
'optional. Add introductory copy to your accordion.'
))
->setRows(5);
if ($this->ID) {
/** @var GridField $panels */
$panels = $fields->dataFieldByName('Panels');
$panels->setTitle($this->fieldLabel('Panels'));
$fields->removeByName('Panels');
$config = $panels->getConfig();
$config->addComponent(new GridFieldOrderableRows('Sort'));
$config->removeComponentsByType(GridFieldAddExistingAutocompleter::class);
$config->removeComponentsByType(GridFieldDeleteAction::class);
$fields->addFieldToTab('Root.Main', $panels);
}
});
return parent::getCMSFields();
}
/**
* @return DBHTMLText
*/
public function getSummary()
{
$count = $this->Panels()->count();
$label = _t(
AccordionPanel::class . '.PLURALS',
'{count} Accordion Panel|{count} Accordion Panels',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__.'.BlockType', 'Accordion');
}
}
, /app/vendor/dynamic/silverstripe-elemental-accordion/src/Elements/ElementAccordion.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key {count} Accordion Panel|{count} Accordion Panels, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Accordion\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Dynamic\Elements\Accordion\Model\AccordionPanel;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
/**
* Class ElementAccordion
* @package Dynamic\Elements\Accordion\Elements
*
* @property string $Content
*
* @method \SilverStripe\ORM\HasManyList Panels()
*/
class ElementAccordion extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-block-content';
/**
* @var string
*/
private static $table_name = 'ElementAccordion';
/**
* @var array
*/
private static $db = [
'Content' => 'HTMLText',
];
/**
* @var array
*/
private static $has_many = array(
'Panels' => AccordionPanel::class,
);
/**
* @var array
*/
private static $owns = [
'Panels',
];
/**
* @var bool
*/
private static $inline_editable = false;
/**
* @param bool $includerelations
* @return array
*/
public function fieldLabels($includerelations = true)
{
$labels = parent::fieldLabels($includerelations);
$labels['Content'] = _t(__CLASS__.'.ContentLabel', 'Intro');
$labels['Panels'] = _t(__CLASS__ . '.PanelsLabel', 'Panels');
return $labels;
}
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/* @var FieldList $fields */
$fields->removeByName(array(
'Sort',
));
$fields->dataFieldByName('Content')
->setDescription(_t(
__CLASS__.'.ContentDescription',
'optional. Add introductory copy to your accordion.'
))
->setRows(5);
if ($this->ID) {
/** @var GridField $panels */
$panels = $fields->dataFieldByName('Panels');
$panels->setTitle($this->fieldLabel('Panels'));
$fields->removeByName('Panels');
$config = $panels->getConfig();
$config->addComponent(new GridFieldOrderableRows('Sort'));
$config->removeComponentsByType(GridFieldAddExistingAutocompleter::class);
$config->removeComponentsByType(GridFieldDeleteAction::class);
$fields->addFieldToTab('Root.Main', $panels);
}
});
return parent::getCMSFields();
}
/**
* @return DBHTMLText
*/
public function getSummary()
{
$count = $this->Panels()->count();
$label = _t(
AccordionPanel::class . '.PLURALS',
'{count} Accordion Panel|{count} Accordion Panels',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__.'.BlockType', 'Accordion');
}
}
, /app/vendor/dynamic/silverstripe-elemental-accordion/src/Elements/ElementAccordion.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Blog\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Sheadawson\DependentDropdown\Forms\DependentDropdownField;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogCategory;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationResult;
/**
* Class ElementBlogPosts
* @package Dynamic\Elements\Elements
*
* @property int $Limit
* @property string $Content
*
* @property int $BlogID
* @property int $CategoryID
* @method Blog Blog()
* @method BlogCategory Category()
*/
class ElementBlogPosts extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-menu-campaigns';
/**
* @var string
*/
private static $table_name = 'ElementBlogPosts';
/**
* @var array
*/
private static $db = array(
'Limit' => 'Int',
'Content' => 'HTMLText',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => Blog::class,
'Category' => BlogCategory::class,
);
/**
* @var array
*/
private static $defaults = array(
'Limit' => 3,
);
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields->dataFieldByName('Content')
->setRows(8);
$fields->dataFieldByName('Limit')
->setTitle(_t(__CLASS__ . 'LimitLabel', 'Posts to show'));
if (class_exists(Blog::class)) {
$fields->insertBefore(
'Limit',
$fields->dataFieldByName('BlogID')
->setTitle(_t(__CLASS__ . 'BlogLabel', 'Featured Blog'))
->setEmptyString('')
);
$dataSource = function ($val) {
if ($val) {
return Blog::get()->byID($val)->Categories()->map('ID', 'Title');
}
return [];
};
$fields->insertAfter(
'BlogID',
DependentDropdownField::create('CategoryID', _t(
__CLASS__ . 'CategoryLabel',
'Category'
), $dataSource)
->setDepends($fields->dataFieldByName('BlogID'))
->setHasEmptyDefault(true)
->setEmptyString('')
);
}
});
return parent::getCMSFields();
}
/**
* @return ArrayList|DataList
*/
public function getPostsList()
{
/** @var ArrayList $posts */
$posts = ArrayList::create();
if ($this->BlogID && $this->CategoryID && $category = BlogCategory::get()->byID($this->CategoryID)) {
$posts = $category->BlogPosts();
} elseif ($this->BlogID && $blog = Blog::get()->byID($this->BlogID)) {
$posts = $blog->getBlogPosts();
} else {
$posts = BlogPost::get()->sort('PublishDate DESC');
}
$this->extend('updateGetPostsList', $posts);
return $posts->limit($this->Limit);
}
/**
* @return DBHTMLText
*/
public function getSummary()
{
$count = $this->getPostsList()->count();
$label = _t(
BlogPost::class . '.PLURALS',
'A Blog Post|{count} Blog Posts',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__ . '.BlockType', 'Blog Posts');
}
}
, /app/vendor/dynamic/silverstripe-elemental-blog/src/Elements/ElementBlogPosts.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key A Blog Post|{count} Blog Posts, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Blog\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Sheadawson\DependentDropdown\Forms\DependentDropdownField;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogCategory;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ValidationResult;
/**
* Class ElementBlogPosts
* @package Dynamic\Elements\Elements
*
* @property int $Limit
* @property string $Content
*
* @property int $BlogID
* @property int $CategoryID
* @method Blog Blog()
* @method BlogCategory Category()
*/
class ElementBlogPosts extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-menu-campaigns';
/**
* @var string
*/
private static $table_name = 'ElementBlogPosts';
/**
* @var array
*/
private static $db = array(
'Limit' => 'Int',
'Content' => 'HTMLText',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => Blog::class,
'Category' => BlogCategory::class,
);
/**
* @var array
*/
private static $defaults = array(
'Limit' => 3,
);
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields->dataFieldByName('Content')
->setRows(8);
$fields->dataFieldByName('Limit')
->setTitle(_t(__CLASS__ . 'LimitLabel', 'Posts to show'));
if (class_exists(Blog::class)) {
$fields->insertBefore(
'Limit',
$fields->dataFieldByName('BlogID')
->setTitle(_t(__CLASS__ . 'BlogLabel', 'Featured Blog'))
->setEmptyString('')
);
$dataSource = function ($val) {
if ($val) {
return Blog::get()->byID($val)->Categories()->map('ID', 'Title');
}
return [];
};
$fields->insertAfter(
'BlogID',
DependentDropdownField::create('CategoryID', _t(
__CLASS__ . 'CategoryLabel',
'Category'
), $dataSource)
->setDepends($fields->dataFieldByName('BlogID'))
->setHasEmptyDefault(true)
->setEmptyString('')
);
}
});
return parent::getCMSFields();
}
/**
* @return ArrayList|DataList
*/
public function getPostsList()
{
/** @var ArrayList $posts */
$posts = ArrayList::create();
if ($this->BlogID && $this->CategoryID && $category = BlogCategory::get()->byID($this->CategoryID)) {
$posts = $category->BlogPosts();
} elseif ($this->BlogID && $blog = Blog::get()->byID($this->BlogID)) {
$posts = $blog->getBlogPosts();
} else {
$posts = BlogPost::get()->sort('PublishDate DESC');
}
$this->extend('updateGetPostsList', $posts);
return $posts->limit($this->Limit);
}
/**
* @return DBHTMLText
*/
public function getSummary()
{
$count = $this->getPostsList()->count();
$label = _t(
BlogPost::class . '.PLURALS',
'A Blog Post|{count} Blog Posts',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__ . '.BlockType', 'Blog Posts');
}
}
, /app/vendor/dynamic/silverstripe-elemental-blog/src/Elements/ElementBlogPosts.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Features\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Dynamic\Elements\Features\Model\FeatureObject;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldGroup;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
/**
* Class PageSectionBlock.
*
* @method HasManyList $Features
*/
class ElementFeatures extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-block-banner';
/**
* @var string
*/
private static $table_name = 'ElementFeatures';
/**
* @var array
*/
private static $db = [
'Content' => 'HTMLText',
'Alternate' => 'Boolean',
];
/**
* @var array
*/
private static $has_many = [
'Features' => FeatureObject::class,
];
/**
* @var array
*/
private static $owns = [
'Features',
];
/**
* Set to false to prevent an in-line edit form from showing in an elemental area. Instead the element will be
* clickable and a GridFieldDetailForm will be used.
*
* @config
* @var bool
*/
private static $inline_editable = false;
/**
* @param bool $includerelations
* @return array
*/
public function fieldLabels($includerelations = true)
{
$labels = parent::fieldLabels($includerelations);
$labels['Content'] = _t(__CLASS__.'.ContentLabel', 'Intro');
$labels['Alternate'] = _t(__CLASS__ . '.AlternateLabel', 'Alternate Layout');
$labels['Features'] = _t(__CLASS__ . '.FeaturesLabel', 'Features');
return $labels;
}
/**
* @return \SilverStripe\Forms\FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields->dataFieldByName('Content')
->setTitle($this->fieldLabel('Content'))
->setRows(5);
$alternate = $fields->dataFieldByName('Alternate');
$fields->removeByName('Alternate');
$fields->addFieldToTab(
'Root.Main',
CompositeField::create(
$alternate
->setTitle($this->fieldLabel('Alternate'))
->setDescription(_t(
__CLASS__ . '.AlternateDescription',
'alternate image and text alignment - first feature: image left, copy right;
second feature: image right, copy left;'
))
)->setTitle(_t(
__CLASS__ . '.LayoutLabel',
'Layout'
))
);
if ($this->ID) {
// Features
$features = $fields->dataFieldByName('Features');
$fields->removeByName('Features');
$config = $features->getConfig();
$config
->addComponent(new GridFieldOrderableRows())
->removeComponentsByType([
GridFieldAddExistingAutocompleter::class,
GridFieldDeleteAction::class
]);
$fields->addFieldToTab('Root.Main', $features);
}
});
return parent::getCMSFields();
}
/**
* @return mixed
*/
public function getFeaturesList()
{
return $this->Features()->sort('Sort');
}
/**
* @return DBHTMLText
*/
public function getSummary()
{
$count = $this->Features()->count();
$label = _t(
FeatureObject::class . '.PLURALS',
'A Feature|{count} Features',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__.'.BlockType', 'Features');
}
}
, /app/vendor/dynamic/silverstripe-elemental-features/src/Elements/ElementFeatures.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key A Feature|{count} Features, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Features\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Dynamic\Elements\Features\Model\FeatureObject;
use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldGroup;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
/**
* Class PageSectionBlock.
*
* @method HasManyList $Features
*/
class ElementFeatures extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-block-banner';
/**
* @var string
*/
private static $table_name = 'ElementFeatures';
/**
* @var array
*/
private static $db = [
'Content' => 'HTMLText',
'Alternate' => 'Boolean',
];
/**
* @var array
*/
private static $has_many = [
'Features' => FeatureObject::class,
];
/**
* @var array
*/
private static $owns = [
'Features',
];
/**
* Set to false to prevent an in-line edit form from showing in an elemental area. Instead the element will be
* clickable and a GridFieldDetailForm will be used.
*
* @config
* @var bool
*/
private static $inline_editable = false;
/**
* @param bool $includerelations
* @return array
*/
public function fieldLabels($includerelations = true)
{
$labels = parent::fieldLabels($includerelations);
$labels['Content'] = _t(__CLASS__.'.ContentLabel', 'Intro');
$labels['Alternate'] = _t(__CLASS__ . '.AlternateLabel', 'Alternate Layout');
$labels['Features'] = _t(__CLASS__ . '.FeaturesLabel', 'Features');
return $labels;
}
/**
* @return \SilverStripe\Forms\FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields->dataFieldByName('Content')
->setTitle($this->fieldLabel('Content'))
->setRows(5);
$alternate = $fields->dataFieldByName('Alternate');
$fields->removeByName('Alternate');
$fields->addFieldToTab(
'Root.Main',
CompositeField::create(
$alternate
->setTitle($this->fieldLabel('Alternate'))
->setDescription(_t(
__CLASS__ . '.AlternateDescription',
'alternate image and text alignment - first feature: image left, copy right;
second feature: image right, copy left;'
))
)->setTitle(_t(
__CLASS__ . '.LayoutLabel',
'Layout'
))
);
if ($this->ID) {
// Features
$features = $fields->dataFieldByName('Features');
$fields->removeByName('Features');
$config = $features->getConfig();
$config
->addComponent(new GridFieldOrderableRows())
->removeComponentsByType([
GridFieldAddExistingAutocompleter::class,
GridFieldDeleteAction::class
]);
$fields->addFieldToTab('Root.Main', $features);
}
});
return parent::getCMSFields();
}
/**
* @return mixed
*/
public function getFeaturesList()
{
return $this->Features()->sort('Sort');
}
/**
* @return DBHTMLText
*/
public function getSummary()
{
$count = $this->Features()->count();
$label = _t(
FeatureObject::class . '.PLURALS',
'A Feature|{count} Features',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__.'.BlockType', 'Features');
}
}
, /app/vendor/dynamic/silverstripe-elemental-features/src/Elements/ElementFeatures.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Flexslider\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Dynamic\FlexSlider\Model\SlideImage;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\FieldType\DBField;
/**
* Class ElementSlideshow
* @package Dynamic\Elements\Flexslider\Elements
*
* @property string Content
*/
class ElementSlideshow extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-block-carousel';
/**
* @var string
*/
private static $table_name = 'ElementSlideshow';
/**
* @var array
*/
private static $db = [
'Content' => 'HTMLText',
];
/**
* @var array
*/
private static $owns = [
'Slides',
];
/**
* @var bool
*/
private static $inline_editable = false;
/**
* @var string
*/
private static $slide_tab_title = 'Main';
/**
* @param bool $includerelations
* @return array
*/
public function fieldLabels($includerelations = true)
{
$labels = parent::fieldLabels($includerelations);
$labels['Content'] = _t(__CLASS__.'.ContentLabel', 'Description');
return $labels;
}
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields->dataFieldByName('Content')
->setRows(5)
->setDescription(_t(
__CLASS__ . '.ContentDescription',
'optional. Add introductory copy to your slideshow.'
));
});
return parent::getCMSFields();
}
/**
* @return \SilverStripe\ORM\FieldType\DBHTMLText
*/
public function getSummary()
{
$count = $this->Slides()->count();
$label = _t(
SlideImage::class . '.PLURALS',
'{count} Slide|{count} Slides',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__.'.BlockType', 'Slideshow');
}
}
, /app/vendor/dynamic/silverstripe-elemental-flexslider/src/Elements/ElementSlideshow.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key {count} Slide|{count} Slides, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace Dynamic\Elements\Flexslider\Elements;
use DNADesign\Elemental\Models\BaseElement;
use Dynamic\FlexSlider\Model\SlideImage;
use SilverStripe\Forms\FieldList;
use SilverStripe\ORM\FieldType\DBField;
/**
* Class ElementSlideshow
* @package Dynamic\Elements\Flexslider\Elements
*
* @property string Content
*/
class ElementSlideshow extends BaseElement
{
/**
* @var string
*/
private static $icon = 'font-icon-block-carousel';
/**
* @var string
*/
private static $table_name = 'ElementSlideshow';
/**
* @var array
*/
private static $db = [
'Content' => 'HTMLText',
];
/**
* @var array
*/
private static $owns = [
'Slides',
];
/**
* @var bool
*/
private static $inline_editable = false;
/**
* @var string
*/
private static $slide_tab_title = 'Main';
/**
* @param bool $includerelations
* @return array
*/
public function fieldLabels($includerelations = true)
{
$labels = parent::fieldLabels($includerelations);
$labels['Content'] = _t(__CLASS__.'.ContentLabel', 'Description');
return $labels;
}
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields->dataFieldByName('Content')
->setRows(5)
->setDescription(_t(
__CLASS__ . '.ContentDescription',
'optional. Add introductory copy to your slideshow.'
));
});
return parent::getCMSFields();
}
/**
* @return \SilverStripe\ORM\FieldType\DBHTMLText
*/
public function getSummary()
{
$count = $this->Slides()->count();
$label = _t(
SlideImage::class . '.PLURALS',
'{count} Slide|{count} Slides',
[ 'count' => $count ]
);
return DBField::create_field('HTMLText', $label)->Summary(20);
}
/**
* @return array
*/
protected function provideBlockSchema()
{
$blockSchema = parent::provideBlockSchema();
$blockSchema['content'] = $this->getSummary();
return $blockSchema;
}
/**
* @return string
*/
public function getType()
{
return _t(__CLASS__.'.BlockType', 'Slideshow');
}
}
, /app/vendor/dynamic/silverstripe-elemental-flexslider/src/Elements/ElementSlideshow.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Restore to draft at top level, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Restore to draft, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Restore the archived version to draft as a top level item, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Restore the archived version to draft, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridFieldFooter;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Versioned\RestoreAction;
/**
* This class is a {@link GridField} component that adds a restore action for
* versioned objects.
*/
class GridFieldRestoreAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
return _t(__CLASS__ . '.RESTORE', "Restore to draft");
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
* @inheritdoc
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->getAttributes() : [];
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns ?? [])) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
return [];
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling.
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restore'];
}
/**
* Creates a restore action if the action is able to be preformed
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
public function getRestoreAction($gridField, $record, $columnName)
{
$canRestoreToDraft = $record->canRestoreToDraft();
if ($canRestoreToDraft) {
$restoreToRoot = RestoreAction::shouldRestoreToRoot($record);
$title = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT', 'Restore to draft at top level')
: _t(RestoreAction::class . '.RESTORE', 'Restore to draft');
$description = $restoreToRoot
? _t(RestoreAction::class . '.RESTORE_TO_ROOT_DESC', 'Restore the archived version to draft as a top level item')
: _t(RestoreAction::class . '.RESTORE_DESC', 'Restore the archived version to draft');
$field = GridField_FormAction::create(
$gridField,
'Restore' . $record->ID,
false,
"restore",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md font-icon-back-in-time grid-field__icon-action action-menu--handled action-restore')
->setAttribute('classNames', 'font-icon-back-in-time action-restore')
->setAttribute('data-to-root', $restoreToRoot)
->setDescription($description)
->setAttribute('aria-label', $title);
}
return isset($field) ? $field : null;
}
/**
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string The HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getRestoreAction($gridField, $record, $columnName);
return $field ? $field->Field() : null;
}
/**
* Handle the actions and apply any changes to the GridField.
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
*
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restore') {
/** @var DataObject $item */
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
$message = RestoreAction::restore($item);
// If this is handled in a form context then show a message
if ($message && $controller = $gridField->form->controller) {
$controller->getResponse()->addHeader('X-Message-Text', $message['text']);
$controller->getResponse()->addHeader('X-Message-Type', $message['type']);
}
$gridField->getList()->remove($item);
}
}
}
, /app/vendor/silverstripe/versioned/src/GridFieldRestoreAction.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\View\ArrayData;
use SilverStripe\View\SSViewer;
/**
* Provides versioned dataobject support to {@see GridFieldDetailForm_ItemRequest}
*
* @property GridFieldDetailForm_ItemRequest $owner
*/
class VersionedGridFieldItemRequest extends GridFieldDetailForm_ItemRequest
{
/**
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
$status = $this->getRecordStatus();
$badge = null;
if ($status) {
// Generate badge
$badge = DBField::create_field('HTMLFragment', sprintf(
'<span class="badge version-status version-status--%s">%s</span>',
$status['class'],
$status['title']
));
}
$this->extend('updateBadge', $badge);
if ($badge) {
/** @var ArrayData $lastItem */
$lastItem = $items->last();
$lastItem->setField('Extra', $badge);
}
return $items;
}
/**
* @return FieldList
*/
protected function getFormActions()
{
// Check if record is versionable
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$ownerIsStaged = $record
&& $record->hasExtension(Versioned::class)
&& $record->hasStages();
$ownerRecursivePublishes = !$ownerIsStaged
&& $record
&& $record->hasExtension(RecursivePublishable::class)
&& $record->config()->get('owns');
// Add extra actions prior to extensions so that these can be modified too
if ($ownerIsStaged) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addVersionedButtons($record, $actions);
}
);
} elseif ($ownerRecursivePublishes) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addUnversionedButtons($record, $actions);
}
);
}
return parent::getFormActions();
}
/**
* If a record is recursive publishable, but not versioned, all saves should trigger a recursive publish.
*
* @param array $data
* @param Form $form
* @return DataObject $record
*/
public function saveFormIntoRecord($data, $form)
{
$record = parent::saveFormIntoRecord($data, $form);
// Note: Don't publish if versioned, since that's a separate action
$ownerIsVersioned = $record && $record->hasExtension(Versioned::class);
$ownerIsPublishable = $record && $record->hasExtension(RecursivePublishable::class);
if ($ownerIsPublishable && !$ownerIsVersioned) {
/** @var RecursivePublishable $record */
$record->publishRecursive();
}
return $record;
}
/**
* Archive this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doArchive($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canArchive()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doArchive();
$message = _t(
__CLASS__ . '.Archived',
'Archived {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
//when an item is deleted, redirect to the parent controller
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBackLink(), 302); //redirect back to admin section
}
/**
* Publish this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doPublish($data, $form)
{
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$isNewRecord = $record->ID == 0;
// Check permission
if (!$record->canPublish()) {
return $this->httpError(403);
}
// Initial save and reload
$record = $this->saveFormIntoRecord($data, $form);
$record->publishRecursive();
$editURL = $this->Link('edit');
$xmlTitle = Convert::raw2xml($record->Title);
$link = "<a href=\"{$editURL}\">{$xmlTitle}</a>";
$message = _t(
__CLASS__ . '.Published',
'Published {name} {link}',
[
'name' => $record->i18n_singular_name(),
'link' => $link
]
);
$this->setFormMessage($form, $message);
return $this->redirectAfterSave($isNewRecord);
}
/**
* Delete this record from the live site
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doUnpublish($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canUnpublish()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doUnpublish();
$message = _t(
__CLASS__ . '.Unpublished',
'Unpublished {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
// Redirect back to edit
return $this->redirectAfterSave(false);
}
/**
* @param Form $form
* @param string $message
*/
protected function setFormMessage($form, $message)
{
$form->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
$controller = $this->getToplevelController();
if ($controller->hasMethod('getEditForm')) {
/** @var Form $backForm */
$backForm = $controller->getEditForm();
$backForm->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
}
}
/**
* Return list of class / title to add on the end of record status in breadcrumbs
*
* @return array|null
*/
protected function getRecordStatus()
{
/** @var DataObject|Versioned $record */
$record = $this->record;
// No status if un-versioned
if (!$this->record->hasExtension(Versioned::class)) {
return null;
}
if ($record->isOnDraftOnly()) {
return [
'class' => 'addedtodraft',
'title' => _t(__CLASS__ . '.DRAFT', 'Draft')
];
}
if ($record->isModifiedOnDraft()) {
return [
'class' => 'modified',
'title' => _t(__CLASS__ . '.MODIFIED', 'Modified')
];
}
return null;
}
/**
* Getting buttons that are for versioned objects
*
* @param DataObject|Versioned|RecursivePublishable $record
* @param FieldList $actions
*/
protected function addVersionedButtons(DataObject $record, FieldList $actions)
{
// Get status of the object
$isOnDraft = $record->isOnDraft();
$isPublished = $record->isPublished();
$stagesDiffer = $record->stagesDiffer();
// Check permissions
$canPublish = $record->canPublish();
$canUnpublish = $record->canUnpublish();
$canEdit = $record->canEdit();
$canArchive = $record->canArchive();
// "save", supports an alternate state that is still clickable, but notifies the user that the action is not needed.
$noChangesClasses = 'btn-outline-primary font-icon-tick';
/** @var DataObject|Versioned|RecursivePublishable $liveRecord */
$liveRecord = Versioned::get_by_stage(get_class($record), Versioned::LIVE)->byID($record->ID);
$majorActions = $actions->fieldByName('MajorActions');
// "more options" action
$rootTabSet = TabSet::create('ActionMenus');
$moreOptions = Tab::create(
'MoreOptions',
_t(self::class . '.MoreOptions', 'More options', 'Expands a view for more buttons')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus noborder');
$infoTemplate = SSViewer::get_templates_by_class(get_class($record), '_Information', DataObject::class);
$moreOptions->push(
LiteralField::create(
'Information',
$record->customise([
'Live' => $liveRecord,
'ExistsOnLive' => $isPublished
])->renderWith($infoTemplate)
)
);
..., /app/vendor/silverstripe/versioned/src/VersionedGridFieldItemRequest.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Save draft, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\View\ArrayData;
use SilverStripe\View\SSViewer;
/**
* Provides versioned dataobject support to {@see GridFieldDetailForm_ItemRequest}
*
* @property GridFieldDetailForm_ItemRequest $owner
*/
class VersionedGridFieldItemRequest extends GridFieldDetailForm_ItemRequest
{
/**
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
$status = $this->getRecordStatus();
$badge = null;
if ($status) {
// Generate badge
$badge = DBField::create_field('HTMLFragment', sprintf(
'<span class="badge version-status version-status--%s">%s</span>',
$status['class'],
$status['title']
));
}
$this->extend('updateBadge', $badge);
if ($badge) {
/** @var ArrayData $lastItem */
$lastItem = $items->last();
$lastItem->setField('Extra', $badge);
}
return $items;
}
/**
* @return FieldList
*/
protected function getFormActions()
{
// Check if record is versionable
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$ownerIsStaged = $record
&& $record->hasExtension(Versioned::class)
&& $record->hasStages();
$ownerRecursivePublishes = !$ownerIsStaged
&& $record
&& $record->hasExtension(RecursivePublishable::class)
&& $record->config()->get('owns');
// Add extra actions prior to extensions so that these can be modified too
if ($ownerIsStaged) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addVersionedButtons($record, $actions);
}
);
} elseif ($ownerRecursivePublishes) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addUnversionedButtons($record, $actions);
}
);
}
return parent::getFormActions();
}
/**
* If a record is recursive publishable, but not versioned, all saves should trigger a recursive publish.
*
* @param array $data
* @param Form $form
* @return DataObject $record
*/
public function saveFormIntoRecord($data, $form)
{
$record = parent::saveFormIntoRecord($data, $form);
// Note: Don't publish if versioned, since that's a separate action
$ownerIsVersioned = $record && $record->hasExtension(Versioned::class);
$ownerIsPublishable = $record && $record->hasExtension(RecursivePublishable::class);
if ($ownerIsPublishable && !$ownerIsVersioned) {
/** @var RecursivePublishable $record */
$record->publishRecursive();
}
return $record;
}
/**
* Archive this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doArchive($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canArchive()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doArchive();
$message = _t(
__CLASS__ . '.Archived',
'Archived {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
//when an item is deleted, redirect to the parent controller
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBackLink(), 302); //redirect back to admin section
}
/**
* Publish this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doPublish($data, $form)
{
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$isNewRecord = $record->ID == 0;
// Check permission
if (!$record->canPublish()) {
return $this->httpError(403);
}
// Initial save and reload
$record = $this->saveFormIntoRecord($data, $form);
$record->publishRecursive();
$editURL = $this->Link('edit');
$xmlTitle = Convert::raw2xml($record->Title);
$link = "<a href=\"{$editURL}\">{$xmlTitle}</a>";
$message = _t(
__CLASS__ . '.Published',
'Published {name} {link}',
[
'name' => $record->i18n_singular_name(),
'link' => $link
]
);
$this->setFormMessage($form, $message);
return $this->redirectAfterSave($isNewRecord);
}
/**
* Delete this record from the live site
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doUnpublish($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canUnpublish()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doUnpublish();
$message = _t(
__CLASS__ . '.Unpublished',
'Unpublished {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
// Redirect back to edit
return $this->redirectAfterSave(false);
}
/**
* @param Form $form
* @param string $message
*/
protected function setFormMessage($form, $message)
{
$form->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
$controller = $this->getToplevelController();
if ($controller->hasMethod('getEditForm')) {
/** @var Form $backForm */
$backForm = $controller->getEditForm();
$backForm->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
}
}
/**
* Return list of class / title to add on the end of record status in breadcrumbs
*
* @return array|null
*/
protected function getRecordStatus()
{
/** @var DataObject|Versioned $record */
$record = $this->record;
// No status if un-versioned
if (!$this->record->hasExtension(Versioned::class)) {
return null;
}
if ($record->isOnDraftOnly()) {
return [
'class' => 'addedtodraft',
'title' => _t(__CLASS__ . '.DRAFT', 'Draft')
];
}
if ($record->isModifiedOnDraft()) {
return [
'class' => 'modified',
'title' => _t(__CLASS__ . '.MODIFIED', 'Modified')
];
}
return null;
}
/**
* Getting buttons that are for versioned objects
*
* @param DataObject|Versioned|RecursivePublishable $record
* @param FieldList $actions
*/
protected function addVersionedButtons(DataObject $record, FieldList $actions)
{
// Get status of the object
$isOnDraft = $record->isOnDraft();
$isPublished = $record->isPublished();
$stagesDiffer = $record->stagesDiffer();
// Check permissions
$canPublish = $record->canPublish();
$canUnpublish = $record->canUnpublish();
$canEdit = $record->canEdit();
$canArchive = $record->canArchive();
// "save", supports an alternate state that is still clickable, but notifies the user that the action is not needed.
$noChangesClasses = 'btn-outline-primary font-icon-tick';
/** @var DataObject|Versioned|RecursivePublishable $liveRecord */
$liveRecord = Versioned::get_by_stage(get_class($record), Versioned::LIVE)->byID($record->ID);
$majorActions = $actions->fieldByName('MajorActions');
// "more options" action
$rootTabSet = TabSet::create('ActionMenus');
$moreOptions = Tab::create(
'MoreOptions',
_t(self::class . '.MoreOptions', 'More options', 'Expands a view for more buttons')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus noborder');
$infoTemplate = SSViewer::get_templates_by_class(get_class($record), '_Information', DataObject::class);
$moreOptions->push(
LiteralField::create(
'Information',
$record->customise([
'Live' => $liveRecord,
'ExistsOnLive' => $isPublished
])->renderWith($infoTemplate)
)
);
..., /app/vendor/silverstripe/versioned/src/VersionedGridFieldItemRequest.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\View\ArrayData;
use SilverStripe\View\SSViewer;
/**
* Provides versioned dataobject support to {@see GridFieldDetailForm_ItemRequest}
*
* @property GridFieldDetailForm_ItemRequest $owner
*/
class VersionedGridFieldItemRequest extends GridFieldDetailForm_ItemRequest
{
/**
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
$status = $this->getRecordStatus();
$badge = null;
if ($status) {
// Generate badge
$badge = DBField::create_field('HTMLFragment', sprintf(
'<span class="badge version-status version-status--%s">%s</span>',
$status['class'],
$status['title']
));
}
$this->extend('updateBadge', $badge);
if ($badge) {
/** @var ArrayData $lastItem */
$lastItem = $items->last();
$lastItem->setField('Extra', $badge);
}
return $items;
}
/**
* @return FieldList
*/
protected function getFormActions()
{
// Check if record is versionable
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$ownerIsStaged = $record
&& $record->hasExtension(Versioned::class)
&& $record->hasStages();
$ownerRecursivePublishes = !$ownerIsStaged
&& $record
&& $record->hasExtension(RecursivePublishable::class)
&& $record->config()->get('owns');
// Add extra actions prior to extensions so that these can be modified too
if ($ownerIsStaged) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addVersionedButtons($record, $actions);
}
);
} elseif ($ownerRecursivePublishes) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addUnversionedButtons($record, $actions);
}
);
}
return parent::getFormActions();
}
/**
* If a record is recursive publishable, but not versioned, all saves should trigger a recursive publish.
*
* @param array $data
* @param Form $form
* @return DataObject $record
*/
public function saveFormIntoRecord($data, $form)
{
$record = parent::saveFormIntoRecord($data, $form);
// Note: Don't publish if versioned, since that's a separate action
$ownerIsVersioned = $record && $record->hasExtension(Versioned::class);
$ownerIsPublishable = $record && $record->hasExtension(RecursivePublishable::class);
if ($ownerIsPublishable && !$ownerIsVersioned) {
/** @var RecursivePublishable $record */
$record->publishRecursive();
}
return $record;
}
/**
* Archive this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doArchive($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canArchive()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doArchive();
$message = _t(
__CLASS__ . '.Archived',
'Archived {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
//when an item is deleted, redirect to the parent controller
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBackLink(), 302); //redirect back to admin section
}
/**
* Publish this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doPublish($data, $form)
{
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$isNewRecord = $record->ID == 0;
// Check permission
if (!$record->canPublish()) {
return $this->httpError(403);
}
// Initial save and reload
$record = $this->saveFormIntoRecord($data, $form);
$record->publishRecursive();
$editURL = $this->Link('edit');
$xmlTitle = Convert::raw2xml($record->Title);
$link = "<a href=\"{$editURL}\">{$xmlTitle}</a>";
$message = _t(
__CLASS__ . '.Published',
'Published {name} {link}',
[
'name' => $record->i18n_singular_name(),
'link' => $link
]
);
$this->setFormMessage($form, $message);
return $this->redirectAfterSave($isNewRecord);
}
/**
* Delete this record from the live site
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doUnpublish($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canUnpublish()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doUnpublish();
$message = _t(
__CLASS__ . '.Unpublished',
'Unpublished {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
// Redirect back to edit
return $this->redirectAfterSave(false);
}
/**
* @param Form $form
* @param string $message
*/
protected function setFormMessage($form, $message)
{
$form->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
$controller = $this->getToplevelController();
if ($controller->hasMethod('getEditForm')) {
/** @var Form $backForm */
$backForm = $controller->getEditForm();
$backForm->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
}
}
/**
* Return list of class / title to add on the end of record status in breadcrumbs
*
* @return array|null
*/
protected function getRecordStatus()
{
/** @var DataObject|Versioned $record */
$record = $this->record;
// No status if un-versioned
if (!$this->record->hasExtension(Versioned::class)) {
return null;
}
if ($record->isOnDraftOnly()) {
return [
'class' => 'addedtodraft',
'title' => _t(__CLASS__ . '.DRAFT', 'Draft')
];
}
if ($record->isModifiedOnDraft()) {
return [
'class' => 'modified',
'title' => _t(__CLASS__ . '.MODIFIED', 'Modified')
];
}
return null;
}
/**
* Getting buttons that are for versioned objects
*
* @param DataObject|Versioned|RecursivePublishable $record
* @param FieldList $actions
*/
protected function addVersionedButtons(DataObject $record, FieldList $actions)
{
// Get status of the object
$isOnDraft = $record->isOnDraft();
$isPublished = $record->isPublished();
$stagesDiffer = $record->stagesDiffer();
// Check permissions
$canPublish = $record->canPublish();
$canUnpublish = $record->canUnpublish();
$canEdit = $record->canEdit();
$canArchive = $record->canArchive();
// "save", supports an alternate state that is still clickable, but notifies the user that the action is not needed.
$noChangesClasses = 'btn-outline-primary font-icon-tick';
/** @var DataObject|Versioned|RecursivePublishable $liveRecord */
$liveRecord = Versioned::get_by_stage(get_class($record), Versioned::LIVE)->byID($record->ID);
$majorActions = $actions->fieldByName('MajorActions');
// "more options" action
$rootTabSet = TabSet::create('ActionMenus');
$moreOptions = Tab::create(
'MoreOptions',
_t(self::class . '.MoreOptions', 'More options', 'Expands a view for more buttons')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus noborder');
$infoTemplate = SSViewer::get_templates_by_class(get_class($record), '_Information', DataObject::class);
$moreOptions->push(
LiteralField::create(
'Information',
$record->customise([
'Live' => $liveRecord,
'ExistsOnLive' => $isPublished
])->renderWith($infoTemplate)
)
);
..., /app/vendor/silverstripe/versioned/src/VersionedGridFieldItemRequest.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Unpublish and archive, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\View\ArrayData;
use SilverStripe\View\SSViewer;
/**
* Provides versioned dataobject support to {@see GridFieldDetailForm_ItemRequest}
*
* @property GridFieldDetailForm_ItemRequest $owner
*/
class VersionedGridFieldItemRequest extends GridFieldDetailForm_ItemRequest
{
/**
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
$status = $this->getRecordStatus();
$badge = null;
if ($status) {
// Generate badge
$badge = DBField::create_field('HTMLFragment', sprintf(
'<span class="badge version-status version-status--%s">%s</span>',
$status['class'],
$status['title']
));
}
$this->extend('updateBadge', $badge);
if ($badge) {
/** @var ArrayData $lastItem */
$lastItem = $items->last();
$lastItem->setField('Extra', $badge);
}
return $items;
}
/**
* @return FieldList
*/
protected function getFormActions()
{
// Check if record is versionable
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$ownerIsStaged = $record
&& $record->hasExtension(Versioned::class)
&& $record->hasStages();
$ownerRecursivePublishes = !$ownerIsStaged
&& $record
&& $record->hasExtension(RecursivePublishable::class)
&& $record->config()->get('owns');
// Add extra actions prior to extensions so that these can be modified too
if ($ownerIsStaged) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addVersionedButtons($record, $actions);
}
);
} elseif ($ownerRecursivePublishes) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addUnversionedButtons($record, $actions);
}
);
}
return parent::getFormActions();
}
/**
* If a record is recursive publishable, but not versioned, all saves should trigger a recursive publish.
*
* @param array $data
* @param Form $form
* @return DataObject $record
*/
public function saveFormIntoRecord($data, $form)
{
$record = parent::saveFormIntoRecord($data, $form);
// Note: Don't publish if versioned, since that's a separate action
$ownerIsVersioned = $record && $record->hasExtension(Versioned::class);
$ownerIsPublishable = $record && $record->hasExtension(RecursivePublishable::class);
if ($ownerIsPublishable && !$ownerIsVersioned) {
/** @var RecursivePublishable $record */
$record->publishRecursive();
}
return $record;
}
/**
* Archive this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doArchive($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canArchive()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doArchive();
$message = _t(
__CLASS__ . '.Archived',
'Archived {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
//when an item is deleted, redirect to the parent controller
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBackLink(), 302); //redirect back to admin section
}
/**
* Publish this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doPublish($data, $form)
{
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$isNewRecord = $record->ID == 0;
// Check permission
if (!$record->canPublish()) {
return $this->httpError(403);
}
// Initial save and reload
$record = $this->saveFormIntoRecord($data, $form);
$record->publishRecursive();
$editURL = $this->Link('edit');
$xmlTitle = Convert::raw2xml($record->Title);
$link = "<a href=\"{$editURL}\">{$xmlTitle}</a>";
$message = _t(
__CLASS__ . '.Published',
'Published {name} {link}',
[
'name' => $record->i18n_singular_name(),
'link' => $link
]
);
$this->setFormMessage($form, $message);
return $this->redirectAfterSave($isNewRecord);
}
/**
* Delete this record from the live site
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doUnpublish($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canUnpublish()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doUnpublish();
$message = _t(
__CLASS__ . '.Unpublished',
'Unpublished {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
// Redirect back to edit
return $this->redirectAfterSave(false);
}
/**
* @param Form $form
* @param string $message
*/
protected function setFormMessage($form, $message)
{
$form->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
$controller = $this->getToplevelController();
if ($controller->hasMethod('getEditForm')) {
/** @var Form $backForm */
$backForm = $controller->getEditForm();
$backForm->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
}
}
/**
* Return list of class / title to add on the end of record status in breadcrumbs
*
* @return array|null
*/
protected function getRecordStatus()
{
/** @var DataObject|Versioned $record */
$record = $this->record;
// No status if un-versioned
if (!$this->record->hasExtension(Versioned::class)) {
return null;
}
if ($record->isOnDraftOnly()) {
return [
'class' => 'addedtodraft',
'title' => _t(__CLASS__ . '.DRAFT', 'Draft')
];
}
if ($record->isModifiedOnDraft()) {
return [
'class' => 'modified',
'title' => _t(__CLASS__ . '.MODIFIED', 'Modified')
];
}
return null;
}
/**
* Getting buttons that are for versioned objects
*
* @param DataObject|Versioned|RecursivePublishable $record
* @param FieldList $actions
*/
protected function addVersionedButtons(DataObject $record, FieldList $actions)
{
// Get status of the object
$isOnDraft = $record->isOnDraft();
$isPublished = $record->isPublished();
$stagesDiffer = $record->stagesDiffer();
// Check permissions
$canPublish = $record->canPublish();
$canUnpublish = $record->canUnpublish();
$canEdit = $record->canEdit();
$canArchive = $record->canArchive();
// "save", supports an alternate state that is still clickable, but notifies the user that the action is not needed.
$noChangesClasses = 'btn-outline-primary font-icon-tick';
/** @var DataObject|Versioned|RecursivePublishable $liveRecord */
$liveRecord = Versioned::get_by_stage(get_class($record), Versioned::LIVE)->byID($record->ID);
$majorActions = $actions->fieldByName('MajorActions');
// "more options" action
$rootTabSet = TabSet::create('ActionMenus');
$moreOptions = Tab::create(
'MoreOptions',
_t(self::class . '.MoreOptions', 'More options', 'Expands a view for more buttons')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus noborder');
$infoTemplate = SSViewer::get_templates_by_class(get_class($record), '_Information', DataObject::class);
$moreOptions->push(
LiteralField::create(
'Information',
$record->customise([
'Live' => $liveRecord,
'ExistsOnLive' => $isPublished
])->renderWith($infoTemplate)
)
);
..., /app/vendor/silverstripe/versioned/src/VersionedGridFieldItemRequest.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\View\ArrayData;
use SilverStripe\View\SSViewer;
/**
* Provides versioned dataobject support to {@see GridFieldDetailForm_ItemRequest}
*
* @property GridFieldDetailForm_ItemRequest $owner
*/
class VersionedGridFieldItemRequest extends GridFieldDetailForm_ItemRequest
{
/**
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
$status = $this->getRecordStatus();
$badge = null;
if ($status) {
// Generate badge
$badge = DBField::create_field('HTMLFragment', sprintf(
'<span class="badge version-status version-status--%s">%s</span>',
$status['class'],
$status['title']
));
}
$this->extend('updateBadge', $badge);
if ($badge) {
/** @var ArrayData $lastItem */
$lastItem = $items->last();
$lastItem->setField('Extra', $badge);
}
return $items;
}
/**
* @return FieldList
*/
protected function getFormActions()
{
// Check if record is versionable
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$ownerIsStaged = $record
&& $record->hasExtension(Versioned::class)
&& $record->hasStages();
$ownerRecursivePublishes = !$ownerIsStaged
&& $record
&& $record->hasExtension(RecursivePublishable::class)
&& $record->config()->get('owns');
// Add extra actions prior to extensions so that these can be modified too
if ($ownerIsStaged) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addVersionedButtons($record, $actions);
}
);
} elseif ($ownerRecursivePublishes) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addUnversionedButtons($record, $actions);
}
);
}
return parent::getFormActions();
}
/**
* If a record is recursive publishable, but not versioned, all saves should trigger a recursive publish.
*
* @param array $data
* @param Form $form
* @return DataObject $record
*/
public function saveFormIntoRecord($data, $form)
{
$record = parent::saveFormIntoRecord($data, $form);
// Note: Don't publish if versioned, since that's a separate action
$ownerIsVersioned = $record && $record->hasExtension(Versioned::class);
$ownerIsPublishable = $record && $record->hasExtension(RecursivePublishable::class);
if ($ownerIsPublishable && !$ownerIsVersioned) {
/** @var RecursivePublishable $record */
$record->publishRecursive();
}
return $record;
}
/**
* Archive this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doArchive($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canArchive()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doArchive();
$message = _t(
__CLASS__ . '.Archived',
'Archived {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
//when an item is deleted, redirect to the parent controller
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBackLink(), 302); //redirect back to admin section
}
/**
* Publish this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doPublish($data, $form)
{
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$isNewRecord = $record->ID == 0;
// Check permission
if (!$record->canPublish()) {
return $this->httpError(403);
}
// Initial save and reload
$record = $this->saveFormIntoRecord($data, $form);
$record->publishRecursive();
$editURL = $this->Link('edit');
$xmlTitle = Convert::raw2xml($record->Title);
$link = "<a href=\"{$editURL}\">{$xmlTitle}</a>";
$message = _t(
__CLASS__ . '.Published',
'Published {name} {link}',
[
'name' => $record->i18n_singular_name(),
'link' => $link
]
);
$this->setFormMessage($form, $message);
return $this->redirectAfterSave($isNewRecord);
}
/**
* Delete this record from the live site
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doUnpublish($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canUnpublish()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doUnpublish();
$message = _t(
__CLASS__ . '.Unpublished',
'Unpublished {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
// Redirect back to edit
return $this->redirectAfterSave(false);
}
/**
* @param Form $form
* @param string $message
*/
protected function setFormMessage($form, $message)
{
$form->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
$controller = $this->getToplevelController();
if ($controller->hasMethod('getEditForm')) {
/** @var Form $backForm */
$backForm = $controller->getEditForm();
$backForm->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
}
}
/**
* Return list of class / title to add on the end of record status in breadcrumbs
*
* @return array|null
*/
protected function getRecordStatus()
{
/** @var DataObject|Versioned $record */
$record = $this->record;
// No status if un-versioned
if (!$this->record->hasExtension(Versioned::class)) {
return null;
}
if ($record->isOnDraftOnly()) {
return [
'class' => 'addedtodraft',
'title' => _t(__CLASS__ . '.DRAFT', 'Draft')
];
}
if ($record->isModifiedOnDraft()) {
return [
'class' => 'modified',
'title' => _t(__CLASS__ . '.MODIFIED', 'Modified')
];
}
return null;
}
/**
* Getting buttons that are for versioned objects
*
* @param DataObject|Versioned|RecursivePublishable $record
* @param FieldList $actions
*/
protected function addVersionedButtons(DataObject $record, FieldList $actions)
{
// Get status of the object
$isOnDraft = $record->isOnDraft();
$isPublished = $record->isPublished();
$stagesDiffer = $record->stagesDiffer();
// Check permissions
$canPublish = $record->canPublish();
$canUnpublish = $record->canUnpublish();
$canEdit = $record->canEdit();
$canArchive = $record->canArchive();
// "save", supports an alternate state that is still clickable, but notifies the user that the action is not needed.
$noChangesClasses = 'btn-outline-primary font-icon-tick';
/** @var DataObject|Versioned|RecursivePublishable $liveRecord */
$liveRecord = Versioned::get_by_stage(get_class($record), Versioned::LIVE)->byID($record->ID);
$majorActions = $actions->fieldByName('MajorActions');
// "more options" action
$rootTabSet = TabSet::create('ActionMenus');
$moreOptions = Tab::create(
'MoreOptions',
_t(self::class . '.MoreOptions', 'More options', 'Expands a view for more buttons')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus noborder');
$infoTemplate = SSViewer::get_templates_by_class(get_class($record), '_Information', DataObject::class);
$moreOptions->push(
LiteralField::create(
'Information',
$record->customise([
'Live' => $liveRecord,
'ExistsOnLive' => $isPublished
])->renderWith($infoTemplate)
)
);
..., /app/vendor/silverstripe/versioned/src/VersionedGridFieldItemRequest.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Archive, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Versioned;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\View\ArrayData;
use SilverStripe\View\SSViewer;
/**
* Provides versioned dataobject support to {@see GridFieldDetailForm_ItemRequest}
*
* @property GridFieldDetailForm_ItemRequest $owner
*/
class VersionedGridFieldItemRequest extends GridFieldDetailForm_ItemRequest
{
/**
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
$status = $this->getRecordStatus();
$badge = null;
if ($status) {
// Generate badge
$badge = DBField::create_field('HTMLFragment', sprintf(
'<span class="badge version-status version-status--%s">%s</span>',
$status['class'],
$status['title']
));
}
$this->extend('updateBadge', $badge);
if ($badge) {
/** @var ArrayData $lastItem */
$lastItem = $items->last();
$lastItem->setField('Extra', $badge);
}
return $items;
}
/**
* @return FieldList
*/
protected function getFormActions()
{
// Check if record is versionable
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$ownerIsStaged = $record
&& $record->hasExtension(Versioned::class)
&& $record->hasStages();
$ownerRecursivePublishes = !$ownerIsStaged
&& $record
&& $record->hasExtension(RecursivePublishable::class)
&& $record->config()->get('owns');
// Add extra actions prior to extensions so that these can be modified too
if ($ownerIsStaged) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addVersionedButtons($record, $actions);
}
);
} elseif ($ownerRecursivePublishes) {
$this->beforeExtending(
'updateFormActions',
function (FieldList $actions) use ($record, $ownerIsStaged) {
$this->addUnversionedButtons($record, $actions);
}
);
}
return parent::getFormActions();
}
/**
* If a record is recursive publishable, but not versioned, all saves should trigger a recursive publish.
*
* @param array $data
* @param Form $form
* @return DataObject $record
*/
public function saveFormIntoRecord($data, $form)
{
$record = parent::saveFormIntoRecord($data, $form);
// Note: Don't publish if versioned, since that's a separate action
$ownerIsVersioned = $record && $record->hasExtension(Versioned::class);
$ownerIsPublishable = $record && $record->hasExtension(RecursivePublishable::class);
if ($ownerIsPublishable && !$ownerIsVersioned) {
/** @var RecursivePublishable $record */
$record->publishRecursive();
}
return $record;
}
/**
* Archive this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doArchive($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canArchive()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doArchive();
$message = _t(
__CLASS__ . '.Archived',
'Archived {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
//when an item is deleted, redirect to the parent controller
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBackLink(), 302); //redirect back to admin section
}
/**
* Publish this versioned record
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doPublish($data, $form)
{
/** @var Versioned|RecursivePublishable|DataObject $record */
$record = $this->getRecord();
$isNewRecord = $record->ID == 0;
// Check permission
if (!$record->canPublish()) {
return $this->httpError(403);
}
// Initial save and reload
$record = $this->saveFormIntoRecord($data, $form);
$record->publishRecursive();
$editURL = $this->Link('edit');
$xmlTitle = Convert::raw2xml($record->Title);
$link = "<a href=\"{$editURL}\">{$xmlTitle}</a>";
$message = _t(
__CLASS__ . '.Published',
'Published {name} {link}',
[
'name' => $record->i18n_singular_name(),
'link' => $link
]
);
$this->setFormMessage($form, $message);
return $this->redirectAfterSave($isNewRecord);
}
/**
* Delete this record from the live site
*
* @param array $data
* @param Form $form
* @return HTTPResponse
*/
public function doUnpublish($data, $form)
{
/** @var Versioned|DataObject $record */
$record = $this->getRecord();
if (!$record->canUnpublish()) {
return $this->httpError(403);
}
// Record name before it's deleted
$title = $record->Title;
$record->doUnpublish();
$message = _t(
__CLASS__ . '.Unpublished',
'Unpublished {name} {title}',
[
'name' => $record->i18n_singular_name(),
'title' => Convert::raw2xml($title)
]
);
$this->setFormMessage($form, $message);
// Redirect back to edit
return $this->redirectAfterSave(false);
}
/**
* @param Form $form
* @param string $message
*/
protected function setFormMessage($form, $message)
{
$form->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
$controller = $this->getToplevelController();
if ($controller->hasMethod('getEditForm')) {
/** @var Form $backForm */
$backForm = $controller->getEditForm();
$backForm->sessionMessage($message, 'good', ValidationResult::CAST_HTML);
}
}
/**
* Return list of class / title to add on the end of record status in breadcrumbs
*
* @return array|null
*/
protected function getRecordStatus()
{
/** @var DataObject|Versioned $record */
$record = $this->record;
// No status if un-versioned
if (!$this->record->hasExtension(Versioned::class)) {
return null;
}
if ($record->isOnDraftOnly()) {
return [
'class' => 'addedtodraft',
'title' => _t(__CLASS__ . '.DRAFT', 'Draft')
];
}
if ($record->isModifiedOnDraft()) {
return [
'class' => 'modified',
'title' => _t(__CLASS__ . '.MODIFIED', 'Modified')
];
}
return null;
}
/**
* Getting buttons that are for versioned objects
*
* @param DataObject|Versioned|RecursivePublishable $record
* @param FieldList $actions
*/
protected function addVersionedButtons(DataObject $record, FieldList $actions)
{
// Get status of the object
$isOnDraft = $record->isOnDraft();
$isPublished = $record->isPublished();
$stagesDiffer = $record->stagesDiffer();
// Check permissions
$canPublish = $record->canPublish();
$canUnpublish = $record->canUnpublish();
$canEdit = $record->canEdit();
$canArchive = $record->canArchive();
// "save", supports an alternate state that is still clickable, but notifies the user that the action is not needed.
$noChangesClasses = 'btn-outline-primary font-icon-tick';
/** @var DataObject|Versioned|RecursivePublishable $liveRecord */
$liveRecord = Versioned::get_by_stage(get_class($record), Versioned::LIVE)->byID($record->ID);
$majorActions = $actions->fieldByName('MajorActions');
// "more options" action
$rootTabSet = TabSet::create('ActionMenus');
$moreOptions = Tab::create(
'MoreOptions',
_t(self::class . '.MoreOptions', 'More options', 'Expands a view for more buttons')
);
$moreOptions->addExtraClass('popover-actions-simulate');
$rootTabSet->push($moreOptions);
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus noborder');
$infoTemplate = SSViewer::get_templates_by_class(get_class($record), '_Information', DataObject::class);
$moreOptions->push(
LiteralField::create(
'Information',
$record->customise([
'Live' => $liveRecord,
'ExistsOnLive' => $isPublished
])->renderWith($infoTemplate)
)
);
..., /app/vendor/silverstripe/versioned/src/VersionedGridFieldItemRequest.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\FormAction;
use SilverStripe\ORM\ArrayList;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;
class CMSProfileController extends LeftAndMain
{
private static $url_segment = 'myprofile';
private static $menu_title = 'My Profile';
private static $required_permission_codes = false;
private static $tree_class = Member::class;
public function getEditForm($id = null, $fields = null)
{
$this->setCurrentPageID(Security::getCurrentUser()->ID);
$form = parent::getEditForm($id, $fields);
if ($form instanceof HTTPResponse) {
return $form;
}
$form->Fields()->removeByName('LastVisited');
$form->Fields()->push(new HiddenField('ID', null, Security::getCurrentUser()->ID));
$form->Actions()->push(
FormAction::create('save', _t(CMSMain::class . '.SAVE', 'Save'))
->addExtraClass('btn-primary font-icon-save')
->setUseButtonTag(true)
);
$form->Actions()->removeByName('action_delete');
if ($member = Security::getCurrentUser()) {
$form->setValidator($member->getValidator());
} else {
$form->setValidator(Member::singleton()->getValidator());
}
if ($form->Fields()->hasTabSet()) {
$form->Fields()->findOrMakeTab('Root')->setTemplate('SilverStripe\\Forms\\CMSTabSet');
}
$form->addExtraClass('member-profile-form root-form cms-edit-form center fill-height');
return $form;
}
public function canView($member = null)
{
if (!$member && $member !== false) {
$member = Security::getCurrentUser();
}
// cms menus only for logged-in members
if (!$member) {
return false;
}
// Check they can access the CMS and that they are trying to edit themselves
if (Permission::checkMember($member, "CMS_ACCESS")
&& $member->ID === Security::getCurrentUser()->ID
) {
return true;
}
return false;
}
public function save($data, $form)
{
$member = Member::get()->byID($data['ID']);
if (!$member) {
return $this->httpError(404);
}
$origLocale = $member->Locale;
if (!$member->canEdit()) {
$form->sessionMessage(_t(__CLASS__.'.CANTEDIT', 'You don\'t have permission to do that'), 'bad');
return $this->redirectBack();
}
$response = parent::save($data, $form);
if (isset($data['Locale']) && $origLocale != $data['Locale']) {
$response->addHeader('X-Reload', true);
$response->addHeader('X-ControllerURL', $this->Link());
}
return $response;
}
/**
* Only show first element, as the profile form is limited to editing
* the current member it doesn't make much sense to show the member name
* in the breadcrumbs.
*
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
return new ArrayList([$items[0]]);
}
}
, /app/vendor/silverstripe/admin/code/CMSProfileController.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Save, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\FormAction;
use SilverStripe\ORM\ArrayList;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;
class CMSProfileController extends LeftAndMain
{
private static $url_segment = 'myprofile';
private static $menu_title = 'My Profile';
private static $required_permission_codes = false;
private static $tree_class = Member::class;
public function getEditForm($id = null, $fields = null)
{
$this->setCurrentPageID(Security::getCurrentUser()->ID);
$form = parent::getEditForm($id, $fields);
if ($form instanceof HTTPResponse) {
return $form;
}
$form->Fields()->removeByName('LastVisited');
$form->Fields()->push(new HiddenField('ID', null, Security::getCurrentUser()->ID));
$form->Actions()->push(
FormAction::create('save', _t(CMSMain::class . '.SAVE', 'Save'))
->addExtraClass('btn-primary font-icon-save')
->setUseButtonTag(true)
);
$form->Actions()->removeByName('action_delete');
if ($member = Security::getCurrentUser()) {
$form->setValidator($member->getValidator());
} else {
$form->setValidator(Member::singleton()->getValidator());
}
if ($form->Fields()->hasTabSet()) {
$form->Fields()->findOrMakeTab('Root')->setTemplate('SilverStripe\\Forms\\CMSTabSet');
}
$form->addExtraClass('member-profile-form root-form cms-edit-form center fill-height');
return $form;
}
public function canView($member = null)
{
if (!$member && $member !== false) {
$member = Security::getCurrentUser();
}
// cms menus only for logged-in members
if (!$member) {
return false;
}
// Check they can access the CMS and that they are trying to edit themselves
if (Permission::checkMember($member, "CMS_ACCESS")
&& $member->ID === Security::getCurrentUser()->ID
) {
return true;
}
return false;
}
public function save($data, $form)
{
$member = Member::get()->byID($data['ID']);
if (!$member) {
return $this->httpError(404);
}
$origLocale = $member->Locale;
if (!$member->canEdit()) {
$form->sessionMessage(_t(__CLASS__.'.CANTEDIT', 'You don\'t have permission to do that'), 'bad');
return $this->redirectBack();
}
$response = parent::save($data, $form);
if (isset($data['Locale']) && $origLocale != $data['Locale']) {
$response->addHeader('X-Reload', true);
$response->addHeader('X-ControllerURL', $this->Link());
}
return $response;
}
/**
* Only show first element, as the profile form is limited to editing
* the current member it doesn't make much sense to show the member name
* in the breadcrumbs.
*
* @param bool $unlinked
* @return ArrayList
*/
public function Breadcrumbs($unlinked = false)
{
$items = parent::Breadcrumbs($unlinked);
return new ArrayList([$items[0]]);
}
}
, /app/vendor/silverstripe/admin/code/CMSProfileController.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\GroupCsvBulkLoader;
/**
* Imports {@link Group} records by CSV upload, as defined in
* {@link GroupCsvBulkLoader}.
*/
class GroupImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import one or more groups in <em>CSV</em> format (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new GroupCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing groups are matched by their unique <em>Code</em> value, and updated with any new values from the '
. 'imported file</li>'
. '<li>Group hierarchies can be created by using a <em>ParentCode</em> column.</li>'
. '<li>Permission codes can be assigned by the <em>PermissionCode</em> column. Existing permission codes are not '
. 'cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
MemberImportForm::class . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(MemberImportForm::class . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new GroupCsvBulkLoader();
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} groups',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} groups',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} groups',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(MemberImportForm::class . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
}
, /app/vendor/silverstripe/admin/code/GroupImportForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key CSV File <small>(Allowed extensions: *.csv)</small>, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\GroupCsvBulkLoader;
/**
* Imports {@link Group} records by CSV upload, as defined in
* {@link GroupCsvBulkLoader}.
*/
class GroupImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import one or more groups in <em>CSV</em> format (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new GroupCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing groups are matched by their unique <em>Code</em> value, and updated with any new values from the '
. 'imported file</li>'
. '<li>Group hierarchies can be created by using a <em>ParentCode</em> column.</li>'
. '<li>Permission codes can be assigned by the <em>PermissionCode</em> column. Existing permission codes are not '
. 'cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
MemberImportForm::class . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(MemberImportForm::class . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new GroupCsvBulkLoader();
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} groups',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} groups',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} groups',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(MemberImportForm::class . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
}
, /app/vendor/silverstripe/admin/code/GroupImportForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\GroupCsvBulkLoader;
/**
* Imports {@link Group} records by CSV upload, as defined in
* {@link GroupCsvBulkLoader}.
*/
class GroupImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import one or more groups in <em>CSV</em> format (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new GroupCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing groups are matched by their unique <em>Code</em> value, and updated with any new values from the '
. 'imported file</li>'
. '<li>Group hierarchies can be created by using a <em>ParentCode</em> column.</li>'
. '<li>Permission codes can be assigned by the <em>PermissionCode</em> column. Existing permission codes are not '
. 'cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
MemberImportForm::class . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(MemberImportForm::class . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new GroupCsvBulkLoader();
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} groups',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} groups',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} groups',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(MemberImportForm::class . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
}
, /app/vendor/silverstripe/admin/code/GroupImportForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Import from CSV, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\GroupCsvBulkLoader;
/**
* Imports {@link Group} records by CSV upload, as defined in
* {@link GroupCsvBulkLoader}.
*/
class GroupImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import one or more groups in <em>CSV</em> format (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new GroupCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing groups are matched by their unique <em>Code</em> value, and updated with any new values from the '
. 'imported file</li>'
. '<li>Group hierarchies can be created by using a <em>ParentCode</em> column.</li>'
. '<li>Permission codes can be assigned by the <em>PermissionCode</em> column. Existing permission codes are not '
. 'cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
MemberImportForm::class . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(MemberImportForm::class . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new GroupCsvBulkLoader();
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} groups',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} groups',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} groups',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(MemberImportForm::class . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
}
, /app/vendor/silverstripe/admin/code/GroupImportForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\GroupCsvBulkLoader;
/**
* Imports {@link Group} records by CSV upload, as defined in
* {@link GroupCsvBulkLoader}.
*/
class GroupImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import one or more groups in <em>CSV</em> format (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new GroupCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing groups are matched by their unique <em>Code</em> value, and updated with any new values from the '
. 'imported file</li>'
. '<li>Group hierarchies can be created by using a <em>ParentCode</em> column.</li>'
. '<li>Permission codes can be assigned by the <em>PermissionCode</em> column. Existing permission codes are not '
. 'cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
MemberImportForm::class . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(MemberImportForm::class . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new GroupCsvBulkLoader();
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} groups',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} groups',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} groups',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(MemberImportForm::class . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
}
, /app/vendor/silverstripe/admin/code/GroupImportForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key No changes, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\GroupCsvBulkLoader;
/**
* Imports {@link Group} records by CSV upload, as defined in
* {@link GroupCsvBulkLoader}.
*/
class GroupImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import one or more groups in <em>CSV</em> format (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new GroupCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing groups are matched by their unique <em>Code</em> value, and updated with any new values from the '
. 'imported file</li>'
. '<li>Group hierarchies can be created by using a <em>ParentCode</em> column.</li>'
. '<li>Permission codes can be assigned by the <em>PermissionCode</em> column. Existing permission codes are not '
. 'cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
MemberImportForm::class . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(MemberImportForm::class . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new GroupCsvBulkLoader();
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} groups',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} groups',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} groups',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(MemberImportForm::class . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
}
, /app/vendor/silverstripe/admin/code/GroupImportForm.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Save, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Delete, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key CMS Access, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key CMS Access, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use BadMethodCallException;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\SilverStripeNavigator;
use SilverStripe\Control\ContentNegotiator;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
use SilverStripe\Control\PjaxResponseNegotiator;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\Core\Manifest\VersionProvider;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\HTMLEditor\HTMLEditorConfig;
use SilverStripe\Forms\HTMLEditor\TinyMCEConfig;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\PrintableTransformation;
use SilverStripe\Forms\Schema\FormSchema;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\Hierarchy\Hierarchy;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\Security\SecurityToken;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use SilverStripe\View\SSViewer;
/**
* LeftAndMain is the parent class of all the two-pane views in the CMS.
* If you are wanting to add more areas to the CMS, you can do it by subclassing LeftAndMain.
*
* This is essentially an abstract class which should be subclassed.
* See {@link CMSMain} for a good example.
*/
class LeftAndMain extends Controller implements PermissionProvider
{
/**
* Form schema header identifier
*/
const SCHEMA_HEADER = 'X-Formschema-Request';
/**
* Enable front-end debugging (increases verbosity) in dev mode.
* Will be ignored in live environments.
*
* @var bool
*/
private static $client_debugging = true;
/**
* The current url segment attached to the LeftAndMain instance
*
* @config
* @var string
*/
private static $url_segment = null;
/**
* @config
* @var string Used by {@link AdminRootController} to augment Director route rules for sub-classes of LeftAndMain
*/
private static $url_rule = '/$Action/$ID/$OtherID';
/**
* @config
* @var string
*/
private static $menu_title;
/**
* @config
* @var string
*/
private static $menu_icon;
/**
* @config
* @var int
*/
private static $menu_priority = 0;
/**
* @config
* @var int
*/
private static $url_priority = 50;
/**
* A subclass of {@link DataObject}.
*
* Determines what is managed in this interface, through
* {@link getEditForm()} and other logic.
*
* @config
* @var string
*/
private static $tree_class = null;
/**
* @deprecated 1.12.0 Use $help_links instead
*
* @config
* @var string
*/
private static $help_link = '';
/**
* @var array
*/
private static $allowed_actions = [
'index',
'save',
'printable',
'show',
'Modals',
'EditForm',
'AddForm',
'batchactions',
'BatchActionsForm',
'schema',
'methodSchema',
];
private static $url_handlers = [
'GET schema/$FormName/$ItemID/$OtherItemID' => 'schema',
'GET methodSchema/$Method/$FormName/$ItemID' => 'methodSchema',
];
private static $dependencies = [
'FormSchema' => '%$' . FormSchema::class,
'VersionProvider' => '%$' . VersionProvider::class,
];
/**
* Current form schema helper
*
* @var FormSchema
*/
protected $schema = null;
/**
* Current pageID for this request
*
* @var null
*/
protected $pageID = null;
/**
* Set by {@link LeftAndMainErrorExtension} if an http error occurs
*/
private string $httpErrorMessage;
/**
* Used to allow errors to be displayed using a front-end template
*/
private bool $suppressAdminErrorContext = false;
/**
* Assign themes to use for cms
*
* @config
* @var array
*/
private static $admin_themes = [
'silverstripe/admin:cms-forms',
SSViewer::DEFAULT_THEME,
];
/**
* Codes which are required from the current user to view this controller.
* If multiple codes are provided, all of them are required.
* All CMS controllers require "CMS_ACCESS_LeftAndMain" as a baseline check,
* and fall back to "CMS_ACCESS_<class>" if no permissions are defined here.
* See {@link canView()} for more details on permission checks.
*
* @config
* @var array
*/
private static $required_permission_codes;
/**
* Namespace for session info, e.g. current record.
* Defaults to the current class name, but can be amended to share a namespace in case
* controllers are logically bundled together, and mainly separated
* to achieve more flexible templating.
*
* @config
* @var string
*/
private static $session_namespace;
/**
* Register additional requirements through the {@link Requirements} class.
* Used mainly to work around the missing "lazy loading" functionality
* for getting css/javascript required after an ajax-call (e.g. loading the editform).
*
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_javascript:
* - mysite/javascript/myscript.js
* mysite/javascript/anotherscript.js:
* defer: true
* </code>
*
* @config
* @var array
*/
private static $extra_requirements_javascript = [];
/**
* YAML configuration example:
* <code>
* LeftAndMain:
* extra_requirements_css:
* mysite/css/mystyle.css:
* media: screen
* </code>
*
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_css = [];
/**
* @config
* @var array See {@link extra_requirements_javascript}
*/
private static $extra_requirements_themedCss = [];
/**
* If true, call a keepalive ping every 5 minutes from the CMS interface,
* to ensure that the session never dies.
*
* @config
* @var bool
*/
private static $session_keepalive_ping = true;
/**
* Value of X-Frame-Options header
*
* @config
* @var string
*/
private static $frame_options = 'SAMEORIGIN';
/**
* The configuration passed to the supporting JS for each CMS section includes a 'name' key
* that by default matches the FQCN of the current class. This setting allows you to change
* the key if necessary (for example, if you are overloading CMSMain or another core class
* and want to keep the core JS - which depends on the core class names - functioning, you
* would need to set this to the FQCN of the class you are overloading).
*
* @config
* @var string|null
*/
private static $section_name = null;
/**
* @var PjaxResponseNegotiator
*/
protected $responseNegotiator;
/**
* @var VersionProvider
*/
protected $versionProvider;
/**
* Gets the combined configuration of all LeftAndMain subclasses required by the client app.
*
* @return string
*
* WARNING: Experimental API
*/
public function getCombinedClientConfig()
{
$combinedClientConfig = ['sections' => []];
$cmsClassNames = CMSMenu::get_cms_classes(LeftAndMain::class, true, CMSMenu::URL_PRIORITY);
// append LeftAndMain to the list as well
$cmsClassNames[] = LeftAndMain::class;
foreach ($cmsClassNames as $className) {
$combinedClientConfig['sections'][] = Injector::inst()->get($className)->getClientConfig();
}
// Pass in base url (absolute and relative)
$combinedClientConfig['baseUrl'] = Director::baseURL();
$combinedClientConfig['absoluteBaseUrl'] = Director::absoluteBaseURL();
$combinedClientConfig['adminUrl'] = AdminRootController::admin_url();
// Get "global" CSRF token for use in JavaScript
$token = SecurityToken::inst();
$combinedClientConfig[$token->getName()] = $token->getValue();
// Set env
$combinedClientConfig['environment'] = Director::get_environment_type();
$combinedClientConfig['debugging'] = LeftAndMain::config()->uninherited('client_debugging');
return json_encode($combinedClientConfig);
}
/**
* Returns configuration required by the client app.
*
* @return array
*
* WARNING: Experimental API
*/
public function getClientConfig()
{
// Allows the section name to be overridden in config
$name = $this->config()->get('section_name');
if (!$name) {
$name = static::class;
}
$clientConfig = [
// Trim leading/trailing slash to make it easier to concatenate URL
..., /app/vendor/silverstripe/admin/code/LeftAndMain.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Access to '{title}' section, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key CMS Access, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Roles and access permissions, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 669 // Evaluate __CLASS__ . '.KEY' and self::class concatenation
670 $text = implode('\\', $currentClass);
671 } else {
672 continue;
673 }
674
675 if ($inConcat) {
676 // Parser error
677 if (empty($currentEntity)) {
678 user_error('Error concatenating localisation key', E_USER_WARNING);
679 } else {
680 $currentEntity[count($currentEntity) - 1] .= $text;
681 }
682 } else {
683 $currentEntity[] = $text;
684 }
Trace Error concatenating localisation key
i18nTextCollector.php:678
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 738 $entity = ['default' => $default];
739 } else {
740 $entity = $default;
741 }
742 if ($comment) {
743 $entity['comment'] = $comment;
744 }
745 $entities[$key] = $entity;
746 } elseif ($this->getWarnOnEmptyDefault()) {
747 trigger_error("Missing localisation default for key " . $currentEntity[0], E_USER_NOTICE);
748 }
749 }
750 $currentEntity = [];
751 $inArrayClosedBy = false;
752 break;
753 }
Trace trigger_error(Missing localisation default for key Roles and access permissions, 1024)
i18nTextCollector.php:747
SilverStripe\i18n\TextCollection\i18nTextCollector->collectFromCode(<?php
namespace SilverStripe\Admin;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldImportButton;
use SilverStripe\Forms\GridField\GridFieldPageCount;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\PermissionRole;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* Security section of the CMS
*/
class SecurityAdmin extends LeftAndMain implements PermissionProvider
{
private static $url_segment = 'security';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $menu_title = 'Security';
private static $tree_class = Group::class;
private static $subitem_class = Member::class;
private static $required_permission_codes = 'CMS_ACCESS_SecurityAdmin';
private static $menu_icon_class = 'font-icon-torsos-all';
private static $allowed_actions = [
'EditForm',
'MemberImportForm',
'memberimport',
'GroupImportForm',
'groupimport',
'groups',
'users',
'roles'
];
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function users($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function groups($request)
{
return $this->index($request);
}
/**
* Shortcut action for setting the correct active tab.
*
* @param HTTPRequest $request
* @return HTTPResponse
*/
public function roles($request)
{
return $this->index($request);
}
public function getEditForm($id = null, $fields = null)
{
// Build gridfield configs
$memberListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
$groupListConfig = GridFieldConfig_RecordEditor::create()
->addComponent(Injector::inst()->createWithArgs(GridFieldExportButton::class, ['buttons-before-left']));
/** @var GridFieldDetailForm $detailForm */
$detailForm = $memberListConfig->getComponentByType(GridFieldDetailForm::class);
$memberValidator = Member::singleton()->getValidator();
$detailForm->setValidator($memberValidator);
/** @var GridFieldPageCount $groupPaginator */
$groupListConfig->removeComponentsByType(GridFieldPageCount::class);
$groupListConfig->addComponent(Injector::inst()->createWithArgs(GridFieldPageCount::class, ['buttons-before-right']));
// Add import capabilities. Limit to admin since the import logic can affect assigned permissions
if (Permission::check('ADMIN')) {
// @todo when grid field is converted to react use the react component
$memberListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('memberimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTUSERS', 'Import users'))
);
$groupListConfig->addComponent(
GridFieldImportButton::create('buttons-before-left')
->setImportIframe($this->Link('groupimport'))
->setModalTitle(_t(__CLASS__ . '.IMPORTGROUPS', 'Import groups'))
);
}
// Build gridfield
$memberList = GridField::create(
'Members',
false,
Member::get(),
$memberListConfig
)->addExtraClass("members_grid");
// Build group fields
$groupList = GridField::create(
'Groups',
false,
Group::get(),
$groupListConfig
);
/** @var GridFieldDataColumns $columns */
$columns = $groupList->getConfig()->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields([
'Breadcrumbs' => Group::singleton()->fieldLabel('Title')
]);
$columns->setFieldFormatting([
'Breadcrumbs' => function ($val, $item) {
/** @var Group $item */
return Convert::raw2xml($item->getBreadcrumbs(' > '));
}
]);
$fields = FieldList::create(
TabSet::create(
'Root',
Tab::create(
'Users',
_t(__CLASS__ . '.Users', 'Users'),
LiteralField::create(
'MembersCautionText',
sprintf(
'<div class="alert alert-warning" role="alert">%s</div>',
_t(
__CLASS__ . '.MemberListCaution',
'Caution: Removing members from this list will remove them from all groups and the database'
)
)
),
$memberList
),
Tab::create(
'Groups',
Group::singleton()->i18n_plural_name(),
$groupList
)
)->setTemplate('SilverStripe\\Forms\\CMSTabSet'),
// necessary for tree node selection in LeftAndMain.EditForm.js
new HiddenField('ID', false, 0)
);
// Add roles editing interface
$rolesTab = null;
if (Permission::check('APPLY_ROLES')) {
$rolesField = GridField::create(
'Roles',
false,
PermissionRole::get(),
GridFieldConfig_RecordEditor::create()
);
$rolesTab = $fields->findOrMakeTab('Root.Roles', _t(__CLASS__ . '.TABROLES', 'Roles'));
$rolesTab->push($rolesField);
}
// Build replacement form
$form = Form::create(
$this,
'EditForm',
$fields,
new FieldList()
)->setHTMLID('Form_EditForm');
$form->addExtraClass('cms-edit-form fill-height');
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
$form->addExtraClass('ss-tabset cms-tabset ' . $this->BaseCSSClasses());
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
$this->extend('updateEditForm', $form);
return $form;
}
public function memberimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Form' => $this->MemberImportForm()->forTemplate(),
'Content' => ' '
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @return Form
*/
public function MemberImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
/** @var Group $group */
$group = $this->currentPage();
$form = new MemberImportForm($this, __FUNCTION__);
$form->setGroup($group);
return $form;
}
public function groupimport()
{
Requirements::clear();
Requirements::javascript('silverstripe/admin: client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin: client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
return $this->renderWith('BlankPage', [
'Content' => ' ',
'Form' => $this->GroupImportForm()->forTemplate()
]);
}
/**
* @see SecurityAdmin_MemberImportForm
*
* @skipUpgrade
* @return Form
*/
public function GroupImportForm()
{
if (!Permission::check('ADMIN')) {
return null;
}
return new GroupImportForm($this, __FUNCTION__);
}
/**
* Disable GridFieldDetailForm backlinks for this view, as its
*/
public function Backlink()
{
return false;
}
public function Breadcrumbs($unlinked = false)
{
$crumbs = parent::Breadcrumbs($unlinked);
// Name root breadcrumb based on which record is edited,
// which can only be determined by looking for the fieldname of the GridField.
// Note: Titles should be same titles as tabs in RootForm().
$params = $this->getRequest()->allParams();
if (isset($params['FieldName'])) {
// TODO FieldName param gets overwritten by nested GridFields,
// so shows "Members" rather than "Groups" for the following URL:
// admin/security/EditForm/field/Groups/item/2/ItemEditForm/field/Members/item/1/edit
$firstCrumb = $crumbs->shift();
if ($params['FieldName'] == 'Groups') {
$crumbs->unshift(new ArrayData([
'Title' => Group::singleton()->i18n_p..., /app/vendor/silverstripe/admin/code/SecurityAdmin.php, SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:485
SilverStripe\i18n\TextCollection\i18nTextCollector->processModule(SilverStripe\Core\Manifest\Module)
i18nTextCollector.php:402
SilverStripe\i18n\TextCollection\i18nTextCollector->getEntitiesByModule()
i18nTextCollector.php:200
SilverStripe\i18n\TextCollection\i18nTextCollector->collect(, 1)
i18nTextCollector.php:172
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
Duplicate key SiteTree.TABMAIN detected in no / multiple modules with no obvious owner
GET /dev/tasks/i18nTextCollectorTask Source 48 Filesystem::makeFolder($langFolder);
49 touch($langFolder . '/_manifest_exclude');
50 }
51
52 // De-normalise messages and convert to yml
53 $content = $this->getYaml($messages, $locale);
54
55 // Open the English file and write the Master String Table
56 $langFile = $langFolder . '/' . $locale . '.yml';
57 if ($fh = fopen($langFile ?? '', "w")) {
58 fwrite($fh, $content ?? '');
59 fclose($fh);
60 } else {
61 throw new LogicException("Cannot write language file! Please check permissions of $langFile");
62 }
63 }
Trace fopen(/app/app/lang/en.yml, w)
YamlWriter.php:57
SilverStripe\i18n\Messages\YamlWriter->write(Array, en, /app/app)
i18nTextCollector.php:460
SilverStripe\i18n\TextCollection\i18nTextCollector->write(SilverStripe\Core\Manifest\Module, Array)
i18nTextCollector.php:187
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26
GET /dev/tasks/i18nTextCollectorTask Source 52 // De-normalise messages and convert to yml
53 $content = $this->getYaml($messages, $locale);
54
55 // Open the English file and write the Master String Table
56 $langFile = $langFolder . '/' . $locale . '.yml';
57 if ($fh = fopen($langFile ?? '', "w")) {
58 fwrite($fh, $content ?? '');
59 fclose($fh);
60 } else {
61 throw new LogicException("Cannot write language file! Please check permissions of $langFile");
62 }
63 }
64
65 /**
66 * Explodes [class.key1 => value1, class.key2 => value2] into [class => [ key1 => value1, key2 => value2]]
67 *
Trace SilverStripe\i18n\Messages\YamlWriter->write(Array, en, /app/app)
i18nTextCollector.php:460
SilverStripe\i18n\TextCollection\i18nTextCollector->write(SilverStripe\Core\Manifest\Module, Array)
i18nTextCollector.php:187
SilverStripe\i18n\TextCollection\i18nTextCollector->run(, 1)
i18nTextCollectorTask.php:61
SilverStripe\Dev\Tasks\i18nTextCollectorTask->run(SilverStripe\Control\HTTPRequest)
TaskRunner.php:127
SilverStripe\Dev\TaskRunner->runTask(SilverStripe\Control\HTTPRequest)
RequestHandler.php:323
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, runTask)
Controller.php:286
SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, runTask)
RequestHandler.php:202
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
RequestHandler.php:226
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
Controller.php:212
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
Director.php:360
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
VersionedHTTPMiddleware.php:41
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LoginSessionMiddleware.php:29
SilverStripe\SessionManager\Middleware\LoginSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
LocaleSwitchRedirector.php:25
TractorCow\Fluent\Middleware\LocaleSwitchRedirector->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DetectLocaleMiddleware.php:122
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
DetectLocaleMiddleware.php:123
TractorCow\Fluent\Middleware\DetectLocaleMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
InitStateMiddleware.php:51
TractorCow\Fluent\Middleware\InitStateMiddleware->TractorCow\Fluent\Middleware\{closure}(TractorCow\Fluent\State\FluentState)
FluentState.php:152
TractorCow\Fluent\State\FluentState->withState(Closure)
InitStateMiddleware.php:52
TractorCow\Fluent\Middleware\InitStateMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
DebugBarMiddleware.php:19
LeKoala\DebugBar\Middleware\DebugBarMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ExecMetricMiddleware.php:20
SilverStripe\Control\Middleware\ExecMetricMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ConfirmationMiddleware.php:254
SilverStripe\Control\Middleware\ConfirmationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
PasswordExpirationMiddleware.php:84
SilverStripe\Security\PasswordExpirationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
BasicAuthMiddleware.php:68
SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AuthenticationMiddleware.php:61
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
CanonicalURLMiddleware.php:190
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPCacheControlMiddleware.php:42
SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
ChangeDetectionMiddleware.php:28
SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
FlushMiddleware.php:27
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
RequestProcessor.php:67
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HybridSessionMiddleware.php:18
SilverStripe\HybridSessions\Control\HybridSessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
AllowedHostsMiddleware.php:60
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
TrustedProxyMiddleware.php:176
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
Director.php:369
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
HTTPApplication.php:117
SilverStripe\Control\HTTPApplication::SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
HTTPApplication.php:136
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
call_user_func(Closure, SilverStripe\Control\HTTPRequest)
ErrorControlChainMiddleware.php:67
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
HTTPMiddlewareAware.php:62
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
HTTPMiddlewareAware.php:65
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
HTTPApplication.php:137
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, )
HTTPApplication.php:116
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
index.php:26