2012-05-10 14 views
20

में ट्रिडियन घटक लिंक हल नहीं कर रहा है मैं वर्तमान में ट्रिडियन 200 एसपी 1 में कार्यक्षमता को कार्यान्वित कर रहा हूं, जहां उपयोगकर्ता एक फ़िल्टर का उपयोग करने में सक्षम है जो बदले में ब्रोकर से मिलान मानदंडों के लिए पूछताछ करता है और फिर पृष्ठ पर घटक प्रस्तुतिकरण देता है। लौटाए गए प्रत्येक आइटम में एक घटक लिंक होता है।गतिशील घटक प्रस्तुति

मूल रूप से गतिशील सीपी ब्रोकर डीबी में HTML टुकड़ों के रूप में संग्रहीत किए गए थे, लेकिन यह पता चला कि सीपी को इस तरह से संग्रहीत करते समय, ट्रिडियन सामग्री से घटक लिंक को पट्टी कर देगा और HTML में रिक्त स्थान छोड़ देगा।

मैंने फिर सेटिंग को स्विच किया ताकि गतिशील सीपी अब फाइलस्टोर पर एसीएक्स नियंत्रण के रूप में संग्रहीत हो जाएं। जब यह सेटिंग उपयोग की जाती है, तो <tridion:ComponentLink ... /> को एक्सेक्स फ़ाइल में सफलतापूर्वक संग्रहीत किया जाता है।

हालांकि, जब मैं स्क्रीन पर परिणाम प्रस्तुत करने आया हूं, तो घटक लिंक हल नहीं किया जा रहा है और मुझे अपने परिणामस्वरूप स्रोत में <tridion:ComponentLink ... /> के साथ छोड़ा जा रहा है।

वर्तमान में, मैं सीपी सामग्री को वापस करने के लिए GetComponentPresentation विधि का उपयोग कर रहा हूं जिसे डिस्प्ले के लिए पुनरावर्तक से बंधने से पहले सूची में जोड़ा जाता है।

संक्षिप्त कोड के नीचे है:

ComponentPresentationFactory CPFactory = new ComponentPresentationFactory(); 
List<string> componentPresentations = new List<string>(); 

for (int i = 0; i < tbl.Rows.Count; i++) 
{ 
    ComponentPresentation cp = CPFactory.GetComponentPresentation(
              tbl.Rows[i][0].ToString(), 
              strComponentTemplate.ToString()); 

    if (cp != null) 
    { 
     componentPresentations.Add(cp.Content); 
    } 
} 

इस सूची में हमेशा की तरह पुनरावर्तक के लिए बाध्य है:

rptOffer.DataSource = componentPresentations; 
rptOffer.DataBind(); 

किसी को भी पता है कि कैसे मैं हल किया जाना घटक लिंक मजबूर कर सकते हैं और GetComponentPresentation फ़ंक्शन मेरे लिए ऐसा क्यों नहीं करता है?

क्या ऐसा कुछ है जो मुझे अलग-अलग करना चाहिए या क्या यह संभव है कि मैं इसे लागू कर रहा हूं?

मैंने पुष्टि की है कि tridion टैगprefix web.config में सही ढंग से पंजीकृत है।

मैं ट्रिडियन के लिए बिल्कुल नया हूं इसलिए किसी भी मदद की बहुत सराहना की जाती है!

अद्यतन

मैं विल के सुझाव को लागू करने के रूप में यह मेरी परिदृश्य के लिए सबसे उपयुक्त समाधान की तरह लगता है का प्रयास किया है, लेकिन मैं एक (बहुत नरम) त्रुटि प्राप्त कर रहा हूँ जब मैं के साथ विल के सुझाव उपयोग करने का प्रयास मेरी नीचे दिए गए कोड:

ComponentPresentationAssembler cpa = new ComponentPresentationAssembler("tcm:35-62652-64"); 
string content = cpa.GetContent(tbl.Rows[i][0].ToString(), strComponentTemplate.ToString()); 

वास्तव में 2 त्रुटियाँ जो (प्रतीत होता है) पाए जाते हैं बेतरतीब ढंग से, लेकिन हमेशा cpa.GetContent(...) कॉल पर। त्रुटियां हैं:

Exception occurred during configuration callback 
OR 
com.tridion.dcp.ComponentPresentationFactory 

मुझे यह पता लगाना प्रतीत नहीं होता कि कोड चलाने के दौरान त्रुटि क्यों बदलती है। जब कोई कोड परिवर्तन नहीं किया जाता है तब भी त्रुटि बदल जाती है।

