Publicador de Conteúdos e Mídias

São Bernardo do Campo
Centro, São Bernardo do Campo - SP, 09750-000 Possui estacionamento? Não
Atendimento:
De segunda a sexta-feira, das 8 às 21 horas, e aos sábados, das 8 às 12 horas. Se tiver dúvidas, acesse o Fale com a gente ou envie um e-mail para sbcampo@sp.senac.br.
Conheça nossos cursos
Publicador de Conteúdos e Mídias
Cursos em destaque
Publicador de Conteúdos e Mídias
Java method "com.liferay.journal.model.impl.JournalArticleImpl.getContent()" threw an exception when invoked on com.liferay.journal.model.impl.JournalArticleImpl object "{\"mvccVersion\": 2, \"ctCollectionId\": 0, \"uuid\": \"3765fd01-24e9-ab04-6fb0-fd757f1b1196\", \"id\": 105942411, \"resourcePrimKey\": 42164213, \"groupId\": 20125, \"companyId\": 20102, \"userId\": 44841, \"userName\": \"API Integração\", \"createDate\": \"Tue Jan 25 18:59:57 GMT 2022\", \"modifiedDate\": \"Mon Jul 07 21:02:53 GMT 2025\", \"externalReferenceCode\": \"42164211\", \"folderId\": 42112, \"classNameId\": 0, \"classPK\": 0, \"treePath\": \"/42112/\", \"articleId\": \"42164211\", \"version\": 5.8, \"urlTitle\": \"curso-tecnico-em-estilismo-e-coordenacao-de-moda\", \"DDMStructureKey\": \"41004\", \"DDMTemplateKey\": \"2186668\", \"defaultLanguageId\": \"pt_BR\", \"layoutUuid\": \"\", \"displayDate\": null, \"expirationDate\": null, \"reviewDate\": null, \"indexable\": true, \"smallImage\": false, \"smallImageId\": 0, \"smallImageURL\": \"\", \"lastPublishDate\": null, \"status\": 0, \"statusByUserId\": 44841, \"statusByUserName\": \"API Integração\", \"statusDate\": \"Mon Jul 07 21:02:53 GMT 2025\"}"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign document = saxReaderUtil.read... [in template "20102#20129#40280" at line 15, column 5] ----
1<#--
2 Name: Cursos Sugeridos
3 Type: Asset Publisher Widget Template
4 Path: ROOT/assets/home-cursos-sugeridos/widget-templates/home-cursos-sugeridos.ftl
5-->
6
7<#assign prefix = "ssp" />
8<#assign defaultImage = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuyJZ_Ky8o9kn0wiBy4mp5-3sb7xei_WudTL_3Jo6yvWmzQHuK&s" />
9
10<#-- Detect the one valid dataEfetiva -->
11<#assign today_dateInt = dateUtil.getCurrentDate("yyyyMMdd", locale)?number />
12<#list entries![] as entry>
13
14 <#assign renderer = entry.getAssetRenderer() />
15 <#assign document = saxReaderUtil.read(renderer.getArticle().getContent()) />
16 <#assign dataEfetivaRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='dataEfetiva']") />
17
18 <#assign greatestDataEfetiva_dateInt = 0 />
19 <#assign greatestDataEfetiva_dateInt_i = -1 />
20 <#assign i = -1 />
21 <#list dataEfetivaRepeatableNode as item>
22 <#assign i++ />
23 <#assign currentDataEfetiva_DateObj = dateUtil.parseDate("yyyy-MM-dd", item.elementText("dynamic-content")?string, locale) /> <#-- make date obj from raw structure data -->
24 <#assign currentDataEfetiva_dateInt = dateUtil.getDate(currentDataEfetiva_DateObj, "yyyyMMdd", locale)?number />
25 <#if currentDataEfetiva_dateInt lte today_dateInt && currentDataEfetiva_dateInt gt greatestDataEfetiva_dateInt>
26 <#assign greatestDataEfetiva_dateInt = currentDataEfetiva_dateInt />
27 <#assign greatestDataEfetiva_dateInt_i = i />
28 </#if>
29 </#list>
30</#list>
31
32
33<#-- Iterate the list with -->
34<#assign vocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
35<#assign normalizer = serviceLocator.findService("com.liferay.portal.kernel.util.FriendlyURLNormalizer") />
36
37
38
39<div class="slick-area-estatico slick-area-estatico--md-bleed slider-container">
40
41 <#list entries?reverse as entry>
42
43 <#if greatestDataEfetiva_dateInt_i??>
44
45 <div class="slick-area__item">
46
47 <#assign renderer = entry.getAssetRenderer() />
48 <#assign document = saxReaderUtil.read(renderer.getArticle().getContent()) />
49 <#assign dataEfetivaRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='dataEfetivaFT']") />
50 <#assign journalArticle = renderer.getArticle() />
51 <#assign articleIdCurso = journalArticle.getArticleId() />
52
53 <#assign codigoFT = document.getRootElement().selectSingleNode("//dynamic-element[@field-reference='codigoFT']").getStringValue()?trim >
54
55 <#if dataEfetivaRepeatableNode?size gt 1>
56 <#assign item = dataEfetivaRepeatableNode[greatestDataEfetiva_dateInt_i] /> <#-- Choose only one of the repeatables if theres multiple -->
57 <#else>
58 <#assign item = dataEfetivaRepeatableNode />
59 </#if>
60
61 <#if item??>
62
63 <#-- Get fields -->
64
65
66
67
68 <#assign xPathSelector = saxReaderUtil.createXPath("//dynamic-element[@field-reference='imagemComercial']")>
69
70 <#-- get imagem -->
71 <#if xPathSelector.selectSingleNode(item)?? >
72
73 <#attempt>
74
75 <#assign
76 imagemStr = xPathSelector.selectSingleNode(item).getStringValue()
77 imagemJson = jsonFactoryUtil.createJSONObject(imagemStr)
78 imagemId = getterUtil.getInteger(imagemJson.get('fileEntryId'))
79 dl = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")
80 dlURLHelper = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper")
81 fileEntry = dl.getFileEntry(imagemId)
82 >
83
84 <#recover>
85
86 </#attempt>
87
88 <#if fileEntry?? >
89 <#assign imagemUrl = dlURLHelper.getDownloadURL(fileEntry, fileEntry.getFileVersion(), themeDisplay,null)>
90 </#if>
91
92 <#else>
93 <#assign imagemUrl = "">
94 </#if>
95
96 <#-- fnish get imagem -->
97
98
99 <#-- Paint! -->
100 <div class="${prefix}-card-curso" style="height: 288px;">
101 <#-- <div class="${prefix}-card-curso my-2 mx-3" id="" style="width: 237px; height: 288px;"> -->
102
103 <a class="${prefix}-absolute-link ck-curso" id="link_curso_${codigoFT}" data-ck="${codigoFT}" href="#"></a>
104
105 <div class="${prefix}-card-curso__image">
106
107 <#if imagemUrl??>
108
109 <div class="${prefix}-image-container" style="background-image: url(${imagemUrl}) ">
110 <img src="${imagemUrl}" />
111 </div>
112
113 <#else>
114
115 <div class="${prefix}-image-container" style="background-image: url() ">
116 <img src="" />
117 </div>
118
119 </#if>
120
121 </div>
122
123 <div class="${prefix}-card-curso__body">
124
125 <#list entry.getCategories()![] as category>
126 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
127
128 <#if normalizer.normalize(vocabularyName) == "tipo-de-curso">
129
130 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
131 <#assign categoryTipoCurso = category.getName() />
132
133 <div class="ssp-card-curso__color-tag-modalidade bg-nivel-${normalizedCategoryName}"></div>
134
135 </#if>
136
137 <#if normalizer.normalize(vocabularyName) == "modalidade">
138 <#assign normalizedCategoryName = normalizer.normalize(category.getName()) />
139 <#assign categoryModalidade = category.getName() />
140 </#if>
141
142 </#list>
143
144 <div class="${prefix}-card-curso__tags" style="margin-bottom:5px;">
145
146 <#list entry.getCategories()![] as category>
147 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
148
149 <!-- Verificar o Tipo de curso -->
150 <#if normalizer.normalize(vocabularyName) == "formato">
151 <#assign normalizedCategoryNameModalidade = normalizer.normalize(category.getName()) />
152
153 <!-- Caso a modalidade de ensino seja EAD, insere a Tag do Senac ao vivo -->
154 <#if normalizedCategoryNameModalidade?contains("senac-online-ao-vivo") >
155
156 <span class="tag-modalidade-title__senac-online">Senac Online - ao vivo</span>
157
158 <#else>
159 <#assign textoCardCursoFinal = "" />
160
161 <#if normalizer.normalize(categoryTipoCurso) == "livre" >
162 <!-- <#assign textoCardCursoFinal = "Curso Livre" + " ¿ " + category.getName() /> -->
163 <#assign textoCardCursoFinal = "Livre" />
164
165 <#elseif normalizer.normalize(categoryTipoCurso) == "tecnico">
166 <!-- <#assign textoCardCursoFinal = "Técnico" + " ¿ " + category.getName() /> -->
167 <#assign textoCardCursoFinal = "Técnico" />
168
169 </#if>
170
171 <#if normalizedCategoryName == "graduacao">
172 <div style="font-size: 12px; line-height: 16px;">
173 <div class="ssp-card-curso__tag-modalidade-title">Graduação</div>
174
175 <#assign pos = categoryModalidade?index_of(" - ") + 3 />
176 <#assign xPathSelectorDuracaoCursoFT = saxReaderUtil.createXPath("//dynamic-element[@field-reference='duracaoCursoFT']")>
177 <#assign duracaoCursoFT = xPathSelectorDuracaoCursoFT.selectSingleNode(item).getStringValue()>
178 <div class="ssp-card-curso__tag-formato-title">${categoryModalidade[pos..]} - ${duracaoCursoFT}</div>
179 </div>
180 </#if>
181 </#if>
182 </#if>
183
184 </#list>
185
186 </div>
187
188 <#assign
189 webContentServiceUtil = serviceLocator.findService("br.senac.services.service.WebContentServiceUtil")
190 curso = webContentServiceUtil.cursoInfoByJournalArticle(themeDisplay.getSiteGroupId(), journalArticle, false, true, true, false, false)
191 />
192
193 <span class="${prefix}-card-curso__tag-formato-title">${curso.toDisplay.tipoFormato}</span>
194
195 <h6 class="${prefix}-card-curso__title pt-md-3">
196 ${entry.getTitle(locale)}
197 </h6>
198
199 <div class="${prefix}-card-curso__info d-none">
200
201 <span class="ssp-tag bg-white border-nivel-extensao text-nivel-extensao mr-1" id="botao_inscAberta_${articleIdCurso}">Inscriçôes abertas</span>
202 <span class="ssp-tag bg-white border-primary text-primary" id="botao_bolsa_${articleIdCurso}">Bolsas</span>
203
204 <#-- <#list entry.getCategories()![] as category>
205
206 <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim />
207
208 <#if normalizer.normalize(vocabularyName) == "unidades"> <#-- Break after finding the first one while there's no further logic implemented -->
209 <#-- <small><i class="icon-map-marker mr-1"></i> ${category.getName()}</small>
210 <#break>
211 </#if>
212
213 </#list> -->
214
215 </div>
216
217 </div>
218
219 </div>
220
221 </#if>
222
223 <#-- Busca o link do curso -->
224
225 <script>
226
227 var isEmed = false;
228 var urlPage = window.location.href;
229 var groupId = 20125;
230 //var groupId = 20124;
231
232 var idCategoryByCodeUnit;
233
234 $(document).ready(function(){
235 // rotina para mostrar a tag do senac ao vivo
236
237 if(urlPage.indexOf('staging')> 1){
238 groupId = 86888;
239 //groupId = 419034;
240 }
241
242 if(urlPage.indexOf('ensino-medio-tecnico')> 1){
243 isEmed = true;
244 }
245
246 if(isEmed)
247 buscaUrlCurso(0);
248 else
249 buscaUnidadeCategoryEUrlCurso();
250
251
252
253 function buscaUnidadeCategoryEUrlCurso(){
254
255 let map = new Map();
256
257 if(idCategoryByCodeUnit != undefined)
258 map = new Map(JSON.parse(idCategoryByCodeUnit));
259
260 var urlSearchCategories = '/o/senac-content-services/categoriaPorCodUnidade/{groupId}/{codUnidade}';
261 var urlSearch = urlSearchCategories.replace('\{groupId\}', groupId)
262 .replace('\{codUnidade\}', $('#codUnidadeReferencia').text());
263
264 $.ajax({
265 url : urlSearch,
266 async: false,
267 method : 'get',
268 beforeSend : function(xhr){
269 if(idCategoryByCodeUnit != undefined && new Map(JSON.parse(idCategoryByCodeUnit)).get(urlSearch) != undefined){
270 xhr.abort();
271 };
272 }
273 }).done(
274 function(data) {
275
276 if (data.toString().length > 0) {
277
278 map.set(urlSearch, data);
279 idCategoryByCodeUnit = JSON.stringify([...map]);
280
281 }
282
283 });
284
285 buscaUrlCurso(new Map(JSON.parse(idCategoryByCodeUnit)).get(urlSearch));
286
287 };
288
289
290 function buscaUrlCurso(unidadeCategory){
291 var urlSearchCursoUrl = '/o/senac-webcontent/webcontent/curso-url/{groupId}/{articleId}/{unidadeCategoryId}';
292
293 const url = urlSearchCursoUrl
294 .replace('\{groupId\}', groupId)
295 .replace('\{articleId\}', ${journalArticle.getArticleId()})
296 .replace('\{unidadeCategoryId\}',unidadeCategory);
297
298 $.ajax({
299 url : url,
300 type : 'get'
301 })
302 .done(function(res){
303
304 if(res.length > 0){
305
306 res = JSON.parse(res);
307
308 $('#link_curso_${codigoFT}').attr('href', res.url);
309 }
310
311 });
312 };
313
314
315 });
316
317 </script>
318
319 </div>
320
321 </#if>
322
323
324
325
326 </#list>
327
328</div>
Nossa infraestrutura
Publicador de Conteúdos e Mídias
Fachada do Senac São Bernardo do Campo
Com quase 9 mil metros quadrados de área construída, totalmente acessível as pessoas com deficiência e privilegiando conceitos de sustentabilidade, foi inaugurada em 20 de agosto de 2015. A unidade possui capacidade para atender cerca de 1.600 alunos por período, com a oferta distribuída pela manhã, tarde, noite e aos sábados. A unidade conta com 31 salas de aula e 14 ambientes especializados, uma cozinha pedagógica e outra experimental; laboratórios de rádio e vídeo, de farmácia, de meio ambiente, de enfermagem, de informática, hardware e de interiores; salas multifuncionais para moda e turismo e para visagismo e beleza, além de uma biblioteca, um auditório/teatro com capacidade para 150 pessoas e área de convivência.
Vista Aérea
Vista aérea de nossa escola.
Laboratório de Hardware
O espaço possui 3 bancadas de trabalho pronto para atender aos cursos da área de redes e infraestrutura. Dispõe de máquinas e periféricos necessários para a montagem e desmontagem de um equipamento completo, possibilitando a prática do conhecimento adquirido em sala de aula. A sala dispões também de computadores para utilização e lousa eletrônica.
Laboratório de Design
Sala de aula para as práticas dos cursos das área de design e desenho, com bancadas, pranchetas e luminárias individuais.
LabSenac
Espaço colaborativo e de incentivo aos projetos desenvolvidos pelos nossos alunos. Trocas, construção e aprendizado em um ambiente exclusivo.
Laboratório de Beleza e Visagismo
O espaço é utilizado para todos os cursos práticos da área de beleza, com cadeiras hidráulicas, lavatórios, bancadas, espelhos e iluminação individual, pias e armários.
Laboratório de Moda
Espaço utilizado para as aulas de moda, modelagem, costura e desenho de moda. O espaço conta com manequins, provador, 3 máquinas industriais e bancada com 30 máquinas de costura para atividades dos alunos.
Laboratório de Enfermagem
Espaço utilizado para o curso Técnico em Enfermagem e demais títulos da área de saúde. Com equipamentos de última geração, o amplo laboratório conta com modelos anatômicos para ensino e pesquisa da anatomia humana, simulação de uma UTI e todos os equipamentos necessários para preparar o aluno para o mercado de trabalho.
Laboratório de Farmácia
Laboratório de Manicure e Pedicure
Sala de aula para as práticas do curso Manicure e Pedicure, com cadeiras de braço, cadeiras de manicure e todos os acessórios necessários para as atividades práticas.
Estúdio Fotográfico
Espaço utilizado para aulas práticas de fotografia, possui fundo infinito, mesa de still, equipamentos de iluminação e flash para o desenvolvimento de atividades práticas como foto publicitária e produção de moda.
Estúdio de Vídeo
Espaço utilizado para aulas práticas de vídeo, com equipamentos de luz, câmeras profissionais, microfones e demais equipamentos necessários para a atividade.
Estúdio de Rádio
Estúdio de Rádio
Laboratório de Informática
Espaço utilizado para aulas práticas, equipamentos com os mais modernos programas, o Senac oferece aula ministradas por profissionais cerificados e com experiência de mercado.
Cozinha Pedagógica
Sala Bar
Conheça a Unidade através do nosso Tour 360º
Tour 360º