Skip to content

Commit d1546e1

Browse files
Daynnnnnjesseleite
andauthored
Add blade directive (#195)
Co-authored-by: Jesse Leite <jesseleite@gmail.com>
1 parent 186db37 commit d1546e1

File tree

5 files changed

+276
-137
lines changed

5 files changed

+276
-137
lines changed

src/Directives/SeoProDirective.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Statamic\SeoPro\Directives;
4+
5+
use Statamic\SeoPro\Tags\SeoProTags;
6+
7+
class SeoProDirective extends SeoProTags
8+
{
9+
public function renderTag($tag, $context)
10+
{
11+
return $this->setContext($context)->$tag();
12+
}
13+
}

src/ServiceProvider.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Statamic\SeoPro;
44

5+
use Illuminate\Support\Facades\Blade;
56
use Illuminate\Support\Facades\Event;
67
use Statamic\Facades\CP\Nav;
78
use Statamic\Facades\Permission;
@@ -42,6 +43,7 @@ public function boot()
4243
$this
4344
->bootAddonConfig()
4445
->bootAddonViews()
46+
->bootAddonBladeDirective()
4547
->bootAddonPermissions()
4648
->bootAddonNav()
4749
->bootAddonSubscriber()
@@ -71,6 +73,15 @@ protected function bootAddonViews()
7173
return $this;
7274
}
7375

