Ir para conteúdo
Fórum Script Brasil

Pesquisar na Comunidade

Mostrando resultados para as tags ''Jquery''.

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • Programação & Desenvolvimento
    • ASP
    • PHP
    • .NET
    • Java
    • C, C++
    • Delphi, Kylix
    • Lógica de Programação
    • Mobile
    • Visual Basic
    • Outras Linguagens de Programação
  • WEB
    • HTML, XHTML, CSS
    • Ajax, JavaScript, XML, DOM
    • Editores
  • Arte & Design
    • Corel Draw
    • Fireworks
    • Flash & ActionScript
    • Photoshop
    • Outros Programas de Arte e Design
  • Sistemas Operacionais
    • Microsoft Windows
    • GNU/Linux
    • Outros Sistemas Operacionais
  • Softwares, Hardwares e Redes
    • Microsoft Office
    • Softwares Livres
    • Outros Softwares
    • Hardware
    • Redes
  • Banco de Dados
    • Access
    • MySQL
    • PostgreSQL
    • SQL Server
    • Demais Bancos
  • Segurança e Malwares
    • Segurança
    • Remoção De Malwares
  • Empregos
    • Vagas Efetivas
    • Vagas para Estágios
    • Oportunidades para Freelances
  • Negócios & Oportunidades
    • Classificados & Serviços
    • Eventos
  • Geral
    • Avaliações de Trabalhos
    • Links
    • Outros Assuntos
    • Entretenimento
  • Script Brasil
    • Novidades e Anúncios Script Brasil
    • Mercado Livre / Mercado Sócios
    • Sugestões e Críticas
    • Apresentações

Encontrar resultados em...

Encontrar resultados que...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


AIM


MSN


Website URL


ICQ


Yahoo


Jabber


Skype


Location


