Jump to content

Search the Community

Showing results for tags 'php'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Comunidade
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
  • Comunidade a Trabalhar
    • Apresentação de Projectos de Programação
    • Downloads
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Pascal
    • Python
    • Bases de Dados
    • Dispositivos Móveis
    • Outras Linguagens
  • Desenvolvimento Orientado para Web
    • PHP
    • HTML
    • CSS
    • Javascript
    • Outras Linguagens de WebDevelopment
    • Desenvolvimento Web
  • Desenvolvimento .NET
    • C#
    • Visual Basic .NET
    • ASP.NET
    • WPF & SilverLight
  • Software e Sistemas Operativos
    • Software de Produtividade
    • Sistemas Operativos
    • Apresentação de Software
  • Informática
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica e Automação Industrial
    • Matemática
    • Software de Contabilidade, Finanças e Admin. Pública
    • Dúvidas e Discussão de Programação
    • Tutoriais
    • Snippets / Armazém de Código
  • Outras Áreas
    • Notícias de Tecnologia
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

  • Blog dos Moderadores
  • Eventos
  • Notícias de Tecnologia
  • Blog do Staff
  • Revista PROGRAMAR
  • Projectos
  • Wiki

Categories

  • Revista PROGRAMAR
  • Tutoriais
  • Textos Académicos
  • Exercícios Académicos
    • Exercícios c/ Solução
    • Exercícios s/ Solução
  • Bibliotecas e Aplicações
  • Outros

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website


GitHub


LinkedIn


Mastodon


X


