如何在PHP函数中获取Twig模板引擎标头标记

时间:2014-10-15 17:57:31

标签: php twig

我正在尝试扩展Pico navigation plugin以从导航树中排除项目,其中页面使用Twig template engine标题标记。

我的问题是如何从下面的PHP函数中的.md文件中获取特定的标题标记并过滤它们以在导航树中排除?

该插件目前通过config.php文件中的以下设置实现了从树中省略项目(页面和文件夹)的功能:

//  Exclude pages and/or folders from navigation header
$config['navigation']['hide_page'] = array('a Title', 'another Title');
$config['navigation']['hide_folder'] = array('a folder', 'another folder');

插件文件中的当前函数使用上面的config.php,如下所示:

private function at_exclude($page) {

    $exclude = $this->settings['navigation'];
    $url = substr($page['url'], strlen($this->settings['base_url'])+1);
    $url = (substr($url, -1) == '/') ? $url : $url.'/';

    foreach ($exclude['hide_page'] as $p) {

        $p = (substr($p, -1*strlen('index')) == 'index') ? substr($p, 0, -1*strlen('index')) : $p;
        $p = (substr($p, -1) == '/') ? $p : $p.'/';

        if ($url == $p) {
            return true;
        }
    }

    foreach ($exclude['hide_folder'] as $f) {

        $f = (substr($f, -1) == '/') ? $f : $f.'/';
        $is_index = ($f == '' || $f == '/') ? true : false;

        if (substr($url, 0, strlen($f)) == $f || $is_index) {
            return true;
        }
    }
    return false;
}

我需要在.md文件中使用Twig标题标记'Type'和'Status'添加从树中省略项目(或页面)的功能:

/*
Title: Post01 In Cat01
Description: This post01 in cat01
Date: 2013-10-28
Category:
Type: post      // Options: page, post, event, hidden
Status: draft   // Options: published, draft, review
Author: Me
Template: 
*/
...
The MarkDown content . . .

因此,如果用户想要删除“type”标记中标记为“post”的项目和/或“draft”标记中的“draft”(请参阅​​上面的标题),则他们会在数组中添加链接标记下面我加入了config.php:

//  Exclude taged items:
$config['navigation']['hide_status'] = array('draft', 'maybe some other status tag');
$config['navigation']['hide_type'] = array('post', 'etc');

我还在at_exclude()函数的底部添加了以下内容:

private function at_exclude($page) {
. . .
    foreach ($exclude['hide_staus'] as $s) {

        $s = $headers['status'];

        if ($s == 'draft' || 'review') {
            return true;
        }
    }

    foreach ($exclude['hide_type'] as $t) {

        $t = $headers['type'];

        if ($t == 'post' || 'hidden') {
            return true;
    }

    return true;
}
. . .

这显然不适合我(因为我的PHP知识有限)。任何有关我所缺少,做错或如何添加此功能的帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我潜入了(不那么漂亮)的Pico代码,这些都是我的发现。

首先,Pico不会读取您添加到内容标题中的每个自定义字段。 相反,它有一个要解析的内部字段数组。幸运的是,提供了一个名为before_read_file_meta的钩子来修改数组。 在at_navigation.php中我们将添加:

/**
 * Hook to add custom file meta to the array of fields that Pico will read
 */
public function before_read_file_meta(&$headers)
{
    $headers['status'] = 'Status';
    $headers['type'] = 'Type';
}

这将导致Pico读取标题,但它不会将字段添加到页面数据中。我们需要另一个钩子get_page_data。在同一个文件中:

/**
 * Hook to add the custom fields to the page data
 */
public function get_page_data(&$data, $page_meta)
{
    $data['status'] = isset($page_meta['status']) ? $page_meta['status'] : '';
    $data['type'] = isset($page_meta['type']) ? $page_meta['type'] : '';
}

现在,在at_exclude函数中,我们可以添加新逻辑。 (我们配置了一个我们想要排除的状态和类型数组,而不是循环,我们将检查是否与当前页面状态/类型匹配)

private function at_exclude($page)
{
    [...]
    if(in_array($page['status'], $exclude['status']))
    {
        return true;
    }

    if(in_array($page['type'], $exclude['type']))
    {
        return true;
    };

    return false;
}

现在让我们自定义config.php(我使用插件标准标准化配置):

$config['at_navigation']['exclude']['status'] = array('draft', 'review');
$config['at_navigation']['exclude']['type'] = array('post');

全部完成!
但是,如果你刚刚开始,我建议你使用更成熟和最近的平面文件cms。除非你坚持使用PHP5.3

答案 1 :(得分:0)

我决定简化功能,从config.php中省略它,因为它确实不需要由最终用户设置。通过这样做,通过省略通过其他文件的所有检查,at_exclude()函数在后端更加简单和快捷:

at_exclude {

  . . .

    $pt = $page['type'];
    $ps = $page['status'];

    $home = ($pt == "home");
    $post = ($pt == "post");
    $event = ($pt == "event");
    $hide = ($pt == "hide");

    $draft = ($ps == "draft");
    $review = ($ps == "review");

    $type = $home || $post || $event || $hide;
    $status = $draft || $review;

    if ( $type || $status ) {
        return true;
    };

    return false;
}

显然,它需要一些整理,但你得到了图片。日Thnx