An error occurred while processing the template.
The following has evaluated to null or missing: ==> request.getParameter("idBusLine") [in template "44061202331357#6471594#39064" at line 10, column 38] ---- Tip: If the failing expression is known to 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: #assign idBusLine = request.getParame... [in template "44061202331357#6471594#39064" at line 10, column 17] ----
1<#assign request = renderRequest.getOriginalHttpServletRequest() />
2
3<div class="container single-lines">
4 <div class="row">
5
6 <div class="col-md-12 col-lg-7">
7 <div class="container info-line-detail">
8 <div class="map-button hidden" id="mapButtonCopy">
9 <#if lineName.getSiblings()?has_content>
10 <#assign idBusLine = request.getParameter("idBusLine") />
11
12 <#list lineName.getSiblings() as cur_lineName>
13 <#if cur_lineName.getData() == idBusLine >
14 <a target="_blank" href="${cur_lineName.pdf.getData()}"
15 class="btn btn-outline-dark btn-download btn-lg">
16 Descargar PDF
17 </a>
18 </#if>
19 </#list>
20 </#if>
21
22 </div>
23 </div>
24 </div>
25 </div>
26</div>
27
28<script>
29
30Liferay.on('allPortletsReady', function (){
31 if( $(".col-mapa").length >0 ){
32 $("#mapButtonCopy").appendTo(".col-mapa");
33 }
34
35});
36
37
38</script>
stops
An error occurred while processing the template.
The following has evaluated to null or missing: ==> request.getParameter("idBusLine") [in template "44061202331357#6471594#5351416" at line 10, column 22] ---- Tip: If the failing expression is known to 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: #assign idBusLine = request.getParame... [in template "44061202331357#6471594#5351416" at line 10, column 1] ----
1<#--
2Web content templates are used to lay out the fields defined in a web
3content structure.
4
5Please use the left panel to quickly add commonly used variables.
6Autocomplete is también available and can be invoked by typing "${".
7-->
8
9<#assign request = renderRequest.getOriginalHttpServletRequest() />
10<#assign idBusLine = request.getParameter("idBusLine") />
11
12<#-- DEBUG temporal -->
13<p style="display:none;">Debug idBusLine: [${idBusLine}]</p>
14<div style="height:20px"> </div>
15<#if HTMLisfi.getSiblings()?has_content>
16 <#list HTMLisfi.getSiblings() as cur_HTMLisfi>
17 <#if cur_HTMLisfi.Linea.getData()?trim == idBusLine?trim>
18 <div id="anotaciones">
19 <div class="container">
20 <div class="row">
21 <div class="col-md-12">
22 <i class="fa fa-info-circle"></i>
23 <div class="cuerpoaviso">${cur_HTMLisfi.getData()}</div>
24 </div>
25 </div>
26 </div>
27 </div>
28 <#break> <#-- 👈 Esto evita que siga procesando más bloques -->
29 </#if>
30 </#list>
31</#if>
32<#--
33<#if HTMLisfi.getSiblings()?has_content>
34 <#list HTMLisfi.getSiblings() as cur_HTMLisfi>
35 <#assign dataLinea = cur_HTMLisfi.Linea.getData()?trim />
36 <p style="color:gray;">
37 Bloque con línea: [${dataLinea}]
38 <#if dataLinea == idBusLine?trim>
39 ✅ Coincide
40 <#else>
41 ❌ No coincide
42 </#if>
43 </p>
44 </#list>
45</#if>
46-->
47
48<script>
49Liferay.on('allPortletsReady', function () {
50 const anotaciones = document.querySelector('#anotaciones');
51
52 if (!anotaciones) return;
53
54 anotaciones.style.display = 'none'; // Ocultar inicialmente
55
56 const insertAnotaciones = () => {
57 const targetDiv = document.querySelector('.title-horarios.pb-2 > div');
58 if (targetDiv && !document.querySelector('.title-horarios.pb-2 > #anotaciones')) {
59 targetDiv.insertAdjacentElement('afterend', anotaciones);
60 anotaciones.style.display = 'block';
61 return true;
62 }
63 return false;
64 };
65
66 // Intentar insertar si ya está en el DOM
67 if (insertAnotaciones()) return;
68
69 // Observar por si aparece más tarde
70 const observer = new MutationObserver(() => {
71 if (insertAnotaciones()) {
72 observer.disconnect();
73 }
74 });
75
76 observer.observe(document.body, { childList: true, subtree: true });
77});
78</script>
79
80<style>
81#anotaciones {
82 display: none;
83}
84#anotaciones .col-md-12 {
85 display: flex;
86 align-items: center; /* Alineación vertical */
87 gap: 0.5em; /* Espacio entre el icono y el texto */
88 margin-top: 0.5em;
89 padding-left: 0;
90}
91
92#anotaciones i {
93 font-size: 1.2em;
94 color: #db291c;
95 margin: 0 0 .5rem 0;
96}
97
98#anotaciones .cuerpoaviso {
99 flex: 1; /* Ocupar el resto del espacio */
100}
101/*
102#anotaciones .container {
103 margin-top: 40px;
104 margin-bottom: 10px;
105 border: 1px solid #db291C;
106 border-bottom: 3px solid #db291c;
107 padding: 1em 1em 0 1em;
108 background-color: #fff8f8;
109}
110#anotaciones i {
111 color: #db291c;
112 font-size: 2em;
113 margin-right: 0.3em;
114 display: inline-block;
115 vertical-align: top;
116}
117#anotaciones .cuerpoaviso {
118 display: inline-block;
119}
120*/
121</style>