Fiche Produit créer des champs personnalisés

cpalocpalo Member

Bonjour,
J'ai des articles ( des fiches produits) classés dans des categories et sous-catégories.
Lors de l'édition ou la création de ces articles, j'aurai souhaité disposé de champs personnalisés pour les saisir dans l'éditeur ( prix, image, description, ..)
Finalement je voulais me lancer dans un petit plugin pour créer ces champs, mais besoin d'aide et je fais peut-etre fausse route en passant à côté d'une autre solution;
Le début de mon code:

<?php
class CustomFields extends plxPlugin {

    // Déclaration des hooks
    public function __construct($defaultLang) {
        parent::__construct($defaultLang);

        // Définir les profils autorisés à utiliser ce plugin
        $this->setConfigProfil(PROFIL_ADMIN, PROFIL_MANAGER, PROFIL_EDITOR);

        // Ajouter des hooks pour l'éditeur d'article
        $this->addHook('AdminArticleEdit', 'AdminArticleEdit');
        $this->addHook('AdminArticleNew', 'AdminArticleNew');
        $this->addHook('AdminHeadEnd', 'AdminHeadEnd'); // Hook pour charger le CSS
    }

    // Méthode pour charger le CSS dans l'admin
    public function AdminHeadEnd() {
        echo '<link rel="stylesheet" type="text/css" href="' . PLX_PLUGINS . 'customfields/css/admin.css" />';
    }

    // Fonction pour afficher les champs personnalisés dans l'éditeur
    public function AdminArticleEdit() {
        $this->displayCustomFields();
    }

    public function AdminArticleNew() {
        $this->displayCustomFields();
    }

    // Fonction pour afficher les champs
    private function displayCustomFields() {
        $plxAdmin = plxAdmin::getInstance();
        $article = $plxAdmin->aArt;

        // Début de la section des champs personnalisés
        echo '<div class="fieldset" id="customfields-section">';
        echo '<h3>Champs personnalisés</h3>';

        // Champ Prix
        echo '<div class="field">';
        echo '<label for="prix">Prix (€)</label>';
        echo '<input type="text" name="prix" id="prix" value="' . (isset($article['prix']) ? htmlspecialchars($article['prix']) : '') . '" size="10" />';
        echo '<p class="help">Prix du produit en euros (ex: 29.99)</p>';
        echo '</div>';

        // Champ Images supplémentaires
.....

  // Fin de la section
        echo '</div>';
    }
}
?>

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour @cpalo ,
    Voici le code d'un plugin qui fonctionne :

    <?php
    
    if(!defined('PLX_ROOT')) {
        exit;
    }
    
    class customFields extends plxPlugin {
        const HOOKS = array(
            'plxMotorParseArticle',
            'plxAdminEditArticleXml',
    
            # Pour récupérer tous les hooks employés dans article.php :
            # grep callHook core/admin/article.php |sed -E "s/^.*callHook\('(\w+)'\).*/'\1',/"
    
            # 'AdminArticlePrepend',
            'AdminArticlePreview',
            'AdminArticlePostData',
            'AdminArticleParseData',
            'AdminArticleInitData',
            # 'AdminArticleTop',
            # 'AdminArticleContent',
            'AdminArticleSidebar',
            # 'AdminArticleFoot',
        );
    
        # Liste des nouveaux champs de l'article
        const FIELDS = array(
            'price',
            'description',
        );
    
        const BEGIN_CODE = '<?php # ' . __CLASS__ . ' plugin' . PHP_EOL;
        const END_CODE = PHP_EOL . '?>';
    
        public function __construct($default_lang) {
            parent::__construct($default_lang);
            # Profils autorisés pour le panneau de configuration du plugin
            $this->setConfigProfil('PROFIL_ADMIN, PROFIL_MANAGER, PROFIL_EDITOR');
            foreach(self::HOOKS as $hook) {
                if(preg_match('#^plxMotor#', $hook) or defined('PLX_ADMIN')) {
                    $this->addHook($hook, $hook);
                }
            }
        }
    
        public function sidebar($field, $value) {
            $type = 'text';
    ?>
                    <div class="grid">
                        <div class="col sml-12">
                            <label for="id_<?= $field ?>"><?php $this->lang('L_' . strtoupper($field)) ?>&nbsp;:</label>
                            <?php plxUtils::printInput($field, plxUtils::strCheck($value), $type, '27-255'); ?>
                        </div>
                    </div>
    <?php
        }
    
        /* ============= Hooks =============== */
    
        public function plxMotorParseArticle() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        $art[$field] = isset($iTags[$field]) ? plxUtils::getValue($values[$iTags[$field][0]]['value']) : '';
    }
    <?php
            echo self::END_CODE;
        }
    
        public function plxAdminEditArticleXml() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        # Controler l'intégrité de la donnée de $content[$field];
        $value = ($field === 'price') ? $content[$field] : '<![CDATA[' . $content[$field] . ']]>';
        $data = "\t<"  . $field . '>' . $value . '</'  . $field . '>' . PHP_EOL;
        if(isset($xml)) {
            # ancienne version de PluXml
            $xml .= $data;
        } else {
            echo $data;
        }
    }
    <?php
            echo self::END_CODE;
        }
    
        #
        # Pour générer automatiquement les déclarations de tous les hooks de article.php :
        # grep callHook core/admin/article.php |sed -E "s/^.*callHook\('(\w+)'\).*/public function \1\() \{\n\}\n/"
        #
    
        public function AdminArticlePrepend() {
            echo self::BEGIN_CODE;
    ?>
    $myPlugin = $this->plxPlugins->aPlugins['<?= __CLASS__ ?>'];
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticlePreview() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        $art[$field] = $_POST[$field];
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticlePostData() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        $<?= __CLASS__?>[$field] = trim($_POST[$field]);
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticleParseData() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        $<?= __CLASS__?>[$field] = trim($result[$field]);
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticleInitData() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        $<?= __CLASS__?>[$field] = '';
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticleTop() {
            echo self::BEGIN_CODE;
    ?>
    $myPlugin = $plxAdmin->plxPlugins->aPlugins['<?= __CLASS__ ?>'];
    foreach($myPlugin::FIELDS as $field) {
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticleContent() {
            echo self::BEGIN_CODE;
    ?>
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticleSidebar() {
            echo self::BEGIN_CODE;
    ?>
    $myPlugin = $plxAdmin->plxPlugins->aPlugins['<?= __CLASS__ ?>'];
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
        $myPlugin->sidebar($field, $<?= __CLASS__ ?>[$field]);
    }
    <?php
            echo self::END_CODE;
        }
    
        public function AdminArticleFoot() {
            echo self::BEGIN_CODE;
    ?>
    $myPlugin = $plxAdmin->plxPlugins->aPlugins['<?= __CLASS__ ?>'];
    foreach(<?= __CLASS__ ?>::FIELDS as $field) {
    }
    <?php
            echo self::END_CODE;
        }
    
    }
    

    Pour l'image, utiliser la vignette (thumbnail) de l'article.
    Il faut rajouter le fichier de langue et le fichier infos.xml.

    Sinon, il y a le plugin kzChamPlus plus généraliste

  • cpalocpalo Member

    Bonjour,
    Merci pour ce retour.

Connectez-vous ou Inscrivez-vous pour répondre.