шаблон лезвия, @yield () в @yield

Это моя текущая реализация тегов Open Graph с использованием Laravel 5:

app.blade.php

<title>@yield('title')</title>
<meta property="og:title" content="@yield('og-title', 'DEFAULT PAGE TITLE')">
<meta property="og:image" content="@yield('og-image', 'default.png')">
<meta property="og:url" content="@yield('og-url', '{{ Request::url() }}')">
<meta property="og:site_name" content="SITE NAME">

page.blade.php

@extends('app')
@section('title', $article->title . ' | SITE NAME')
@section('og-title', $article->title)
@section('og-image', secure_url('img/news/' . $article->image .'.png'))

Это работает по большей части, но у меня есть пара запросов:

  1. Есть ли способ использовать @yield() в @yield?

    Я старался <meta property="og:title" content="@yield('og-title', @yield('title'))"> но это не сработало.

  2. Как я могу получить текущий безопасный URL-адрес страницы?

    {{ Request::url() }} возвращается http://example.com/page, но я хочу https://example.com/page

В качестве мета, пожалуйста, дайте мне знать, если у вас есть какие-либо предложения по улучшению моего текущего метода OG.

15

Решение

Существует простой способ достичь того, что вы хотите. Что вы можете сделать, это переместить метатеги OG html в частичное представление, в которое вы можете передавать параметры на каждой странице по своему усмотрению. Например, в вашем основном макете просто создайте раздел для тегов og:

app.blade.php

<title>@yield('title')</title>
@section('ogtags')

@show

Теперь создайте ваш частичный вид, давайте назовем его:

og_tags.blade.php

<meta property="og:title" content="{{ $title or 'DEFAULT PAGE TITLE' }}">
<meta property="og:image" content="{{ $image or 'default.png' }}">
<meta property="og:url" content="{{ isset($url) ? $url : str_replace('http://', 'https://', Request::url()) }}">

Так что теперь в ваших представлениях вы можете легко добавить теги og, например так:

home.blade.php

@extends('app')

@section('ogtags')
@include('og_tags', ['title' => 'my title', 'image' => 'my-image.png'])
@stop

@section('content')
your content here
@stop

Для безопасного вопроса URL, Request::url() возвращает текущий URL страницы, если он через HTTPS, он начнется с https:// в противном случае это начнется с http://, Вот почему я просто заменил его, чтобы всегда быть https

str_replace('http://', 'https://', Request::url())

Если вы хотите всегда иметь og_tags (если ваше представление не определяет этот раздел и вы хотите показывать по умолчанию), вы можете просто изменить свой app.blade.php как это:

<title>@yield('title')</title>
@section('ogtags')
@include('og_tags')
@show

Это классная часть лопасть что вы можете разбить все на более мелкие части, затем включить их в динамические параметры или просто создать составные представления для обработки данных.

1

Другие решения

Я всегда использую meta.blade.php и держи мой meta отдельно от основного макета и не только meta но также, styles а также scripts когда это возможно и включите затем с помощью @include(...)В любом случае, но как сделать его динамичным? В этом случае я использую такой же подход, как вы, но немного по-другому, что дает мне полную гибкость, чтобы сделать его по-настоящему динамичным. Вот как я это делаю, вероятно, это ответит на то, что вы ищете здесь. Итак, давайте создадим файл meta.blade.php, а мой приведен ниже:

<!-- Title-->
<title>@yield('title', smart('site.title'))</title>
<!-- Meta-->
<meta name="keywords" content="@yield('keywords', getSiteMeta('keywords'))" />
<meta name="description" content="@yield('description', getSiteMeta('description'))" />
<meta name="author" content="@yield('author', getSiteMeta('author'))" />
<!-- CSRF for AJAX-->
<meta name="csrf-token" content="{{ csrf_token() }}" />

уведомление @yield('keywords', getSiteMeta('keywords')) так вот; getSiteMeta это вспомогательная функция, которая объявлена ​​в моем app\Helpers\Common.php файл и функция выглядит так:

/**
* Prapare meta Tags by $name
*
* @param  String $metaname Meta Name
* @return Meta Content
*/
function getSiteMeta($name)
{
return smart("site.meta.$name");
}

Также здесь задействована еще одна функция:

/**
* Short cut to config call for smart.php file items
* @param  String $str Config Key
* @return String Config Value
*/
function smart($str)
{
return config("smart.$str");
}

На самом деле, у меня есть собственный файл конфигурации на config\smart.php а также smart это название моего сайта, поэтому я сохранил все связанные с ним конфиги в config\smart.php который выглядит так:

// config/smart.php
return [

'site' => [
'name' => 'Smart',
'title' => 'Smart Title',
'tagline' => 'Smart Tag Line',
'meta' => [
'keywords' => 'Smart Keywords',
'language' => 'english',
'description' => '...',
'author' => 'Sheikh Heera'
],
],

'role' => [
'default' => 'genaral',  # By default, a user gets this role when registers.
'reserved' => 'superuser' # Application's Admin must have this role assigned.
],
// More...
];

Возможно, у вас есть идея, я могу позвонить smart('key_name') чтобы получить конфиги моего сайта, чтобы мне не нужно было использовать config('smart.key') и по умолчанию все meta значения хранятся в моем config/smart.php файл, так что если я не использую раздел, как это:

@section('keywords')
Some, Keywords, Here
@stop

Тогда я всегда мои настройки по умолчанию и с помощью вспомогательной функции getSiteMeta У меня достаточно гибкости, чтобы изменить логику своей функции, например, я могу изменить источник моего по умолчанию meta теги и можете построить его на лету.

относительно https это зависит от вашего сайта, если вы использовали защищенный URL (ssl/https) а также Request::url() просто возвращает ваш текущий URL, так что если это https тогда он вернет, что в противном случае вы получите http,

0

По вопросам рекламы [email protected]