Arredondamento de números no PHP

Estava desenvolvendo a paginação do And After em PHP (utilizando o Code Igniter com Data Mapper) e para isso era necessário calcular o número de páginas que seria necessário para exibir todos os posts de uma busca, tag ou categoria. A fórmula para isso é simples:

Total de itens que serão exibidos / máximo de itens por página

No caso de paginação o arredondamento deve ser sempre para cima – a última página mesmo que não tenha o número máximo de itens, deve existir.

Jabulani

Redondinho redondinho…

Vamos ao código!

Arredondamento de um número inteiro em PHP

Bom, seguem as formas mais simples para arredondamento e escolha da forma de arredondamento (automático, para cima, para baixo) que encontei no PHP:

Arredondamento automático

Round é a função básica para arredondamento automático:

echo round(7.3);    //  7
echo round(2.999);  //  3
echo round(-6.12);  //  -6

Arredondamento para cima

No caso da paginação, utilizei ceil, que arredonda sempre para o próximo número inteiro:

echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3

Arredondamento para baixo

O floor é "o contrário" do ceil, ele arredonda para o primeiro número inteiro anterior ao número passado.

echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4

 

É isso, espero que isso tenha esclarecido a você questões sobre o arredondamento numérico em php, existem outras funções similares porém acredito que com estas 3 seja possível desenvolver o necessário no quesito "arredondar".

Espero que ajude, sugestões e críticas nos comentários! 🙂

Elementos do HTML5 funcionando no IE (6, 7, 8)

Aproveitando o tempo entre uma demana e outra comecei a estudar mais HTML 5 e a fazer uns testes de código, afinal ler não basta – pra ser ninja tem que aprender fazendo.

Um problema do uso das novas tags no Internet Explorer: como as tags "não existem" para o IE ele não permite que você estilize elas, o que impossibilitaria o uso correto de alguns elementos semânticos do HTML, afinal colocar um <article> e ter que usar uma <div> dentro para estilizar não faz sentido nenhum e suja o código sem necessidade.

Este seria um impedimento para passar a utilizar HTML 5 nos site se não fosse um work-arround que "força" o Internet Explorer a reconhecer estes novos elementos, assim eles passam a ser estilizados por qualquer CSS que você tenha atribuído a eles.

A gambiarra para que tudo fique ok é utilizar o javascript para criar estes elementos no seu documento, uma vez que eles tenham sido criados pelo javascript eles existem no seu DOM – e passam a ser estilizados.

Estilizando HTML 5 no Internet Explorer

Insira o código abaixo no <head> da sua página e toda a estilização dos elementos da lista abaixo deverá funcionar:

<!--[if IE]>
<script type="text/javascript">
document.createElement("article");
document.createElement("nav");
document.createElement("section");
document.createElement("header");
document.createElement("aside");
document.createElement("figure");
document.createElement("legend");
document.createElement("footer");
</script>
<![endif] -->

 

Pronto, agora você já pode adaptar seus htmls utilizando as novas tags do html5 sem nenhum "prejuízo" para o tempo de desenvolvimento, melhorando a semântica do seu código.

Com o HTML alterado é só mudar o CSS e começar para aplicar as classes e estilos nos novos elementos. Recomendo que você leia sobre CSS Orientado a Objetos – apesar do nome polêmico a apresentação de slides mostra uma metodologia bacana que ajuda a economizar código e facilita bastante alterações no CSS.

Acredito que em breve isso será importante para os buscadores, que possivelmente irão "ler" melhor o conteúdo da internet devido a esta segmentação e descrição mais detalhada de cada parte do conteúdo.

Dúvidas, críticas e sugestões nos comentários! 🙂

Carrinho de compras com javascript – SimpleCart

Fazia tempo que eu e a Bia planejávamos a Loja do Eu Compraria!, mas ficava apenas na idéia. Este ano começamos a nos mexer parar fazer a idéia virar projeto, e o TCC dela deu um empurrão para definição de prazo.

Um prazo curtíssimo, o desenvolvimento do back-end e a integração com front-end e PagSeguro foi feito em 4 dias (e suas devidas madrugadas) – e os bugs e funcionalidades foram sendo implementados posteriormente.