Interests

  1. Fala "Jedais"! É o seguinte: Tenho a pagina pag-form-emp-recuperar.php que contem um botão para deletar, ao clicar no botão abre um modal e o endereço passa a ser pag-form-emp-recuperar.php#openModalconfirmacao, ao clicar no confirma fecha o modal e abre outro informando que esta excluindo, aguarde..., o endereço da pagina passa a ser pag-form-emp-recuperar.php#openModalDao. O que eu faço pra abrir os modais é location.href="#openModal"; e assim com todos. Para fechar, apenas faço location.href="#"; e a pagina fica pag-form-emp-recuperar.php# O PROBLEMA é que as vezes quando clico para deletar, a janela abre e fecha sozinha, pois o endereço entra sozinho em pag-form-emp-recuperar.php#, igual quando fecho o modal. O que devo fazer para resolver isso? Desde já agradeço, aos amigos Jedis.
  2. Fala "Jedais"! É o seguinte: Tenho a pagina pag-form-emp-recuperar.php que contem um botão para deletar, ao clicar no botão abre um modal e o endereço passa a ser pag-form-emp-recuperar.php#openModalconfirmacao, ao clicar no confirma fecha o modal e abre outro informando que esta excluindo, aguarde..., o endereço da pagina passa a ser pag-form-emp-recuperar.php#openModalDao. O que eu faço pra abrir os modais é location.href="#openModal"; e assim com todos. Para fechar, apenas faço location.href="#"; e a pagina fica pag-form-emp-recuperar.php# O PROBLEMA é que as vezes quando clico para deletar, a janela abre e fecha sozinha, pois o endereço entra sozinho em pag-form-emp-recuperar.php#, igual quando fecho o modal. O que devo fazer para resolver isso? Desde já agradeço, aos amigos Jedis.
  3. Fala "Jedais"! É o seguinte: Tenho a pagina pag-form-emp-recuperar.php que contem um botão para deletar, ao clicar no botão abre um modal e o endereço passa a ser pag-form-emp-recuperar.php#openModalconfirmacao, ao clicar no confirma fecha o modal e abre outro com o dizendo que esta deletando, o endereço da pagina passa a ser pag-form-emp-recuperar.php#openModalDao. O que eu faço pra abrir os modais é location.href="#openModal"; e assim com todos. Para fechar apenas faço location.href="#"; e a pagina fica pag-form-emp-recuperar.php# O PROBLEMA é que as vezes quando clico para deletar, a janela abre e fecha sozinha, pois o endereço entra sozinho em pagina fica pag-form-emp-recuperar.php#, como quando fecho o modal. O que dvo fazer para resolver isso? Desde já agradeço, aos amigos Jedis.
  4. Atualmente utilizo em meus códigos JS, a seguinte estrutura. var ysQuery = (function ($, window, document, undefined) { 'use-strict' // variáveis de acesso global var baseUrl = ''; // Métodos de acesso restrito var Private = {}, // Métodos de acesso público var Public = {} return Public }(Jquery, window, document)); Gostaria de sugestões em relação a performance na utilização deste tipo de estrutura, e melhorias. Abraço
  5. Pessoal, vou tentar ser o mais breve possível. Tenho esses arquivos: - cidades.ajax.php - index.php - db_cidades.php db_cidades: <?php $con = mysqli_connect('localhost', 'adwpbeta', '46ocs7aA1J'); if (!$con) { die("Falha ao conectar o banco de dados: ". mysqli_error()); } $db = mysqli_select_db($con, 'adwpbeta_select_cidades'); if (!$db) { die("Falha ao selecionar banco de dados: ". mysqli_error()); } //mysqli_set_charset('utf8', $con); ?> cidades.ajax.php <?php include('db_cidades.php'); header( 'Cache-Control: no-cache' ); header( 'Content-type: application/xml; charset="utf-8"', true ); //mysql_set_charset('utf8', $con); mysql_query("SET NAMES 'utf8'", $con); mysql_query('SET character_set_connection=utf8', $con); mysql_query('SET character_set_client=utf8', $con); mysql_query('SET character_set_results=utf8', $con); $cod_estados = mysqli_real_escape_string( $_REQUEST['cod_estados'] ); $cidades = array(); $sql = "SELECT cod_cidades, nome FROM cidades WHERE estados_cod_estados=$cod_estados ORDER BY nome"; $res = mysqli_query($con, $sql); while ( $row = mysqli_fetch_assoc( $res ) ) { $cidades[] = array( 'cod_cidades' => $row['cod_cidades'], 'nome' => $row['nome'], ); } echo( json_encode( $cidades ) ); ?> index.php <?php include('db_cidades.php'); ?> <html> <head> <!--<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>--> <link rel="stylesheet" href="css/bootstrap.css"> <link href="https://fonts.googleapis.com/css?family=Montserrat:100,300,400,500,600,700" rel="stylesheet"> <title>Exemplo: Populando selects de cidades e estados com AJAX (PHP e jQuery) </title> <style type="text/css"> *, html { font-family: 'Montserrat', sans-serif; margin: 0px; padding: 0px; font-size: 12px; } label {font-weight:300;font-size:18px;} a { color: #0099CC; } body { margin: 10px; } .carregando{ color:#666; display:none; } </style> </head> <body> <div class="container"> <div class="form-group"> <div class="col-md-6"> <label for="cod_estados">Estado:</label> <select name="cod_estados" id="cod_estados" class="form-control"> <option value=""></option> <?php $sql = "SELECT cod_estados, sigla FROM estados ORDER BY sigla"; $res = mysqli_query($con, $sql); while ( $row = mysqli_fetch_assoc( $res ) ) { echo '<option value="'.$row['cod_estados'].'">'.$row['sigla'].'</option>'; } ?> </select> </div> <div class="col-md-6"> <label for="cod_cidades">Cidade:</label> <span class="carregando">Aguarde, carregando...</span> <select name="cod_cidades" id="cod_cidades" class="form-control"> <option value="">-- Escolha um estado --</option> </select> <script src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load('jquery', '1.6.1'); </script> <script type="text/javascript"> $(function(){ $('#cod_estados').change(function(){ if( $(this).val() ) { $('#cod_cidades').hide(); $('.carregando').show(); $.getJSON('cidades.ajax.php?search=',{cod_estados: $(this).val(), ajax: 'true'}, function(j){ var options = '<option value=""></option>'; for (var i = 0; i < j.length; i++) { options += '<option value="' + j.cod_cidades + '">' + j.nome + '</option>'; } $('#cod_cidades').html(options).show(); $('.carregando').hide(); }); } else { $('#cod_cidades').html('<option value="">– Escolha um estado –</option>'); } }); }); </script> </div> </div> </div> <script src="js/bootstrap.js"></script> <!--<script src="js/jquery-1.11.3.js"></script> --> </body> </html> O problema é o seguinte: A listagem dos estados ocorre normalmente. Mas, ao selecionar o estado as cidades ficam carregando eternamente ou carregam e não mostram nada. Subi para esse servidor, para quiser ver o funcionamento: http://adwpbeta.tk/select-cidades/ Agradeço desde já qualquer ajuda.
  6. Amigos, Criei um datatable para apresentar o resultado de uma consulta. Preciso capturar o conteúdo de uma determinada célula (o código de um produto, por exemplo) quando uma determinada linha for selecionada pelo usuário (para permitir que aquele registro seja editado). Não conheço as propriedades do objeto e estou apanhando para resolver este problema. Quem puder me ajudar, agradeço muito. Abaixo está o código. var obj_editor; obj_editor = new $.fn.dataTable.Editor({ "ajaxUrl": "./cm_magento.php", "domTable": "#id_tabela1", "fields": [ { "label": "Descrição:", "name": "st_descricao_ppj" } ] }); var oTabela = $("#id_tabela1").dataTable(); oTabela.dataTable({ "sDom": "<'row'<'col-sm-6'T><'col-sm-6'f>r>t<'row'<'col-sm-6'i><'col-sm-6'p>>", // Paginação "sAjaxSource": "./cm_magento.php", "sServerMethod": "POST", "fnServerParams": function (aoData) { aoData.push({"name": "str_chave", "value": "consulta_produto_validacao"}, {"name": "txt_id_opcao", "value": str_filtro}); }, "bServerSide": false, "bAutoWidth": false, "bDestroy": true, "aoColumns": [ {"mData": "st_sku"}, {"mData": "st_descricao_ppj"}, {"mData": "st_barra"}, {"mData": "st_erp_codigo"}, {"mData": "dt_validacao", "sClass": "center"}, {"mData": "st_nome_valida"}, {"mData": "st_status"} ], "oTableTools": { "sRowSelect": "single", // single ou multi "aButtons": [ {"sExtends": "text", "fnSelect": function (nButton, oConfig, nRow) { // Acredito que a solução esteja aqui... } } ] } });
  7. Fala galera. Em uma pagina são carregados registros de um bd. Para cada registro há 1 botão 'abrir' 2 'campos de textos' e um botão 'atualizar'. O botão abrir é o único habilitado, os demais componentes estão desabilitados (impedindo que o usuário os manipulem). O que eu quero é: que ao clicar no botão abrir, os campos de textos e o botão atualizar fiiquem habilitados, agora o usuário poderá fazer a atualização dos dados contidos nos campos de textos, e o bd é atualizado ao clicar no botão atualizar. NÃO estou conseguindo fazer que ao clicar por exemplo no 3° botão abrir, abra somente o 3° campo e o 3° bt atualizar. Consigo fazer com php, todavia a pagina vai dar um refresh apenas para isso, então quero fazer em JS ou JQuery, como faço? Desde já obrigado.
  8. Bom dia pessoal, eu estou tentando carregar uma lista sem dar refresh, e para isso estou usando o ajax com o jquery, segue o codigo. function listarUsuarios() { var form = event.srcElement.form; if ((trim(form.idPostoFilialSelecionado.value) == "") && (form.idPostoFilialSelecionado.selectedIndex < 2)) { alert(msg1); return false; } $(document).ready(function(e) { $("form[ajax=true]").submit(function(e) { e.preventDefault(); var form_data = $(this).serialize(); var form_url = $(this).attr("action"); var form_method = $(this).attr("method").toUpperCase(); $.ajax({ url: form_url, type: form_method, data: form_data, cache: false, success: function(){ $("#principal").load(form_url); } }); } )}) } Segue o html abaixo: <form method="post" action="ListarUsuarios.sma" ajax="true"> <!-- Titulo --> <div class="title">Consulta de Usuários</div> <!-- Search Parameters --> <div class="search"> <table class="searchTable" cellpadding="4" cellspacing="0" border="0"> <tr> <td width="30%" class="label">Posto / Filial:</td> <td width="50%"> <lay:select property="idPostoFilialSelecionado" bean="webBean" list="listaPostoFilial" title="true" discard="true" style="width:100%;"> <lay:option valueprop="id" textlast="pontoDeVenda"/> </lay:select> </td> <td width="20%">&nbsp;</td> </tr> <tr> <td width="30%" class="label">Tipo de Visão:</td> <td width="50%"> <select id="visao" name="idTipoVisaoSelecionado" width:"100%"> <option value="">Selecione ...</option> <option value="">-------------------------------------------------------------------------------------------</option> <option value="P" <%=(webBean.getIdTipoVisaoSelecionado() != null) ? ((webBean.getIdTipoVisaoSelecionado().equals("P")) ? "selected" : "") : ""%>>Posto / Filial</option> <option value="C" <%=(webBean.getIdTipoVisaoSelecionado() != null) ? ((webBean.getIdTipoVisaoSelecionado().equals("C")) ? "selected" : "") : ""%>>Cliente</option> <option value="A" <%=(webBean.getIdTipoVisaoSelecionado() != null) ? ((webBean.getIdTipoVisaoSelecionado().equals("A")) ? "selected" : "") : ""%>>Administrador - Sem Restrições</option> <option value="G" <%=(webBean.getIdTipoVisaoSelecionado() != null) ? ((webBean.getIdTipoVisaoSelecionado().equals("G")) ? "selected" : "") : ""%>>Gerência de Conta</option> </select> </td> <td width="20%"><input name="listar" type="submit" class="optionButton" value="Listar" onclick="listarUsuarios();"></td> </tr> </table> </div> O engraçado é que no chrome funciona. OBS: Já tentei alterar o atributo type ="button" e já tentei colocar return false; após a função listarUsuarios(); dentro do atrbuto onclick. Agradeço desde já se alguém puder me ajudar a resolver esse erro. Estou travado aqui no trabalho. Um grande abraço e uma ótima sexta a todos. :) O resultado esperado é que ele chame um evento dentro da div #principal.
  9. Boa tarde amigos, tenho o seguinte trecho de código: $('#salvarLote').click(function(){ $("#table tr").each(function(){ codBarras += $($(this).find("td")[2]).text().trim()+';'; }); //alert(codBarras); $('.aviso').append('Malotes Salvos !'); $('#CodigoBarrasModal').html(codBarras); }); Como podem verificar tenho um botão SalvarLote que quando clicado busco as informações de uma coluna em uma Table e as guardo em uma variável chamada codBarras que seria uma concatenação de vários códigos de barras em uma única string, que, posteriormente é enviado para um Input do tipo Hidden chamado CodigoBarrasModal. o problema é que a saída dele está vindo assim: ";123;123;123;123;;" Neste exemplo digitei no input varias vezes o valor 123 como teste. Já realizei a troca de: $('#CodigoBarrasModal').html(codBarras); Para $('#CodigoBarrasModal').val(codBarras); Porém o retorno da string é o mesmo. Gostaria de separar por virgula apenas a partir do primeiro incremento e no final não concatenar um ';'. EX: 123;123;123. Estou meio perdido na lógica e gostaria da ajuda de vocês. Desde já muito obrigado !
  10. Projeto ASP.NET MVC 4 com ANGUJAR JS. Tenho uma missão que estou tentando descobrir primeiro pelo JavaScript/JQuery, mas o problema envolve a camada do MVC também. É a seguinte: 1) tenho uma View que possui uma caixa de texto que será preenchida com o "bipe" (pistolado) de um código de barras (com o número de um recibo) executado pelo usuário. Por este motivo, a caixa de texto deve ter sempre o "foco", por causa da "bipagem". 2) No evento "enter" (View) desta "caixa de texto" acionamos uma function no Angular que chama uma ActionResult na controller (verifica no banco de dados se o recibo pistolado é válido) e retorna um boolean via JSON para o Angular. 4) Na sequencia, se for verdadeiro, executa o commit deste form via Angular (a action deste form, chama outra controller e ActionResult que será exibida na sequencia). Caso seja false, exibe uma mensagem na tela do próprio form (via Angular). 3) No item 4, quando é true e chama a 2ª View e Controller, executa na sequencia, a impressão do html (formulário preenchido com dados do banco de dados), fecha este 2º form e retorna para a 1ª View com o foco na caixa de texto. Toda essa parte estava funcionando! O desafio que recebi: - O usuário deste site é um operário de uma fábrica e "bipa" os códigos de barra em alta velocidade, sem olhar para a tela. Em alguns momentos em que o sistema está processando os dados, ou quando ocorre um erro na impressora, a caixa de texto perde o foco e a bipagem é perdida. Consequência: - A minha missão é resolver este problema de bipagem/foco para que o operário possa executar esta impressão em alta velocidade, como é realizado atualmente em outro sistema desktop que será substituído. Teria alguma dica de como eu poderia realizar esta missão? Desde já muito obrigada.
  11. Projeto ASP.NET MVC 4 com ANGUJAR JS. Tenho uma missão que estou tentando descobrir primeiro pelo JavaScript/JQuery, mas o problema envolve a camada do MVC também. É a seguinte: 1) tenho uma View que possui uma caixa de texto que será preenchida com o "bipe" (pistolado) de um código de barras (com o número de um recibo) executado pelo usuário. Por este motivo, a caixa de texto deve ter sempre o "foco", por causa da "bipagem". 2) No evento "enter" (View) desta "caixa de texto" acionamos uma function no Angular que chama uma ActionResult na controller (verifica no banco de dados se o recibo pistolado é válido) e retorna um boolean via JSON para o Angular. 4) Na sequencia, se for verdadeiro, executa o commit deste form via Angular (a action deste form, chama outra controller e ActionResult que será exibida na sequencia). Caso seja false, exibe uma mensagem na tela do próprio form (via Angular). 3) No item 4, quando é true e chama a 2ª View e Controller, executa na sequencia, a impressão do html (formulário preenchido com dados do banco de dados), fecha este 2º form e retorna para a 1ª View com o foco na caixa de texto. Toda essa parte estava funcionando! O desafio que recebi: - O usuário deste site é um operário de uma fábrica e "bipa" os códigos de barra em alta velocidade, sem olhar para a tela. Em alguns momentos em que o sistema está processando os dados, ou quando ocorre um erro na impressora, a caixa de texto perde o foco e a bipagem é perdida. Consequência: - A minha missão é resolver este problema de bipagem/foco para que o operário possa executar esta impressão em alta velocidade, como é realizado atualmente em outro sistema desktop que será substituído. Teria alguma dica de como eu poderia realizar esta missão? Desde já muito obrigada.
  12. Bom dia, No meu trabalho foi implantado um sistema de leitor biométrico para controle de saída e entrada de pessoal. Tal sistema dispõe de uma API, que dá acesso aos seus dados. Toda API está em Ajax com JQuery. Eu olhei no W3Schools no site https://www.w3schools.com/jquery/ajax_ajax.asp e aprendi como se faz isso. Este é o código da API: $.ajax({ url: "/login.fcgi", type: 'POST', contentType: 'application/json', data: JSON.stringify({ login: 'admin', password: 'admin' }), success: function(data) { session = data.session; } }); Sendo assim, fiz o seguinte HTML: <!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script> $(document).ready(function(){ $("button").click(function(){ $.ajax({ url: "http://10.3.48.199/login.fcgi", type: 'POST', contentType: 'application/json', data: JSON.stringify({ login: 'admin', password: 'admin' }), success: function(data) { session = data.session; } }); }); }); </script> </head> <body> <button>Teste</button> </body> </html> Entretanto, quando clico no botão, ele, no console, me dá erros de CORS. Pesquisei no internet e acrescentei a seguinte linha abaixo da linha da url: "Access-Control-Allow-Origin: *,". Isso retirou o erro de CORS. Mas, não consigo acessar o servidor. Não aparece erro algum. Tb não aparece mensagem alguma. Já tentei dar um alert pra ver se aparecia a sessão, mas tb nada. Alguém pode me ajudar? Talvez seja erro de semântica do código.
  13. Bom dia galera , Alguem esta tendo problemas nas aplicaçoes após essa ultima atualização do Chrome? Alguem conseguiu resolver ?
  14. Aplicativo que gera App Crud para Extjs, Bootstrap, jQuery com php e Mysql. Para gerar e baixar os aplicativos acesse: http://www.dias.adm.br
  15. Galera, estou com o seguinte erro no meu template: Type PaginatePipe is part of the declarations of 2 modules: Eu estou fazendo o import do pipe PaginatePipe em 2 modulos, o que eu achava que iria funcionar normalmente, porém não funcionou, alguém sabe o que está ocorrendo? Obrigado desde já!
  16. Pessoal estou começando um projeto do zero para a minha empresa. Vou descrever basicamente como é a aplicação web: Primeiramente eu vou ter que possuir um website restrito com usuário e senha. Esse web app deve possuir um interface admin e outra para o meu cliente. No lado do admin eu preciso fazer a gestão dos usuário e algumas configurações básicas do sistema. Já na parte dos usuários eu preciso que a aplicação leia alguns dados através de uma REST API/Web Service e mostre esses dados para os clientes com possibilidade de filtragens. Funcionalidades: ADMIN: Gerenciar usuários Relatório de vendas com filtros Relatório Pagamentos/Comissionamentos Gerenciador de Arquivos de Marketing Central de Notificações (lembretes de pagamentos, usuários inativos, relatórios de vendas) - Isso tudo enviado por e-mail e mostrado no web app. Monitoramento de publicações em algumas redes sociais. (isso não é essencial vou implementar mais tarde) USUÁRIO/CLIENTE: Alterar perfil (senha, dados, etc.) Relatório de vendas com filtros Histórico de pagamentos recebidos Acesso aos materiais de Marketing Solicitação de adiantamento de pagamentos Central de notificações (Fechamento de vendas na Semana, Adiantamento, Confirmação de Adiantamento, Pedido de Adiantamento Confirmado, Pagamentos, Pagamento Efetuado, Comissão a receber, Senha Alterada, Usuário alterado) Bom basicamente é isso. Eu gostaria de saber qual a melhor linguagem para realizar tudo isso?? Já trabalhei muito com HTML, JS/jQuery, CSS. Outra dúvida que tenho é se melhor sempre alimentar o sistema lendo os dados toda vez do web service ou armazenar em um banco de dados e ler dele. Sei que pode ser dúvidas muito básica para alguns, mas gostaria de começar o projeto tendo tudo em mente e bem desenhado para não precisar refazer tudo do zero. Um detalhe é que preciso desenvolver em um tempo muito curto de 1 mês. Obrigado pela ajuda, Att.
  17. Bom dia pessoal, Já tenho o Brainstorm de uma aplicação web que vou desenvolver. Porém estou com dúvidas em qual linguagem de programação utilizar. Eu vou descrever resumidamente o que preciso e gostaria que vocês aqui do fórum com o conhecimento que tem me indiquem qual a melhor linguagem para utilizar. Bom basicamente o que vou desenvolver é um website, um portal para os parceiros da minha empresa, nele eles vão poder acompanhar relatórios das vendas que eles fizerem, compras, clientes que eles possuem, listar os pedidos, cadastrar clientes, cupons de desconto, enfim várias funcionalidades. Nesse mesmo portal eu preciso que seja possível configurar algumas métricas e limitações para esses parceiros. Resumindo eu vou pegar dados de vendas de uma plataforma online através de uma REST API ou WEBSERVICE, e trazer esses dados para os parceiros. E também vou precisar armazenar algumas informações desses parceiros em um banco de dados. O que estou pensando é em construir da seguinte forma, visto que tenho vasto conhecimento em HTML, CSS, JavaScript e um certo conhecimento em JAVA. Então eu gostaria da opinião e dica de todos vocês. Cliente-side: o basicão né, HTML + CSS + JAVASCRIPT + AJAX, ai aqui penso em utilizar um jQuery, Bootstrap, SaSS e/ou alguma biblioteca/framework para facilitar e otimizar o desenvolvimento. Aqui gostaria de algumas sugestões, ou a opinião se essa base está boa. Ajax através do jQuery será utilizado para carregar as informações através do webservice. Server-side: pensei em utilizar JAVASCRIPT através do node.js para realizar requisições no lado do servidor. Tenho conhecimento também em C, sei que é uma linguagem muito rápida, porém levaria muito tempo para desenvolver. E o que preciso é fazer esse portal para ontem. Resumindo eu gostaria de saber se consigo trabalhar tudo isso somente com o client-side. Não sei ao certo a possibilidade quanto a isso. Então, estou aberto a sugestões. Obrigado, Att.
  18. Bom dia, galera. Que a força esteja com vocês. Tudo bem? Estou com um problema em desenvolver um script de login com uso de PHP, Mysql, Javascript, jquey (baixei esse aqui compressed, production jQuery 3.1.1 ) e Html. Sou iniciante nessas linguagens e estou fazendo cursos on lines para melhorar meus conhecimentos, quem poder ajudar eu agradeço. Recentemente iniciei um curso pelo youtube do canal Desenvolvendo PHP e estou empacado num procedimento no qual não consigo proceder com o script de login, ele simplesmente não conclui a ação de click (feito em javascript) com o qual deveria gerar: "Acesso Negado" ou "Informar email" ou "Senha Inválida" ou "Email Inválido". Abaixo segue as linhas de código: Obs: foi utilizado na linguagem php requisição de Class para formulação do script. Bem vamos, lá !!!!!!! Primeiro a ConDB.class.php <?php function __autoload ($class){require_once"{$class}.class.php";} abstract class ConDB { private $cnx; private function setConn() { return is_null($this->cnx)? $this->cnx=new PDO('mysql:host=localhost;dbname=cadastro','usuario-mysql ','senha-mysql '): $this->cnx; } public function getConn() {return $this->setConn();} } ?> Segundo CRUD.class.php <?php class CRUD extends ConDB { private $query; private function prepExec($prep,$exec) { $this->query=$this->getConn()->prepare($prep); $this->query->execute($exec); } public function insert($table,$cond,$exec) { $this->prepExec('INSERT INTO '.$table.' SET '.$cond.'',$exec); return $this->getConn()->lastInsertId(); } public function select($fields,$table,$cond,$exec) { $this->prepExec('SELECT '.$fields.' FROM '.$table.' '.$cond.'',$exec); return $this->query; } public function update($table,$cond,$exec) { $this->prepExec('UPDATE '.$table.' SET '.$cond.'',$exec); return $this->query; } public function delete($table,$cond,$exec) { $this->prepExec('DElETE FROM '.$table.' '.$cond.'',$exec); } } ?> Segue de mais três class (ValidaEmail.class.php - ValidaSenha.class.php e Cripto.class.php) - Que não irei colocar o código para encurtar.... Class Login.class.php <?php class Login { private $vem,$vsh,$cpt,$crud,$email,$senha,$log,$dds; public function setLogin($email,$senha) { $this->vem=new ValidaEmail; $this->vsh=new ValidaSenha; $this->cpt=new Cripto; $this->crud=new CRUD; $this->email=$this->vem->setValidaEmail($email); $this->senha=$this->vsh->setValidaSenha($senha); $this->log=$this->senha==$senha? $this->crud->select('idUsuario','usuario','WHERE email=? AND senha=?', array($this->email,$this->cpt->setCripto($this->senha))):FALSE; if($this->email<>$email) { return $this->email; }else if($this->senha<>$senha) { return $this->senha; }else { if($this->log AND $this->log->rowCount()>0) { foreach($this->log as $this->dds) {$_SESSION['logado']=$this->dds;} }else {return 'Acesso Negado.';} } } } ?> Em html tem a requisição do script de jquery e login.js <!DOCTYPE html> <html lang="PT-br"> <head> <meta charset="UTF-8"/> <title>Login site Chances de Ouro</title> <link type="text/css" rel="stylesheet" href="../_css/login.css"/> <script type="text/javascript" src="require/js/jquery.js"></script> <script type="text/javascript" src="require/js/login.js"></script> </head> ... <main> <form action="javascript:void(0);"> <p>Login - Chances de Ouro</p> <div><label for="eLogin">E-mail:</label><input type="text" id="eLogin"></div> <div><label for="sLogin">Senha:</label><input type="password" id="sLogin"></div> <div><button onclick="fctlogin()">Entrar</button></div> <span> </span> </form> </main> Script de login.js function fctlogin() //{alert('testando');} { $.post('require/jp/jpLogin.php', { email:$('#eLogin').val(), senha:$('#sLogin').val },function(res) { if(res) $('main form span').html(res).css({color:'#f00'}); else location.href='../../admin/Admin.php'; //$('main form span').html('Logado com sucesso!!!'); //alert(res); }); } e finalmente o script elo que iria juntar o javascript com o php jpLogin.php <?php require_once"../class/ConDB.class.php"; $lgn=new Login; print $lgn->setLogin($_POST['email'],$_POST['senha']); //var_dump($lgn->setLogin('','')); ?> Alguma alma caridosa poderia me orientar em qual parte "errei". Obs: Dentro da Pasta Require estão as pastas Class, JP e JS; Em outra pasta de nome Admin encontra-se o script admin.php para o location. O script login.php assim como os arquivos em html estão fora das pastas Require e Admin. Desde já agradeço. Abraço a todos
  19. Olá pessoal, estou precisando muito da ajuda de vocês, com um sistema de autocomplete e campos dinamicos, meu autocomplete não funciona a partir do segundo campo dinâmico nem eu deixando de utilizar as tags id e substituindo por classes, vejam por favor: <script> jQuery(document).ready(function () { jQuery('.produto').autocomplete("<?= $base ?>/scripts/funcoes_produto_nfe.php", { matchContains: true, selectFirst: false }); var campos_max = 20; //max de 10 campos var x = 1; // campos iniciais jQuery('#add_field').click(function (e) { e.preventDefault(); //prevenir novos clicks if (x < campos_max) { jQuery('#listas').append('<div>\<div class="row"><div class="col-md-6 form-group">\<label class="control-label" for="te">Produto/ Serviço (*)</label><br>\ <input type="text" name="item_nfe_produto_id[]" class="form-control produto" id="produto" required="">\</div>\<div class="col-md-4 form-group"><label class="control-label" for="r">Quantidade</label><br>\ <input type="number" min="0" name="item_nfe_quantidade[]" class="form-control" id="qtd" value="1">\ </div><a href="#" class="remover_campo btn btn-danger">Remover</a>\</div>\ </div>'); x++; } }); // Remover o div anterior jQuery('#listas').on("click", ".remover_campo", function (e) { e.preventDefault(); jQuery(this).parent('div').remove(); x--; }); }); </script> <div id="listas" class="panel-body"> <div class="row"> <div class="col-md-6 form-group"> <label class="control-label" for="produto"><span class="add-on">Produto/ Serviço (*)</span></label><br> <input type="text" name="item_nfe_produto_id[]" class="form-control produto" id="" required=""> </div> <div class="col-md-4 form-group"> <label for="qtd" class="control-label">Quantidade</label> <div class="input-group input-group-sm"> <input type="number" min="0" name="item_nfe_quantidade[]" class="form-control" id="qtd" value="1"> <span class="input-group-btn"> <button type="submit" class="btn btn-primary btn-flat" id="add_field"><i class="fa fa-plus"></i> Add produto e quantidade</button> </span> </div> </div> </div> </div> Preciso fazer funcionar utilizando este código, alguém disponivel para ajudar? Preciso que o autocomplete funcione em todos os campos
  20. Olá a todos, Estou executando uma rotina no site: https://www2.sefaz.ce.gov.br/sitram-internet/masterDetailLancamento.do?method=prepareSearch Ao clicar no botão Baixar Débito abaixo não acontece nada e no console do firefox aparece o seguinte erro: TypeError: DocumentoCreditoAjaxFacade.pagarLancamentosComDae is not a function Não entendo de javascript, mas pelo que verifiquei essa função deveria está no jquery: https://www2.sefaz.ce.gov.br/sitram-internet/dwr/interface/DocumentoCreditoAjaxFacade.js A função seria esta: DocumentoCreditoAjaxFacade.pagarLancamentosComGnre = function(p0, p1, callback) { return dwr.engine._execute(DocumentoCreditoAjaxFacade._path, 'DocumentoCreditoAjaxFacade', 'pagarLancamentosComGnre', arguments); }; Existe alguma forma de contornar esse erro e executar a função sendo que não sou administrador do site?
  21. olá pessoal, ultimamente estou bolando um projeto e precisei de um efeito drag and drop, acabei achando o sortable do jQuery a solução mais viável e fácil, porém eu gostaria de salvar as posições depois de reordenadas. Usando php é bem tranquilo mas como estou usando o framework flask a solução teria que ser em python. alguém sabe como fazer isso? no momento parei nisso procurando soluções na web. $(function() { var $sortables = $("#sortMe").sortable({ stop: function() { var sortedItems = $sortables.sortable("toArray"); } }); });
  22. Fala galera blezura? Preciso de um help de voces, eu fiz um sistema de login com php e jquery, e tó com um problema, abaixo irei deixar os arquivos. http://pastebin.com/UPfmytU7 (arquivo js) http://pastebin.com/rgzdjSUS (arquivo php) Eu tenho no banco de dados dois niveis de usuarios, um admin e o outro editor, o que eu quero fazer é ao o administrador logar, carregar o menu correspondente ao administrador e ao o editor logar que carregue o menu correspondente do editor, já tentei colocar if elseif e não foi, alguém pode me dar uma ajuda por gentileza? Desde já obrigado
  23. Bom dia pessoal, estou desenvolvendo um sistema de edição de de convites pre-determinados(modelos) e não sei como posso salvar as alterações feitas pelo usuário. No caso quando o usuário mandar salvar as alterações preciso que da imagem vire um pdf e que o usuário não entre naquela tela padrão de pdf (basicamente o usuário não pode ter acesso ao pdf) Segue abaixo o modelo sem edição (como a pagina é carregada) Segue um print para poder ver como +- é a edição (Imagens só para marcação) No Canto superior tem algumas opções de edição (no futuro terá muito mais) No "Escolha o modelo" eu posso mudar a imagem de fundo( imagem caramelo escrito base) No "Escolha o texto" eu posso mudar o texto que aparece no convite, a cor da fonte, tamanho da fonte e a fonte do texto ( o texto tem o efeito de Draggable do jquery(efeito de arrasta e solta)) Onde está a imagem do tigre as setas na lateral são para poder trocar essa imagem de fundo Como eu posso salvar essas alterações feitas e salva-las como um pdf? ou até mesmo como uma imagem só, mas com alta qualidade, neste caso. Me ajudem por favor, se você tiver alguma ideia deixa ela ai.
  24. Olá companheiros, Sou novo neste forum e espero contribuir com muito conhecimento aqui ainda. mas vamos la.. PROBLEMA-OBJETIVO: enviar imagem para o servidor redimensionada para 800x544 e também uma thumbnail desta de 158x110. eu estou usando o Jquery File Upload e já consegui enviar para o meu servidor para a pasta '/anuncios/$id_anuncio', porém a imagem vai apenas redimensionada e não recortada. segue abaixo os códigos necessários: ======================================================================= ======================================================================= PÁGINA INDEX.HTML <!DOCTYPE HTML> <html lang="en"> <head> <!-- Force latest IE rendering engine or ChromeFrame if installed --> <!--[if IE]> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <![endif]--> <meta charset="utf-8"> <title>jQuery File Upload Demo</title> <meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads."> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Bootstrap styles --> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> <!-- Generic page styles --> <link rel="stylesheet" href="css/style.css"> <!-- blueimp Gallery styles --> <link rel="stylesheet" href="//blueimp.github.io/Gallery/css/blueimp-gallery.min.css"> <!-- CSS to style the file input field as button and adjust the Bootstrap progress bars --> <link rel="stylesheet" href="css/jquery.fileupload.css"> <link rel="stylesheet" href="css/jquery.fileupload-ui.css"> <!-- CSS adjustments for browsers with JavaScript disabled --> <noscript><link rel="stylesheet" href="css/jquery.fileupload-noscript.css"></noscript> <noscript><link rel="stylesheet" href="css/jquery.fileupload-ui-noscript.css"></noscript> </head> <body> <blockquote> <p>File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery.<br> Supports cross-domain, chunked and resumable file uploads and client-side image resizing.<br> Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p> </blockquote> <br> <!-- The file upload form used as target for the file upload widget --> <form id="fileupload" action="//jquery-file-upload.appspot.com/" method="POST" enctype="multipart/form-data"> <!-- Redirect browsers with JavaScript disabled to the origin page --> <noscript><input type="hidden" name="redirect" value="https://blueimp.github.io/jQuery-File-Upload/"></noscript> <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload --> <div class="row fileupload-buttonbar"> <div class="col-lg-7"> <!-- The fileinput-button span is used to style the file input field as button --> <span class="btn btn-success fileinput-button"> <i class="glyphicon glyphicon-plus"></i> <span>Add files...</span> <input type="file" name="files[]" multiple> </span> <button type="submit" class="btn btn-primary start"> <i class="glyphicon glyphicon-upload"></i> <span>Start upload</span> </button> <button type="reset" class="btn btn-warning cancel"> <i class="glyphicon glyphicon-ban-circle"></i> <span>Cancel upload</span> </button> <button type="button" class="btn btn-danger delete"> <i class="glyphicon glyphicon-trash"></i> <span>Delete</span> </button> <input type="checkbox" class="toggle"> <!-- The global file processing state --> <span class="fileupload-process"></span> </div> <!-- The global progress state --> <div class="col-lg-5 fileupload-progress fade"> <!-- The global progress bar --> <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100"> <div class="progress-bar progress-bar-success" style="width:0%;"></div> </div> <!-- The extended global progress state --> <div class="progress-extended">&nbsp;</div> </div> </div> <!-- The table listing the files available for upload/download --> <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table> </form> <!-- The blueimp Gallery widget --> <div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls" data-filter=":even"> <div class="slides"></div> <h3 class="title"></h3> <a class="prev">‹</a> <a class="next">›</a> <a class="close">×</a> <a class="play-pause"></a> <ol class="indicator"></ol> </div> <!-- The template to display files available for upload --> <script id="template-upload" type="text/x-tmpl"> {% for (var i=0, file; file=o.files; i++) { %} <tr class="template-upload fade"> <td> <span class="preview"></span> </td> <td> <p class="name">{%=file.name%}</p> <strong class="error text-danger"></strong> </td> <td> <p class="size">Processing...</p> <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div> </td> <td> {% if (!i && !o.options.autoUpload) { %} <button class="btn btn-primary start" disabled> <i class="glyphicon glyphicon-upload"></i> <span>Start</span> </button> {% } %} {% if (!i) { %} <button class="btn btn-warning cancel"> <i class="glyphicon glyphicon-ban-circle"></i> <span>Cancel</span> </button> {% } %} </td> </tr> {% } %} </script> <!-- The template to display files available for download --> <script id="template-download" type="text/x-tmpl"> {% for (var i=0, file; file=o.files; i++) { %} <tr class="template-download fade"> <td> <span class="preview"> {% if (file.thumbnailUrl) { %} <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a> {% } %} </span> </td> <td> <p class="name"> {% if (file.url) { %} <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a> {% } else { %} <span>{%=file.name%}</span> {% } %} </p> {% if (file.error) { %} <div><span class="label label-danger">Error</span> {%=file.error%}</div> {% } %} </td> <td> <span class="size">{%=o.formatFileSize(file.size)%}</span> </td> <td> {% if (file.deleteUrl) { %} <button class="btn btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}> <i class="glyphicon glyphicon-trash"></i> <span>Delete</span> </button> <input type="checkbox" name="delete" value="1" class="toggle"> {% } else { %} <button class="btn btn-warning cancel"> <i class="glyphicon glyphicon-ban-circle"></i> <span>Cancel</span> </button> {% } %} </td> </tr> {% } %} </script> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included --> <script src="js/vendor/jquery.ui.widget.js"></script> <!-- The Templates plugin is included to render the upload/download listings --> <script src="//blueimp.github.io/JavaScript-Templates/js/tmpl.min.js"></script> <!-- The Load Image plugin is included for the preview images and image resizing functionality --> <script src="//blueimp.github.io/JavaScript-Load-Image/js/load-image.all.min.js"></script> <!-- The Canvas to Blob plugin is included for image resizing functionality --> <script src="//blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script> <!-- Bootstrap JS is not required, but included for the responsive demo navigation --> <script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> <!-- blueimp Gallery script --> <script src="//blueimp.github.io/Gallery/js/jquery.blueimp-gallery.min.js"></script> <!-- The Iframe Transport is required for browsers without support for XHR file uploads --> <script src="js/jquery.iframe-transport.js"></script> <!-- The basic File Upload plugin --> <script src="js/jquery.fileupload.js"></script> <!-- The File Upload processing plugin --> <script src="js/jquery.fileupload-process.js"></script> <!-- The File Upload image preview & resize plugin --> <script src="js/jquery.fileupload-image.js"></script> <!-- The File Upload audio preview plugin --> <script src="js/jquery.fileupload-audio.js"></script> <!-- The File Upload video preview plugin --> <script src="js/jquery.fileupload-video.js"></script> <!-- The File Upload validation plugin --> <script src="js/jquery.fileupload-validate.js"></script> <!-- The File Upload user interface plugin --> <script src="js/jquery.fileupload-ui.js"></script> <!-- The main application script --> <script src="js/main.js"></script> <!-- The XDomainRequest Transport is included for cross-domain file deletion for IE 8 and IE 9 --> <!--[if (gte IE 8)&(lt IE 10)]> <script src="js/cors/jquery.xdr-transport.js"></script> <![endif]--> <script> $.blueimp.fileupload.prototype.processActions.duplicateImage = function (data, options) { if (data.canvas) { data.files.push(data.files[data.index]); } return data; }; $('#fileupload').fileupload({ processQueue: [ { action: 'loadImage', fileTypes: /^image\/(gif|jpeg|png)$/, maxFileSize: 20000000 // 20MB }, { action: 'resizeImage', maxWidth: 800, maxHeight: 555 }, {action: 'saveImage'}, {action: 'duplicateImage'}, { action: 'resizeImage', maxWidth: 180, maxHeight: 110 }, {action: 'saveImage'} ] }); </script> </body> </html> ======================================================================= ======================================================================= PÁGINA UPLOADHANDLER.PHP <?php class UploadHandler { protected $options; // PHP File Upload error message codes: // http://php.net/manual/en/features.file-upload.errors.php protected $error_messages = array( 1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini', 2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', 3 => 'The uploaded file was only partially uploaded', 4 => 'No file was uploaded', 6 => 'Missing a temporary folder', 7 => 'Failed to write file to disk', 8 => 'A PHP extension stopped the file upload', 'post_max_size' => 'The uploaded file exceeds the post_max_size directive in php.ini', 'max_file_size' => 'File is too big', 'min_file_size' => 'File is too small', 'accept_file_types' => 'Filetype not allowed', 'max_number_of_files' => 'Maximum number of files exceeded', 'max_width' => 'Image exceeds maximum width', 'min_width' => 'Image requires a minimum width', 'max_height' => 'Image exceeds maximum height', 'min_height' => 'Image requires a minimum height', 'abort' => 'File upload aborted', 'image_resize' => 'Failed to resize image' ); protected $image_objects = array(); public function __construct($options = null, $initialize = true, $error_messages = null) { require_once "../../../../includes/configuration.php"; $sql_lastID = mysql_query("SELECT id FROM veiculos ORDER BY id DESC LIMIT 1"); $ln_lastID = mysql_fetch_assoc($sql_lastID); $lastID = $ln_lastID['id']+1; //essa variavel serve para adicionar fotos de novos veiculos $pastalocal = "/../../../../../images/anuncios/".$lastID."/"; $this->response = array(); $this->options = array( 'script_url' => $this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')), 'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).$pastalocal, 'upload_url' => $this->get_full_url().$pastalocal, 'input_stream' => 'php://input', 'user_dirs' => false, 'mkdir_mode' => 0755, 'param_name' => 'files', // Set the following option to 'POST', if your server does not support // DELETE requests. This is a parameter sent to the client: 'delete_type' => 'DELETE', 'access_control_allow_origin' => '*', 'access_control_allow_credentials' => false, 'access_control_allow_methods' => array( 'OPTIONS', 'HEAD', 'GET', 'POST', 'PUT', 'PATCH', 'DELETE' ), 'access_control_allow_headers' => array( 'Content-Type', 'Content-Range', 'Content-Disposition' ), // By default, allow redirects to the referer protocol+host: 'redirect_allow_target' => '/^'.preg_quote( parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_SCHEME) .'://' .parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_HOST) .'/', // Trailing slash to not match subdomains by mistake '/' // preg_quote delimiter param ).'/', // Enable to provide file downloads via GET requests to the PHP script: // 1. Set to 1 to download files via readfile method through PHP // 2. Set to 2 to send a X-Sendfile header for lighttpd/Apache // 3. Set to 3 to send a X-Accel-Redirect header for nginx // If set to 2 or 3, adjust the upload_url option to the base path of // the redirect parameter, e.g. '/files/'. 'download_via_php' => false, // Read files in chunks to avoid memory limits when download_via_php // is enabled, set to 0 to disable chunked reading of files: 'readfile_chunk_size' => 10 * 1024 * 1024, // 10 MiB // Defines which files can be displayed inline when downloaded: 'inline_file_types' => '/\.(gif|jpe?g|png)$/i', // Defines which files (based on their names) are accepted for upload: 'accept_file_types' => '/.+$/i', // The php.ini settings upload_max_filesize and post_max_size // take precedence over the following max_file_size setting: 'max_file_size' => null, 'min_file_size' => 1, // The maximum number of files for the upload directory: 'max_number_of_files' => null, // Defines which files are handled as image files: 'image_file_types' => '/\.(gif|jpe?g|png)$/i', // Use exif_imagetype on all files to correct file extensions: 'correct_image_extensions' => false, // Image resolution restrictions: 'max_width' => null, 'max_height' => null, 'min_width' => 1, 'min_height' => 1, // Set the following option to false to enable resumable uploads: 'discard_aborted_uploads' => true, // Set to 0 to use the GD library to scale and orient images, // set to 1 to use imagick (if installed, falls back to GD), // set to 2 to use the ImageMagick convert binary directly: 'image_library' => 1, // Uncomment the following to define an array of resource limits // for imagick: /* 'imagick_resource_limits' => array( imagick::RESOURCETYPE_MAP => 32, imagick::RESOURCETYPE_MEMORY => 32 ), */ // Command or path for to the ImageMagick convert binary: 'convert_bin' => 'convert', // Uncomment the following to add parameters in front of each // ImageMagick convert call (the limit constraints seem only // to have an effect if put in front): /* 'convert_params' => '-limit memory 32MiB -limit map 32MiB', */ // Command or path for to the ImageMagick identify binary: 'identify_bin' => 'identify', 'image_versions' => array( // The empty image version key defines options for the original image: '' => array( // Automatically rotate images based on EXIF meta data: 'auto_orient' => true ), // Uncomment the following to create medium sized images: /* 'medium' => array( 'max_width' => 800, 'max_height' => 600 ), */ 'thumbnail' => array( // Uncomment the following to use a defined directory for the thumbnails // instead of a subdirectory based on the version identifier. // Make sure that this directory doesn't allow execution of files if you // don't pose any restrictions on the type of uploaded files, e.g. by // copying the .htaccess file from the files directory for Apache: //'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/thumb/', //'upload_url' => $this->get_full_url().'/thumb/', // Uncomment the following to force the max // dimensions and e.g. create square thumbnails: //'crop' => true, 'max_width' => 158, 'max_height' => 110 ) ), 'print_response' => true ); if ($options) { $this->options = $options + $this->options; } if ($error_messages) { $this->error_messages = $error_messages + $this->error_messages; } if ($initialize) { $this->initialize(); } } protected function initialize() { switch ($this->get_server_var('REQUEST_METHOD')) { case 'OPTIONS': case 'HEAD': $this->head(); break; case 'GET': $this->get($this->options['print_response']); break; case 'PATCH': case 'PUT': case 'POST': $this->post($this->options['print_response']); break; case 'DELETE': $this->delete($this->options['print_response']); break; default: $this->header('HTTP/1.1 405 Method Not Allowed'); } } protected function get_full_url() { $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 || !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0; return ($https ? 'https://' : 'http://'). (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : ''). (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME']. ($https && $_SERVER['SERVER_PORT'] === 443 || $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))). substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/')); } protected function get_user_id() { @session_start(); return session_id(); } protected function get_user_path() { if ($this->options['user_dirs']) { return $this->get_user_id().'/'; } return ''; } protected function get_upload_path($file_name = null, $version = null) { $file_name = $file_name ? $file_name : ''; if (empty($version)) { $version_path = ''; } else { $version_dir = @$this->options['image_versions'][$version]['upload_dir']; if ($version_dir) { return $version_dir.$this->get_user_path().$file_name; } $version_path = $version.'/'; } return $this->options['upload_dir'].$this->get_user_path() .$version_path.$file_name; } protected function get_query_separator($url) { return strpos($url, '?') === false ? '?' : '&'; } protected function get_download_url($file_name, $version = null, $direct = false) { if (!$direct && $this->options['download_via_php']) { $url = $this->options['script_url'] .$this->get_query_separator($this->options['script_url']) .$this->get_singular_param_name() .'='.rawurlencode($file_name); if ($version) { $url .= '&version='.rawurlencode($version); } return $url.'&download=1'; } if (empty($version)) { $version_path = ''; } else { $version_url = @$this->options['image_versions'][$version]['upload_url']; if ($version_url) { return $version_url.$this->get_user_path().rawurlencode($file_name); } $version_path = rawurlencode($version).'/'; } return $this->options['upload_url'].$this->get_user_path() .$version_path.rawurlencode($file_name); } protected function set_additional_file_properties($file) { $file->deleteUrl = $this->options['script_url'] .$this->get_query_separator($this->options['script_url']) .$this->get_singular_param_name() .'='.rawurlencode($file->name); $file->deleteType = $this->options['delete_type']; if ($file->deleteType !== 'DELETE') { $file->deleteUrl .= '&_method=DELETE'; } if ($this->options['access_control_allow_credentials']) { $file->deleteWithCredentials = true; } } // Fix for overflowing signed 32 bit integers, // works for sizes up to 2^32-1 bytes (4 GiB - 1): protected function fix_integer_overflow($size) { if ($size < 0) { $size += 2.0 * (PHP_INT_MAX + 1); } return $size; } protected function get_file_size($file_path, $clear_stat_cache = false) { if ($clear_stat_cache) { if (version_compare(PHP_VERSION, '5.3.0') >= 0) { clearstatcache(true, $file_path); } else { clearstatcache(); } } return $this->fix_integer_overflow(filesize($file_path)); } protected function is_valid_file_object($file_name) { $file_path = $this->get_upload_path($file_name); if (is_file($file_path) && $file_name[0] !== '.') { return true; } return false; } protected function get_file_object($file_name) { if ($this->is_valid_file_object($file_name)) { $file = new \stdClass(); $file->name = $file_name; $file->size = $this->get_file_size( $this->get_upload_path($file_name) ); $file->url = $this->get_download_url($file->name); foreach ($this->options['image_versions'] as $version => $options) { if (!empty($version)) { if (is_file($this->get_upload_path($file_name, $version))) { $file->{$version.'Url'} = $this->get_download_url( $file->name, $version ); } } } $this->set_additional_file_properties($file); return $file; } return null; } protected function get_file_objects($iteration_method = 'get_file_object') { $upload_dir = $this->get_upload_path(); if (!is_dir($upload_dir)) { return array(); } return array_values(array_filter(array_map( array($this, $iteration_method), scandir($upload_dir) ))); } protected function count_file_objects() { return count($this->get_file_objects('is_valid_file_object')); } protected function get_error_message($error) { return isset($this->error_messages[$error]) ? $this->error_messages[$error] : $error; } public function get_config_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); $val = (int)$val; switch ($last) { case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $this->fix_integer_overflow($val); } protected function validate($uploaded_file, $file, $error, $index) { if ($error) { $file->error = $this->get_error_message($error); return false; } $content_length = $this->fix_integer_overflow( (int)$this->get_server_var('CONTENT_LENGTH') ); $post_max_size = $this->get_config_bytes(ini_get('post_max_size')); if ($post_max_size && ($content_length > $post_max_size)) { $file->error = $this->get_error_message('post_max_size'); return false; } if (!preg_match($this->options['accept_file_types'], $file->name)) { $file->error = $this->get_error_message('accept_file_types'); return false; } if ($uploaded_file && is_uploaded_file($uploaded_file)) { $file_size = $this->get_file_size($uploaded_file); } else { $file_size = $content_length; } if ($this->options['max_file_size'] && ( $file_size > $this->options['max_file_size'] || $file->size > $this->options['max_file_size']) ) { $file->error = $this->get_error_message('max_file_size'); return false; } if ($this->options['min_file_size'] && $file_size < $this->options['min_file_size']) { $file->error = $this->get_error_message('min_file_size'); return false; } if (is_int($this->options['max_number_of_files']) && ($this->count_file_objects() >= $this->options['max_number_of_files']) && // Ignore additional chunks of existing files: !is_file($this->get_upload_path($file->name))) { $file->error = $this->get_error_message('max_number_of_files'); return false; } $max_width = @$this->options['max_width']; $max_height = @$this->options['max_height']; $min_width = @$this->options['min_width']; $min_height = @$this->options['min_height']; if (($max_width || $max_height || $min_width || $min_height) && preg_match($this->options['image_file_types'], $file->name)) { list($img_width, $img_height) = $this->get_image_size($uploaded_file); // If we are auto rotating the image by default, do the checks on // the correct orientation if ( @$this->options['image_versions']['']['auto_orient'] && function_exists('exif_read_data') && ($exif = @exif_read_data($uploaded_file)) && (((int) @$exif['Orientation']) >= 5) ) { $tmp = $img_width; $img_width = $img_height; $img_height = $tmp; unset($tmp); } } if (!empty($img_width)) { if ($max_width && $img_width > $max_width) { $file->error = $this->get_error_message('max_width'); return false; } if ($max_height && $img_height > $max_height) { $file->error = $this->get_error_message('max_height'); return false; } if ($min_width && $img_width < $min_width) { $file->error = $this->get_error_message('min_width'); return false; } if ($min_height && $img_height < $min_height) { $file->error = $this->get_error_message('min_height'); return false; } } return true; } protected function upcount_name_callback($matches) { $index = isset($matches[1]) ? ((int)$matches[1]) + 1 : 1; $ext = isset($matches[2]) ? $matches[2] : ''; return ' ('.$index.')'.$ext; } protected function upcount_name($name) { return preg_replace_callback( '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/', array($this, 'upcount_name_callback'), $name, 1 ); } protected function get_unique_filename($file_path, $name, $size, $type, $error, $index, $content_range) { while(is_dir($this->get_upload_path($name))) { $name = $this->upcount_name($name); } // Keep an existing filename if this is part of a chunked upload: $uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]); while (is_file($this->get_upload_path($name))) { if ($uploaded_bytes === $this->get_file_size( $this->get_upload_path($name))) { break; } $name = $this->upcount_name($name); } return $name; } protected function fix_file_extension($file_path, $name, $size, $type, $error, $index, $content_range) { // Add missing file extension for known image types: if (strpos($name, '.') === false && preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) { $name .= '.'.$matches[1]; } if ($this->options['correct_image_extensions'] && function_exists('exif_imagetype')) { switch (@exif_imagetype($file_path)){ case IMAGETYPE_JPEG: $extensions = array('jpg', 'jpeg'); break; case IMAGETYPE_PNG: $extensions = array('png'); break; case IMAGETYPE_GIF: $extensions = array('gif'); break; } // Adjust incorrect image file extensions: if (!empty($extensions)) { $parts = explode('.', $name); $extIndex = count($parts) - 1; $ext = strtolower(@$parts[$extIndex]); if (!in_array($ext, $extensions)) { $parts[$extIndex] = $extensions[0]; $name = implode('.', $parts); } } } return $name; } protected function trim_file_name($file_path, $name, $size, $type, $error, $index, $content_range) { // Remove path information and dots around the filename, to prevent uploading // into different directories or replacing hidden system files. // Also remove control characters and spaces (\x00..\x20) around the filename: $name = trim($this->basename(stripslashes($name)), ".\x00..\x20"); // Use a timestamp for empty filenames: if (!$name) { $name = str_replace('.', '-', microtime(true)); } return $name; } protected function get_file_name($file_path, $name, $size, $type, $error, $index, $content_range) { $name = $this->trim_file_name($file_path, $name, $size, $type, $error, $index, $content_range); return $this->get_unique_filename( $file_path, $this->fix_file_extension($file_path, $name, $size, $type, $error, $index, $content_range), $size, $type, $error, $index, $content_range ); } protected function get_scaled_image_file_paths($file_name, $version) { $file_path = $this->get_upload_path($file_name); if (!empty($version)) { $version_dir = $this->get_upload_path(null, $version); if (!is_dir($version_dir)) { mkdir($version_dir, $this->options['mkdir_mode'], true); } $new_file_path = $version_dir.'/'.$file_name; } else { $new_file_path = $file_path; } return array($file_path, $new_file_path); } protected function gd_get_image_object($file_path, $func, $no_cache = false) { if (empty($this->image_objects[$file_path]) || $no_cache) { $this->gd_destroy_image_object($file_path); $this->image_objects[$file_path] = $func($file_path); } return $this->image_objects[$file_path]; } protected function gd_set_image_object($file_path, $image) { $this->gd_destroy_image_object($file_path); $this->image_objects[$file_path] = $image; } protected function gd_destroy_image_object($file_path) { $image = (isset($this->image_objects[$file_path])) ? $this->image_objects[$file_path] : null ; return $image && imagedestroy($image); } protected function gd_imageflip($image, $mode) { if (function_exists('imageflip')) { return imageflip($image, $mode); } $new_width = $src_width = imagesx($image); $new_height = $src_height = imagesy($image); $new_img = imagecreatetruecolor($new_width, $new_height); $src_x = 0; $src_y = 0; switch ($mode) { case '1': // flip on the horizontal axis $src_y = $new_height - 1; $src_height = -$new_height; break; case '2': // flip on the vertical axis $src_x = $new_width - 1; $src_width = -$new_width; break; case '3': // flip on both axes $src_y = $new_height - 1; $src_height = -$new_height; $src_x = $new_width - 1; $src_width = -$new_width; break; default: return $image; } imagecopyresampled( $new_img, $image, 0, 0, $src_x, $src_y, $new_width, $new_height, $src_width, $src_height ); return $new_img; } protected function gd_orient_image($file_path, $src_img) { if (!function_exists('exif_read_data')) { return false; } $exif = @exif_read_data($file_path); if ($exif === false) { return false; } $orientation = (int)@$exif['Orientation']; if ($orientation < 2 || $orientation > 8) { return false; } switch ($orientation) { case 2: $new_img = $this->gd_imageflip( $src_img, defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 ); break; case 3: $new_img = imagerotate($src_img, 180, 0); break; case 4: $new_img = $this->gd_imageflip( $src_img, defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 ); break; case 5: $tmp_img = $this->gd_imageflip( $src_img, defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 ); $new_img = imagerotate($tmp_img, 270, 0); imagedestroy($tmp_img); break; case 6: $new_img = imagerotate($src_img, 270, 0); break; case 7: $tmp_img = $this->gd_imageflip( $src_img, defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 ); $new_img = imagerotate($tmp_img, 270, 0); imagedestroy($tmp_img); break; case 8: $new_img = imagerotate($src_img, 90, 0); break; default: return false; } $this->gd_set_image_object($file_path, $new_img); return true; } protected function gd_create_scaled_image($file_name, $version, $options) { if (!function_exists('imagecreatetruecolor')) { error_log('Function not found: imagecreatetruecolor'); return false; } list($file_path, $new_file_path) = $this->get_scaled_image_file_paths($file_name, $version); $type = strtolower(substr(strrchr($file_name, '.'), 1)); switch ($type) { case 'jpg': case 'jpeg': $src_func = 'imagecreatefromjpeg'; $write_func = 'imagejpeg'; $image_quality = isset($options['jpeg_quality']) ? $options['jpeg_quality'] : 75; break; case 'gif': $src_func = 'imagecreatefromgif'; $write_func = 'imagegif'; $image_quality = null; break; case 'png': $src_func = 'imagecreatefrompng'; $write_func = 'imagepng'; $image_quality = isset($options['png_quality']) ? $options['png_quality'] : 9; break; default: return false; } $src_img = $this->gd_get_image_object( $file_path, $src_func, !empty($options['no_cache']) ); $image_oriented = false; if (!empty($options['auto_orient']) && $this->gd_orient_image( $file_path, $src_img )) { $image_oriented = true; $src_img = $this->gd_get_image_object( $file_path, $src_func ); } $max_width = $img_width = imagesx($src_img); $max_height = $img_height = imagesy($src_img); if (!empty($options['max_width'])) { $max_width = $options['max_width']; } if (!empty($options['max_height'])) { $max_height = $options['max_height']; } $scale = min( $max_width / $img_width, $max_height / $img_height ); if ($scale >= 1) { if ($image_oriented) { return $write_func($src_img, $new_file_path, $image_quality); } if ($file_path !== $new_file_path) { return copy($file_path, $new_file_path); } return true; } if (empty($options['crop'])) { $new_width = $img_width * $scale; $new_height = $img_height * $scale; $dst_x = 0; $dst_y = 0; $new_img = imagecreatetruecolor($new_width, $new_height); } else { if (($img_width / $img_height) >= ($max_width / $max_height)) { $new_width = $img_width / ($img_height / $max_height); $new_height = $max_height; } else { $new_width = $max_width; $new_height = $img_height / ($img_width / $max_width); } $dst_x = 0 - ($new_width - $max_width) / 2; $dst_y = 0 - ($new_height - $max_height) / 2; $new_img = imagecreatetruecolor($max_width, $max_height); } // Handle transparency in GIF and PNG images: switch ($type) { case 'gif': case 'png': imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0)); case 'png': imagealphablending($new_img, false); imagesavealpha($new_img, true); break; } $success = imagecopyresampled( $new_img, $src_img, $dst_x, $dst_y, 0, 0, $new_width, $new_height, $img_width, $img_height ) && $write_func($new_img, $new_file_path, $image_quality); $this->gd_set_image_object($file_path, $new_img); return $success; } protected function imagick_get_image_object($file_path, $no_cache = false) { if (empty($this->image_objects[$file_path]) || $no_cache) { $this->imagick_destroy_image_object($file_path); $image = new \Imagick(); if (!empty($this->options['imagick_resource_limits'])) { foreach ($this->options['imagick_resource_limits'] as $type => $limit) { $image->setResourceLimit($type, $limit); } } $image->readImage($file_path); $this->image_objects[$file_path] = $image; } return $this->image_objects[$file_path]; } protected function imagick_set_image_object($file_path, $image) { $this->imagick_destroy_image_object($file_path); $this->image_objects[$file_path] = $image; } protected function imagick_destroy_image_object($file_path) { $image = (isset($this->image_objects[$file_path])) ? $this->image_objects[$file_path] : null ; return $image && $image->destroy(); } protected function imagick_orient_image($image) { $orientation = $image->getImageOrientation(); $background = new \ImagickPixel('none'); switch ($orientation) { case \imagick::ORIENTATION_TOPRIGHT: // 2 $image->flopImage(); // horizontal flop around y-axis break; case \imagick::ORIENTATION_BOTTOMRIGHT: // 3 $image->rotateImage($background, 180); break; case \imagick::ORIENTATION_BOTTOMLEFT: // 4 $image->flipImage(); // vertical flip around x-axis break; case \imagick::ORIENTATION_LEFTTOP: // 5 $image->flopImage(); // horizontal flop around y-axis $image->rotateImage($background, 270); break; case \imagick::ORIENTATION_RIGHTTOP: // 6 $image->rotateImage($background, 90); break; case \imagick::ORIENTATION_RIGHTBOTTOM: // 7 $image->flipImage(); // vertical flip around x-axis $image->rotateImage($background, 270); break; case \imagick::ORIENTATION_LEFTBOTTOM: // 8 $image->rotateImage($background, 270); break; default: return false; } $image->setImageOrientation(\imagick::ORIENTATION_TOPLEFT); // 1 return true; } protected function imagick_create_scaled_image($file_name, $version, $options) { list($file_path, $new_file_path) = $this->get_scaled_image_file_paths($file_name, $version); $image = $this->imagick_get_image_object( $file_path, !empty($options['crop']) || !empty($options['no_cache']) ); if ($image->getImageFormat() === 'GIF') { // Handle animated GIFs: $images = $image->coalesceImages(); foreach ($images as $frame) { $image = $frame; $this->imagick_set_image_object($file_name, $image); break; } } $image_oriented = false; if (!empty($options['auto_orient'])) { $image_oriented = $this->imagick_orient_image($image); } $new_width = $max_width = $img_width = $image->getImageWidth(); $new_height = $max_height = $img_height = $image->getImageHeight(); if (!empty($options['max_width'])) { $new_width = $max_width = $options['max_width']; } if (!empty($options['max_height'])) { $new_height = $max_height = $options['max_height']; } if (!($image_oriented || $max_width < $img_width || $max_height < $img_height)) { if ($file_path !== $new_file_path) { return copy($file_path, $new_file_path); } return true; } $crop = !empty($options['crop']); if ($crop) { $x = 0; $y = 0; if (($img_width / $img_height) >= ($max_width / $max_height)) { $new_width = 0; // Enables proportional scaling based on max_height $x = ($img_width / ($img_height / $max_height) - $max_width) / 2; } else { $new_height = 0; // Enables proportional scaling based on max_width $y = ($img_height / ($img_width / $max_width) - $max_height) / 2; } } $success = $image->resizeImage( $new_width, $new_height, isset($options['filter']) ? $options['filter'] : \imagick::FILTER_LANCZOS, isset($options['blur']) ? $options['blur'] : 1, $new_width && $new_height // fit image into constraints if not to be cropped ); if ($success && $crop) { $success = $image->cropImage( $max_width, $max_height, $x, $y ); if ($success) { $success = $image->setImagePage($max_width, $max_height, 0, 0); } } $type = strtolower(substr(strrchr($file_name, '.'), 1)); switch ($type) { case 'jpg': case 'jpeg': if (!empty($options['jpeg_quality'])) { $image->setImageCompression(\imagick::COMPRESSION_JPEG); $image->setImageCompressionQuality($options['jpeg_quality']); } break; } if (!empty($options['strip'])) { $image->stripImage(); } return $success && $image->writeImage($new_file_path); } protected function imagemagick_create_scaled_image($file_name, $version, $options) { list($file_path, $new_file_path) = $this->get_scaled_image_file_paths($file_name, $version); $resize = @$options['max_width'] .(empty($options['max_height']) ? '' : 'X'.$options['max_height']); if (!$resize && empty($options['auto_orient'])) { if ($file_path !== $new_file_path) { return copy($file_path, $new_file_path); } return true; } $cmd = $this->options['convert_bin']; if (!empty($this->options['convert_params'])) { $cmd .= ' '.$this->options['convert_params']; } $cmd .= ' '.escapeshellarg($file_path); if (!empty($options['auto_orient'])) { $cmd .= ' -auto-orient'; } if ($resize) { // Handle animated GIFs: $cmd .= ' -coalesce'; if (empty($options['crop'])) { $cmd .= ' -resize '.escapeshellarg($resize.'>'); } else { $cmd .= ' -resize '.escapeshellarg($resize.'^'); $cmd .= ' -gravity center'; $cmd .= ' -crop '.escapeshellarg($resize.'+0+0'); } // Make sure the page dimensions are correct (fixes offsets of animated GIFs): $cmd .= ' +repage'; } if (!empty($options['convert_params'])) { $cmd .= ' '.$options['convert_params']; } $cmd .= ' '.escapeshellarg($new_file_path); exec($cmd, $output, $error); if ($error) { error_log(implode('\n', $output)); return false; } return true; } protected function get_image_size($file_path) { if ($this->options['image_library']) { if (extension_loaded('imagick')) { $image = new \Imagick(); try { if (@$image->pingImage($file_path)) { $dimensions = array($image->getImageWidth(), $image->getImageHeight()); $image->destroy(); return $dimensions; } return false; } catch (\Exception $e) { error_log($e->getMessage()); } } if ($this->options['image_library'] === 2) { $cmd = $this->options['identify_bin']; $cmd .= ' -ping '.escapeshellarg($file_path); exec($cmd, $output, $error); if (!$error && !empty($output)) { // image.jpg JPEG 1920x1080 1920x1080+0+0 8-bit sRGB 465KB 0.000u 0:00.000 $infos = preg_split('/\s+/', substr($output[0], strlen($file_path))); $dimensions = preg_split('/x/', $infos[2]); return $dimensions; } return false; } } if (!function_exists('getimagesize')) { error_log('Function not found: getimagesize'); return false; } return @getimagesize($file_path); } protected function create_scaled_image($file_name, $version, $options) { if ($this->options['image_library'] === 2) { return $this->imagemagick_create_scaled_image($file_name, $version, $options); } if ($this->options['image_library'] && extension_loaded('imagick')) { return $this->imagick_create_scaled_image($file_name, $version, $options); } return $this->gd_create_scaled_image($file_name, $version, $options); } protected function destroy_image_object($file_path) { if ($this->options['image_library'] && extension_loaded('imagick')) { return $this->imagick_destroy_image_object($file_path); } } protected function is_valid_image_file($file_path) { if (!preg_match($this->options['image_file_types'], $file_path)) { return false; } if (function_exists('exif_imagetype')) { return @exif_imagetype($file_path); } $image_info = $this->get_image_size($file_path); return $image_info && $image_info[0] && $image_info[1]; } protected function handle_image_file($file_path, $file) { $failed_versions = array(); foreach ($this->options['image_versions'] as $version => $options) { if ($this->create_scaled_image($file->name, $version, $options)) { if (!empty($version)) { $file->{$version.'Url'} = $this->get_download_url( $file->name, $version ); } else { $file->size = $this->get_file_size($file_path, true); } } else { $failed_versions[] = $version ? $version : 'original'; } } if (count($failed_versions)) { $file->error = $this->get_error_message('image_resize') .' ('.implode($failed_versions, ', ').')'; } // Free memory: $this->destroy_image_object($file_path); } protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, $index = null, $content_range = null) { $file = new \stdClass(); $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error, $index, $content_range); $file->size = $this->fix_integer_overflow((int)$size); $file->type = $type; if ($this->validate($uploaded_file, $file, $error, $index)) { $this->handle_form_data($file, $index); $upload_dir = $this->get_upload_path(); if (!is_dir($upload_dir)) { mkdir($upload_dir, $this->options['mkdir_mode'], true); } $file_path = $this->get_upload_path($file->name); $append_file = $content_range && is_file($file_path) && $file->size > $this->get_file_size($file_path); if ($uploaded_file && is_uploaded_file($uploaded_file)) { // multipart/formdata uploads (POST method uploads) if ($append_file) { file_put_contents( $file_path, fopen($uploaded_file, 'r'), FILE_APPEND ); } else { move_uploaded_file($uploaded_file, $file_path); } } else { // Non-multipart uploads (PUT method support) file_put_contents( $file_path, fopen($this->options['input_stream'], 'r'), $append_file ? FILE_APPEND : 0 ); } $file_size = $this->get_file_size($file_path, $append_file); if ($file_size === $file->size) { $file->url = $this->get_download_url($file->name); if ($this->is_valid_image_file($file_path)) { $this->handle_image_file($file_path, $file); } } else { $file->size = $file_size; if (!$content_range && $this->options['discard_aborted_uploads']) { unlink($file_path); $file->error = $this->get_error_message('abort'); } } $this->set_additional_file_properties($file); } return $file; } protected function readfile($file_path) { $file_size = $this->get_file_size($file_path); $chunk_size = $this->options['readfile_chunk_size']; if ($chunk_size && $file_size > $chunk_size) { $handle = fopen($file_path, 'rb'); while (!feof($handle)) { echo fread($handle, $chunk_size); @ob_flush(); @flush(); } fclose($handle); return $file_size; } return readfile($file_path); } protected function body($str) { echo $str; } protected function header($str) { header($str); } protected function get_upload_data($id) { return @$_FILES[$id]; } protected function get_post_param($id) { return @$_POST[$id]; } protected function get_query_param($id) { return @$_GET[$id]; } protected function get_server_var($id) { return @$_SERVER[$id]; } protected function handle_form_data($file, $index) { // Handle form data, e.g. $_POST['description'][$index] } protected function get_version_param() { return $this->basename(stripslashes($this->get_query_param('version'))); } protected function get_singular_param_name() { return substr($this->options['param_name'], 0, -1); } protected function get_file_name_param() { $name = $this->get_singular_param_name(); return $this->basename(stripslashes($this->get_query_param($name))); } protected function get_file_names_params() { $params = $this->get_query_param($this->options['param_name']); if (!$params) { return null; } foreach ($params as $key => $value) { $params[$key] = $this->basename(stripslashes($value)); } return $params; } protected function get_file_type($file_path) { switch (strtolower(pathinfo($file_path, PATHINFO_EXTENSION))) { case 'jpeg': case 'jpg': return 'image/jpeg'; case 'png': return 'image/png'; case 'gif': return 'image/gif'; default: return ''; } } protected function download() { switch ($this->options['download_via_php']) { case 1: $redirect_header = null; break; case 2: $redirect_header = 'X-Sendfile'; break; case 3: $redirect_header = 'X-Accel-Redirect'; break; default: return $this->header('HTTP/1.1 403 Forbidden'); } $file_name = $this->get_file_name_param(); if (!$this->is_valid_file_object($file_name)) { return $this->header('HTTP/1.1 404 Not Found'); } if ($redirect_header) { return $this->header( $redirect_header.': '.$this->get_download_url( $file_name, $this->get_version_param(), true ) ); } $file_path = $this->get_upload_path($file_name, $this->get_version_param()); // Prevent browsers from MIME-sniffing the content-type: $this->header('X-Content-Type-Options: nosniff'); if (!preg_match($this->options['inline_file_types'], $file_name)) { $this->header('Content-Type: application/octet-stream'); $this->header('Content-Disposition: attachment; filename="'.$file_name.'"'); } else { $this->header('Content-Type: '.$this->get_file_type($file_path)); $this->header('Content-Disposition: inline; filename="'.$file_name.'"'); } $this->header('Content-Length: '.$this->get_file_size($file_path)); $this->header('Last-Modified: '.gmdate('D, d M Y H:i:s T', filemtime($file_path))); $this->readfile($file_path); } protected function send_content_type_header() { $this->header('Vary: Accept'); if (strpos($this->get_server_var('HTTP_ACCEPT'), 'application/json') !== false) { $this->header('Content-type: application/json'); } else { $this->header('Content-type: text/plain'); } } protected function send_access_control_headers() { $this->header('Access-Control-Allow-Origin: '.$this->options['access_control_allow_origin']); $this->header('Access-Control-Allow-Credentials: ' .($this->options['access_control_allow_credentials'] ? 'true' : 'false')); $this->header('Access-Control-Allow-Methods: ' .implode(', ', $this->options['access_control_allow_methods'])); $this->header('Access-Control-Allow-Headers: ' .implode(', ', $this->options['access_control_allow_headers'])); } public function generate_response($content, $print_response = true) { $this->response = $content; if ($print_response) { $json = json_encode($content); $redirect = stripslashes($this->get_post_param('redirect')); if ($redirect && preg_match($this->options['redirect_allow_target'], $redirect)) { $this->header('Location: '.sprintf($redirect, rawurlencode($json))); return; } $this->head(); if ($this->get_server_var('HTTP_CONTENT_RANGE')) { $files = isset($content[$this->options['param_name']]) ? $content[$this->options['param_name']] : null; if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) { $this->header('Range: 0-'.( $this->fix_integer_overflow((int)$files[0]->size) - 1 )); } } $this->body($json); } return $content; } public function get_response () { return $this->response; } public function head() { $this->header('Pragma: no-cache'); $this->header('Cache-Control: no-store, no-cache, must-revalidate'); $this->header('Content-Disposition: inline; filename="files.json"'); // Prevent Internet Explorer from MIME-sniffing the content-type: $this->header('X-Content-Type-Options: nosniff'); if ($this->options['access_control_allow_origin']) { $this->send_access_control_headers(); } $this->send_content_type_header(); } public function get($print_response = true) { if ($print_response && $this->get_query_param('download')) { return $this->download(); } $file_name = $this->get_file_name_param(); if ($file_name) { $response = array( $this->get_singular_param_name() => $this->get_file_object($file_name) ); } else { $response = array( $this->options['param_name'] => $this->get_file_objects() ); } return $this->generate_response($response, $print_response); } public function post($print_response = true) { if ($this->get_query_param('_method') === 'DELETE') { return $this->delete($print_response); } $upload = $this->get_upload_data($this->options['param_name']); // Parse the Content-Disposition header, if available: $content_disposition_header = $this->get_server_var('HTTP_CONTENT_DISPOSITION'); $file_name = $content_disposition_header ? rawurldecode(preg_replace( '/(^[^"]+")|("$)/', '', $content_disposition_header )) : null; // Parse the Content-Range header, which has the following form: // Content-Range: bytes 0-524287/2000000 $content_range_header = $this->get_server_var('HTTP_CONTENT_RANGE'); $content_range = $content_range_header ? preg_split('/[^0-9]+/', $content_range_header) : null; $size = $content_range ? $content_range[3] : null; $files = array(); if ($upload) { if (is_array($upload['tmp_name'])) { // param_name is an array identifier like "files[]", // $upload is a multi-dimensional array: foreach ($upload['tmp_name'] as $index => $value) { $files[] = $this->handle_file_upload( $upload['tmp_name'][$index], $file_name ? $file_name : $upload['name'][$index], $size ? $size : $upload['size'][$index], $upload['type'][$index], $upload['error'][$index], $index, $content_range ); } } else { // param_name is a single object identifier like "file", // $upload is a one-dimensional array: $files[] = $this->handle_file_upload( isset($upload['tmp_name']) ? $upload['tmp_name'] : null, $file_name ? $file_name : (isset($upload['name']) ? $upload['name'] : null), $size ? $size : (isset($upload['size']) ? $upload['size'] : $this->get_server_var('CONTENT_LENGTH')), isset($upload['type']) ? $upload['type'] : $this->get_server_var('CONTENT_TYPE'), isset($upload['error']) ? $upload['error'] : null, null, $content_range ); } } $response = array($this->options['param_name'] => $files); return $this->generate_response($response, $print_response); } public function delete($print_response = true) { $file_names = $this->get_file_names_params(); if (empty($file_names)) { $file_names = array($this->get_file_name_param()); } $response = array(); foreach ($file_names as $file_name) { $file_path = $this->get_upload_path($file_name); $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); if ($success) { foreach ($this->options['image_versions'] as $version => $options) { if (!empty($version)) { $file = $this->get_upload_path($file_name, $version); if (is_file($file)) { unlink($file); } } } } $response[$file_name] = $success; } return $this->generate_response($response, $print_response); } protected function basename($filepath, $suffix = null) { $splited = preg_split('/\//', rtrim ($filepath, '/ ')); return substr(basename('X'.$splited[count($splited)-1], $suffix), 1); } } ======================================================================= =======================================================================
  25. Boa Tarde, não tenho muito conhecimento em jquery e peguei esse codigo para estudo em outros sites. Gostaria de saber se tem como atribuir um display block, ou algum esquema no jquery para poder aparecer as quantidades de linhas conforme determinado no "IF do adicionarCampos", e aparecer automatico a quantidade certinha, tem como ? Link : https://jsfiddle.net/hgoc4p9v/8/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Adicionando linhas dinamicamente</title> <style type="text/css" media="all"> body{ font-family:Arial, Helvetica, sans-serif } #tudo{ border:#CCCCCC 1px solid;width:680px;margin:0 auto; } .bd_titulo{ text-align:center; background-color:#CCCCCC; font-weight:bold } </style> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <script type="text/javascript"> $(function () { function removeCampo() { $(".removerCampo").unbind("click"); $(".removerCampo").bind("click", function () { if($("tr.linhas").length > 1){ $(this).parent().parent().remove(); } }); } $(".adicionarCampo").click(function () { if($("tr.linhas").length < 3) { novoCampo = $("tr.linhas:first").clone() novoCampo.find("input").val(""); novoCampo.insertAfter("tr.linhas:last"); removeCampo(); } }); }); </script> </head> <body> <form method="post" name="frm_campo_dinamico" action=""> <div id="tudo"> <table border="0" cellpadding="2" cellspacing="4" > <tr><td class="bd_titulo" width="10">Qtde</td><td class="bd_titulo">Descrição</td><td class="bd_titulo">Cor</td><td class="bd_titulo">Valor R$</td></tr> <tr class="linhas"> <td><input type="text" name="qtd[]" style="text-align:center" /></td> <td><input type="text" name="descricao[]" /></td> <td> <select name="cor[]"> <option value="" selected="selected">Selecione uma cor...</option> <option value="Amarelo">Amarelo</option> <option value="Branco">Branco</option> <option value="Cinza">Cinza</option> <option value="Verde">Verde</option> </select> </td> <td><input type="text" name="valor[]" style="text-align:center" /></td> <td><a href="#" class="removerCampo" title="Remover linha"><img src="images/minus.png" border="0" /></a></td> </tr> <tr><td colspan="4"> <a href="#" class="adicionarCampo" id="adicionarCampo" name="adicionarCampo" title="Adicionar item"><img src="images/plus.png" border="0" /></a> </td></tr> <tr> <td align="right" colspan="4"><input type="submit" id="btn-cadastrar" value="Cadastrar" /></td> </tr> </table> </form> </div> </body> </html>
×
×
  • Criar Novo...