Feature #86216

Allow empty slug for root pages and sysfolders

Added by Georg Tiefenbrunn 10 months ago. Updated 5 months ago.

Status:
New
Priority:
Must have
Assignee:
-
Category:
Link Handling, Site Handling & Routing
Start date:
2018-09-10
Due date:
% Done:

0%

PHP Version:
Tags:
Complexity:
Sprint Focus:

Description

Consider following page tree (TYPO3 CMS 9.4 composer):

TYPO3 [0]
+ Root [1]
  + General Storage [2]
    + News [3]
    + ...
  + Websites [4]
    + Website 1 [5]
      + Folder [6]
        + Imprint [7]
    + Website 2 [8]
  • Page Root [1] has a domain record 'typo3.example.org' to provide one easy entry point for the CMS instance. It's an external link to '/typo3'.
  • News records are stored in Root > General Storage > News [3] (e.g. no need for news authors to see 'Websites')
  • Pages Website 1 [5] and Website 2 [8] have both is_siteroot=1 and a valid site configuration

I'm missing RealURL's 'Exclude from Speaking URL' setting:

Empty slug for root pages

Pages Website 1 [5] and Website 2 [8] can't have slug=/. Saving slug=/ results e.g. in slug=/1. Recalculating the slug will produce slug=/websites/{pageName}.

As an Integrator/Editor it should be possible to create "base slugs" (slug=/ ) for pages with is_siteroot=1.

Empty slug for sysfolders

To e.g. exclude pages from the main nav menu but include it them in some other menu (e.g. 'legal links') and keep a short URL page Imprint [7] is placed inside Folder [6].

As an Integrator/Editor it should be possible to create "empty slugs" (slug=/ ) for sysfolders.


Related issues

Related to TYPO3 Core - Epic #84728: Introduce speaking URLs for pages Closed 2018-08-22
Related to TYPO3 Core - Bug #86456: Skip special doktype parent pages in slug generation Closed 2018-09-29

History

#1 Updated by Georg Tiefenbrunn 10 months ago

  • Related to Epic #84728: Introduce speaking URLs for pages added

#2 Updated by Georg Ringer 10 months ago

  • Status changed from New to Needs Feedback

You know that you can edit the full slug and change it for the imprint directory to /imprint?

Having empty slugs is a bad idea as it creates other problems like what if you change a sysfolder to a page again and vice versa?

Is it fine to close the issue?

#3 Updated by Georg Tiefenbrunn 9 months ago

Georg Ringer wrote:

You know that you can edit the full slug and change it for the imprint directory to /imprint?

Yes. But please consider the following from an editor's view:

With RealURL's 'Exclude from Speaking URL' setting

  • Apply 'Exclude from Speaking URL' to Folder [6]
  • Put all pages which should be included in main menu inside Website 1 [5]
  • Put all pages which should no be included in main menu inside Folder [6]
Result:
  • All subpages of Folder [6] will be available via /slug without further configuration
  • All subpages of Folder [6] won't be included in main menu without further configuration

V9 slugs

  • You have to manually edit the /slug for all subpages of Folder [6]

#4 Updated by Georg Tiefenbrunn 9 months ago

Georg Ringer wrote:

Having empty slugs is a bad idea as it creates other problems like what if you change a sysfolder to a page again and vice versa?

TL;DR: Website root pages (is_siteroot=1) should have slug=/ regardless of pages.pid

The more important part is slug generation for website root pages (is_siteroot=1) which are not direct children of TYPO3 [0].

One of the key features of TYPO3 is its ability to handle multi site and multi domain instances. With the current slug creation we are forced to place website root pages below TYPO3 [0] (= I found no other way than to place all website root pages below TYPO3 [0]. As soon as they are placed inside a sysfolder the slug of this folder will be added to all page slugs).

My way of implementing multi domain instances which mostly share a lot of non page related stuff as news, events, addresses, etc. is to use the above described structure:

  • Put all Websites into a sysfolder (Websites [4]) and assign only one db mount to users which may edit pages/page content.
  • Put all non-page related records in a sysfolder (General Storage [2])

Using this method all users have the same page tree (with branches corresponding to their user rights). Admin and power users can quickly close all page related stuff by closing the Websites [4] subfolder.

#5 Updated by Susanne Moog 9 months ago

  • Category set to Link Handling, Site Handling & Routing

#6 Updated by Benni Mack 9 months ago

  • Related to Bug #86456: Skip special doktype parent pages in slug generation added

#7 Updated by Benni Mack 9 months ago

Hey all,

I hope this one fixes at least one big pain point - namely to exclude sys_folders when creating new subpages.

#8 Updated by Benni Mack 9 months ago

  • Target version changed from 9 LTS to Candidate for patchlevel

#9 Updated by Jan Kornblum 8 months ago

  • Priority changed from Should have to Must have

Without the possibility to have empty slugs for rootpages in multidomain environments, for me it seems to be impossible to get my just upgraded instance live. In addition, i cannot call a domain itself by http://domain.tld (error page not found), currently it must be called as http://domain.tld/1 (this slug again). I think this is really an important (must have) issue...

#10 Updated by Georg Tiefenbrunn 7 months ago

My current workaround to prevent '/{int}' slugs on pages not having pages.pid=0 is to use a DataHandler hook ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']) and always set $fieldArray['slug'] = '/' using a processDatamap_postProcessFieldArray() function if pages.is_siteroot=1:

Register the hook in ext_localconf.php

    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['myext_pages'] =
        \Vendor\Myext\Hooks\DataHandler\PagesManipulation::class;

Class myext/Classes/Hooks/DataHandler/PagesManipulation.php

<?php
declare(strict_types=1);

namespace Vendor\Myext\Hooks\DataHandler;

use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\DataHandling\DataHandler;

class PagesManipulation
{
    /**
     * This method is called by a hook after a record was saved in the BE.
     *
     * @param string        $status
     * @param string        $table
     * @param int           $id
     * @param array         $fieldArray
     * @param DataHandler   $dataHandler
     */
    public function processDatamap_postProcessFieldArray($status, $table, $id, &$fieldArray, &$dataHandler)
    {
        if ('pages' === $table && 'update' === $status) {
            $record = BackendUtility::getRecord('pages', (int)$id, 'is_siteroot');
            if (
                true === isset($record['is_siteroot'])
                && 1 === (int)$record['is_siteroot']
            ) {
                // Set 'slug' to '/'
                $fieldArray['slug'] = '/';
            }
        }
    }
}

#11 Updated by Heiko Nöthen 6 months ago

We also use nested root-pages (for access rights / bread crumb creation) in TYPO3 before version 9 and we also need to create urls like site.com/ site2.com/. It should be possible to add / as slug for all pages with "is_siteroot=1" regardless if it is a direct child of [0]. Can't see why this should be a problem. The slug / is unique in every domain.

#12 Updated by Riccardo De Contardi 5 months ago

Has this one been solved with https://review.typo3.org/#/c/58473/ ?

#13 Updated by Georg Tiefenbrunn 5 months ago

Riccardo De Contardi wrote:

Has this one been solved with https://review.typo3.org/#/c/58473/ ?

As Benny wrote, only the sysfolder part got fixes.

To-Do: Website root pages (is_siteroot=1) should have slug=/ regardless of pages.pid.

#14 Updated by Riccardo De Contardi 5 months ago

  • Status changed from Needs Feedback to New

Also available in: Atom PDF