Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Allow duplicate entry slugs by jasonvarga · Pull Request #3671 · statamic/cms · GitHub
Skip to content

Allow duplicate entry slugs - #3671

Merged
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs
Jun 7, 2021
Merged

Allow duplicate entry slugs#3671
jasonvarga merged 28 commits into
3.1from
feature/duplicate-slugs

Conversation

@jasonvarga

@jasonvargajasonvarga commented May 7, 2021

Copy link
Copy Markdown
Member

Fixes#714

Filename suffixes

You can now have two (or more) entries with the same slug and date combination by appending a suffix.

The suffix is a dot, then anything:

post.md
post.1.md
post.2.md

or with dates:

2021-05-10.post.md
2021-05-10.post.1.md
2021-05-10.post.2.md

The suffix can be anything if you're creating files by hand, but when using the control panel or creating entries programmatically, it'll use incrementing numbers. (It checks from zero though, so if you have .1 and .3, it'll make a 2, not a 4.)

URI Validation

Even though slugs no longer need to be unique, the URIs need to be.

Entries now get duplicate URI validation. The message will be shown on the slug field.

image

When you submit a tree, it'll check whether there are any duplicate URIs and prevent saving.

Screen Capture on 2021-05-28 at 17-57-20

Backwards compatibility

Technically, the removal of unique slug validation could be considered a breaking change, so this PR includes an update script that'll add unique slug validation to all collection blueprints.

If you actually wanted unique slugs, the automatically added rule will keep this behavior.
If you don't want the slugs to be unique, then you can remove the rule that gets added.

image

Deprecations

Entry::findBySlug() has been deprecated. Since the concept of a slug is no longer really unique, finding by one makes even less sense. You could have already had entries with duplicate slugs (if the dates were different) so it was already a little weird. We don't use this method anywhere.

Also deprecated Term::findBySlug() for method consistency. We don't use it anywhere either.

Todo

  • Stache should handle the filename suffix and don't treat it as part of the slug or date.
  • Saving an entry with a duplicate slug/date combo should append a suffix to the filename.
  • The uniqueness validation rule on slug should actually be uniqueness of the uri.
  • In a tree, prevent dragging an entry to where there's already an entry with that slug.
  • Update script to add unique validation rule to slug fields to keep existing sites working the same way.
  • Translate the duplicate URI validation message
  • Adjust the version in AddUniqueSlugValidation::shouldUpdate, if necessary.

@jasonvargajasonvarga mentioned this pull request May 11, 2021
@goellner

Copy link
Copy Markdown
Contributor

sorry to be this guy, but is this planned to be released in the next two weeks by any chance? have to launch a client site and would very much prefer to be able to use same slugs feature. if thats not realistic, no problem, I will need to build a workaround for the time being.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Unless something else important pops up, yes that's the plan.

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

Add a way to see a uri column in the entry listing. The column picker only shows blueprint fields, and URI isn't a field.

Tried to solve this, but turned into a bigger can of worms. We're going to ship this feature without a URI column for now, but circle back to this shortly. It's not a big deal yet because if you're going to have duplicate slugs, you're probably going to be viewing the collection in tree view.

@jasonvargajasonvarga changed the title Allow duplicate slugsAllow duplicate entry slugsJun 4, 2021
@jasonvarga
jasonvarga marked this pull request as ready for review June 4, 2021 19:17
@jasonvarga
jasonvarga merged commit 5f0f5c4 into 3.1Jun 7, 2021
@jasonvarga
jasonvarga deleted the feature/duplicate-slugs branch June 7, 2021 20:50
@goellner

Copy link
Copy Markdown
Contributor

I am getting errors, when trying to use the same slug on two different sites. The weird part: It shows two different error messages on two pages in the same collection.

One is This value has already been taken and the other one This URI has already been taken.

I have two sites set up default and en and can't save the en content, because of those two errors. This happens in my pages collection and the routing is set up like this: {parent_uri}/{slug}

When I log the $uri here: https://share.getcloudapp.com/lluNyxWL it logs the same URI for both sites. My multisite setup is with folders asdf.com/test and asdf.com/en/test. I think the URI of de en locale should have the /en part in.

@goellner

goellner commented Jun 8, 2021

Copy link
Copy Markdown
Contributor

When you change the slug of the en version, statamic saves the entry. But after a reload the slug is the same as in the default locale. It seems atm I can't change the slug of the second locale at all.

@goellner

Copy link
Copy Markdown
Contributor

I just tested the PR #3808 and while I can save with the same slug, I can't change the slug in either locale anymore. After the save and a reload the old value is shown

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

When you upgrade, we keep the unique slug validation. Did a new validate rule get added to the slug field your blueprint? You can remove it.

@goellner

Copy link
Copy Markdown
Contributor

I removed that rule, but couldn’t change the slug anymore. Reverted back to the previous version. Also had to rename the files manually. I have one page with the same slug in the root of the tree. Couldn’t manage to get Statamic to add the number to the filename

@jasonvarga

Copy link
Copy Markdown
MemberAuthor

That was hard to follow. I'm going to merge #3808 and release it. You can open a new issue if you still have trouble.

@rrelmy

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

@goellner

Copy link
Copy Markdown
Contributor

In this PR \Statamic\Facades\Term::findBySlug($slug, $taxonomy) has been deprecated but not alternative was document.

I am confused how I should load terms when I only have the slug from the yaml.

Using Term::findBySlug myself, there is no alternative afaik

@jasonvarga

jasonvarga commented Jun 9, 2021

Copy link
Copy Markdown
MemberAuthor
Term::query()
->where('slug', $slug)
->where('taxonomy', $taxonomy)
->first();

@rrelmy

Copy link
Copy Markdown
Contributor

Makes sense 🤦

Why can't we just keep the findBySlug for terms?
I understand it makes no sense for entries, but for terms it is still valid.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Handle same slugs at different positions in a structure

3 participants

@jasonvarga@goellner@rrelmy