Fermer

mars 3, 2023

Un plugin WordPress utilisant Telerik PHP Wrapper

Un plugin WordPress utilisant Telerik PHP Wrapper


Ce projet utilise le wrapper PHP Telerik UI pour créer un plugin WordPress réutilisable.

Le PHP wrapper de Progress Telerik était quelque chose que je voulais utiliser depuis un certain temps. Il est peu coûteux si vous n’achetez que cet article. Et la licence commerciale me permet de créer un produit revendable pour WordPress.

Le client qui avait besoin d’une solution restera anonyme, bien que je doive préciser qu’il est aussi un ami. Son dossier était simple.

Il voulait un moyen d’enregistrer les visites des gens sur son site. Plus précisément, enregistrement de l’activité pour les visites de blogs et d’éléments d’image. Une chose dont il voulait être sûr était l’endroit où le lien à suivre avait été cliqué et le nombre de visites. De zéro à beaucoup ont été réalisés au fil du temps.

Il ne voulait spécifiquement pas de « personnalisation » du lien de clic, ce qui s’apparente à l’utilisation d’un pixel de suivi. C’est-à-dire qu’il veut moins d’intrusion dans la personne qui clique sur le lien. Cette « personnalisation » du logiciel de suivi est possible pour ceux qui souhaitent capturer des statistiques basées plus précisément sur ceux qui cliquent sur le lien d’origine.

J’ai décidé d’utiliser l’interface utilisateur Telerik pour le wrapper PHP car il correspond à la configuration LAMP (ou dans mon cas WIMP) de WordPress. Incidemment, LAMP est un descripteur de technologie et équivaut à Linux Apache MySql PHP. WIMP équivaut à Windows IIS MySql PHP. Les points communs entre LAMP et WIMP sont MySql et PHP, qui portent tous deux vers Windows à partir de leur Linux plus natif. Notez que la configuration du serveur Windows pour WIMP se trouve être une machine virtuelle (VM) sur mon ordinateur. Hyper-V héberge la machine virtuelle et je partage le dossier C:\inetpub\wwwroot à partir de la machine virtuelle, et j’utilise Visual Studio Code pour modifier directement les fichiers dans le dossier WordPress.

Je zippe ensuite le dossier du plugin contenant la source du plugin et les ressources Telerik pour distribution à télécharger sur WordPress. Il crée un fichier de 30 Mo. Cependant, je passe tous les actifs Telerik au cas où plus tard ils seraient nécessaires pour une autre amélioration spécifiée. Peut-être que je suis paresseux en ne supprimant pas la plupart des commandes Telerik qui ne sont pas utilisées, mais je ne pense pas que je le sois. Cela signifie que je n’ai pas à le faire à chaque fois que je mets à jour Telerik sur ce plugin. Le temps est precieux.

Je crois que la prévalence continue de PHP dans le monde pourrait être atteinte grâce à l’utilisation généralisée de WordPress. WordPress est très largement utilisé en raison de son excellente configurabilité et de la distribution « gratuite » de ce programme. Le nombre de développeurs tiers qui travaillent sur le produit WordPress est immense, assurant ainsi sa popularité continue.

Cela n’enlève rien à Site de progressionfinity, car il est plus structuré et « plus sûr » dans sa livraison de solutions réussies. Sitefinity est également un produit avec lequel j’aime travailler. Cependant, je dois trouver des clients qui aimeraient que je conçoive un produit autour de cette plate-forme qui est une offre basée sur Windows. C’est un peu comme comparer des pommes et des citrons. J’aimerais utiliser les deux produits pour des applications différentes. Je suis, par exemple, plus à l’aise avec .NET qu’avec PHP. Cela ne veut pas dire que je n’apprends pas encore dans les deux environnements. Il semble qu’il y ait toujours de la place pour apprendre dans le monde de l’informatique.

Il existe de nombreux articles sur Internet où vous pourriez trouver des descriptions sur la façon de configurer et de créer des plugins WordPress. Je n’en mentionnerai aucune ici, car il est important que votre recherche soit la vôtre.

J’ai découvert plusieurs choses lors de la création de ce plugin – pas mon premier, mais l’un de mes plugins les plus « destinés à vivre plus longtemps » – qu’ils ne sont pas difficiles à créer. Le moteur WordPress a de nombreux « crochets » établis et des fonctionnalités autour de la façon dont il doit être utilisé pour faire fonctionner le plugin.

