Percentage prices!

Hi there - I want to show a price on a page, minus the percentage sdiscount.

I tried this, which i thought would work, but the output is szero:


Any ideas what I’ve done wrong?


If you output the TVs directly ( → [[*startingPrice]], [[*percentageDiscount]]), do they have the correct values?

Also, I would write a custom snippet instead of using two output modifiers.

Yes the values output as expected.
Will see if I can write a snippet then although not my strong point!

You can add the TV values as properties to your custom snippet.
For example like this:

[[calculatePrice? &discount=`[[*percentageDiscount]]` &price=`[[*startingPrice]]`]]

Then in the snippet “calculatePrice”, use the variables with the name of the properties:

return $price - ($price * $discount / 100);

Oh that’s great thank you. I will add this and see if it works asap. Wasn’t expecting you to write it for me. Really appreciate it.

This works really well - and very simple to understand - thanks.
The only issue is that if the product isn’t reduced (so the percentage discount TV is empty, the page throws a 500 error.

I assume in the snippet I need a fallback or something to prevent this?

In the snippet code you could (for example) use this line:

$discount = $modx->getOption('discount', $scriptProperties, 0, true);

It sets the variable $discount to 0 (third parameter = default value) if the discount property doesn’t exist or is empty.

Or you could cast the property to a number before it is used in the calculation:

$discount = (float) $discount;

There are also other ways to improve the snippet code:
For example use round() to round the result or number_format() to format it:

$price_with_discount = round($price - ($price * $discount / 100), 2);
return number_format($price_with_discount, 2);

Thank you Harry. I had tried to use output modifiers to determine whether or not to load the new snippet like so:

[[*percentageDiscount:notempty=`[[calculatePrice? &discount=`[[*percentageDiscount]]` &price=`[[*startingPrice]]`]]`]]

But that didn’t work.

I will try your solution within the snippet itself instead.


Nested MODX tags are executed first.
So the snippet “calculatePrice” runs always, no matter if percentageDiscount is empty or not.

Ah I see. Thanks for explaining.

This topic was automatically closed 2 days after discussion ended and a solution was marked. New replies are no longer allowed. You can open a new topic by clicking the link icon below the original post or solution and selecting “+ New Topic”.