You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Alexander Rosemann <al...@gmail.com> on 2011/06/24 15:31:33 UTC

T5.2.5 - loop, zones and a save button

Hi,

I asked this before but couldn't resolve the issue based on the 
information that Taha forwarded me.
(http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)

I have a loop that creates textareas within a form. Each textarea is 
wrapped by a zone. Outside the loop is a submit button to save the form. 
No matter whether I set the submit defer attribute to false or true, my 
code only persists the information of the last texarea in the loop.

That's how the form part of the tml looks like:

<t:form>
   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
     encoder="cEncoder">
     <t:zone t:id="textareaZone">
       <t:textarea value="textareaValue" />
     </t:zone>
   </t:loop>
   <t:submit value="Save" t:id="save"/>
</t:form>

The odd thing is that the encoder (cEncoder) for the loop gets called n 
times before the setter of the currentCriteria field gets called n 
times. Removing the zone brings back the normal behaviour of calling 
first the encoder and second, the setter of the corresponding field.

Any hints and pointers to fix this are much appreciated.

Regards,
Alex








-- 
DI(FH) Alexander Rosemann
open source based software solutions
Naunspitzweg 3 | 6341 Ebbs | Austria
mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Taha Hafeez <ta...@gmail.com>.
Hi

@InjectComponent
private TextArea textArea;

void afterRender()
{
   ... textArea.getClientId();
}

regards
Taha


On Mon, Jun 27, 2011 at 9:57 PM, Alexander Rosemann
<al...@gmail.com> wrote:
> In order to build a json data source that I can inject into the page using
> JavaScriptSupport I would like to know the real ids Tapestry generates for
> the controls. Since the getter methods for the textarea get called each
> iteration, I was wondering whether it is possible to get access to the
> clientId?
>
> Any ideas on how to achieve this?
>
> Regards,
> Alex
>
> On 27.06.2011 15:43, Thiago H. de Paula Figueiredo wrote:
>>
>> On Mon, 27 Jun 2011 10:38:12 -0300, Taha Hafeez
>> <ta...@gmail.com> wrote:
>>
>>> Well I don't think it is intentional, if what I have inferred is
>>> correct then it is a bug
>>> An alternative will be not to use a zone, instead use your own
>>> ajax/javascript calls.
>>
>> I agree that this isn't an intentional limitation. Maybe you're just
>> trying to use the components in a way that wasn't intended. The Tapestry
>> out-of-the-box AJAX support covers many scenarios but not all (and I
>> guess Zones including form fields inside a Zone inside a Loop is
>> definetely not one of them). Some scenarios are better covered with
>> custom JavaScript.
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Alexander Rosemann <al...@gmail.com>.
In order to build a json data source that I can inject into the page 
using JavaScriptSupport I would like to know the real ids Tapestry 
generates for the controls. Since the getter methods for the textarea 
get called each iteration, I was wondering whether it is possible to get 
access to the clientId?

Any ideas on how to achieve this?

Regards,
Alex

On 27.06.2011 15:43, Thiago H. de Paula Figueiredo wrote:
> On Mon, 27 Jun 2011 10:38:12 -0300, Taha Hafeez
> <ta...@gmail.com> wrote:
>
>> Well I don't think it is intentional, if what I have inferred is
>> correct then it is a bug
>> An alternative will be not to use a zone, instead use your own
>> ajax/javascript calls.
>
> I agree that this isn't an intentional limitation. Maybe you're just
> trying to use the components in a way that wasn't intended. The Tapestry
> out-of-the-box AJAX support covers many scenarios but not all (and I
> guess Zones including form fields inside a Zone inside a Loop is
> definetely not one of them). Some scenarios are better covered with
> custom JavaScript.
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Alexander Rosemann <al...@gmail.com>.
Thanks for the hints and clarification. I was just wondering whether I 
missed something obvious. I'll try to implement it using plain JS and 
let you know how that went.
Many thanks though!

Regards,
Alex

On 27.06.2011 15:43, Thiago H. de Paula Figueiredo wrote:
> On Mon, 27 Jun 2011 10:38:12 -0300, Taha Hafeez
> <ta...@gmail.com> wrote:
>
>> Well I don't think it is intentional, if what I have inferred is
>> correct then it is a bug
>> An alternative will be not to use a zone, instead use your own
>> ajax/javascript calls.
>
> I agree that this isn't an intentional limitation. Maybe you're just
> trying to use the components in a way that wasn't intended. The Tapestry
> out-of-the-box AJAX support covers many scenarios but not all (and I
> guess Zones including form fields inside a Zone inside a Loop is
> definetely not one of them). Some scenarios are better covered with
> custom JavaScript.
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by "Thiago H. de Paula Figueiredo" <th...@gmail.com>.
On Mon, 27 Jun 2011 10:38:12 -0300, Taha Hafeez <ta...@gmail.com>  
wrote:

> Well I don't think it is intentional, if what I have inferred is
> correct then it is a bug
> An alternative will be not to use a zone, instead use your own
> ajax/javascript calls.

I agree that this isn't an intentional limitation. Maybe you're just  
trying to use the components in a way that wasn't intended. The Tapestry  
out-of-the-box AJAX support covers many scenarios but not all (and I guess  
Zones including form fields inside a Zone inside a Loop is definetely not  
one of them). Some scenarios are better covered with custom JavaScript.

-- 
Thiago H. de Paula Figueiredo
Independent Java, Apache Tapestry 5 and Hibernate consultant, developer,  
and instructor
Owner, Ars Machina Tecnologia da Informação Ltda.
http://www.arsmachina.com.br

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Taha Hafeez <ta...@gmail.com>.
Well I don't think it is intentional, if what I have inferred is
correct then it is a bug

An alternative will be not to use a zone, instead use your own
ajax/javascript calls.

regards
Taha


