Indoor extension of the public mobile network
Indoor Mobile Coverage
Extension of the public mobile network in your company premises for a homogeneous and quality coverage on all your surfaces.

Perfect for:

Not picking up the public mobile network in your building?
The Indoor Mobile Coverage solution can be adapted to the individual features of any type of building.
White areas
Stadiums
Basements
Offices
Hospitals
Shopping Centers
HQE buildings
Warehouses
Industrial sites
Car parks
Our offer
Indoor Mobile Coverage gives you optimal mobile coverage throughout your business premises.
2G/4G/5G compatibility
A compatible solution to guarantee the quality of your calls and internet access.
Wide coverage
Equipment installed to suit your layout and cover all your premises.
Single or multi-operator
All your employees and customers can benefit from optimised mobile network coverage regardless of their chosen operator.
Support
From the development of your project to solution implementation and support.
How does it work?
The Indoor Mobile Coverage solution can be adapted to the individual features of any type of building.

Java method "com.sun.proxy.$Proxy113.getFriendlyURLLayout(long, boolean, String)" threw an exception when invoked on com.sun.proxy.$Proxy113 object "com.liferay.portal.service.impl.LayoutLocalServiceImpl@46cb439f"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: authorPage = layoutLocalService.getFr... [in template "20102#20129#1341914" at line 32, column 45] ----
1<#assign local = themeDisplay.getLocale()
2 layouts = themeDisplay.getLayouts()
3 extendedSeq = []
4 finalSeq = []
5 assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")
6 layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
7<!-- Get the tags from the webcontent and create a new sequence with the string -->
8<#assign
9 inputTags = .vars['reserved-article-asset-tag-names'].data
10 inputTagsSeq = inputTags?split(",")>
11<#setting locale= local>
12
13
14<#list layouts as mainpage>
15 <#if mainpage.getFriendlyURL(local) == '/business'>
16 <#list mainpage.getChildren() as homeSubPages>
17 <#if homeSubPages.getFriendlyURL(local) == '/business/blog'>
18 <#list homeSubPages.getChildren() as articlesHomepage>
19 <#if articlesHomepage.getFriendlyURL(local) == '/business/blog/articles'>
20 <#list articlesHomepage.getChildren() as categoryPages>
21 <#list categoryPages.getChildren() as subCategoryPages>
22 <#list subCategoryPages.getChildren() as articleElement>
23 <!-- Get the tag for the target article Page -->
24 <#assign plId = articleElement.getPlid()
25 layoutEntry = assetEntryLocalService.fetchEntry("com.liferay.portal.kernel.model.Layout", plId)
26 assetTags = layoutEntry.getTags()>
27 <#assign
28 tagList = []
29 dateArticle = articleElement.getExpandoBridge().getAttribute('Blog display date from')
30 authorPageUrl = articleElement.getExpandoBridge().getAttribute('Blog author page url')
31 authorTruncatedUrl = "/business" + authorPageUrl?keep_after("/business")
32 authorPage = layoutLocalService.getFriendlyURLLayout(groupId, false, authorTruncatedUrl)
33 authorImage = authorPage.getExpandoBridge().getAttribute('Blog image url')
34 articleImage = articleElement.getExpandoBridge().getAttribute('Blog image url')>
35 <#list assetTags as tag>
36 <#assign tagList += [tag.name]>
37 </#list>
38 <!-- Insert element in the extendedSeq -->
39 <#assign layoutHash = {"tags": tagList,
40 "friendlyUrl": articleElement.friendlyURL, "articleTitle": articleElement.getHTMLTitle(local),
41 "articleDescription": articleElement.getDescription(local),
42 "date": dateArticle?datetime, "authorFriendlyUrl": authorPage.getRegularURL(request),
43 "authorName": authorPage.getHTMLTitle(local),
44 "authorImage": authorImage, "articleImage": articleImage,
45 "categoryName": categoryPages.getHTMLTitle(local),
46 "categoryUrl": categoryPages.getRegularURL(request),
47 "subCategoryName": subCategoryPages.getHTMLTitle(local),
48 "subCategoryUrl": subCategoryPages.getRegularURL(request)}
49 extendedSeq += [layoutHash] />
50 </#list>
51 </#list>
52 </#list>
53 </#if>
54 </#list>
55 </#if>
56 </#list>
57 </#if>
58</#list>
59
60<#list extendedSeq?sort_by("date")?reverse as reversedSeq>
61 <#if finalSeq?size lt 3>
62 <!-- Boolean to get out of the loop and only add once the element to the final sequence-->
63 <#assign tagsFound = false>
64 <#list reversedSeq.tags as tag>
65 <#if tagsFound != true>
66 <#list inputTagsSeq as inputTag>
67 <#if inputTag == tag>
68 <#assign finalSeq += [reversedSeq]
69 tagsFound = true>
70 <#break>
71 </#if>
72 </#list>
73 <#else>
74 <#break>
75 </#if>
76 </#list>
77 <#else>
78 <#break>
79 </#if>
80</#list>
81
82<section class="module module-cards-article" >
83 <div class="container">
84 <div class="row justify-content-center">
85 <div class="col-lg-12">
86 <div class="title-wrapper">
87 <h3 class="bottom-cut">${Title.getData()}</h3>
88 </div>
89
90 <div class="content-list">
91 <div class="row">
92 <#list finalSeq as articles>
93 <div class="col-lg-4">
94 <div class="card card-article card-article-small">
95 <div class="card-wrapper">
96 <div>
97 <div class="card-img-wrapper">
98 <a data-senna-off="true" href="${articles.friendlyUrl}">
99 <img src="${articles.articleImage}" class="img-fluid object-fit" alt="">
100 </a>
101 </div>
102
103 <div class="card-text-wrapper">
104 <div class="badge-wrapper">
105 <a data-senna-off="true" href="${articles.categoryUrl}" class="badge badge-small badge-blue-business ">${articles.categoryName}</a>
106 <a data-senna-off="true" href="${articles.subCategoryUrl}" class="badge badge-small badge-blue-business ">${articles.subCategoryName}</a>
107 </div>
108
109 <h3><a data-senna-off="true" href="${articles.friendlyUrl}">${articles.articleTitle}</a></h3>
110 <p>${articles.articleDescription}</p>
111 </div>
112 </div>
113 <div>
114 <a data-senna-off="true" href="${articles.friendlyUrl}" class="btn btn-link"
115 <#if LinkLabel.LinkAriaLabel?? &&
116 LinkLabel.LinkAriaLabel?has_content &&
117 LinkLabel.LinkAriaLabel.getData()?has_content>
118 aria-label="${LinkLabel.LinkAriaLabel.getData()}"</#if>>
119 ${LinkLabel.getData()} <i class="icon-chevron-right"></i>
120 </a>
121
122 <#if articles.authorImage?? && articles.authorImage?has_content
123 && articles.authorName?? && articles.authorName?has_content
124 && articles.date?? && articles.date?has_content
125 && articles.articleImage?? && articles.articleImage?has_content>
126 <div class="card-details-wrapper">
127 <div class="author">
128 <div class="author-img-wrapper">
129 <img src="${articles.authorImage}" class="img-fluid object-fit" alt="">
130 </div>
131 <div>
132 <p class="title">${AuthorLabel.getData()}</p>
133 <a data-senna-off="true" href="${articles.authorFriendlyUrl}"
134 class="value stretched-link"
135 <#if AuthorLabel.AuthorAriaLabel?? &&
136 AuthorLabel.AuthorAriaLabel?has_content &&
137 AuthorLabel.AuthorAriaLabel.getData()?has_content>
138 aria-label="${AuthorLabel.AuthorAriaLabel.getData()} ${articles.authorName}"</#if>>
139 ${articles.authorName}
140 </a>
141 </div>
142 </div>
143 <div class="date">
144 <p class="title">${PublicationLabel.getData()}</p>
145 <p class="value">${articles.date?string["dd MMMM yyyy"]}</p>
146 </div>
147 </div>
148 </#if>
149 </div>
150 </div>
151 </div>
152 </div>
153 </#list>
154 </div>
155 </div>
156 </div>
157 </div>
158 </div>
159</section>








Our experts answer your questions
Do you have any questions about an article? Do you need help solving your IT issues?