2012-04-11 12 views
16

मैं निम्नलिखित विशेषता का उपयोग http://www.propelorm.org/documentation/09-inheritance.html से कर रहा हूं।विरासत वस्तुओं के लिए Twig उदाहरण

मैं भी Symfony2 और टहनी

उपयोग कर रहा हूँ मैं एक वर्ग संरचना ऊपर विशेषता यह है कि इस

class Event {} 

class Birthday extends Event {} 

class Walking extends Event {} 

अब मैं एक टहनी टेम्पलेट के लिए एक घटना वस्तु पारित तरह दिखता है का उपयोग करते हुए है और मैं चाहता हूँ पता है कि यह किस प्रकार की घटना है

उदाहरण के लिए, यदि मैं जन्मदिन पर एक केक की एक छवि प्रदर्शित करना चाहता हूं और यदि यह चलने की घटना है तो मैं नक्शा मार्ग प्रदर्शित करना चाहता हूं।

मैं टवीग में उदाहरण का उपयोग नहीं कर सकता क्योंकि यह सुविधा मौजूद नहीं है। क्या कोई अब यह क्यों अस्तित्व में नहीं है? और वहाँ एक तरह से मैं घटना कक्षा में तरह

public function getType() 
प्रत्येक वर्ग में

, या

public function isBirthday() 

कुछ करने के लिए बिना इस कार्यक्षमता को दोहराने कर सकते हैं।

मुझे यह गिटूब पर मिला लेकिन यह मेरे लिए कोई उपयोग नहीं है। मैंने उन पर टिप्पणी की है कि क्या मुझे जवाब मिल सकता है या नहीं।

https://github.com/fabpot/Twig/issues/553

उत्तर

49

मैं विचार साझा करें, कि instanceof कुछ भी नहीं है कि एक टेम्पलेट में दिखाई देनी चाहिए है। मैं इस मामले

class MyTwigExtension extends TwigExtension 
{ 
    public function getTests() 
    { 
     return [ 
      new \Twig_SimpleTest('birthday', function (Event $event) { return $event instanceof Birthday; }), 
      new \Twig_SimpleTest('walking', function (Event $event) { return $event instanceof Walking; }) 
     ]; 
    } 
} 

के लिए और