Alors sautons dans le code.

Arborescence des fichiers du projet JIU

Voici « l’arborescence » qui affiche les fichiers que j’ai créés pour ce projet. Je n’ai pas développé les répertoires CSS et JS car cela créerait des distractions. Je les expliquerai plus tard. Aussi jReadUrl.php est un faux-fuyant et doit être supprimé dans une version ultérieure du programme. J’essayais une technique et elle n’était pas nécessaire après avoir créé le fichier, elle est donc maintenant obsolète.

Vous pouvez voir que le fichier jMain.php est au niveau le plus bas du programme, c’est parce que c’est le point d’entrée de WordPress.

jMain.php

Nous examinons le « point d’entrée » du plugin dans WordPress. Il s’appelle « jMain.php ».

Notez l’en-tête du commentaire. Ceci est nécessaire pour que le plugin soit reconnu par le moteur WordPress en tant que tel. Le commentaire fait partie du programme.

Ma compréhension de WordPress (qui n’est pas complète en raison de la taille et de la complexité de tout ce qui est WordPress) est qu’il « déclenche » cette routine chaque fois qu’une page est chargée, ainsi que la même routine pour chacun des plugins du programme. Par conséquent, il s’agit d’une routine légère et se termine rapidement.

Je crois que l’en-tête de commentaire en haut de la routine établit que le plugin est un plugin, et le programme WordPress l’enregistre dans la liste des plugins à vérifier lorsque les pages sont chargées.

Cette routine a l’une des principales fonctionnalités de «l’expérience» de codage que j’ai dû faire comme preuve de concept. Il devait enregistrer les « hits » de l’URL entrante à partir d’endroits tels qu’un lien de newsletter MailChimp. Une fois que j’ai établi que cela allait fonctionner, j’ai constaté que cette routine tirait deux fois. Donc, j’avais besoin d’intégrer une vérification pour que si un « coup » était enregistré dans les 60 secondes suivant le coup actuel, j’ignore la tentative.

Cela semble tenir ensemble, donc je suis heureux de dire: « Ça marche! » … dit David. Ainsi, la prémisse principale de toute la tentative est résolue et nous avons une solution. Je ne savais pas, bien sûr, si cela fonctionnerait lorsque j’ai entrepris ce voyage – cependant, je suis heureux de dire que cela a fonctionné, donc la solution est solide et trouvée.

Noter la require_once ligne qui se rapporte à jFunctions.php … ceci est chargé et est décrit dans le segment suivant.

Vous remarquerez qu’il n’y a aucun signe de Telerik… Cela s’en vient. 🙂

<?php




require( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

require_once(plugin_dir_path(__FILE__) . 'Includes/jFunctions.php');


if (isset( $_GET['jiu_QueryId'] ) && is_numeric($_GET['jiu_QueryId']))
{
    $nJADERIncomingUrlId = intval( $_GET['jiu_QueryId'] );
    if (get_post( $nJADERIncomingUrlId, 'OBJECT', null ) != null)
    {
        
        
        $dDatetime1 = date("Y-m-d H:i:s");
        $dTimestamp = strtotime($dDatetime1);
        $dTime1 = $dTimestamp + (60 * 60);
        $dTime2 = $dTime1 - 60;
        $dDatetime2 = date("Y-m-d H:i:s", $dTime2);
        $aDateQuery = array('after' => $dDatetime2);
        $aCommentArgs = array( 'post_id' => $nJADERIncomingUrlId, 'date_query' => $aDateQuery );
        $oGetComments = get_comments( $aCommentArgs );
        
        if ($oGetComments == null || $oGetComments == 0)
        {
            
            
            
            $sProtocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";  
            $sCurrent_Url = $sProtocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
            $aCommentArgs = array( 'comment_post_ID' => $nJADERIncomingUrlId, 'comment_content' => $sCurrent_Url, 'comment_date' => $dDatetime1 );
            wp_insert_comment( $aCommentArgs );
        }
    }
}
?>

Inclut/jFunctions.php

Ce programme crée les « crochets » dans WordPress afin que le moteur déclenche des parties de mon code le cas échéant.

  1. Le premier élément de la liste consiste à créer la catégorie « jiu_URLSettings » si elle n’existe pas. Le programme exige que la catégorie existe lors de l’ajout de « hits » et de la catégorisation des informations de configuration qui sont stockées en tant que messages WordPress. La fonction wp_create_category est décrit ici.

  2. Le deuxième élément de la liste consiste à inclure le jEnqueue.php dans l’exécution de ce fichier. Le fichier est inclus ci-dessous, et une explication suit.

  3. Nous « corrigeons » ensuite le menu dans le tableau de bord WordPress. L’option de menu s’appelle « JADER Incoming Url ». La routine utilisée pour faire cela (add_menu_page) fait partie du programme WordPress et est documenté ici. La routine WordPress add_action est utilisé pour ajouter l’action à la file d’attente « use » afin que WordPress sache quoi faire lorsque son programme dessine le menu. Voir cette routine ici.

  4. Les fonctions jSaveUrlECB et jSaveUrlICB sont une paire de routines qui enregistrent des informations sous forme de publication. Ils sont appelés de jMainPage.php (dessous). AJAX est utilisé pour appeler ces fonctions, c’est pourquoi l’action add pour wp_ajax wp_ajax_nopriv_ sont définis ci-dessous afin que lorsque l’appel WordPress AJAX est effectué, ils figurent dans la liste des objets pouvant être appelés.

  5. Les fonctions suivantes concernent également les appels AJAX effectués dans le fichier jMainPage.php.

  6. Remarque : Cette technique est due à la façon dont WordPress fonctionne et fonctionne assez bien. La raison pour laquelle nous utilisons cette technique est que si WordPress ou PHP est mis à jour, la technique continue de fonctionner, que la méthodologie d’appel AJAX soit mise à jour ou non. Une sorte de pérennité.

<?php

if (get_cat_ID("jiu_URLSettings") == 0)
{
    wp_create_category("jiu_URLSettings");
}
require_once plugin_dir_path(__FILE__) . 'jEnqueue.php';
function j_Add_My_Admin_Link()
{
    add_menu_page(
        'JADER Incoming Url', 
        'JADER Incoming Url', 
        'manage_options', 
        plugin_dir_path(__FILE__) . 'jMainPage.php' 
    );
}
add_action( 'admin_menu', 'j_Add_My_Admin_Link' );
function jSaveUrlECB()
{
    if (isset( $_POST['ID'] ))
    {
        if (is_numeric($_POST['ID']))
        {
            $nId = intval( $_POST['ID'] );
            $oPost = get_post( $nId );
            if ($oPost != null)
            {
                $oPostArray = array('ID' => $nId, 'post_name' => $_POST['post_name'], 'post_title' => $_POST['post_title'], 'post_content' => $_POST['post_content']);
                wp_update_post( $oPostArray );
            }
        }
    }
    wp_die();
}
add_action('wp_ajax_jSaveUrlECB', 'jSaveUrlECB' );
add_action('wp_ajax_nopriv_jSaveUrlECB', 'jSaveUrlECB' );
function jSaveUrlICB()
{
    if (isset($_POST['post_name']))
    {
        $nCategoryId = get_cat_ID("jiu_URLSettings");
        $oPostArray = array( 'post_name' => $_POST['post_name'], 'post_title' => $_POST['post_title'], 'post_content' => $_POST['post_content'], 'post_category' => [ $nCategoryId ], 'post_status' => 'private' );
        $oWPError = wp_insert_post($oPostArray, true, false);
    }
    wp_die();
}
add_action( 'wp_ajax_jSaveUrlICB', 'jSaveUrlICB' );
add_action( 'wp_ajax_nopriv_jSaveUrlICB', 'jSaveUrlICB' );
function jReadUrlCB()
{
    $nCategoryId = get_cat_ID('jiu_URLSettings');
    $oArgs = array( 'numberposts' => -1, 'post_category' => [ $nCategoryId ], 'post_status' => 'private' );
    $oPosts = get_posts( $oArgs );
    header('Content-Type: application/json');
    echo wp_json_encode( $oPosts );
    wp_die();
}
add_action( 'wp_ajax_jReadUrlCB', 'jReadUrlCB' );
add_action( 'wp_ajax_nopriv_jReadUrlCB', 'jReadUrlCB' );
function jReadUrl2CB()
{
    $nCategoryId = get_cat_ID('jiu_URLSettings');
    $oArgs = array( 'numberposts' => -1, 'post_category' => [ $nCategoryId ], 'post_status' => 'private' );
    $oPosts = get_posts( $oArgs );
    header('Content-Type: application/json');
    echo wp_json_encode( $oPosts );
    wp_die();
}
add_action( 'wp_ajax_jReadUrl2CB', 'jReadUrl2CB' );
add_action( 'wp_ajax_nopriv_jReadUrl2CB', 'jReadUrl2CB' );
function jReadStatisticsCB()
{
    $sRequest_body = file_get_contents('php://input');
    $oOutput = explode("=", $sRequest_body);
    $nId = intval($oOutput[1]);
    $oPost = get_post( $nId );
    if ($oPost != null)
    {
        $oArgs = array('post_id' => $nId);
        $oComments = get_comments($oArgs);
        $oComments2 = array();
        $oFieldOutputs = explode(",", $oPost->post_content);
        foreach ( $oComments as $oComment ) {
            $sUrl_components = parse_url($oComment->comment_content);
            parse_str($sUrl_components['query'], $aParams);
            $oComments2[] = array('ID' => $nId, 'post_name' => $oPost->post_name, 'comment_date' => $oComment->comment_date, 'comment_content' => $oComment->comment_content, "jiu_A" => $aParams["jiu_A"], "jiu_B" => $aParams["jiu_B"], "jiu_C" => $aParams["jiu_C"], "jiu_D" => $aParams["jiu_D"], "jiu_E" => $aParams["jiu_E"], "jiu_F" => $aParams["jiu_F"], "jiu_G" => $aParams["jiu_G"], "jiu_H" => $aParams["jiu_H"]);
        }
        header('Content-Type: application/json');
        echo wp_json_encode( $oComments2 );
    }
    wp_die();
}
add_action( 'wp_ajax_jReadStatisticsCB', 'jReadStatisticsCB' );
add_action( 'wp_ajax_nopriv_jReadStatisticsCB', 'jReadStatisticsCB' );
?>

Inclure/jEnqueue.php

Ce fichier inclus ajoute des fichiers que vous placeriez normalement dans la balise head d’un site Web.

Vous remarquerez les fichiers JS et CSS qui contiennent des parties du programme qui affectent le déroulement et l’affichage du programme. Plus précisément, notez le kendo files—ils sont utilisés pour afficher les grilles par le wrapper PHP utilisé dans le programme jMainPage.php.

<?php
    function jiu_scripts()
    {
    
        wp_enqueue_style( 'jiucss' ,  plugins_url('assets/css/jiu.css', __FILE__ ));
        wp_enqueue_style( 'jiukendocommon' , plugins_url('assets/css/kendo/kendo.common.min.css', __FILE__ ));
        wp_enqueue_style( 'jiukendoblueopal' , plugins_url('assets/css/kendo/kendo.' . ($_COOKIE['WP_Kendo_Theme'] != '' ? $_COOKIE['WP_Kendo_Theme'] : 'blueopal') . '.min.css', __FILE__ ));
        wp_enqueue_style( 'jiukendomobile' , plugins_url('assets/css/kendo/kendo.mobile.all.min.css', __FILE__ ));
    
        wp_enqueue_script( 'jquery' );
        wp_enqueue_script( 'jiujs' , plugins_url('assets/js/jiu.js', __FILE__ ));
        wp_enqueue_script( 'jiuall' , plugins_url('assets/js/kendo/kendo.all.min.js', __FILE__ ));
        wp_enqueue_script( 'jiutimezone' , plugins_url('assets/js/kendo/kendo.timezones.min.js', __FILE__ ));
        wp_enqueue_script( 'jiuculture' , plugins_url('assets/js/kendo/cultures/kendo.culture.en-GB.min.js', __FILE__ ));
        wp_enqueue_script( 'jiumessages' , plugins_url('assets/js/kendo/messages/kendo.messages.en-GB.min.js', __FILE__ ));
        wp_enqueue_script( 'jiumobile' , plugins_url('assets/js/kendo/kendo.mobile.min.js', __FILE__ ));
        wp_enqueue_script( 'jiuweb' , plugins_url('assets/js/kendo/kendo.web.min.js', __FILE__ ));
        wp_enqueue_script( 'jszip' , plugins_url('assets/js/kendo/jszip.min.js', __FILE__ ));
        
    }
    add_action( 'admin_enqueue_scripts', 'jiu_scripts', 1000 );
?>

Inclure/jMainPage.php

  1. Ce fichier gère le groupe d’onglets pour l’élément de menu WordPress Dashboard. Veuillez consulter les images montrant les différents onglets sous l’extrait de code.

  2. Les deux require_once lignes en haut du fichier chargent deux fichiers PHP qui se rapportent à la kendo emballage. Ces deux fichiers doivent être présents pour que les extensions PHP se produisent.

  3. Certains HTML configurent la sortie vers l’élément de menu Tableau de bord dans le volet droit du site WordPress.

  4. Une chose que j’ai remarquée avec l’utilisation de Telerik Kendo UI Wrapper est que la configuration de la grille a tendance à être un peu plus difficile que la syntaxe Razor dans un cshtml. C’est peut-être simplement que ce n’est pas encore une extension naturelle de mes connaissances ou de mes capacités de programmation. Cela me fait réfléchir, cependant, c’est pourquoi j’ai construit ce programme.

  5. Beaucoup de méthodes sont explicites. Ou si vous vous plongez dans le Telerik Démo Documents vous parviendrez à comprendre dans la concordance.

<?php
    require_once plugin_dir_path(__FILE__) . 'assets/lib/Kendo/Autoload.php';
    require_once plugin_dir_path(__FILE__) . 'assets/lib/DataSourceResult.php';
    $sProtocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";  
    $sCurrent_Url = $sProtocol . $_SERVER['HTTP_HOST']; 
?>
<div class="wrap">
    <h1>JADER Incoming Url Plugin Admin</h1>
    <?php
        $oTabStrip = new \Kendo\UI\TabStrip('AdminTabStrip');
        $oGeneralSettings = new \Kendo\UI\TabStripItem();
        $oGeneralSettings->text("General Settings");
        $oGeneralSettings->startContent();
    ?>
        <p>
            Skin:&nbsp;
            <?php
                $oSkinDropDownList = new \Kendo\UI\DropDownList('SkinDropDownList');
                $oSkinDropDownList->value(($_COOKIE['WP_Kendo_Theme'] != '' ? $_COOKIE['WP_Kendo_Theme'] : '-1'))
                    ->change('SkinDropDownListChange')
                    ->dataTextField('text')
                    ->dataValueField('value')
                    ->dataSource(array(
                        array('text' => 'Please select a skin...', 'value' => '-1'),
                        array('text' => 'Black', 'value' => 'black'),
                        array('text' => 'Blue Opal', 'value' => 'blueopal'),
                        array('text' => 'Bootstrap', 'value' => 'bootstrap'),
                        array('text' => 'Default', 'value' => 'default'),
                        array('text' => 'Fiori', 'value' => 'Fiori'),
                        array('text' => 'Flat', 'value' => 'Flat'),
                        array('text' => 'High Contrast', 'value' => 'highcontrast'),
                        array('text' => 'Material', 'value' => 'material'),
                        array('text' => 'moonlight', 'value' => 'moonlight'),
                        array('text' => 'Nova', 'value' => 'nova'),
                        array('text' => 'Office 365', 'value' => 'office365'),
                        array('text' => 'Silver', 'value' => 'silver'),
                        array('text' => 'Uniform', 'value' => 'uniform')
                    ))
                    ->attr('style', 'width: 36%');
                echo $oSkinDropDownList->render();
            ?>
        </p>
    <?php
        $oGeneralSettings->endContent();
        $oUrlSettings = new \Kendo\UI\TabStripItem();
        $oUrlSettings->text("Url Settings")->startContent();
        $oPageable = new Kendo\UI\GridPageable();
        $oPageable->refresh(true)
                  ->pageSizes(true)
                  ->buttonCount(5);
        $oGridUrlSettings = new \Kendo\UI\Grid('UrlSettingsGrid');
        $oTransport = new \Kendo\Data\DataSourceTransport();
        $oRead = new \Kendo\Data\DataSourceTransportRead();
        $oRead->url(admin_url('admin-ajax.php?action=jReadUrlCB'))
             ->contentType('application/json')
             ->dataType("json")
             ->type("POST");
        $oTransport->read($oRead)->parameterMap('function(data) {
            return kendo.stringify(data);
        }');
        $oModel = new \Kendo\Data\DataSourceSchemaModel();
        $oIDField = new \Kendo\Data\DataSourceSchemaModelField('ID');
        $oIDField->type('number');
        $oNameField = new \Kendo\Data\DataSourceSchemaModelField('post_name');
        $oNameField->type('string');
        $oTitleField = new \Kendo\Data\DataSourceSchemaModelField('post_title');
        $oTitleField->type('string');
        $oContentField = new \Kendo\Data\DataSourceSchemaModelField('post_content');
        $oContentField->type('string');
        $oModel->addField($oIDField)
               ->addField($oNameField)
               ->addField($oTitleField)
               ->addField($oContentField);
        $oSchema = new \Kendo\Data\DataSourceSchema();
        $oSchema->model($oModel);
        $oDataSource = new \Kendo\Data\DataSource();
        $oDataSource->transport($oTransport)
                   ->data('data')
                   ->pageSize(10)
                   ->schema($oSchema)
                   ->serverFiltering(false)
                   ->serverSorting(false)
                   ->serverGrouping(false)
                   ->serverPaging(false);
        $oViewId = new \Kendo\UI\GridColumn();
        $oViewId->template("#= ID #")->title('ID')->width(85);
        $oPostNameColumn = new \Kendo\UI\GridColumn();
        $oPostNameColumn->field("post_name")->title('Url Name')->width(300);
        $oPostTitleColumn = new \Kendo\UI\GridColumn();
        $oPostTitleColumn->field("post_title")->title('Url Title')->width(300);
        $oPostUrlColumn = new \Kendo\UI\GridColumn();
        $oPostUrlColumn->field("post_content")->title('Url Parameter Information')->width(300);
        $oUrlSettingsCommand = new \Kendo\UI\GridColumn();
        $oUrlSettingsCommand->addCommandItem("edit")
                ->title("&nbsp;")
                ->width(80);
        $oColumnMenu = new \Kendo\UI\GridColumnMenu();
        $oColumnMenu->filterable(true);
        $oGridUrlSettings->addColumn($oUrlSettingsCommand, $oViewId, $oPostNameColumn, $oPostTitleColumn, $oPostUrlColumn)->dataSource($oDataSource)->columnMenu($oColumnMenu)->height(400)->editable('popup')->pageable($oPageable)->sortable(true)->navigatable(true)->resizable(true)->reorderable(true)->groupable(false)->filterable(true)->addToolbarItem(new \Kendo\UI\GridToolbarItem('excel'), new \Kendo\UI\GridToolbarItem('pdf'), new \Kendo\UI\GridToolbarItem('create'), new \Kendo\UI\GridToolbarItem('search'))->cancel('UrlSettingsGridCancel')->save('UrlSettingsGridSave');
        echo $oGridUrlSettings->render();
    ?>
    <?php
        $oTransport3 = new \Kendo\Data\DataSourceTransport();
        $oRead3 = new \Kendo\Data\DataSourceTransportRead();
        $oRead3->url(admin_url('admin-ajax.php?action=jReadUrl2CB'))
             ->contentType('application/json')
             ->dataType("json")
             ->type("POST");
        $oTransport3->read($oRead3)->parameterMap('function(data) {
            return kendo.stringify(data);
        }');
        $oModel3 = new \Kendo\Data\DataSourceSchemaModel();
        $oIDField3 = new \Kendo\Data\DataSourceSchemaModelField('ID');
        $oIDField3->type('number');
        $oNameField3 = new \Kendo\Data\DataSourceSchemaModelField('post_name');
        $oNameField3->type('string');
        $oModel3->addField($oIDField3)
               ->addField($oNameField3);
        $oSchema3 = new \Kendo\Data\DataSourceSchema();
        $oSchema3->model($oModel3);
        $oDataSource3 = new \Kendo\Data\DataSource();
        $oDataSource3->transport($oTransport3)
                   ->data('data')
                   ->schema($oSchema3);
        $oUrlSettings->endContent();
        $oStatistics = new \Kendo\UI\TabStripItem();
        $oStatistics->text("Statstics")->startContent();
        $oUrlSetting = new \Kendo\UI\DropDownList('UrlSettingDropDownList');
        $oUrlSetting
              ->dataTextField('post_name')
              ->dataValueField('ID')
              ->dataSource($oDataSource3)
              ->attr('style', 'width: 90%');
        echo $oUrlSetting->render();
        $oUrlSettingPopulate = new \Kendo\UI\Button('UrlSettingButton');
        $oUrlSettingPopulate->content("Populate");
        $oUrlSettingPopulate->click(new \Kendo\JavaScriptFunction('function() { nId = jQuery("#UrlSettingDropDownList").data("kendoDropDownList").value(); jQuery("#StatisticsGrid").data("kendoGrid").dataSource.read(); }'));
        echo $oUrlSettingPopulate->render();
        $oGridStatistics = new \Kendo\UI\Grid('StatisticsGrid');
        $oTransport2 = new \Kendo\Data\DataSourceTransport();
        $oRead2 = new \Kendo\Data\DataSourceTransportRead();
        $oRead2->url(admin_url('admin-ajax.php?action=jReadStatisticsCB'))
             ->contentType('application/json')
             ->dataType("json")
             ->type("POST");
        $oRead2->data(new \Kendo\JavaScriptFunction('function() { return { nId: nId }; }'));
        $oTransport2->read($oRead2);
        $oModel2 = new \Kendo\Data\DataSourceSchemaModel();
        $oIDField2 = new \Kendo\Data\DataSourceSchemaModelField('ID');
        $oIDField2->type('number');
        $oNameField2 = new \Kendo\Data\DataSourceSchemaModelField('post_name');
        $oNameField2->type('string');
        $oDate2 = new \Kendo\Data\DataSourceSchemaModelField('comment_date');
        $oDate2->type('date');
        $oContent2 = new \Kendo\Data\DataSourceSchemaModelField('comment_content');
        $oContent2->type('string');
        $oA2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_A');
        $oA2->type('string');
        $oB2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_B');
        $oB2->type('string');
        $oC2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_C');
        $oC2->type('string');
        $oD2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_D');
        $oD2->type('string');
        $oE2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_E');
        $oE2->type('string');
        $oF2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_F');
        $oF2->type('string');
        $oG2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_G');
        $oG2->type('string');
        $oH2 = new \Kendo\Data\DataSourceSchemaModelField('jiu_H');
        $oH2->type('string');
        $oModel2->addField($oIDField2)
               ->addField($oNameField2)
               ->addField($oDate2)
               ->addField($oContent2)
               ->addField($oA2)
               ->addField($oB2)
               ->addField($oB2)
               ->addField($oC2)
               ->addField($oD2)
               ->addField($oE2)
               ->addField($oF2)
               ->addField($oG2)
               ->addField($oH2);
        $oSchema2 = new \Kendo\Data\DataSourceSchema();
        $oSchema2->model($oModel2);
        $oDataSource2 = new \Kendo\Data\DataSource();
        $oDataSource2->transport($oTransport2)
                   ->data('data')
                   ->pageSize(10)
                   ->schema($oSchema2)
                   ->serverFiltering(false)
                   ->serverSorting(false)
                   ->serverGrouping(false)
                   ->serverPaging(false);
        $oViewId2 = new \Kendo\UI\GridColumn();
        $oViewId2->template("#= ID #")->title('ID')->width(85);
        $oPostNameColumn2 = new \Kendo\UI\GridColumn();
        $oPostNameColumn2->field('post_name')->title('Name')->width(300);
        $oCommentDate2 = new \Kendo\UI\GridColumn();
        $oCommentDate2->field('comment_date')->title('Date')->width(200);
        $oCommentContent2 = new \Kendo\UI\GridColumn();
        $oCommentContent2->field('comment_content')->title('Content')->width(400);
        $oA = new \Kendo\UI\GridColumn();
        $oA->field('jiu_A')->title('A')->width(200);
        $oB = new \Kendo\UI\GridColumn();
        $oB->field('jiu_B')->title('B')->width(200);
        $oC = new \Kendo\UI\GridColumn();
        $oC->field('jiu_C')->title('C')->width(200);
        $oD = new \Kendo\UI\GridColumn();
        $oD->field('jiu_D')->title('D')->width(200);
        $oE = new \Kendo\UI\GridColumn();
        $oE->field('jiu_E')->title('E')->width(200);
        $oF = new \Kendo\UI\GridColumn();
        $oF->field('jiu_F')->title('F')->width(200);
        $oG = new \Kendo\UI\GridColumn();
        $oG->field('jiu_G')->title('G')->width(200);
        $oH = new \Kendo\UI\GridColumn();
        $oH->field('jiu_H')->title('H')->width(200);
        $oColumnMenu2 = new \Kendo\UI\GridColumnMenu();
        $oColumnMenu2->filterable(true);
        $oGridStatistics->addColumn($oViewId2, $oPostNameColumn2, $oCommentDate2, $oCommentContent2, $oA, $oB, $oC, $oD, $oE, $oF, $oG, $oH)->autoBind(false)->dataSource($oDataSource2)->columnMenu($oColumnMenu2)->height(400)->pageable($oPageable)->sortable(true)->navigatable(true)->resizable(true)->reorderable(true)->groupable(true)->filterable(true)->addToolbarItem(new \Kendo\UI\GridToolbarItem('excel'), new \Kendo\UI\GridToolbarItem('pdf'), new \Kendo\UI\GridToolbarItem('search'));
        echo $oGridStatistics->render();
    ?>
    <?php
        $oStatistics->endContent();
        $oHelp = new \Kendo\UI\TabStripItem();
        $oHelp->text("Help")->startContent();
    ?>
    <p>The product you are evaluating starts in demonstration mode. You have 30 days from date of install to evaluate the product.</p>
    <p>Part of the running of the software checks for license status.</p>
    <p>The software shall not run completely if you have not paid for usage after the 30 days.</p>
    <p>It is the statistical area of the software that shall not function correctly. The program continues to collect hits otherwise.</p>
    <p>We appreciate you using the software, and thank you for your patronage.</p>
    <p>Kind Regards</p>
    <p><a href="mailto:david@dar-jader.com">David Robertson</a></p>
    <p>Please email me your feedback</p>
    <?php
        $oHelp->endContent();
        $oTabStrip->addItem($oGeneralSettings, $oUrlSettings, $oStatistics, $oHelp);
        
        $oAnimation = new \Kendo\UI\TabStripAnimation();
        $oOpenAnimation = new \Kendo\UI\TabStripAnimationOpen();
        $oOpenAnimation->effects("fadeIn");
        $oAnimation->open($oOpenAnimation);
        $oTabStrip->animation($oAnimation);
    
        echo $oTabStrip->render();
    ?>    
</div>
<script type="text/javascript">
    var nId;
    function SkinDropDownListChange(e)
    {
        if (e.sender.value() == "-1")
        {
            jiu_SetCookie("WP_Kendo_Theme", "blueopal");
        }
        else
        {
            jiu_SetCookie("WP_Kendo_Theme", e.sender.value());
        }
        jiu_ReloadPage();
    }
    
    jQuery(document).ajaxStart(function () {
        setTimeout(function () {

        }, 0);
    });
    jQuery(document).ajaxStop(function () {
        setTimeout(function () {

        }, 0);
    });
    jQuery(document).ajaxError(function(event,xhr,options,exc)
    {

    });
    jQuery(document).ready(function () {
        var sSkin = jiu_GetCookie("WP_Kendo_Theme");
        if (sSkin == null) {
            jiu_SetCookie("WP_Kendo_Theme", "blueopal");
            jiu_ReloadPage();
        }
    });
    function UrlSettingsGridCancel(e)
    {
        jQuery("#UrlSettingsGrid").data("kendoGrid").dataSource.read();
    }
    function UrlSettingsGridSave(e)
    {
        var oData = {};
        oData.ID = e.model.ID;
        oData.post_name = e.model.post_name;
        oData.post_title = e.model.post_title;
        oData.post_content = e.model.post_content;
        if (e.model.ID != 0)
        {
            oData.action = "jSaveUrlECB"; 
        }
        else
        {
            oData.action = "jSaveUrlICB"; 
        }
        jQuery.ajax({
            url : ajaxurl,
            data : oData,
            method : 'POST',
            success: function(oData) {
                jQuery("#UrlSettingsGrid").data("kendoGrid").dataSource.read();
            } 
        });
    }
</script>

Les paramètres généraux du plugin définissent la peau sur un contraste élevé

Les paramètres d'URL du plug-in contiennent une liste de noms d'URL, de titres et d'informations sur les paramètres

Les statistiques du plugin indiquent la date, le contenu, A, B

L'aide du plugin affiche le message concernant le mode démo

Conclusion

Je tiens à vous remercier d’avoir pris le temps d’absorber ce blog. Je suis très disposé à prendre des commentaires sur cet article et répondrai à toutes les questions dès que possible.

Je pense que je mérite un biscuit au chocolat. 🙂 Je les ai mangés avant de finir. 🙂

Je vous souhaite bonne chance.
David




Source link