क्या कोई जानता है कि मैं यहां क्या खो रहा हूं? मैंने माना कि ब्रोकर स्टोरेज इत्यादि से कनेक्टिविटी के साथ यह एक मुद्दा होगा लेकिन तब मुझे याद आया कि जब मैं ComponentPresentationFactory कक्षा का उपयोग कर रहा था तो वह हिस्सा काम कर रहा था।

यदि यह मदद करता है, डीसीपी जो एक ascx के रूप में फ़ाइल की दुकान पर संग्रहीत है निम्नलिखित एचटीएमएल शामिल हैं:

<div class="content-list-item offer redesign noImage"> 
<h2><span>Mike Offer 01/06 - 10/06 &amp; 20/06 - 10/07</span> Exp May 20th</h2> 
<div class="content-list-item-text"> 
    <p>Body Text</p> 
    <div class="input-btn burgundy"> 
     <tridion:ComponentLink runat="server" PageURI="tcm:0-0-0" ComponentURI="tcm:35-31685" TemplateURI="tcm:0-0-0" AddAnchor="false" LinkText="Button Text&lt;span class=&#34;rm&#34;&gt;: Button Text&lt;/span&gt;" LinkAttributes=" alt=&#34;Button Text&#34; target=&#34;_self&#34; " TextOnFail="true"/>  
    </div> 
     <p>Sub Title</p> 
</div> 
<div class="offers-list">   
    <ul> 
     <li>Offer ends: 20 May 2012</li> 
     <li>Offer available at all hotels</li> 
    </ul> 
</div>       
<div class="back-to-top"> 
    <a href="#content">Back to top</a> 
</div> 

अद्यतन 2

रयान के लिए धन्यवाद, मैं हमने पाया है कि मेरी डीसीपी (एएससीएक्स) फ़ाइलों को wwwroot फ़ोल्डर के भीतर एप्लिकेशन के फ़ोल्डर में प्रकाशित नहीं किया जा रहा था, जिसने इसे <tridion:ComponentLink ... /> टैग को सीधे स्रोत पर आउटपुट करने का मुद्दा हल किया है। अब इसे प्रस्तुत किया जा रहा है लेकिन लिंक अभी भी हल नहीं हो रहा है। <a ... /> टैग आउटपुट नहीं हो रहे हैं। यह वह जगह है जहां असेंबलर आ जाएगा - एक बार जब मैं इसे काम पर ला सकता हूं।

मैं और अधिक प्रवेश कार्यान्वित किया है और जाँच और त्रुटि जिससे पता चलता है कि मैं एक जार फ़ाइल मौजूद न हो या गलत संस्करण के बारे में अधिक जानकारी नहीं है है:

Exception Details: Java.Lang.ClassNotFoundException: com.tridion.dcp.ComponentPresentationFactory 

दिलचस्प यह है कि जब मैं का उपयोग करें ComponentPresentationFactory वर्ग, यह काम करता है (आंतरिक लिंक को हल किए बिना) लेकिन जैसे ही मैं असेंबलर का उपयोग करता हूं, यह उपरोक्त त्रुटि को फेंकता है।

मैंने एल्विन द्वारा सुझाए गए कन्स्ट्रक्टर को पृष्ठ जोड़ने का भी प्रयास किया है लेकिन आउटपुट वही है।

+0

अरे माइक, Tridion में आपका स्वागत है है। आप अपनी नईता को अच्छी तरह छिपाने में कामयाब होते हैं। :-) आप पाएंगे कि ट्रिडियन समुदाय के अधिकांश सदस्य काफी उपयोगी हैं। यदि आपने पहले से ऐसा नहीं किया है, तो कृपया क्षेत्र 51 पर हमारे ट्रिडियन प्रस्ताव को प्रतिबद्ध करें: http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –

+0

समस्या सीपीएफटीसी के साथ है - इसके बजाय CPAssembler का उपयोग करें, विल अपने उत्तर –

+0

पर .getContent() त्रुटि पर, किसी भी मौके से यह एकाधिक प्रस्तुति सर्वर से संबंधित है और/या घटक प्रस्तुतियां वास्तव में अप्रकाशित होने पर कोड चलाते समय अप्रकाशित होती हैं? –

उत्तर

11

