سؤال

أقوم حاليًا بوضع وظيفتي في فصل دراسي وأُنقل مثيلًا لهذه الفئة إلى قالب واتصل بوظيفتي المطلوبة كطريقة فئة.

{{ unneededclass.blah() }}

أنا بحاجة إلى القيام مثل أدناه

{{ blah() }}

هل هو ممكن؟

هل كانت مفيدة؟

المحلول

تحديث 5/14/2015

يشير المعلقون إلى أنني مخطئ في الغالب. إذا كنت بحاجة حقًا إلى وظيفة ، وليس مرشحًا أو ماكروًا ، فيمكنك القيام بذلك مثل مقترح في مستندات الغصين:

$twig = new Twig_Environment($loader);
$function = new Twig_SimpleFunction('blah', function () {
   // ...
});
$twig->addFunction($function);

واستخدام مثل

{{ blah() }}

باختصار ، لا ، هذا غير ممكن.

ومع ذلك ، لا يضيع الأمل!

المرشحات

إذا هذه الوظيفة blah() من المفترض أن تعدل متغير موجود ، فهو أ منقي.

مثال:

//in your PHP
function format_date($date_string,$format_string) {
    return date($format_string,strtotime($date_string));
}
$twig_env->addFilter('format_date',new Twig_Filter_Function('format_date'));

{# in your template #}
{{ some_date|format_date('n/j/Y') }}

(الوسيطة الأولى هي المتغير الذي تقوم بتصفية ، والثاني يتم توفيره بالوسائل العادية)

وحدات الماكرو

إذا ، كما أشرت أعلاه ، فإن وظيفتك ببساطة تخرج HTML ، فهي مرشح جيد ل دقيق.

مثال:

{# in your template #}
{% macro say_hello() %}
<p>Oh! Hello, world!</p>
{% endmacro %}

{# ... later on ... #}
{{ _self.say_hello() }}

أو مع المعلمات:

{% macro input(name,value,type) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}

{{ _self.input('phone_number','867-5309') }}
{{ _self.input('subscribe','yes','checkbox') }}

لماذا ا؟

الشيء الذي يجب تذكره هو أن قوالب الغصين تمثل أ رأي, ، من حيث MVC. هذا يعني أنها معزولة من حيث بيئتها ، ويمكن أن تمثل فقط سياق الكلام تقوم بتمريرها عبر صفيف البيانات الذي تمرره في $template->render() طريقة.

هذا شيء جيد ، لأنه يفصل عرضك التقديمي عن منطقك وبياناتك. إذا تمكنت من الاتصال بشكل تعسفي ، فأنت تزيد فجأة من هذا الاقتران ، وهو أ سيئ شيء.

السبب الآخر لذلك هو الطريقة التي يتعامل بها PHP لتراجعات. فكر في الطريقة التي يجب أن تضطر إلى تمرير هذه الوظيفة إلى القالب الخاص بك ... ربما شيء من هذا القبيل:

function blah() {
    return "<p>Oh! Hello, world!</p>";
}

$template = $twig_env->loadTemplate('template.html');
echo $template->render(array('blah'=>'blah'));

في القالب الخاص بك ، متغير السياق blah الآن مجرد سلسلة تحتوي 'blah'.

في الفانيليا PHP ، عندما تستخدم وظائف متغيرة مثل هذه (حاول استخدام متغير سلسلة مثل وظيفة) ، فإنه (أكثر أو أقل) يؤدي بحثًا عن هذه الوظيفة ، ثم يدعوها. أنت ليس تمرير الوظيفة ، فقط اسم.

الشيء هو أنه لا يمكنك نقل وظيفة إلى قالب ، لأن آلية PHP الوحيدة للقيام بذلك هي عن طريق السلسلة ، وبمجرد داخل القالب ، لم يعد هذا الاسم اسمًا للوظيفة وسلسلة فقط.

انطلق لفترة طويلة قليلاً ، لكنني آمل أن يساعد ذلك!

إذا كنت تريد المزيد من الوثائق ، فإن المستندات الرسمية هنا.

نصائح أخرى

لقد ضاعت كما كنت ، يا صديقي ، ولكن بعد البحث عن الويب للحصول على إجابة ولم أجد شيئًا ، قررت معرفة ما إذا كان بإمكاني القيام بذلك بنفسي. لذلك ، أردت أن أنشر الحل هنا (على الرغم من أنني أعرف أن هذا المنشور قديم) ، لأن هذه هي أول ضربة على Google إذا بحثت عن هذه المشكلة.

هنا يذهب ، الأمر بسيط للغاية في الواقع:

لقد صنعت فصلًا يحتوي على وظائف ومتغيراتي ، على سبيل المثال:

class functionContainer{
        function getRandomNumber()
        {
                return rand();
        }
}
$values = array(
'functions'=> new functionContainer()
);

حتى الآن لدينا قيم $ كصفيف ، والذي يحتوي على هذا الكائن مع دالة "getRandomNumber ()".

عند تقديم ملف القالب ، قم بتضمين هذه الفئة كقيمة:

$twig->render('random.html', $values);

وبهذه الطريقة ، داخل ملف القالب ، يمكنك فقط استدعاء هذه الطريقة للاتصال بالوظيفة والحصول على النتيجة:

{{ functions.getRandomNumber }}

على الرغم من أنه لا يمكنك استدعاء PHP مباشرة ، إلا أن الغصين قابل للتمديد. يمكنك إضافة مرشح قابل للاستدعاء ، حتى تتمكن من التقدم إلى وظائف PHP التي تم تمريرها إلى القالب.

namespace My\Twig\Extension;

class LambdaFilter extends \Twig_Extension {

    public function getName() {
        return 'lambda_filter';
    }

    public function getFilters() {
        return array(
            new \Twig_SimpleFilter('call', array($this, 'doCall'))
        );
    }

    public function doCall() {
        $arguments = func_get_args();
        $callable = array_shift($arguments);
        if(!is_callable($callable)) {
            throw new InvalidArgumentException();
        }
        return call_user_func_array($callable, $arguments);
    }

}

الآن إذا قمت بتمرير متغير my_func للقالب ، يمكنك القيام به my_func|call(arg1, arg2). يمكنك حتى القيام وظائف ترتيب أعلى "array_filter"|call(my_array, my_func) ويمكنك دائمًا القيام بالمزيد من الأشياء في مرشح مثل قبول الصفيف كمعلمات وما إلى ذلك.

الجواب الكامل:http://twig.sensiolabs.org/doc/advanced.html#id2

أفضل استخدام امتداد غصين مثل هذا:

namespace Some\Twig\Extensions;

class MenuExtensions extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('sidebar_menu', [$this, 'generate_sidebar_menu']),
        );
    }

    public function generate_sidebar_menu($menu){
        return $menu;
    }

    public function getName()
    {
        return 'menu';
    }
}

في القالب:

{{ sidebar_menu('some text') }}

استخدام فئة مجهولة

إنشاء فئة مجهولة في المدير/وحدة التحكم/الخدمة ..

     $functions = new class($router)
    {
        public function __construct($router)
        {
            $this->router = $router;
        }

    public function getRowUrl(FileManager $fileManager)
    {
        if ($fileManager->isNode()) {
            return $this->router->generate('...', ['parent' => ...]);
        }
        return $this->router->generate('...', ['entity' => ...]);
    }
};

لصق المعلمة في العرض

$params=[
            'functions' => $functions

        ];



    return new Response($this->twig->render('...:index.html.twig', $params));

استخدم الوظيفة في العرض

 {% set rowUrl = functions.rowUrl(entity) %}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top