{% if event is birthday %}{# do something #}{% endif %} 
+0

मुझे लगता है कि मैं सिर्फ घना हूँ , लेकिन मुझे लगता है कि @ fabpot/Twig में कहीं भी TwigTest क्लास को खोजने में सक्षम नहीं लगता है। क्या आपने एक कस्टम क्लास परिभाषित की है जो '\ Twig_Test' तक फैली हुई है, या यह किसी अन्य वर्ग के लिए उपनाम है? '\ Twig_Test' स्वयं सार है और इस प्रकार अनजान है। –

+2

इसे मिला। मैं अनुमान लगा रहा हूं कि पिछले छह महीनों में कक्षा का नाम किसी बिंदु पर बदला गया था। '\ Twig_SimpleTest' उपरोक्त 'TwigTest' के स्थान पर काम करता है। देखें: http://twig.sensiolabs.org/doc/advanced.html#tests –

+1

@TwoWholeWorms नहीं, मैं उन्हें 'उपयोग \ Twig_Test जैसे TwigTest के रूप में आयात करना चाहता हूं; // या यहां तक ​​कि "परीक्षण के रूप में" (और यह कहीं से कॉपी-पेस्ट किया गया था)। समग्र कोडिंग शैली में बेहतर फिट बैठता है – KingCrunch

4

एक टेम्पलेट में instanceof का उपयोग करते हुए एक प्रयोग वास्तुकला के दृष्टिकोण से इस पर सिकोड़ी है। यदि आप खुद को ऐसी स्थिति में पाते हैं जहां आपको इसकी आवश्यकता है, तो संभवतः आपने अपने आर्किटेक्चर में एक समस्या का खुलासा किया है। आपके मामले में आपका GetType समाधान शायद सबसे अच्छा है। आप इसे अभी भी इवेंट बेस क्लास में डाल सकते हैं और इसे लागू करने वाले वर्ग के नाम को पढ़ सकते हैं।

5

इसे पूरा करने का एक अप्रत्यक्ष तरीका विधि के लिए ऑब्जेक्ट का परीक्षण करेगा, अगर आपको पता है कि प्रत्येक विरासत वाली वस्तु का एक अनूठा तरीका है। हो सकता है कि आपकी जन्मदिन की कक्षा में जन्मदिन हो(), जबकि आपके चलने वाले वर्ग में getMap() है?

{% if yourobject.methodName is defined %} 
    //Stuff that should only output when the object in question has the requested method 
{% endif %} 
+0

प्रत्येक ऑब्जेक्ट में ट्विग द्वारा जोड़ा गया कोई जादू '। विधि' गेटटर नहीं है। इसलिए जब तक 'yourobject' में वास्तव में "विधि" नामक विधि नहीं है, तो अभिव्यक्ति कभी भी सच नहीं होगी। इसके बजाय बस '{% का उपयोग करें यदि आपका ऑब्जेक्ट.एमथनाम नाम परिभाषित किया गया है%} 'जहां" methodName "आपके द्वारा जांचे जा रहे फ़ंक्शन का सटीक नाम है। – flu

+0

आप सही हैं, मैंने कुछ दस्तावेज़ों की गलत व्याख्या की है –

+0

उन लोगों के लिए, जो जानना चाहते हैं: "डक-टाइपिंग" नामक चीजें http://en.wikipedia.org/wiki/Duck_typing :) – KingCrunch

0

मैं एक index.html.twig कि संस्थाओं है कि उपयोगकर्ता द्वारा परिभाषित कर रहे सूचीबद्ध करता है बनाने के लिए कोशिश कर रहा हूँ, और केवल टेम्पलेट में टहनी-परीक्षण का उपयोग फ़ील्ड जिन्हें 'addToListing' के रूप में चिह्नित किया गया है, इसलिए मैं उस बिंदु पर पहुंच गया जिसमें मुझे नहीं पता कि मैं क्या प्रिंट कर रहा हूं।

{% for entity in entities %} 
    <tr> 
     {% for heading in headings %} 
      <td><a href="{{ path('document_show', { 'id': entity.id, docType: metaData.className }) }}">{{ attribute(entity, heading) }}</a></td> 
     {% endfor %} 
    </tr> 
{% endfor %} 

और शीर्षक एक \ DateTime होता है:/तो ऐसे मामले के लिए मुझे आवश्यकता होगी। तिथि ('प्रारूप') या कुछ बेहतर समाधान।

मेरे लिए एक साफ समाधान पर कोई सलाह?

+0

उपर्युक्त समाधान ठीक काम नहीं करेगा, क्योंकि यह एक डेटटाइम है जिसे आप जानते हैं कि इसमें अन्य चीजों के साथ प्रारूप प्रारूप है। अगर मैं आपके उदाहरण को समझता हूं जैसे 'if entity.format परिभाषित किया गया है' तो चाल चलनी चाहिए! –

+0

मैं, मैं शीर्षक प्रकार के बारे में चिंतित था। मैंने आंतरिक एचटीएमएल को एक ऐसे टेम्पलेट द्वारा प्रतिस्थापित किया है जो अब तक दिखता है: '{% अगर bridge.is_scalar (विशेषता (इकाई, शीर्षक)) या विशेषता (इकाई, शीर्षक) .__ toString को या विशेषता (इकाई, शीर्षक) परिभाषित किया गया है शून्य%} {{विशेषता (इकाई, शीर्षक) है? : 'खाली'}} {% else%} {% अगर पुल.get_class (विशेषता (इकाई, शीर्षक)) == 'दिनांक समय'%} {# {डंप (पुल।get_class (विशेषता (इकाई, शीर्षक))}} #} {{विशेषता (इकाई, शीर्षक) | तिथि (दिनांकफॉर्मेट)}} {% else%} {% endif%} {% endif%} ' – juanmf

+0

यहां ब्रिज है: 'नामस्थान डॉकडिजिटल \ बंडल \ दस्तावेज़बंडल \ हेल्पर; /** * Nasty सामान टहनी * * @author जुआन मैनुअल फर्नांडीज <[email protected]> */ वर्ग TwigPhpBridge { सार्वजनिक समारोह __call ($ functionName, सरणी $ में आवश्यक php FNS समर्थन करने के लिए argv) { वापसी call_user_func_array ($ functionName, $ argV); } } ' – juanmf

0

मुझे इसी तरह की समस्या थी, यह होटल सॉफ्टवेयर में विरासत से संबंधित था। मेरे पास बेस क्लास "रूमक्वामेंट" था, और "बेड", "इलेक्ट्रिक एप्पलमेंट्स" के साथ विरासत ....

class BaseRoomEquipment {} 

class Bed extends BaseRoomEquipment {} 

class ElectricAppliances extends BaseRoomEquipment {} 

और निश्चित रूप से, RoomEquipment की ओर OneToMany के संबंध में एक कक्षा "कक्ष"।

टेम्पलेट पर, मैं केवल बिस्तर प्रस्तुत करना चाहता था, लेकिन कक्ष बेस उपकरण से संबंधित है, जिसमें बिस्तर और बिजली के उपकरण शामिल हैं।

ट्विग टेम्पलेट में परीक्षण करने के बजाय, कक्ष कक्षा में मैंने एक विधि getBeds बनाई है, और यह है।

class Room { 

    private $equipment; 

    public getBeds() 
    { 
    $res = []; 
    foreach($this->getEquipment() as $eq) { 
     if ($eq instanceof Bed) $res[] = $eq; 
    } 
    return $res; 
    } 

    // Rest of class here.... 

} 

और, बेशक, टहनी में:

<div> 
    {% for Bed in Room.beds %} 
     {{ Bed.nbPersons }} 
    {% endfor %} 
</div> 

संपत्ति Accessor घटक के लिए धन्यवाद - यह संभव है। अब, अपने टहनी उदाहरण प्रकार के बारे में जांच करने के लिए नहीं है, और न ही यह होता है कोई

0

एक अन्य समाधान:

class Event { 
    ... 
    public function isInstanceOfBirthday() { 
     return $this instanceof Birthday; 
    } 
} 

तो यह होगा किसी भी वर्ग के साथ काम करता है कि में फिर से

class Birthday extends Event {} 

class Walking extends Event {} 

वारिस अपने टहनी:

{{ event.isInstanceOfBirthday ? ... something for Birthday instance ... : ... something for Walking instance ... }} 

या

{% if event.isInstanceOfBirthday %} 
    ... do something for Birthday instance ... 
{% else %} 
    ... do something for Walking instance ... 
{% endif %} 
संबंधित मुद्दे