के लिए this article देखें पहले से ही चर्चा के रूप में अपनी समस्या को हल करने के लिए आप ComponentPresentationAssembler वर्ग, नहीं ComponentPresentationFactory वर्ग उपयोग करने की आवश्यकता के क्रम में है, लेकिन आप यह सुनिश्चित करें कि आप Tridion.ContentDelivery.WAI नाम स्थान के अंदर ComponentPresentationAssembler क्लास का उपयोग की जरूरत है:

  • आपका ASCX फ़ाइलें फाइल सिस्टम यह cd_bro में सेट किया गया है करने के लिए प्रकाशित कर रहे हैं:

    Tridion.ContentDelivery.WAI.ComponentPresentationAssembler presentationAssembler = new Tridion.ContentDelivery.WAI.ComponentPresentationAssembler("tcm:5-44410-64",this.Page); 
    Response.Write(presentationAssembler.GetContent("tcm:5-62700", "tcm:5-62627-32")); 
    

    आपको यह भी सुनिश्चित करने की जरूरत है <Bindings> अनुभाग के अंदर ker_conf.xml फ़ाइल उदा। <Binding Name="ASPComponentPresentation" Class="com.tridion.broker.componentpresentations.FSASCXComponentPresentationHome"/>

  • आपकी एएससीएक्स फाइलें आपके .NET वेब एप्लिकेशन के अंदर प्रकाशित की गई हैं। यह <Publications> अनुभाग के अंदर cd_broker_conf.xml फ़ाइल में सेट है।

    <Publication Id="5" DocumentRoot="C:/Inetpub/wwwroot/website1" DataRoot="C:/Inetpub/wwwroot/website1/dcp"> 
        <Dcp> 
         <Asp Location="C:/Inetpub/wwwroot/website1/dcp"/> 
        </Dcp> 
    </Publication> 
    

ध्यान रखें कि जिन स्थानों को ऊपर देखें केस संवेदी

+0

चीयर्स रयान, मैंने विल के उत्तर को स्वीकार किए गए उत्तर के रूप में चिह्नित किया है क्योंकि वह घटक प्रस्तुति एस्सेबलर के उपयोग के साथ सही था, लेकिन यह सुनिश्चित करने के लिए कि चीजों के लिए सबकुछ मौजूद था, यह वास्तव में आवश्यक चीजों की सूची रखना आसान था काम। चीयर्स! –

+0

दरअसल, इसे फिर से देखकर, मुझे लगता है कि आपका जवाब वास्तव में कारण है कि मैंने इसे ठीक करने में कामयाब रहा। यह क्लास नॉटफाउंड अपवाद (अद्यतन 2 देखें) के संबंध में जो त्रुटि हो रही थी, वह इस तथ्य के कारण थी कि मैं घटक प्रस्तुत करने के लिए गलत नामस्थान का उपयोग कर रहा था। Tridion.ContentDelivery.WAI नेमस्पेस में बदलना इस मुद्दे को ठीक करता है और मुझे कोड को पूरी तरह से काम करने की अनुमति देता है। सही उत्तरों को चिह्नित करने के लिए उस महत्वपूर्ण भाग को याद करने के लिए माफ़ी। –

+2

जब तक कि मैं अन्यथा गलत नहीं हूं, आपको यह सुनिश्चित करना होगा कि आपके पास WAI कार्यक्षमता का उपयोग करने का लाइसेंस है। बस एक नोट ... मैं नहीं चाहता कि कोई इसे कार्यान्वित करे और फिर पता लगाएं कि उनके पास आवश्यक ट्रिडियन लाइसेंस नहीं हैं! –

9

आप उपयोगकर्ता नियंत्रण के रूप में स्ट्रिंग को निष्पादित करने के बजाय गतिशील घटक प्रस्तुति की सामग्री को स्ट्रिंग के रूप में लोड कर रहे हैं।

अपनी समस्या को हल करने के लिए आप 2 में से 1 समाधान का उपयोग कर सकते हैं:

1) Tridion एपीआई के माध्यम से लिंक पर कार्रवाई करने के cp.Content पर एक Regex का उपयोग करें।

2) यदि आप उपयोगकर्ता नियंत्रण के रूप में फाइल सिस्टम के लिए गतिशील सामग्री प्रकाशित करें और अपने पृष्ठ/उपयोगकर्ता नियंत्रण पर इस पर नियंत्रण लोड है, इस प्रकार क्रियान्वित यह

using (var cpf = new ComponentPresentationFactory(publicationId)) 
{ 
    var cp = cpf.GetComponentPresentation(componentId, componentTemplateId); 
    fileLocation = cp.FileLocation; 
} 

