Skip to content

Commit

Permalink
Merge branch 'master' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
zombor committed Nov 5, 2012
2 parents 22e694c + 3770119 commit 9bb3af1
Show file tree
Hide file tree
Showing 16 changed files with 165 additions and 399 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -0,0 +1 @@
*.swp
159 changes: 34 additions & 125 deletions README.markdown
Expand Up @@ -2,147 +2,56 @@

Kostache is a [Kohana 3](https://github.com/kohana/kohana) module for using [Mustache](http://defunkt.github.com/mustache/) templates in your application.

Mustache is a logic-less template class. It is impossible to embed logic into mustache files.

## Example

Did you know the pagination view in Kohana is terrible? We are going to fix it:

### How it exists now:

<p class="pagination">

<?php if ($first_page !== FALSE): ?>
<a href="<?php echo $page->url($first_page) ?>" rel="first"><?php echo __('First') ?></a>
<?php else: ?>
<?php echo __('First') ?>
<?php endif ?>

<?php if ($previous_page !== FALSE): ?>
<a href="<?php echo $page->url($previous_page) ?>" rel="prev"><?php echo __('Previous') ?></a>
<?php else: ?>
<?php echo __('Previous') ?>
<?php endif ?>

<?php for ($i = 1; $i <= $total_pages; $i++): ?>

<?php if ($i == $current_page): ?>
<strong><?php echo $i ?></strong>
<?php else: ?>
<a href="<?php echo $page->url($i) ?>"><?php echo $i ?></a>
<?php endif ?>

<?php endfor ?>

<?php if ($next_page !== FALSE): ?>
<a href="<?php echo $page->url($next_page) ?>" rel="next"><?php echo __('Next') ?></a>
<?php else: ?>
<?php echo __('Next') ?>
<?php endif ?>

<?php if ($last_page !== FALSE): ?>
<a href="<?php echo $page->url($last_page) ?>" rel="last"><?php echo __('Last') ?></a>
<?php else: ?>
<?php echo __('Last') ?>
<?php endif ?>

</p><!-- .pagination -->

Wow, look at all that logic in there! How do you plan on effectively maintaining that?!?

### Our new View Class (classes/view/pagination/basic.php)

<?php defined('SYSPATH') or die('No direct script access.');

class View_Pagination_Basic extends kostache {

protected $pagination;

protected function items()
{
$items = array();
// First.
$first['title'] = 'first';
$first['name'] = __('first');
$first['url'] = ($this->pagination->first_page !== FALSE) ? $this->pagination->url($this->pagination->first_page) : FALSE;
$items[] = $first;
// Prev.
$prev['title'] = 'prev';
$prev['name'] = __('previous');
$prev['url'] = ($this->pagination->previous_page !== FALSE) ? $this->pagination->url($this->pagination->previous_page) : FALSE;
$items[] = $prev;
// Numbers.
for ($i=1; $i<=$this->pagination->total_pages; $i++)
{
$item = array();
$item['num'] = TRUE;
$item['name'] = $i;
$item['url'] = ($i != $this->pagination->current_page) ? $this->pagination->url($i) : FALSE;
$items[] = $item;
}
// Next.
$next['title'] = 'next';
$next['name'] = __('next');
$next['url'] = ($this->pagination->next_page !== FALSE) ? $this->pagination->url($this->pagination->next_page) : FALSE;
$items[] = $next;
// Last.
$last['title'] = 'last';
$last['name'] = __('last');
$last['url'] = ($this->pagination->last_page !== FALSE) ? $this->pagination->url($this->pagination->last_page) : FALSE;
$items[] = $last;

return $items;
}
## Usage

To use, simply create a POPO (Plain Old PHP Object) like so:

```php
<?php

class View_Test
{
public $hello = 'world';

public function testing()
{
return 'foobar';
}
}
```

Yum, logic in a class, where it belongs :)
And create a mustache renderer. The parameter to the engine method is the template name to use.

### Our mustache template (templates/pagination/basic.mustache)
```php
<?php

<p class="pagination">
{{#items}}
{{#url}}<a href="{{url}}" {{#title}}rel="{{rel}}"{{/title}}>{{/url}}
{{#num}}<strong>{{/num}}{{name}}{{#num}}</strong>{{/num}}
{{#url}}</a>{{/url}}
{{/items}}
</p>
$renderer = Kostache::factory();
```

Holy cow, that's more maintainable :)
And render it:

## Partials
```php
<?php

To use a partial in your template you use the greater than sign (>) and the name, e.g. {{>header}}.
$this->response->body($renderer->render(new View_Test));
```

You must define partials within the $_partials array in your view class. The key is the name that you use in your template and the value is a path to your partial file.
## Templates

protected $_partials = array(
'header' => 'header', // Loads templates/header.mustache
'footer' => 'footer/default', // Loads templates/footer/default.mustache
);
Templates should go in the `templates/` directory in your cascading file system. They should have a .mustache extension.

## Using the Kostache_Layout class
## Partials

Kostache comes with a Kostache_Layout class instead of a template controller. This allows your layouts to be more OOP and self contained, and they do not rely on your controllers so much.
Partials are loaded automatically based on the name used in the template. So if you reference `{{>foobar}}` in your template, it will look for that partial in `templates/partials/foobar.mustache`.

To use it, have your view extend the Kostache_Layout class. You can then specify your own layout file by placing it in templates/layout.mustache. At a minimum, it needs to have a {{>content}} partial defined in it.
# Layouts

If you have a view that extends the Kostache_Layout class, but wish to render only the template and not the entire layout, you can set the public $render_layout property to FALSE. This is useful if you want to use the same view class for external requests and HMVC requests.
KOstache supports layouts. To use, just add a `templates/layout.mustache` file (a simple one is already provided), and use `Kostache_Layout` for your renderer instead of `Kostache`. You'll probably want to put a `$title` property in your view class. The layout should include a `{{>content}}` partial to render the body of the page.

$view = new View_Post_List;
if ($this->request !== Request::instance) // Is internal request
{
$view->render_layout = FALSE;
}
# Additional Information

For specific usage and documentation, see:

[PHP Mustache](http://github.com/bobthecow/mustache.php)

[Original Mustache](http://defunkt.github.com/mustache/)
[Original Mustache](http://defunkt.github.com/mustache/)

0 comments on commit 9bb3af1

Please sign in to comment.