Índice
Sobre Layouts Índice |
---|
maxLevel | 4 |
---|
outline | true |
---|
exclude | .*ndice |
---|
style | none |
---|
|
SlotEstrutura de ArquivosVariáveis Disponíveis no FTLFluxograma de RenderizaçãoCriando um LayoutSobre Layouts
O layout define a composição de uma página e é composto por múltiplos slots. A quantidade, posição e dimensão desses slots é o que define o corpo de um layout. Dessa forma, o layout é a estrutura de uma página, definindo a distribuição dos
Widgets widgets que a compõe por meio dos slots.
Image RemovedImage Added
Slot
Slots são contêineres definidos que são aptos a comportarem
Widgetswidgets. A quantidade, posição e dimensão desses slots é o que define o corpo de um
templatelayout. Sendo assim, o
template layout é o esqueleto de uma página (sua estrutura), definindo a distribuição
das Widgets dos widgets que a compõem através
do dos slots.
Image AddedEstrutura de Arquivos
Layouts possuem a estrutura de arquivos semelhante à de um widget comum, e também são empacotados em formato “war”. A estrutura de pastas-fonte de um layout é a que segue:
pom.xml (packaging: war)src+-- main +-- java (não utilizado, padrão |
---|
dasWidgetswidgets) +-- resources +-- application.info +-- layout.ftl +-- <codigo-do-layout>.properties +-- <codigo-do-layout>_en_US.properties +-- <codigo-do-layout>_es.properties +-- <codigo-do-layout>_pt_BR.properties +-- webapp +-- META-INF +-- resources +-- images +-- icon.png +-- css +-- js +-- WEB-INF +-- web.xml +-- jboss-web.xml +-- test +-- java |
---|
Onde:
Arquivo / Pasta | Descrição |
---|
<código-do-layout> |
: nome | Nome/Identificador do layout |
; src/main/resources/application.info |
: arquivo | Arquivo de configuração do layout |
, onde é persistida, entre outras informações, o código do layout, título e desenvolvedor. Este arquivo será mais detalhado nas próximas páginas deste |
; src/main/resources/layout.ftl |
: arquivo freemarker Freemarker que será interpretado |
durante a renderização do layout |
, contém . Contém a configuração dos |
Slots; src/main/resources/<código-do-layout>.properties |
: arquivo traduzíveis utilizadas pelo layout. Deve possuir derivações de acordo com o |
idioma suportado pelo layout |
; src/main/webapp/WEB-INF/web.xml |
: | Descritor padrão de uma aplicação |
; src/main/webapp/WEB-INF/jboss-web.xml |
: | Descritor específico para o |
JBossservidor de aplicação. Deve conter pelo menos a propriedade “context-root”. O context-root |
representa o contexto Web do layout e é recomendado que seja o próprio |
; WEB-INF/glassfish-web.xml: Descritor específico para oGlassfish. Deve conter pelo menos a propriedade “context-root”. O context-root representa o contexto Web do layout e é recomendado que seja o própriocódigo do layout;resources/css | Folhas de estilo do layout (caso seja necessário). |
src/main/webapp/resources/ |
css: folhas de estilo do layout (caso sejanecessário); src/main/webapp/resources/js: arquivos js | Arquivos Javascript do layout (caso seja |
; src/main/webapp/resources/images/icon.png |
: ícone layout, é exibido, por exemplo, durante a criação de páginas para que o |
usuário possa pré-visualizar a distribuição de slots do layout. |
; pom.xml: descritor Maven do layout. Este arquivo será mais detalhado naspróximas páginas deste documento;
Para o sistema, o que diferencia um layout de um widget
Para o sistema, o que diferencia um layout de uma Widget comum é a definição da
propriedade da propriedade “application.type = layout” no arquivo descritor “application.info”. Este
arquivo Este arquivo é um descritor detalhado das Widgets dos widgets e também dos layouts, é através deste
que . É através deste que a aplicação tem conhecimento das propriedades do layout, identificação do
desenvolvedordo desenvolvedor, arquivos necessários para sua renderização, arquivos de linguagem e
outras propriedades. e outras propriedades.
Arquivo application.info
Abaixo o detalhamento de todas as propriedades do arquivo application.info:
Arquivo application.info Propriedade | Descrição |
---|
application.type = |
<layout> : o <layout> | O valor layout define que o componente é do |
tipo layout, existem outras opções como |
Widget e Theme, que não serãodetalhadas neste documento; widget e theme. |
application.code = <código-do-layout> |
: identificador ; application.title = <título-do-layout> |
: título ; application.description = <descrição-do layout> |
: descrição ; application.category = <SYSTEM> |
: categoria | Categoria do layout. Propriedade |
utilizada para filtro em determinados funções do sistema, esta propriedade é para uso futuro, atualmente não é utilizada |
; , : indica | Indica o tipo de renderizador exigido |
freemarker ; application.icon = <icon.png> |
: ícone | Ícone para representação visual do layout |
,caso . Caso não informado o sistema assumirá um ícone padrão para sua representação visual |
; developer.code = <developer- |
code> : código code> | Código do desenvolvedor do layout |
(uso futuro); name : nome (uso futuro); > : (uso futuro); layout.file=layout.ftl = <layout.ftl> |
: nome renderização. Se não informado, será assumido “layout.ftl” |
; name: nome | Nome base do arquivo de tradução |
, Locale locale (ex.: prefixo_PT_BR e prefixo_EN_US). Se não informado, será usado o código do layout |
; application.resource.css.1 = </resources/css/<codigo-do-layout>.css> |
:opcionalOpcional. Nome do arquivo CSS a ser carregado durante a renderização. |
Podem ser informado vários arquivos, o número no final do |
dome propriedade indica a ordem de carga |
;. |
application.resource.js.2 = </resources/js/<código-do-javascript>.js> |
:opcionalOpcional. Nome do arquivo JS a ser carregado durante a renderização. |
Podem ser informado vários arquivos, o número no final do nome da |
propriedade indica a ordem de carga |
;Arquivo pom.xmlO pom é um arquivo fundamental do Maven, deve ficar na raiz da estrutura dearquivos do layout. Consiste em um XML com informações do projeto e detalhes dasconfigurações utilizadas pelo Maven para construir o projeto. É neste descritor quesão inseridas informações como a dependência de outros projetos, plugins, profiles eversão, entre outras.A estrutura mínima do pom de um layout é a que segue:slot.SlotMenu = <menu> | Opcional. Entretanto, quando o arquivo .ftl possuir slot de Menu (SlotMenu), é necessário informar qual widget de menu deve ser utilizada. "menu" deve ser informado nesse caso. Entenda melhor aqui. |
slot.SlotLogin = <sociallogin> | Opcional. Entretanto, quando o arquivo .ftl possuir slot de Login (SlotLogin), é necessário informar qual widget de login deve ser usada. Apesar de haver mais de um opção para menu, recomendamos a utilização do valor "sociallogin" nesse caso. Entenda melhor aqui. |
application.resource.css.1=/portal/resources/css/wcm_responsive_layout.css | Arquivo CSS com configurações globais para a padronização de escrita dos layouts. Sempre necessário incluir. Informações |
---|
A propriedade estará disponível a partir da release 1.8.1 do TOTVS Fluig Plataforma. |
|
application.resource.css.2=/resources/css/responsive_layout.css | Arquivo CSS padrão para o desenvolvimento da responsividade do layout. Informações |
---|
A propriedade estará disponível a partir da release 1.8.1 do TOTVS Fluig Plataforma. |
|
application.responsiveLayout=true | Caso o valor seja true, ilustrará que o layout é responsivo no momento do cadastro de páginas. Informações |
---|
A propriedade estará disponível a partir da release 1.8.1 do TOTVS Fluig Plataforma. |
|
application.newBuilder=true | Se true significa que a página será carregada no novo construtor. Se false significa que a página será carregada no antigo construtor. Entenda melhor aqui. Informações |
---|
A propriedade estará disponível a partir da release 1.8.1 do TOTVS Fluig Plataforma. |
|
Variáveis Disponíveis no FTL
Os principal arquivo de um projeto de layout é o “layout.ftl”. É neste arquivo que será definido
Variáveis Disponíveis no FTL
Os principal arquivo de um projeto de layout é o “layout.ftl”. É neste arquivo que será
definido, via marcação HTML e Freemarker, a quantidade e disposição dos Slotsslots.
Para facilitar o desenvolvimento, alguns métodos da camada de negócio são
ofertados são ofertados pela infra-estrutura do WCM e podem ser acessados via freemarkerFreemarker.
As As variáveis disponibilizadas são acessadas através da sintaxe ${nome-da-variável}
em qualquer local do FTL, a seguir uma lista das variáveis disponíveis:
: | URL do servidor (sem nenhum contexto) |
; : objeto | Objeto com as strings internacionalizadas |
; : contexto | Contexto do tema (por exemplo: /themedefault) |
; : | URL completa do tema (serverBaseURL + themeURI) |
; : ; : ; : contexto | Contexto do layout (por exemplo: /layoutdefault) |
; : | URL completa do layout (serverBaseURL + layoutURI) |
; : contexto ; : objeto Locale | Objeto com a localização selecionada para o usuário |
; : login | Login do usuário (ou vazio se não está logado) |
; : | ID do Tenant do usuário logado (-1 se não está logado) |
; : código | Código do Tenant do usuário logado (ou vazio se não está |
; : | URI da página (formado pelo contexto + código da |
empresa + código da página) |
; : variável | Variável de acesso aos enum’s da aplicação. |
Será detalhadoabaixo; wcm: objeto wcm | Objeto com os serviços disponibilizados pelo SDK do WCM. |
Serádetalhado abaixo; pageRender: objeto pageRender | Objeto que também disponibiliza serviços do SDK. |
Serádetalhado abaixo; |
fluigVersion | Versão do TOTVS Fluig Plataforma. |
O objeto “pagetRender” “pageRender” disponibiliza os seguintes métodos do SDK:
Método | Descrição |
---|
PageVO getPage() |
: retorna | Retorna um objeto do tipo VO com todas as informações |
da página corrente, como sua página pai (caso |
hajaexista), páginas filhas, layout e |
tema, entre outras propriedades |
; List<PageVO> listPageBreadcrumb() |
: retorna | Retorna uma lista de páginas |
ordenadas em modo de navegação estrutural, possibilitando a localização da |
página atual em meio estrutura de páginas do sistema |
; void renderInstance(long instanceId) |
: método | Método que inicia a renderização de |
uma Widget um widget utilizando o FTL “decoration.ftl”, ou seja, irá renderizar |
a Widget seu título no slot onde foi invocado o método |
; void renderInstanceNoDecorator(long instanceId) |
: método uma Widget um widget utilizando o FTL “nodecoration.ftl”, ou seja, irá |
a Widget o widget sem a barra de título, no slot onde foi invocado o método |
;: retorna | Retorna se existe um usuário logado através do VO |
; : retorna | Retorna objeto VO do usuário corrente |
, código do Tenant entre outras |
propriedades; propriedades. Informações |
---|
As informações de grupos e papéis do usuário não são apresentadas neste objeto e o uso deste tipo de informação para validações no desenvolvimento de widgets não é recomendado, pois afeta o desempenho do carregamento das páginas. |
|
List<Long> getInstancesIds(Slog slot) |
: retorna | Retorna uma lista com ID de |
toadsas Widgets todas os widgets contidas no “slot” informado |
; List<Long> getInstancesByCode(String code) |
: retorna | Retorna o ID de instância de |
as os widgets com o código informado “code” contidas na página |
; boolean hasPermission(long instanceId, String permission) |
: verifica se a | Verifica se o widget com o “instanceId” informado |
, possui uma determinada permissão, |
conforme a “permission” desejada |
; boolean hasViewPermission(long instanceId) |
: verifica | Verifica se o usuário logado |
possui permissão de visualização |
da ; boolean hasEditPermission(long instanceId) |
: verifica | Verifica se o usuário logado |
possui permissão de edição para a instancia (“instanceId”) em questão |
; : retorna | Retorna a URL de acesso a página inicial (home) |
; boolean isUserLoggedInOAuthWithConsumerKey(String consumerKey) |
:identifica Identifica se um usuário logado possui um token válido para o chave de |
consumo (“consumerKey”) informada. |
List<WidgetVO> listAllowedWidgetsByUser() |
: retorna | Retorna a lista de Widgets as |
quais o usuário possuí permissão de visualização |
; : retorna | Retorna o ID do Tenant do usuário corrente |
;Fluxograma de Renderização
Toda página renderizada no WCM possui o mesmo fluxo para sua construção. O
primeiro arquivo chamado no processo de renderização é o “master.ftl”, onde são
informados os metadados da página. O arquivo master invoca o método
“pageRender.renderTheme()”, responsável pela renderização do tema, que por sua
vez irá chamar a renderização do layout, onde posteriormente serão renderizadas as
Widgets que compõem a tela, concluindo a construção da página.
O fluxograma a seguir exemplifica o processo de renderização de uma página:
Criando um Layout
Para facilitar a criação de projetos do tipo Layout, foi criado um Archetype Maven.
Um Archetype é um template de projeto Maven, previamente configurado e
estruturado.
O uso do Archetype permite criar um projeto com a estrutura de pastas fontes
idêntica à citada no tópico “Estrutura de Arquivos”, deixando para o desenvolvedor
apenas o trabalho de alterar/adicionar arquivos conforme sua necessidade específica.
A seguir, um passo a passo exemplificando a criação de um layout:
Pré-Requisitos
JDK 1.7 instalado;
Apache Maven 3.0.4 (ou superior) instalado;
Acesso ao Nexus da TOTVS configurado.
Abra uma janela do terminal (ou prompt do DOS) e navegue até a pasta onde deseja
que o layout seja criado. Digite a seguinte linha de comando:
mvn archetype:generate -DarchetypeGroupId=com.totvs.technology -DarchetypeArtifactId=layout-wcm -DarchetypeVersion=4.0.3-SNAPSHOT -DgroupId=<Group ID do Layout> -DartifactId=<Artifact ID do Layout> -Dversion=<Versao do Layout> -DparentArtifactId=”<ID do artefato pai>” -DapplicationTitle=”<Titulo do Layout>” -DapplicationDescription=”<Descricao to Layout>” -DdeveloperCode=”<Codigo de desenvolvedor>” -DdeveloperName=”<Nome do desenvolvedor>” -DdeveloperURL=”<URL do desenvolvedor>” -DlayoutFile=”<Nome do arquivo layout>” SEM a extensão “.ftl” -DapplicationCategory=”<Categoria>” -DapplicationCategory=”<Categoria>” |
---|
Onde:
Onde:
DarchetypeVersion: versão do archetype para gerar o layout. Pode ser
omitido. Deve ser informado caso queira gerar para uma versão em
específico.
DgroupId: groupId do Layout. Parâmetro obrigatório.
DartifactId: artifactId do Layout. Parâmetro obrigatório.
Dversion: versão do Layout. Parâmetro obrigatório.
DparentArtifactId: ID do artefato pai. Parâmetro obrigatório, se não
informado, assumirá "wcm-architecture".
DapplicationTitle: Título do Layout. Pode ser omitido, porém deverá ser
informado posteriormente.
DapplicationDescription: Breve descrição do Layout. Pode ser omitido,
porém deverá ser informado posteriormente.
DdeveloperCode: Código de desenvolvedor. Cada empresa ou grupo deve
padronizar um código. Esse código será usado para validações internas de
permissionamento. Se não informado, assumirá "TOTVS".
DdeveloperName: Nome da empresa que desenvolveu o Layout. Se não
informado, assumirá "TOTVS S.A.".
DdeveloperURL: URL da empresa que desenvolveu o Layout. Se não
informado, assumirá "http://www.totvs.com".
DlayoutFile: Nome do arquivo do Layout. Se não informado, assumirá
"layout".
DapplicationCategory: Categoria do Layout. Se não informado, assumirá
"SYSTEM".
Após a execução do comando, deve ser criada a estrutura de pasta fonte padrão no
diretório escolhido.
. |
pageRender.isPreviewMode() | Diz se a página está em modo preview ou não true|false. |
pageRender.isEditMode() | Diz se a página está em modo edição ou não true|false. |
Macros para o uso no FTL dos layouts:
Arquivo que disponibiliza as macros para o layout: "<#import "/wcm.ftl" as wcm />".
Método | Descrição |
---|
<@wcm.previewPageAlert /> | Alerta no topo da página informando que a página está em modo de pré-visualização. |
<@wcm.header /> | Widget de cabeçalho da página (independente do tema). |
<@wcm.menu /> | Widget de menu da página (independente do tema). |
<@wcm.editHeader /> | Widget de cabeçalho da página no modo de edição. |
<@wcm.widgetsList /> | Widget que faz a listagem de widgets disponíveis para serem adicionadas em uma página. |
<@wcm.renderSlot id="SlotA" editableSlot="true" isResponsiveSlot="true" /> | Macro padrão para renderização de um slot. (se o parâmetro isResponsiveSlot for true, implementa o visual novo com as ações novas em uma widget). |
<@wcm.footer layoutuserlabel="wcm.layoutdefaultecmdashboard.user" /> | Widget padrão para o rodapé da página. |
Fluxograma de Renderização
Toda página renderizada no WCM possui o mesmo fluxo para sua construção. O primeiro arquivo chamado no processo de renderização é o “master.ftl”, onde são informados os metadados da página. O arquivo master invoca o método “pageRender.renderTheme()”, responsável pela renderização do tema, que por sua vez irá chamar a renderização do layout, onde posteriormente serão renderizadas os widgets que compõem a tela, concluindo a construção da página.
O fluxograma a seguir exemplifica o processo de renderização de uma página:
Image Added
Criando um Layout
É possível criar um layout a partir do Fluig Studio. O tutorial com o passo-a-passo encontra-se aqui
- Uma vez finalizando o tutorial, o Studio preparará um ambiente semelhante a esse:
Image Added
- Ou, no caso de ter-se optado por um layout vazio, aparecerá o seguinte conteúdo:
Image Added
- Para criar um slot, nesse caso, pode-se usar o Snippet "Slot de um Layout" disponível nos exemplos de código do Studio.
- Entenda o impacto na forma como você cria o layout na sessão sobre mudança no layout de uma página
Código do Layout
Apesar de a estrutura fornecida pelos templates do Studio não serem obrigatórios, é aconselhável o uso de alguns elementos essenciais quando do desenvolvimento de um layout a partir da estaca zero, como por exemplo:
Deck of Cards |
---|
|
Card |
---|
id | 1 |
---|
label | 1.8.1 e superiores |
---|
| Bloco de código |
---|
| <#import "/wcm.ftl" as wcm/>
<#-- Variaveis globais para os layouts -->
<#import "/layout-globals.ftl" as globals />
<#if pageRender.isPreviewMode() = true>
<@wcm.previewPageAlert />
<@wcm.deviceTogglePreview />
</#if>
<div class="wcm-wrapper-content ${wcmLayoutEditClass!""} ${pageAuthTypeClass!""}">
<#if pageRender.isEditMode() = false>
<@wcm.header authenticated=pageRender.isUserLogged()?c />
<@wcm.menu />
</#if>
<div class="wcm-all-content">
<div id="wcm-content" class="clearfix wcm-background">
<#if pageRender.isEditMode()=true>
<@wcm.editHeader />
<@wcm.widgetsList />
</#if>
<div id="${divMasterId!""}">
<!-- Slot 1 -->
<div class="editable-slot slotfull layout-1-1" id="slotFull1">
<@wcm.renderSlot id="SlotC" editableSlot="true" decorator="false" isResponsiveSlot="true" />
</div>
<#if fluigThemeCode != "responsive_theme">
<@wcm.footer layoutuserlabel="wcm.layoutdefault.user" />
</#if>
</div>
</div>
</div>
</div> |
|
Card |
---|
id | 2 |
---|
label | 1.8.0 e inferiores |
---|
| Bloco de código |
---|
| <#import "/wcm.ftl" as wcm/>
<@wcm.header public="true"/>
<!-- WCM Wrapper content -->
<div class="wcm-wrapper-content">
<@wcm.menu />
<!-- Wrapper -->
<div class="wcm-all-content">
<div id="wcm-content" class="clearfix wcm-background">
<!-- Your content here -->
<@wcm.footer layoutuserlabel="wcm.layoutdefault.user" />
</div>
</div>
</div> |
|
|
Código do Slot
O código de um slot é composto dos seguintes elementos:
Bloco de código |
---|
|
<div class="editable-slot slotfull layout-1-1" id="slotContainer001">
<@wcm.renderSlot id="Slot001" decorator="false" editableSlot="false" isResponsiveSlot="true" />
</div> |
Sobre o primeiro elemento "div":
Bloco de código |
---|
|
<div class="editable-slot slotfull layout-1-1" id="slotContainer001"> ... </div> |
Propriedade | Função |
---|
id="slotContainer001" | slotContainer001: Identificação única do container. Não pode haver outro elemento com esse mesmo código. O tamanho máximo para um ID de slot é 50 caracteres. |
class="editable-slot slotfull layout-1-1" | editable-slot e slotfull: Usado pelo renderizador para montar o editor individual de slot. layout-1-1: Usado para posicionar o slot em um determinado ponto da tela. Será detalhado adiante. |
Sobre o segundo elemento "div":
Bloco de código |
---|
|
...<@wcm.renderSlot id="Slot001" decorator="false" editableSlot="false" isResponsiveSlot="true" />... |
Propriedade | Função |
---|
id="Slot001" | Slot001: Identificação única do slot. Não pode haver outro elemento com esse mesmo código |
decorator="false" | true: As widgets posicionadas neste slot exibem seus títulos false: As widgets posicionadas neste slot não exibem seus títulos |
editableSlot="false" | true: Torna possível inserir e retirar widgets dentro do slot bem como mudar o posicionamento delas false: Não permite qualquer edição no conteúdo do Slot. Slots de cabeçalho, rodapé e login geralmente estão com esse valor |
isResponsiveSlot="true" | true: implementa o novo visual com ações novas em uma widget. false: Renderiza o visual antigo. |
Posicionamento do Slot
Na primeira "div" do conjunto de elementos de um slot, podemos encontrar o seguinte código:
Bloco de código |
---|
|
<div id="slotContainer001" class="editable-slot slotfull layout-1-1"> |
O valor "layout-1-1" refere-se ao posicionamento daquele layout dentro da página. Segue abaixo a lista dos posicionamentos de slot disponíveis dentro do TOTVS Fluig Plataforma:
Valor | Posição | Largura |
---|
layout-1-3 | Esquerda | 32% |
layout-2-3 | Esquerda | 65% |
layout-1-2left | Esquerda | 50% |
layout-1-1 | --- | 100% |
layout-1-2right | Direita | 50% |
layout-1-3right | Direita | 32% |
Sobre Slots não editáveis
Um layout pode, ou não, conter slots não editáveis. Naqueles fornecidos pelo Fluig Plataforma como templates, há 5 slots que não são editáveis por padrão. Para cada slot não-editável, é necessário criar uma propriedade no application.info relacionado o id do slot ao código da widget que estará contida nele, pois essa é a forma de inserir conteúdo em um slot não-editável.
Slot de Busca:
Bloco de código |
---|
|
<div id="SlotInstantSearch" slot="true" class="slotint slot-header-actions">
<#list (pageRender.getInstancesIds("SlotInstantSearch"))! as id>
${pageRender.renderInstanceNoDecorator(id)}
</#list>
</div> |
Propriedade do application.info:
slot.SlotInstantSearch=widget_search
Slot de Alertas Globais:
Bloco de código |
---|
|
<div id="SlotGlobalAlert" slot="true" class="slotint slot-header-actions">
<#list (pageRender.getInstancesIds("SlotGlobalAlert"))! as id>
${pageRender.renderInstanceNoDecorator(id)}
</#list>
</div> |
Propriedade do application.info:
slot.SlotGlobalAlert=alertpopover
Slot de Login:
Bloco de código |
---|
|
<div class="header-grouper-right">
<div id="SlotLogin" slot="true" class="slot-header-actions">
<#list (pageRender.getInstancesIds("SlotLogin"))! as id>
${pageRender.renderInstanceNoDecorator(id)}
</#list>
</div>
</div> |
Propriedade do application.info:
slot.SlotLogin=sociallogin
Slot de Menu:
Bloco de código |
---|
|
<@wcm.menu /> |
Propriedade do application.info:
Slot de Rodapé:
Bloco de código |
---|
|
<@wcm.footer layoutuserlabel="wcm.layoutdefault.user" /> |
Propriedade do application.info:
slot.SlotUsePolicy=usepolicy
Informações |
---|
|
o valor do parâmetro "layoutuserlabel" deve ser uma chave existente em um dos arquivos .properties do seu projeto |
Para exibir o título das widgets no slot é possível utilizar a propriedade decorator na macro renderSlot.
Por padrão os títulos das widgets não são exibidos na utilização da macro renderSlot. Porém é possível exibir os títulos alterando a propriedade decorator="true" no código do slot conforme exibido abaixo. Assim, todas as widgets posicionadas neste slot terão um título visível no topo.
Bloco de código |
---|
|
<div id="divSlot1" class="editable-slot">
<@wcm.renderSlot id="SlotA" decorator="true" editableSlot="true" />
</div> |
Resultado:
Image Added