if (!String.IsNullOrEmpty(fileLocation)) 
{ 
    var crtl = this.LoadControl(MapPathReverse(fileLocation)); 
    phldControls.Controls.Add(crtl); 
} 
+1

-1 में जेनेरिक त्रुटि संदेशों के लिए अलग है। ट्रिडियन को घटक प्रस्तुत करने के लिए आउट ऑफ़ द बॉक्स समर्थन है। एस्सेबलर –

+3

धन्यवाद डोमिनिक। मैं घटक प्रस्तुति एस्सेबलर से अवगत नहीं था। आप हर दिन कुछ नया सीखते हैं। –

10

मार्क जवाब पहले से ही के अपने संस्करण के लिए सबसे महत्वपूर्ण हिस्सा शामिल किया गया Tridion: आपको ASP.NET द्वारा निष्पादित किए जाने वाले tridion:CompontentLink नियंत्रणों के लिए ASCX फ़ाइलों को डिस्क पर प्रकाशित करना होगा।

ट्रिडियन 2011 ने आरईएल को इसके लिए वैकल्पिक समाधान के रूप में पेश किया। आरईएल का उपयोग करते समय आप केवल HTML खंडों को फिर से प्रकाशित करेंगे और tcdl:ComponentLink को डाटाबेस में संग्रहीत किया जाएगा (इसलिए तैनाती पर tridion:ComponentLink में परिवर्तित नहीं किया गया है)। फिर जब आप सामग्री को पुनर्प्राप्त करते हैं (ComponentPresentationTransformer या नई सामग्री वितरण ओडाटा वेब सेवा के माध्यम से) tcdl:ComponentLink (और अन्य tcdl:* टैग) हल हो जाएंगे और आपको वह परिणाम मिल जाएगा जो आप चाहते हैं।

18

प्रकाशित सामग्री प्राप्त करने के बजाय, डीसीपी निष्पादित करने के लिए, आपको कक्षा का उपयोग करने की आवश्यकता है, न कि ComponentPresentationFactory कक्षा।

एक साधारण नीचे दिए गए उदाहरण:

ComponentPresentationAssembler cpa = 
    new ComponentPresentationAssembler("tcm:69-6212-64",this.Page); 
Response.Write(cpa.GetContent("tcm:69-2882", "tcm:69-6339-32")); 

ध्यान दें कि आप एक बहुत प्रकाशित करने अगर कर रहे हैं (यानी सैकड़ों) घटक प्रस्तुतियों के (और उन्हें बार-बार प्रकाशित करने), अपनी नहीं एक अच्छा विचार ascx उपयोग करने के लिए - आप प्राप्त कर सकते हैं एएसपी के साथ कुछ प्रदर्शन मुद्दों।नेट बैच उस फ़ोल्डर को दोबारा जोड़ता है जिसमें सभी शामिल हैं, या एप्लिकेशन को पुनरारंभ करना ट्रिगर करता है।

उन्हें डेटाबेस में (एक्स) एचटीएमएल टुकड़े के रूप में प्रकाशित करना सुरक्षित है, और मार्क के उल्लेख के रूप में पोस्ट प्रक्रिया को पोस्ट करना सुरक्षित है।

फ्रैंक 2011 एसपी 1 में उल्लेख करता है कि आप आरईएल का उपयोग इस पोस्ट प्रोसेसिंग के लिए कर सकते हैं। अधिक जानकारी

+0

अच्छी चीजें विल। मैं देखता हूं कि आप अभी तक हमारे प्रस्ताव में शामिल नहीं हुए हैं, एक ट्रिडियन-विशिष्ट स्टैक एक्सचेंज क्षेत्र प्राप्त करने के लिए। कृपया इस लिंक का पालन करें और इसे देखें: http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –

+0

उस जानकारी के लिए धन्यवाद @ विल। मैंने इसका प्रयास किया है लेकिन जब मैं डीसीपी को आजमाता हूं और पुनः प्राप्त करता हूं तो मुझे अब एक त्रुटि मिल रही है।मैंने पोस्ट में अपना त्रुटि विवरण जोड़ा है। कोई विचार? –

+0

आह, क्लासिक सीपी असेंबलर बनाम फैक्टरी स्पष्टीकरण (आरईएल से नई भलाई के साथ), अच्छा! @ माइकपेर्सीवाल - मुझे संदेह है कि त्रुटियों में अंतर आपके पहले उदाहरण में नल सीपी पकड़ा गया था। यदि आप चेक को हटाते हैं, तो क्या आपको घटक आईडी के उसी सेट पर एक ही त्रुटि मिलती है? –

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