Skip to content

Commit 2a8cefb

Browse files
authored
Resolve breadcrumb ancestors on sites with a URL prefix (#220)
1 parent a9c83b0 commit 2a8cefb

4 files changed

Lines changed: 94 additions & 2 deletions

File tree

src/Cascades/ContentCascade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ protected function isHomepage(): bool
209209

210210
protected function breadcrumbSegments(): array
211211
{
212-
return explode('/', trim($this->model->url(), '/'));
212+
return explode('/', trim($this->model->uri(), '/'));
213213
}
214214

215215
public function pageSchema(): ?string

src/Cascades/ContextViewCascade.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ protected function isHomepage(): bool
7474

7575
protected function breadcrumbSegments(): array
7676
{
77-
return request()->segments();
77+
$uri = Site::current()->relativePath($this->model->get('current_url'));
78+
79+
return explode('/', trim($uri, '/'));
7880
}
7981
}

tests/Cascades/ContentCascadeTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,47 @@
343343
}
344344
});
345345

346+
it('resolves all breadcrumb ancestors on a site with a url prefix', function () {
347+
$collection = Collection::make('docs')
348+
->routes('{parent_uri}/{slug}')
349+
->sites(['english', 'german'])
350+
->structureContents(['root' => true])
351+
->save();
352+
353+
// Rebuild the memoized SeoSet registry so the new collection is recognised.
354+
flushBlink();
355+
356+
$home = Entry::make()->collection('docs')->locale('german')->slug('home')->data(['title' => 'Home']);
357+
$home->save();
358+
359+
$levelOne = Entry::make()->collection('docs')->locale('german')->slug('level-1')->data(['title' => 'Level 1']);
360+
$levelOne->save();
361+
362+
$levelTwo = Entry::make()->collection('docs')->locale('german')->slug('level-2')->data(['title' => 'Level 2']);
363+
$levelTwo->save();
364+
365+
$collection->structure()->in('german')->tree([
366+
['entry' => $home->id()],
367+
['entry' => $levelOne->id(), 'children' => [
368+
['entry' => $levelTwo->id()],
369+
]],
370+
])->save();
371+
372+
flushBlink();
373+
374+
$cascade = ContentCascade::from(Entry::find($levelTwo->id()));
375+
$cascade->set('use_breadcrumbs', true);
376+
377+
$items = collect(json_decode($cascade->breadcrumbs(), true)['itemListElement']);
378+
379+
expect($items->pluck('name')->all())->toBe(['Home', 'Level 1', 'Level 2'])
380+
->and($items->pluck('item')->all())->toBe([
381+
'https://example.com/de/',
382+
'https://example.com/de/level-1',
383+
'https://example.com/de/level-1/level-2',
384+
]);
385+
});
386+
346387
it('returns null page schema when json ld is not set', function () {
347388
expect($this->cascade->pageSchema())->toBeNull();
348389
});

tests/Cascades/ContextViewCascadeTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use Aerni\AdvancedSeo\Cascades\ContextViewCascade;
44
use Statamic\Facades\AssetContainer;
55
use Statamic\Facades\Collection;
6+
use Statamic\Facades\Entry;
67
use Statamic\Facades\Site;
78
use Statamic\Facades\Taxonomy;
89
use Statamic\Tags\Context;
@@ -138,6 +139,54 @@
138139
expect($cascade->breadcrumbs())->toBeNull();
139140
});
140141

142+
it('resolves all breadcrumb ancestors on a site with a url prefix', function () {
143+
$collection = Collection::make('docs')
144+
->routes('{parent_uri}/{slug}')
145+
->sites(['english', 'german'])
146+
->structureContents(['root' => true])
147+
->save();
148+
149+
// Rebuild the memoized SeoSet registry so the new collection is recognised.
150+
flushBlink();
151+
152+
$home = Entry::make()->collection('docs')->locale('german')->slug('home')->data(['title' => 'Home']);
153+
$home->save();
154+
155+
$levelOne = Entry::make()->collection('docs')->locale('german')->slug('level-1')->data(['title' => 'Level 1']);
156+
$levelOne->save();
157+
158+
$levelTwo = Entry::make()->collection('docs')->locale('german')->slug('level-2')->data(['title' => 'Level 2']);
159+
$levelTwo->save();
160+
161+
$collection->structure()->in('german')->tree([
162+
['entry' => $home->id()],
163+
['entry' => $levelOne->id(), 'children' => [
164+
['entry' => $levelTwo->id()],
165+
]],
166+
])->save();
167+
168+
flushBlink();
169+
170+
Site::setCurrent('german');
171+
172+
$context = new Context(collect([
173+
'current_url' => 'https://example.com/de/level-1/level-2',
174+
'site' => Site::get('german'),
175+
]));
176+
177+
$cascade = ContextViewCascade::from($context);
178+
$cascade->set('use_breadcrumbs', true);
179+
180+
$items = collect(json_decode($cascade->breadcrumbs(), true)['itemListElement']);
181+
182+
expect($items->pluck('name')->all())->toBe(['Home', 'Level 1', 'Level 2'])
183+
->and($items->pluck('item')->all())->toBe([
184+
'https://example.com/de/',
185+
'https://example.com/de/level-1',
186+
'https://example.com/de/level-1/level-2',
187+
]);
188+
});
189+
141190
it('returns default title when context has a title', function () {
142191
$context = new Context(collect([
143192
'title' => 'Custom Page',

0 commit comments

Comments
 (0)