Para atender este prazo eu precisava de algumas ferramentas boas e fáceis de implementar:

  1. PagSeguro (fácil de implementar e seguro – ponto negativo é o atendimento, taxas e a impossibilidade de algumas alterações cadastrais básicas, como endereço de e-mail)
  2. SimpleCart – o motivo deste post, um carrinho de compras completo em javascript, gratuito e extremamente fácil de entender o código.

 

Feita esta introdução, vamos ao SimpleCart (trato do PagSeguro nos próximos posts sobre a ferramenta).

 

SimpleCart – Carrinho e compras em javascript

Uma ferramenta totalmente em javascript, gratuita e facilmente customizável (o código é bem fácil de entender) que permite o desenvolvimento fácil de um carrinho de compras.

Features:

  • Persistência das informações do carrinho (cookies)
  • Cálculo de frete (por item, por compra ou customizado)
  • Cálculo de taxas
  • Controle de quantidade de itens no carrinho
  • Soma do valor total (produtos, taxa e frete)

 

Configurando o SimpleCart

O primeiro passo é fazer o download do SimpleCart e adicionar o javascript necessário nas páginas que utilizarão o carrinho.

A ferramenta conta com algumas formas de check-out pré configuradas: Google Checkout, Paypal ou e-mail. Porém existe o checkout "custom", que permite que você desenvolva sua própria função para checkout.

O paypal é a função padrão (e a que vou exemplificar neste post), para isso precisamos apenas configurar nosso e-mail (o mesmo da conta no paypal) no SimpleCart.

Setando o e-mail que será usado:

<script type="text/javascript">
	simpleCart.email = "[email protected]";
</script>

 

Na variável cartHeaders você configura quais informações dos produtos serão exibidas quando este produto estiver dentro do carrinho:

simpleCart.cartHeaders = ["Name_noHeader", "Thumb_image_noHeader", "Description_noHeader", "increment_noHeader", "decrement_noHeader", "remove_noHeader", "Quantity_div_noHeader", "Price_noHeader", "Total_noHeader"];

Adicionando "_noHeader" ao final do elemento que será exibido você diz que aquele elemento não terá um "cabeçalho" no seu carrinho, no exemplo acima o carrinho não usa cabeçalho nenhum, portanto exibirá apenas as informações dos produtos adicionados ao carrinho.

Dica: os html de cada produto será montado na ordem que está confirguado por esta variável, então pense como será seu CSS para estipular a ordem correta dos elementos html do seu carrinho.

 

Html dos itens que podem ser adicionados ao carrinho

Antes de mostrar o código vamos entender o funcionamento do carrinho que você está criando. Todo o elemento (normalmente uma div) com a classe "simpleCart_shelfItem" é um produto da sua loja que pode ser adicionado ao carrinho.

Dentro dele você utiliza a classe (class) para definir o nome daquela variável do produto: preço, id, nome, descrição e qualquer outra coisa que você queira, nomeando a classe da seguinte forma: item_NomeVariavel.

Abaixo o exemplo do html de um produto, a nomenclatura das classes é auto-explicativa:

<div class="simpleCart_shelfItem">
  <h2 class="item_name">Awesome T-Shirt</h2>
  <span class="item_price">$35.95</span>
  <input class="item_quantity" value="1" type="text">
  <a href="javascript:;" class="item_add">Add to Cart</a>
</div>

Dica: você pode adicionar as classes em qualquer elemento, inclusive imagens (neste caso o valor será  o src da img). As informações dentro de alguma variável "item_var" podem ser recuperadas no seu script, use a criatividade 🙂

No local onde seu carrinho irão aparecer os produtos adicionados no carrinho você precisa do seguinte HTML:

<div class="simpleCart_items"></div>

Dentro da div acima será exibido cada produto do seu carrinho, conforme os dados informados na configuração "simpleCart.cartHeaders" e seguindo a ordem deles.

Algumas informações que podem ser exibidas, abaixo o nome da classe e a informação que ela representa:

  • simpleCart_quantity – Quantidade de itens no carrinho
  • simpleCart_total – Valor total do carrinho
  • simpleCart_finalTotal – Final total do seu carrinho
  • simpleCart_shippingCost – Valor do frete

