Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice

Índice
outlinetrue
exclude.*ndice
stylenone

 

Objetivo

O objetivo deste guia é possibilitar ao desenvolvedor criar componentes WCM via Eclipse (ou fluig Studio).

...

Deck of Cards
idcriacao_widget
Card
labelPasso 1

 

  • Clicar com o botão direito do mouse sobre o projeto Fluig criado.
  • Selecionar NewWidget.

 

Card
labelPasso 2

 

  • Informar o código do widget no campo Código. Este campo é uma chave única e obrigatório.
Informações

O campo Código aceita apenas letras, números e sublinhado.

  • Informar o nome do widget no campo Nome.
  • Informar uma breve descrição do widget no campo Descrição.
  • Escolher um dos templates disponíveis para o desenvolvimento do widget no campo Template ou manter o padrão "Nenhum" para não utilizar um modelo de desenvolvimento.
  • Acionar Next para avançar.

 

Card
labelPasso 3

 

  • Informar o código, nome e URL para identificação do desenvolvedor do componente (Opcional).
  • Informar a categoria do widget (Opcional).
Informações

As categorias funcionam como filtros para localizar widgets mais rapidamente e são listadas no painel esquerdo da janela de seleção de widgets exibido ao incluir novos widgets em um slot.

  • Apenas um renderizador é disponibilizado atualmente (FreemarkerFreeMarker).
  • Acionar Finish para concluir a criação do widget.

 

Card
labelPasso 4

 

  • Concluída a etapa de criação do widget, uma estrutura de diretórios será gerada abaixo da pasta "wcm/widget" do projeto.
Informações

A descrição dos arquivos gerados está disponível no item Estrutura dos diretórios de widgets.

 

 

Estrutura dos diretórios de widgets
Âncora
tabelaestruturawidget
tabelaestruturawidget

Arquivo/Pasta

Descrição

<código-da-widget>[código_do_widget]

Nome/Identificador da Widgetdo widget.

src/main/java

Localização das classes Java, caso exista alguma regra de negócio específica da Widgetdo widget.

src/main/resources/application.info

Arquivo de configuração da Widget, onde é persistida, entre outras informações, o código da Widgetdo widget onde são gravados o código, título e desenvolvedor do widget, entre outros dados.

Este arquivo será mais detalhado nas próximas páginas deste documento.

src/main/resources/view.ftl

Arquivo de template do freemarker FreeMarker que será interpretado durante a renderização da Widgetdo widget.

src/main/resources/edit.ftl

Arquivo que será interpretado durante a renderização da Widget do widget em modo de edição. Usado para configurar opções específicas para renderização da Widgetdo widget, como por exemplo, filtros de data, cotação do dólar, etc.

Este arquivo é opcional, caso . Caso não exista, será considerado que a Widget o widget não possui modo de edição, somente visualização.

src/main/resources/<código-da-widget>[código_do_widget].properties

Arquivo de strings traduzíveis utilizadas pela Widgetpelo widget. Deve possuir derivações de acordo com o idioma suportado pela Widgetpelo widget.

O padrão será sempre o código da Widget do widget seguido do sufixo referente à sua linguagem, . Por exemplo: um arquivo de tradução para o idioma inglês ficaria : “código-dado-widget_EN_US.properties”.

src/main/webapp/icon.png

Ícone que representa a Widget. Será utilizado para representar a Widget o widget no menu lateral da aplicação, ou em qualquer tela que necessite de uma representação visual do componente. Devem Deve possuir a dimensão 55 x 30 pixels.

src/main/webapp/WEB-INF/web.xml

Descritor padrão de uma aplicação Java para web.

src/main/webapp/WEB-INF/jboss-web.xml

Descritor específico para o JBoss. Deve conter pelo menos obrigatoriamente a propriedade “context-root”. O context-root representa o contexto Web da Widget e é recomendado que web do widget e o recomendado é que o valor seja o próprio código da Widgetdo widget.

src/main/webapp/resources/css/<código-da-widget>[código_do_widget].css

Folha de estilo da Widgetdo widget.

src/main/webapp/resources/js/<código-da-widget>[código_do_widget].js

Arquivo Javascript da Widget JavaScript do widget (caso seja necessário).

src/main/webapp/resources/images

Pasta específica de imagens da Widgetdo widget, caso necessário.

src/test/java

Pasta específica para a construção de testes unitários.

Aviso
titleAtenção!

Pastas não Não devem ser criadas novas pastas no diretório "src/main/resources". Recomendamos que utilize O recomendado é que sejam utilizadas as pastas já existentes no projeto.

 

Exemplo de código JavaScript

Bloco de código
languagejavascript
var HelloWorld = SuperWidget.extend({
    message: null,
    init: function () {
        //code
    },
    bindings: {
        local: {
            'show-message': ['click_showMessage']
        }
    },
    showMessage: function () {
        $div = $('#helloMessage_' + this.instanceId);
        $message = $('<div>').addClass('message').append(this.message);
        $div.append($message);
    }
});
 

Exemplo de código HTML com FreeMarker (view.ftl)

Bloco de código
languagehtml/xml
<div id="HelloWorld_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide"
     data-params="HelloWorld.instance({message: 'Hello world'})">
    <!-- efetua a tradução do texto do objeto i18n -->	
    <h1>${i18n.getTranslation('hello.example.hello')}</h1>
    <div>
        <button type="button" class="btn btn-default" data-show-message>${i18n.getTranslation('hello.button.showMessage')}</button>
    </div>
    <div id='helloMessage_${instanceId}'>
    </div>
    
</div>

 

Criação de Layout

Acompanhe os passos a seguir:

  1. No Package Explorer, clique com o botão direito e escolha New...
  2. Selecione a opção Layout.

    Figura 5 - Criando um novo Layout (campos obrigatórios)



  3. Preencha os campos obrigatórios do componente Layout (Figura 5): Código, Nome e Descrição.

  4. Escolha um Template para seu layout a partir do botão combo-box ou marque Nenhum caso não queira um modelo.

    Observação

    O campo Código deve ser preenchido apenas com letras, números e sublinhado (underscore).

  5. Pressione Next para continuar (Figura 6) o preenchimento dos campos ou Finish para concluir.

Figura 6 - Criando um novo Layout (campos opcionais)

Nota

Os campos: Código do desenvolvedor, Nome do desenvolvedor, URL do desenvolvedor e Categoria são campos opcionais. Já o campo Renderizador fornece apenas uma opção: Freemarker.

Ao concluir a construção do Layout, a estrutura de diretório deverá ficar como na Figura 7.

Figura 7 - Estrutura de diretórios de um projeto Layout

 

Nota

A estrutura de pastas e arquivos de um componente Layout é praticamente a mesma de um componente Widget. A alteração normalmente encontra-se no caminho src/main/resources/ onde os arquivos view.ftl e edit.ftl são substituídos pelo arquivo layout.ftl.


Exemplo de código FreeMarker (layout.ftl)

Bloco de código
languagehtml/xml
<div class="fluig-style-guide">
    <div id="wcm_header" class="wcm-header-background wcm-header">
        <!-- Group left -->
        <div class="header-grouper-left">
            <a href="home" class="wcm_logo" title="${i18n.getTranslation('layout.label.pagetitle')}">
            <#if '${imageLogo}'=='true'>
                <img src="${serverContextURL}/resources/images/${pageRender.user.tenantId}/logo_image.png"></img>
            <#else>
                <img src="${serverContextURL}/resources/images/logo.png"></img>
            </#if>
            </a>
        </div>
        <!-- Group right -->
        <div class="header-grouper-right">
            <!-- Container login -->
            <div id="SlotLogin" slot="true" class="slot-header-actions">
            <#list (pageRender.getInstancesIds("SlotLogin"))! as id>
				${pageRender.renderInstanceNoDecorator(id)}
			</#list>
            </div>
        </div>
    </div>
    <!-- WCM Wrapper content -->
    <div class="wcm-wrapper-content">
        <!-- Menu esquerdo -->
        <nav class="wcm-navigation wcm-menu-background">
            <div id="SlotMenu" slot="true">
            <#list (pageRender.getInstancesIds("SlotMenu"))! as id>
				${pageRender.renderInstanceNoDecorator(id)}
			</#list>
            </div>
        </nav>
        <!-- Wrapper -->
        <div class="wcm-all-content">
            <div id="wcm-content" class="clearfix wcm-background">
                <!--WIDGETS DO LAYOUT -->
                <link type="text/css" rel="stylesheet" href="${contextPath}/resources/css/wcm_layout.css"/>
                <!-- Onde deverá estar a barra de formatação -->
            <#if pageRender.isEditMode()=true>
                <div name="formatBar" id="formatBar"></div>
                <!-- Div geral -->
                <!-- Há CSS distinto para Edição/Visualização -->
            <div id="edicaoPagina" class="clearfix">
            <#else>
            <div id="visualizacaoPagina" class="clearfix">
            </#if>
                <!-- Titulo da página -->
                <div class="slotfull layout-1-1">
                    <span class="titleArea">${i18n.getTranslation('wcm.layoutdefault.title')}</span>
                    <h2 class="pageTitle">${pageTitle}</h2>
                </div>
                <!-- Slot 1 -->
                <div class="editable-slot slotfull layout-1-1" id="slotFull1">
                    <div id="SlotC" slot="true" class="slotint" decorator="false" editableSlot="true">
                    <#list (pageRender.getInstancesIds("SlotC"))! as id>
						${pageRender.renderInstanceNoDecorator(id)}
					</#list>
                    </div>
                </div>
                <!-- Slot 2 -->
                <div class="editable-slot slotfull layout-1-1" id="slotFull2">
                    <div id="SlotB" slot="true" class="slotint" decorator="false" editableSlot="true">
                    <#list (pageRender.getInstancesIds("SlotB"))! as id>
						${pageRender.renderInstanceNoDecorator(id)}
					</#list>
                    </div>
                </div>
                <!-- Slot 3 -->
                <div class="editable-slot slotfull layout-1-1" id="slotFull3">
                    <!-- Widget -->
                    <div id="SlotA" slot="true" class="slotint" decorator="true" editableSlot="true">
                    <#list (pageRender.getInstancesIds("SlotA"))! as id>
						${pageRender.renderInstance(id)}
					</#list>
                    </div>
                </div>
            </div>
                <!-- FIM DAS WIDGETS DO LAYOUT -->
                <div id="wcm_footer" class="wcm_footer"></div>
            </div>
            </div>
        </div>
    </div>

