terça-feira, 2 de fevereiro de 2016

Route com templateUrl dinâmico

Normalmente os atributos templatetemplateUrl que vemos nos exemplos por aí retornam uma string, mas também pode ser uma function que retorna uma string e recebe um parâmetro com todos os atributos colocados no path. Então pode-se ter o seguinte:

when('/transpextraform/:idEmpresa/:id', {
    templateUrl: function(params) { 
        return 'ag0001.php?id_empresa=' + params.idEmpresa + "&id=" + params.id;
    },
    controller: 'TranspExtraCtrl'
})

Saiba mais:

sábado, 30 de janeiro de 2016

Route + reload e ng-click com bind

Estou usando route numa aplicação AngularJS de um cliente que estou dando manutenção. Usando PHP, AngularJS e Bootstrap.
Ao clicar num link imaginei que iria chamar novamente o controller mas isso não acontece pois utiliza o cache, devido isso tive que pensar de outra forma.
Então, removi o a href e usei o ng-click chamando uma função controlando se o item clicado foi o último clicado e se for o caso fazer o reload, pois limpar o cache também não resolveu.

Rotina pronta, outra situação para contornar o ng-click não aceita muito bem bind, no html até aparece certo mas ao passar para a function vai com os {{. Então tive que usar o parâmetro adicional no html com os parâmetros e a function ler este atributo do elemento target. E um outro detalhe como tenho um img dentro de uma tag a, na function ainda tive que verificar os parâmetros no parent do target porque dependendo de onde clicasse ia a img e não a tag a, ficando assim o código;

HTML
<a id='botao' ng-click="loadOption('transpextraform', $event);" 
                 data-parametros="{{::idEmpresa}}/{{item.id}}" title='Alterar'>
<img class='img_manutencao' src='../img/bt_019.gif' alt='Alterar'> ALTERAR
</a>

JS
function getTargetEvent(event) {
    return event.target || event.srcElement;
}

app.service("appService", function($rootScope, $route, $location, $http) {
    $rootScope.opcaoCorrente = {opcao: "", parametros: ""};
    
    $rootScope.loadOption = function(opcao, $event) {
        var target = $(getTargetEvent($event));
        var parametros = target.attr("data-parametros");
        
        if (!parametros) {
            parametros = target.parent().attr("data-parametros");
        }

        if (opcao === $rootScope.opcaoCorrente.opcao 
&& parametros === $rootScope.opcaoCorrente.parametros) {
            $route.reload();
        } else {
            $rootScope.opcaoCorrente.opcao = opcao;
            $rootScope.opcaoCorrente.parametros = parametros;
            
            if (parametros) {
                $location.path("/" + opcao + "/" + parametros);
            } else {
                $location.path("/" + opcao);
            }
        }
    };
});

sexta-feira, 8 de janeiro de 2016

Upper em PHP com encode

Estou dando manutenção numa app onde os .php e o banco estão em iso-8859-1 em vez de utf-8. Alguns campos precisam gravar em upper então nos inputs usei um css text-transform: uppercase; e ao gravar um strtoupper mas para minha surpresa caracteres acentuados e ç não estava dando upper. 

Procurei por algo onde eu possa informar o encode, aí apareceu o mb_strtoupper onde o segundo parâmetro é o encode desejado e caso não seja informado será usado o da app.

sexta-feira, 11 de dezembro de 2015

BlazeDS + HTTPS + Load Balancer

Quando se usa BlazeDS sobre HTTPS se recomenda usar esta configuração no services-config.xml:

<channel-definition id=”my-amf-secure” class=”mx.messaging.channels.SecureAMFChannel“>

<endpoint url=”https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure” class=”flex.messaging.endpoints.SecureAMFEndpoint “/>

Só que se você tiver um Load Balancer como foi meu caso numa aplicação de cliente na Amazon, a aplicação não vai subir. Para você saber se o servlet do Blaze (MessageBrokerServlet) subiu corretamente é só digitar no browser https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure deverá aparecer uma tela em branco.

No meu caso, não apareceu nenhuma informação na log.

Pesquisando encontrei esse link: LCDS with SSL Termination with Load Balancer fails que recommend usar AMFEndpoint em vez de SecureAMFEndpoint, isto porque a requisição do cliente até o Load Balancer irá usar HTTPS normalmente mas do Load Balancer para o servidor de aplicação normalmente será HTTP.


sábado, 3 de outubro de 2015

UTF-8 em Strings Java

Nesse post gostaria de deixar a dica de ao usar o método getBytes de String ou new String(byte[]) utilizem passando o charset UTF-8:

"qualquerString".getBytes("UTF-8");
new String("qualquerString".getBytes("UTF-8"), "UTF-8");

Enquanto estiver trabalhando no mesmo sistema operacional não terá problema, mas pode gerar comportamentos estranhos quando em sistemas operacionais diferentes.

Foi o meu caso que estava usando uma criptografia para senhas e ao mudar o server de Linux para Windows começou a retornar como senha inválida, como a aplicação só tinha mudado de servidor enquanto que o banco de dados não teve alteração estava claro que estava pegando o charset da máquina, não levou muito tempo mas já gerou um retrabalho.

Então fica dica, usem sempre UTF-8.


terça-feira, 29 de setembro de 2015

quinta-feira, 3 de setembro de 2015

Adicionando jars externos com Maven

Num projeto de Pagamento On-line que desenvolvi para um cliente não tinha usado maven, mas agora com uma demanda nova coloquei-o. Mas esse projeto depende de outros dois projetos que também tinha criado sem maven e um terceiro jar de um fornecedor externo, para não perder mais tempo procurei como poderia usar esses jars de forma mais direta.

Encontrei esse link Adding external/custom jars into Maven project, e fui direto aplicar a primeira dica: usando dependência de sistema. Ao gerar o build e publicar vi que o .war gerado não tinha os jars dos projetos externos, cheguei a conclusão que esta opção não os leva mesmo, li o artigo depois da primeira dica e afirmava o que já suspeitava.

Fui então para a segunda dica: instalando jars no repositório local do maven. Rodei o mvn install:install-file para cada um e no pom.xml removi as tags scope e systemPath e agora funcionou como queria.

Fica aí o toque, use a opção: instalando jars no repositório local do maven.