Ad

Custom Aspect For Routing Not Working As Expected

- 1 answer

I have coded a custom aspect which should just pass back, what it gets. This is working partly:

Working

?tx_myvender_users[action]=list&tx_myvender_users[company]=Company 1&tx_myvender_users[controller]=FrontendUser&tx_myvender_users[department]=SelectedDepartment&cHash=5413de3c7ca7efda6da4e9bb3a918945

Translates to

company-1/department/SelectedDepartment/

Not working with pagination

?tx_myvender_users[%40widget_0][currentPage]=2&tx_myvender_users[action]=list&tx_myvender_users[company]=Company 1&tx_myvender_users[controller]=FrontendUser&tx_myvender_users[department]=SelectedDepartment&cHash=e8196678ef65f1c4d5423b617505f840

Translates to

company-1/department/SelectedDepartment/2/

but it passes SelectedDepartment/2/ for the argument department and I don't get why. I would expect SelectedDepartment for department and 2 for the argument @widget_0/currentPage.

Here is my routes configuration in config.yaml:

routes: {  }
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    default: /
    index: ''
    map:
      /: 0
  FeusersPlugin:
    type: Extbase
    extension: MyVendor
    plugin: Users
    limitToPages: [3]
    defaultController: 'FrontendUser::list'
    requirements:
      company_page: '\d+'
    routes:
      - routePath: '{company_title}/department/{department_title}'
        _controller: 'FrontendUser::list'
        _arguments:
          company_title: 'company'
          department_title: 'department'
      - routePath: '{company_title}/department/{department_title}/{company_page}'
        _controller: 'FrontendUser::list'
        _arguments:
          company_title: 'company'
          department_title: 'department'
          company_page: '@widget_0/currentPage'
    aspects:
      company_title:
        type: StaticValueMapper
        map:
          company-1: 'Company 1'
          company-2: 'Company 2'
      department_title:
        type: DepartmentStaticMapper
      company_page:
        type: StaticRangeMapper
        start: '1'
        end: '100'

And this is my DepartmentStaticMapper which is passing back what it gets:

namespace MyVendor\Extension\Routing\Aspect;

use TYPO3\CMS\Core\Routing\Aspect\StaticMappableAspectInterface;


class DepartmentStaticMapper implements StaticMappableAspectInterface
{
    protected $settings;

    public function __construct(array $settings)
    {
        $this->settings = $settings;
    }

    public function generate(string $value): ?string
    {
        return $value;
    }

    public function resolve(string $value): ?string
    {
        return $value;
    }
}
Ad

Answer

Changing the class DepartmentStaticMapper to the following, solved my problem. I have just added a check for a slash in public function resolve(string $value):

namespace MyVendor\Extension\Routing\Aspect;

use TYPO3\CMS\Core\Routing\Aspect\StaticMappableAspectInterface;


class DepartmentStaticMapper implements StaticMappableAspectInterface
{
    protected $settings;

    public function __construct(array $settings)
    {
        $this->settings = $settings;
    }

    public function generate(string $value): ?string
    {
        return $value;
    }

    public function resolve(string $value): ?string
    {
        return strstr($value, '/') ? null : $value;
    }
}
Ad
source: stackoverflow.com
Ad