2013-09-06 24 views
19

मुझे लगता है कि संस्थाओं की सरणी देता है तो मेरे टहनी टेम्पलेट में मैं यह कर मेरी नियंत्रक में एक समारोह तत्वों से अधिक पुनरावृति करने के लिए है:कॉल पीएचपी समारोह

{% 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 %} 

मेरी नियंत्रक में मैं भी इस पीएचपी कार्य हो :

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>'; 
} 

यह पीएचपी मज़ा करने के लिए संभव पहुँच है इकाई में तत्वों के सभी संभावित संयोजन प्राप्त करने के लिए टवीग टेम्पलेट से उद्धरण? कैसे?

** अद्यतन **

इस समारोह है कि टहनी खाका द्वारा बाद संसाधित संस्थाओं देता है:

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; 
} 
+1

क्यों आप इसे नियंत्रक में फोरहैंड और देखने के लिए दोनों '$ items' और' $ combinations' भेजने की प्रक्रिया नहीं है? –

+0

@ManuelGutierrez मैं कोशिश करता हूं लेकिन यह नहीं जानता कि इस पर कोई विचार कैसे है? – Reynier

+0

सामान्य रूप से डेटाबेस से '$ आइटम' प्राप्त करें, फिर इसे नियंत्रक पर अपने' विस्तारक संयोजन() 'फ़ंक्शन पर पास करें, इसे किसी अन्य चर' $ संयोजन 'पर सहेजें और दोनों को देखें, ये सभी चरण चालू होंगे एक ही नियंत्रक समारोह। –

उत्तर

17

इसकी संभव नहीं सीधे टहनी के अंदर किसी भी पीएचपी समारोह का उपयोग करने की।

आप क्या कर सकते हैं एक ट्विग एक्सटेंशन लिखना है। एक सामान्य संरचना है, कुछ उपयोगिता कार्यों के साथ एक सेवा लिखना, टवीग से सेवा तक पहुंचने के लिए पुल के रूप में एक ट्विग एक्सटेंशन लिखें। ट्विग एक्सटेंशन सेवा का उपयोग करेगा और आपका नियंत्रक भी सेवा का उपयोग कर सकता है। http://symfony.com/doc/current/cookbook/templating/twig_extension.html

चीयर्स:

एक नजर डालें।

8

वहां पहले से ही है एक टहनी विस्तार आप कॉल पीएचपी कार्यों की तरह अपने टहनी टेम्पलेट्स फार्म देता है कि:

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

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

आधिकारिक extension repository देखें।

1

आप द्वारा

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

इस अपने सभी निर्धारित फ़ंक्शन जाँच कर सकते हैं सभी कार्यों की आप सरणी दे देंगे में अपने समारोह में मौजूद है, तो आप इसे पसंद का उपयोग कर सकते हैं:

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

जब मैं इस बात से सहमत अपने नियंत्रक से चर में गुजरने के बारे में टिप्पणियों के साथ आप जुड़वां पर्यावरण की स्थापना करते समय अपरिभाषित कार्यों को भी पंजीकृत कर सकते हैं

$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; 
    }); 

यह एक वस्तु पर एक समारोह बुला के रूप में मूल प्रश्न का अनुरोध किया

1

createproblem से स्वीकार किए जाते हैं जवाब सही है आज़माया नहीं Twig recipe page

से है।

function evilEvalPhp($eval, $args = null) 
{ 
    $result = null; 
    eval($eval); 
    return $result; 
} 

पी एस: लेकिन अगर तुम सच में पता है तुम क्या करते हो और तुम बुराई तरीके कोई आपत्ति नहीं है, यह केवल अतिरिक्त टहनी विस्तार क्या तुमने कभी की आवश्यकता होगी है टेम्पलेट भाषा के रूप में PHP के बजाय ट्विग का उपयोग करने का एकमात्र कारण: अनंत बोरियत!

+0

आप अपने उत्तर में गलत हैं, createproblems उत्तर आपके द्वारा यहां पोस्ट किए गए ऑफ-विषय PHP कोड जैसी कोई सुरक्षा समस्या नहीं पैदा कर रहा है। आप अपने ऑफ-विषय ट्विग टिप्पणी के बारे में भी गलत हैं। मैं कल्पना भी नहीं कर सकता कि इन दिनों कुछ लोग अभी भी पुराने प्रोजेक्ट को अपने प्रोजेक्ट को टेम्पलेटिंग इंजन के रूप में उपयोग करके बर्बाद कर रहे हैं। यह बहुत पहले से उगाया गया है और यह बिल्कुल भयानक कोड बनाने के सर्वोत्तम तरीकों में से एक है। – John

+0

जॉन, कोई भी क्यों सोचता है कि दृश्य-परत में PHP-कोड भयानक कोड बनाएगा? ये झूठ है। एक नज़र डालें ज़ेंड Framkework 1 और 2 (https://framework.zend.com/manual/2.4/en/modules/zend.view.php-renderer.scripts.html) या वर्डप्रेस आदि में डिफ़ॉल्ट दृश्य-रेंडरर पर मेरा PHP कोड ऑफ-विषय नहीं है, क्योंकि यह ट्विग टेम्पलेट से PHP फ़ंक्शन को कॉल करने की अनुमति देता है! – solarbaypilot

1

मुझे आश्चर्य है कि कोड का जवाब पहले से पोस्ट नहीं किया गया है, यह एक लाइनर है।

तुम बस {{ categeory_id | getVariations }}

यह एक एक लाइनर है सकता है:

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

मैं जानता हूँ कि यह एक पुरानी धागा है। लेकिन सिम्फोनी 3.3 के साथ मैं ऐसा किया:

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

Symfony docs

संबंधित मुद्दे