2017-08-16 165 views
1

我在Ubuntu上運行Apache和PHP 17.04 我正在使用樹枝。我像這樣安裝了Twig。如何使用樹枝創建擴展

cd /var/www/html/my-new-website 
composer install twig/twig 
composer require twig/twig 

在這一點上我一直在用嫩枝的方法是:首先,我創建一個PHP文件,並做一些東西,建立一個數組並呈現與陣列數據的模板。接下來,我將頁面的各個部分分開放置在模板中。

這裏是一個示例index.php,它創建一個目錄數組,然後使用位於templates目錄中的files.html.twig進行渲染。

<?php 
require_once 'vendor/autoload.php'; 
$loader = new Twig_Loader_Filesystem('templates'); 
$twig = new Twig_Environment($loader, array(
    'cache' => 'cache', 
)); 

$dir = "path/to/dir"; 
$exclude = array(".","..",".*","index.php"); 
$files = array_diff(scandir($dir), $exclude); 

/* 
echo ''; print_r($files); 
*/ 

$template = $twig->loadTemplate('files.html.twig'); 
echo $template->render(['files' => $files]); 
?> 

這裏是files.html.twig,它擴展了 「base.html.twig」

{% extends "base.html.twig" %} 

{% block title %} 
My Directory Listing 
{% endblock %} 

{% block content %} 
    {% for file in files %} 
     <li><a href="{{ file | url_encode }}">{{ file }}</a></li> 
    {% endfor %} 
{% endblock %} 

和base.html.twig包含導航欄和頁腳主包裝。這一切都按預期工作。

現在我有我的base.html.twig中的導航欄,它只是HTML我必須編輯的項目。

我已經做了一個php函數來獲取在模板(navbar.html.twig)中工作的navbar數組,但問題是我必須在每個創建的頁面中放入或包含這個php函數。我希望我的navbar.html.twig模板直接從php函數獲取數組。

我相信我需要創建一個樹枝擴展(php函數)並註冊它。我已閱讀關於此的文檔(全部似乎是爲了一個完整的symfony安裝,我只使用樹枝)。

我認爲這篇文章是在正確的道路上,但沒有給我我需要了解Call PHP function from Twig template

的信息,我沒有得到

  1. 在那裏把我的PHP功能?我可以創建一個名爲擴展名的文件夾並在其中放置一個navbar-list-funtion.php文件嗎?
  2. 在哪裏註冊函數,以便可以從模板中調用?一些文檔說要註冊在app/config/services.yml(我沒有這個文件或目錄)
  3. 我把PHP函數放在一個公認的地方,然後註冊它,...我將如何調用模板navbar.html.twig中返回的數組?
+0

如果你沒有使用像框架symfony中,只要按照官方的[文件]中的步驟(https://twig.symfony.com/doc/2.x/advanced.html#creating-an-extension) – DarkBee

+0

謝謝@darkbee,我一直並將繼續閱讀文檔。我只是不明白,因此我在這裏發佈的原因。 – dreadycarpenter

回答

1

從註釋

如果你不使用symfony這樣的框架,它是一個基於你如何應對這種局面有點味道。我,我自己,我在我的項目中使用命名空間來啓用自動加載作曲家。我的樹形結構緊跟着我的名字空間,例如My/Project/Twig/Extensions

「最好」的方法來擴展Twig是通過使用Twig_Extension 類只需將文件夾中的一個新的文件,你有一個合適的名稱


注創建:作爲關嫩枝2。X功能getName()不再委託人

我/項目/嫩枝/擴展/ ProjectTwigExtension.twig

namespace My/Project/Twig/Extensions 

class ProjectTwigExtension extends Twig_Extension { 

    public function getFunctions() { 
     return array(
      new Twig_SimpleFunction('twig_function_name', array($this, 'getTwigFunctionName')), 
      new Twig_SimpleFunction('twig_function_foo', array($this, 'getTwigFunctionFoo')), 
      //and so on....,    
     ); 
    } 

    public function getFilters() { 
     return array(
      new Twig_SimpleFilter('twig_filter_name' , array($this, 'getTwigFilterName')), 
      new Twig_SimpleFilter('twig_filter_foo' , array($this, 'getTwigFilterFoo')), 
      //and so on...., 
     ); 
    } 

    public function getName() { 
     return 'ProjectTwigExtension'; //this is mandatory for twig < 2.0 
    }   
} 

通過使用擴展類,你可以很容易地組所有功能/過濾器/節點/全局/ ...創建此類後,您只需在Twig內註冊該類。由於我不知道具體情況,你需要在你的項目中,你做

$twig = new Twig_Environment($loader); 

註冊類只使用下面的行看,

$twig->addExtension(new ProjectTwigExtension()); 

正如你可以擴展類有一個功能getFunctions,在這裏你可以定義你想要的所有功能。

new Twig_SimpleFunction('twig_function_name', $callable) 

的第一個參數定義了該函數將樹枝模板中被調用,第二個參數是一個callable

  • new Twig_SimpleFunction('twig_function_name', array($this, 'method'))
    會調用該函數method當前的擴展類中
  • new Twig_SimpleFunction('twig_function_name', 'trim')
    將調用全局函數trim
  • new Twig_SimpleFunction('twig_function_name', array($obj, 'method'))
    會調用該函數實例$obj
  • new Twig_SimpleFunction('twig_function_name', array('MyClass', 'method'))
    將調用靜態函數methodMyClass
  • new Twig_SimpleFunction('twig_function_name', function($arg1, $arg2) { // ...; })
    將執行關閉method
+0

uggg,我想我只會在每個創建的頁面中處理php include。 – dreadycarpenter