Laravel Blade - собственный метод для блока html?

Можно ли создать собственный блейд-метод/тег или как это решить?

Например, в блейд-файле он будет содержать несколько блоков form-block, например:

<section class="container-fluid container-fixed-lg form-block">
    <div class="row b-b b-grey">
        <div class="col-xs-12 col-md-3 m-r-35">
            <h2>Title</h2>
            <p>Some content here</p>
        </div>
        <div class="col-xs-12 col-md-7">
            <div class="panel panel-default">
                <div class="panel-body">
                    // Custom Block Here
                </div>
            </div>
        </div>
    </div>
</section>

Есть ли способ улучшить читаемость/обслуживаемость, чтобы иметь что-то подобное в файле блейда:

@form-block('Title','Some content here')
   // Custom Block Here
@end-form-block

person I'll-Be-Back    schedule 12.01.2016    source источник


Ответы (2)


Пользовательские блейд-директивы, как их называют, немного грязно писать, потому что вам нужно вернуть строку, содержащую HTML, а также, возможно, PHP-код, который будет запущен. Что еще более грязно, так это то, что вы не получаете параметры отдельно, вы просто получаете одну строку, например "('Title', 'Some content')", в качестве ввода для ваших директив. Уловка, которую я только что обнаружил, заключается в том, что вы можете использовать синтаксис массива для разделения параметров.

Blade::directive('formblock', function ($expression) {
    return '
  <section class="container-fluid container-fixed-lg form-block">
      <div class="row b-b b-grey">
          <div class="col-xs-12 col-md-3 m-r-35">
              <h2><?=array' . $expression . '[0];?></h2>
              <p><?=array' . $expression . '[1];?></p>
          </div>
          <div class="col-xs-12 col-md-7">
              <div class="panel panel-default">
                  <div class="panel-body">
';
});

Blade::directive('endformblock', function () {
    return '
                  </div>
              </div>
          </div>
      </div>
  </section>
';
});

Как я уже сказал, это грязно, но это сработает. Обратите внимание, что вы не можете использовать тире в именах ваших директив, поэтому я назвал их formblock и endformblock вместо form-block и end-form-block.

Более простой подход состоит в том, чтобы просто использовать директиву @include для включения партиалов. Однако код, который вы должны написать в своих блейд-файлах, немного более подробный:

@include('partials.form_block_start', ['title' => 'My Title', 'content' => 'The extra content..']);
Main content...
@include('partials.form_block_end');

Затем создайте два файла в views/partials/form_block_start.blade.php и views/partials/form_block_end.blade.php. В первом вы можете использовать только заголовок и содержание в качестве переменных $title и $content. См. https://laravel.com/docs/5.2/blade#control-structures для получения дополнительной информации.

person Jeroen Noten    schedule 12.01.2016

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

Ваш пример выглядит так, как будто вы пытаетесь создать формы. Это пакет, который может помочь. Это генератор форм/html, который был удален в Laravel 5 и теперь поддерживается сообществом.

person jfadich    schedule 12.01.2016
comment
Я не вижу никакого использования формы в вопросе. - person Jeroen Noten; 12.01.2016
comment
Его директива клинка называется form-block - person jfadich; 12.01.2016
comment
В блейд-файле будет много form-block, а в блоке panel-body будет много html-входов. Я думаю, вы можете улучшить свой ответ, предоставив пример пользовательских директив. - person I'll-Be-Back; 12.01.2016