Skip to content

Instantly share code, notes, and snippets.

@emsifa
Last active August 27, 2016 01:51
Show Gist options
  • Save emsifa/03a265b7e41451ec17706d7ff11ffad2 to your computer and use it in GitHub Desktop.
Save emsifa/03a265b7e41451ec17706d7ff11ffad2 to your computer and use it in GitHub Desktop.
Block - Library untuk mengatur penempatan blok HTML pada modul di BANG Framework.

BLOCK

Block adalah library untuk mengatur penempatan blok HTML pada modul di BANG Framework.

OK. BANG Framework dapat merubah modul kamu menjadi variable $content untuk dapat kamu tempatkan di bagian konten template kamu. Namun bagaimana jika kamu ingin menempatkan sebagian kode HTML pada file modul kamu bukan ke bagian konten template, melainkan menempatkannya diantara <head>...</head> misalnya. Nah, library ini adalah jawabannya.

Block memungkinkan kamu memotong dan menampung sebagian kode HTML yang nantinya dapat kamu tempatkan dimanapun di kode template kamu. Block ini seperti fitur section pada Blade atau block pada Twig. Library ini sendiri terinspirasi dengan fitur section pada Blade di Laravel.

Instalasi

Buat sebuah file di app/libraries/Block.php. Lalu require file tersebut di file index.php kamu.

Contoh Penggunaan

Misalkan kamu ingin menempatkan meta tags pada modul about-us untuk mengoptimalkan tampilan postingan halaman tersebut di facebook. Ubah file app/module/about-us.php kamu menjadi seperti ini:

<?php 
config('title', 'About Us');
?>

<p>
  Halo, kami adalah sekelompok pengguna jutsu medis bersertifikasi.
</p>

<?= Block::start('meta-tags') ?>
  <?= Block::parent() ?>
  <meta name="ogUrl" property="og:url" content="http://yoursite.com" />
  <meta name="ogType" property="og:type" content="article" />
  <meta name="ogTitle" property="og:title" content="Your Site - About Us" />
  <meta name="ogDescription" property="og:description" content="Your page description" />
  <meta name="ogImage" property="og:image" content="/assets/img/fb-thumbnail.png" />
<?= Block::stop() ?>

Lalu ubah file template kamu menjadi seperti ini:

<!DOCTYPE html>
<html>
  <head>
    <?= Block::start('meta-tags') ?>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <?= Block::show() ?>
    <title><?= config('title') ?></title>
  </head>
  <body>
    <div id="content">
      <?= $content ?>
    </div>
  </body>
</html>

Selesai! jika modul about-us diakses, output HTML-nya akan seperti ini:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="ogUrl" property="og:url" content="http://yoursite.com" />
    <meta name="ogType" property="og:type" content="article" />
    <meta name="ogTitle" property="og:title" content="Your Site - About Us" />
    <meta name="ogDescription" property="og:description" content="Your page description" />
    <meta name="ogImage" property="og:image" content="/assets/img/fb-thumbnail.png" />
    <title>About Us</title>
  </head>
  <body>
    <div id="content">
      <p>
        Halo, kami adalah sekelompok pengguna jutsu medis bersertifikasi.
      </p>
    </div>
  </body>
</html>
<?php
class Block
{
const PARENT_REPLACER = '<!--::parent::-->';
protected static $blocks = [];
protected static $starteds = [];
public static function start($block_name)
{
static::$starteds[] = $block_name;
ob_start();
}
public static function parent()
{
return static::PARENT_REPLACER;
}
public static function stop()
{
$block_name = array_pop(static::$starteds);
if (!array_key_exists($block_name, static::$blocks)) {
static::$blocks[$block_name] = [];
}
static::$blocks[$block_name][] = ob_get_clean();
}
public static function show($block_name)
{
static::stop();
echo static::get($block_name);
}
public static function get($block_name)
{
$stacks = array_key_exists($block_name, static::$blocks)? static::$blocks[$block_name] : null;
return $stacks? static::renderStacks($stacks) : '';
}
protected static function renderStacks(array $stacks)
{
$current = array_pop($stacks);
if (count($stacks)) {
return str_replace(static::PARENT_REPLACER, $current, static::renderStacks($stacks));
} else {
return $current;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment