Documentação

21 Edição de código-fonte

Existem alguns locais que o Adianti Builder disponibiliza a opção de edição de código-fonte, seriam eles: o modo de edição das páginas e de ações nos formulários e ações de registros em listagens. É possível visualizar em modo de edição as páginas desenvolvidas no Adianti Builder, para acessar o modo de edição, basta clicar no ícone </> conforme demonstrado na imagem a seguir:

Modo de edição

Acessando o modo de código-fonte da página, será exibido ao desenvolvedor toda a página já montado com o código-fonte gerado. Grande parte do fonte gerado pelo Adianti Builder está bloqueado para mudanças, no entanto, estão disponíveis para desenvolvimento muitos pontos de edição. Pontos de edição são trechos liberados, dentro do código da página para que os desenvolvedores possam criar novas e dinâmicas soluções.

O menu lateral esquerdo do modo de visão apresenta diversas ancoras para acessar todos os pontos de edição da página em questão, como pode ser visto na imagem abaixo:

Pontos de edição

21.1 Pontos de edição

Ao visualizar diferentes tipos de páginas em modo de edição de código-fonte podem ser exibidos diferentes pontos de edição. São oferecidos mais 100 pontos de edição de código-fonte visualmente, minimizando bastante a necessidade de realizar a programação fora da plataforma. Alguns exemplos são: ao editar um registro de um formulário, antes da criação de uma página, ao limpar o formulário, antes de exibir a página, dentre muitos outros.

Existem duas maneiras de acessar os pontos de edição de uma página, a primeira já demonstrada no anteriormente é disponibilizada ao acessar o modo de edição da página. No entanto, é possível acessar os pontos de edição diretamente pelo modo visual da página, para isso basta clicar no ícone de engrenagem que da acesso às configurações da página e selecionar a segunda aba de informações Pontos de edição.

Pontos de edição

21.2 Pontos de edição em cada página

21.2.1 Formulários

  • Ao editar;

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Ao limpar o fomulário;

  • Funções do usuário;

  • Antes de exibir a página.

21.2.2 Formulários de visualização

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Funções do usuário;

  • Antes de exibir a página.

21.2.3 Listagens

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Depois da criação das colunas;

  • Ao prepar filtros;

  • Antes de carregar a datagrid;

  • Antes de carregar um item da datagrid;

  • Funções do usuário;

  • Antes de exibir a página.

21.2.4 Documentos

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Funções do usuário;

  • Ao preparar filtros;

  • Antes de carregar o relatório;

  • Antes do título do relatório;

  • Antes de adicionar uma linha;

  • Após o relatório;

  • Antes de exibir a página.

21.2.5 Documentos em lote

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Depois da criação das colunas;

  • Antes de carregar os dados;

  • Antes de processar o documento;

  • Após carregar os itens;

  • Antes de exibir a página.

21.2.6 Gráficos

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Funções do usuário;

  • Ao preparar filtros;

  • Antes de carregar os dados;

  • Após carregar os dados;

  • Antes de exibir a página.

21.2.7 Calendários

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Ao editar;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Ao limpar o fomulário;

  • Funções do usuário;

  • Funções do calendário;

  • Após definir as propriedades;

  • Após criar o calendário;

  • Ao carregar um evento do calendário;

  • Antes de carregar dos dados;

  • Antes de iniciar ou editar um evento;

  • Antes de editar um evento;

  • Antes de exibir a página.

21.2.8 Desenhos

  • Início da classe (require, use, namespaces);

    • Propriedades da classe;

    • Antes do processamento;

    • Funções do usuário.

21.2.9 Desenhos em lote

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Depois da criação das colunas;

  • Antes de carregar os dados;

  • Antes de processar o desenho;

  • Antes de exibir a página.

21.2.10 Etiquetas (código de barras)

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Funções do usuário;

  • Ao preparar filtros;

  • Antes de carregar os dados;

  • Antes de adicionar o objeto;

  • Antes de exibir a página.

21.2.11 Etiquetas (QR code)

  • Início da classe (require, use, namespaces);

  • Propriedades da classe;

  • Antes da criação da página;

  • Depois da criação da página;

  • Depois da criação dos campos;

  • Funções do usuário;

  • Ao preparar filtros;

  • Antes de carregar os dados;

  • Antes de adicionar o objeto;

  • Antes de exibir a página.

21.3 Métodos

Agora é possível criar métodos do usuário para qualquer página, acessando a terceira aba de configurações da página Métodos.

Criar função

Para criar uma função são necessárias duas informações: nome da função e se ela é estática ou não, com isso já é possível programá-la. A função criada fica disponível de duas maneiras, no modo de edição da página e pelo ícone </> ao lado do nome da função criada. Acessando a função criada por um dos métodos mencionados só resta ao desenvolvedor criar a lógica da função.

Editar função

Editar função

21.4 Snippets

Snippets são blocos de códigos utilizados no Adianti Builder para agilizar o desenvolvimento de código, alguns snippets são fornecidos para ajudar o desenvolvedor em situações corriqueiras aumentando a velocidade do desenvolvimento. Um exemplo seria o snippet para questões, basta definir uma mensagem que será apresentada ao usuário do sistema e o código para as ações de Sim e Não são criadas automaticamente. Os snippets são acessíveis apenas dentro da ferramenta de edição de código-fonte e possuem vários trechos prontos. Os trechos criados pelos snippets possuem comentários informativos que eles foram criados automaticamente e por qual snippet.

Snippets

Ao selecionar o snippet desejado o desenvolvedor deve preencher algumas informações, e elas podem variar conforme o snippet selecionado. Após preencher as informações basta gerar o código-fonte e colocá-lo no local desejado.

User snippet

21.4.1 Cálculos com campos

É a calculadora de atributos vista no Capítulo 8.7.1, funciona da mesma maneira, podendo utilizar os campos do formulário e operadores matemáticos para chegar em um resultado. O desenvolvedor deve escolher um campo para receber o resultado e cadastrar uma formulá matemática para obter o resultado desejado.

Exemplo

    // Código gerado pelo snippet: "Cálculos com campos"
    $valor_1 = (double) str_replace(',','.',str_replace('.', '', $param['valor_1']));
    $valor_2 = (double) str_replace(',','.',str_replace('.', '', $param['valor_2']));

    $id = $item_venda_venda_estado_id  - $item_venda_venda_cidade_id ;
    $object = new stdClass();
    $object->id = number_format($id, 2 , ',', '.');

    TForm::sendData(self::$formName, $object);
    // -----

21.4.2 Habilitar campo

Este snippet permite que o desenvolvedor habilite campos que estão definidos como apenas leitura. O snippet usará o tipo do campo escolhido para gerar o código-fonte apropriado, seja o campo um TEntry, TDBCombo, etc.

Exemplo

// Código gerado pelo snippet: "Habilitar campo"
TDBCombo::enableField(self::$formName, 'item_venda_venda_cidade_id');
// -----

21.4.3 Desabilitar campo

Este snippet permite que o desenvolvedor desabilite campos. O snippet usará o tipo do campo escolhido para gerar o código-fonte apropriado, seja o campo um TEntry, TDBCombo, etc.

Exemplo

// Código gerado pelo snippet: "Desabilitar campo"
TEntry::disableField(self::$formName, 'nome');
// -----

21.4.4 Enviar dados para campo

Ao escolher o campo de destino o snippted criará a estrutura para que dados sejam enviados para os campos do formulário. Embora o snippet recebe apenas um campo como parâmetro o desenvolvedor pode adicionar atributos no objeto que será enviado ao formulário.

Para enviar mais informações para o formulário, o atributo adicionado no objeto deve ser o nome do campo de destino e o valor deve ser a informação a ser preenchida.

// Código gerado pelo snippet: "Enviar dados para campo"
$object = new stdClass();
$object->nome = 'insira o novo valor aqui';
//$object->fieldName = 'insira o novo valor aqui'; //sample

TForm::sendData(self::$formName, $object);
// ----

21.4.5 Questionamento

Este snippet cria o código-fonte que realiza uma pergunta ao usuário, a pergunta terá uma resposta positiva e uma negativa, as duas terão um método exclusivo. O desenvolvedor deve escolher um nome para os métodos e uma mensagem que será dirigida ao usuário no momento propício.

// Código gerado pelo snippet: "Questionamento"
new TQuestion(
    "Você tem certeza que deseja realizar esta operação?",
    new TAction([__CLASS__, 'onYes'], $param),
    new TAction([$this, 'onNo'], $param)
);
// -----

As funções onYes() e onNo() foram adicionadas ao código-fonte da página automaticamente.

21.4.6 Recarregar combo/select

Este código-fonte recarrega os valores de uma combo, a chave do array será o valor enviado no POST e o valor do array a informação a ser apresentada como opção. O array pode ser carregado pela função do Adianti Framework MinhaModel::getIndexedArray('chave', 'valor', $criteria).

// Código gerado pelo snippet: "Recarregar combo/select"
$items = array();
$items['chave'] = 'valor';