Para compreender melhor os elementos de um código de layout, leia a sessão de layouts.

Exemplo de código JavaScript

Bloco de código
languagejavascript
var HelloWorld = SuperWidget.extend({
    message: null,
    init: function () {
        //code
    },
    bindings: {
        local: {
            'show-message': ['click_showMessage']
        }
    },
    showMessage: function () {
        $div = $('#helloMessage_' + this.instanceId);
        $message = $('<div>').addClass('message').append(this.message);
        $div.append($message);
    }
});

 

Exemplo de códigos para inclusão de componentes nos layouts (view.ftl)

Os layouts customizados do Fluig permitem que o usuário reutilize alguns componentes padrões da plataforma, tais como, o cabeçalho contendo as informações do usuário, campo de busca e notificações globais, assim como também rodapé, menu e outros componentes.

Quando o usuário inicia a customização de um layout pelo Fluig Studio, é possível utilizar alguns exemplos de layouts existentes que terão padrões diferenciados. Em alguns destes layouts pré definidos é necessário verificar quais componentes estão presentes e quais foram inseridos, pois algumas vezes é necessário configurar o slots no arquivo src/main/resources/application.info.

Abaixo alguns exemplos de partes/pedaços código para montagem de componentes no layout são exibidos. Vale lembrar que cada código tem sua particularidade e geralmente não podem ficar soltos no arquivo view.ftl, pois precisam estar dentro de algumas DIVs para seu perfeito funcionamento.

Abaixo segue o exemplo de montagem de alguns componentes disponíveis: 

  1. Inclusão do componente de busca:

    Bloco de código
    languagexml
    titleComponente de Busca
    <div id="SlotInstantSearch" slot="true" class="slotint slot-header-actions">
    	<#list (pageRender.getInstancesIds("SlotInstantSearch"))! as id>
    		${pageRender.renderInstanceNoDecorator(id)}
    	</#list>
    </div>
    Observação
    1. O trecho descrito acima deve ser colocado dentro da DIV <div class="header-grouper-right"> que deverá estar dentro da DIV <div id="wcm_header" class="wcm-header-background wcm-header">;
    2. No arquivo src/main/resources/application.info o usuário deverá incluir: slot.SlotInstantSearch=suggestsearch.

     

     

  2. Inclusão do componente de notificação/alerta global:

    Bloco de código
    titleComponente de Notificação
    <div id="SlotGlobalAlert" slot="true" class="slotint slot-header-actions">
    	<#list (pageRender.getInstancesIds("SlotGlobalAlert"))! as id>
    		${pageRender.renderInstanceNoDecorator(id)}
    	</#list>
    </div>
    Observação
    1. O trecho descrito acima deve ser colocado dentro da DIV <div class="header-grouper-right"> que deverá estar dentro da DIV <div id="wcm_header" class="wcm-header-background wcm-header">;
    2. No arquivo src/main/resources/application.info o usuário deverá incluir: slot.SlotGlobalAlert=alertpopover.

 

...