Publicador de continguts

Apoya a los niños y jóvenes en dificultad

Apoya a los niños y jóvenes en dificultad Con tu ayuda Cruz Roja podrá apoyar a los más pequeños y a sus familias, facilitándoles...

Juguetes para educar y jugar

¡Necesitamos 75.000 juguetes para niños y niñas! Desde Cruz Roja Juventud estamos tratando de conseguir que los niños y niñas que se encuentran en familias con dificultades puedan disfrutar de...

Crisis humanitaria Gaza y Medio Oriente

Crisis humanitaria Gaza y Medio Oriente El conflicto entre Gaza e Israel ha desencadenado una grave crisis humanitaria regional en...

Ayuda a personas que padecen pobreza extrema

Ayuda a personas que padecen pobreza extrema Ahora acuden a Cruz Roja personas que nunca hubieran pensado tener que pedirnos ayuda....

Ayuda afectados incendios forestales 2025

Ayuda afectados incendios forestales 2025 Aunque la situación no es tan grave como en las últimas semanas, el fuego sigue muy...

Ayuda emergencia DANA

Ayuda emergencia DANA Las fuertes lluvias de los últimos días están ocasionando  grandes daños materiales, así como decenas de...

Cruz Roja Reacciona por la empleabilidad de jóvenes y mujeres en dificultad

Cruz Roja Reacciona por la empleabilidad de jóvenes y mujeres en dificultad Cruz Roja sigue apoyando el empleo en personas jóvenes...

Crisis Alimentaria Mundial

Crisis Alimentaria Mundial El aumento de precios de alimentos y combustible, la escasez de cereales y fertilizantes, el impacto del...

Apoya el Fondo de Emergencias de Cruz Roja Española

Apoya el Fondo de Emergencias de Cruz Roja Española Movilizamos recursos del Fondo de Ayuda para Emergencias para atender a las...

Ayuda a las víctimas de las inundaciones en Libia

Ayuda a las víctimas de las inundaciones en Libia La tormenta Daniel ha dejado a su paso en el noreste de Libia una gran...

Plan Cruz Roja Reacciona ante la Crisis

Plan Cruz Roja Reacciona ante la Crisis Cruz Roja lanza el plan ‘Cruz Roja Reacciona: una respuesta directa, inmediata y...

Plan Cruz Roja Reacciona ante la Crisis

Plan Cruz Roja Reacciona ante la Crisis Cruz Roja lanza el plan ‘Cruz Roja Reacciona: una respuesta directa, inmediata y...

Apoya a las víctimas de violencia de género

Apoya a las víctimas de violencia de género La violencia de género impacta gravemente sobre la vida de las mujeres, incluyendo a...

DonationCounterModule

Mòdul de portal no està disponible temporalment.

Publicador de continguts