76+
protected function bootAddonBladeDirective()
77+
{
78+
Blade::directive('seo_pro', function ($tag) {
79+
return '<?php echo \Facades\Statamic\SeoPro\Directives\SeoProDirective::renderTag('.$tag.', $__data) ?>';
80+
});
81+
82+
return $this;
83+
}
84+
7485
protected function bootAddonPermissions()
7586
{
7687
$this->app->booted(function () {

tests/Localized/MetaTagTest.php

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,18 @@
22

33
namespace Tests\Localized;
44

5-
use Illuminate\Pagination\LengthAwarePaginator;
6-
use Statamic\Facades\Antlers;
7-
use Statamic\Facades\Blink;
8-
use Statamic\Facades\Collection;
95
use Statamic\Facades\Config;
10-
use Statamic\Facades\Data;
11-
use Statamic\Facades\Entry;
12-
use Statamic\Facades\Site;
13-
use Statamic\Support\Str;
14-
use Statamic\View\Cascade;
6+
use Tests\MetaProviders;
157

168
class MetaTagTest extends TestCase
179
{
18-
private function meta($uri = null)
19-
{
20-
$site = Site::current();
21-
$data = Data::findByUri(Str::ensureLeft($uri, '/'), $site->handle());
22-
$context = (new Cascade(request(), $site))->withContent($data)->hydrate()->toArray();
23-
24-
return (string) Antlers::parse('{{ seo_pro:meta }}', $context);
25-
}
10+
use MetaProviders;
2611

27-
/** @test */
28-
public function it_generates_multisite_meta()
12+
/**
13+
* @test
14+
* @dataProvider metaProvider
15+
*/
16+
public function it_generates_multisite_meta($metaProvider)
2917
{
3018
$expectedOgLocaleMeta = <<<'EOT'
3119
<meta property="og:locale" content="en_US" />
@@ -39,14 +27,17 @@ public function it_generates_multisite_meta()
3927
<link rel="alternate" href="http://cool-runnings.com/it" hreflang="it" />
4028
EOT;
4129

42-
$meta = $this->meta();
30+
$meta = $this->{$metaProvider}();
4331

4432
$this->assertStringContainsString($expectedOgLocaleMeta, $meta);
4533
$this->assertStringContainsString($expectedAlternateHreflangMeta, $meta);
4634
}
4735

48-
/** @test */
49-
public function it_generates_multisite_meta_for_non_home_page_route()
36+
/**
37+
* @test
38+
* @dataProvider metaProvider
39+
*/
40+
public function it_generates_multisite_meta_for_non_home_page_route($metaProvider)
5041
{
5142
$expectedOgLocaleMeta = <<<'EOT'
5243
<meta property="og:locale" content="en_US" />
@@ -60,36 +51,45 @@ public function it_generates_multisite_meta_for_non_home_page_route()
6051
<link rel="alternate" href="http://cool-runnings.com/it/about" hreflang="it" />
6152
EOT;
6253

63-
$meta = $this->meta('about');
54+
$meta = $this->{$metaProvider}('about');
6455

6556
$this->assertStringContainsString($expectedOgLocaleMeta, $meta);
6657
$this->assertStringContainsString($expectedAlternateHreflangMeta, $meta);
6758
}
6859

69-
/** @test */
70-
public function it_doesnt_generate_multisite_meta_when_it_doesnt_exist_for_page()
60+
/**
61+
* @test
62+
* @dataProvider metaProvider
63+
*/
64+
public function it_doesnt_generate_multisite_meta_when_it_doesnt_exist_for_page($metaProvider)
7165
{
72-
$meta = $this->meta('articles');
66+
$meta = $this->{$metaProvider}('articles');
7367

7468
$this->assertStringContainsString('og:locale', $meta);
7569
$this->assertStringNotContainsString('og:locale:alternate', $meta);
7670
$this->assertStringNotContainsString('hreflang', $meta);
7771
}
7872

79-
/** @test */
80-
public function it_doesnt_generate_multisite_meta_when_alternate_locales_are_disabled()
73+
/**
74+
* @test
75+
* @dataProvider metaProvider
76+
*/
77+
public function it_doesnt_generate_multisite_meta_when_alternate_locales_are_disabled($metaProvider)
8178
{
8279
Config::set('statamic.seo-pro.alternate_locales', false);
8380

84-
$meta = $this->meta();
81+
$meta = $this->{$metaProvider}();
8582

8683
$this->assertStringContainsString('og:locale', $meta);
8784
$this->assertStringNotContainsString('og:locale:alternate', $meta);
8885
$this->assertStringNotContainsString('hreflang', $meta);
8986
}
9087

91-
/** @test */
92-
public function it_doesnt_generate_multisite_meta_for_excluded_sites()
88+
/**
89+
* @test
90+
* @dataProvider metaProvider
91+
*/
92+
public function it_doesnt_generate_multisite_meta_for_excluded_sites($metaProvider)
9393
{
9494
Config::set('statamic.seo-pro.alternate_locales.excluded_sites', ['french']);
9595

@@ -103,7 +103,7 @@ public function it_doesnt_generate_multisite_meta_for_excluded_sites()
103103
<link rel="alternate" href="http://cool-runnings.com/it" hreflang="it" />
104104
EOT;
105105

106-
$meta = $this->meta();
106+
$meta = $this->{$metaProvider}();
107107

108108
$this->assertStringContainsString($expectedOgLocaleMeta, $meta);
109109
$this->assertStringContainsString($expectedAlternateHreflangMeta, $meta);

tests/MetaProviders.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Tests;
4+
5+
use Illuminate\Support\Facades\Blade;
6+
use Statamic\Facades\Antlers;
7+
use Statamic\Facades\Data;
8+
use Statamic\Facades\Site;
9+
use Statamic\Support\Str;
10+
use Statamic\View\Cascade;
11+
12+
trait MetaProviders
13+
{
14+
function metaProvider()
15+
{
16+
return [
17+
['antlersMeta'],
18+
['bladeMeta'],
19+
];
20+
}
21+
22+
public function antlersMeta($uri = null)
23+
{
24+
$site = Site::current();
25+
$data = Data::findByUri(Str::ensureLeft($uri, '/'), $site->handle());
26+
$context = (new Cascade(request(), $site))->withContent($data)->hydrate()->toArray();
27+
28+
return (string) Antlers::parse('{{ seo_pro:meta }}', $context);
29+
}
30+
31+
public function bladeMeta($uri = null)
32+
{
33+
$site = Site::current();
34+
$data = Data::findByUri(Str::ensureLeft($uri, '/'), $site->handle());
35+
$context = (new Cascade(request(), $site))->withContent($data)->hydrate()->toArray();
36+
37+
ob_start() and extract(['__data' => $context], EXTR_SKIP);
38+
39+
eval('?>' . Blade::compileString("@seo_pro('meta')"));
40+
41+
return (string) ob_get_clean();
42+
}
43+
}

0 commit comments

Comments
 (0)