FORÇAR DOWNLOAD DE ARQUIVO COM JAVASCRIPT E LARAVEL PHP

Tenho um arquivo PDF hospedado no servidor onde ao clicar em um link no meu site é executada uma função javascript para baixar o PDF. Os browses atuais já tem o recurso para exibir o PDF em uma nova aba dentro do próprio browses, e por este motivo o arquivo PDF não baixa mais automaticamente, porém estava com uma demanda onde ao clicar no link seria necessário forçar o download do PDF paro o dispositivo do usuário e não exibir o mesmo no browser. Depois de muitas tentativas cheguei neste código que resolveu meu problema do dia.

No Front-end:


<a onclick="donwloadArquivo()" href="#">Baixar arquivo PDF</a>

<script>
donwloadArquivo () {
window.open('http://localhost:8000/api/forcar-download-arquivo', '_blank')
}
</script>

No Back-end:

<?php

public function forcarDownloadArquivo(){
// Caminho real do arquivo PDF
$filePath = public_path('download/Arquivo.pdf');

// Verifique se o arquivo realmente existe
if (file_exists($filePath)) {

$headers = [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="downloaded_file.pdf"',
];

return response()->download($filePath, 'Novo_Nome_Arquivo.pdf', $headers);

} else {
// Caso o arquivo não exista, você pode retornar uma resposta de erro ou redirecionar, conforme necessário.
return response()->json(['error' => 'Arquivo não encontrado'], 404);
}
}

?>

DESABILITAR FORMATAÇÃO AUTOMÁTICA AO SALVAR DO VS CODE E ESLINT

Após seguir esses passos abaixo, será desabilitado completamente a formatação automática do vs code e do ESLint ao salvar.

1- Instalar extensão ESLint:


2- Tecle Ctrl + Shift + P e pesquisar por Open User Settings


3- Abrir Menu Extensões e submenu ESLint e deixar como na imagem abaixo:


4- Abrir Menu Editor de Texto e submenu Formatação e deixar como na imagem abaixo:

5- Tecle Ctrl + ,(virgula) escreva a palavra formate na pesquisa e deixa as marcações da forma como na imagem abaixo: 

Desta forma, as formatações não serão aplicadas ao salvar.






MULTISELECT VUE.JS

Precisei de um código multselect simples em vue.js e não encontrava, então resolvi desenvolver este, onde a unica biblioteca importada foi a do VUE.JS. Veja o exemplo abaixo.

NO HTML
 
<div id="app">
    <select @change="selecionarOpcaoComboGraduacao($event)" id="graduacao">
        <option value="">--Selecione a graduação--</option>
        <option v-for="(v,index) in listaGraduacao" :value="v.id">{{v.nome}}</option>
    </select>
    <br />
 <div v-if="opcaoSelecionadaComboGraduacao.length>0">
 <table>
  <tr v-for="(v, indice) in opcaoSelecionadaComboGraduacao">
     <td >
      <input type="hidden" name="opcaoSelecionadaComboGraduacao[]" :value="v.id" />
       {{v.nome}}
     </td>
     <td> <span @click="removerOpcaoSelecionadaComboGraduacao(indice)">
                <button title="remover">X</button> </span></td>
   </tr>
  </table>
 </div>
