Includes:
- php-based MVC framework
- templating engine
It's quite simple. I just wrote what I needed to have. Lightweight, easy to understand, without fancy stuff. Probably easy hackable. >_<
Features:
if/else
branchingforeach
loopblock
of code{variable|modifier}
[foreach post in 10|Posts::recent]
<h1>{post.title}</h1>
<div class="content">
{post.content}
[if post.favorited]
This page has been favorited.
[end]
[if post.comments|empty]
This page doesn't have any comments.
[else]
This page has {post.comments|count} comments.
<ul>
[foreach comment in post.comments]
<li>{comment.author} said: {comment.text}</li>
[end]
</ul>
[end]
</div>
<div class="about">
Author: [block post.author]Dragan Okanovic[end]
Date: {post.formatDate('nice')}
</div>
[end]
class SampleController extends Controller {
public function run()
{
# load template
Template::load('list_posts')
# generate html
->render();
}
}
Instructions are written inside the []
and variables are inside the {}
.
You can access simple variables, class variables and their properties or arrays. You can also put modifiers.
{var.prop} # $var->prop
{var.key} # $var['key']
{var.method()} # $var->method()
{var|modif1,modif2} # modif2( modif1($var) )
Modifiers are global or static functions.
Method calls can take arguments.
Example:
class Post
{
public $title;
public $datetime;
public $comments;
public static $config = array( 'table' => 'post' );
public static $className = 'Post';
public function getTime() { ... }
public function formatTime($format) { ... }
public static function getRecent($num) { ... }
}
{post.title} # access property
{Post::$config.table} # access static property
{post.getTime()} # call method
{post.formatTime('nice')} # call method with parameters
# modifiers
{post.title|strtolower,ucfirst} # ucfirst( strtolower( $post->title ) )
[foreach p in 10|Post::recent] # use of modifier to call static method with param - a trick! :D
...
[end]
[if !post.comments|empty] # same as it would be post.hasComments() but much prettier
Post has {post.comments|count} comms.
[end]
There is a total of {Post::all()|count} posts.
{post|var_dump} # good for debugging :D
It must have exactly one mathicng [end]
tag, whether it has [else]
branch of not.
[if condition] ... [end]
[if !notCondition] ... [end]
[if condition] ... [else] ... [end]
Well, pretty self-explainatory.
[foreach post in post.getRecent()]
{post.show()}
[end]
[foreach post in 5|Post::recent]
...
[end]
If the variable named like the block's name is set, then that value is used, otherwise default stays.
[block content]
This text will remain as is, if not overwritten by a variable named 'content'.
[end]
There's no template-wise inheritance. Blocks can be replaced with something like:
[if content]
{content}
[else]
Default html.
[end]