Lightweight, PHP based, layout framework…know of a

2019-03-10 10:33发布

I'm looking for a lightweight, PHP based, layout framework. Like how the Zend Framework, uses layouts, I would like to create a layout template and include only the content for the necessary pages.

<html>
<head>
<title><?= $pageTitle ?></title>
</head>
<body>
<?= $content ?>
</body>
</html>

Anyone know of anything that does this? I would use the Zend Framework, but it's just too much for what I want to achieve.

8条回答
2楼-- · 2019-03-10 11:05

FryPHP is about as lightweight as it gets.

查看更多
该账号已被封号
3楼-- · 2019-03-10 11:06

I vote for PHP. (PHP is a templating engine.)

function template($file, $vars) {
  ob_start();
  if(count($vars) > 0) { extract($vars); }
  include 'views/'.strtolower($file).'.php';
  return ob_get_clean();
}

Which, incidentally, lets you do the following.

echo template('layout', array( 'content' => template('page', $myData) ));

Should you even bother using another templating/layout engine at all, when PHP itself can suffice in a mere 6 lines?

Edit:

Perhaps I wasn't clear with how this works.

template() is called with the name of the template (subdirectories for organization work too) with an array object as the second parameter. If the variables given aren't blank, like template('index',null) is, then the array is treated as an associative array: and every key becomes a variable containing the value.

So the logic becomes:

template('my_template', array(
  'oranges' => 'apples'
));

And "views/my_template.php" is:

<html>
<head>
  <title>Are apples == <?= $oranges ?>?</title>
</head>
<body>
  <p style="color: <?= $oranges == 'oranges' ? 'orange" : 'darkgreen' ?>">
    Are apples == oranges?
  </p>
</body>
</head>

So, every time the variable $oranges is used PHP gets the data that was exported from the array, $vars['oranges'].

So all the output is then taken by ob_get_clean() and returned as a string. To output this string just echo or print, or assign it to an array to be passed as content to the layout. If you understand this, then it is very easy to take what I've written and make a layout out of it, or pages with logic that output JSON even.

I would advise you to experiment with this answer before discarding it. It has a tendency to grow on you.

Edit 2:

As requested I'll show the directory layout that my project would use. Do note that other MVC frameworks use a different structure. But, I like the simplicity of mine.

index.php
application/
  framework.php
  controllers/
    welcome.php
views/
  template.php
  index.php

For security purposes, I have an .htaccess file that routes every request, except those to js/ or css/, to the index.php script, effectively making my directories hidden. You could even make the CSS via a template if you wished, which I've done, for the use of variables, etc.

So, any call made to template('template', array()) will load the file ./views/template.php automatically. If I included a slash in the name, it becomes part of the path, like so: ./views/posts/view.php.

Edit 3:

thanks for your update. So you must have some code in your index.php file that routes the requested url to the appropriate controller, correct? Could you show some of this? Also, it doesn't look like your views mirror your controller directory. Can you explain a little more how urls map to controllers and/or views? What do you have in framework.php? What does it do? Thanks!

The code I've shown is a tiny excerpt of my private framework for web development. I've talked already about potentially releasing it with a dual-license, or as donation-ware for commercial use, but it's nothing that can't be written by anyone else in a short (15-21 days) time. If you want you can read my source code on GitHub... but just remember that it's still alpha material.

The license is Creative Commons SA.

查看更多
放荡不羁爱自由
4楼-- · 2019-03-10 11:06

If you want super-lightweight, you could use an auto-prepend file, mixed with some output buffering to build what you want. For starters, you need to set up your prepend and append files - put the following lines in your .htaccess file (you'll probably want to make the prepend and append files unreadable to visitors, too):

php_value auto_prepend_file prepend.php
php_value auto_append_file  append.php

Then in your prepend.php file, you'll want to turn on output buffering:

<?php
ob_start();

In append.php, you'll want to grab the contents of the output buffer, clear the buffer and do any other processing of the content you want (in this example, I set a default page title).

<?php
    if (!isset($page_title)) {
        $page_title = 'Default Page Title';
    }

    $content = ob_get_contents();
    ob_end_clean();
?>
<html>
    <head>
        <title><?php echo $page_title; ?></title>
    </head>

    <body>
        <?php echo $content ?>
    </body>
</html>

After this, you can write each page normally. Here's an example index.php

<?php
    $page_title = "Index Page!";
?>

<h1>This is the <?php echo __FILE__; ?> page</h1>

...and an example other.php that does something halfway interesting:

<?php
    $page_title = "Secondary Page!";
?>

<h1>This is the <?php echo __FILE__; ?> page</h1>
<p>enjoy some PHP...</p>

<ol>
    <?php for ($i = 1; $i <= 10; $i++) : ?>
        <li><?php echo "$i $i $i"; ?></li>
    <?php endfor ?>
</ol>

And you're done. You can grow on this a bit, such as initializing DB connection in the prepend, but at some point, you'll probably want to move to a more abstract system that breaks out of a fixed mapping of URLs to paths and files.

查看更多
We Are One
5楼-- · 2019-03-10 11:13

I've been using Smarty for ages. It's mature, actively maintained, and widely supported.

Anyway, you'll find a whole range of template engines here: http://en.wikipedia.org/wiki/Template_engine_(web)

If you click the languages column, you'll easily see what's available for PHP, and how the engines compare.

查看更多
看我几分像从前
6楼-- · 2019-03-10 11:13

Just to throw in another framework: CodeIgniter is IMHO very nice, uses an MVC approach, so you'd output your files as views and says to have a small footprint. It also has a template parser on board.

Cheers,

查看更多
淡お忘
7楼-- · 2019-03-10 11:14

Limonade might also be useful... not strictly layout.

查看更多
登录 后发表回答