http://forge.typo3.org/
http://forge.typo3.org/themes/typo3_forge/favicon/favicon.png?1705866169
2019-01-16T13:34:04Z
TYPO3 Forge
TYPO3 Core - Bug #87454: Slug/URL segment - /1 is wrongly saved, when trying to set / on rootpage.
http://forge.typo3.org/issues/87454?journal_id=393650
2019-01-16T13:34:04Z
Stig Nørgaard Færch
<ul><li><strong>Category</strong> changed from <i>DataHandler aka TCEmain</i> to <i>Link Handling, Site Handling & Routing</i></li></ul>
TYPO3 Core - Bug #87454: Slug/URL segment - /1 is wrongly saved, when trying to set / on rootpage.
http://forge.typo3.org/issues/87454?journal_id=396591
2019-03-12T16:26:33Z
Guido Schmechel
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/87884">Bug #87884</a>: Root page of page tree suddenly gets slug "/1"</i> added</li></ul>
TYPO3 Core - Bug #87454: Slug/URL segment - /1 is wrongly saved, when trying to set / on rootpage.
http://forge.typo3.org/issues/87454?journal_id=399382
2019-04-30T23:35:23Z
Riccardo De Contardi
erredeco@gmail.com
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-5 priority-3 priority-lowest closed" href="/issues/86727">Bug #86727</a>: Numeric in slugs on multidomain instances.</i> added</li></ul>
TYPO3 Core - Bug #87454: Slug/URL segment - /1 is wrongly saved, when trying to set / on rootpage.
http://forge.typo3.org/issues/87454?journal_id=404020
2019-07-30T12:03:13Z
Stefan Neufeind
typo3.neufeind@speedpartner.de
<ul></ul><p>Still an issue. Manually adjusting the slug in the database works, as expected.</p>
TYPO3 Core - Bug #87454: Slug/URL segment - /1 is wrongly saved, when trying to set / on rootpage.
http://forge.typo3.org/issues/87454?journal_id=404672
2019-08-12T13:24:38Z
Stefan Busemann
stefan.busemann@in2code.de
<ul></ul><p>I can confirm the issue.</p>
<p><strong>Our setup:</strong></p>
<ul>
<li>default lang: de / no language slug</li>
<li>overlay: en / en as language slug</li>
</ul>
<p>If I go the root page (in default language - pid 1) and click "recalculate URL segment", the slug changes from "/" to "/1"</p>
TYPO3 Core - Bug #87454: Slug/URL segment - /1 is wrongly saved, when trying to set / on rootpage.
http://forge.typo3.org/issues/87454?journal_id=404673
2019-08-12T15:17:44Z
Stefan Busemann
stefan.busemann@in2code.de
<ul></ul><p>By changing Web/typo3/sysext/core/Classes/DataHandling/SlugHelper.php</p>
<p>to</p>
<pre><code class="php syntaxhl" data-language="php"> <span class="k">public</span> <span class="k">function</span> <span class="n">isUniqueInSite</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$slug</span><span class="p">,</span> <span class="kt">RecordState</span> <span class="nv">$state</span><span class="p">):</span> <span class="kt">bool</span>
<span class="p">{</span>
<span class="nv">$pageId</span> <span class="o">=</span> <span class="nv">$state</span><span class="o">-></span><span class="nf">resolveNodeAggregateIdentifier</span><span class="p">();</span>
<span class="nv">$recordId</span> <span class="o">=</span> <span class="nv">$state</span><span class="o">-></span><span class="nf">getSubject</span><span class="p">()</span><span class="o">-></span><span class="nf">getIdentifier</span><span class="p">();</span>
<span class="nv">$languageId</span> <span class="o">=</span> <span class="nv">$state</span><span class="o">-></span><span class="nf">getContext</span><span class="p">()</span><span class="o">-></span><span class="nf">getLanguageId</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nc">MathUtility</span><span class="o">::</span><span class="nf">canBeInterpretedAsInteger</span><span class="p">(</span><span class="nv">$pageId</span><span class="p">))</span> <span class="p">{</span>
<span class="c1">// If this is a new page, we use the parent page to resolve the site</span>
<span class="nv">$pageId</span> <span class="o">=</span> <span class="nv">$state</span><span class="o">-></span><span class="nf">getNode</span><span class="p">()</span><span class="o">-></span><span class="nf">getIdentifier</span><span class="p">();</span>
<span class="p">}</span>
<span class="nv">$pageId</span> <span class="o">=</span> <span class="p">(</span><span class="n">int</span><span class="p">)</span><span class="nv">$pageId</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$pageId</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$pageId</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">resolveLivePageId</span><span class="p">(</span><span class="nv">$recordId</span><span class="p">);</span>
<span class="p">}</span>
<span class="nv">$queryBuilder</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">createPreparedQueryBuilder</span><span class="p">();</span>
<span class="nv">$this</span><span class="o">-></span><span class="nf">applySlugConstraint</span><span class="p">(</span><span class="nv">$queryBuilder</span><span class="p">,</span> <span class="nv">$slug</span><span class="p">);</span>
<span class="nv">$this</span><span class="o">-></span><span class="nf">applyRecordConstraint</span><span class="p">(</span><span class="nv">$queryBuilder</span><span class="p">,</span> <span class="nv">$recordId</span><span class="p">);</span>
<span class="nv">$this</span><span class="o">-></span><span class="nf">applyLanguageConstraint</span><span class="p">(</span><span class="nv">$queryBuilder</span><span class="p">,</span> <span class="nv">$languageId</span><span class="p">);</span>
<span class="nv">$this</span><span class="o">-></span><span class="nf">applyWorkspaceConstraint</span><span class="p">(</span><span class="nv">$queryBuilder</span><span class="p">);</span>
<span class="nv">$statement</span> <span class="o">=</span> <span class="nv">$queryBuilder</span><span class="o">-></span><span class="nf">execute</span><span class="p">();</span>
<span class="nv">$records</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">resolveVersionOverlays</span><span class="p">(</span>
<span class="nv">$statement</span><span class="o">-></span><span class="nf">fetchAll</span><span class="p">()</span>
<span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">count</span><span class="p">(</span><span class="nv">$records</span><span class="p">)</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// The installation contains at least ONE other record with the same slug</span>
<span class="c1">// Now find out if it is the same root page ID</span>
<span class="nv">$siteMatcher</span> <span class="o">=</span> <span class="nc">GeneralUtility</span><span class="o">::</span><span class="nf">makeInstance</span><span class="p">(</span><span class="nc">SiteMatcher</span><span class="o">::</span><span class="n">class</span><span class="p">);</span>
<span class="nv">$siteMatcher</span><span class="o">-></span><span class="nf">refresh</span><span class="p">();</span>
<span class="nv">$siteOfCurrentRecord</span> <span class="o">=</span> <span class="nv">$siteMatcher</span><span class="o">-></span><span class="nf">matchByPageId</span><span class="p">(</span><span class="nv">$pageId</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$records</span> <span class="k">as</span> <span class="nv">$record</span><span class="p">)</span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="nv">$recordState</span> <span class="o">=</span> <span class="nc">RecordStateFactory</span><span class="o">::</span><span class="nf">forName</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="n">tableName</span><span class="p">)</span><span class="o">-></span><span class="nf">fromArray</span><span class="p">(</span><span class="nv">$record</span><span class="p">);</span>
<span class="nv">$siteOfExistingRecord</span> <span class="o">=</span> <span class="nv">$siteMatcher</span><span class="o">-></span><span class="nf">matchByPageId</span><span class="p">(</span>
<span class="p">(</span><span class="n">int</span><span class="p">)</span><span class="nv">$recordState</span><span class="o">-></span><span class="nf">resolveNodeAggregateIdentifier</span><span class="p">()</span>
<span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nc">SiteNotFoundException</span> <span class="nv">$exception</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// In case not site is found, the record is not</span>
<span class="c1">// organized in any site or pseudo-site</span>
<span class="k">continue</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$siteOfExistingRecord</span><span class="o">-></span><span class="nf">getRootPageId</span><span class="p">()</span> <span class="o">===</span> <span class="nv">$siteOfCurrentRecord</span><span class="o">-></span><span class="nf">getRootPageId</span><span class="p">())</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$pageId</span> <span class="o">===</span> <span class="p">(</span><span class="n">int</span><span class="p">)</span><span class="nv">$recordState</span><span class="o">-></span><span class="nf">getNode</span><span class="p">()</span><span class="o">-></span><span class="nf">getIdentifier</span><span class="p">())</span> <span class="p">{</span>
<span class="c1">// if we are on the same page, we can skip it and return true</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// Otherwise, everything is still fine</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
<p>I added this if statement:</p>
<pre><code class="php syntaxhl" data-language="php"> <span class="k">if</span> <span class="p">(</span><span class="nv">$pageId</span> <span class="o">===</span> <span class="p">(</span><span class="n">int</span><span class="p">)</span><span class="nv">$recordState</span><span class="o">-></span><span class="nf">getNode</span><span class="p">()</span><span class="o">-></span><span class="nf">getIdentifier</span><span class="p">())</span> <span class="p">{</span>
<span class="c1">// if we are on the same page, we can skip it and return true</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>