The following has evaluated to null or missing:
==> .vars['reserved-article-group-id'] [in template "161555#161602#ARTICLE-PAGE---HERO" at line 14, column 20]
----
Tip: It's the final [] step that caused this error, not those before it.
----
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 groupId = .vars["reserved-art... [in template "161555#161602#ARTICLE-PAGE---HERO" at line 14, column 1]
----
1<#assign namespace = randomNamespace />
2<#assign JSONFactoryUtil = staticUtil["com.liferay.portal.kernel.json.JSONFactoryUtil"] />
3<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
4<#assign containerId = randomNamespace />
5<#assign shareURL = themeDisplay.getPortalURL()+themeDisplay.getURLCurrent()/>
6
7<#-- Auto-assign ALL category to every article -->
8<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
9<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
10<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
11
12<#-- Get current JournalArticle -->
13<#assign articleId = .vars['reserved-article-id'].data />
14<#assign groupId = .vars['reserved-article-group-id'].data?number />
15<#assign journalArticle = journalArticleLocalService.getArticle(groupId, articleId) />
16
17<#-- Get AssetEntry for this article -->
18<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()) />
19
20<#-- Your ALL category ID -->
21<#assign allCategoryId = 4614994 />
22
23<#-- Assign ALL category if not already set -->
24<#if !assetEntry.getCategories()?seq_contains(assetCategoryLocalService.getCategory(allCategoryId))>
25 <#assign categoryIds = assetEntry.getCategoryIds() + [allCategoryId] />
26 ${assetEntryLocalService.updateEntry(
27 assetEntry.getUserId(),
28 assetEntry.getGroupId(),
29 assetEntry.getClassName(),
30 assetEntry.getClassPK(),
31 assetEntry.getUuid(),
32 assetEntry.getClassTypeId(),
33 categoryIds,
34 assetEntry.getTagNames()
35 )}
36</#if>
37
38<div class="hero jmarticle__hero-main-container">
39 <div class="container">
40 <div class="row">
41 <div class="article__cont">
42 <h1 class="article__heading">${Title.getData()}</h1>
43 <#if (SubTitle.getData())??>
44 <p class="article__para">
45 ${SubTitle.getData()}
46 </p>
47 </#if>
48
49 <#assign Date_Data=getterUtil.getString(Date.getData())>
50 <#if validator.isNotNull(Date_Data)>
51 <p class="article__date">
52 <#assign Date_DateObj=dateUtil.parseDate("yyyy-MM-dd", Date_Data, locale)>
53 ${dateUtil.getDate(Date_DateObj, "dd MMMM yyyy", locale)}
54 </p>
55 </#if>
56
57 <#if Link_Title?? && Link_Title.getData()?has_content>
58 <#list Link_Title.getSiblings() as cur_Link_Title>
59 <#if cur_Link_Title?? && cur_Link_Title.getData()?has_content>
60 <#assign linkHref="#" />
61 <#assign target="" />
62
63 <#assign rowId = containerId + cur_Link_Title?index />
64 <#if cur_Link_Title.Link_Internal?? && cur_Link_Title.Link_Internal.getFriendlyUrl()?has_content>
65 <#assign linkHref=cur_Link_Title.Link_Internal.getFriendlyUrl() />
66 <#elseif cur_Link_Title.Link_Media?? && cur_Link_Title.Link_Media.getData()?has_content>
67 <#assign linkHref=cur_Link_Title.Link_Media.getData() />
68 <#elseif cur_Link_Title.Link_Mailto?? && cur_Link_Title.Link_Mailto.getData()?has_content>
69 <#assign linkHref="mailto:" + cur_Link_Title.Link_Mailto.getData() />
70 <#elseif cur_Link_Title.Link_External?? && cur_Link_Title.Link_External.getData()?has_content>
71 <#assign linkHref=cur_Link_Title.Link_External.getData() />
72 </#if>
73 <#if (cur_Link_Title.Link_Target??) && (cur_Link_Title.Link_Target.getData())?has_content>
74 <#assign target=cur_Link_Title.Link_Target.getData() />
75 </#if>
76 <div id="blue_button_click_div" data-analytics-asset-type="custom">
77 <div class="jmarticle__hero-btn-list">
78 <a id="panel_blue_button_${rowId}" class="article__btn" href="${linkHref}" title="${cur_Link_Title.getData()}" target="${target}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)" >
79 <span class="btn__text">${cur_Link_Title.getData()}</span>
80 <span class="arrow__forward"></span>
81 </a>
82 </div>
83 </div>
84 </#if>
85 </#list>
86 </#if>
87 <div class="article-download-share">
88
89 <#if PDFTitle?? && PDFTitle.getData()?has_content>
90 <#assign title = PDFTitle.getData() />
91 <#assign pdf_link = "#" />
92 <#assign pdfrowId = containerId />
93 <#if PDFTitle.PDF?? && PDFTitle.PDF.getData()?has_content>
94 <#assign pdf_link = PDFTitle.PDF.getData() />
95 </#if>
96 <div class="article-download">
97 <div id="blue_button_click_div" data-analytics-asset-type="custom">
98 <div class="jmarticle__hero-btn-list">
99 <a id="panel_blue_button_${pdfrowId}" class="article__btn" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
100 <span class="btn__text">${title}</span>
101 <span class="arrow__forward"></span>
102 </a>
103 <a id="panel_blue_button_${pdfrowId}" class="article__btn-mobile" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
104 <img src="${themeDisplay.getPathThemeImages()}/new__jm__images/download-white-icon.svg" alt="twitter image"/>
105 </a>
106 </div>
107 </div>
108 </div>
109 </#if>
110
111 </div>
112
113 </div>
114 </div>
115 <#if (ImageLarge.getData())?? && ImageLarge.getData() != "">
116 <div class="row jmarticle__hero-banner" id="jmarticle__hero-${namespace}"
117 style="background-image: url(${ImageLarge.getData()})">
118 </#if>
119
120 </div>
121 </div>
122</div>
123
124<#if Author?? && Author.getData()?has_content>
125 <div class="jmarticle__author-info">
126 <div class="container">
127 <div class="hero__bar">
128 <#list Author.getSiblings() as cur_Author>
129 <#if cur_Author?? && cur_Author.getData()?has_content>
130 <#assign
131 webContentData = jsonFactoryUtil.createJSONObject(cur_Author.getData())
132 gId = groupId
133 journalArticle = journalArticleLocalService.getArticleByUrlTitle(gId, webContentData.title)
134 docXML = saxReaderUtil.read(journalArticle.getContent())
135
136 fName = docXML.valueOf("//dynamic-element[@name='FullName']/dynamic-content/text()")
137 jobTitle = docXML.valueOf("//dynamic-element[@name='JobTitle']/dynamic-content/text()")
138 role = docXML.valueOf("//dynamic-element[@name='ContactInfo']/dynamic-content/text()")
139 photoXML = docXML.valueOf("//dynamic-element[@name='Photo']/dynamic-content/text()")
140 photoSrc = JSONFactoryUtil.createJSONObject(photoXML).getString("uuid")
141 fullName = docXML.valueOf("//dynamic-element[@name='Title']/dynamic-content/text()")
142 authorImageXML = docXML.valueOf("//dynamic-element[@name='ImageLarge']/dynamic-content/text()")
143 authImageSrc = JSONFactoryUtil.createJSONObject(authorImageXML).getString("uuid")
144 summary = docXML.valueOf("//dynamic-element[@name='Summary']/dynamic-content/text()")
145 />
146
147 <div class="author">
148 <figure class="author__image">
149 <#if authImageSrc?? && authImageSrc?has_content>
150 <img src="/documents/${groupId}/${authImageSrc}" alt="${fullName}" class="author_img_class_new">
151 <#elseif photoSrc?? && photoSrc?has_content>
152 <img src="/documents/${groupId}/${photoSrc}" alt="${fName}" class="author_img_class_new">
153 </#if>
154 </figure>
155 <div class="author__details d-flex flex-column">
156 <h3 class="author__name">
157 <a rel="author">
158 <#if fullName?? && fullName?has_content>
159 ${fullName}
160 <#elseif fName?? && fName?has_content>
161 ${fName}
162 </#if>
163 </a>
164 </h3>
165 <p class="author__desc text-size-a author_job_title">
166 <#if jobTitle?? && jobTitle?has_content>
167 ${jobTitle}
168 </#if>
169 </p>
170 <span>
171 <p class="author__desc text-size-a">
172 <#if summary?? && summary?has_content>
173 ${summary}
174 </#if>
175 <#if role?? && role?has_content>
176 ${role}
177 </#if>
178 </p>
179 </span>
180 </div>
181 <div>
182 <div class="author__contact">
183 <ul class="author__contact-list">
184 </ul>
185 </div>
186 </div>
187 </div>
188 </#if>
189 </#list>
190 </div>
191 </div>
192 </div>
193</#if>
194
195
196
197<div class="container">
198 <div class="row">
199 <div class="article__intro">
200 <#if (Introduction.getData())??>
201 ${Introduction.getData()}
202 </#if>
203
204 <div class="article-download-share">
205
206 <#if PDFTitle?? && PDFTitle.getData()?has_content>
207 <#assign title = PDFTitle.getData() />
208 <#assign pdf_link = "#" />
209 <#assign pdfrowId = containerId />
210 <#if PDFTitle.PDF?? && PDFTitle.PDF.getData()?has_content>
211 <#assign pdf_link = PDFTitle.PDF.getData() />
212 </#if>
213 <div class="article-download">
214 <div id="blue_button_click_div" data-analytics-asset-type="custom">
215 <div class="jmarticle__hero-btn-list">
216 <a id="panel_blue_button_${pdfrowId}" class="article__btn" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
217 <span class="btn__text">${title}</span>
218 <span class="arrow__forward"></span>
219 </a>
220 <a id="panel_blue_button_${pdfrowId}" class="article__btn-mobile" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)">
221 <img src="${themeDisplay.getPathThemeImages()}/new__jm__images/download-white-icon.svg" alt="twitter image"/>
222 </a>
223 </div>
224 </div>
225 </div>
226 </#if>
227
228
229 <div class="article-share">
230 <a href="https://linkedin.com/shareArticle?url=${shareURL}&title=<#if (Title.getData())??>${Title.getData()}</#if>" target="_blank">
231 <img class="socialicons__img" src="${themeDisplay.getPathThemeImages()}/new__jm__images/social_icons-LinkedIN.png" alt="twitter image"/>
232 </a>
233 <a href="https://twitter.com/share?url=${shareURL}&text=<#if (Title.getData())??>${Title.getData()}</#if>" target="_blank">
234 <img class="socialicons__img" src="${themeDisplay.getPathThemeImages()}/new__jm__images/social_icons-Twitter.png" alt="twitter image"/>
235 </a>
236 </div>
237 </div>
238
239 </div>
240 </div>
241</div>
242
243<style>
244 img.author_img_class_new {
245 width: 100% !important;
246 height: 100% !important;
247 position: absolute;
248 margin: auto;
249 top: 0;
250 bottom: 0;
251 }
252
253 .article__btn:focus-visible {
254 outline: 2px solid blue !important;
255}
256
257@media (min-width: 320px) and (max-width: 650px) {
258 .article__intro li {
259 margin-left: -32px !important;
260 }
261 .journal-content-article .container .article__intro {
262 margin-top: 22px !important;
263}
264}
265@media (min-width: 540px) and (max-width: 834px) {
266 .article__intro li {
267 margin-left: -32px !important;
268 }
269 .article__intro {
270 margin: 60px 15px 0 5px !important;
271 }
272}
273
274@media (min-width: 320px) and (max-width: 539px){
275.jmarticle__author-info {
276 padding: 0px 0;
277}
278.jmarticle__author-info .author__image {
279 width: 39px;
280 height: 40px;
281}
282
283.jmarticle__author-info .author__name a {
284 line-height: 0px;
285 font-size: 18px !important;
286 margin-right: 10px;
287}
288
289.jmarticle__author-info .author__desc {
290
291 line-height: 14px;
292 font-size: 12px !important;
293 margin-bottom: 7px;
294}
295}
296
297</style>
Delivering on our strategy and confident in our outlook
Robert MacLeod, Chief Executive, commented:
“We had a good half, delivering double digit sales and operating profit growth. I am pleased with the progress we are making on implementing our strategy and delivering solutions for our customers through the application of our strong science and technology.
Clean Air continues to grow strongly driven by our diesel share gains in light duty Europe which are coming through as planned. Heavy duty is also performing well, supported by strength in the Class 8 truck market in the US. Efficient Natural Resources saw good sales growth and margin improvement, and Health traded in line with our first half expectations. We remain on track with our plans to commercialise eLNOTM, our next generation battery material. Customer feedback remains positive and, in July, the board approved the initial investment in our first commercial plant.
The interim dividend was increased by 7% in line with medium term guidance, reflecting our continued confidence in the group’s future prospects. We now expect full year operating performance towards the upper end of our guidance of mid to high single digit growth.”
| Reported results |
Half year ended |
% change |
||
| 2018 |
2017 |
|||
| Revenue |
£ million |
7,108 |
6,478 |
+10 |
| Operating profit |
£ million |
264 |
222 |
+19 |
| Profit before tax (PBT) |
£ million |
244 |
205 |
+19 |
| Earnings per share (EPS) |
pence |
106.1 |
87.9 |
+21 |
| Interim dividend per share |
pence |
23.25 |
21.75 |
+7 |
| Underlying1 performance |
Half year ended |
% change |
% change, constant rates2 |
||
| 2018 |
2017 |
||||
| Sales excluding precious metals (Sales) |
£ million |
2,009 |
1,853 |
+8 |
+10 |
| Operating profit |
£ million |
271 |
250 |
+8 |
+10 |
| Profit before tax |
£ million |
251 |
233 |
+7 |
+9 |
| Earnings per share |
pence |
109.0 |
99.8 |
+9 |
|
Underlying performance
- Sales grew 10% and underlying operating profit grew 10% at constant rates2 driven by continued strong growth in Clean Air
- Underlying EPS was up 9% and grew slightly ahead of operating profit benefiting from a lower underlying tax rate
- As indicated previously, free cash flow was lower due to platinum group metal (pgm) refinery downtime, driving higher precious metal working capital
- Average working capital days excluding precious metals improved by two days to 61 days
- Return on invested capital declined from 16.4% at 31st March 2018 to 16.0% at 30th September 2018 primarily due to an increase in the net pension fund asset
- Strong balance sheet maintained with net debt (including post tax pension deficits) to EBITDA of 1.5 times
By sector
- Continued strength in Clean Air with sales up 11%, well ahead of global vehicle production, driven by double digit growth in both light and heavy duty
- Sales growth of 3% in Efficient Natural Resources and strong operating profit growth reflecting improved efficiency and higher precious metal prices
- In Health, we have made good strategic progress and are trading in line with full year expectations. Sales remained stable but operating profit was lower, in line with our guidance, due to product mix and costs associated with manufacturing footprint optimisation
- We have made progress in commercialisation of our next generation battery material product, eLNO. In New Markets overall, we saw strong sales growth but lower operating profit
Reported results
- Reported revenue increased 10% slightly ahead of sales growth
- Reported operating profit was £264 million, up 19%, reflecting an £18 million major impairment and restructuring charge in the prior year
- Reported EPS was up 21%, reflecting higher operating profit and a lower tax rate following a change in US tax legislation
- Cash outflow from operating activities of £88 million due to an increase in precious metal working capital
- Interim dividend up 7% to 23.25 pence reflecting our confidence in the group’s future prospects
Outlook for the year ending 31st March 2019
- We now expect growth in operating performance at constant rates towards the upper end of our previous guidance of mid to high single digit growth
- At current foreign exchange rates (£:$ 1.307, £:€ 1.129, £:RMB 8.85), translational foreign exchange movements for the year ending 31st March 2019 are expected to benefit sales and underlying operating profit by £1 million and £2 million respectively
Enquiries
Investor relations
Martin Dunwoodie, Director of Investor Relations, 020 7269 8241
Louise Curran, Senior Investor Relations Manager, 020 7269 8235
Katharine Burrow, Investor Relations Manager, 020 7269 8444
Media
Sally Jones, Director of Corporate Relations, 020 7269 8407
David Allchurch, Tulchan Communications, 020 7353 4200
Notes:
1. Underlying is before amortisation of acquired intangibles, major impairment and restructuring charges, profit or loss on disposal of businesses, gain or loss on significant legal proceedings together with associated legal costs, significant tax rate changes and, where relevant, related tax effects. For reconciliation see note 5 on page 30
2. Unless otherwise stated, sales and operating profit commentary refers to performance at constant rates. Growth at constant rates excludes the translation impact of foreign exchange movements, with H1 2017/18 results converted at H1 2018/19 average exchange rates
For definitions and reconciliations of other non-GAAP measures see pages 39 and 40
eLNO is a trademark of the Johnson Matthey group of companies