How to correctly copy an array element in smarty - smarty

I want to copy array element into another array element.
I have an smarty array $product: {["link"]=> "aaa" ["test"]=> 22 }
I want to have: {["link"]=> "aaa" ["test"]=> 22 ["url"]=> "aaa" }
I tried variations of
{assign var=$product.url value=$product.link}
{assign var=product.url value=product.link}
{assign var='product.url' value=$product.link}
etc.
But this either causes errors or the variable is not being rewritten.
How to correctly copy an array element in smarty?

{$product['url'] = $product['link']}
or
{$product['url'] = $product.link}

Related

Trying to generate a string that becomes a variable name in Freemarker or a "derived variable name"

I'm using a data-directive or list to pull in several values, of which, I don't know how many there will be, and I want to try and list through them, and create several variables in the list if you will.
<#list 1..10 as x>
<#-- the next line doesn't work, but what i'm trying to fix -->
<#assign .vars['VAR'+x?string] = rand(100) />
</#list>
But I can list them back out that way.
<#list 1..10 as x>
${.vars['VAR'+x?string]}
</#list>
The documentation for assign, says:
name: name of the variable. It is not expression. However, it can be
written as a string literal, which is useful if the variable name
contains reserved characters, for example <#assign "foo-bar" = 1>.
Note that this string literal does not expand interpolations (as
"${foo}").
Is there no way around this? Am I trying to do the impossible? Is there some way I can insert a derived name into the .vars... Hash is it?
A little more research that was close, but didn't get me there:
This prevoius question gives how to READ the derived variable, but I need to WRITE/CREATE the derived variable.
FreeMarker get variable value by concatenating another variable value
This prevoius question shows that I can use a string to assign a variable and re-iterates what we saw in the first link.
Variable name in Freemarker Template Language
As FreeMarker can't assign to elements of collections (but you can ?map(it -> ...) a collection to another), the only way is via ?interpret:
<#list 1..10 as x>
<#-- the next line doesn't work, but what i'm trying to fix -->
<#'<#assign VAR${x?c} = rand(100)>'?interpret />
</#list>
I wonder why do you need to assign to a dynamically named variables though, since reading dynamically named variables is also a pain, even if a lesser one.
Ultimately, I believe the correct way to phrase my solution was a sequence of hashes:
<#list 1..z_Coupon_Pet.NUM_COUPONS as x>
<#assign INSTORE_COUPON=call_coupon_from_table1() />
<#assign ONLINE_COUPON=call_coupon_from_table2() />
<#assign coupon_string_row= '{
"COUPON_NUM" : ${x},
"INSTORE" : "${INSTORE_COUPON?js_string}",
"ONLINE" : "${ONLINE_COUPON?js_string}"
}' />
<#if x==1>
<#assign coupon_hash_string = coupon_string_row />
<#else>
<#assign coupon_hash_string = coupon_hash_string + ',' + coupon_string_row />
</#if>
</#list>
</#if>
<#if coupon_hash_string?has_content>
<#assign coupon_hash=parsejson('[' + coupon_hash_string + ']') />
</#if>
We specifically avoid <#assign my_hash = my_hash + element /> because of this note in the documentation:
Note that hash concatenation is not to be used for many repeated concatenations, like for adding items to a hash inside a loop. While adding together hashes is fast and is constant time (independent of the size of the hashes added), the resulting hash is a bit slower to read than the hashes added together. Thus after tens... of additions the result can be impractically slow to read.

Freemarker, looping sequence with one object/multiple attributes

I am working on looping through one object with multiple attributes. In my scenario, I am looking for external content values.
email_address
article01
article02
article03
email#address.com
Y
Y
These values can change all the time, so we have to define them manually every instance where we use this, but I want to be able to list them in a sequence and then loop through and include them when object.attribute=Y.
The below block is purely conceptual, but referencing the attribute within the expression is where I get confused.
<#assign seq = ['article01','article02','article03']>
<#list seq as articles>
<#if base.${article}="Y">
<#include "*/${article}.htm"/>
</#if>
</#list>
In this instance, the resulting code would be:
<html><article01.html content></html>
<html><article03.html content></html>
Assuming base.articel01 would work, you can use base[article] (instead of base.${article}).

Assigning true/false values to Smarty variables

I'm trying to assign a false value to a Smarty variable but whenever I test for it, it yields true value.
I've the following assignment:
{assign "access" false}
However, when I test its value:
{if $access}
You've access
{/if}
It tests true.
What am I doing wrong?
Probably you cannot use shorthand for booleans.
You need to use:
{assign "access" value=false}
or
{assign var="access" value=false}
If you're on smarty 3, you can just write:
{$access=false}

Selenium, PHPUnit: when I try get style attribute I get empty result instead of value

I met a problem when I wanted to get style attribute of element.
$styleValue = $this->getAttribute("//ul#style");
But result of var_dump($styleValue) is
string(1) ";"
But I expected "margin-left: -2432px;"
So, where am I wrong? How can I get style attribute of element?
Your XPath expression is wrong. If you want to read the #style attribute of the <ul/> tag, you have to use two step expressions: stepping into the list, then into the attribute. Each must be seperated using a /, the # only denominates an attribute.
//ul/#style

Concatenate smarty variable with foreach

In a .tpl file, I'm using a smarty foreach to concatenate values from an array, separated by pipes "|" :
{foreach from=$attachments item=attachment}{$attachment.file}|{/foreach}
This writes : test1.mp3|test2.mp3|test3.mp3|
Now... I need to pass this result as a variable in an href link.
The problem is I can't include my foreach inside the a href tag.
Also I tried to assign this result to a new smarty variable but can't figure how to do it.
Any help would be great.
Thanks.
You can do it this way:
{assign var=result value=''}
{foreach from=$attachments item=attachment}
{assign var=temp value=$attachment.file}
{assign var=result value=$result$temp|}
{/foreach}

Resources