My XML is something like this.
.
.
.
</body>
<List>
<topicTitle>This is topic title</topicTitle>
<topDef>This is topic definition.</topDef>
</List>
I basically want to insert topicTitle and topDef into <li> tags. And I am trying to do so with this code (code for topicTitle shown only for simplicity):
<!-- TemplateBeginRepeat name="List" -->
<!-- TemplateBeginRepeat name="Field.topicTitle" -->
<li>##RenderComponentField(FieldPath+".value",
TemplateRepeatIndex)## </li>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
But it doesn't seem to be working. Any ideas?
In case of embeddable schema you don't need to iterate over xmlList (with TemplateBeginRepeat) unlike Component link, here you can directly access the embedded child element via syntax:-
##Component.XMLNameOfEmbeddedschema.XmlElementNameinEmbeddedSchema##
pls note in above XMLNameOfEmbeddedschema = the XMLName you give in parent schema while inserting an embeddable schema.
So in your scenario it will work with
##Component.List.topicTitle## for accessing value of topicTitle.
Please mark this answer as accepted, if this solution works for you...
Related
If a view is registered like this, with the template definition in zcml:
<browser:page
name="original-view"
class=".original_view.View"
permission="zope2.View"
for="*"
template="original_template.pt"
/>
and i want to customize only his class in my product, is there a way to do it without customizing also the template?
You have to wrap the browser:page by <configure package='XXXX'>
That means your then in scope of this packge.
Example:
<configure package="original.package.browser">
<!-- custom view -->
<browser:page
name="original-view"
class="your.package.browser.View" <!-- Full dotted name to you custom view class -->
permission="zope2.View"
for="*"
layer="your.package.interfaces.IYourPackageLayer" <!-- You should provide a browserlayer, otherwise you got a configuration conflict -->
template="original_template.pt" <!-- template from original.package.browser -->
/>
</configure>
EDIT:
As #sdupton mentioned, I updated the example code snipped with a layer
If you can't use a layer (BrowserLayer) you can put the code, without layer attribute into a overrides.zcml
You can also specify a more precise Interface in the for attribute
One big "Hi" for all humans from planet Tridion :).
I am trying to make component links editable in SDL Tridion UI 2012.
I have one component that contains multi-valued component links as one of fields.
When I put following in DWT
<!-- TemplateBeginRepeat name="componentLink" -->
<!-- TemplateBeginIf cond="TemplateRepeatIndex<3" -->
<li>
<a href="#" tridion:href="##RenderComponentField(FieldPath+"componentLink",TemplateRepeatIndex)##">
Link${TemplateRepeatIndex}
</a>
</li>
<!-- TemplateEndIf -->
<!-- TemplateEndRepeat -->
Inside Template Builder as a result I got following:
<li>tcm:8-625</tcdl:ComponentField>">Link0</li>
<li>tcm:8-626</tcdl:ComponentField>">Link1</li>
<li>tcm:8-627</tcdl:ComponentField>">Link2</li>
As expected an error occured on "Default Finish Actions" on a page level
Unable to find proper value for tridion:href
Is it needed to extract component links inside C# TBB in some previous action or exist any other way to resolve this( Enabling component links for SDL Tridion UI)?
In my "new UI VM" I have the following code in a design:
<tcdl:ComponentField name="LinkText">
<a tridion:href="##Component.Fields.Target##">${LinkText}</a>
</tcdl:ComponentField>
The linked Component is editable in the new UI. The tcdl:ComponentField is processed to wrap the appropriate in-context editing instructions around the link. You should be able translate that on to your code pretty easily...
Thank you Jeremy, manually adding <tcdl:ComponentField> tag resolve this issue.
Here is final code that correctly resolve component links on a page level:
<!-- TemplateBeginRepeat name="componentLink" -->
<!-- TemplateBeginIf cond="TemplateRepeatIndex<3" -->
<li>
<tcdl:ComponentField name="componentLink">
<a tridion:href="##Field##">Link${TemplateRepeatIndex} </a>
</tcdl:ComponentField>
</li>
<!-- TemplateEndIf -->
<!-- TemplateEndRepeat -->
I am working on DWT TBB in SDL Tridion 2011 SP1.
I have a embedded field "body" which is multivalued. In this embedded field I have one more simple Text field "value", which is again multivalued.
To render the "value" field I have to use two repeating loops.
But I am unable to differentiate the Indeces of the both loops.
I have written as follows.
<!-- TemplateBeginRepeat name="Component.Fields.body" -->
<!-- TemplateBeginRepeat name="Component.Fields.body[${TemplateRepeatIndex}].value" -->
<div>##RenderComponentField("Fields.body[${TemplateRepeatIndex}].value", TemplateRepeatIndex)## </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
I am unable to render the fields.
Can any one help how to handle multiple nested regions in DWT TBB.
Thank you.
The Tridion practice page that Neil referred to is a good reference. But that page shows how to generically iterate over all embedded fields. In cases where you know the field name, things get a bit easier. In you case, this is all that is needed in your DWT:
<!-- TemplateBeginRepeat name="body" -->
<!-- TemplateBeginRepeat name="Field.value" -->
<div>##RenderComponentField(FieldPath+".value",
TemplateRepeatIndex)## </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
Line by line:
Iterate over the values of the body field of your Component
Iterate over the values of the value subfield of your body embeddable schema
At this stage the FieldPath refers to the current body value, so body[0], body[1], etc. and TemplateRepeatIndex is the index of the current value. So we can construct the correct RenderComponentField call with this knowledge.
Example
I have a Component with two body fields, each with two value fields. So the XML is:
<Content xmlns="uuid:8841d68e-7b1b-45cd-a6d6-7e7da5de3ef9">
<body>
<value>body1.value1</value>
<value>body1.value2</value>
</body>
<body>
<value>body2.value1</value>
<value>body2.value2</value>
</body>
</Content>
The output from the above DWT on this Component is:
<div><tcdl:ComponentField name="body[0].value"
index="0">body1.value1</tcdl:ComponentField></div>
<div><tcdl:ComponentField name="body[0].value"
index="1">body1.value2</tcdl:ComponentField></div>
<div><tcdl:ComponentField name="body[1].value"
index="0">body2.value1</tcdl:ComponentField></div>
<div><tcdl:ComponentField name="body[1].value"
index="1">body2.value2</tcdl:ComponentField></div>
Debugging these situations
Many people have problems writing constructs like these. I am no exception, I have just found that I can get most cases working by knowing that the crucial variables are: Field, FieldPath and TemplateRepeatIndex. When in doubt, simply embed this fragment into your DWT inside every TemplateBeginRepeat.
(FieldPath=##FieldPath##, TemplateRepeatIndex=##TemplateRepeatIndex##)
Does the FieldPath variable not help you here?
See the Tridion Practice site for an example of iterating over multivalue embedded fields.
As you noticed already, you cannot use the outer loop index inside the inner loop. The inner loop index will hide the outer loop index. Therefore, you need a workaround. I can think of 2 that I used in the past:
Use a C# TBB (either assembly or fragment) to generate the output. This is not a very nice solution, but it is practical. You could at least generate the output of the inner loop and store the individual values in Package variables. Then in the outer loop you can simply iterate over the values and include them in the output. Example: create variables called body_0, body_1, etc. Then output them inside the outer loop using ##body_${TemplateRepeatIndex}##
Use Dreamweaver functions to simulate the inner loop index. You can have a function to Set a Package item variable, and one to Increment it. Then use this variable inside the loops. Example:
<!-- TemplateBeginRepeat name="Component.Fields.body" -->
##Set("i", 0)##
<!-- TemplateBeginRepeat name="Component.Fields.body[${i}].value" -->
<div>##Component.Fields.body[${i}].value[${TemplateRepeatIndex}]</div>
<!-- TempalteEndRepeat -->
##Increment("i")##
You will have to write the Set and Increment DWT functions yourself to store and increment a value in the Package.
Try this way:-
<!-- TemplateBeginRepeat name="Component.Fields.body" -->
##Push("PrimaryIndex", TemplateRepeatIndex)##
<!-- TemplateBeginRepeat name="Component.Fields.body[${PrimaryIndex}].value" -->
##Push("SecondaryIndex", TemplateRepeatIndex)##
<div>##RenderComponentField("Fields.body[${PrimaryIndex}].value", ${SecondaryIndex})## </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
UPDATE 1:
Just I got an idea on this. How about doing this way?
<!-- TemplateBeginRepeat name="Component.Fields.body" -->
<!-- TemplateBeginRepeat name="value" -->
<div>##Field##</div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
Without using any TemplateRepeatIndex
For those who are using Tridion 2009 without SP1 version (like our customer), 'FieldPath' variable cannot be used as suggested in the earlier answers. But there is a simple way to achieve this in DWT itself as given below in the example code:
<!-- TemplateBeginRepeat name="Component.body" -->
<!-- TemplateBeginRepeat name="Field.value" -->
<div> ##Field##> </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
Once again back with a Plone question.
I have Plone 4 installed and I need to show the Document action icons at the top instead of bottom. having trouble in getting this to work. can someone help.
If you just need to move that viewlet (with same class and template), first you have to register a viewlet with same class to your desired viewletmanager (let's say for ex. plone.app.layout.viewlets.interfaces.IAboveContentBody):
<browser:viewlet
name="plone.abovecontenttitle.documentactions"
manager="plone.app.layout.viewlets.interfaces.IAboveContentBody"
class="plone.app.layout.viewlets.content.DocumentActionsViewlet"
permission="zope2.View"
/>
and then add this in your genericsetup profile (file viewlets.xml) :
<?xml version="1.0"?>
<object>
<order manager="plone.abovecontentbody" skinname="Plone Default">
<!-- this will place your viewlet before all the others.
you can also use a viewlet's name for a relative position -->
<viewlet name="plone.abovecontenttitle.documentactions" insert-before="*"/>
</order>
<hidden manager="plone.belowcontentbody" skinname="Plone Default">
<viewlet name="plone.abovecontenttitle.documentactions"/>
</hidden>
</object>
More info:
http://plone.org/documentation/kb/customization-for-developers/viewlets
http://collective-docs.readthedocs.org/en/latest/views/viewlets.html
How can I write the freemarker templates like this:
<#import "spring.ftl" as s>
<#s.form path="object" action="/new.do" method="POST">
<#s.formInput "name"/> <!-- I want this resolved as "object.name" -->
<!--
100s of other properties...
-->
</#s.form>
instead of this:
<#import "spring.ftl" as s>
<form action="/new.do" method="POST">
<#s.formInput "object.name"/>
<!--
100s of other properties...
-->
</form>
You can bind the object like this:
<#s.bind "object"/>
Then you can use your first example
<#s.formInput "name"/>
As far as I can tell, spring.ftl doesn't support nested paths. It is conceivable that one could write one's own nestedPath macro that functioned similar to the nestedPath JSP tag. You'd probably need a bind macro that recognized it as well, and maybe more to get all the form input macros working.
Or, maybe it's possible to import and use the JSP tags themselves instead of spring.ftl or custom macros.