On Mon, Jun 27, 2011 at 6:55 PM, Alexander Rosemann
<al...@gmail.com> wrote:
> Thanks for the info, Taha. Moving the zone out of the loop would allow to
> properly process the textarea values but prevent the textareas from being
> updated by the action links... A semi-ideal solution.
>
> Is this something that is intentionally not supported by Tapestry for a
> reason?
>
> Regards,
> Alex
>
>
> On 27.06.2011 14:46, Taha Hafeez wrote:
>>
>> Hi Alex
>>
>> It took me quite a while to debug and this is my understanding.
>>
>> The loop uses a hidden field to store the 'value' parameter in the
>> form(using the encoder for converting it to a string) and later
>> retrieves the value before setting value of bound variables. The
>> hidden field also contains the name of the field to be processed this
>> way. An ajax request causes reload of the textarea which in turn
>> causes the name and id to change and so the loop is not able to find
>> this field and its bound variable is set after all the encoders have
>> been called
>>
>> Someone may explain it better
>>
>> A less than ideal solution may be to get the zone out of the loop
>>
>> regards
>> Taha
>>
>>
>>> On Mon, Jun 27, 2011 at 12:19 AM, Alexander
>>> Rosemann<al...@gmail.com>  wrote:
>>>>
>>>> Removing the zone surrounding the textarea fixes the save issue but of
>>>> course breaks the update functionality.
>>>>
>>>> This is the code:
>>>>
>>>> public class LoopWithZoneIssue {
>>>>
>>>>    private final Logger logger =
>>>> LoggerFactory.getLogger(Feedback.class);
>>>>    @Inject
>>>>    private Request request;
>>>>    @Property
>>>>    private String currentLink;
>>>>    @Property
>>>>    private String currentCriteria;
>>>>    @Property
>>>>    private int linkIndex;
>>>>    @Property
>>>>    private int criteriaIndex;
>>>>    @InjectComponent
>>>>    @Property
>>>>    private Zone textareaZone;
>>>>    @Persist
>>>>    private Map<String, String>  criteria;
>>>>    @Persist
>>>>    private Map<String, String>  links;
>>>>    private String ajaxLink;
>>>>    private String ajaxCriteria;
>>>>
>>>>    void onActivate() {
>>>>        if (criteria == null) {
>>>>            criteria = new HashMap<String, String>();
>>>>            criteria.put("Research", "Systematic identification and
>>>> investigation of appropriate sources");
>>>>            criteria.put("Communication and Presentation", "Clarity of
>>>> purpose; skills in the selected media; "
>>>>                + "awareness and adoption of appropriate conventions;
>>>> sensitivity to the needs of the audience");
>>>>            criteria.put("Analysis", "Examination and interpretation of
>>>> resources");
>>>>            criteria.put("Personal and professional development",
>>>> "Management of learning through reflection,  "
>>>>                + "planning,  self direction,  subject engagement and
>>>> commitment");
>>>>        }
>>>>        if (links == null) {
>>>>            links = new HashMap<String, String>();
>>>>            links.put("A", "Default value for A");
>>>>            links.put("B", "Default value for B");
>>>>            links.put("C", "Default value for C");
>>>>            links.put("D", "Default value for D");
>>>>            links.put("E", "Default value for E");
>>>>        }
>>>>    }
>>>>
>>>>    public void onSelectedFromSaveFeedback() {
>>>>        logger.debug("Saving feedback form");
>>>>    }
>>>>
>>>>    public Object onActionFromLink(String linkId, String criteriaId) {
>>>>        ajaxLink = links.get(linkId);
>>>>        ajaxCriteria = criteria.get(criteriaId);
>>>>        return textareaZone.getBody();
>>>>    }
>>>>
>>>>    public String getUniqueZoneId() {
>>>>        return "uniqueZoneId_" + criteriaIndex;
>>>>    }
>>>>
>>>>    public Collection<String>  getCriteria() {
>>>>        return criteria.keySet();
>>>>    }
>>>>
>>>>    public Collection<String>  getLinks() {
>>>>        return links.keySet();
>>>>    }
>>>>
>>>>    public ValueEncoder<String>  getCriteriaEncoder() {
>>>>        return new ValueEncoder<String>() {
>>>>
>>>>            public String toValue(String value) {
>>>>                for (String key : criteria.keySet()) {
>>>>                    if (criteria.get(key).equals(value))
>>>>                        return key;
>>>>                }
>>>>                return "unknown";
>>>>            }
>>>>
>>>>            public String toClient(String key) {
>>>>                String value = criteria.get(key);
>>>>                return value;
>>>>            }
>>>>        };
>>>>    }
>>>>
>>>>    public String getTextareaValue() {
>>>>        logger.debug("called getTextareaValue");
>>>>        if (request.isXHR()) {
>>>>            return ajaxLink;
>>>>        }
>>>>        else {
>>>>            return criteria.get(currentCriteria);
>>>>        }
>>>>    }
>>>>
>>>>    public void setTextareaValue(String textareaValue) {
>>>>        logger.debug("called setTextareaValue '{}' for criteria '{}'",
>>>> textareaValue, currentCriteria);
>>>>        criteria.put(currentCriteria, textareaValue);
>>>>    }
>>>>
>>>> }
>>>>
>>>> And the tml:
>>>>
>>>> <t:form>
>>>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>  encoder="criteriaEncoder" index="criteriaIndex">
>>>>    <h3>${currentCriteria}</h3>
>>>>    <t:loop t:id="links" value="currentLink"
>>>>    source="links" index="linkIndex">
>>>>      <t:actionlink t:id="link" zone="prop:uniqueZoneId"
>>>>      context="[currentLink,currentCriteria]">${currentLink}
>>>>      </t:actionlink>
>>>>      <span>&nbsp;&nbsp;&nbsp;</span>
>>>>    </t:loop>
>>>>    <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>>>      <t:textarea value="textareaValue"
>>>>      style="width:100%;height:9em;" />
>>>>    </t:zone>
>>>>    <br />
>>>>    <br />
>>>>  </t:loop>
>>>>  <t:submit value="Save" t:id="save" />
>>>> </t:form>
>>>>
>>>> Thanks,
>>>> Alex
>>>>
>>>> On 24.06.2011 17:27, Taha Tapestry wrote:
>>>>>
>>>>> Can you share the code of the event handler for the action.
>>>>> I think all the textareas are getting bound to the last object of the
>>>>> loop's source
>>>>>
>>>>>
>>>>> Regards
>>>>> Taha
>>>>>
>>>>> On Jun 24, 2011, at 7:35 PM, Alexander
>>>>> Rosemann<al...@gmail.com>    wrote:
>>>>>
>>>>>> Hi Taha,
>>>>>>
>>>>>> I should have put more thought in my example. The zone gets its unique
>>>>>> id and is updated by a set of actionlinks that I have omitted in my previous
>>>>>> example. This is the full one:
>>>>>>
>>>>>> <t:form>
>>>>>>
>>>>>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>>>    encoder="cEncoder">
>>>>>>
>>>>>>    <t:loop t:id="links" value="link" source="links">
>>>>>>      <t:actionlink t:id="linkId" zone="prop:uniqueZoneId">some
>>>>>>        text</t:actionlink>
>>>>>>    </t:loop>
>>>>>>
>>>>>>    <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>>>>>      <t:textarea value="textareaValue" />
>>>>>>    </t:zone>
>>>>>>
>>>>>>  </t:loop>
>>>>>>
>>>>>>  <t:submit value="Save" t:id="save"/>
>>>>>> </t:form>
>>>>>>
>>>>>> The actionlinks fill the textarea with default data which can then be
>>>>>> altered by the user and finally saved.
>>>>>>
>>>>>> Regards,
>>>>>> Alex
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 24.06.2011 15:48, Taha Hafeez wrote:
>>>>>>>
>>>>>>> Hi
>>>>>>>
>>>>>>> Whenever you use a zone in a loop, you should provide the javascript
>>>>>>> id
>>>>>>> yourself. You can use the index to create a unique one
>>>>>>>
>>>>>>> e.g.
>>>>>>>
>>>>>>> <t:zone t:id='textareaZone' id='textareaZone_${index}'>
>>>>>>> </t:zone>
>>>>>>>
>>>>>>> If you are using a non-ajax form, what is the use of zone here ??
>>>>>>>
>>>>>>> regards
>>>>>>> Taha
>>>>>>>
>>>>>>> On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
>>>>>>> <al...@gmail.com>     wrote:
>>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I asked this before but couldn't resolve the issue based on the
>>>>>>>> information that Taha forwarded me.
>>>>>>>>
>>>>>>>> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>>>>>>>>
>>>>>>>> I have a loop that creates textareas within a form. Each textarea is
>>>>>>>> wrapped by a zone. Outside the loop is a submit button to save the form. No
>>>>>>>> matter whether I set the submit defer attribute to false or true, my code
>>>>>>>> only persists the information of the last texarea in the loop.
>>>>>>>>
>>>>>>>> That's how the form part of the tml looks like:
>>>>>>>>
>>>>>>>> <t:form>
>>>>>>>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>>>>>    encoder="cEncoder">
>>>>>>>>    <t:zone t:id="textareaZone">
>>>>>>>>      <t:textarea value="textareaValue" />
>>>>>>>>    </t:zone>
>>>>>>>>  </t:loop>
>>>>>>>>  <t:submit value="Save" t:id="save"/>
>>>>>>>> </t:form>
>>>>>>>>
>>>>>>>> The odd thing is that the encoder (cEncoder) for the loop gets
>>>>>>>> called n times before the setter of the currentCriteria field gets called n
>>>>>>>> times. Removing the zone brings back the normal behaviour of calling first
>>>>>>>> the encoder and second, the setter of the corresponding field.
>>>>>>>>
>>>>>>>> Any hints and pointers to fix this are much appreciated.
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Alex
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> DI(FH) Alexander Rosemann
>>>>>>>> open source based software solutions
>>>>>>>> Naunspitzweg 3 | 6341 Ebbs | Austria
>>>>>>>> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>>>>>>>>
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>>>
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Alexander Rosemann <al...@gmail.com>.
Thanks for the info, Taha. Moving the zone out of the loop would allow 
to properly process the textarea values but prevent the textareas from 
being updated by the action links... A semi-ideal solution.

Is this something that is intentionally not supported by Tapestry for a 
reason?

Regards,
Alex


On 27.06.2011 14:46, Taha Hafeez wrote:
> Hi Alex
>
> It took me quite a while to debug and this is my understanding.
>
> The loop uses a hidden field to store the 'value' parameter in the
> form(using the encoder for converting it to a string) and later
> retrieves the value before setting value of bound variables. The
> hidden field also contains the name of the field to be processed this
> way. An ajax request causes reload of the textarea which in turn
> causes the name and id to change and so the loop is not able to find
> this field and its bound variable is set after all the encoders have
> been called
>
> Someone may explain it better
>
> A less than ideal solution may be to get the zone out of the loop
>
> regards
> Taha
>
>
>> On Mon, Jun 27, 2011 at 12:19 AM, Alexander Rosemann<al...@gmail.com>  wrote:
>>>
>>> Removing the zone surrounding the textarea fixes the save issue but of course breaks the update functionality.
>>>
>>> This is the code:
>>>
>>> public class LoopWithZoneIssue {
>>>
>>>     private final Logger logger = LoggerFactory.getLogger(Feedback.class);
>>>     @Inject
>>>     private Request request;
>>>     @Property
>>>     private String currentLink;
>>>     @Property
>>>     private String currentCriteria;
>>>     @Property
>>>     private int linkIndex;
>>>     @Property
>>>     private int criteriaIndex;
>>>     @InjectComponent
>>>     @Property
>>>     private Zone textareaZone;
>>>     @Persist
>>>     private Map<String, String>  criteria;
>>>     @Persist
>>>     private Map<String, String>  links;
>>>     private String ajaxLink;
>>>     private String ajaxCriteria;
>>>
>>>     void onActivate() {
>>>         if (criteria == null) {
>>>             criteria = new HashMap<String, String>();
>>>             criteria.put("Research", "Systematic identification and investigation of appropriate sources");
>>>             criteria.put("Communication and Presentation", "Clarity of purpose; skills in the selected media; "
>>>                 + "awareness and adoption of appropriate conventions; sensitivity to the needs of the audience");
>>>             criteria.put("Analysis", "Examination and interpretation of resources");
>>>             criteria.put("Personal and professional development", "Management of learning through reflection,  "
>>>                 + "planning,  self direction,  subject engagement and commitment");
>>>         }
>>>         if (links == null) {
>>>             links = new HashMap<String, String>();
>>>             links.put("A", "Default value for A");
>>>             links.put("B", "Default value for B");
>>>             links.put("C", "Default value for C");
>>>             links.put("D", "Default value for D");
>>>             links.put("E", "Default value for E");
>>>         }
>>>     }
>>>
>>>     public void onSelectedFromSaveFeedback() {
>>>         logger.debug("Saving feedback form");
>>>     }
>>>
>>>     public Object onActionFromLink(String linkId, String criteriaId) {
>>>         ajaxLink = links.get(linkId);
>>>         ajaxCriteria = criteria.get(criteriaId);
>>>         return textareaZone.getBody();
>>>     }
>>>
>>>     public String getUniqueZoneId() {
>>>         return "uniqueZoneId_" + criteriaIndex;
>>>     }
>>>
>>>     public Collection<String>  getCriteria() {
>>>         return criteria.keySet();
>>>     }
>>>
>>>     public Collection<String>  getLinks() {
>>>         return links.keySet();
>>>     }
>>>
>>>     public ValueEncoder<String>  getCriteriaEncoder() {
>>>         return new ValueEncoder<String>() {
>>>
>>>             public String toValue(String value) {
>>>                 for (String key : criteria.keySet()) {
>>>                     if (criteria.get(key).equals(value))
>>>                         return key;
>>>                 }
>>>                 return "unknown";
>>>             }
>>>
>>>             public String toClient(String key) {
>>>                 String value = criteria.get(key);
>>>                 return value;
>>>             }
>>>         };
>>>     }
>>>
>>>     public String getTextareaValue() {
>>>         logger.debug("called getTextareaValue");
>>>         if (request.isXHR()) {
>>>             return ajaxLink;
>>>         }
>>>         else {
>>>             return criteria.get(currentCriteria);
>>>         }
>>>     }
>>>
>>>     public void setTextareaValue(String textareaValue) {
>>>         logger.debug("called setTextareaValue '{}' for criteria '{}'", textareaValue, currentCriteria);
>>>         criteria.put(currentCriteria, textareaValue);
>>>     }
>>>
>>> }
>>>
>>> And the tml:
>>>
>>> <t:form>
>>>   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>   encoder="criteriaEncoder" index="criteriaIndex">
>>>     <h3>${currentCriteria}</h3>
>>>     <t:loop t:id="links" value="currentLink"
>>>     source="links" index="linkIndex">
>>>       <t:actionlink t:id="link" zone="prop:uniqueZoneId"
>>>       context="[currentLink,currentCriteria]">${currentLink}
>>>       </t:actionlink>
>>>       <span>&nbsp;&nbsp;&nbsp;</span>
>>>     </t:loop>
>>>     <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>>       <t:textarea value="textareaValue"
>>>       style="width:100%;height:9em;" />
>>>     </t:zone>
>>>     <br />
>>>     <br />
>>>   </t:loop>
>>>   <t:submit value="Save" t:id="save" />
>>> </t:form>
>>>
>>> Thanks,
>>> Alex
>>>
>>> On 24.06.2011 17:27, Taha Tapestry wrote:
>>>>
>>>> Can you share the code of the event handler for the action.
>>>> I think all the textareas are getting bound to the last object of the loop's source
>>>>
>>>>
>>>> Regards
>>>> Taha
>>>>
>>>> On Jun 24, 2011, at 7:35 PM, Alexander Rosemann<al...@gmail.com>    wrote:
>>>>
>>>>> Hi Taha,
>>>>>
>>>>> I should have put more thought in my example. The zone gets its unique id and is updated by a set of actionlinks that I have omitted in my previous example. This is the full one:
>>>>>
>>>>> <t:form>
>>>>>
>>>>>   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>>     encoder="cEncoder">
>>>>>
>>>>>     <t:loop t:id="links" value="link" source="links">
>>>>>       <t:actionlink t:id="linkId" zone="prop:uniqueZoneId">some
>>>>>         text</t:actionlink>
>>>>>     </t:loop>
>>>>>
>>>>>     <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>>>>       <t:textarea value="textareaValue" />
>>>>>     </t:zone>
>>>>>
>>>>>   </t:loop>
>>>>>
>>>>>   <t:submit value="Save" t:id="save"/>
>>>>> </t:form>
>>>>>
>>>>> The actionlinks fill the textarea with default data which can then be altered by the user and finally saved.
>>>>>
>>>>> Regards,
>>>>> Alex
>>>>>
>>>>>
>>>>>
>>>>> On 24.06.2011 15:48, Taha Hafeez wrote:
>>>>>>
>>>>>> Hi
>>>>>>
>>>>>> Whenever you use a zone in a loop, you should provide the javascript id
>>>>>> yourself. You can use the index to create a unique one
>>>>>>
>>>>>> e.g.
>>>>>>
>>>>>> <t:zone t:id='textareaZone' id='textareaZone_${index}'>
>>>>>> </t:zone>
>>>>>>
>>>>>> If you are using a non-ajax form, what is the use of zone here ??
>>>>>>
>>>>>> regards
>>>>>> Taha
>>>>>>
>>>>>> On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
>>>>>> <al...@gmail.com>     wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I asked this before but couldn't resolve the issue based on the information that Taha forwarded me.
>>>>>>> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>>>>>>>
>>>>>>> I have a loop that creates textareas within a form. Each textarea is wrapped by a zone. Outside the loop is a submit button to save the form. No matter whether I set the submit defer attribute to false or true, my code only persists the information of the last texarea in the loop.
>>>>>>>
>>>>>>> That's how the form part of the tml looks like:
>>>>>>>
>>>>>>> <t:form>
>>>>>>>   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>>>>     encoder="cEncoder">
>>>>>>>     <t:zone t:id="textareaZone">
>>>>>>>       <t:textarea value="textareaValue" />
>>>>>>>     </t:zone>
>>>>>>>   </t:loop>
>>>>>>>   <t:submit value="Save" t:id="save"/>
>>>>>>> </t:form>
>>>>>>>
>>>>>>> The odd thing is that the encoder (cEncoder) for the loop gets called n times before the setter of the currentCriteria field gets called n times. Removing the zone brings back the normal behaviour of calling first the encoder and second, the setter of the corresponding field.
>>>>>>>
>>>>>>> Any hints and pointers to fix this are much appreciated.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Alex
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> DI(FH) Alexander Rosemann
>>>>>>> open source based software solutions
>>>>>>> Naunspitzweg 3 | 6341 Ebbs | Austria
>>>>>>> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Taha Hafeez <ta...@gmail.com>.
Hi Alex

It took me quite a while to debug and this is my understanding.

The loop uses a hidden field to store the 'value' parameter in the
form(using the encoder for converting it to a string) and later
retrieves the value before setting value of bound variables. The
hidden field also contains the name of the field to be processed this
way. An ajax request causes reload of the textarea which in turn
causes the name and id to change and so the loop is not able to find
this field and its bound variable is set after all the encoders have
been called

Someone may explain it better

A less than ideal solution may be to get the zone out of the loop

regards
Taha


> On Mon, Jun 27, 2011 at 12:19 AM, Alexander Rosemann <al...@gmail.com> wrote:
>>
>> Removing the zone surrounding the textarea fixes the save issue but of course breaks the update functionality.
>>
>> This is the code:
>>
>> public class LoopWithZoneIssue {
>>
>>    private final Logger logger = LoggerFactory.getLogger(Feedback.class);
>>    @Inject
>>    private Request request;
>>    @Property
>>    private String currentLink;
>>    @Property
>>    private String currentCriteria;
>>    @Property
>>    private int linkIndex;
>>    @Property
>>    private int criteriaIndex;
>>    @InjectComponent
>>    @Property
>>    private Zone textareaZone;
>>    @Persist
>>    private Map<String, String> criteria;
>>    @Persist
>>    private Map<String, String> links;
>>    private String ajaxLink;
>>    private String ajaxCriteria;
>>
>>    void onActivate() {
>>        if (criteria == null) {
>>            criteria = new HashMap<String, String>();
>>            criteria.put("Research", "Systematic identification and investigation of appropriate sources");
>>            criteria.put("Communication and Presentation", "Clarity of purpose; skills in the selected media; "
>>                + "awareness and adoption of appropriate conventions; sensitivity to the needs of the audience");
>>            criteria.put("Analysis", "Examination and interpretation of resources");
>>            criteria.put("Personal and professional development", "Management of learning through reflection,  "
>>                + "planning,  self direction,  subject engagement and commitment");
>>        }
>>        if (links == null) {
>>            links = new HashMap<String, String>();
>>            links.put("A", "Default value for A");
>>            links.put("B", "Default value for B");
>>            links.put("C", "Default value for C");
>>            links.put("D", "Default value for D");
>>            links.put("E", "Default value for E");
>>        }
>>    }
>>
>>    public void onSelectedFromSaveFeedback() {
>>        logger.debug("Saving feedback form");
>>    }
>>
>>    public Object onActionFromLink(String linkId, String criteriaId) {
>>        ajaxLink = links.get(linkId);
>>        ajaxCriteria = criteria.get(criteriaId);
>>        return textareaZone.getBody();
>>    }
>>
>>    public String getUniqueZoneId() {
>>        return "uniqueZoneId_" + criteriaIndex;
>>    }
>>
>>    public Collection<String> getCriteria() {
>>        return criteria.keySet();
>>    }
>>
>>    public Collection<String> getLinks() {
>>        return links.keySet();
>>    }
>>
>>    public ValueEncoder<String> getCriteriaEncoder() {
>>        return new ValueEncoder<String>() {
>>
>>            public String toValue(String value) {
>>                for (String key : criteria.keySet()) {
>>                    if (criteria.get(key).equals(value))
>>                        return key;
>>                }
>>                return "unknown";
>>            }
>>
>>            public String toClient(String key) {
>>                String value = criteria.get(key);
>>                return value;
>>            }
>>        };
>>    }
>>
>>    public String getTextareaValue() {
>>        logger.debug("called getTextareaValue");
>>        if (request.isXHR()) {
>>            return ajaxLink;
>>        }
>>        else {
>>            return criteria.get(currentCriteria);
>>        }
>>    }
>>
>>    public void setTextareaValue(String textareaValue) {
>>        logger.debug("called setTextareaValue '{}' for criteria '{}'", textareaValue, currentCriteria);
>>        criteria.put(currentCriteria, textareaValue);
>>    }
>>
>> }
>>
>> And the tml:
>>
>> <t:form>
>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>  encoder="criteriaEncoder" index="criteriaIndex">
>>    <h3>${currentCriteria}</h3>
>>    <t:loop t:id="links" value="currentLink"
>>    source="links" index="linkIndex">
>>      <t:actionlink t:id="link" zone="prop:uniqueZoneId"
>>      context="[currentLink,currentCriteria]">${currentLink}
>>      </t:actionlink>
>>      <span>&nbsp;&nbsp;&nbsp;</span>
>>    </t:loop>
>>    <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>      <t:textarea value="textareaValue"
>>      style="width:100%;height:9em;" />
>>    </t:zone>
>>    <br />
>>    <br />
>>  </t:loop>
>>  <t:submit value="Save" t:id="save" />
>> </t:form>
>>
>> Thanks,
>> Alex
>>
>> On 24.06.2011 17:27, Taha Tapestry wrote:
>>>
>>> Can you share the code of the event handler for the action.
>>> I think all the textareas are getting bound to the last object of the loop's source
>>>
>>>
>>> Regards
>>> Taha
>>>
>>> On Jun 24, 2011, at 7:35 PM, Alexander Rosemann<al...@gmail.com>  wrote:
>>>
>>>> Hi Taha,
>>>>
>>>> I should have put more thought in my example. The zone gets its unique id and is updated by a set of actionlinks that I have omitted in my previous example. This is the full one:
>>>>
>>>> <t:form>
>>>>
>>>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>    encoder="cEncoder">
>>>>
>>>>    <t:loop t:id="links" value="link" source="links">
>>>>      <t:actionlink t:id="linkId" zone="prop:uniqueZoneId">some
>>>>        text</t:actionlink>
>>>>    </t:loop>
>>>>
>>>>    <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>>>      <t:textarea value="textareaValue" />
>>>>    </t:zone>
>>>>
>>>>  </t:loop>
>>>>
>>>>  <t:submit value="Save" t:id="save"/>
>>>> </t:form>
>>>>
>>>> The actionlinks fill the textarea with default data which can then be altered by the user and finally saved.
>>>>
>>>> Regards,
>>>> Alex
>>>>
>>>>
>>>>
>>>> On 24.06.2011 15:48, Taha Hafeez wrote:
>>>>>
>>>>> Hi
>>>>>
>>>>> Whenever you use a zone in a loop, you should provide the javascript id
>>>>> yourself. You can use the index to create a unique one
>>>>>
>>>>> e.g.
>>>>>
>>>>> <t:zone t:id='textareaZone' id='textareaZone_${index}'>
>>>>> </t:zone>
>>>>>
>>>>> If you are using a non-ajax form, what is the use of zone here ??
>>>>>
>>>>> regards
>>>>> Taha
>>>>>
>>>>> On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
>>>>> <al...@gmail.com>   wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I asked this before but couldn't resolve the issue based on the information that Taha forwarded me.
>>>>>> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>>>>>>
>>>>>> I have a loop that creates textareas within a form. Each textarea is wrapped by a zone. Outside the loop is a submit button to save the form. No matter whether I set the submit defer attribute to false or true, my code only persists the information of the last texarea in the loop.
>>>>>>
>>>>>> That's how the form part of the tml looks like:
>>>>>>
>>>>>> <t:form>
>>>>>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>>>    encoder="cEncoder">
>>>>>>    <t:zone t:id="textareaZone">
>>>>>>      <t:textarea value="textareaValue" />
>>>>>>    </t:zone>
>>>>>>  </t:loop>
>>>>>>  <t:submit value="Save" t:id="save"/>
>>>>>> </t:form>
>>>>>>
>>>>>> The odd thing is that the encoder (cEncoder) for the loop gets called n times before the setter of the currentCriteria field gets called n times. Removing the zone brings back the normal behaviour of calling first the encoder and second, the setter of the corresponding field.
>>>>>>
>>>>>> Any hints and pointers to fix this are much appreciated.
>>>>>>
>>>>>> Regards,
>>>>>> Alex
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> DI(FH) Alexander Rosemann
>>>>>> open source based software solutions
>>>>>> Naunspitzweg 3 | 6341 Ebbs | Austria
>>>>>> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Alexander Rosemann <al...@gmail.com>.
Removing the zone surrounding the textarea fixes the save issue but of 
course breaks the update functionality.

This is the code:

public class LoopWithZoneIssue {

     private final Logger logger = LoggerFactory.getLogger(Feedback.class);
     @Inject
     private Request request;
     @Property
     private String currentLink;
     @Property
     private String currentCriteria;
     @Property
     private int linkIndex;
     @Property
     private int criteriaIndex;
     @InjectComponent
     @Property
     private Zone textareaZone;
     @Persist
     private Map<String, String> criteria;
     @Persist
     private Map<String, String> links;
     private String ajaxLink;
     private String ajaxCriteria;

     void onActivate() {
         if (criteria == null) {
             criteria = new HashMap<String, String>();
             criteria.put("Research", "Systematic identification and 
investigation of appropriate sources");
             criteria.put("Communication and Presentation", "Clarity of 
purpose; skills in the selected media; "
                 + "awareness and adoption of appropriate conventions; 
sensitivity to the needs of the audience");
             criteria.put("Analysis", "Examination and interpretation of 
resources");
             criteria.put("Personal and professional development", 
"Management of learning through reflection,  "
                 + "planning,  self direction,  subject engagement and 
commitment");
         }
         if (links == null) {
             links = new HashMap<String, String>();
             links.put("A", "Default value for A");
             links.put("B", "Default value for B");
             links.put("C", "Default value for C");
             links.put("D", "Default value for D");
             links.put("E", "Default value for E");
         }
     }

     public void onSelectedFromSaveFeedback() {
         logger.debug("Saving feedback form");
     }

     public Object onActionFromLink(String linkId, String criteriaId) {
         ajaxLink = links.get(linkId);
         ajaxCriteria = criteria.get(criteriaId);
         return textareaZone.getBody();
     }

     public String getUniqueZoneId() {
         return "uniqueZoneId_" + criteriaIndex;
     }

     public Collection<String> getCriteria() {
         return criteria.keySet();
     }

     public Collection<String> getLinks() {
         return links.keySet();
     }

     public ValueEncoder<String> getCriteriaEncoder() {
         return new ValueEncoder<String>() {

             public String toValue(String value) {
                 for (String key : criteria.keySet()) {
                     if (criteria.get(key).equals(value))
                         return key;
                 }
                 return "unknown";
             }

             public String toClient(String key) {
                 String value = criteria.get(key);
                 return value;
             }
         };
     }

     public String getTextareaValue() {
         logger.debug("called getTextareaValue");
         if (request.isXHR()) {
             return ajaxLink;
         }
         else {
             return criteria.get(currentCriteria);
         }
     }

     public void setTextareaValue(String textareaValue) {
         logger.debug("called setTextareaValue '{}' for criteria '{}'", 
textareaValue, currentCriteria);
         criteria.put(currentCriteria, textareaValue);
     }

}

And the tml:

<t:form>
   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
   encoder="criteriaEncoder" index="criteriaIndex">
     <h3>${currentCriteria}</h3>
     <t:loop t:id="links" value="currentLink"
     source="links" index="linkIndex">
       <t:actionlink t:id="link" zone="prop:uniqueZoneId"
       context="[currentLink,currentCriteria]">${currentLink}
       </t:actionlink>
       <span>&nbsp;&nbsp;&nbsp;</span>
     </t:loop>
     <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
       <t:textarea value="textareaValue"
       style="width:100%;height:9em;" />
     </t:zone>
     <br />
     <br />
   </t:loop>
   <t:submit value="Save" t:id="save" />
</t:form>

Thanks,
Alex

On 24.06.2011 17:27, Taha Tapestry wrote:
>
> Can you share the code of the event handler for the action.
> I think all the textareas are getting bound to the last object of the loop's source
>
>
> Regards
> Taha
>
> On Jun 24, 2011, at 7:35 PM, Alexander Rosemann<al...@gmail.com>  wrote:
>
>> Hi Taha,
>>
>> I should have put more thought in my example. The zone gets its unique id and is updated by a set of actionlinks that I have omitted in my previous example. This is the full one:
>>
>> <t:form>
>>
>>   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>     encoder="cEncoder">
>>
>>     <t:loop t:id="links" value="link" source="links">
>>       <t:actionlink t:id="linkId" zone="prop:uniqueZoneId">some
>>         text</t:actionlink>
>>     </t:loop>
>>
>>     <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>>       <t:textarea value="textareaValue" />
>>     </t:zone>
>>
>>   </t:loop>
>>
>>   <t:submit value="Save" t:id="save"/>
>> </t:form>
>>
>> The actionlinks fill the textarea with default data which can then be altered by the user and finally saved.
>>
>> Regards,
>> Alex
>>
>>
>>
>> On 24.06.2011 15:48, Taha Hafeez wrote:
>>> Hi
>>>
>>> Whenever you use a zone in a loop, you should provide the javascript id
>>> yourself. You can use the index to create a unique one
>>>
>>> e.g.
>>>
>>> <t:zone t:id='textareaZone' id='textareaZone_${index}'>
>>> </t:zone>
>>>
>>> If you are using a non-ajax form, what is the use of zone here ??
>>>
>>> regards
>>> Taha
>>>
>>> On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
>>> <al...@gmail.com>   wrote:
>>>>
>>>> Hi,
>>>>
>>>> I asked this before but couldn't resolve the issue based on the information that Taha forwarded me.
>>>> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>>>>
>>>> I have a loop that creates textareas within a form. Each textarea is wrapped by a zone. Outside the loop is a submit button to save the form. No matter whether I set the submit defer attribute to false or true, my code only persists the information of the last texarea in the loop.
>>>>
>>>> That's how the form part of the tml looks like:
>>>>
>>>> <t:form>
>>>>   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>>     encoder="cEncoder">
>>>>     <t:zone t:id="textareaZone">
>>>>       <t:textarea value="textareaValue" />
>>>>     </t:zone>
>>>>   </t:loop>
>>>>   <t:submit value="Save" t:id="save"/>
>>>> </t:form>
>>>>
>>>> The odd thing is that the encoder (cEncoder) for the loop gets called n times before the setter of the currentCriteria field gets called n times. Removing the zone brings back the normal behaviour of calling first the encoder and second, the setter of the corresponding field.
>>>>
>>>> Any hints and pointers to fix this are much appreciated.
>>>>
>>>> Regards,
>>>> Alex
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> DI(FH) Alexander Rosemann
>>>> open source based software solutions
>>>> Naunspitzweg 3 | 6341 Ebbs | Austria
>>>> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Taha Tapestry <ta...@gmail.com>.
Can you share the code of the event handler for the action. 
I think all the textareas are getting bound to the last object of the loop's source


Regards
Taha 

On Jun 24, 2011, at 7:35 PM, Alexander Rosemann <al...@gmail.com> wrote:

> Hi Taha,
> 
> I should have put more thought in my example. The zone gets its unique id and is updated by a set of actionlinks that I have omitted in my previous example. This is the full one:
> 
> <t:form>
> 
>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>    encoder="cEncoder">
> 
>    <t:loop t:id="links" value="link" source="links">
>      <t:actionlink t:id="linkId" zone="prop:uniqueZoneId">some
>        text</t:actionlink>
>    </t:loop>
> 
>    <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
>      <t:textarea value="textareaValue" />
>    </t:zone>
> 
>  </t:loop>
> 
>  <t:submit value="Save" t:id="save"/>
> </t:form>
> 
> The actionlinks fill the textarea with default data which can then be altered by the user and finally saved.
> 
> Regards,
> Alex
> 
> 
> 
> On 24.06.2011 15:48, Taha Hafeez wrote:
>> Hi
>> 
>> Whenever you use a zone in a loop, you should provide the javascript id
>> yourself. You can use the index to create a unique one
>> 
>> e.g.
>> 
>> <t:zone t:id='textareaZone' id='textareaZone_${index}'>
>> </t:zone>
>> 
>> If you are using a non-ajax form, what is the use of zone here ??
>> 
>> regards
>> Taha
>> 
>> On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
>> <al...@gmail.com>  wrote:
>>> 
>>> Hi,
>>> 
>>> I asked this before but couldn't resolve the issue based on the information that Taha forwarded me.
>>> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>>> 
>>> I have a loop that creates textareas within a form. Each textarea is wrapped by a zone. Outside the loop is a submit button to save the form. No matter whether I set the submit defer attribute to false or true, my code only persists the information of the last texarea in the loop.
>>> 
>>> That's how the form part of the tml looks like:
>>> 
>>> <t:form>
>>>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>>    encoder="cEncoder">
>>>    <t:zone t:id="textareaZone">
>>>      <t:textarea value="textareaValue" />
>>>    </t:zone>
>>>  </t:loop>
>>>  <t:submit value="Save" t:id="save"/>
>>> </t:form>
>>> 
>>> The odd thing is that the encoder (cEncoder) for the loop gets called n times before the setter of the currentCriteria field gets called n times. Removing the zone brings back the normal behaviour of calling first the encoder and second, the setter of the corresponding field.
>>> 
>>> Any hints and pointers to fix this are much appreciated.
>>> 
>>> Regards,
>>> Alex
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> --
>>> DI(FH) Alexander Rosemann
>>> open source based software solutions
>>> Naunspitzweg 3 | 6341 Ebbs | Austria
>>> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Alexander Rosemann <al...@gmail.com>.
Hi Taha,

I should have put more thought in my example. The zone gets its unique 
id and is updated by a set of actionlinks that I have omitted in my 
previous example. This is the full one:

<t:form>

   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
     encoder="cEncoder">

     <t:loop t:id="links" value="link" source="links">
       <t:actionlink t:id="linkId" zone="prop:uniqueZoneId">some
         text</t:actionlink>
     </t:loop>

     <t:zone t:id="textareaZone" id="prop:uniqueZoneId">
       <t:textarea value="textareaValue" />
     </t:zone>

   </t:loop>

   <t:submit value="Save" t:id="save"/>
</t:form>

The actionlinks fill the textarea with default data which can then be 
altered by the user and finally saved.

Regards,
Alex



On 24.06.2011 15:48, Taha Hafeez wrote:
> Hi
>
> Whenever you use a zone in a loop, you should provide the javascript id
> yourself. You can use the index to create a unique one
>
> e.g.
>
> <t:zone t:id='textareaZone' id='textareaZone_${index}'>
> </t:zone>
>
> If you are using a non-ajax form, what is the use of zone here ??
>
> regards
> Taha
>
> On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
> <al...@gmail.com>  wrote:
>>
>> Hi,
>>
>> I asked this before but couldn't resolve the issue based on the information that Taha forwarded me.
>> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>>
>> I have a loop that creates textareas within a form. Each textarea is wrapped by a zone. Outside the loop is a submit button to save the form. No matter whether I set the submit defer attribute to false or true, my code only persists the information of the last texarea in the loop.
>>
>> That's how the form part of the tml looks like:
>>
>> <t:form>
>>   <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>>     encoder="cEncoder">
>>     <t:zone t:id="textareaZone">
>>       <t:textarea value="textareaValue" />
>>     </t:zone>
>>   </t:loop>
>>   <t:submit value="Save" t:id="save"/>
>> </t:form>
>>
>> The odd thing is that the encoder (cEncoder) for the loop gets called n times before the setter of the currentCriteria field gets called n times. Removing the zone brings back the normal behaviour of calling first the encoder and second, the setter of the corresponding field.
>>
>> Any hints and pointers to fix this are much appreciated.
>>
>> Regards,
>> Alex
>>
>>
>>
>>
>>
>>
>>
>>
>> --
>> DI(FH) Alexander Rosemann
>> open source based software solutions
>> Naunspitzweg 3 | 6341 Ebbs | Austria
>> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: T5.2.5 - loop, zones and a save button

Posted by Taha Hafeez <ta...@gmail.com>.
Hi

Whenever you use a zone in a loop, you should provide the javascript id
yourself. You can use the index to create a unique one

e.g.

<t:zone t:id='textareaZone' id='textareaZone_${index}'>
</t:zone>

If you are using a non-ajax form, what is the use of zone here ??

regards
Taha

On Fri, Jun 24, 2011 at 7:01 PM, Alexander Rosemann
<al...@gmail.com> wrote:
>
> Hi,
>
> I asked this before but couldn't resolve the issue based on the information that Taha forwarded me.
> (http://tapestry.1045711.n5.nabble.com/loops-zones-and-encoders-td4425814.html#a4425945)
>
> I have a loop that creates textareas within a form. Each textarea is wrapped by a zone. Outside the loop is a submit button to save the form. No matter whether I set the submit defer attribute to false or true, my code only persists the information of the last texarea in the loop.
>
> That's how the form part of the tml looks like:
>
> <t:form>
>  <t:loop t:id="criteria" value="currentCriteria" source="criteria"
>    encoder="cEncoder">
>    <t:zone t:id="textareaZone">
>      <t:textarea value="textareaValue" />
>    </t:zone>
>  </t:loop>
>  <t:submit value="Save" t:id="save"/>
> </t:form>
>
> The odd thing is that the encoder (cEncoder) for the loop gets called n times before the setter of the currentCriteria field gets called n times. Removing the zone brings back the normal behaviour of calling first the encoder and second, the setter of the corresponding field.
>
> Any hints and pointers to fix this are much appreciated.
>
> Regards,
> Alex
>
>
>
>
>
>
>
>
> --
> DI(FH) Alexander Rosemann
> open source based software solutions
> Naunspitzweg 3 | 6341 Ebbs | Austria
> mobile: +43-681-10337082 | email: alexander.rosemann@gmail.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org