web-dev-qa-db-ja.com

PHP function from Twig template

コントローラーにエンティティの配列を返す関数があるので、twigテンプレートで要素を反復処理するためにこれを行います:

{% for groupName, entity in items %}
    <ul>
        <ul>
            {% for element in entity %}
                <li>{{ element.getLabel }}</li>
                <li><input type="text" name="detail[{{ element.getId }}]" id="pd_{{ element.getId }}" /><input type="text" name="price[{{ element.getId }}]" id="pd_price_{{ element.getId }}" /><input type="text" name="stock[{{ element.getId }}]" id="pd_stock_{{ element.getId }}" /></li>
            {% endfor %}
        </ul>
    </ul>
{% endfor %}

私のコントローラーには、このPHP関数:

private function DetailCombination($arr, $level, &$result, $curr = array()) {
    for ($i = 0; $i < count($arr); $i++) {
        $new = array_merge($curr, array($arr[$i]));
        if ($level == 1) {
            sort($new);
            if (!in_array($new, $result)) {
                $result[] = $new;
            }
        } else {
            combinations($arr, $level - 1, $result, $new);
        }
    }
}

この方法で呼び出すことができます:

for ($i = 0; $i < count($arr); $i++) {
    $this->DetailCombination($arr, $i + 1, $result);
}

// TEST
foreach ($result as $arr) {
    echo join(" ", $arr) . '<br>';
}

PHP関数からTwigテンプレートにアクセスして、エンティティ内の要素のすべての可能な組み合わせを取得するにはどうすればよいですか?

**更新**

これは、Twig Template:によって処理されたエンティティを返す関数です。

private function getVariations($category_id) {
    $items = array();

    $em = $this->getDoctrine()->getManager();
    $entityCategory = $em->getRepository('CategoryBundle:Category')->find($category_id);

    foreach ($entityCategory->getProductDetails() as $entity) {
        if ($entity->getToProduct() == 1) {
            foreach ($entity->getDetailGroup() as $group) {
                if (!array_key_exists($group->getName(), $items)) {
                    $items [$group->getName()] = array();
                }

                $items [$group->getName()] [] = $entity;
            }
        } 
    }

    return $items;
} 
22
Reynier

PHP内のTwig関数に直接アクセスすることはできません。

できることは、Twig拡張を書くことです。一般的な構造は、いくつかのユーティリティ関数を使用してサービスを作成し、Twig拡張をtwigからサービスにアクセスするためのブリッジとして作成します。 Twig拡張機能はサービスを使用し、コントローラーもサービスを使用できます。

ご覧ください: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

乾杯。

20
createproblem

次のようなTwigテンプレートからPHP関数を呼び出すことができるTwig拡張が既にあります。

Hi, I am unique: {{ uniqid() }}.

And {{ floor(7.7) }} is floor of 7.7.

公式の 拡張リポジトリ を参照してください。

9
umpirsky

すべての定義済み機能を確認するには

$arr = get_defined_functions();
print_r($arr);

これにより、すべての関数の配列が得られます。関数が存在する場合は、次のように使用できます。

 {{ user.myfunction({{parameter}}) }}
4

コードの回答がまだ投稿されていないことに驚いています。それは1つのライナーです。

ただ{{ categeory_id | getVariations }}

ワンライナーです:

$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations'));
2
John

コントローラから変数を渡すことに関するコメントには同意しますが、twig環境を設定するときに未定義の関数を登録することもできます

$twig->registerUndefinedFunctionCallback(function ($name) {
        // security
        $allowed = false;
        switch ($name) {
            // example of calling a wordpress function
            case 'get_admin_page_title':
                $allowed = true;
                break;
        }

        if ($allowed && function_exists($name)) {
            return new Twig_Function_Function($name);
        }

        return false;
    });

これは Twigレシピページ

元の質問が要求されたため、オブジェクトの関数を呼び出そうとしなかった

1

これは古いスレッドです。しかし、symfony 3.3ではこれを行いました:

{{ render(controller(
    'AppBundle\\Controller\\yourController::yourAction'
)) }}

Symfony docs

0
Refilon