Facebook

  1. Boa noite a todos, hoje passei o dia todo tentando entender o porque um formulário funciona e outro não. Tenho dois Formulários RP-5075 que esta sendo impresso e preenche todos os campos, com a pesquisa do meu banco de dados, ja o formulário RP-5076 é gerado mas não aparece preenchido. Se alguém conseguir intender ou ajudar, agradeço. Formulário RP-5075 <?php namespace App\adms\Models\generatePdf; use Core\Model; use mikehaertl\pdftk\Pdf; if (!defined('SENHAAQUI')) { header('Location:/'); die('Erro: Página não encontrada'); } class RP5075 extends Model { private bool $result = false; private array|null $resultBd; private int|string|null $id; private string $errorMessage = ''; public function getResult(): bool { return $this->result; } public function getErrorMessage(): string { return $this->errorMessage; } private function lerSql(int $id): void { $this->id = $id; $viewUser = new \App\adms\helpers\AdmsRead(); // 1. Primeira Leitura: Dados do Funeral, Cônjuge e tabelas gerais $viewUser->fullRead('SELECT funeral.id, funeral.processo, funeral.name AS name_falecido, funeral.data_nascimento, funeral.beneficiario1, funeral.data_obito, funeral.name_cliente, funeral.morada_cliente, funeral.localidade_cliente, funeral.codigo_postal_cliente AS cp_cliente, funeral.telemovel_cliente, funeral.email_cliente,funeral.data_nasc_cliente, funeral.numero_nif_cliente, funeral.beneficiario1_cliente, funeral.adms_genero_cliente_id, funeral.adms_estado_civil_cliente_id, funeral.adms_dist_cliente_id, funeral.adms_conc_cliente_id, funeral.adms_freg_cliente_id, funeral.adms_parentesco_cliente_id, genero.name_genero AS name_genero, civil.name_estado AS name_estado, saudacao.saudacao AS name_saudacao FROM adms_funerais AS funeral LEFT JOIN adms_saudacao AS saudacao ON saudacao.id=funeral.adms_saudacao_id LEFT JOIN adms_generos AS genero ON genero.id=funeral.adms_genero_id LEFT JOIN adms_estado_civil AS civil ON civil.id=funeral.adms_estado_civil_id WHERE funeral.id=:id LIMIT 1', "id={$this->id}"); $this->resultBd = $viewUser->getResult(); if ($this->resultBd) { // 2. Segunda Leitura: JOINs do Cliente $readCliente = new \App\adms\helpers\AdmsRead(); $readCliente->fullRead( 'SELECT genero_cliente.name_genero AS name_genero_cliente, estado_civil_cliente.name_estado AS estado_civil_cliente, dist_cliente.name_distrito AS name_distrito_cliente, conc_cliente.name_concelho AS name_concelho_cliente, freg_cliente.name_freguesia AS name_freguesia_cliente, parentesco_cliente.name_parentesco AS parentesco_cliente FROM adms_funerais AS funeral LEFT JOIN adms_generos AS genero_cliente ON genero_cliente.id = :gen_id LEFT JOIN adms_estado_civil AS estado_civil_cliente ON estado_civil_cliente.id = :ec_id LEFT JOIN adms_distritos AS dist_cliente ON dist_cliente.id = :dist_id LEFT JOIN adms_concelhos AS conc_cliente ON conc_cliente.id = :conc_id LEFT JOIN adms_freguesias AS freg_cliente ON freg_cliente.id = :freg_id LEFT JOIN adms_parentescos AS parentesco_cliente ON parentesco_cliente.id = :par_id WHERE funeral.id = :funeral_id LIMIT 1', "gen_id={$this->resultBd[0]['adms_genero_cliente_id']}&ec_id={$this->resultBd[0]['adms_estado_civil_cliente_id']}&dist_id={$this->resultBd[0]['adms_dist_cliente_id']}&conc_id={$this->resultBd[0]['adms_conc_cliente_id']}&freg_id={$this->resultBd[0]['adms_freg_cliente_id']}&par_id={$this->resultBd[0]['adms_parentesco_cliente_id']}&funeral_id={$this->id}" ); $clienteData = $readCliente->getResult(); if ($clienteData) { $this->resultBd[0] = array_merge($this->resultBd[0], $clienteData[0]); } // 3. Busca os filhos $readFilhos = new \App\adms\helpers\AdmsRead(); $readFilhos->fullRead( 'SELECT filho.id, filho.name_filho, filho.numero_doc_filho, filho.data_nascimento_filho, filho.pais_nif_filho, filho.numero_nif_filho, filho.beneficiario1 AS beneficiario1_filho, filho.grau_ensino AS grau_ensino_filho, filho.ano_ensino AS ano_ensino_filho, filho.observacoes, filho.adms_genero_id AS adms_genero_id_filho, filho.adms_tipo_doc_filho_id AS adms_tipo_doc_filho_id, filho.adms_grau_parentesco_id AS adms_grau_parentesco_id, filho.trabalhador_id AS trabalhador_id_filho, filho.a_cargo_id AS a_cargo_id_filho, gen_filho.name_genero AS name_genero_filho, doc_filho.tipo_documento AS tipodoc_filho, COALESCE(filho.fisica_id, 1) AS fisica_id_filho, COALESCE(filho.psiquica_id, 1) AS psiquica_id_filho, res_fisica.resposta AS resposta_fisica, res_psiquica.resposta AS resposta_psiquica, parentesco_filho.name_parentesco AS parentesco_filho, res_trabalhador.resposta AS resposta_trabalhador, res_cargo.resposta AS resposta_cargo FROM adms_filhos AS filho LEFT JOIN adms_generos AS gen_filho ON gen_filho.id = filho.adms_genero_id LEFT JOIN adms_tipo_documento AS doc_filho ON doc_filho.id = filho.adms_tipo_doc_filho_id LEFT JOIN adms_resposta AS res_fisica ON res_fisica.id = filho.fisica_id LEFT JOIN adms_resposta AS res_psiquica ON res_psiquica.id = filho.psiquica_id LEFT JOIN adms_parentescos AS parentesco_filho ON parentesco_filho.id = filho.adms_grau_parentesco_id LEFT JOIN adms_resposta AS res_trabalhador ON res_trabalhador.id = filho.trabalhador_id LEFT JOIN adms_resposta AS res_cargo ON res_cargo.id = filho.a_cargo_id WHERE filho.processo_id = :processo_id', "processo_id={$this->resultBd[0]['processo']}" ); // Obtém o resultado da consulta. Se for nulo, devolve array vazio. $filhos = $readFilhos->getResult() ?: []; // Removemos o array_filter para garantir que todos os registos retornados pelo SQL // sejam incluídos na lista final. $this->resultBd[0]['listFilhos'] = $filhos; } } /** * Método principal para gerar o formulário PDF */ public function preencherFormulario(int $id): void { $this->id = $id; $this->lerSql($this->id); // Verifica se encontrou o funeral antes de prosseguir if (!empty($this->resultBd)) { $this->generateForm($this->resultBd); } else { $this->result = false; } } private function generateForm(array $dados): void { // CAMINHOS DINÂMICOS (substituem as referências locais ao XAMPP) $basePath = $_SERVER['DOCUMENT_ROOT'] . '/app/adms/assets/pdf/'; $pdfTemplate = $basePath . 'RP-5075.pdf'; $caminhoSaida = $basePath . 'RP-5075A.pdf'; $pastaTemp = $basePath . 'paginas/'; $tempDirMpdf = $_SERVER['DOCUMENT_ROOT'] . '/app/adms/assets/tmp/mpdf/'; $filhosElegiveis = []; $filhosComDeficiencia = []; // Array para filhos com deficiência $hoje = new \DateTime(); // Função de auxílio para normalizar o valor $formatarEstado = function ($valor, $sufixo) { $v = trim($valor ?? ''); if ($v === 'Sim') { return 'Sim' . $sufixo; } if ($v === 'Não' || $v === 'Nao') { return 'Não' . $sufixo; } return 'Off'; }; if (!empty($dados[0]['listFilhos'])) { foreach ($dados[0]['listFilhos'] as $filho) { $dataNasc = new \DateTime($filho['data_nascimento_filho']); $idade = $hoje->diff($dataNasc)->y; $temDef = (strtolower(trim($filho['resposta_fisica'] ?? '')) === 'sim' || strtolower(trim($filho['resposta_psiquica'] ?? '')) === 'sim'); // Lógica corrigida: Se tiver deficiência, entra no array, independente da idade if ($temDef) { $filhosComDeficiencia[] = $filho; } // Se não tiver deficiência, verifica a idade elseif ($idade < 27) { $idx = count($filhosElegiveis); $sufixo = ($idx === 0) ? '' : '_' . $idx; $filho['estadoTrabalha'] = $formatarEstado($filho['resposta_trabalhador'], $sufixo); $filho['estadoCargo'] = $formatarEstado($filho['resposta_cargo'], $sufixo); $filhosElegiveis[] = $filho; } } } $camposPreencher = [ 'Nome_completo_requerente' => $dados[0]['name_cliente'], 'NISS_requerente' => str_replace(['.', '/', '-'], '', $dados[0]['beneficiario1_cliente']), 'NIF_requerente' => str_replace(['.', '/', '-'], '', $dados[0]['numero_nif_cliente']), 'Data_nascimento_requerente_ano' => substr($dados[0]['data_nasc_cliente'], 0, 4), 'Data_nascimento_requerente_mês' => substr($dados[0]['data_nasc_cliente'], 5, 2), 'Data_nascimento_requerente_dia' => substr($dados[0]['data_nasc_cliente'], 8, 2), 'Relação_familiar_beneficiário_falecido' => $dados[0]['parentesco_cliente'], 'Estado_civil_requerente' => $dados[0]['estado_civil_cliente'], 'Morada_requerente' => $dados[0]['morada_cliente'], 'Localidade_requerente' => $dados[0]['localidade_cliente'], 'Código_postal' => substr($dados[0]['cp_cliente'], 0, 4), 'Código_+postal_digitos' => substr($dados[0]['cp_cliente'], 5, 3), 'Código_postal_1' => $dados[0]['localidade_cliente'], 'Freguesia_requerente' => $dados[0]['name_freguesia_cliente'], 'Concelho_requerente' => $dados[0]['name_concelho_cliente'], 'Distrito_requerente' => $dados[0]['name_distrito_cliente'], 'Telemovel_requerente' => preg_replace('/[^0-9]/', '', str_replace('+351', '', $dados[0]['telemovel_cliente'])), 'E-mail_requerente' => $dados[0]['email_cliente'], 'Nome_completo_beneficiário_falecido' => $dados[0]['name_falecido'], 'Estado_civil_data_falecimento' => $dados[0]['name_estado'], 'NISS_beneficiário_falecido' => str_replace(['.', '/', '-'], '', $dados[0]['beneficiario1']), 'Data_nascimento_beneficiário_falecido_ano' => substr($dados[0]['data_nascimento'], 0, 4), 'Data_nascimento_beneficiário_falecido_mês' => substr($dados[0]['data_nascimento'], 5, 2), 'Data_nascimento_beneficiário_falecido_dia' => substr($dados[0]['data_nascimento'], 8, 2), 'Data_falecimento_beneficiário_falecido_ano' => substr($dados[0]['data_obito'], 0, 4), 'Data_falecimento_beneficiário_falecido_mês' => substr($dados[0]['data_obito'], 5, 2), 'Data_falecimento_beneficiário_falecido_dia' => substr($dados[0]['data_obito'], 8, 2), 'causa_morte' => 'doença_natural', // Filhos 0 'Nome_completo_até_27anos' => $filhosElegiveis[0]['name_filho'] ?? '', 'NISS_até_27anos' => isset($filhosElegiveis[0]) ? str_replace(['.', '/', '-'], '', $filhosElegiveis[0]['beneficiario1_filho']) : '', 'NIF_até_27anos' => isset($filhosElegiveis[0]) ? str_replace(['.', '/', '-'], '', $filhosElegiveis[0]['numero_nif_filho']) : '', 'Data_nascimento_27anos_ano' => isset($filhosElegiveis[0]) ? substr($filhosElegiveis[0]['data_nascimento_filho'], 0, 4) : '', 'Data_nascimento_27anos_mês' => isset($filhosElegiveis[0]) ? substr($filhosElegiveis[0]['data_nascimento_filho'], 5, 2) : '', 'Data_nascimento_27anos_dia' => isset($filhosElegiveis[0]) ? substr($filhosElegiveis[0]['data_nascimento_filho'], 8, 2) : '', 'parentesco_beneficiário_falecido' => $filhosElegiveis[0]['parentesco_filho'] ?? '', 'grau_ensino_até_27anos' => $filhosElegiveis[0]['grau_ensino_filho'] ?? '', 'ano' => $filhosElegiveis[0]['ano_ensino_filho'] ?? '', 'Trabalha' => $filhosElegiveis[0]['estadoTrabalha'] ?? 'Off', 'estava_cargo_beneficiário_data_falecimento_até_27anos' => $filhosElegiveis[0]['estadoCargo'] ?? 'Off', // Filhos 1 'Nome_completo_até_27anos_1' => $filhosElegiveis[1]['name_filho'] ?? '', 'NISS_até_27anos_1' => isset($filhosElegiveis[1]) ? str_replace(['.', '/', '-'], '', $filhosElegiveis[1]['beneficiario1_filho']) : '', 'NIF_até_27anos_1' => isset($filhosElegiveis[1]) ? str_replace(['.', '/', '-'], '', $filhosElegiveis[1]['numero_nif_filho']) : '', 'Data_nascimento_27anos_ano_1' => isset($filhosElegiveis[1]) ? substr($filhosElegiveis[1]['data_nascimento_filho'], 0, 4) : '', 'Data_nascimento_27anos_mês_1' => isset($filhosElegiveis[1]) ? substr($filhosElegiveis[1]['data_nascimento_filho'], 5, 2) : '', 'Data_nascimento_27anos_dia_1' => isset($filhosElegiveis[1]) ? substr($filhosElegiveis[1]['data_nascimento_filho'], 8, 2) : '', 'parentesco_beneficiário_falecido_1' => $filhosElegiveis[1]['parentesco_filho'] ?? '', 'grau_ensino_até_27anos_1' => $filhosElegiveis[1]['grau_ensino_filho'] ?? '', 'ano_1' => $filhosElegiveis[1]['ano_ensino_filho'] ?? '', 'Trabalha_1' => (isset($filhosElegiveis[1]) && $filhosElegiveis[1]['resposta_trabalhador'] === 'Sim') ? 'Sim_1' : 'Off', 'trabalha_1' => (isset($filhosElegiveis[1]) && $filhosElegiveis[1]['resposta_trabalhador'] === 'Não') ? 'Não_1' : 'Off', 'estava_cargo_beneficiário_data_falecimento_até_27anos_1' => $filhosElegiveis[1]['estadoCargo'] ?? 'Off', // Filhos 2 'Nome_completo_até_27anos_2' => $filhosElegiveis[2]['name_filho'] ?? '', 'NISS_até_27anos_2' => isset($filhosElegiveis[2]) ? str_replace(['.', '/', '-'], '', $filhosElegiveis[2]['beneficiario1_filho']) : '', 'NIF_até_27anos_2' => isset($filhosElegiveis[2]) ? str_replace(['.', '/', '-'], '', $filhosElegiveis[2]['numero_nif_filho']) : '', 'Data_nascimento_27anos_ano_2' => isset($filhosElegiveis[2]) ? substr($filhosElegiveis[2]['data_nascimento_filho'], 0, 4) : '', 'Data_nascimento_27anos_mês_2' => isset($filhosElegiveis[2]) ? substr($filhosElegiveis[2]['data_nascimento_filho'], 5, 2) : '', 'Data_nascimento_27anos_dia_2' => isset($filhosElegiveis[2]) ? substr($filhosElegiveis[2]['data_nascimento_filho'], 8, 2) : '', 'parentesco_beneficiário_falecido_2' => $filhosElegiveis[2]['parentesco_filho'] ?? '', 'grau_ensino_até_27anos_2' => $filhosElegiveis[2]['grau_ensino_filho'] ?? '', 'ano_2' => $filhosElegiveis[2]['ano_ensino_filho'] ?? '', 'Trabalha_2' => $filhosElegiveis[2]['estadoTrabalha'] ?? 'Off', 'estava_cargo_beneficiário_data_falecimento_até_27anos_2' => $filhosElegiveis[2]['estadoCargo'] ?? 'Off', // Filhos com deficiência 'Nome_completo_sem_limite_idade' => $filhosComDeficiencia[0]['name_filho'] ?? '', 'NISS_sem_limite_idade' => isset($filhosComDeficiencia[0]) ? str_replace(['.', '/', '-'], '', $filhosComDeficiencia[0]['beneficiario1_filho']) : '', 'NIF_sem_limite_idade' => isset($filhosComDeficiencia[0]) ? str_replace(['.', '/', '-'], '', $filhosComDeficiencia[0]['numero_nif_filho']) : '', 'Data_nascimento_sem_limite_idade_ano' => isset($filhosComDeficiencia[0]) ? substr($filhosComDeficiencia[0]['data_nascimento_filho'], 0, 4) : '', 'Data_nascimento_sem_limite_idade_mês' => isset($filhosComDeficiencia[0]) ? substr($filhosComDeficiencia[0]['data_nascimento_filho'], 5, 2) : '', 'Data_nascimento_sem_limite_idade_dia' => isset($filhosComDeficiencia[0]) ? substr($filhosComDeficiencia[0]['data_nascimento_filho'], 8, 2) : '', 'parentesco_beneficiário_falecido_sem_limite_idade' => $filhosComDeficiencia[0]['parentesco_filho'] ?? '', 'sem_limite_idade' => $filhosComDeficiencia[0]['grau_ensino_filho'] ?? '', 'sem_limite_idade_fisica' => (isset($filhosComDeficiencia[0]) && strtolower($filhosComDeficiencia[0]['resposta_fisica']) === 'sim') ? 'física' : 'Off', 'sem_limite_idade_psiquica' => (isset($filhosComDeficiencia[0]) && strtolower($filhosComDeficiencia[0]['resposta_psiquica']) === 'sim') ? 'Psíquica' : 'Off', 'Nome_completo_sem_limite_idade_1' => $filhosComDeficiencia[1]['name_filho'] ?? '', 'NISS_sem_limite_idade_1' => isset($filhosComDeficiencia[1]) ? str_replace(['.', '/', '-'], '', $filhosComDeficiencia[1]['beneficiario1_filho']) : '', 'NIF_sem_limite_idade_1' => isset($filhosComDeficiencia[1]) ? str_replace(['.', '/', '-'], '', $filhosComDeficiencia[1]['numero_nif_filho']) : '', 'Data_nascimento_sem_limite_idade_ano_1' => isset($filhosComDeficiencia[1]) ? substr($filhosComDeficiencia[1]['data_nascimento_filho'], 0, 4) : '', 'Data_nascimento_sem_limite_idade_mês_1' => isset($filhosComDeficiencia[1]) ? substr($filhosComDeficiencia[1]['data_nascimento_filho'], 5, 2) : '', 'Data_nascimento_sem_limite_idade_dia_1' => isset($filhosComDeficiencia[1]) ? substr($filhosComDeficiencia[1]['data_nascimento_filho'], 8, 2) : '', 'parentesco_beneficiário_falecido_sem_limite_idade_1' => $filhosComDeficiencia[1]['parentesco_filho'] ?? '', 'sem_limite_idade_1' => $filhosComDeficiencia[1]['grau_ensino_filho'] ?? '', 'sem_limite_idade_1_fisica' => (isset($filhosComDeficiencia[1]) && strtolower($filhosComDeficiencia[1]['resposta_fisica']) === 'sim') ? 'física_1' : 'Off', 'sem_limite_idade_1_Psiquica' => (isset($filhosComDeficiencia[1]) && strtolower($filhosComDeficiencia[1]['resposta_psiquica']) === 'sim') ? 'Psíquica_1' : 'Off', 'Nome_completo_sem_limite_idade_2' => $filhosComDeficiencia[2]['name_filho'] ?? '', 'NISS_sem_limite_idade_2' => isset($filhosComDeficiencia[2]) ? str_replace(['.', '/', '-'], '', $filhosComDeficiencia[2]['beneficiario1_filho']) : '', 'NIF_sem_limite_idade_2' => isset($filhosComDeficiencia[2]) ? str_replace(['.', '/', '-'], '', $filhosComDeficiencia[2]['numero_nif_filho']) : '', 'Data_nascimento_sem_limite_idade_ano_2' => isset($filhosComDeficiencia[2]) ? substr($filhosComDeficiencia[2]['data_nascimento_filho'], 0, 4) : '', 'Data_nascimento_sem_limite_idade_mês_2' => isset($filhosComDeficiencia[2]) ? substr($filhosComDeficiencia[2]['data_nascimento_filho'], 5, 2) : '', 'Data_nascimento_sem_limite_idade_dia_2' => isset($filhosComDeficiencia[2]) ? substr($filhosComDeficiencia[2]['data_nascimento_filho'], 8, 2) : '', 'parentesco_beneficiário_falecido_sem_limite_idade_2' => $filhosComDeficiencia[2]['parentesco_filho'] ?? '', 'sem_limite_idade_2' => $filhosComDeficiencia[2]['grau_ensino_filho'] ?? '', 'sem_limite_idade_2_fisica' => (isset($filhosComDeficiencia[2]) && strtolower($filhosComDeficiencia[2]['resposta_fisica']) === 'sim') ? 'física_2' : 'Off', 'sem_limite_idade_2_Psiquica' => (isset($filhosComDeficiencia[2]) && strtolower($filhosComDeficiencia[2]['resposta_psiquica']) === 'sim') ? 'Psíquica_2' : 'Off', ]; try { // 1. Preenche o formulário original //$pdf = new Pdf($pdfTemplate, ['command' => '/usr/bin/pdftk', 'useExec' => true]); $pdf = new Pdf($pdfTemplate, ['command' => '/usr/bin/pdftk_inexistente', 'useExec' => true]); $pdf->fillForm($camposPreencher)->needAppearances()->saveAs($caminhoSaida); // 2. Assinatura apenas na página 5 if (!empty($dados[0]['sign']) && file_exists($dados[0]['sign'])) { if (!is_dir($pastaTemp)) { mkdir($pastaTemp, 0755, true); } // A. Divide o PDF exec("/usr/bin/pdftk {$caminhoSaida} burst output {$pastaTemp}pg_%02d.pdf"); // B. Cria assinatura temporária $caminhoAssinatura = $basePath . 'temp_assinatura.pdf'; $mpdf = new \Mpdf\Mpdf(['format' => 'A4', 'tempDir' => $tempDirMpdf]); $mpdf->AddPage(); $mpdf->Image($dados[0]['sign'], 110, 63, 50, 20); $mpdf->Output($caminhoAssinatura, \Mpdf\Output\Destination::FILE); // C. Aplica carimbo na página 05 if (file_exists($pastaTemp . 'pg_05.pdf')) { exec("/usr/bin/pdftk {$pastaTemp}pg_05.pdf stamp {$caminhoAssinatura} output {$pastaTemp}pg_05_assinado.pdf"); if (file_exists($pastaTemp . 'pg_05_assinado.pdf')) { rename($pastaTemp . 'pg_05_assinado.pdf', $pastaTemp . 'pg_05.pdf'); } } // D. Junta tudo exec("/usr/bin/pdftk {$pastaTemp}pg_*.pdf cat output {$caminhoSaida}.tmp"); // E. Limpeza final if (file_exists("{$caminhoSaida}.tmp")) { rename("{$caminhoSaida}.tmp", $caminhoSaida); } array_map('unlink', glob("{$pastaTemp}*")); rmdir($pastaTemp); unlink($caminhoAssinatura); } if (ob_get_length()) { ob_end_clean(); } header('Content-Type: application/pdf'); readfile($caminhoSaida); exit; } catch (\Exception $e) { die('Erro crítico: ' . $e->getMessage()); } } } Formulário RP-5076 <?php namespace App\adms\Models\generatePdf; use Core\Model; use mikehaertl\pdftk\Pdf; if (!defined('SENHA AQUI')) { header('Location:/'); die('Erro: Página não encontrada'); } class RP5076 extends Model { private bool $result = false; private array|null $resultBd; private int|string|null $id; private string $errorMessage = ''; public function getResult(): bool { return $this->result; } public function getErrorMessage(): string { return $this->errorMessage; } private function lerSql(int $id): void { $this->id = $id; $viewUser = new \App\adms\helpers\AdmsRead(); // 1. Primeira Leitura: Dados do Funeral, Cônjuge e tabelas gerais $viewUser->fullRead('SELECT funeral.id, funeral.processo, funeral.name AS name_falecido, funeral.data_nascimento, funeral.beneficiario1, funeral.numero_nif, funeral.data_obito, funeral.name_cliente, funeral.morada_cliente, funeral.localidade_cliente, funeral.codigo_postal_cliente AS cp_cliente, funeral.telemovel_cliente, funeral.email_cliente, funeral.data_nasc_cliente, funeral.numero_nif_cliente,funeral.beneficiario1_cliente, funeral.adms_genero_cliente_id, funeral.adms_estado_civil_cliente_id, funeral.adms_dist_cliente_id, funeral.adms_conc_cliente_id, funeral.adms_freg_cliente_id,funeral.adms_parentesco_cliente_id, funeral.sign, genero.name_genero AS name_genero, civil.name_estado AS name_estado, saudacao.saudacao AS name_saudacao FROM adms_funerais AS funeral LEFT JOIN adms_saudacao AS saudacao ON saudacao.id=funeral.adms_saudacao_id LEFT JOIN adms_generos AS genero ON genero.id=funeral.adms_genero_id LEFT JOIN adms_estado_civil AS civil ON civil.id=funeral.adms_estado_civil_id WHERE funeral.id=:id LIMIT 1', "id={$this->id}"); $this->resultBd = $viewUser->getResult(); if ($this->resultBd) { // 2. Segunda Leitura: JOINs do Cliente $readCliente = new \App\adms\helpers\AdmsRead(); $readCliente->fullRead( 'SELECT genero_cliente.name_genero AS name_genero_cliente, estado_civil_cliente.name_estado AS estado_civil_cliente, dist_cliente.name_distrito AS name_distrito_cliente, conc_cliente.name_concelho AS name_concelho_cliente, freg_cliente.name_freguesia AS name_freguesia_cliente, parentesco_cliente.name_parentesco AS parentesco_cliente FROM adms_funerais AS funeral LEFT JOIN adms_generos AS genero_cliente ON genero_cliente.id = :gen_id LEFT JOIN adms_estado_civil AS estado_civil_cliente ON estado_civil_cliente.id = :ec_id LEFT JOIN adms_distritos AS dist_cliente ON dist_cliente.id = :dist_id LEFT JOIN adms_concelhos AS conc_cliente ON conc_cliente.id = :conc_id LEFT JOIN adms_freguesias AS freg_cliente ON freg_cliente.id = :freg_id LEFT JOIN adms_parentescos AS parentesco_cliente ON parentesco_cliente.id = :par_id WHERE funeral.id = :funeral_id LIMIT 1', "gen_id={$this->resultBd[0]['adms_genero_cliente_id']}&ec_id={$this->resultBd[0]['adms_estado_civil_cliente_id']}&dist_id={$this->resultBd[0]['adms_dist_cliente_id']}&conc_id={$this->resultBd[0]['adms_conc_cliente_id']}&freg_id={$this->resultBd[0]['adms_freg_cliente_id']}&par_id={$this->resultBd[0]['adms_parentesco_cliente_id']}&funeral_id={$this->id}" ); $clienteData = $readCliente->getResult(); if ($clienteData) { $this->resultBd[0] = array_merge($this->resultBd[0], $clienteData[0]); } } } /** * Método principal para gerar o formulário PDF */ public function preencherFormulario(int $id): void { $this->id = $id; $this->lerSql($this->id); // Verifica se encontrou o funeral antes de prosseguir if (!empty($this->resultBd)) { $this->generateForm($this->resultBd); } else { $this->result = false; } } private function generateForm(array $dados): void { // CAMINHOS DINÂMICOS (substituem as referências locais ao XAMPP) $basePath = $_SERVER['DOCUMENT_ROOT'] . '/app/adms/assets/pdf/'; $pdfTemplate = $basePath . 'RP-5076.pdf'; $caminhoSaida = $basePath . 'RP-5076A.pdf'; $pastaTemp = $basePath . 'paginas/'; $tempDirMpdf = $_SERVER['DOCUMENT_ROOT'] . '/app/adms/assets/tmp/mpdf/'; $camposPreencher = [ //dados do falecido(a) 'Nome_completo_requerente' => $dados[0]['name_falecido'], 'NISS_requerente' => str_replace(['.', '/', '-'], '', $dados[0]['beneficiario1']), 'NIF_requerente' => str_replace(['.', '/', '-'], '', $dados[0]['numero_nif']), 'Data_nascimento_requerente_ano' => substr($dados[0]['data_nascimento'], 0, 4), 'Data_nascimento_requerente_mes' => substr($dados[0]['data_nascimento'], 5, 2), 'Data_nascimento_requerente_dia' => substr($dados[0]['data_nascimento'], 8, 2), 'estado_civil_data_do_falecimento' => $dados[0]['name_estado'], 'Data_falecimento_ano' => substr($dados[0]['data_obito'], 0, 4), 'Data_falecimento_mes' => substr($dados[0]['data_obito'], 5, 2), 'Data_falecimento_dia' => substr($dados[0]['data_obito'], 8, 2), //dados do requerente 'Nome_completo_requerente1' => $dados[0]['name_cliente'], 'NISS_requerente1' => str_replace(['.', '/', '-'], '', $dados[0]['beneficiario1_cliente']), 'NIF_requerente1' => str_replace(['.', '/', '-'], '', $dados[0]['numero_nif_cliente']), 'Data_nascimento_requerente_ano1' => substr($dados[0]['data_nasc_cliente'], 0, 4), 'Data_nascimento_requerente_mes1' => substr($dados[0]['data_nasc_cliente'], 5, 2), 'Data_nascimento_requerente_dia1' => substr($dados[0]['data_nasc_cliente'], 8, 2), 'estado_civil' => $dados[0]['estado_civil_cliente'], 'relacao_familiar' => $dados[0]['parentesco_cliente'], 'Morada_requerente' => $dados[0]['morada_cliente'], 'Localidade_requerente' => $dados[0]['localidade_cliente'], 'Codigo_postal' => substr($dados[0]['cp_cliente'], 0, 4), 'Codigo_postal_digitos' => substr($dados[0]['cp_cliente'], 5, 3), 'Codigo_postal_1' => $dados[0]['localidade_cliente'], 'Freguesia_requerente' => $dados[0]['name_freguesia_cliente'], 'Concelho_requerente' => $dados[0]['name_concelho_cliente'], 'Distrito_requerente' => $dados[0]['name_distrito_cliente'], 'Telemovel_requerente' => preg_replace('/[^0-9]/', '', str_replace('+351', '', $dados[0]['telemovel_cliente'])), 'E-mail_requerente' => $dados[0]['email_cliente'], 'causa_morte' => 'doença_natural', ]; try { // 1. Preenche o formulário original //$pdf = new Pdf($pdfTemplate, ['command' => '/usr/bin/pdftk', 'useExec' => true]); $pdf = new Pdf($pdfTemplate, ['command' => '/usr/bin/pdftk_inexistente', 'useExec' => true]); $pdf->fillForm($camposPreencher)->needAppearances()->saveAs($caminhoSaida); // 2. Assinatura apenas na página 5 if (!empty($dados[0]['sign']) && file_exists($dados[0]['sign'])) { if (!is_dir($pastaTemp)) { mkdir($pastaTemp, 0755, true); } // A. Divide o PDF exec("/usr/bin/pdftk {$caminhoSaida} burst output {$pastaTemp}pg_%02d.pdf"); // B. Cria assinatura temporária $caminhoAssinatura = $basePath . 'temp_assinatura.pdf'; $mpdf = new \Mpdf\Mpdf(['format' => 'A4', 'tempDir' => $tempDirMpdf]); $mpdf->AddPage(); $mpdf->Image($dados[0]['sign'], 110, 95, 50, 20); $mpdf->Output($caminhoAssinatura, \Mpdf\Output\Destination::FILE); // C. Aplica carimbo na página 05 if (file_exists($pastaTemp . 'pg_02.pdf')) { exec("/usr/bin/pdftk {$pastaTemp}pg_02.pdf stamp {$caminhoAssinatura} output {$pastaTemp}pg_05_assinado.pdf"); if (file_exists($pastaTemp . 'pg_02_assinado.pdf')) { rename($pastaTemp . 'pg_02_assinado.pdf', $pastaTemp . 'pg_02.pdf'); } } // D. Junta tudo exec("/usr/bin/pdftk {$pastaTemp}pg_*.pdf cat output {$caminhoSaida}.tmp"); // E. Limpeza final if (file_exists("{$caminhoSaida}.tmp")) { rename("{$caminhoSaida}.tmp", $caminhoSaida); } array_map('unlink', glob("{$pastaTemp}*")); rmdir($pastaTemp); unlink($caminhoAssinatura); } if (ob_get_length()) { ob_end_clean(); } header('Content-Type: application/pdf'); readfile($caminhoSaida); exit; } catch (\Exception $e) { die('Erro crítico: ' . $e->getMessage()); } } }
  2. Boa noite a todos, tenho um projeto em PHP com estrutura MVC que esta trabalhar, estou criando um documento do word através do php, nos browser (Chrome, Edge, firefox, opera) o download é feito naturalmente e o documento é criado. No safari diz que "Não foi possível criar o ficheiro" e o mesmo esta com o tamanho zero. não sei se estou a colocar a duvida no local certo, e caso não esteja pesso imensa desculpa. mas se alguém conseguir ajudar me agradeço. Por se tratar de um codigo muito extenso irei colocar apenas a parte que gera o documento, caso seja necessário adiciono o restante. private function generateDocx(array $dados): void { // Define o caminho base dinamicamente $basePath = $_SERVER['DOCUMENT_ROOT'] . '/app/adms/assets/'; while (ob_get_level()) { ob_end_clean(); } $nomeArquivo = 'cartaz_' . $this->id . '.docx'; $pastaTmp = $_SERVER['DOCUMENT_ROOT'] . '/app/adms/assets/tmp/tmpWord/'; $caminhoCompleto = $pastaTmp . $nomeArquivo; $phpWord = new PhpWord(); // --- PRIMEIRA PÁGINA (MANTIDA ORIGINAL) --- $section = $phpWord->addSection([ 'marginLeft' => 720, 'marginRight' => 720, 'marginBottom' => 1440 ]); $header = $section->addHeader(); $moldura = $basePath . 'images/moldura.png'; if (file_exists($moldura)) { $header->addImage($moldura, [ 'width' => 600, 'height' => 840, 'positioning' => 'absolute', 'posHorizontalRel' => 'page', 'posVerticalRel' => 'page', 'wrappingStyle' => 'behind', ]); } $section->addTextBreak(3); $caminhoFoto = $basePath . 'images/funerais/' . $dados[0]['processo'] . '/' . $dados[0]['image']; if (file_exists($caminhoFoto)) { $img = imagecreatefromjpeg($caminhoFoto); $origW = imagesx($img); $origH = imagesy($img); $wFixo = 2448; $hFixo = 3264; $bordaGrossa = 60; $espaco = 20; $bordaFina = 12; $totalBorder = $bordaGrossa + $espaco + $bordaFina; $canvasW = $wFixo + ($totalBorder * 2); $canvasH = $hFixo + ($totalBorder * 2); $canvas = imagecreatetruecolor($canvasW, $canvasH); $ouroVelho = imagecolorallocate($canvas, 197, 160, 89); $fundo = imagecolorallocate($canvas, 255, 255, 255); imagefill($canvas, 0, 0, $ouroVelho); imagefilledrectangle($canvas, $bordaGrossa, $bordaGrossa, $canvasW - $bordaGrossa - 1, $canvasH - $bordaGrossa - 1, $fundo); $inicioFina = $bordaGrossa + $espaco; imagefilledrectangle($canvas, $inicioFina, $inicioFina, $canvasW - $inicioFina - 1, $canvasH - $inicioFina - 1, $ouroVelho); $offset = $totalBorder; imagecopyresampled($canvas, $img, $offset, $offset, 0, 0, $wFixo, $hFixo, $origW, $origH); $caminhoTemp = $pastaTmp . 'foto_final_' . $this->id . '.jpg'; imagejpeg($canvas, $caminhoTemp); imagedestroy($canvas); imagedestroy($img); $section->addImage($caminhoTemp, ['width' => 140, 'alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); } $section->addText(($dados[0]['name_genero'] == 'M' ? 'Ex.mo Sr. ' : 'Ex.ma Sra. D. ') . ($dados[0]['name_falecido'] ?? ''), ['name' => 'Baguet Script', 'size' => 14], ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $section->addTextBreak(2); $fontStyle = ['name' => 'Baguet Script', 'size' => 16]; $paragraphStyle = ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::BOTH, 'indentation' => ['left' => 850, 'right' => 680], 'spaceAfter' => 200]; $meses = ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]; $formatarData = function($dataRaw) use ($meses) { if (empty($dataRaw)) return "N/A"; $d = explode('-', trim($dataRaw)); return (count($d) == 3) ? (int)$d[2] . " de " . $meses[(int)$d[1]-1] . " de " . $d[0] : "N/A"; }; $section->addText('O Velório realizar-se-á na ' . ($dados[0]['name_local_saida'] ?? 'N/A'), $fontStyle, $paragraphStyle); $section->addTextBreak(2); $section->addText('Celebração dia ' . $formatarData($dados[0]['data_missa'] ?? '') . ' pelas ' . substr($dados[0]['hora_missa'] ?? 'N/A', 0, 5), $fontStyle, $paragraphStyle); $section->addTextBreak(2); $section->addText('Funeral dia ' . $formatarData($dados[0]['data_funeral'] ?? '') . ' pelas ' . substr($dados[0]['hora_funeral'] ?? 'N/A', 0, 5) . ', sendo ' . ($dados[0]['name_tipo_servico'] ?? 'N/A') . ' no ' . ($dados[0]['name_cemiterio'] ?? 'N/A'), $fontStyle, $paragraphStyle); $footer = $section->addFooter(); $table = $footer->addTable(['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $table->addRow(1350); $table->addCell(200); $cellQr = $table->addCell(2500); $cellQr->addImage($basePath . 'images/qrgoogle.png', ['width' => 50, 'alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $cellQr->addText('Avalia-nos no Google! Sua estrela faz a DIFERENÇA. Obrigado!', ['name' => 'Arial', 'size' => 7], ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $table->addCell(550); $cellLogo = $table->addCell(2800); $cellLogo->addImage($basePath . 'images/logo/logo.png', ['width' => 110, 'alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $table->addCell(2900); $table->addRow(300); // --- SEGUNDA PÁGINA --- $section2 = $phpWord->addSection([ 'breakType' => 'nextPage', 'marginLeft' => 720, 'marginRight' => 720, 'marginBottom' => 1440 ]); $section2->addText('Condolências', ['name' => 'Baguet Script', 'size' => 22, 'color' => 'C5A059', 'bold' => true], ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $section2->addText(($dados[0]['name_genero'] == 'M' ? 'Ex.mo Sr. ' : 'Ex.ma Sra. D. ') . ($dados[0]['name_falecido'] ?? ''), ['name' => 'Baguet Script', 'size' => 14], ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $section2->addTextBreak(1); $table2 = $section2->addTable(['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $table2->addRow(); $tStyle = ['name' => 'Baguet Script', 'size' => 14, 'bold' => true]; $dStyle = ['name' => 'Baguet Script', 'size' => 10.5]; // Célula 1: Velório $c1 = $table2->addCell(3000); $c1->addText("Velório", $tStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $dStyle = ['name' => 'Baguet Script', 'size' => 10.5]; $c1->addText($formatarData($dados[0]['data_velorio'] ?? ''), $dStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $c1->addText(substr($dados[0]['hora_velorio'] ?? '', 0, 5) . " " . ($dados[0]['name_local_saida'] ?? ''), $dStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); // Célula 2: Celebração $c2 = $table2->addCell(3000); $c2->addText("Celebração", $tStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $c2->addText($formatarData($dados[0]['data_missa'] ?? ''), $dStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $c2->addText(substr($dados[0]['hora_missa'] ?? '', 0, 5), $dStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); // Célula 3: Funeral $c3 = $table2->addCell(3000); $c3->addText("Funeral", $tStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $c3->addText($formatarData($dados[0]['data_funeral'] ?? ''), $dStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $c3->addText(substr($dados[0]['hora_funeral'] ?? '', 0, 5) . " " . ($dados[0]['name_cemiterio'] ?? ''), $dStyle, ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); // --- 5 QUADROS COM ESPAÇAMENTO --- $section2->addTextBreak(1); $tableQuadros = $section2->addTable(['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $bordaEstilo = ['borderSize' => 6, 'borderColor' => 'C5A059']; $semBorda = ['borderStyle' => 'none', 'borderSize' => 0]; for ($i = 0; $i < 5; $i++) { $tableQuadros->addRow(1300); // Quadro maior $tableQuadros->addCell(9000, $bordaEstilo); // Adiciona linha de espaçamento invisível se não for o último if ($i < 4) { $tableQuadros->addRow(450); // 0.8cm aproximadamente $tableQuadros->addCell(9000, $semBorda); } } // Rodapé da Segunda Página (duas linhas) $footer2 = $section2->addFooter(); $tableF2 = $footer2->addTable(['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $tableF2->addRow(); $tableF2->addCell(9000)->addImage($basePath . 'images/logo/logo.png', ['width' => 110, 'alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]); $tableF2->addRow(); $tableF2->addCell(9000); $objWriter = IOFactory::createWriter($phpWord, 'Word2007'); $objWriter->save($caminhoCompleto); if (file_exists($caminhoCompleto)) { // Limpa qualquer buffer existente e desativa o output buffering para este download if (ob_get_level()) ob_end_clean(); // Cabeçalhos essenciais para forçar o Safari a aceitar o fluxo header('Content-Description: File Transfer'); header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); header('Content-Disposition: attachment; filename="' . basename($caminhoCompleto) . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Content-Length: ' . filesize($caminhoCompleto)); // Envio em pedaços (ideal para evitar timeout ou erro de leitura do macOS) $handle = fopen($caminhoCompleto, 'rb'); while (!feof($handle)) { echo fread($handle, 8192); flush(); // Força a descarga para o buffer do navegador } fclose($handle); exit; } }
  3. Boa noite a todos, tenho um sistema desenvolvido em PHP com a estrutura MVC, mas falta uns toque finais. Tenho um Formulário com duas Abs (Clientes e Herdeiros) O Cadastro de cliente esta a funcionar correctamente, também criei uma janela Modal para incluir os herdeiros Mas os campos para a inclusão de herdeiros só serão apresentadas se escolher a opção "SIM" em um campo select, até aqui tudo bem. Quando clico no botão fechar da janela Modal ela adiciona os filhos a lista, sem recarregar a página através de javascript Na lista de herdeiros tenho um botão dropdown que ao clicar nele tenho a opção de editar, visualizar ou excluir, mas quando clico nele recarrega a pagina, já refiz o código todo para ver se estava faltando fechar alguma tag, mas nao esta. Espero ter sido claro. View Add.php <?php if (!defined('Senha')) { header('Location:/'); exit('Erro: Página não encontrada'); } if (isset($this->data['form'])) { $valorForm = $this->data['form']; } ?> <span id="url-adm" data-url-adm="<?= URLADM ?>"></span> <!-- Inicio do conteudo do administrativo --> <div class="wrapper"> <div class="row"> <div class="top-list"> <span class="title-content">Cadastrar Processo de Cliente</span> <div class="top-list-right"> <?= $this->utils::responsiveButtons([ [ 'label' => 'Cartão Cidadão', 'icon' => 'fa-solid fa-address-card', 'attributes' => [ 'href' => '#', 'class' => 'btn-success', ], ], [ 'label' => 'Listar Processos', 'icon' => 'fa-solid fa-rectangle-list', 'attributes' => [ 'href' => '/list-processos/index', 'class' => 'btn-info', 'title' => 'Listar Processos', ], ], ]) ?> </div> </div> <!--Alerta de mensagem--> <div class=" content-adm-alert"> <?php $this->utils->getSessionMsg(); ?> <span id="msg"></span> </div> <!-- Fim da alerta de mensagem --> <!-- Incio da chamada de criação das Abas--> <div class="tab"> <button id="tabPadrao" class="tab-button" onclick="abrirAba(event, 'cliente')">Cliente</button> <button class="tab-button" onclick="abrirAba(event, 'herdeiros')">Descententes</button> </div> <!-- Fim da chamada de criação das Abas--> <div class="content-adm"> <!-- Inicio do Formulário de Cliente --> <form method="POST" action="" id="form-add-cliente" class="form-adm"> <!-- Inicio da Aba Cliente --> <div class="content-abas" id="Cliente"> <div class="row-input" id="dados_gerais"> <div class="column" id="foto_cliente"> <figure> <img id="img" src="<?php echo URLADM . 'app/adms/assets/images/users/1/foto.jpg'; ?>"> </figure> <div class="top-list-right"> <?= $this->utils::responsiveButtons([ [ 'label' => 'Trocar Foto', 'icon' => 'fa-solid fa-camera-rotate', 'attributes' => [ 'href' => '#', 'class' => 'btn-success', ], ], [ 'label' => 'Apagar', 'icon' => 'fa-solid fa-trash-can', 'attributes' => [ 'href' => '#', 'class' => 'btn-danger', 'title' => 'Apagar Foto', 'onclick' => "return confirm('Tem certeza que deseja excluir esta foto?')", ], ], ]) ?> </div> </div> <div class="column" id="dados_cliente"> <div class="row-input" style="justify-content: flex-end; margin-top: 10px; margin-bottom: 10px;"> <div class="column" style="text-align: right;"> <span style="font-size: 14px; color: #666; font-weight: bold;"> Nº Processo: <input name="processo" id="processo" type="text" class="input-process" readonly value="<?= $this->data['proximo_processo'] ?? '----/----' ?>"> </span> </div> </div> <div class="row-input"> <div class="column"> <label for="adms_genero_id" class="title-input">Gênero:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_genero_id" id="adms_genero_id"> <option value="">Selecione</option> <?php foreach ($this->data['genero']['gen'] as $genero) { extract($genero); if ((isset($valorForm['adms_genero_id'])) and ($valorForm['adms_genero_id'] == $id)) { echo "<option value='$id' selected>$name_genero</option>"; } else { echo "<option value='$id'>$name_genero</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_estado_civil_id" class="title-input">Estado Civil:</label> <select class="input-adm" name="adms_estado_civil_id" id="adms_estado_civil_id"> <option value="">Selecione</option> <?php foreach ($this->data['estadocivil']['estado'] as $estado) { extract($estado); if ((isset($valorForm['adms_estado_civil_id'])) and ($valorForm['adms_estado_civil_id'] == $id)) { echo "<option value='$id' selected>$name_estado</option>"; } else { echo "<option value='$id'>$name_estado</option>"; } } ?> </select> </div> </div> <div class="row-input"> <div class="column"> <?php $name = ''; if (isset($valorForm['name'])) { $name = $valorForm['name']; } ?> <label for="name" class="title-input">Nome:<span class="text-danger">*</span></label> <input type="text" name="name" id="name" class="input-adm" placeholder="Digite o nome completo" autocomplete="off" value="<?php echo $name; ?>" autofocus> </div> </div> <div class="row-input"> <div class="column"> <?php $morada = ''; if (isset($valorForm['morada'])) { $morada = $valorForm['morada']; } ?> <label for="morada" class="title-input">Morada:<span class="text-danger">*</span></label> <input type="text" name="morada" id="morada" class="input-adm" placeholder="Digite a morada" value="<?php echo $morada; ?>"> </div> </div> <div class="row-input"> <div class="column"> <?php $localidade = ''; if (isset($valorForm['localidade'])) { $localidade = $valorForm['localidade']; } ?> <label for="localidade" class="title-input">Localidade:<span class="text-danger">*</span></label> <input type="text" name="localidade" id="localidade" class="input-adm" placeholder="Digite a localidade" value="<?php echo $localidade; ?>"> </div> <div class="column"> <?php $codigopostal = ''; if (isset($valorForm['codigo_postal'])) { $codigopostal = $valorForm['codigo_postal']; } ?> <label for="codigo_postal" class="title-input">Código Postal:<span class="text-danger">*</span></label> <input type="text" name="codigo_postal" id="codigo_postal" data-js="postal" maxlength="8" class="input-adm" placeholder="0000-000" value="<?php echo $codigopostal; ?>"> </div> </div> <label for="adms_distrito_id" class="title-input">Autarquivas da morada:</label> <div class="row-input"> <div class="column"> <label for="adms_distrito_id" class="title-input">Distrito:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_distrito_id" id="adms_distrito_id1" onchange="selectConcelho(1)"> <option value="">Selecione</option> <?php foreach ($this->data['distrito']['dist'] as $dist) { extract($dist); if ((isset($valorForm['adms_distrito_id'])) and ($valorForm['adms_distrito_id'] == $id)) { echo "<option value='$id' selected>$name_distrito</option>"; } else { echo "<option value='$id'>$name_distrito</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_concelho_id" class="title-input">Concelho:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_concelho_id" id="adms_concelho_id1" onchange="selectFreguesia(1)"> <option value="">Selecione</option> <?php foreach ($this->data['concelho']['conc'] as $conc) { extract($conc); if ((isset($valorForm['adms_concelho_id'])) and ($valorForm['adms_concelho_id'] == $id_conc)) { echo "<option value='$id_conc' selected>$name_concelho</option>"; } else { echo "<option value='$id_conc'>$name_concelho</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_freguesia_id" class="title-input">Freguesia:<span class="text-danger">*</span></label> <select class="input-adm" name="adms_freguesia_id" id="adms_freguesia_id1"> <option value="">Selecione</option> <?php foreach ($this->data['freguesia']['freg'] as $freg) { extract($freg); if ((isset($valorForm['adms_freguesia_id'])) and ($valorForm['adms_freguesia_id'] == $id_freg)) { echo "<option value='$id_freg' selected>$name_freguesia</option>"; } else { echo "<option value='$id_freg'>$name_freguesia</option>"; } } ?> </select> </div> </div> </div> </div> <div class="row-input"> <div class="column"> <?php $data_nascimento = ''; if (isset($valorForm['data_nascimento'])) { $data_nascimento = $valorForm['data_nascimento']; } ?> <label for="data_nascimento" class="title-input">Data Nascimento:<span class="text-danger">*</span></label> <input type="date" name="data_nascimento" id="data_nascimento" maxlength="10" max="31/12/9999" class="input-adm" placeholder="dd/mm/aaaa" value="<?php echo $data_nascimento; ?>"> </div> <div class="column"> <label for="adms_pais_id" class="title-input">País:<span class="text-danger">*</span></label> <select class="input-adm" name="adms_pais_id" id="adms_pais_id"> <option value="">Selecione</option> <?php foreach ($this->data['pais']['pais'] as $pais) { extract($pais); if ((isset($valorForm['adms_pais_id'])) and ($valorForm['adms_pais_id'] == $id)) { echo "<option value='$id' selected>$name_pais</option>"; } else { echo "<option value='$id'>$name_pais</option>"; } } ?> </select> </div> <div class="column"> <label for="nacionalidade_conjuge_id" class="title-input">Nacionalidade:<span class="text-danger">*</span> </label> <select class="input-adm" name="nacionalidade_conjuge_id" id="nacionalidade_conjuge_id"> <option value="">Selecione</option> <?php foreach ($this->data['pais']['pais'] as $pais) { extract($pais); if ((isset($valorForm['nacionalidade_conjuge_id'])) and ($valorForm['nacionalidade_conjuge_id'] == $id)) { echo "<option value='$id' selected>$name_nacionalidade</option>"; } else { echo "<option value='$id'>$name_nacionalidade</option>"; } } ?> </select> </div> </div> <label for="localidade" class="title-input">Autarquivas ou Localidade do Nascimento:</label> <div class="row-input" id="divLocalidade"> <div class="column"> <?php $localidade_nasc_conjuge = ''; if (isset($valorForm['localidade_nasc_conjuge'])) { $localidade_nasc_conjuge = $valorForm['localidade_nasc_conjuge']; } ?> <label for="localidade_nasc_conjuge" class="title-input">Localidade do Nascimento:<span class="text-danger">*</span></label> <input type="text" name="localidade_nasc_conjuge" id="localidade_nasc_conjuge" class="input-adm" placeholder="Digite a localidade do nascimento" autocomplete="off" value="<?php echo $localidade_nasc_conjuge; ?>"> </div> </div> <div class="row-input" id="divAutarquias"> <div class="column"> <label for="adms_d_nasc_conj_id" class="title-input">Distrito:</label> <select class="input-adm" name="adms_d_nasc_conj_id" id="adms_distrito_id2" onchange="selectConcelho(2)"> <option value="">Selecione</option> <?php foreach ($this->data['distritonasc']['distnasc'] as $distnasc) { extract($distnasc); if ((isset($valorForm['adms_d_nasc_conj_id'])) and ($valorForm['adms_d_nasc_conj_id'] == $id_distnasc)) { echo "<option value='$id_distnasc' selected>$name_distrito</option>"; } else { echo "<option value='$id_distnasc'>$name_distrito</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_c_nasc_conj_id" class="title-input">Concelho:</label> <select class="input-adm" name="adms_c_nasc_conj_id" id="adms_concelho_id2" onchange="selectFreguesia(2)"> <option value="">Selecione</option> <?php foreach ($this->data['concelhonasc']['concnasc'] as $concnasc) { extract($concnasc); if ((isset($valorForm['adms_c_nasc_conj_id'])) and ($valorForm['adms_c_nasc_conj_id'] == $id_concnasc)) { echo "<option value='$id_concnasc' selected>$name_concelho</option>"; } else { echo "<option value='$id_concnasc'>$name_concelho</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_f_nasc_conj_id" class="title-input">Freguesia:</label> <select class="input-adm" name="adms_f_nasc_conj_id" id="adms_freguesia_id2"> <option value="">Selecione</option> <?php foreach ($this->data['freguesianasc']['fregnasc'] as $fregnasc) { extract($fregnasc); if ((isset($valorForm['adms_f_nasc_conj_id'])) and ($valorForm['adms_f_nasc_conj_id'] == $id_fregnasc)) { echo "<option value='$id_fregnasc' selected>$name_freguesia</option>"; } else { echo "<option value='$id_fregnasc'>$name_freguesia</option>"; } } ?> </select> </div> </div> <div class="row-input"> <div class="column"> <label for="adms_cons_nasc_conj_id" class="title-input">Conservatória Nascimento:</label> <select class="input-adm" name="adms_cons_nasc_conj_id" id="adms_cons_nasc_conj_id"> <option value="">Selecione</option> <?php foreach ($this->data['conservatoria']['conserv'] as $consNascimento) { extract($consNascimento); if ((isset($valorForm['adms_cons_nasc_conj_id'])) and ($valorForm['adms_cons_nasc_conj_id'] == $id_conserv)) { echo "<option value='$id_conserv' selected>$conservatoria</option>"; } else { echo "<option value='$id_conserv'>$conservatoria</option>"; } } ?> </select> </div> <div class="column"> <?php $ano_nasc_conjuge = ''; if (isset($valorForm['ano_nasc_conjuge'])) { $ano_nasc_conjuge = $valorForm['ano_nasc_conjuge']; } ?> <label for="ano_nasc_conjuge" class="title-input">Ano do Registo de Nascimento:<span class="text-danger">*</span></label> <input type="text" name="ano_nasc_conjuge" id="ano_nasc_conjuge" class="input-adm" placeholder="2000" autocomplete="off" value="<?php echo $ano_nasc_conjuge; ?>"> </div> <div class="column"> <?php $reg_nasc_conjuge = ''; if (isset($valorForm['reg_nasc_conjuge'])) { $reg_nasc_conjuge = $valorForm['reg_nasc_conjuge']; } ?> <label for="reg_nasc_conjuge" class="title-input">Nº do Registo de Nascimento:<span class="text-danger">*</span></label> <input type="text" name="reg_nasc_conjuge" id="reg_nasc_conjuge" class="input-adm" placeholder="0000" autocomplete="off" value="<?php echo $reg_nasc_conjuge; ?>"> </div> </div> <div class="row-input"> <div class="column"> <?php $pai = ''; if (isset($valorForm['name_pai'])) { $pai = $valorForm['name_pai']; } ?> <label for="name_pai" class="title-input">Pai:</label> <input type="text" name="name_pai" id="name_pai" class="input-adm" placeholder="Digite o nome" value="<?php echo $pai; ?>"> </div> </div> <div class="row-input"> <div class="column"> <?php $mae = ''; if (isset($valorForm['name_mae'])) { $mae = $valorForm['name_mae']; } ?> <label for="name_mae" class="title-input">Mãe:</label> <input type="text" name="name_mae" id="name_mae" class="input-adm" placeholder="Digite o nome" value="<?php echo $mae; ?>"> </div> </div> <label for="beneficiario1" class="title-input">Número do Beneficiário:</label> <div class="row-input"> <div class="column"> <?php $beneficiario1 = ''; if (isset($valorForm['beneficiario1'])) { $beneficiario1 = $valorForm['beneficiario1']; } ?> <label for="beneficiario1" class="title-input">CNP:</label> <input type="text" name="beneficiario1" id="beneficiario1" data-js="cnp" class="input-adm" placeholder="###.###.###-##" value="<?php echo $beneficiario1; ?>"> </div> <div class="column"> <?php $beneficiario2 = ''; if (isset($valorForm['beneficiario2'])) { $beneficiario2 = $valorForm['beneficiario2']; } ?> <label for="beneficiario2" class="title-input">CGA:</label> <input type="text" name="beneficiario2" id="beneficiario2" class="input-adm" value="<?php echo $beneficiario2; ?>"> </div> <div class="column"> <?php $beneficiario3 = ''; if (isset($valorForm['beneficiario3'])) { $beneficiario3 = $valorForm['beneficiario3']; } ?> <label for="beneficiario3" class="title-input">Outros:</label> <input type="text" name="beneficiario3" id="beneficiario3" class="input-adm" value="<?php echo $beneficiario3; ?>"> </div> </div> <div class="row-input"> <div class="column"> <label for="adms_tipo_doc_id" class="title-input">Tipo do Documento:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_tipo_doc_id" id="adms_tipo_doc_id"> <option value="">Selecione</option> <?php foreach ($this->data['tipo_documento']['tipo'] as $tipo) { extract($tipo); if ((isset($valorForm['adms_tipo_doc_id'])) and ($valorForm['adms_tipo_doc_id'] == $id)) { echo "<option value='$id' selected>$tipo_documento</option>"; } else { echo "<option value='$id'>$tipo_documento</option>"; } } ?> </select> </div> <div class="column"> <?php $numero_doc = ''; if (isset($valorForm['numero_doc'])) { $numero_doc = $valorForm['numero_doc']; } ?> <label for="numero_doc" class="title-input">Número documento:<span class="text-danger">*</span></label> <input type="text" name="numero_doc" id="numero_doc" class="input-adm" placeholder="Digite o nome" value="<?php echo $numero_doc; ?>"> </div> <div class="column"> <label for="adms_arquivo_id" class="title-input">Arquivo de Identificação:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_arquivo_id" id="adms_arquivo_id"> <option value="">Selecione</option> <?php foreach ($this->data['arquivo']['arq'] as $arq) { extract($arq); if ((isset($valorForm['adms_arquivo_id'])) and ($valorForm['adms_arquivo_id'] == $id)) { echo "<option value='$id' selected>$name_arquivo</option>"; } else { echo "<option value='$id'>$name_arquivo</option>"; } } ?> </select> </div> <div class="column"> <?php $data_emissao = ''; if (isset($valorForm['data_emissao'])) { $data_emissao = $valorForm['data_emissao']; } ?> <label for="data_emissao" class="title-input">Data emissão:<span class="text-danger">*</span></label> <input type="date" name="data_emissao" id="data_emissao" maxlength="10" max="31/12/9999" class="input-adm" placeholder="dd/mm/aaaa" value="<?php echo $data_emissao; ?>"> </div> </div> <div class="row-input"> <div class="column"> <?php $data_validade = ''; if (isset($valorForm['data_validade'])) { $data_validade = $valorForm['data_validade']; } ?> <label for="data_validade" class="title-input">Data Validade:<span class="text-danger">*</span></label> <input type="date" name="data_validade" id="data_validade" maxlength="10" max="31/12/9999" class="input-adm" placeholder="dd/mm/aaaa" value="<?php echo $data_validade; ?>"> </div> <div class="column"> <label for="nif_pais" class="title-input">Número de Identificação Fiscal:<span class="text-danger">*</span></label> <div style="display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; gap: 5px; width: 100%; align-items: flex-end;"> <?php $nif_pais = ''; if (isset($valorForm['nif_pais'])) { $nif_pais = $valorForm['nif_pais']; } ?> <input type="text" name="nif_pais" id="nif_pais" onchange="SetMaxLength()" class="input-adm" maxlength="2" placeholder="PT" value="<?php echo $nif_pais; ?>" style="width: 60px !important; flex-shrink: 0 !important; text-align: center; text-transform: uppercase;"> <?php $numero_nif = ''; if (isset($valorForm['numero_nif'])) { $numero_nif = $valorForm['numero_nif']; } ?> <input type="text" name="numero_nif" id="numero_nif" onkeyup="myFunction()" class="input-adm" value="<?php echo $numero_nif; ?>" style="flex-grow: 1 !important; width: 100%;"> </div> </div> </div> <div class="row-input"> <div class="column"> <?php $numero_eleitor = ''; if (isset($valorForm['numero_eleitor'])) { $numero_eleitor = $valorForm['numero_eleitor']; } ?> <label for="numero_eleitor" class="title-input">Número Eleitor:<span class="text-danger">*</span></label> <input type="text" name="numero_eleitor" id="numero_eleitor" class="input-adm" value="<?php echo $numero_eleitor; ?>"> </div> <div class="column"> <?php $freguesia_eleitor = ''; if (isset($valorForm['freguesia_eleitor'])) { $freguesia_eleitor = $valorForm['freguesia_eleitor']; } ?> <label for="freguesia_eleitor" class="title-input">Freguesia Eleitoral:</label> <input type="text" name="freguesia_eleitor" id="freguesia_eleitor" onkeyup="myFunction()" class="input-adm" value="<?php echo $freguesia_eleitor; ?>"> </div> <div class="column"> <div class="column margin-top-search"> <button type="submit" name="sendEleitor" class="btn-info" value="Pesquisar">Pesquisar</button> </div> </div> </div> </div> <!-- Fim da Aba Cliente--> <!-- Inicio da Aba descententes/herdeiros --> <div class="content-abas" id="herdeiros"> <div class="row-input"> <div class="column"> <label for="herdeiros_id" class="title-input">Deixou descendentes/herdeiros:<span class="text-danger">*</span> </label> <div class="column"> <select class="input-adm" name="herdeiros_id" id="herdeiros_id"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); if ((isset($valorForm['herdeiros_id'])) and ($valorForm['herdeiros_id'] == $id)) { echo "<option value='$id' selected>$resposta</option>"; } else { echo "<option value='$id'>$resposta</option>"; } } ?> </select> </div> <div class="wrapper" id="formFilhos"> <div class="row"> <div class="top-list"> <div class="top-list-right"> <?= $this->utils::responsiveButtons([ [ 'label' => 'Adicionar Filhos', 'icon' => 'fa-solid fa-rectangle-list', 'attributes' => [ 'type' => 'button', 'id' => 'add-filhos', 'class' => 'btn-info', 'title' => 'Adicionar Filhos', 'onclick' => "abrirModal('modalFilhos')" ], ], ]) ?> </div> </div> <!-- Inicio da Tabela Listar --> <table class="table-list"> <thead class="list-head"> <tr> <th class="list-head-content">Nome</th> <th class="list-head-content">Data Nascimento</th> <th class="list-head-content table-md-none">Menor</th> <th class="list-head-content">Ações</th> </tr> </thead> <tbody class="list-body" id="tabela-filhos-container"> <?php if (!empty($this->data['listFilhos'])) { foreach ($this->data['listFilhos'] as $filho) { extract($filho); ?> <tr> <td class="list-body-content"><?php echo $name_filho; ?></td> <td class="list-body-content"><?php echo (!empty($data_nascimento_filho) && $data_nascimento_filho != '0000-00-00') ? date('d/m/Y', strtotime($data_nascimento_filho)) : '';?></td> <td class="list-body-content table-md-none"> <?php $idade = date_diff(date_create($data_nascimento_filho), date_create('now'))->y; echo ($idade < 18) ? "Sim" : "Não";?></td> <td class="list-body-content btn"> <div class="icon_botoes"> <a class="btn-primary" href="<?php echo URLADM; ?>view-filho/index/<?php echo $id; ?>"><i class="fa-solid fa-eye"></i></a> <a class="btn-warning" href="<?php echo URLADM; ?>edit-filho/index/<?php echo $id; ?>"><i class="fa-solid fa-pen-to-square"></i></a> <?php echo "<a class='btn-danger' href='" . URLADM . "delete-filho/index/$id' onclick='return confirm(\"Tem certeza?\")'><i class='fa-solid fa-trash-can'></i></a>"; ?> </div> <div class="dropdown-action"> <button type="button" class="dropdown-btn-action" onclick="actionDropdown(<?php echo $id; ?>); return false;"> Ações </button> <div id="actionDropdown<?php echo $id; ?>" class="dropdown-action-item"> <a href="<?php echo URLADM; ?>view-filho/index/<?php echo $id; ?>">Visualizar</a> <a href="<?php echo URLADM; ?>edit-filho/index/<?php echo $id; ?>">Editar</a> <a href="<?php echo URLADM; ?>delete-filho/index/<?php echo $id; ?>" onclick="return confirm('Tem certeza?')">Apagar</a> </div> </div> </td> </tr> <?php } } ?> </tbody> </table> <!-- Fim da Tabela Listar --> </div> </div> </div> </div> <div class="row-input"> <div class="column"> <label for="bens" class="title-input">Deixou Bens:<span class="text-danger">*</span> </label> <select class="input-adm" name="bens" id="bens"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); if ((isset($valorForm['bens'])) and ($valorForm['bens'] == $id)) { echo "<option value='$id' selected>$resposta</option>"; } else { echo "<option value='$id'>$resposta</option>"; } } ?> </select> </div> <div class="column"> <label for="testamentos" class="title-input">Fez testamentos:<span class="text-danger">*</span> </label> <select class="input-adm" name="testamentos" id="testamentos"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); if ((isset($valorForm['testamentos'])) and ($valorForm['testamentos'] == $id)) { echo "<option value='$id' selected>$resposta</option>"; } else { echo "<option value='$id'>$resposta</option>"; } } ?> </select> </div> </div> </div> <!-- Fim da Aba descententes/herdeiros --> <span id="msgViewStrength"><br></span> <p class="text-danger mb-5 fs-4">* Campo Obrigatório</p><br> <button type="submit" name="SendAddProcesso" class="btn-warning" value="Cadastrar">Cadastrar</button> </form> <!-- Fim do Formulário de Funeral --> </div> </div> </div> <!-- Fim do conteudo do administrativo --> Janela Modal que esta no final da View app.php <!-- Modal de cadastro de filhos --> <div id="modalFilhos" style="display: none; position: fixed; z-index: 9999; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0,0,0,0.6); font-family: sans-serif;"> <div style="background-color: #fefefe; margin: 2% auto; width: 85%; max-width: 1000px; border-radius: 6px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <div style="padding: 15px 20px; border-bottom: 1px solid #dee2e6; display: flex; justify-content: space-between; align-items: center; background-color: #fff; border-top-left-radius: 6px; border-top-right-radius: 6px;"> <h3 style="margin: 0; font-size: 1.25rem; color: #333;">Cadastrar Filhos</h3> <button type="button" onclick="fecharModal('modalFilhos')" style="background: none; border: none; font-size: 1.5rem; cursor: pointer; color: #000; opacity: 0.5;">&times;</button> </div> <div style="padding: 20px; max-height: 70vh; overflow-y: auto; background-color: #fff;"> <div class="wrapper"> <div class="row"> <div class="content-adm-alert"> <?php $this->utils->getSessionMsg(); ?> <span id="msg"></span> </div> <div class="content-adm"> <form method="POST" action="/add-filhos/index" id="form-add-filhos" class="form-adm"> <div class="row-input"> <div class="column"> <label for="adms_genero_id" class="title-input">Gênero:<span class="text-danger">*</span> </label> <input name="processo_id" id="processo_id" type="hidden" class="input-process" readonly value="<?= $this->data['proximo_processo'] ?? '----/----' ?>"> <select class="input-adm" name="adms_genero_id" id="adms_genero_id"> <option value="">Selecione</option> <?php foreach ($this->data['genero']['gen'] as $genero) { extract($genero); echo "<option value='$id' " . ((isset($valorForm['adms_genero_id']) && $valorForm['adms_genero_id'] == $id) ? 'selected' : '') . ">$name_genero</option>"; } ?> </select> </div> <div class="column"> <label for="beneficiario1" class="title-input">Número do Beneficiário:</label> <input type="text" name="beneficiario1" id="beneficiario1" data-js="cnp" class="input-adm" placeholder="###.###.###-##" value="<?= $valorForm['beneficiario1'] ?? '' ?>"> </div> </div> <div class="row-input"> <div class="column"> <label for="name_filho" class="title-input">Nome:<span class="text-danger">*</span></label> <input type="text" name="name_filho" id="name_filho" class="input-adm" placeholder="Digite o nome completo" autocomplete="off" value="<?= $valorForm['name'] ?? '' ?>" autofocus> </div> </div> <div class="row-input"> <div class="column"> <label for="data_nascimento_filho" class="title-input">Data Nascimento:<span class="text-danger">*</span></label> <input type="date" name="data_nascimento_filho" id="data_nascimento_filho" maxlength="10" class="input-adm" value="<?= $valorForm['data_nasc'] ?? '' ?>"> </div> <div class="column"> <label for="adms_grau_parentesco_id" class="title-input">Grau de Parentesco:</label> <select class="input-adm" name="adms_grau_parentesco_id" id="adms_grau_parentesco_id"> <option value="">Selecione</option> <?php foreach ($this->data['grau']['parentesco'] as $parentescoFilho) { extract($parentescoFilho); echo "<option value='$id' " . ((isset($valorForm['adms_grau_parentesco_id']) && $valorForm['adms_grau_parentesco_id'] == $id) ? 'selected' : '') . ">$name_parentesco</option>"; } ?> </select> </div> <div class="column"> <div class="row-input"> <div class="column"> <label for="pais_nif_filho" class="title-input">Número de Identificação Fiscal:<span class="text-danger">*</span></label> <div style="display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; gap: 5px; width: 100%; align-items: flex-end;"> <input type="text" name="pais_nif_filho" id="pais_nif_filho" onchange="SetMaxLength()" class="input-adm" maxlength="2" placeholder="PT" value="<?= $valorForm['nif_pais'] ?? '' ?>" style="width: 60px !important; flex-shrink: 0 !important; text-align: center; text-transform: uppercase;"> <input type="text" name="numero_nif_filho" id="numero_nif_filho" onkeyup="myFunction()" class="input-adm" value="<?= $valorForm['numero_nif'] ?? '' ?>" style="flex-grow: 1 !important; width: 100%;"> </div> </div> </div> </div> </div> <div class="row-input"> <div class="column"> <label for="grau_ensino" class="title-input">Grau de ensino:<span class="text-danger">*</span></label> <input type="text" name="grau_ensino" id="grau_ensino" class="input-adm" placeholder="Grau de ensino" value="<?= $valorForm['grau_ensino'] ?? '' ?>"> </div> <div class="column"> <label for="ano_ensino" class="title-input">Ano de ensino:<span class="text-danger">*</span></label> <input type="text" name="ano_ensino" id="ano_ensino" class="input-adm" placeholder="Ano de ensino" value="<?= $valorForm['ano_ensino'] ?? '' ?>"> </div> <div class="column"> <label for="trabalhador_id" class="title-input">Exerce actividade profissional:<span class="text-danger">*</span> </label> <select class="input-adm" name="trabalhador_id" id="trabalhador_id"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); echo "<option value='$id' " . ((isset($valorForm['trabalhador_id']) && $valorForm['trabalhador_id'] == $id) ? 'selected' : '') . ">$resposta</option>"; } ?> </select> </div> <div class="column"> <label for="a_cargo_id" class="title-input">Esta a cargo do beneficiário:<span class="text-danger">*</span> </label> <select class="input-adm" name="a_cargo_id" id="a_cargo_id"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); echo "<option value='$id' " . ((isset($valorForm['a_cargo_id']) && $valorForm['a_cargo_id'] == $id) ? 'selected' : '') . ">$resposta</option>"; } ?> </select> </div> <div class="column"> <label for="fisica_id" class="title-input">Possui doença Física?:<span class="text-danger">*</span> </label> <select class="input-adm" name="fisica_id" id="fisica_id"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); echo "<option value='$id' " . ((isset($valorForm['fisica_id']) && $valorForm['fisica_id'] == $id) ? 'selected' : '') . ">$resposta</option>"; } ?> </select> </div> <div class="column"> <label for="psiquica_id" class="title-input">Possui doença Psicológica?:<span class="text-danger">*</span> </label> <select class="input-adm" name="psiquica_id" id="psiquica_id"> <option value="">Selecione</option> <?php foreach ($this->data['resposta']['resposta'] as $bens) { extract($bens); echo "<option value='$id' " . ((isset($valorForm['psiquica_id']) && $valorForm['psiquica_id'] == $id) ? 'selected' : '') . ">$resposta</option>"; } ?> </select> </div> </div> <div class="row-input"> <div class="column"> <label for="observacoes" class="title-input">Observações:</label> <textarea name="observacoes" id="observacoes" class="input-adm"><?= $valorForm['observacoes'] ?? '' ?></textarea> </div> </div> <span id="msgViewStrength"><br></span> <p class="text-danger mb-5 fs-4">* Campo Obrigatório</p><br> </form> </div> </div> </div> </div> <div style="padding: 15px 20px; border-top: 1px solid #dee2e6; display: flex; justify-content: flex-end; gap: 10px; background-color: #f8f9fa; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;"> <button type="button" onclick="fecharModal('modalFilhos')" style="padding: 8px 20px; background-color: #6c757d; color: white; border: none; border-radius: 4px; cursor: pointer;">Fechar</button> <button type="submit" form="form-add-filhos" name="SendAddFilho" style="padding: 8px 20px; background-color: #ffc107; color: #000; border: none; border-radius: 4px; cursor: pointer; font-weight: bold;">Incluir</button> </div> </div> </div> <!-- Fim da janela modal --> Este é o javascript completo: //permitir retorno no navegador if (window.history.replaceState) { window.history.replaceState(null, null, window.location.href) } /* Inicio Dropdown Navbar */ /* Cria a variavel para receber o que fizer no seletor */ let notification = document.querySelector('.notification') let avatar = document.querySelector('.avatar') /* Nome da função(dropMenu) que recebe o parametro(avatar / notification) */ dropMenu(avatar) dropMenu(notification) function dropMenu(selector) { selector.addEventListener('click', () => { let dropdownMenu = selector.querySelector('.dropdown-menu') /* Operação Ternária */ /* Se verdadeiro ? devolve verdadeiro : se não devolve segundo valor */ dropdownMenu.classList.contains('active') ? dropdownMenu.classList.remove('active') : dropdownMenu.classList.add('active') }) } function actionDropdown(id) { closeDropdownAction() document.getElementById('actionDropdown' + id).classList.toggle('show-dropdown-action') } window.onclick = function (event) { if (!event.target.matches('.dropdown-btn-action')) { /*document.getElementById("actionDropdown").classList.remove("show-dropdown-action");*/ closeDropdownAction() } } function closeDropdownAction() { var dropdowns = document.getElementsByClassName('dropdown-action-item') var i for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i] if (openDropdown.classList.contains('show-dropdown-action')) { openDropdown.classList.remove('show-dropdown-action') } } } /* Inicio dropdown sidebar */ var dropdownSidebar = document.getElementsByClassName('dropdown-btn') var i for (i = 0; i < dropdownSidebar.length; i++) { dropdownSidebar[i].addEventListener('click', function () { this.classList.toggle('active') var dropdownContent = this.nextElementSibling if (dropdownContent.style.display === 'block') { dropdownContent.style.display = 'none' } else { dropdownContent.style.display = 'block' } }) } //Abre a aba de documentos no meu cadastrar cliente document.getElementById('tabPadrao').click() function abrirAba(event, idAba) { const abas = document.getElementsByClassName('content-abas') for (var i = 0; i < abas.length; i++) { abas[i].style.display = 'none' } var tabs = document.getElementsByClassName('tab-button') for (var i = 0; i < tabs.length; i++) { tabs[i].className = tabs[i].className.replace(' active', '') } document.getElementById(idAba).style.display = 'block' event.currentTarget.className += ' active' } // Captura o select e o container da tabela const selectHerdeiros = document.getElementById('herdeiros_id') // ID corrigido const formFilhos = document.getElementById('formFilhos') // Adiciona o evento de escuta selectHerdeiros.addEventListener('change', function (event) { // Ajuste os cases conforme os IDs reais do seu banco (ex: 1 para "Sim", 2 para "Não") switch (event.target.value) { case '1': // Supondo que 1 seja "Sim" formFilhos.style.display = 'block' // ou 'grid', dependendo do seu layout break default: formFilhos.style.display = 'none' break } })
  4. Boa tarde, Existe alguma extensão ou forma de verificar se alguma tag não esta fechada correctamente no visual studio?
  5. Ola a todos, Tenho um sistema que estou a desenvolver e preciso que envie email sempre que existe um registo de um novo master user ou então quando é Solicitado o reenvio do email de ativação de conta, que acontece quando é definida a password, atraves de um email que contem um link (email convite)! Pois bem, agora vamos entrar no pior, no sistema o master user ativo (OWNER ou SUPER_ADMIN) podem criar regras de notificação Selecionando: - Evento (NEW_MASTER_USER, INVITE_MASTER_USER, LOGIN_BLOCKED, PASSWORD_RESET, SECURITY_ALERT, SYSTEM_ERROR) - Tipo (Utilizador, Perfil (Role), Email Externo) - Destino (Depende do tipo - Tipo: Utilizador - Destino: Seleciona Master User Ativo num <select> - Tipo: Perfil (Role) - Destino: OWNER, SUPER_ADMIN, ADMIN, FINANCEIRO (uma das opçoes) - Tipo: Email externo - Destino: Email a escolha escrito pelo utilizador Acontece que o sistema nao envia os emails devidos e da a informação que foi Reenviado! Abaixo vou colocar o código dos ficheiros com o respetivo caminho que acho que são relevantes para ver se alguem me consegue ajudar... config/config.php <?php declare(strict_types=1); date_default_timezone_set('UTC'); /* ================= ENV ================= */ function env(string $key, $default = null) { static $vars = null; if ($vars === null) { $vars = []; $path = __DIR__ . '/../.env'; if (file_exists($path)) { foreach (file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) { if (str_starts_with(trim($line), '#')) continue; [$k, $v] = explode('=', $line, 2); $vars[$k] = trim($v, "\"'"); } } } return $vars[$key] ?? $default; } /* ================= MAIL ================= */ define('MAIL_ENABLED', env('MAIL_ENABLED', 'false') === 'true'); define('MAIL_HOST', env('MAIL_HOST')); define('MAIL_PORT', (int)env('MAIL_PORT', 587)); define('MAIL_ENCRYPTION', env('MAIL_ENCRYPTION', 'tls')); define('MAIL_USERNAME', env('MAIL_USERNAME')); define('MAIL_PASSWORD', env('MAIL_PASSWORD')); define('MAIL_FROM_EMAIL', env('MAIL_FROM_EMAIL')); define('MAIL_FROM_NAME', env('MAIL_FROM_NAME')); /* ================= SESSION ================= */ if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } /* ================= PDO ================= */ require_once __DIR__ . '/database.php'; /* ================= CORE ================= */ require_once __DIR__ . '/functions.php'; require_once __DIR__ . '/security.php'; /* ================= SERVICES ================= */ require_once __DIR__ . '/../services/EmailLogger.php'; require_once __DIR__ . '/../services/EmailService.php'; define('BASE_URL', 'https://fleetlicenser.mabpinto.ddns.net'); /services/EmailService.php <?php declare(strict_types=1); use PHPMailer\PHPMailer\PHPMailer; require_once __DIR__ . '/../vendor/autoload.php'; final class EmailService { public static function send( string $eventKey, array $variables = [], array $context = [] ): void { if (!MAIL_ENABLED) { return; } global $pdo; if (!$pdo instanceof PDO) { error_log('[EMAIL] PDO indisponível'); return; } /* EVENTO */ $stmt = $pdo->prepare(" SELECT id_event FROM tb_email_event WHERE event_key = ? AND ativo = 1 "); $stmt->execute([$eventKey]); if (!$stmt->fetchColumn()) { error_log("[EMAIL] Evento inválido: {$eventKey}"); return; } /* TEMPLATE */ $stmt = $pdo->prepare(" SELECT subject, body_html, body_text FROM tb_email_template WHERE event_key = ? AND active = 1 LIMIT 1 "); $stmt->execute([$eventKey]); $tpl = $stmt->fetch(PDO::FETCH_ASSOC); if (!$tpl) { error_log("[EMAIL] Template inexistente: {$eventKey}"); return; } /* RECIPIENTS */ $stmt = $pdo->prepare(" SELECT r.recipient_type, r.recipient_value FROM tb_email_recipient r JOIN tb_email_event e ON e.id_event = r.id_event WHERE e.event_key = ? AND r.enabled = 1 AND e.ativo = 1 "); $stmt->execute([$eventKey]); $emails = []; foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) { if ($r['recipient_type'] === 'EMAIL') { $emails[] = $r['recipient_value']; } } if (!$emails) { error_log("[EMAIL] Sem destinatários: {$eventKey}"); return; } /* SMTP */ try { $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = MAIL_HOST; $mail->SMTPAuth = true; $mail->Username = MAIL_USERNAME; $mail->Password = MAIL_PASSWORD; $mail->Port = MAIL_PORT; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->setFrom(MAIL_FROM_EMAIL, MAIL_FROM_NAME); foreach ($emails as $e) { $mail->addAddress($e); } $mail->isHTML(true); $mail->Subject = self::parse($tpl['subject'], $variables); $mail->Body = self::parse($tpl['body_html'], $variables); $mail->AltBody = strip_tags($mail->Body); $mail->send(); EmailLogger::log($pdo, $eventKey, $emails, 'SENT', null, $context); } catch (Throwable $e) { EmailLogger::log($pdo, $eventKey, $emails, 'ERROR', $e->getMessage(), $context); error_log('[EMAIL ERROR] ' . $e->getMessage()); } } private static function parse(string $text, array $vars): string { foreach ($vars as $k => $v) { $text = str_replace('{{'.$k.'}}', (string)$v, $text); } return $text; } } /services/EmailLogger.php <?php declare(strict_types=1); class EmailLogger { public static function log( PDO $pdo, string $eventKey, array $recipients, string $status, ?string $error = null, array $context = [] ): void { $stmt = $pdo->prepare(" INSERT INTO tb_email_log (event_key, recipients, status, error_message, context) VALUES (?, ?, ?, ?, ?) "); $stmt->execute([ $eventKey, json_encode($recipients, JSON_UNESCAPED_UNICODE), $status, $error, json_encode($context, JSON_UNESCAPED_UNICODE) ]); } } /modules/master/master.php <!-- REENVIAR CONVITE --> <?php if ($u['estado'] === 'pendente'): ?> <form method="post" action="master_user_resend_invite.php" class="d-inline" onsubmit="return confirm('Reenviar convite por email?')"> <input type="hidden" name="csrf_token" value="<?= csrfToken() ?>"> <input type="hidden" name="id_user" value="<?= $u['id_user'] ?>"> <button class="btn btn-sm btn-outline-info" title="Reenviar convite"> <i class="bi bi-envelope"></i> </button> </form> <?php endif; ?> <?php elseif ($u['estado'] === 'inativo'): ?> /modules/master/master_user_resend_invite.php <?php declare(strict_types=1); require '../../config/config.php'; requireMasterLogin(); requireRole(['OWNER','SUPER_ADMIN']); validateCsrf($_POST['csrf_token'] ?? ''); $userId = (int)($_POST['id_user'] ?? 0); if ($userId <= 0) { $_SESSION['error'] = 'Utilizador inválido.'; header('Location: master.php'); exit; } /* USER */ $stmt = $pdo->prepare(" SELECT id_user, nome, email, estado FROM tb_master_user WHERE id_user = ? "); $stmt->execute([$userId]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if (!$user || $user['estado'] !== 'pendente') { $_SESSION['error'] = 'Utilizador inválido ou não pendente.'; header('Location: master.php'); exit; } /* TOKEN */ $token = bin2hex(random_bytes(32)); $expires = date('Y-m-d H:i:s', strtotime('+48 hours')); $pdo->prepare(" INSERT INTO tb_user_invite_token (id_user, token, expires_at) VALUES (?, ?, ?) ")->execute([$userId, $token, $expires]); $link = BASE_URL . "/auth/define_password.php?token={$token}"; /* EMAIL */ EmailService::send( 'INVITE_MASTER_USER', [ 'user_name' => $user['nome'], 'invite_link' => $link ], [ 'id_user' => $userId, 'origin' => 'resend_invite' ] ); $_SESSION['success'] = 'Convite reenviado com sucesso.'; header('Location: master.php'); exit; Inicialmente fiz a configuração de email, sem passar pelas regras funcionou. Agora que inseri as regras, penso que nao chama nem a funçãoEmailService::send Ja não sei mais como fazer. Isto está no meu servidor. Agradeço muito desde ja a todos que me possam ajudar! Obrigado e um bom ano!!!
  6. Bom dia a todos, tenho um site que fiz a uma pessoa amiga, em PHP com estrutura MVC, esta perfeito e a funcionar. Agora quero fazer um administrativo para ele poder gerenciar todo o site sozinho sem precisar que eu faça algo. Já até o fiz todo em lavável. Quero vos pedir uma opinião e o que aconselham. Existe no site um setor de serviços, que será adicionado por ele (modulo esse que já esta feito e a funcionar) e cada serviço deverá ter uma página com um carrossel de fotos e uma descrição do serviço. A minha duvida é: Quando ele criar um novo serviço, devo pedir para criar uma controller, model, e View? Ou existe a possibilidade de criar uma MVC genérica para todas? mudando apenas o endereço na barra de URL? Exemplo: Ao clicar no botão "adicionar" faça o seguinte: Se clicou no adicionar Crie um arquivo com o nome ControllerX Dentro do arquivo adicione o seguinte código: <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\StsContacto; class ControllerX extends Controller { public function index() { $contact = StsContacto::where('id',1)->first(); return view('admin.contactos', compact('contact')); } quando criado, crie um outro arquivo ModelX Adicione o código e depois crie a View com o código. fim mais ou menos isso ou qual a ideia que vocês me dão? Espero que tenha sido claro.
  7. Olá a todos espero que possam ajudar a ter ideias para a minha PAP, tenho exatamente 29 dias para entregar o anteprojeto e só sei que quero fazer um site ou uma aplicação, gostaria que me dessem ideias queria algo não muito díficil mas que me desse uma boa nota!! Espero que me possam ajudar!!
  8. Boa Tarde pessoal Precisava aqui de uma ajuda sou muito verdinho na programação mas tava tentar desenvolver um site para mim em laravel usando o framework filament. Alguém aqui consegue me dizer se é possível esconder numa tabela que retorna os Usuários e com privilegios "SuperAdmin" para outros usuários com privilégio mais baixo (Admin, Moderador) nao o poderem editar mas que o "Superadmin" possa ver todos e possa editar todos. Isto tudo dentro da função "ViewAny" nas "UserPolicies" . Algo assim: public function viewAny(User $user): bool { if ($user->hasRole(['SuperAdmin'])) { return true; } else if ($user->hasRole(['Admin'])) { return $user->id !== 1; // Assumindo SuperAdmin tem ID 1 } else { return false; //Retorna valor falso se nenhuma permissão assumida } }
  9. Boa noite pessoal, fiz um código que cadastra no banco de dados o email enviado através do formulário e envia. Esta a funcionar. mas após enviar o email esta redirecionando para a pagina home, e já tentei de tudo e não consigo, peço vos que me ajudem a verificar. Controller Contato.php <?php namespace Sts\Controllers; class Contato { /** * Recebe os dados que devem ser en iados para VIEW */ private array|string|null $data = null; /** * recebe os dados do formulario */ private array|null $dataForm; /**s * Instancia a classe responsavel em carregar a view * * @return void */ public function index() { $this->dataForm = filter_input_array(INPUT_POST, FILTER_DEFAULT); if (!empty($this->dataForm['AddContMsg'])) { unset($this->dataForm['AddContMsg']); $createContactMsg = new \Sts\Models\StsContato(); if($createContactMsg->create($this->dataForm)) { } else { $this->data['form'] = $this->dataForm; } } $this->data['menu'] = 'content'; $loadView = new \Core\ConfigView('sts/Views/contato/contato', $this->data); $loadView->loadView(); } } Modem StsContato.php <?php namespace Sts\Models; /** Model para cadastrar registos no banco de dados */ class StsContato { private $data; public function create(array $data): bool { $this->data = $data; $this->data['created'] = date('Y-m-d H:i:s'); $createContactMsg = new \Sts\helper\StsCreate(); $createContactMsg->exeCreate('sts_contacts_msgs', $this->data); if($createContactMsg->getResult()) { $this->sendEmail(); return true; } else { $_SESSION['msg'] = "<p style='color: red;'>Erro ao enviar mensagem!</p>"; return false; } } private function sendEmail(): void { $sendEmail = new \Sts\helper\StsSendMail(); $sendEmail->sendEmail(); if ($sendEmail->getResult()) { $_SESSION['msg'] = "<p class='alert-success'>Mensagem enviada com sucesso!</p>"; $this->result = true; } else { $_SESSION['msg'] = "<p class='alert-danger'>Mensagem nao enviada com sucesso!</p>"; $this->result = false; } } } Helper StsSendMail.php <?php namespace Sts\helper; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; /** * Classe para enviar email * * @author John <jht_pt@icloud.com> */ class StsSendMail { /** * @var array recebe as informaçoes do conteudo do email */ private array $data; /** * @var array recebe as credenciais do email */ private array $dataInfoEmail; /** * @var array|null recebe as credenciais do banco de dados */ private array|null $resultBd; /** * @var bool recebe true quando executar com sucesso e false quando houver erro */ private bool $result; /** * @var string recebe as informações o email do remetente */ private string $fromEmail; /** * Retorna true quando executar com sucesso e false quando houver erro */ public function getResult(): bool { return $this->result; } public function sendEmail(): void { //Dados do Destinatario $this->data['toEmail'] = $_POST['email']; $this->data['toName'] = $_POST['name']; $this->data['contact'] = $_POST['contact']; $this->data['subject'] = $_POST['subject']; $this->data['contentHtml'] = $_POST['content']; $this->data['contentText'] = $_POST['content']; $this->infoPhpMailer(); } private function infoPhpMailer(): void { $confEmail = new StsRead(); $confEmail->fullRead('SELECT title, name, email, host, usename, password, smtpsecure, port FROM sts_confs_email WHERE id =:id LIMIT :limit', 'id=1&limit=1'); $this->resultBd = $confEmail->getResult(); //verifica se recebeu algum registo do banco de dados if($this->resultBd) { //Continua o processamento //dados do servidor de envio $this->dataInfoEmail['host'] = $this->resultBd[0]['host']; $this->dataInfoEmail['fromEmail'] = $this->resultBd[0]['email']; $this->fromEmail = $this->dataInfoEmail['fromEmail']; $this->dataInfoEmail['fromName'] = $this->resultBd[0]['name']; $this->dataInfoEmail['userName'] = $this->resultBd[0]['usename']; $this->dataInfoEmail['password'] = $this->resultBd[0]['password']; $this->dataInfoEmail['smtpsecure'] = $this->resultBd[0]['smtpsecure']; $this->dataInfoEmail['port'] = $this->resultBd[0]['port']; $this->sendEmailPhpMailer(); } else { $_SESSION['msg'] = "<p class='alert-danger'>Mensagem não enviada com sucesso!</p>"; $this->result = false; } } private function sendEmailPhpMailer(): void { $mail = new PHPMailer(true); try { //Configurações do servidor //$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Exibe o debug do envio $mail->CharSet = 'UTF-8'; //Aceita caracteres especiais $mail->isSMTP(); $mail->Host = $this->dataInfoEmail['host']; //Host do servidor $mail->SMTPAuth = true; $mail->Username = $this->dataInfoEmail['userName']; //Usuario $mail->Password = $this->dataInfoEmail['password']; //Senha $mail->SMTPSecure = $this->dataInfoEmail['smtpsecure']; $mail->Port = $this->dataInfoEmail['port']; //Dados do Destinatário $mail->setFrom($this->dataInfoEmail['fromEmail'], $this->dataInfoEmail['fromName']); $mail->addAddress( $this->dataInfoEmail['fromEmail'], $this->data['toName']); //Email do destinatário $mail->addReplyTo($this->data['toEmail'], $this->data['toName']); //conteudo do Email $mail->isHTML(true); //Set email format to HTML $mail->Subject = $this->data['subject']; $mail->Body = '<p><strong>Contato:</strong> ' . htmlspecialchars($this->data['contact']) . '</p>' . $this->data['contentHtml']; $mail->AltBody = 'Contato: ' . $this->data['contact'] . "\n" . $this->data['contentText']; $mail->send(); $this->result = true; } catch (Exception $e) { $this->result = false; } } } View contato.php <?php if (isset($this->data['form'])) { $valueForm = $this->data['form']; extract($valueForm); } ?> <!-- Inicio do contacto --> <div class="page-content contact"> <div class="container"> <div class="row"> <div class="col-md-4"> <div class="item"> <div class="icon"><i class="fas fa-map-marker-alt"></i></div> <h2>Morada</h2> <div class="text"> Rua A, N123<br> (VISITAS POR MARCAÇÕES)<br> </div> </div> </div> <div class="col-md-4"> <div class="item"> <div class="icon"><i class="fas fa-phone-alt"></i></div> <h2>Contacto</h2> <div class="text"> Telm. +351 000 000 000<br> (Chamada nacional)<br> </div> </div> </div> <div class="col-md-4"> <div class="item"> <div class="icon"><i class="fas fa-envelope"></i></div> <h2>Email</h2> <div class="text"> <a class="email" href="mailto:geral@meuemail.pt?subject=Pedido de Informação"> email: geral@meuemail.pt</a> </div> </div> </div> </div> <div class="row form-map"> <div class="col-lg-6 col-md-12"> <h2>Entre em contacto connosco através do formulário:</h2> <form action="" method="post"> <?php $value_name = ''; if (isset($name)) { $value_name = $name; } ?> <div class="mb-3"> <input name="name" type="text" id="name" class="form-control" placeholder="Nome completo*" value="<?php echo $value_name; ?>" required="required"> </div> <?php $value_email = ''; if (isset($email)) { $value_email = $email; } ?> <div class="mb-3"> <input name="email" type="email" id="email" placeholder="Email*" class="form-control" value="<?php echo $value_email; ?>" required="required"> </div> <?php $value_contact = ''; if (isset($contact)) { $value_contact = $contact; } ?> <div class="mb-3"> <input name="contact" type="text" id="contact" placeholder="Contacto*" class="form-control" value="<?php echo $value_contact; ?>" required="required"> </div> <?php $value_subject = ''; if (isset($subject)) { $value_subject = $subject; } ?> <div class="mb-3"> <input name="subject" type="text" id="subject" class="form-control" placeholder="Assunto da mensagem*" value="<?php echo $value_subject; ?>"> </div> <?php $value_content = ''; if (isset($content)) { $value_content = $content; } ?> <div class="mb-3"> <textarea id="content" name="content" class="form-control" rows="6" cols="50" placeholder="Conteúdo da mensagem*" required="required"><?php echo $value_content; ?></textarea> </div> <span>( * ) - todos os itens são requeridos</span> <div class="mb-3"> <input name="AddContMsg" type="submit" class="btn btn-primary" value="Enviar"></input> <?php //Exibir mensagens if(isset($_SESSION['msg'])) { echo ' ' . $_SESSION['msg']; unset($_SESSION['msg']); } ?> </div> </form> </div> <div class="col-lg-6 col-md-12"> <h2>Visitas somente por marcações:</h2> </div> </div> </div> </div> <!-- Fim contactos--> Já tenho os olhos trocados e não consigo achar, gostaria que não redirecionasse para a página home e sim ficasse na pagina de contato e exibisse apenas a mensagem de "Mensagem enviada com sucesso" no local que coloquei na View ou em um alert. Por favor ajudem me. Gratidão
  10. Adampt

    Imagem em FPDF

    Boa tarde. Estou a criar cartões de identificação dos funcionários de uma empresa, os quais deverão ser convertidos em PDF para posterior impressão. Para tal estou a utilizar o FPDF e está tudo a funcionar na perfeição, mas acontece que tenho de colocar a foto do funcionário que está no formato quadrado e pedem-me que seja em formato circular. Há possibilidade de fazer esta conversão? Se sim, como? Desde já, o meu obrigado
  11. Boa tarde, Alguem já conseguiu criar uam pagina PHP para criar artigos no PHC ?
  12. Olá amigos. Preciso bloquear o acesso à página de edição de dados de um determinado jogador que faz parte de uma determinada equipa. Apenas um utilizador (diretor da equipa) registado e com login efetuado pode aceder a esta página (até aqui tudo bem) para alterar os dados desse jogador. Pretendo bloquear esta página para que o acesso seja feito apenas a partir de um boão (editar) colocado à frente do nome do jogador e não com copy/paste do link ou com alteração dos dados que aparecem no link como seja, o id do jogador e o id da equipa. Já tentei várias soluções mas sem sucesso. O botão editar tem o seguinte código <a href='fedit_elementogrupo.php?idelemento=<?php echo $linhas['idgel']; ?>&idgrupo2=<?php echo $grupo; ?>'> <button type='button' class='btn btn-xs btn-warning' name='edit' id='edit'><?php echo $lang['ede2'] ?></button></a>
  13. Boa noite. Tenho um sistema para registo de nomes que podem ser de pessoas ou empresas de todo o mundo. Neste sistema tenho uma opção para gerar um relatório em PDF em que estou utilizando o FPDF. Acontece que, tendo nomes de diferentes países, também tem caracteres especiais como por exemplo "čić", mas que ao passar para o relatório aparece como "?I?". Já tentei com diversas opções que encontrei na internet (utf8_encode, utf8_decode, entre outras), mas nenhuma delas resultou. Existe alguma forma de resolver esta situação?
  14. <?php // Require composer autoload require '../pdf/fpdf.php'; $db = new PDO('mysql:host=localhost;dbname=******', 'root', ''); class myPDF extends FPDF { public function header() { $ano = $_POST['ano']; $this->Image('../fimg/image.png', 10, 6, 50); $this->SetFont('arial', 'B', 14); $this->Cell(260, 5, 'RESTRIÇÕES ALIMENTARES', 0, 0, 'C'); $this->Ln(); $this->SetFont('arial', '', 12); $this->Cell(260, 10, 'Ano: ' . $ano, 0, 0, 'C'); $this->Ln(30); } public function footer() { $this->SetY(-15); $this->SetFont('arial', '', 8); $this->Cell(0, 10, 'Página ' . $this->PageNo() . '/{nb}', 0, 0, 'C'); } public function headerTable() { $this->SetFont('arial', 'B', 14); $this->cell(10); $this->cell(260, 10, 'LISTAGEM', 1, 0, 'C'); $this->Ln(); $this->cell(10); $this->SetFont('arial', 'B', 12); //$this->Cell(100, 7, 'Grupo', 1, 0, 'C'); $this->Cell(70, 7, 'País', 1, 0, 'C'); $this->Cell(100, 7, 'Nome', 1, 0, 'C'); $this->Cell(90, 7, 'Restrição', 1, 0, 'C'); $this->Ln(); } public function viewtable($db) { $ano = $_POST['ano']; $this->SetFont('times', '', 9); $stmt = $db->query("SELECT tbl_grupos.*, tbl_inscricoes.*, tbl_elementos_grupos.* FROM tbl_grupos LEFT JOIN tbl_inscricoes ON tbl_grupos.idgrupo = tbl_inscricoes.idgrupo LEFT JOIN tbl_elementos_grupos ON tbl_grupos.idgrupo = tbl_elementos_grupos.idgrupo WHERE tbl_inscricoes.anoinscricao = $ano AND tbl_inscricoes.validado = 1 AND tbl_elementos_grupos.restricoesgel!='Nenhuma' OR tbl_elementos_grupos.restricoesoutrogel!='' GROUP BY tbl_elementos_grupos.nomegel ORDER BY tbl_elementos_grupos.idgrupo ASC"); while ($data = $stmt->fetch(PDO::FETCH_OBJ)) { $this->SetFont('arial', '', 9); $this->cell(10); //$this->cell(100, 7, base64_decode($data->gnome), 1, 0, 'J'); $this->Cell(70, 7, base64_decode($data->gpais), 1, 0, 'C'); $this->Cell(100, 7, base64_decode($data->nomegel), 1, 0, 'C'); $this->Cell(90, 7, $data->restricoesgel . ', ' . $data->restricoesoutrogel, 1, 0, 'C'); $this->Ln(); } } } $pdf = new myPDF(); $pdf->AliasNbPages(); $pdf->AddPage('L', 'A4', 0); $pdf->headerTable(); $pdf->viewtable($db); $pdf->Ln(15); $pdf->Output(); ?> <script src="../js/sweetalert.js"></script> Bom dia. Tenho o código acima para gerar um relatório baseado em 3 tabelas. Preciso que o relatório me apresente apenas os dados relativos a restrições alimentares para os grupos que estejam inscritos e aprovados para participar nas atividades em um determinado ano. Com o código acima, são-me apresentados os dados de todos os elementos que tenham restrições allimentares independentemente do ano para que tenham sido aprovados. Poderiam ajudar-me com esta situação? Já tentei de diversas formas mas não funciona corretamente.
  15. Boa tarde, Tenho o códigos abaixo que esta a funcionar. Ele é da seguinte forma, se selecionar Portugal, aparece três campos select para selecionar o distrito, concelho e freguesia, caso escolha outra País esses campos ficam ocultos. <!-- Campo select Pais --> <div class="column"> <label for="adms_pais_id" class="title-input">País:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_pais_id" id="adms_pais_id"> <option value="">Selecione</option> <?php foreach ($this->data['pais']['pais'] as $pais) { extract($pais); if ((isset($valorForm['adms_pais_id'])) and ($valorForm['adms_pais_id'] == $id)) { echo "<option value='$id' selected>$name_pais</option>"; } else { echo "<option value='$id'>$name_pais</option>"; } } ?> </select> </div> <!-- Campos Selects de Distrito, Concelho e Freguesia --> <label for="localidade" class="title-input">Autarquivas ou Localidade do Nascimento:</label> <div class="row-input" id="divLocalidade"> <div class="column"> <?php $localidade_nascimento = ''; if (isset($valorForm['localidade_nascimento'])) { $localidade_nascimento = $valorForm['localidade_nascimento']; } ?> <label for="localidade_nascimento" class="title-input">Localidade do Nascimento:<span class="text-danger">*</span></label> <input type="text" name="localidade_nascimento" id="localidade_nascimento" class="input-adm" placeholder="Digite a localidade do nascimento" autocomplete="off" value="<?php echo $localidade_nascimento; ?>"> </div> </div> <div class="row-input" id="divAutarquias"> <div class="column"> <label for="adms_dist_nasc_id" class="title-input">Distrito:</label> <select class="input-adm" name="adms_dist_nasc_id" id="adms_distrito_id2" onchange="selectConcelho(2)"> <option value="">Selecione</option> <?php foreach ($this->data['distritonasc']['distnasc'] as $distnasc) { extract($distnasc); if ((isset($valorForm['adms_dist_nasc_id'])) and ($valorForm['adms_dist_nasc_id'] == $id_distnasc)) { echo "<option value='$id_distnasc' selected>$name_distrito</option>"; } else { echo "<option value='$id_distnasc'>$name_distrito</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_conc_nasc_id" class="title-input">Concelho:</label> <select class="input-adm" name="adms_conc_nasc_id" id="adms_concelho_id2" onchange="selectFreguesia(2)"> <option value="">Selecione</option> <?php foreach ($this->data['concelhonasc']['concnasc'] as $concnasc) { extract($concnasc); if ((isset($valorForm['adms_conc_nasc_id'])) and ($valorForm['adms_conc_nasc_id'] == $id_concnasc)) { echo "<option value='$id_concnasc' selected>$name_concelho</option>"; } else { echo "<option value='$id_concnasc'>$name_concelho</option>"; } } ?> </select> </div> <div class="column"> <label for="adms_freg_nasc_id" class="title-input">Freguesia:</label> <select class="input-adm" name="adms_freg_nasc_id" id="adms_freguesia_id2"> <option value="">Selecione</option> <?php foreach ($this->data['freguesianasc']['fregnasc'] as $fregnasc) { extract($fregnasc); if ((isset($valorForm['adms_freg_nasc_id'])) and ($valorForm['adms_freg_nasc_id'] == $id_fregnasc)) { echo "<option value='$id_fregnasc' selected>$name_freguesia</option>"; } else { echo "<option value='$id_fregnasc'>$name_freguesia</option>"; } } ?> </select> </div> </div> //Ativa/oculta campos do Formulário de Processo de Funerais // Receber o pais da nacionlidade do falecido para exibir ou ocultar a autrarquias const adms_pais_nasc_falecido = document.getElementById('adms_pais_id') const divLocalidade = document.getElementById('divLocalidade') const divAutarquias = document.getElementById('divAutarquias') adms_pais_nasc_falecido.addEventListener('change', function (event) { if (event.target.value == '1') { divLocalidade.style.display = 'grid' divAutarquias.style.display = 'grid' } else { divLocalidade.style.display = 'grid' divAutarquias.style.display = 'none' } }) O meu problema é o seguinte: Fiz o mesmo para outros campos mas não funciona e não consigo achar o erro, se alguém conseguir ajudar fico muito grato. <div class="row-input"> <div class="column"> <label for="adms_estado_civil_id" class="title-input">Estado Civil:</label> <select class="input-adm" name="adms_estado_civil_id" id="adms_estado_civil_id"> <option value="">Selecione</option> <?php foreach ($this->data['estadocivil']['estado'] as $estado) {extract($estado); if ((isset($valorForm['adms_estado_civil_id'])) and ($valorForm['adms_estado_civil_id'] == $id)) { echo "<option value='$id' selected>$name_estado</option>"; } else { echo "<option value='$id'>$name_estado</option>"; } } ?> </select> </div> <div class="column" id="genero_conjuge"> <label for="adms_gen_conjuge_id" class="title-input">Gênero:<span class="text-danger">*</span> </label> <select class="input-adm" name="adms_gen_conjuge_id" id="adms_gen_conjuge_id"> <option value="">Selecione</option> <?php foreach ($this->data['genero']['gen'] as $genero) { extract($genero); if ((isset($valorForm['adms_gen_conjuge_id'])) and ($valorForm['adms_gen_conjuge_id'] == $id)) { echo "<option value='$id' selected>$name_genero</option>"; } else { echo "<option value='$id'>$name_genero</option>"; } }?> </select> </div> </div> //Recebe o estado civil do conjuge const adms_est_civil = document.getElementById('adms_estado_civil_id') const divEstCivil = document.getElementById('genero_conjuge') adms_est_civil.addEventListener('change', function (e) { if (e.target.value == '2') { divEstCivil.style.visibility = 'hidden' } else { divEstCivil.style.visibility = 'visible' } }) lembrando que já coloquei "divEstCivil.style.visibility = 'hidden'" e "divEstCivil.style.display = 'none'"
  16. Olá, tudo bem? Esse é meu primeiro post aqui, então não sei como postar o código. Vou tentar explicar. Eu tenho vários input files em uma página de projeto de upload de imagens. O objetivo é redimensionar a imagem para 800 por 600 antes do upload. Isso já está ok. Agora preciso atualizar o src do input file clicado (target.src) com essas dimensões para enviar para o recebe.php. Agradeço desde já <form action="./recebe.php" method="post" id="form" enctype="multipart/form-data"> <input type="file" accept="image/*" id="image1" name="img1[]"> <br><br> <input type="file" accept="image/*" id="image2" name="img1[]"> <br><br> <input type="file" accept="image/*" id="image3" name="img2[]"> <br><br> <input type="file" accept="image/*" id="image4" name="img2[]"> <br><br> <button> Enviar </button> </form> <script type="text/javascript"> let form = document.querySelector("#form"); form .addEventListener("change", (e)=>{ e.preventDefault(); var file = e.target.files[0];//input clicado const reader = new FileReader(); reader.readAsDataURL(file); reader.name = file.name; reader.size = file.size; reader.onload = function (event) { var img = new Image(); img.src = event.target.result; img.onload = function (el) { var elem = document.createElement('canvas'); elem.width = 800; elem.height = 600; var ctx = elem.getContext('2d'); ctx.drawImage(el.target, 0, 0, elem.width, elem.height); var srcEncoded = ctx.canvas.toDataURL('image/jpeg', 0.5); console.log(srcEncoded);//Aqui está okay e.target.src = srcEncoded; //Estou aqui. Mas não deu certo, o recebe.php faz upload da imagem original. //Preciso atualizar o próprio input file clicado para enviar essa imagem com essas dimensões 800x600 //Com o mesmo input file que é clicado //Issoctx.canvas.toDataURL('image/jpeg', 0.5); retorna obase64, não sei se é isso mesmo. } } }); </script> ==============Arquivo recebe.php <?php //Aqui como eu faço para ele fazer o upload // O $_FILES['img1']['tmp_name'][0] , por exemplo, recebera o data:image/jpeg;base64,.... //Como converto ele para imagem jpeg move_uploaded_file($_FILES['img1']['tmp_name'][0], $_FILES['img1']['name'][0]); move_uploaded_file($_FILES['img1']['tmp_name'][1], $_FILES['img1']['name'][1]); move_uploaded_file($_FILES['img2']['tmp_name'][0], $_FILES['img2']['name'][0]); move_uploaded_file($_FILES['img2']['tmp_name'][1], $_FILES['img2']['name'][0]); ?>
  17. Boa noite amigos. Tenho uma página web para apresentar os dados da tabela, os quais deverão ser separados por categoria e uso o seguinte código: <div class="container" style="align-items:center; width:90%"> <?php $categorias = mysqli_query($conectar, "SELECT * FROM tbl_cateventos ORDER BY idcatevento ASC"); $linhas2 = mysqli_fetch_array($categorias); $total = mysqli_num_rows($categorias); $i = 1; while ($i <= $total) : $catdesc = mysqli_query($conectar, "SELECT * FROM tbl_cateventos WHERE idcatevento=$i"); $catresulta = mysqli_fetch_array($catdesc); ?> <div class="heading"> <h1> <?php echo $catresulta['descatevento'] . ' - ' . $i ?> </h1> </div> <?php $sql = mysqli_query($conectar, "SELECT * FROM tbl_menueventos WHERE categoria=$i ORDER BY descritivo ASC"); ?> <table id="example" class="table table-striped table-bordered"> <thead> <tr> <th>Descritivo</th> <th>Preço por unidade</th> <th>Preço por pessoa</th> <th>Preço por Kg</th> <th>Tabuleiro p/ 4 pessoas</th> <th>Tabuleiro p/ 6 pessoas</th> <th>Tabuleiro p/ 10 pessoas</th> <th>Tabukeiro p/ 15 pessoas</th> <th>Mínimo para encomenda</th> </tr> </thead> <?php while ($linhas = mysqli_fetch_array($sql)) : echo "<tr>"; echo "<td>" . $linhas['descritivo'] . "</td>"; echo "<td>" . $linhas['unidade'] . "</td>"; echo "<td>" . $linhas['pessoa'] . "€" . "</td>"; echo "<td>" . $linhas['kg'] . "€" . "</td>"; echo "<td>" . $linhas['tab4'] . "€" . "</td>"; echo "<td>" . $linhas['tab6'] . "€" . "</td>"; echo "<td>" . $linhas['tab10'] . "€" . "</td>"; echo "<td>" . $linhas['tab15'] . "€" . "</td>"; echo "<td>" . $linhas['minimo'] . "</td>"; endwhile; $i++; endwhile; ?> </table> </div> Acontece que os dados são apresentados, mas os dados referentes ao código do primeiro evento aparecem associados ao segundo código e assim sucessivamente, sendo que os dados referentes ao último código não são apresentados.
  18. Boas, tudo bem? Já percorri bastantes sites e nada do que encontrei ajuda deixo aqui o codigo html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <link rel="stylesheet" href="index.css"> <title>SaniProArt</title> </head> <body> <div class="wrapper"> <nav class="nav"> <div class="nav-logo"> <img src="imagens/Logo.png" alt="Logo" width="100"> </div> <div class="nav-menu" id="navMenu"> <ul> <li><a href="index.html" class="link active">Início</a></li> <li><a href="servicos.html" class="link">Serviços</a></li> <li><a href="sobrenos.html" class="link">Sobre nós</a></li> </ul> </div> <div class="nav-button"> <a href='login.php'><button class="btn white-btn" id="loginBtn" onclick="login()">Login</button></a> <a href='Cadastrar.php'><button class="btn" id="registerBtn" onclick="register()">Registo</button></a> </div> <div class="nav-menu-btn"> <i class="bx bx-menu" onclick="myMenuFunction()"></i> </div> </nav> <div class="container mt-5"> <h1 class="text-center">Perguntas Frequentes</h1> <div class="text-center p-2"><h6>Tem alguma questão ? Estamos aqui para ajudar</h6></div> <br> <div class="row mb-2 align-middle text-center" > <div class="accordion" id="accordionFlushExample"> <div class="accordion-item"> <h2 class="accordion-header"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne" aria-expanded="false" aria-controls="flush-collapseOne"> Em que zona do país atuam? </button> </h2> <div id="flush-collapseOne" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample"> <div class="accordion-body">Atuamos apenas na região sul do país. mais concretamente da zona de Lagos até Almancil.</div> </div> </div> <div class="accordion-item"> <h2 class="accordion-header"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseTwo" aria-expanded="false" aria-controls="flush-collapseTwo"> Como posso solicitar os vossos serviços?</button> </h2> <div id="flush-collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample"> <div class="accordion-body"> Pode solicitar os nossos serviços preenchendo o formulário de contato no nosso website ou entrando em contato diretamente pelo telefone. Estamos aqui para ajudá-lo!</div> </div> </div> <div class="accordion-item"> <h2 class="accordion-header"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseThree" aria-expanded="false" aria-controls="flush-collapseThree"> Qual é o nosso horário de funcionamento? </button> </h2><div id="flush-collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample"> <div class="accordion-body">Estamos em funcionamento de segunda a sábado, das 8h às 18h.</div> </div> </div> </div> </div> <br class=""> <footer id="footer" class="text-center align-center text-lg-start bg-body-tertiary text-muted fixed-bottom" style="min-width: 700px; width: 100vw;" > <section class="d-flex justify-content-center justify-content-lg-between p-4 border-bottom"> <div class="col-md-4 col-lg-3 col-xl-3 mx-auto mb-md-0 mb-4"> <h6 class="text-uppercase fw-bold mb-4 text-start">Contacto</h6> <p><i class="fas fa-home me-3 text-start"></i>Alcantarilha 8365-203</p> <p> <i class="fas fa-envelope me-3 text-start"></i> saniproart@gmail.com </p> <p><i class="fas fa-phone me-3 text-start"></i> +351 965 637 393</p> </div> </div> </div> </section> </footer> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script> </body> </html> e o css < @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); *{ margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } body{ background-image: url('imagens/Fundo.jpg'); background-size: cover; background-repeat: no-repeat; background-position: center; overflow: hidden; } .wrapper{ display: flex; justify-content: center; align-items: center; min-height: 110vh; background: rgba(39, 39, 39, 0.4); } .nav{ position: fixed; top: 0; display: flex; justify-content: space-around; width: 100%; height: 100px; line-height: 100px; background: linear-gradient(rgba(39,39,39, 0.6), transparent); z-index: 100; } .nav-logo p{ color: white; font-size: 25px; font-weight: 600; } .nav-menu ul{ display: flex; } .nav-menu ul li{ list-style-type: none; } .nav-menu ul li .link{ text-decoration: none; font-weight: 500; color: #fff; padding-bottom: 15px; margin: 0 25px; } .link:hover, .active{ border-bottom: 2px solid #fff; } .nav-button .btn{ width: 130px; height: 40px; font-weight: 500; background: rgba(255, 255, 255, 0.4); border: none; border-radius: 30px; cursor: pointer; transition: .3s ease; } .btn:hover{ background: rgba(255, 255, 255, 0.3); } #registerBtn{ margin-left: 15px; } .btn.white-btn{ background: rgba(255, 255, 255, 0.7); } .btn.btn.white-btn:hover{ background: rgba(255, 255, 255, 0.5); } .nav-menu-btn{ display: none; } .form-box{ position: relative; display: flex; align-items: center; justify-content: center; width: 512px; height: 420px; overflow: hidden; z-index: 2; } .login-container{ position: absolute; left: 4px; width: 500px; display: flex; flex-direction: column; transition: .5s ease-in-out; } .register-container{ position: absolute; right: -520px; width: 500px; display: flex; flex-direction: column; transition: .5s ease-in-out; } .top span{ color: #fff; font-size: small; padding: 10px 0; display: flex; justify-content: center; } .top span a{ font-weight: 500; color: #fff; margin-left: 5px; } header{ color: #fff; font-size: 30px; text-align: center; padding: 10px 0 30px 0; } .two-forms{ display: flex; gap: 10px; } .input-field{ font-size: 15px; background: rgba(255, 255, 255, 0.2); color: #fff; height: 50px; width: 100%; padding: 0 10px 0 45px; border: none; border-radius: 30px; outline: none; transition: .2s ease; } .input-field:hover, .input-field:focus{ background: rgba(255, 255, 255, 0.25); } ::-webkit-input-placeholder{ color: #fff; } .input-box i{ position: relative; top: -35px; left: 17px; color: #fff; } .submit{ font-size: 15px; font-weight: 500; color: black; height: 45px; width: 100%; border: none; border-radius: 30px; outline: none; background: rgba(255, 255, 255, 0.7); cursor: pointer; transition: .3s ease-in-out; } .submit:hover{ background: rgba(255, 255, 255, 0.5); box-shadow: 1px 5px 7px 1px rgba(0, 0, 0, 0.2); } .two-col{ display: flex; justify-content: space-between; color: #fff; font-size: small; margin-top: 10px; } .two-col .one{ display: flex; gap: 5px; } .two label a{ text-decoration: none; color: #fff; } .two label a:hover{ text-decoration: underline; } @media only screen and (max-width: 786px){ .nav-button{ display: none; } .nav-menu.responsive{ top: 100px; } .nav-menu{ position: absolute; top: -800px; display: flex; justify-content: center; background: rgba(255, 255, 255, 0.2); width: 100%; height: 90vh; backdrop-filter: blur(20px); transition: .3s; } .nav-menu ul{ flex-direction: column; text-align: center; } .nav-menu-btn{ display: block; } .nav-menu-btn i{ font-size: 25px; color: #fff; padding: 10px; background: rgba(255, 255, 255, 0.2); border-radius: 50%; cursor: pointer; transition: .3s; } .nav-menu-btn i:hover{ background: rgba(255, 255, 255, 0.15); } } @media only screen and (max-width: 540px) { .wrapper{ min-height: 100vh; } .form-box{ width: 100%; height: 500px; } .register-container, .login-container{ width: 100%; padding: 0 20px; } .register-container .two-forms{ flex-direction: column; gap: 0; } } footer { position: absolute; bottom: 100%; width: 100%; background-color: transparent !important; } :root footer { background-color: transparent !important; } >
  19. Por enquanto a combinação XAMPP/Windows é o único cenário é está confirmado que o ataque é possível.
  20. Olá, Numa regra que estou a construir em PHP (aplicação web) em que valida a introdução de dados do utilizador, tenho o seguinte: 'utilizador' => 'required|regex:/[0-9]{9}\/[0-9]{4}/' Acontece que ele está a cumprir todos os casos exceto se eu colocar mais do que um dígito (a partir de 5, supostamente só pode pôr exatamente 4) na última regra "[0-9]{4}", por exemplo: ->123456789/123 (não aceita -> certo) ->123456789//123 (não aceita -> certo) ->123456789/1234 (aceita -> certo) -> 123456789/12345 (aceita -> errado) e se eu acrescentar mais números ele vai sempre aceitando. Alguém me dá alguma dica para ultrapassar este problema?
  21. Boas tarde, Não estou a conseguir apanhar a variavel nome no verificar2.php que vem do javascript, penso que pode ser um erro simples mas não estou a descobrir. Agradecia uma ajudita. Index.php <select id="nomes" name="nomes" > <option value="CD01">CD01</option> <option value="CD14">CD14</option> <option value="CD15">CD15</option> </select> <img id="imagem" src="" alt="Imagem"> <script src="script.js"></script> script.js const selectNomes = document.getElementById('nomes'); const imagem = document.getElementById('imagem'); selectNomes.addEventListener('change', () => { const nome = selectNomes.value; //alert($('#nomes').val()); const xhr = new XMLHttpRequest(); xhr.open('POST', 'verificar2.php'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = () => { if (xhr.status === 200) { imagem.src = `${xhr.responseText}`; } else { console.error('Erro ao buscar imagem.'); } }; xhr.send(`nome=$`); }); verificar2.php <?php session_start(); $nome = $_POST['nome']; // Conectando ao banco de dados $conexao = mysqli_connect("localhost", "root", "PASS","BD"); // Buscando a imagem $sql = "SELECT foto_painel FROM tb_preco_97 WHERE modelo = '$nome'"; $resultado = mysqli_query($conexao, $sql); $imagem = mysqli_fetch_assoc($resultado)['foto_painel']; // Fechando a conexão mysqli_close($conexao); // Retornando a imagem header('Content-Type: image/jpeg'); echo $imagem; ?>
  22. Bom dia, Precisava da vossa preciosa ajuda, dado que já são alguns dias a tentar e não estou a conseguir chegar à conclusão pretendida 😄 Ora, basicamente temos uma loja online e gostaria de modificar a label por baixo do método de envio (hook: woocommerce_cart_shipping_method_full_label) baseado no estado de stock dos produtos existentes no carrinho. Basicamente, caso exista 1 produto que o estado de stock seja "por encomenda" então a label do método de envio 1 = "48/72h" e a label do método de envio 2 = "48/72h". Caso exista 1 produto que seja "stock limitado" então label do método de envio 1 = "24/48h" e a label do método de envio 2 = "48/72h". Caso contrário (isto é, todos os produtos estejam "em stock") a label = ""Envio até às 16h". A minha tentativa mais próxima deu nisto : (mas ele verifica em cada produto, ou seja, adiciona uma label tantas vezes quantas o número de produtos do carrinho) <?php add_filter( 'woocommerce_cart_item_name', 'custom_text_based_status_name', 10, 3 ); function custom_text_based_status_name( $item_name, $cart_item, $cart_item_key ) { if( ! ( is_checkout() ) ) return $item_name; $shipping_class_1 = 'onbackorder'; $shipping_class = $cart_item['data']->get_stock_status(); if( $shipping_class === $shipping_class_1 ) { add_filter( 'woocommerce_cart_shipping_method_full_label', 'custom_shipping_methods_label', 10, 2 ); function custom_shipping_methods_label( $label, $method ) { switch ( $method->id ) { case 'fish_n_ships:62': //Portugal Continental - Transportadora $txt = __('Expedição estimada: 24 a 48h úteis'); // <= Additional text break; case 'fish_n_ships:63': //Portugal Continental - Gratuito $txt = __('Expedição estimada: 72 a 96h úteis'); // <= Additional text break; default: //nos restantes casos $txt = __('Confirmaremos assim que possível'); // <= Additional text } return $label . '<br /><small style="color:#777777">' . $txt . '</small>'; } } return $item_name; } Já faz dias que ando de volta disto a tentar e sem solução à vista. Alguém pode ajudar? Obrigado 😃
  23. Boas tardes, Ainda sou novo em ajax, e a minha atual dificuldade é ,a seguinte, pretendo através do php fazer uma chamada ao banco de dados mysql de um nome ( tou usar o option) , e preciso que retorne a imagem desse nome, ou seja se eu selecionar a maria aparece a foto da maria, se eu selecionar o manel aparece a foto manel. Obrigado
  24. Olá a todos, Calcular a media de ratings e mostrar, estou tentando assim, mas somente mostra o ultimo $reviews =DB::table('reviews') ->select('title_id','score','body','author', DB::raw('AVG(`score`) AS `votos`'))->groupBy('title_id')->get(); e no blade @foreach($reviews as $p) @if($p->title_id == $cl->id) <div class="rating"> @for($i = 0; $i < 10; $i++) <span><img src="/assets/images/star.png{{ $p->votos <= $i ? '-o' : '' }}" width="20" height="20"></span> @endfor </div> @endif sou grato por qualquer ajuda
  25. adaptei o projeto abaixo em meu projeto: https://youtu.be/m49I783h_9s?si=xmEknj6biQexrGJh só que devolve seguinte erro, penso que o erro esteja no javascript: Uncaught (in promise) SyntaxError: Unexpected token '<', " <!DOCTYPE "... is not valid JSON await (assíncrono) onkeyup @ index:215 meu java esta assim: async function searchProdutos(registo){ // Receber a URL do HTML const urlAdm = document.getElementById('url-adm').getAttribute('data-url-adm'); //recebe o valor que o usuário digitar const codigoBarras = document.querySelector('#codigo_barras'+registo); //Recebe o value da const codigoBarras const valueCodigoBarras = codigoBarras.value; // Verificar se o campo tem 7 digitos if (valueCodigoBarras.length == 7) { //faz a requisição ao file add-receber-encomenda.php const response = await fetch(urlAdm + 'add-receber-encomenda/index?searchCodigo=' + valueCodigoBarras); //Ler os dados retornado do PHP const data = await response.json(); if(data['erro']) { document.getElementById('adms_produto_id').innerHTML = data['msg']; }else{ document.getElementById("adms_produto_id").innerHTML = ""; document.getElementById("adms_produto_id").value = data['response'].produto; } } } na controler tenho: //Receber o codigo de barras do produto $searchCodigo = filter_input(INPUT_GET, "searchCodigo", FILTER_SANITIZE_NUMBER_INT); if (!empty($searchCodigo)) { $listProduct = new \App\adms\Models\stock\AdmsAddReceberEnc(); $listProduct->searchProduto($searchCodigo); $retorna = ['erro' => false, 'dados' => $listProduct]; } else { $retorna = ['erro' => true, 'msg' => "<div class='alert alert-danger'>Nenhum Produto encontrado!</div>"]; } na model tenho: public function searchProduto($codigoBarras = null) { $this->data['codigo_barras'] = $codigoBarras; $listProduto = new \App\adms\helpers\AdmsRead(); $listProduto->fullRead("SELECT id, produto, codigo_barras, venda, stock FROM adms_produtos WHERE codigo_barras =:codigo_barras LIMIT :limit", "codigo_barras={$this->data['codigo_barras']}&limit=1"); $this->resultBd = $listProduto->getResult(); if ($this->resultBd) { $retorna = ['erro' => false, 'dados' => $this->resultBd]; } else { $retorna = ['erro' => true, 'msg' => "<p style='color: #f00'>Erro: Nenhum Produto encontrado!</p>"]; } }
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.