Dica: qualquer variável do carrinho pode ser exibida usando este modelo – e você pode inserir novas variáveis caso necessite.

Pronto, com a implementação feita até aqui você consegue adicionar e remover produtos, e exibir informações de cálculo de preço e frete no seu carrinho!

 

Ações do carrinho

Agora você precisa adcionar o link para checkout, para isso também usaremos a classe:

<a href="javascript:;" class="simpleCart_checkout">Checkout</a>

E um link para limpar todos os itens do seu carrinho:

<a href="javascript:;" class="simpleCart_empty">Empty</a>

Com isso seu carrinho estará funcionando – no exemplo deste post com o checkout do Paypal (padrão).

Você pode ver o demo aqui e conferir ele funcionando com algumas implementações a mais no Eu Compraria! Shop.

Em breve eu faço mais posts exemplificando como customizar o checkout, integrar o carrinho com ferramentas de cálculo de frete ou pagamento.

 

Se tiver dúvidas, críticas ou sugestões utilize os comentários!

Encode e decode de URLs no Javascript

Quando me enviaram o link para uma oportunidade de emprego que resultou no post da vaga de php, o link era "codificado", era uma string que você tinha que decodificar para acessar as informações daquela super vaga de emprego.

Dei uma pesquisada sobre encode e decode de url com o javascript e encontrei uma função nativa que pode ser útil na montagem de URL´s para requisições feitas com ajax. );

encodeURIComponent

O encodeURIComponent é uma função que recebe um único parâmetro, a string que é a url que você vai codificar. A função transforma em código os caracteres especiais.

decodeURIComponent

O contrário da função acima, transforma os códigos novamente em caracteres especiais.

Exemplo:

<script language="javascript">
  var url = "https://andafter.org";
  alert("Encode : " + encodeURIComponent(url));
  alert("Decode: " + decodeURIComponent(url));
</script>

Variáveis multiline no javascript

É cada vez mais comum manipular uma quantidade enorme de html através do Javascript, seja usando Ajax ou apenas alterando elementos estáticos do html.

Alguns códigos que eu vejo tem "tripas" gigantescas de código html tudo na mesma linha, para se manter dentro de uma variável. Identação zero, não precisa dizer que o código é praticamente ilegível, né?

//Exemplo de código ilegível
var structureTable = "<table><tbody><tr><td>Name</td><td>ID</td><td>Value</td><td>Tax</td><td>Quantity</td></tr><tr><td>Name</td><td>ID</td><td>Value</td><td>Tax</td><td>Quantity</td></tr></tbody></table><hr /><h2>Tabela 2</h2><table><tbody><tr><td>Name</td><td>ID</td><td>Value</td><td>Tax</td><td>Quantity</td></tr><tr><td>Name</td><td>ID</td><td>Value</td><td>Tax</td><td>Quantity</td></tr></tbody></table>";

Neste caso a estrutura nem é tão complicada, duas tabelas apenas. Mas as vezes a coisa fica FEIA quando existem blocos muito grande de HTML que devem ser manipulados pelo javascript.

Uma solução para lidar com este problema é usar Ajax e carregar o bloco de javascript de um arquivo HTML separado e inserir ele no seu DOM, mas vejo isso como uma requisição desnecessária ao servidor – você fará uma requisição para um conteúdo que não é dinâmico.

A solução que proponho para lidar com strings que são códigos de HTML são variáveis com mais de uma linha no javascript.

Variáveis multiline no javascript

A mesma "structureTable" que defini no exemplo acima vou definir agora, usando quebra de linha para variáveis do JS. Para sinalizar a quebra de linha no Javascript você só precisa usar uma barra invertida e continuar a variável na próxima linha.

//Exemplo de código legível
var structureTable = "<table>\
<tbody>\
   <tr>\
     <td>Name</td>\
     <td>ID</td>\
     <td>Value</td>\
     <td>Tax</td>\
     <td>Quantity</td>\
   </tr>\
</tbody>";

 

E pronto, você tem sua variável legível e muito mais fácil de dar manutenção depois.