TCombo::reload(self::$formName, 'meu_select', $items, true);
// -----

21.4.7 Recarregar combo/select através de filtros

Este snippet é semelhante ao anterior, no entanto ele oferece um interface para criar filtros dinâmicos. Primeiro é necessário definir a fonte de informações.

  1. Tabela de origem

  2. Campo chave (informação passada no POST)

  3. Campo exibido, a coluna da tabela de origem que será exibida como opção ao usuário.

Depois o desenvolvedor pode adicionar diversos filtros que serão aplicados no carregamento da tabela de origem. Podem ser feitas diversas comparações entre as colunas do banco de dados e campos do formulário com filtros de comparação.

// Código gerado pelo snippet: "Recarregar combo/select através de filtros" 

TTransaction::open(self::$database);
$criteria = new TCriteria();
$criteria->add(new TFilter('nome', 'in', "(SELECT id FROM funcionario WHERE nome = '{$param['vendedor']}')"));

TCombo::reload(self::$formName, '', Funcionario::getIndexedArray('id', 'nome', $criteria));
TTransaction::close();

21.4.8 Esconder campo

Snippet para ocultar campos da visão do usuário, basta escolher o campo que se deseja esconder e gerar o código.

BootstrapFormBuilder::hideField(self::$formName, 'vendedor');

21.4.9 Mostrar campo

Snippet para exibir campos para o usuário, basta escolher o campo oculto que se deseja exibir e gerar o código.

BootstrapFormBuilder::showField(self::$formName, 'vendedor');

21.4.10 Mostrar rótulo pelo texto

Exibe o rótulo de um campo através do texto do mesmo.

TSCript::create("$('label:contains(\"Vendedor:\")').show();");

21.4.11 Esconder rótulo pelo texto

Esconde o rótulo de um campo através do texto do mesmo.

TSCript::create("$('label:contains(\"Vendedor:\")').hide();");

21.4.12 Trocar rótulo pelo texto

Altera o texto de um rótulo, usando o valor atual como critério de seleção.

TSCript::create("$('label:contains(\"Cliente:\")').html('Cliente principal:')");

21.4.13 Exibir mensagem

Gera o código-fonte para que uma mensagem de informação seja exibida para o usuário. Basta informar o texto a ser exibido.

// Código gerado pelo snippet: "Exibir mensagem"
new TMessage('info', "Minha mensagem");
// -----

21.4.14 Enviar e-mail

Este snippet cria uma chamada para a classe que controla o envio de e-mails oferecida junto com o Adianti Framework, para enviar e-mails é necessário que o servidor de envio esteja configurado, o desenvolvedor deve configurar as informações de envio de email pelo menu Administração dentro da aplicação na opção Preferências.

$type = 'html'; // ou = 'text'
MailService::send(['to@email.com'], 'Assunto', 'Mensagem', $type);

21.4.15 Gerar notificação ???

Este snippet gera o código-fonte necessário para gerar uma notificação dentro da aplicação, essa notificação é exibida dentro da NAV da aplicação no canto superior direito (ícone de sino).

O desenvolvedor deve selecionar a página e ação que ação que será executada ao clicar na notificação. Primeiro o desenvolvedor escolhe a classe e o método da mesma que ele deseja que sejam executados no momento que a notificação é clicada. Além dessas informações é necessário informar o ID do usuário que será notificado, o título e mensagem a serem enviados.

Exemplo

$user_id = 1; // id do usuário que receberá a notificação
$param = [];
$icon = 'fa-address-book-o';

SystemNotification::register(
    $user_id,
    'Título',
    'Texto',
    new TAction(['PessoaForm', 'onShow'], $param),
    'Texto do botão',
    $icon
);

21.4.16 Abrir transação

Cria o código-fonte para abrir uma transação com o banco de dados, o carregamento de objetos deve ser sempre feito dentro de uma transação aberta.

// Código gerado pelo snippet: "Conexão com banco de dados"
TTransaction::open('communication');

// code

TTransaction::close();
// -----

21.4.17 SQL Manual

Este snippet tenta resolver os problemas complexos que envolvem diversas models do projeto e poderiam ser resolvidas com uma query manual.

Atenção: Este snippet requer uma conexão aberta com o banco de dados.

$conn = TTransaction::get();
$result = $conn->query('SELECT id FROM habilidades_funcionario ORDER BY id');
$objects = $result->fetchAll(PDO::FETCH_CLASS, "stdClass");
if($objects)
{
    foreach($objects as $object) 
    { 
        echo $object->id;
    }    
}

