Plugin Directory

Changeset 2963867

Timestamp:
09/07/2023 01:34:38 AM (11 months ago)
Author:
tidevapps
Message:

Release 1.2.0

Location:
gerador-de-certificados-devapps/trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • gerador-de-certificados-devapps/trunk/README.txt

    r2961353 r2963867  
    4242== Changelog ==
    4343
     44
     45
     46
     47
     48
     49
     50
    4451= 1.1.0 =
    4552* Inclusão do modelo PSD
  • gerador-de-certificados-devapps/trunk/admin/class-devapps-certificate-generator-admin.php

    r2961367 r2963867  
    9494
    9595
     96
     97
     98
     99
     100
     101
     102
     103
     104
    96105    public function create_menu_item()
    97106    {
     
    107116    }
    108117
     118
     119
     120
     121
     122
     123
     124
     125
     126
     127
    109128    public function create_main_page()
    110129    {
    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
    118139        devapps_get_view('main', true, compact('models'));
    119140    }
    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    {
    163173        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
    164296            $wpdb->insert("{$wpdb->prefix}devapps_certificate_models", $data);
     297
     298
    165299            return 1;
    166300        } catch (Exception $ex) {
     301
    167302            return 0;
    168303        }
    169304    }
    170305
     306
     307
     308
     309
     310
     311
     312
     313
     314
     315
     316
     317
    171318    public function generate_certificate()
    172319    {
    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();
    190323
    191324            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(
    193327                    array(
    194328                        'person' => $data['person']['fullname'],
    195329                        'document' => $data['person']['document'],
    196330                        'email' => $data['person']['email'],
    197                         'certificate' => $path
     331                        'certificate' =>
    198332                    )
    199333                );
     334
     335
     336
     337
     338
     339
     340
    200341            }
    201342
     343
    202344            wp_send_json(
    203345                array(
    204                     "status" => $status,
     346                    "status" => ,
    205347                    "url" => $path,
    206348                    "filename" => devapps_slugify("Certificado {$data['person']['fullname']} {$data['course']['name']}")
    207349                )
    208350            );
    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)
    234411    {
    235412        global $wpdb;
     413
    236414        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
    238419            return true;
    239420        } catch (Exception $ex) {
     421
    240422            return false;
    241423        }
    242424    }
    243425
     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
    244462    private function check_model_exists(string $model)
    245463    {
    246464        global $wpdb;
    247465
     466
    248467        $result = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}devapps_certificate_models WHERE code = '{$model}';");
     468
     469
    249470        if (!empty($result)) {
    250471            return $result;
    251472        }
     473
    252474        return false;
    253475    }
    254476
     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
    255509    private function create_certificate_image(array $data)
    256510    {
    257511        try {
    258            
     512       
    259513            $image = imagecreatefromjpeg($data['model']);
    260514            $image_width = imagesx($image);
    261515            $image_height = imagesy($image);
    262516
     517
    263518            $font_bold = DEVAPPS_CERTIFICATE_GENERATOR_PATH . "fonts/Poppins-Bold.ttf";
    264519            $font_regular = DEVAPPS_CERTIFICATE_GENERATOR_PATH . "fonts/Poppins-Regular.ttf";
    265520            $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);
    268524            $cert_number_font_size = 20;
    269525            $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]);
    272528            $cert_number_x = $image_width - 300;
    273529            $cert_number_y = 150;
    274530            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
    276533            $person = $data['person']['fullname'];
    277534            $person_font_size = 30;
     
    279536            $person_width = abs($person_box[2]) - abs($person_box[0]);
    280537            $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 = ;
    283540            imagettftext($image, $person_font_size, 0, $person_x, $person_y, $color, $font_bold, mb_strtoupper($person));
    284541
     542
    285543            $line_1 = "por participar do {$data['course']['name']} ministrado por {$data['course']['instructor']},";
    286544            $line_1_font_size = 20;
     
    301559            imagettftext($image, $line_2_font_size, 0, $line_2_x, $line_2_y, $color, $font_regular, $line_2);
    302560
     561
    303562            $time = $data['course']['time'];
    304563            $time_font_size = 25;
    305564            imagettftext($image, $time_font_size, 0, 1229, 980, $color, $font_regular, $time);
    306565
     566
    307567            if (!$data['preview']) {
    308568                $upload_dir = trailingslashit(wp_upload_dir()['basedir']) . 'certificates';
     
    323583            }
    324584
     585
    325586            imagejpeg($image, $file_path, 200);
    326 
    327587            imagedestroy($image);
    328588
     589
    329590            return $file_url;
    330591        } catch (Exception $ex) {
     592
    331593            return false;
    332594        }
    333595    }
     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
    334689}
  • gerador-de-certificados-devapps/trunk/admin/js/devapps-certificate-generator-admin.js

    r2961302 r2963867  
    11(function ($) {
    22    'use strict';
    3 
    4     /**
    5      * All of the code for your admin-facing JavaScript source
    6      * should reside in this file.
    7      *
    8      * Note: It has been assumed you will write jQuery code here, so the
    9      * $ function reference has been prepared for usage within the scope
    10      * 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 a
    27      * single DOM-ready or window-load handler for a particular page.
    28      * Although scripts in the WordPress core, Plugins and Themes may be
    29      * practising this, we should strive to set a better example in our own work.
    30      */
    313
    324    $(window).load(function () {
     
    3911        var document = $('#person_cpf');
    4012        var email = $('#person_email');
     13
    4114
    4215        //Course
     
    6336        };
    6437
    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) => {
    6644            let code = uuid();
    6745            $('#person_table tbody').append(`
    6846                <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>
    7250                    <td>
    7351                        <button type="button" class="btn btn-danger btn_remove btn-sm" data-code="${code}">Remover</button>
     
    9472            }
    9573        };
     74
     75
    9676
    9777
     
    275255
    276256            if (fullname_valid && document_valid && email_valid) {
    277                 create_tr_person();
     257                create_tr_person();
    278258                clear_person_form();
    279259                toggle_empty_message();
     
    288268        });
    289269
    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
    294318
    295319        course_name.on('input', function () {
     
    336360        });
    337361
    338         $('body').on('click', '.btn_generate_preview', function(e){
     362        $('body').on('click', '.btn_generate_preview', function{
    339363            e.preventDefault();
    340364            process_ajax(1);
  • gerador-de-certificados-devapps/trunk/admin/views/tabs/person.php

    r2865262 r2963867  
    33        <div class="col-12">
    44            <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>
    623        </div>
    724    </div>
  • gerador-de-certificados-devapps/trunk/devapps-certificate-generator.php

    r2961353 r2963867  
    1010 *
    1111 * @link              https://devapps.com.br
    12  * @since             1.1.0
     12 * @since             1..0
    1313 * @package           Devapps_Certificate_Generator
    1414 *
     
    1717 * Plugin URI:        https://devapps.com.br/plugins/devapps-certificate-generator
    1818 * Description:       Gerador de certificados para cursos e eventos.
    19  * Version:           1.1.0
     19 * Version:           1..0
    2020 * Author:            DevApps Consultoria e Desenvolvimento de Sistemas
    2121 * Author URI:        https://devapps.com.br
     
    3636 * Rename this for your plugin and update it as you release new versions.
    3737 */
    38 define('DEVAPPS_CERTIFICATE_GENERATOR_VERSION', '1.1.0');
     38define('DEVAPPS_CERTIFICATE_GENERATOR_VERSION', '1..0');
    3939
    4040
  • gerador-de-certificados-devapps/trunk/includes/class-devapps-certificate-generator-activator.php

    r2961360 r2963867  
    3737        if (version_compare(DEVAPPS_CERTIFICATE_GENERATOR_VERSION, "1.0.0", ">=")) {
    3838            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
    3962        }
    4063    }
  • gerador-de-certificados-devapps/trunk/includes/class-devapps-certificate-generator.php

    r2961353 r2963867  
    166166        $this->loader->add_action('admin_menu', $plugin_admin, 'create_menu_item');
    167167        $this->loader->add_action('wp_ajax_generate_certificate', $plugin_admin, 'generate_certificate');
     168
    168169    }
    169170
Note: See TracChangeset for help on using the changeset viewer.