Importando um arquivo CSV para o MySql
Para importar uma planilha do excel para um banco de dados MySql basta salvar o arquivo como CSV, criar a tabela com as determinadas colunas e executar o seguinte comando em sql:
Para importar uma planilha do excel para um banco de dados MySql basta salvar o arquivo como CSV, criar a tabela com as determinadas colunas e executar o seguinte comando em sql:
Atualizei o meu ubuntu para a 10.04 e o meu monitor secundário (ligado por VGA, 1360×768) parou de funcionar.
Meu notebook é um ACER 5670, com a placa de vídeo ATI Radeon x1600 MOBILITY.
Depois de 3 dias batalhando, consegui finalmente corrigir o problema.
1. Abra o arquivo ‘/etc/default/grub’:
sudo gedit /etc/default/grub
2. Altere a linha:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
para
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"
3. Atualize o grub
sudo update-grub
4. Reinicie o computador
Estava tendo problemas para utilizar a cobertura de código via console no CakePHP 1.3, ao iniciar os testes com cake testsuite app all cov, recebia a seguinte mensagem de erro:
Fatal error: Class ‘CodeCoverageManager’ not found in …/cake/tests/lib/reporter/cake_base_reporter.php on line 131
Para corrigir esse problema basta adicionar a seguinte linha
require_once CAKE . ‘tests’ . DS . ‘lib’ . DS . ‘code_coverage_manager.php’;
na linha 28 do arquivo /cake/tests/lib/reporter/cake_base_reporter.php
Para instalar as fontes do windows como por exemplo Verdana, Arial, Times New Roman etc.
é só instalar o pacote msttcorefonts:
sudo apt-get install msttcorefonts
Depois disso basta reiniciar que as fontes já estarão disponíveis, se preferir não reiniciar basta reindexar as fontes do sistema com o comando:
$sudo fc-cache -fv
Quando precisei testar controllers que faziam redirect, tive problemas pois no meio do teste acabava redirecionando a tela.
Consegui achar a solução para isso no grupo de email do cakephp sobrescrevendo a função redirect no app/app_controller:
com isso, ao chamar a função redirect é verificado o valor da constante CAKE_UNIT_TEST, se for true é porque a função foi chamada no ambiente de teste e não pode redirecionar, se não ela é usada normalmente.
Para definir essa constante ainda no app_controller adiciono:
E no ambiente de testes, defino:
No caso de testes rodados pelo browser, adiciono no inicio do arquivo app/webroot/test.php,
já para testes no console, é necessário modificar o arquivo cake/console/libs/testsuite.php
Estava precisando gerar um código que fosse único e não sequencial para um sistema que estou desenvolvendo, junto com o Saulo Arruda, montei o algoritmo a seguir.
Além disso criei a tabela a seguir no banco:
No meu caso, um código de 5 dígitos atende bem (60.466.176 possibilidades) mas é simples adaptar essa função para gerar códigos maiores.
Esse algoritmo simplesmente incrementa uma posição a cada novo registro.
Utilizando esse registro primário do exemplo, os 6 próximos códigos seriam:
Adaptei o componente class.upload.php da verot para funcionar com o cakephp, a seguir irei explicar como usá-lo.
Primeiramente, baixei o componente e salvei em /app/controllers/components/upload.php
e fiz as seguintes modificações no código do meu projeto:
View: Apenas criei um campo tipo file para fazer o upload da imagem, no caso a capa de um livro
Controller: Na função que recebe o submit do form, assim que o meu objeto for salvo eu chamo a função de gerar o thumbnail.
Eu preciso salvar o objeto antes para poder gerar o id e renomea-lo para o padrão thumb_id
Model: No modelo eu criei a função para gerar o thumbnail
$dir = “img/covers/”;: diretório pra onde a imagem vai
$file = $this->id.”.”.$extension;: renomeio o arquivo para o id
$upload->image_x = 90;: defino a nova largura da imagem
$upload->image_ratio_y = true;: defino a altura proporcional a nova largura
Uma dica bem simples porém muito útil!
Já quis setar uma action como default, acessando assim apenas com controller e o id?
Por exemplo, no meu caso para visualizar produtos de uma categoria, deveria acessar o controller “categorias”, a action “view” e passar o nome da categoria (ficando assim: /categorias/view/Water)
Mas para ficar mais “user friendly”, gostaria de acessar assim: /categorias/Water.
Para fazer isso, basta alterar o arquivo de rotas (app/config/routes.php) e adicionar algo como:
Router::connect(‘/categorias/*’, array(‘controller’ => ‘categorias’, ‘action’ => ‘view’));
Uma prática necessária na hora de trabalhar com testes é trabalhar com fixtures.
Mas o que são fixtures? Fixtures são dados que são usados para se ter um controle total dos testes.
Com fixtures, não precisamos nos preocupar se um teste altera dados do banco por que a cada teste esses dados são renovados.
A implementação de fixtures no cakephp é muito simples, basta criar o arquivo app/tests/fixtures/nome-do-modelo_fixtures.php com a seguinte estrutura:
Pelo bake, o usuário pode gerar esse arquivo automaticamente, e se já existir a tabela povoada, pode importar os registros facilmente
Agora, no arquivo do teste basta incluir essa fixture com o prefixo 'app.', como por exemplo:
Após várias horas tentando implementar um upload de múltiplos arquivos de forma assíncrona no CakePHP, finalmente consegui desenvolver algo exatamente como eu queria, vou explicar a seguir como fiz:
Primeiramente baixei o plugin Uploadify do jQuery e distribui os arquivos da seguinte forma:
- /app/webroot/js/: jquery-1.3.2.min, jquery.uploadify.v2.1.0.min e swfobject
- /app/webroot/css/: uploadify.css
- app/webroot/uploadify/: uploadify.php, uploadify.swf e cancel.png
* criar uma sub-pasta chamada files(app/webroot/uploadify/files) que será usada para guardar temporariamente os arquivos de upload.
Fiz uma alteração no arquivo uploadify.php e descomentei tudo que estava comentado para verificar o tipo do arquivo e criar o diretório se não existir.
O arquivo ficará assim:
Agora na view, importarei os javascripts e css’s:
além de adicionar o código parar criar o botão de upload e o botão para limpar a fila:
no caso, o id do meu input é “Upload” e como estou no form “Book” devo referenciá-lo como “#BookUpload”
E criarei o seguinte bloco javascript:
Irei explicar algumas partes relevantes do código acima:
jQuery.noConflict();: como utilizo nessa mesma view a prototype, não posso utilizar o “$” para chamadas jquery além de ter que utilizar essa função para não gerar conflitos.
jQuery(‘#BookUpload’).uploadify({: é necessário informar o id de um input tipo “file”
‘folder’:'/uploadify/files/<?=$_SESSION["Config"]["userAgent"]?>’: Uma grande dúvida que eu tive era como eu iria relacionar um livro que ainda não foi cadastro com os arquivos subidos.
A solução que eu encontrei foi de criar uma pasta temporária com o nome de uma variável de sessão desse usuário, ou seja, enquanto o usuário estiver “em tempo de criação” de um livro, os arquivos que já foram subidos irão ficar nessa pasta temporária. Como apontado pelo Arlindo, no caso de estar rodando em uma máquina windows, deve-se utilizar o endereço completo da pasta. (‘folder’:'/app/webroot/uploadify/files/…)
‘sizeLimit’:104857600: Tamanho máximo dos arquivos em bytes (104857600b = 100mb)
‘multi’:true: Possibilidade de enviar mais de um arquivo
Para finalizar, criei uma função que eu chamo no beforeSave:
Essa função só será utilizada se o diretório identificado pela variável de sessão existir (“uploadify/files/”.$_SESSION["Config"]["userAgent"].”/”), se existir, movo os arquivos para a pasta /app/webroot/files/ (nisso eu verifico se já existe algum arquivo com o mesmo nome, caso existir, renomeio colocando um numeral no fim).
A seguir dou permissão no arquivo (chmod(“files/”.$file, 0755)) e retorno um array com o nome de todos os arquivos.
Em um próximo momento, irei procurar uma solução para deletar os arquivos que ficarem no servidor quando a sessão for destruída, no caso de uma pessoa subir arquivos mas não submeter o formulário