Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/5'
Browse files Browse the repository at this point in the history
  • Loading branch information
tractorcow committed Apr 20, 2021
2 parents 8a65374 + 6130ada commit 5efbbd3
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 1 deletion.
1 change: 1 addition & 0 deletions _config/routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ SilverStripe\Core\Injector\Injector:
Middlewares:
InitStateMiddleware: '%$TractorCow\Fluent\Middleware\InitStateMiddleware'
DetectLocaleMiddleware: '%$TractorCow\Fluent\Middleware\DetectLocaleMiddleware'
LocaleSwitchRedirector: '%$TractorCow\Fluent\Middleware\LocaleSwitchRedirector'
1 change: 0 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ localisations, or being a part of the contributing team, please see
* [Localised copy](docs/en/localised-copy.md)
* [Versioned history](docs/en/versioned-history.md)
* [Migrating from Translatable](docs/en/migrating-from-translatable.md)
* [Changelogs](CHANGELOG.md)

## Translations

Expand Down
58 changes: 58 additions & 0 deletions src/Middleware/LocaleSwitchRedirector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace TractorCow\Fluent\Middleware;

use SilverStripe\Admin\AdminRootController;
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\HTTPMiddleware;
use TractorCow\Fluent\Extension\FluentDirectorExtension;
use TractorCow\Fluent\State\FluentState;

/**
* This middleware will safely redirect you to the cms landing page when switching locales,
* in case you were viewing a url that does not apply to the new locale.
*/
class LocaleSwitchRedirector implements HTTPMiddleware
{
public function process(HTTPRequest $request, callable $delegate)
{
// Get and capture any possible errors
try {
$response = $delegate($request);
} catch (HTTPResponse_Exception $ex) {
$response = $ex->getResponse();
}

// Check if this is a 404 error attempting when switching locales in the CMS
$state = FluentState::singleton();
if ($response->getStatusCode() === 404
&& !$state->getIsFrontend()
&& $this->getParamLocale($request)
) {
// Redirect to the CMS home page if the requested page doesn't exist
$response = new HTTPResponse();
$response->redirect(Controller::join_links(
Director::baseURL(),
AdminRootController::admin_url()
));
}

return $response;
}

/**
* Get locale from the query_param
*
* @param HTTPRequest $request
* @return mixed
*/
protected function getParamLocale(HTTPRequest $request)
{
$queryParam = FluentDirectorExtension::config()->get('query_param');
return (string)($request->param($queryParam) ?: $request->requestVar($queryParam));
}
}
64 changes: 64 additions & 0 deletions src/Model/Locale.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@
use SilverStripe\ORM\DB;
use SilverStripe\ORM\HasManyList;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use Symbiote\GridFieldExtensions\GridFieldAddNewInlineButton;
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
use TractorCow\Fluent\Control\LocaleAdmin;
use TractorCow\Fluent\Extension\FluentDirectorExtension;
use TractorCow\Fluent\Extension\Traits\FluentObjectTrait;
use TractorCow\Fluent\State\FluentState;
Expand Down Expand Up @@ -626,4 +629,65 @@ public function providePermissions()
}
return $permissions;
}


/**
* @param Member $member
* @return boolean
*/
public function canView($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return Permission::check('CMS_ACCESS', 'any', $member);
}

/**
* @param Member $member
* @return boolean
*/
public function canEdit($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}

// Access locale admin permission
return LocaleAdmin::singleton()->canView($member);
}

/**
* @param Member $member
* @return boolean
*/
public function canDelete($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}

// Access locale admin permission
return LocaleAdmin::singleton()->canView($member);
}

/**
* @param Member $member
* @param array $context Additional context-specific data which might
* affect whether (or where) this object could be created.
* @return boolean
*/
public function canCreate($member = null, $context = [])
{
$extended = $this->extendedCan(__FUNCTION__, $member, $context);
if ($extended !== null) {
return $extended;
}

// Access locale admin permission
return LocaleAdmin::singleton()->canView($member);
}
}

0 comments on commit 5efbbd3

Please sign in to comment.