Changeset 2963867
- Timestamp:
- 09/07/2023 01:34:38 AM (11 months ago)
- Location:
- gerador-de-certificados-devapps/trunk
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
gerador-de-certificados-devapps/trunk/README.txt
r2961353 r2963867 42 42 == Changelog == 43 43 44 45 46 47 48 49 50 44 51 = 1.1.0 = 45 52 * Inclusão do modelo PSD -
gerador-de-certificados-devapps/trunk/admin/class-devapps-certificate-generator-admin.php
r2961367 r2963867 94 94 95 95 96 97 98 99 100 101 102 103 104 96 105 public function create_menu_item() 97 106 { … … 107 116 } 108 117 118 119 120 121 122 123 124 125 126 127 109 128 public function create_main_page() 110 129 { 111 // Verifica se foi enviado um POST 112 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 113 $this->save_certificate_model(); 114 } 115 116 $models = $this->get_models(); 117 130 // Verifica se foi enviado um POST para salvar um novo modelo 131 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 132 $this->save_certificate_model(); 133 } 134 135 // Recupera todos os modelos de certificado do banco de dados 136 $models = $this->get_models(); 137 138 // Carrega a visualização da página principal e passa os modelos como dados 118 139 devapps_get_view('main', true, compact('models')); 119 140 } 120 121 public function get_models(){ 122 global $wpdb; 123 124 return $wpdb->get_results("SELECT * FROM {$wpdb->prefix}devapps_certificate_models;", ARRAY_A); 125 } 126 127 public function save_certificate_model(){ 128 $uploaded_file = $_FILES['upload_model_file']; 129 130 // Verifique se o upload foi bem-sucedido 131 if ($uploaded_file['error'] == 0) { 132 $upload_dir = wp_upload_dir(); // Obtém o diretório de upload padrão do WordPress 133 134 // Defina o diretório de destino personalizado dentro de uploads 135 $custom_upload_dir = $upload_dir['basedir'] . '/models'; 136 137 // Certifique-se de que o diretório de destino exista; caso contrário, crie-o 138 if (!file_exists($custom_upload_dir)) { 139 wp_mkdir_p($custom_upload_dir); 140 } 141 142 // Gere um nome de arquivo único 143 $unique_filename = wp_unique_filename($custom_upload_dir, $uploaded_file['name']); 144 145 // Caminho completo para o arquivo de destino 146 $target_file = $custom_upload_dir . '/' . $unique_filename; 147 148 // Move o arquivo para o diretório de destino personalizado 149 if (move_uploaded_file($uploaded_file['tmp_name'], $target_file)) { 150 $status = $this->save_model(array( 151 'path' => $target_file, 152 'url' => $upload_dir['baseurl'] . '/models/' . $unique_filename 153 )); 154 155 wp_redirect(admin_url('admin.php?page=devapps-certificate-generator&status='. $status)); 156 exit; 157 } 158 } 159 } 160 161 public function save_model(array $data){ 162 global $wpdb; 141 142 143 /** 144 * Recupera todos os modelos de certificado do banco de dados. 145 * 146 * Esta função executa uma consulta SQL para recuperar todos os modelos de certificado 147 * armazenados no banco de dados e retorna os resultados como um array associativo. 148 * 149 * @return array Um array associativo contendo os modelos de certificado recuperados. 150 */ 151 public function get_models() 152 { 153 global $wpdb; 154 155 // Executa uma consulta SQL para recuperar todos os modelos de certificado 156 $models = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}devapps_certificate_models;", ARRAY_A); 157 158 return $models; 159 } 160 161 162 /** 163 * Salva um modelo de certificado carregado. 164 * 165 * Esta função processa o upload de um modelo de certificado, verifica se o upload foi bem-sucedido, 166 * move o arquivo para o diretório correto e salva as informações do modelo no banco de dados. 167 * Ela também redireciona para a página de status após a conclusão. 168 * 169 * @throws Exception Se ocorrerem erros durante o upload ou a tentativa de salvar o modelo. 170 */ 171 public function save_certificate_model() 172 { 163 173 try { 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 164 296 $wpdb->insert("{$wpdb->prefix}devapps_certificate_models", $data); 297 298 165 299 return 1; 166 300 } catch (Exception $ex) { 301 167 302 return 0; 168 303 } 169 304 } 170 305 306 307 308 309 310 311 312 313 314 315 316 317 171 318 public function generate_certificate() 172 319 { 173 $data['model'] = DEVAPPS_CERTIFICATE_GENERATOR_PATH . "models/default.jpg"; 174 175 �� if (isset($_POST['model']) && !empty($_POST['model']) && $_POST['model'] !== "default") { 176 $model = $this->check_model_exists($_POST['model']); 177 if ($model && file_exists($model->path)) { 178 $data['model'] = $model->path; 179 } 180 } 181 182 $data['person'] = array_map( 'esc_attr',$_POST['person']); 183 $data['course'] = array_map( 'esc_attr',$_POST['course']); 184 $data['preview'] = sanitize_text_field($_POST['preview']); 185 $data['next_id'] = $this->get_next_id(); 186 187 if ($path = $this->create_certificate_image($data)) { 188 189 $status = $path ? true : false; 320 try { 321 // Prepara os dados para gerar o certificado 322 $data = $this->prepareCertificateData(); 190 323 191 324 if (!$data['preview']) { 192 $status = $this->save_certificate( 325 // Se não for uma visualização, salva os dados do certificado no banco de dados 326 $data['id'] = $this->save_certificate( 193 327 array( 194 328 'person' => $data['person']['fullname'], 195 329 'document' => $data['person']['document'], 196 330 'email' => $data['person']['email'], 197 'certificate' => $path331 'certificate' => 198 332 ) 199 333 ); 334 335 336 337 338 339 340 200 341 } 201 342 343 202 344 wp_send_json( 203 345 array( 204 "status" => $status,346 "status" => , 205 347 "url" => $path, 206 348 "filename" => devapps_slugify("Certificado {$data['person']['fullname']} {$data['course']['name']}") 207 349 ) 208 350 ); 209 } 210 211 wp_send_json( 212 array( 213 "status" => false, 214 ) 215 ); 216 } 217 218 private function get_next_id(){ 219 global $wpdb; 220 221 $table_name = "{$wpdb->prefix}devapps_certificates"; 222 223 $query = "SHOW TABLE STATUS LIKE '{$table_name}'"; 224 $result = $wpdb->get_results($query); 225 226 if ($result && isset($result[0]->Auto_increment)) { 227 return $result[0]->Auto_increment; 228 } else { 229 return 1; 230 } 231 } 232 233 private function save_certificate(array $data): bool 351 } catch (Exception $ex) { 352 // Em caso de erro, envia uma resposta JSON com status falso e uma mensagem de erro 353 wp_send_json( 354 array( 355 "status" => false, 356 "message" => "Erro ao gerar o certificado: " . $ex->getMessage() 357 ) 358 ); 359 } 360 } 361 362 363 /** 364 * Prepara os dados necessários para gerar um certificado com base nos dados do formulário. 365 * 366 * Esta função monta um array com os dados necessários para gerar um certificado, incluindo o modelo de certificado, 367 * informações pessoais e de curso, bem como uma indicação se é uma visualização ou um certificado real. 368 * 369 * @return array Um array contendo os dados preparados para gerar um certificado. 370 */ 371 private function prepareCertificateData() 372 { 373 // Inicializa um array com o caminho padrão do modelo de certificado 374 $data['model'] = DEVAPPS_CERTIFICATE_GENERATOR_PATH . "models/default.jpg"; 375 376 // Verifica se um modelo de certificado personalizado foi selecionado no formulário 377 if (isset($_POST['model']) && !empty($_POST['model']) && $_POST['model'] !== "default") { 378 // Verifica se o modelo personalizado existe e seu caminho de arquivo 379 $model = $this->check_model_exists($_POST['model']); 380 if ($model && file_exists($model->path)) { 381 // Se o modelo personalizado existir, atualiza o caminho do modelo no array de dados 382 $data['model'] = $model->path; 383 } 384 } 385 386 // Mapeia e sanitiza os dados pessoais e de curso do formulário 387 $data['person'] = array_map('esc_attr', $_POST['person']); 388 $data['course'] = array_map('esc_attr', $_POST['course']); 389 390 // Obtém a indicação se é uma visualização ou um certificado real e inicializa o ID como 0 391 $data['preview'] = sanitize_text_field($_POST['preview']); 392 $data['id'] = 0; 393 394 // Retorna o array com os dados preparados para gerar um certificado 395 return $data; 396 } 397 398 399 400 /** 401 * Atualiza o caminho do certificado no banco de dados para um determinado ID de certificado. 402 * 403 * Esta função atualiza o caminho do certificado no banco de dados WordPress para o ID de certificado especificado. 404 * 405 * @param int $id O ID do certificado a ser atualizado. 406 * @param string $path O novo caminho do certificado a ser registrado no banco de dados. 407 * 408 * @return bool true se a atualização for bem-sucedida, false em caso de erro. 409 */ 410 private function update_certificate($id, $path) 234 411 { 235 412 global $wpdb; 413 236 414 try { 237 $wpdb->insert("{$wpdb->prefix}devapps_certificates", $data); 415 // Atualiza o caminho do certificado no banco de dados com base no ID especificado 416 $wpdb->update("{$wpdb->prefix}devapps_certificates", array('certificate' => $path), array('id' => $id)); 417 418 // Retorna true para indicar que a atualização foi bem-sucedida 238 419 return true; 239 420 } catch (Exception $ex) { 421 240 422 return false; 241 423 } 242 424 } 243 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 244 462 private function check_model_exists(string $model) 245 463 { 246 464 global $wpdb; 247 465 466 248 467 $result = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}devapps_certificate_models WHERE code = '{$model}';"); 468 469 249 470 if (!empty($result)) { 250 471 return $result; 251 472 } 473 252 474 return false; 253 475 } 254 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 255 509 private function create_certificate_image(array $data) 256 510 { 257 511 try { 258 512 259 513 $image = imagecreatefromjpeg($data['model']); 260 514 $image_width = imagesx($image); 261 515 $image_height = imagesy($image); 262 516 517 263 518 $font_bold = DEVAPPS_CERTIFICATE_GENERATOR_PATH . "fonts/Poppins-Bold.ttf"; 264 519 $font_regular = DEVAPPS_CERTIFICATE_GENERATOR_PATH . "fonts/Poppins-Regular.ttf"; 265 520 $color = imagecolorallocate($image, 31, 41, 53); 266 267 $cert_number = str_pad($data['next_id'], 8, '0', STR_PAD_LEFT); 521 522 // Adiciona o número de certificado 523 $cert_number = str_pad($data['id'], 8, '0', STR_PAD_LEFT); 268 524 $cert_number_font_size = 20; 269 525 $cert_number_box = imagettfbbox($cert_number_font_size, 0, $font_bold, $cert_number); 270 $cert_number_width = abs($cert_number_box[2]) - abs($ $cert_number_box[0]);271 $cert_number_height = abs($cert_number_box[5]) - abs($ $cert_number_box[3]);526 $cert_number_width = abs($cert_number_box[2]) - abs($cert_number_box[0]); 527 $cert_number_height = abs($cert_number_box[5]) - abs($cert_number_box[3]); 272 528 $cert_number_x = $image_width - 300; 273 529 $cert_number_y = 150; 274 530 imagettftext($image, $cert_number_font_size, 0, $cert_number_x, $cert_number_y, $color, $font_bold, $cert_number); 275 531 532 // Adiciona o nome da pessoa em maiúsculas 276 533 $person = $data['person']['fullname']; 277 534 $person_font_size = 30; … … 279 536 $person_width = abs($person_box[2]) - abs($person_box[0]); 280 537 $person_height = abs($person_box[5]) - abs($person_box[3]); 281 $person_x = (($image_width - $person_width) / 2) - 46;282 $person_y = (($image_height + $person_height) / 2) + $person_font_size;538 $person_x = ; 539 $person_y = ; 283 540 imagettftext($image, $person_font_size, 0, $person_x, $person_y, $color, $font_bold, mb_strtoupper($person)); 284 541 542 285 543 $line_1 = "por participar do {$data['course']['name']} ministrado por {$data['course']['instructor']},"; 286 544 $line_1_font_size = 20; … … 301 559 imagettftext($image, $line_2_font_size, 0, $line_2_x, $line_2_y, $color, $font_regular, $line_2); 302 560 561 303 562 $time = $data['course']['time']; 304 563 $time_font_size = 25; 305 564 imagettftext($image, $time_font_size, 0, 1229, 980, $color, $font_regular, $time); 306 565 566 307 567 if (!$data['preview']) { 308 568 $upload_dir = trailingslashit(wp_upload_dir()['basedir']) . 'certificates'; … … 323 583 } 324 584 585 325 586 imagejpeg($image, $file_path, 200); 326 327 587 imagedestroy($image); 328 588 589 329 590 return $file_url; 330 591 } catch (Exception $ex) { 592 331 593 return false; 332 594 } 333 595 } 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 334 689 } -
gerador-de-certificados-devapps/trunk/admin/js/devapps-certificate-generator-admin.js
r2961302 r2963867 1 1 (function ($) { 2 2 'use strict'; 3 4 /**5 * All of the code for your admin-facing JavaScript source6 * should reside in this file.7 *8 * Note: It has been assumed you will write jQuery code here, so the9 * $ function reference has been prepared for usage within the scope10 * of this function.11 *12 * This enables you to define handlers, for when the DOM is ready:13 *14 * $(function() {15 *16 * });17 *18 * When the window is loaded:19 *20 * $( window ).load(function() {21 *22 * });23 *24 * ...and/or other possibilities.25 *26 * Ideally, it is not considered best practise to attach more than a27 * single DOM-ready or window-load handler for a particular page.28 * Although scripts in the WordPress core, Plugins and Themes may be29 * practising this, we should strive to set a better example in our own work.30 */31 3 32 4 $(window).load(function () { … … 39 11 var document = $('#person_cpf'); 40 12 var email = $('#person_email'); 13 41 14 42 15 //Course … … 63 36 }; 64 37 65 const create_tr_person = () => { 38 const clear_person_import = () => { 39 person_importer_file.val(null).removeClass('is-valid').removeClass('is-invalid').next('.custom-file-label').html(null); 40 $('#form_import').slideToggle(); 41 } 42 43 const create_tr_person = (fullname, document, email) => { 66 44 let code = uuid(); 67 45 $('#person_table tbody').append(` 68 46 <tr id="${code}"> 69 <td>${fullname .val()}</td>70 <td>${document .val()}</td>71 <td>${email .val()}</td>47 <td>${fullname}</td> 48 <td>${document}</td> 49 <td>${email}</td> 72 50 <td> 73 51 <button type="button" class="btn btn-danger btn_remove btn-sm" data-code="${code}">Remover</button> … … 94 72 } 95 73 }; 74 75 96 76 97 77 … … 275 255 276 256 if (fullname_valid && document_valid && email_valid) { 277 create_tr_person( );257 create_tr_person(); 278 258 clear_person_form(); 279 259 toggle_empty_message(); … … 288 268 }); 289 269 290 $('#upload_model_file').on('change',function(){ 291 var fileName = $(this).val(); 292 $(this).next('.custom-file-label').html(fileName); 293 }) 270 $('#upload_model_file').on('change', function () { 271 var fileName = $(this).val(); 272 $(this).next('.custom-file-label').html(fileName); 273 }); 274 275 $('#person_importer_file').on('change', function () { 276 var fileName = $(this).val(); 277 $(this).next('.custom-file-label').html(fileName); 278 }); 279 280 281 $('#btn_import_person').on('click', function (e) { 282 e.preventDefault(); 283 $('#form_import').slideToggle(); 284 }); 285 286 287 $('#person_importer_form').on('submit', function (e) { 288 e.preventDefault(); 289 290 var formData = new FormData(this); 291 292 $.ajax({ 293 url: devapps_certificate_generator.ajax, 294 dataType: 'JSON', 295 type: 'POST', 296 data: formData, 297 contentType: false, 298 processData: false, 299 success: function (response) { 300 if (response.status && response.data.length > 0) { 301 response.data.forEach(function (personData) { 302 create_tr_person(personData.name, personData.document, personData.email); 303 }); 304 clear_person_form(); 305 clear_person_import(); 306 toggle_empty_message(); 307 } else { 308 alert(response.message); 309 } 310 }, 311 error: function () { 312 alert('Ocorreu um erro durante o upload do arquivo.'); 313 } 314 }); 315 316 }); 317 294 318 295 319 course_name.on('input', function () { … … 336 360 }); 337 361 338 $('body').on('click', '.btn_generate_preview', function (e){362 $('body').on('click', '.btn_generate_preview', function{ 339 363 e.preventDefault(); 340 364 process_ajax(1); -
gerador-de-certificados-devapps/trunk/admin/views/tabs/person.php
r2865262 r2963867 3 3 <div class="col-12"> 4 4 <h2>Informe os dados dos participantes/alunos</h2> 5 <!--<p>Você pode cadastrar manualmente ou enviar um arquivo excel.</p>--> 5 <p>Você pode cadastrar manualmente ou enviar um arquivo excel no formato CSV, caso não possua o model de importação, <a href="<?php echo DEVAPPS_CERTIFICATE_GENERATOR_URL . "models/person_importer.csv";?>" target="_blank" download="person_importer.csv">clique aqui</a> para baixar.</p> 6 <button type="button" class="btn btn-secondary" id="btn_import_person">Importar Participantes</button> 7 8 </div> 9 </div> 10 <div class="row mt-3" style="display: none;" id="form_import"> 11 <div class="col-12"> 12 <form action="#" method="post" enctype="multipart/form-data" id="person_importer_form"> 13 <?php wp_nonce_field('person_importer', 'person_importer'); ?> 14 <input type="hidden" name="action" value="person_importer"> 15 <div class="input-group mb-3"> 16 <div class="custom-file"> 17 <input type="file" class="custom-file-input" id="person_importer_file" name="person_importer_file" aria-describedby="upload_model" accept=".csv" required> 18 <label class="custom-file-label" for="person_importer_file" data-browse="Pesquisar"><?php echo __('Selecionar arquivo...', 'gerador-de-certificados-devapps');?></label> 19 </div> 20 </div> 21 <button type="submit" class="btn btn-secondary"><?php echo __('Carregar Participantes', 'gerador-de-certificados-devapps'); ?></button> 22 </form> 6 23 </div> 7 24 </div> -
gerador-de-certificados-devapps/trunk/devapps-certificate-generator.php
r2961353 r2963867 10 10 * 11 11 * @link https://devapps.com.br 12 * @since 1. 1.012 * @since 1..0 13 13 * @package Devapps_Certificate_Generator 14 14 * … … 17 17 * Plugin URI: https://devapps.com.br/plugins/devapps-certificate-generator 18 18 * Description: Gerador de certificados para cursos e eventos. 19 * Version: 1. 1.019 * Version: 1..0 20 20 * Author: DevApps Consultoria e Desenvolvimento de Sistemas 21 21 * Author URI: https://devapps.com.br … … 36 36 * Rename this for your plugin and update it as you release new versions. 37 37 */ 38 define('DEVAPPS_CERTIFICATE_GENERATOR_VERSION', '1. 1.0');38 define('DEVAPPS_CERTIFICATE_GENERATOR_VERSION', '1..0'); 39 39 40 40 -
gerador-de-certificados-devapps/trunk/includes/class-devapps-certificate-generator-activator.php
r2961360 r2963867 37 37 if (version_compare(DEVAPPS_CERTIFICATE_GENERATOR_VERSION, "1.0.0", ">=")) { 38 38 self::create_tables_1_0_0(); 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 39 62 } 40 63 } -
gerador-de-certificados-devapps/trunk/includes/class-devapps-certificate-generator.php
r2961353 r2963867 166 166 $this->loader->add_action('admin_menu', $plugin_admin, 'create_menu_item'); 167 167 $this->loader->add_action('wp_ajax_generate_certificate', $plugin_admin, 'generate_certificate'); 168 168 169 } 169 170
Note: See TracChangeset
for help on using the changeset viewer.