21.4.18 Inserir registro

Cria um objeto da tabela escolhida para que seja inserido no banco de dados, o desenvolvedor deve escolher quais atributos e informações serão guardados no banco de dados.

Atenção: para salvar o registro no banco de dados deve existir uma conexão aberta.

$objeto = new Produto();
$objeto->campo = 'valor';
$objeto->store();

21.4.19 Carregar registro pelo id

Carrega os dados de um registro de uma determinada tabela pela chave primária ID.

$objeto = Produto::find( $id );

21.4.20 Carregar registro por outra coluna

Este snippet buscar o primeiro registro no banco de dados através de uma comparação. O desenvolvedor deve configurar qual coluna será comparada com qual valor e seu operador.

$objeto = Produto::where('coluna', '=', $valor)->first();

21.4.21 Alterar registro pelo id

Este snippet além de carregar um registro, ele demonstrar como alterar um atributo do objeto e como salvar esse objeto no banco de dados.

$objeto = Produtos::find( $id );
$objeto->coluna = 'valor';
$objeto->store();

21.4.22 Deletar registro pelo id

O código-fonte a seguir demonstra como remover um registro do banco de dados através da chave primária ID.

$objeto = Produtos::find( $id );
$objeto->delete();

21.4.23 Converter registro (objeto) em vetor

Este snippet demonstra como transformar um objeto carregado em um array, existem algumas situações que usar uma função de array pode facilitar a programação, e transformar um objeto em array é extremamente simples como demonstrado abaixo:

$objeto = Produto::find( $id );
$array = $objeto->toArray();

21.4.24 Converter registro (objeto) em JSON

Da mesma maneira que pode ser necessário converter um objeto em array, também pode ser interessante converter ele em Json.

$objeto = Habilidades::find( $id );
$array = $objeto->toJson();

21.4.25 Carregar registros através de filtros

Este snippet demonstra como carregar um vetor de objetos utilizando mais de um filtro. É possível adicionar quantos filtros forem necessários, basta replicar a linha ->where com as condições desejadas. A opção orderBy é opcional.

$objs = Produto::where('coluna',  '=', $valor)
                 ->where('coluna2', '=', $valor2)
                 ->orderBy('id')
                 ->load();

21.4.26 Carregar o primeiro registro encontrado

Código-fonte para encontrar o primeiro registro, obedecendo mais de um filtro.

$obj = TipoProduto::where('coluna',  '=', $valor)
                 ->where('coluna2', '=', $valor2)
                 ->orderBy('id')
                 ->first();

21.4.27 Carregar N registros

Este snippet mostrar como carregarmos um determinado número de registros, em casos que a tabela pode ser muito extensa podemos limitar o número de registros carregados.

$objs = Produtos::where('coluna',  '=', $valor)
                 ->orderBy('id')
                 ->take(10)
                 ->load();

21.4.28 Alterar múltiplos registros

Este snippet demonstra como realizar um update em todos os registros que obedecerem aos critérios aplicados.

Venda::where('id', 'IN', [1,2,3,4]) // id in (1,2,3,4)
        ->where('coluna1', '=', 'valor1') // coluna1 = 'valor1'
        ->set('coluna2', '50') // set coluna2 = '50'
        ->update();

21.4.29 Deletar múltiplos registros

Da mesma maneira que atualizar diversos registros é possível deletá-los. Todos os registros que obedecerem os critérios serão deletados.

Produto::where('coluna',  '=', $valor)
         ->where('coluna2', '=', $valor2)
         ->delete();

21.4.30 Contar registros

Semelhante aos registros anteriores além de editar e excluir está disponível um snippet para contar os objetos que obedecem os critérios.

$count = Produto::where('coluna',  '=', $valor)
                  ->where('coluna2', '=', $valor2)
                  ->count();

21.4.31 Carregar registros como vetor indexado

Ao carregar um vetor indexado, o resultado será um array com a chave e a coluna seguindo os atributos definidos. Essa função é especialmente útil para carregar combos e selects. O desenvolvedor pode configurar quantos critérios forem necessários.

$array = Produto::where('coluna',  '=', $valor)
                  ->where('coluna2', '=', $valor2)
                  ->orderBy('id')
                  ->getIndexedArray('primaryKey', 'coluna3');

21.4.32 Habilitar logs de SQL

Este snippet habilita os logs de todas as querys que estão sendo executadas, conforme os comandos SQL forem executados eles são exibidos na tela.

TTransaction::setLogger(new TLoggerSTD);