</div>
NO JAVASCRIPT 
 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script> <script> new Vue({ el: "#app", data: { graduacao: '', listaGraduacao: [], opcaoSelecionadaComboGraduacao: [], }, created() { this.carregarGraduacaoEstatica(); //this.carregarGraduacaoDinamica(); }, methods: { carregarGraduacaoEstatica(){ this.listaGraduacao = [ {id: 1, nome: "ENGENHARIA"}, {id: 2, nome: "DIREITO"}, {id: 3, nome: "TECNOLOGIA"}, {id: 4, nome: "REDES"}, {id: 4, nome: "ADMINISTRAÇÃO"}, ] }, carregarGraduacaoDinamica(){ fetch('consulta-graduacao.php') .then(response => response.json()) .then(response => { this.listaGraduacao = response; })}, selecionarOpcaoComboGraduacao(e) { const indice = document.querySelector("#graduacao").selectedIndex; this.opcaoSelecionadaComboGraduacao.push({ id: e.target.value, nome: document.querySelector("#graduacao").options[indice].text }); }, removerOpcaoSelecionadaComboGraduacao(indice) { this.opcaoSelecionadaComboGraduacao.splice(indice, 1); }, } }) </script>


Se este Código do Dia lhe ajudou ou tiver qualquer dúvida ou encontrar algum erro deixe seu comentário que irei responder assim que possível. 

Obrigado pela visita.

 VAAALEU 😎👍

CONCATENAR RESULTADOS DA SUBCONSULTA PARA NÃO DUPLICAR O RESULTADO DA CONSULTA PRINCIPAL SQL

Precisei fazer uma consulta sql onde teria que trazer no mesmo resultado informações da tabela relacionada USUARIO_PARENTESCO, que continha mais de um registro relacionado a uma só linha da tabela USUARIO. De forma que o resultado da consulta principal não viesse com o NOME_USUARIO duplicado devido a tabela relacionada USUARIO_PARENTESCO retornar mais de um registro relacionada através da coluna ID_USUARIO, ao invés de usar JOIN pra relacionar a consulta principal a outra tabela, criei a subconsulta que retorna todos NOME_PARENTESCO separados por vírgula relacionados ao NOME_USUARIO.

 

Segue o exemplo abaixo.

 

  • TABELAS: 

 

---------------------------------------------
|                    USUARIO                                 |
---------------------------------------------
ID_USUARIO | NOME_USUARIO 

            01           | Nayron 
            02           | Eliane
            03           | Emanuel     


 --------------------------------------------
|       USUARIO_PARENTESCO                 |
---------------------------------------------
ID  | ID_USUARIO | NOME_PARENTESCO   
01  |             01           | Marcos    
02  |             01           | Rosilene
03  |             02
           | Jorge
04  |             02           | Alice
05  |             03           | Saymon

06  |             03           | Ayumi

 

  • CONSULTA: 

 

SELECT DISTINCT u.NOME_USUARIO,
                (
                COALESCE(
                                        (SELECT array_to_string(
                                                ARRAY(
                                            SELECT up.NOME_PARENTESCO from USUARIO_PARENTESCO up WHERE up.ID_USUARIO = u.ID_USUARIO
                                                 ),
                                            ',')
                                         ),
                                    '')
                ) AS NOME_PARENTESCO
FROM USUARIO u

 

  • RESULTADO DA CONSULTA COM SUBCONSULTA:

 

NOME_USUARIO | NOME_PARENTESCO
Nayron                      | Marcos,Rosilene
Eliane                         | Jorge,Alice
Emanuel                    | Saymon,Ayumi


Se fosse usado o JOIN para relacionar a consulta ao invés da subconsulta, o retorno mostraria duplicidade no NOME_USUARIO, como mostra o resultado abaixo:

 

NOME_USUARIO | NOME_PARENTESCO
Nayron                       | Marcos
Nayron                       | Rosilene
Eliane                          | Jorge
Eliane                          | Alice
Emanuel                     | Saymon
Emanuel                     | Ayumi 

 

Se este Código do Dia lhe ajudou ou tiver qualquer dúvida ou encontrar algum erro deixe seu comentário.que irei responder assim que possível. 

Obrigado pela visita.

VALEEEU 😎👍

 

AUTOCOMPLETE COM JQUERY E PHP SIMPLES E FÁCIL DE INSTALAR NO CÓDIGO HTML

Dessa vez precisei de um campo autocomplete na tag. Pesquisei pelo autocomplete do jquery, mas não obtive muito sucesso devido achar complicado a implementação para guardar o valor da opção escolhida, pois nem sempre o valor da opção selecionada é o mesmo do texto exibido no mesmo.

Veja o exemplo de como implementei no meu código. 

HTML: 
Aqui terá apenas que criar a tag select e adicionar no mesmo modelo identico abaixo, ressaltando que os atributos id e name da tag podem ser o nome que desejar, pois não irá impactar no autocomplete.

<select id="campo-select" name="campo-select" onclick="naytech_autocomplete(this.id)" style='width:100%;height:40px'>
                    <option>--SELECIONE--</option>
</select>


PHP:

Aqui criei um array com valores estáticos somente para mostrar o exemplo de como deve ficar o mesmo com os índices antes de retornar ao javascript. O nome dos índices é padrão, não podem ser alterados, já os seus valores podem ser alterados.

Só lembrando que esses valores também podem vim de uma consulta no banco de dados, arrumando o arrei do mesmo da forma que está abaixo antes de retornar ao javascript.

$texto = $_REQUEST['texto'];
$array[] = ['id_opcao'=>5,'opcao'=>"ActionScript"];
$array[] = ['id_opcao'=>10,'opcao'=>"AppleScript"];
$array[] = ['id_opcao'=>15,'opcao'=>"BASIC"];              
$array[] = ['id_opcao'=>20,'opcao'=>"ColdFusion"];
$array[] = ['id_opcao'=>25,'opcao'=>"Erlang"];
$array[] = ['id_opcao'=>30,'opcao'=>"Fortran"];

foreach($array as $k=>$v){
    if(stristr($v['opcao'],$texto)){
        $retorno[] = $v;
    }
}
exit(json_encode($retorno))

JAVASCRIPT


Este código é só copiar e colocar dentro do seu código javascript que está dentro arquivo onde contém o campo select. Nada pode ser alterado deste código.

function naytech_autocomplete(id){

////AQUI CRIA O CAMPO QUE SERÁ DIGITADO O TEXTO COM UM GIF LOAD CONCATENADO, LEMBRANDO DE COLOCAR O GIF NO CAMINHO CERTO INFORMADO NO IMG ABAIXO////////

$("#"+id).before("<input style='width:100%;height:40px' placeholder='digite tr&ecirc;s ou mais letras para buscar a op&ccedil;&atilde;o desejada' id='buscar-select' onkeypress=criarListaAutoComplete('"+id+"') ><img id='loadList' src='carregando.gif' style='display:none'/><ul style='list-style:none;margin:0;padding:0;background:#fff;overflow-x: auto;max-height:150px;' id='buscar-select-list' style='display:none;width:100%;border:1px solid #e0e0e0'></ul>");
$("#"+id).css("display","none");
$("#buscar-select").focus();

///////AQUI ENTRA QUANDO FOR APAGANDO O TEXTO DO CAMPO, CADA VEZ Q APAGAR UMA LETRA A CONSULTA É REFEITA
$('#buscar-select').keydown(function(e) {
if (e.keyCode === 8 || e.keyCode === 46) ///tecla de backspace e delete
        {
           $("#"+id).html("<option selected value=''>--SELECIONE--</option>");
           criarListaAutoComplete(id);
          }
});
                
}<!-- FECHA A FUNÇÃO naytech_autocomplete -->

 
function opcaoSelecionado(id,id_select){

////AQUI COLOCA NA TAG SELECT A OPCAO ESCOLHIDA. ESTE CAMPO FICA ESCONDIDO, POIS FICA APARECENDO SOMENTE O INPUT ONDE É DIGITADO O TEXTO DA PESQUISA, MAIS NA HORA DO SUBMIT O VALOR DA TAG SELECT É RECONHECIDO

            var texto = $("li#li_"+id).text();
            var cd = $("li#li_"+id).attr("value");
            $("#buscar-select").val(texto);
            $("ul#buscar-select-list").hide().html("");
            $("select#"+id_select).html('<option selected value="' +cd + '">' + texto + '</option>');
}<!-- FECHA A FUNÇÃO
opcaoSelecionado-->
       
function criarListaAutoComplete(id_select){
               setTimeout(function(){
                var texto = $("#buscar-select").val();
                var idSelect = $("#"+id_select).attr("id");
                if (texto.length >= 3) { ////limita a busca na base a partir de 3 letras digitadas
                    $.ajax({
                        url: "listar-opcoes-select.php",
                        data: {texto: texto},
                        type:"post",
                        dataType:"json",
                        beforeSend:function (){$("#buscar-select").focus();$("img#loadList").show();},
                        complete:function(){$("img#loadList").hide();},
                        success: function (resp) {
 ////////// O RETORNO DO PHP TEM QUE SER UM ARRAY COM ESSES ÍNDICES, EXEMPLO: $array[] = array("id_opcao"=>1,"opcao"=>"Primeira opcao").
                            $("ul#buscar-select-list").hide().html("");
                            if(resp.length>0){
                                    for (var i = 0; i < resp.length; i++) {
                                        $("ul#buscar-select-list").append('<li class="buscar-select-list-li" id="li_'+i+'" onclick=opcaoSelecionado('+i+',"'+idSelect+'") style="background:#eee;cursor:pointer;margin-bottom:5px;margin-left:7px;margin-top:5px;padding:10px;margin:0;border-bottom:1px solid #fff" value="'+ resp[i].id_opcao +'">' +  resp[i].opcao + '</li>');
                                    }
                                    
                                    $("ul#buscar-select-list").show();
                                    $("ul#buscar-select-list li").mouseover(function(){
                                        $(this).css({"background":"#ccc"})
                                    }).mouseout(function(){
                                        $(this).css({"background":"#eee"})
                                    })
                            }
                        }
                    })
                }else{
                  $("ul#buscar-select-list").hide().html("");  
                }
                },100)
}
<!-- FECHA A FUNÇÃO criarListaAutoComplete-->
 

Então é isso, é só copiar este código acima em azul nos seus respectivos lugares no seu projeto e seguir a descrição que vai dar tudo certo.

Se este código lhe ajudou deixe seu comentário.
Se ainda tiver qualquer dúvida
deixe seu comentário.

VALEEEU 😎👍
 

DEFINIÇÃO DE CONFIGURAÇÃO INI_SET PARA AUMENTAR MEMÓRIA E TEMPO DE UPLOAD DE ARQUIVO EM PHP

ini_set('memory_limit', '128M'); 

ini_set('upload_max_filesize', '128M'); 

ini_set('post_max_size', '128M'); 

ini_set('file_uploads', 'On'); 

ini_set('max_execution_time', '1800'); 

ini_set('file_uploads', 'On'); 

ini_set('session.gc_maxlifetime', '3600');

REMOVER TAGS DO MEIO DE UM TEXTO COM JAVASCRIPT

Precisava remover as TAGS concatenadas a um texto vindo do banco de dados antes de exibir no HTML, então usei a função javascript replace() passando como parâmetro expressão regular.

NO HTML: 

<div id="TEXTOCOMTAG">
        <span>TEXTO COM TAGS<b> CONCATENADOS</b></span>
</div>

NO JAVASCRIPT:
var textoLimpo = $("#TEXTOCOMTAG").html().replace(/<[^>]*>?/gm, ''); 

$("#TEXTOCOMTAG").html(textoLimpo);


Resultado no HTML:
<div id="TEXTOCOMTAG">TEXTO COM TAGS CONCATENADOS</div>
////todas as tags removidas que ficam dentro do elemento  id="TEXTOCOMTAG"

 

 

Então é isso, se este código lhe ajudou deixe seu comentário.
Se ainda tiver qualquer dúvida
deixe seu comentário.

VAAALEU 😎👍

 

FORÇAR QUEBRA DE PÁGINA MPDF PHP

Em uma função que gera um documento PDF com a biblioteca mPDF, precisei forçar a quebra de página ou passar para próxima página uma parte de uma lista de registros retornadas do banco de dados. Então encontrei a tag <pagebreak /> que supriu minha necessidade.

Segue o exemplo php com mpdf:

<?php  

 

####REGISTROS QUE SERÃO ESCRITOS NA PRIMEIRA FOLHA DO PDF##### 

 

$html = '
<table>
    <tr>
          <td><b>COLUNA DA TABELA 1</b></td>
    </tr>';

foreach ($arrayDados1 as $k => $v) { ////inserir os registros vindos do banco de dados no PDF

    $html .= '
        <tr>
             <td>'.$v['
RegistrosDaCol'].'</td>
        </tr>';

}
$html .= '</table>';

$html .= '<pagebreak />'; 
///// o pulo do gato, ou melhor, o pulo da página :D

 

####REGISTROS QUE SERÃO ESCRITOS NA SEGUNDA FOLHA DO PDF#####

 

$html .= '
<table>
    <tr>
          <td><b>COLUNA DA TABELA 2</b></td>
    </tr>';

foreach ($arrayDados2 as $k => $v) { ////inserir os registros no PDF vindos do banco de dados

    $html .= '
        <tr>
             <td>'.$v['RegistrosDaCol'].'</td>
        </tr>';

}
$html .= '</table>';

 

######CONFIGURAÇÕES INICIAIS DA BIBLIOTECA mPDF para gerar o documento PDF DO HTML ACIMA######

 

require_once 'mpdf/mpdf.php';
        
$mPDF = new mPDF('utf-8', 'A4-L', '', '', 15, 15, 70, 25, 10, 13); ///Codificação UTF-8, Gerar pdf nas dimessões A4 com "L" para informar que o A4 será na posição paisagem.

 

######PEGA O HTML ESCRITO ACIMA E GRAVA NO PDF######

 

$mPDF->WriteHTML($html);


######ADICIONA CABEÇALHO NO PDF######

 

$mPDF->SetHTMLHeader('
<div style="font-size:10px;float:left;width:400px">Gerado: '.date("d/m/Y").'</div>
<div style="font-size:10px;float:right;width:400px;text-align:right">Página - {PAGENO} de {nb}</div>') ;

######ADICIONA RODAPÉ NO PDF######

 

$mPDF->SetHTMLFooter("<p style='font-size:10px;text-align:center'>Rodovia Augusto Montenegro, - Belém – Pará<br />Fone: (91) 9999-9999</p>");

######DEFINI O NOME PADRÃO DO ARQUIVO PDF A SER GERADO######


$nomeArq = 'DOCUMENTO_PDF_GERADO_'.date('YmdHis').'.pdf';

 

######PROPRIEDADE DO mPDF para gerar o PDF passando a letra "D" para forçar o Browser a fazer o Download do arquivo PDF gerado######

 

$mPDF->Output($nomeArq, 'D');

 exit(); //// É NECESSÁRIO

 

?>

 

Então é isso, se este código lhe ajudou deixe seu comentário.

Se ainda tiver qualquer dúvida deixe seu comentário.

VAAALEU :D

 

Error: Command failed: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081

Estava dando o seguinte erro após executar o comando react-native run-android para usar o emulador do Android Studio:

Error: Command failed: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081

 Então, após muito pesquisar, executei as seguintes ações para resolver este problema:


Configurando SDK do Android no Windows

No Painel de Controle do Windows, abra o item “Sistema e Segurança” ou “Sistema”, clique em “Configurações avançadas do sistema”, selecione “Variáveis de ambiente” e clique no botão “Nova variável de ambiente”, indique o nome da variável como ANDROID_HOME, adicione o caminho do Sdk como mostrado na imagem abaixo:

Prompt

Na mesma janela de "Variáveis de ambiente" no Windows, clique na variável PATH e então em "Editar". Haverá uma lista de caminhos e você deve adicionar esses dois novos caminhos no fim da lista:

  1. %ANDROID_HOME%\platform-tools
  2. %ANDROID_HOME%\tools

Se sua versão do Windows for menor que a 10 sempre coloque ponto-e-virgula ";" no final dos caminhos para eles não se juntarem

 Agora, abra seu Prompt de Comando(CMS) como administrador e execute o seguinte comando:

C:\Android\Sdk\tools\bin> .\sdkmanager.bat "platform-tools" "platforms;android-27" "build-tools;27.0.3"

*Aceite todas licenças digitando y quando necessário. 

Após realizar as ações acima, tente novamente executar o comando no Prompt de Comando e verifique se não dará mais erros no emulador do Android Studio:

C:\NomeDoSeuProjetoReactNative_cli>react-native run-android


Caso ainda esteja ocorrendo o mesmo erro, então tente mais esse procedimento abaixo:
 

Baixe e instale o java jdk.
Após
a instalação, siga os passos abaixo.

1. Abra Configurações avançadas do sistema

No Painel de Controle do Windows, abra o item “Sistema e Segurança” ou “Sistema”, clique em “Configurações avançadas do sistema”.

2. Defina a variável de ambiente JAVA_HOME

Na “janela Propriedades do Sistema”, clique em “Variáveis ​​de Ambiente”

variáveis ​​de ambiente da janela de propriedades do sistema

variáveis ​​de ambiente da janela de propriedades do sistema

Em "Variáveis ​​do sistema", clique no botão "Novo ..." e insira JAVA_HOME como "Nome da variável" e o caminho para o diretório Java JDK em "Valor da variável"

Adicionar JAVA_HOME como variável de sistema

Adicionar JAVA_HOME como variável de sistema

3. Atualize o PATH do sistema

1. Na janela "Variáveis ​​de ambiente" em "Variáveis ​​do sistema" selecione o caminho

2. Clique em “Editar…”

3. Na janela “Editar variável de ambiente” clique em “Novo”

4. Digite  %JAVA_HOME%\bin

Atualizar caminho do sistema

Atualizar caminho do sistema

4. Teste sua configuração

Abra um novo prompt de comando e digite:

  1. echo% JAVA_HOME%

isto irá imprimir o diretório que JAVA_HOME aponta ou uma linha vazia se a variável de ambiente não estiver configurada corretamente

Agora digite:

  1. javac -version

isso imprimirá a versão do compilador java se a variável Path estiver definida corretamente ou “javac não é reconhecido como um comando interno ou externo ...” caso contrário. ATUALIZAÇÃO: nos comentários abaixo há várias sugestões para executar o prompt de comando como administrador caso veja a mensagem de erro. Certifique-se de tentar esta opção

Teste JAVA_HOME e caminho do sistema

Teste JAVA_HOME e caminho do sistema

Após realizar as ações acima, tente novamente executar o comando no Prompt de Comando e verifique se não dará mais erros no emulador do Android Studio:

C:\NomeDoSeuProjetoReactNative_cli>react-native run-android

 

CONSULTAS PARA LISTAR TODAS TABELAS DE UM BANCO DE DADOS

Precisei listar todas tabelas do meu banco de dados criado no MySQL, e o exemplo abaixo me foi muito útil.

Oracle

Para listar todas as tabelas:
SELECT tablespace_name, table_name, owner FROM dba_tables;

Para listar todas as tabelas do usuário corrente:
SELECT tablespace_name, table_name, owner FROM user_tables;

Para listar todas as tabelas às quais o usuário tem acesso (sendo ele o owner (dono) ou não):
SELECT tablespace_name, table_name, owner FROM all_tables;

MySQL

Para listar todas as tabelas
SHOW TABLES [from <nome do database>];
ou
SELECT table_schema, table_name, table_type FROM information_schema.tables [WHERE table_schema = <filtro>];

DB2

Para listar todas as tabelas:
db2 list tables for all

Para listar todas as tabelas para um determinado schema (banco):
db2 list tables for schema <nome do schema>

SQL Server

Para listar todas as tabelas de todos os catálogos e schemas:
SELECT table_catalog, table_schema, table_name, table_typeFROM information_schema.tables  [WHERE table_catalog = <filtro>];

PostgreSQL (PG)

Para listar todas as tabelas:
\l ou \dt

Para listar, somente, as tables do banco/schema atual:
\dt