S'ha produït un error mentre es processava la plantilla.
The following has evaluated to null or missing:
==> articleName  [in template "20115#20151#119416624" at line 198, column 60]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${articleName}  [in template "20115#20151#119416624" at line 198, column 58]
----
1<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
2<!-- necesario para montar la url para realizar la donacion --> 
3<#assign groupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")/> 
4<#assign group = groupLocalService.getGroup(groupId)/> 
5<#assign groupFriendlyURL = group.getFriendlyURL() /> 
6<#assign friendlyURL = group.getPathFriendlyURL(false,themeDisplay) + groupFriendlyURL /> 
7 
8<#attempt> 
9	<#assign assetEntry = renderRequest.getAttribute('LIFERAY_SHARED_LAYOUT_ASSET_ENTRY') /> 
10 
11	<#assign classPK = assetEntry.classPK /> 
12 
13	<#assign article = journalArticleLocalService.fetchLatestArticle(classPK) /> 
14 
15	<#assign articleId = journalArticleLocalService.fetchLatestArticle(classPK).articleId /> 
16 
17	<#assign docXml = saxReaderUtil.read(article.getContent()) /> 
18 
19	<#if docXml?has_content> 
20		<#assign idExterno = docXml .valueOf("//dynamic-element[@name='idCampana']/dynamic-content/text()") /> 
21		<#assign articleName = htmlUtil.escape(article.getTitle(locale))/> 
22 
23		<div class="evr-donation" style="margin-top: 1.875rem;"> 
24			<div class="evr-donation__module"> 
25 
26				<div id="evr-donation__when" class="evr-donation__when clearfix"> 
27					<button class="btn btn-primary btn-normal selected" id="punctual"> <@liferay.language key="once-text"/> </button> 
28					<button class="btn btn-primary btn-normal btn-bordered-primary" id="periodic"> <@liferay.language key="monthly-text"/> </button> 
29				</div> 
30				<div class="evr-donation__quantity-area"> 
31					<div class="evr-donation__quantity-area__title"> 
32						<@liferay.language key="elige-cantidad-text"/> 
33					</div> 
34					<div class="evr-donation__quantity-area__actions"> 
35						<div id="euros" class="evr-donation__quantity-area__euros"> 
36							<#assign primerNumero = docXml .valueOf("//dynamic-element[@name='cantidadPrimera']/dynamic-content/text()") /> 
37							<a class="selected" id="primerNumero" data-amount="${primerNumero}">${primerNumero}€</a> 
38 
39							<#assign segundoNumero = docXml .valueOf("//dynamic-element[@name='cantidadSegunda']/dynamic-content/text()") /> 
40							<a id="segundoNumero"  data-amount="${segundoNumero}">${segundoNumero}€</a> 
41 
42							<#assign tercerNumero = docXml .valueOf("//dynamic-element[@name='cantidadTercera']/dynamic-content/text()") /> 
43							<a id="tercerNumero" data-amount="${tercerNumero}">${tercerNumero}€</a> 
44 
45							<!-- input de otra cantidad --> 
46							<div class="form-group input-text-wrapper evr-donation__quantity-area__other"> 
47								<input class="field form-control" id="otraCantidad" style="font-size:1.775rem; padding-right:0rem;" autocomplete="off" value="" aria-invalid="false" type="number" min="0" placeholder= <@liferay.language key="otra-cantidad-text"/> > 
48							</div> 
49							<div role="alert" class="required" id="errorAmount" 
50								 style="display:none; text-align:center; color:red;">La donación debe ser mayor que 0 
51							</div> 
52						</div> 
53						<button id="colaborarButton" class="btn btn-primary w100" 
54								onclick="colaborar()"><@liferay.language key="colaborar-link"/></button> 
55					</div> 
56				</div> 
57 
58			</div> 
59		</div> 
60 
61	</#if> 
62	<#recover> 
63</#attempt> 
64 
65 
66<script> 
67 
68	var amount = 0; 
69	var periodicity = 'punctual'; 
70	var url; 
71 
72	function when(){ 
73		periodicity = $("#evr-donation__when").find(".btn.selected").attr("id"); 
74		$("#evr-donation__when").find(".btn").click(function(){ 
75			$("#evr-donation__when").find(".btn").each(function(){ 
76				$(this).addClass("btn-bordered-primary"); 
77				$(this).removeClass("selected"); 
78			}); 
79			$(this).removeClass("btn-bordered-primary"); 
80			$(this).addClass("selected"); 
81			periodicity = $(this).attr("id"); 
82			updateDataLayer(amount, periodicity); 
83		}); 
84
85 
86	function howmuch(){ 
87		amount = $("#euros").find("a.selected").attr("data-amount"); 
88		$("#euros").find("a").click(function(){ 
89			$("#euros").find("a").each(function(){ 
90				$(this).removeClass("selected"); 
91			}); 
92			$(this).addClass("selected"); 
93			$("#otraCantidad").removeClass("hasval"); 
94			$("#otraCantidad").val(''); 
95			$("#otraCantidad").parent().removeClass("has-error"); 
96			$("#otraCantidad").removeClass("error-field"); 
97			$("#errorAmount").hide(); 
98			$("#colaborarButton").prop('disabled', false); 
99			amount = $(this).attr("data-amount"); 
100			updateDataLayer(amount, periodicity); 
101		}); 
102
103 
104	function other(){ 
105		$("#otraCantidad").removeClass("hasval"); 
106		$("#otraCantidad").val(''); 
107 
108		$("#otraCantidad").on("cut copy paste",function(e){ 
109			return false; 
110		}); 
111		$("#otraCantidad").keypress(function(e){ 
112			if(isNaN(String.fromCharCode(e.charCode))){ 
113				return false; 
114
115		}); 
116 
117		if($("#otraCantidad").val() !=""){ 
118			$("#otraCantidad").addClass("hasval"); 
119
120		else{ 
121			$("#otraCantidad").removeClass("hasval"); 
122
123 
124		$("#otraCantidad").change(function () { 
125			if ($(this).val() != "") { 
126				$(this).addClass("hasval"); 
127				$("#euros").find("a").each(function () { 
128					$(this).removeClass("selected"); 
129				}); 
130				const regexPositiveDonation = /^[1-9]\d*$/; 
131				const isValid = regexPositiveDonation.test($(this).val()); 
132				$("#otraCantidad").parent().toggleClass("has-error", !isValid); 
133				$("#otraCantidad").toggleClass("error-field", !isValid); 
134				$("#colaborarButton").prop('disabled', !isValid); 
135				$("#errorAmount").toggle(!isValid); 
136				} else { 
137					$(this).removeClass("hasval"); 
138
139			amount = $(this).val(); 
140			updateDataLayer(amount, periodicity); 
141		}); 
142 
143		$("#otraCantidad").click(function(){ 
144			$("#euros").find("a").each(function(){ 
145				$(this).removeClass("selected"); 
146			}); 
147			if($(this).val() !=""){ 
148				$(this).addClass("hasval"); 
149
150			else{ 
151				$(this).removeClass("hasval"); 
152
153			amount = $(this).val(); 
154			updateDataLayer(amount, periodicity); 
155		}); 
156
157 
158	function colaborar() { 
159		var articleIdCheck = "noArticle"; 
160		updateDataLayer(amount, periodicity); 
161		<#if articleId?has_content && articleId!=""> 
162		articleIdCheck = ${articleId}; 
163		</#if> 
164 
165		encryptParam(url, periodicity, amount, articleIdCheck); 
166
167 
168	function encryptParam(url, periodicity, amount, articleId){ 
169		var endpoint = "/o/utils-api/util/encrypt/"+periodicity+"/"+amount+"/"+articleId; 
170		$.ajax({ 
171			url: endpoint, 
172			type: 'GET', 
173			cache: false, 
174			dataType: "json" 
175		}).done(function (data, textStatus, jsqXHR) { 
176			var url = "${friendlyURL}/"+"donacion"+"?periodicity="+data.periodicityEncrypted + "&money=" + data.amountEncrypted + "&articleId=" + data.articleIdEncrypted; 
177			url = url.replace(/ /g, ""); 
178			location.href = url; 
179		}).fail(function (jqXHR, textStatus, errorThrown) { 
180			console.error(errorThrown); 
181		}); 
182
183 
184	otraCantidad.oninput = function () { 
185		if (this.value.length > 5) { 
186			this.value = this.value.slice(0,5); 
187
188
189 
190	function updateDataLayer(price,variant){ 
191		var data = { 
192			'event': 'productDetail', 
193			'ecommerce': { 
194				'detail': { 
195					'actionField': 
196							{'list': 'Haz un donativo'}, 
197					'products': [{ 
198						'name': '${articleName}', // articleName 
199						'id': '${articleId}', // articleId 
200						'price': price, // price 
201						'brand': 'Cruz Roja', // brand 
202						'variant': variant // periodicity 
203					}] 
204
205
206		}; 
207		if (dataLayer.length > 0) { 
208			for (let i = 0; i < dataLayer.length; i++) { 
209				if (typeof dataLayer[i].ecommerce !== 'undefined') { 
210					dataLayer.splice(i, 1); 
211
212
213
214		dataLayer.push(data); 
215
216 
217	$(document).ready(function () { 
218		when(); 
219		howmuch(); 
220		other(); 
221		updateDataLayer(amount, periodicity); 
222	}); 
223 
224</script> 
225 
226<style> 
227	/* Chrome, Safari, Edge, Opera */ 
228	input::-webkit-outer-spin-button, 
229	input::-webkit-inner-spin-button { 
230		-webkit-appearance: none; 
231		margin: 0; 
232
233 
234	/* Firefox */ 
235	input[type=number] { 
236		-moz-appearance: textfield; 
237
238</style>