IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WordPress PHP Discussion :

Gestion d'un "panier" côté admin - colonnes, champs, type page "Commentaires"


Sujet :

WordPress PHP

  1. #1
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut Gestion d'un "panier" côté admin - colonnes, champs, type page "Commentaires"
    Bonjour,

    J'ai un problème peut-être simple à résoudre.
    Je donne avec mon plugin la possibilité à mes utilisateurs d'envoyer des demandes d'informations concernant des articles qu'ils ont sélectionné en les plaçant dans un "panier".
    Cela fonctionne comme dans woocommerce sauf qu'il ne s'agit que d'informations à demander (envoi de mail à admin, et notification des demandes transmises dans les pages admin).

    Je voudrais donc gérer les demandes côté admin à la façon de commentaires avec mes propres champs et ma propre table dans la BdD.

    • Je vois comment ajouter une option par 'register_settings". Mais cela ne convient pas à ce que je veux.
      Le menu est placé dans réglages et je n'arrive pas à lui ajouter une table (comme dans "commentaires") avec mes propres champs.

    • Je vois comment ajouter un type de publication par "register_post_type".
      Mais il s'agit d'un moyen de poster des articles, ce n'est pas ce que je veux.
      Par contre, j'arrive à définir des colonnes (même si elles ne correspondent pas encore à celles dont j'aurais besoin pour ma table perso dans la BdD) et le lien se fait dans le menu principal de l'admin, avec une icône.



    Je voudrais que cela fonctionne comme "Commentaires", avec un lien à placer au même niveau dans le menu principal avec icône associée, avec une gestion en colonne de mes données, et connexion à ma table perso.

    En résumé, comment implémenter côté admin une fonctionnalité genre "Commentaires" personnalisée ?

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    vous n'avez pas besoin d'une autre table pour faire cela. vous avez bien trouvé la fonction "register_post_type" qui va créer un nouveau type "Demande". et donc les demandes seront stockées dans les tables de wordpress.
    vous pouvez créer ce nouveau type comme cela par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    const TYPE_DEMANDE = "demande"; // code du nouveau type qui sera utilisé à plusieurs endroits
     
     
    add_action("wp_loaded", function () {
     
    	register_post_type(
    		  TYPE_DEMANDE
    		,
    		[
    			"label" => "Demandes",
    			"public" => FALSE,
    			"show_ui" => TRUE,
    			"supports" => [
    				"title",
    				"editor",
    				"author",
    				"revisions",
    			],
    		]
    	);
     
     
    });

    la valeur de configuration "public" permet de ne pas afficher plubliquement les urls https://serveur/demande/titre-de-la-demande qui sont gérés par wordpress de base.
    les différentes options de configuration sont expliquées dans la documentation :
    https://developer.wordpress.org/refe...ter_post_type/


    ensuite vous pouvez créer une demande avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wp_insert_post([
    	"post_type" => TYPE_DEMANDE,
    	"post_title" => "Titre de la demande",
    	"post_content" => "contenu",
    ]);
    une fois la demande créée, vous ajoutez et lisez les propriétés de la demande avec ces fonctions :

    https://developer.wordpress.org/refe...ate_post_meta/
    https://developer.wordpress.org/refe...get_post_meta/

  3. #3
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Merci Mathieu,
    Je vais regarder cela.

  4. #4
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Oui, ça fonctionne.
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "show_ui" => TRUE,
    m'avait manqué au début pour persévérer dans cette voie. Sans lui, rien ne s'affichait côté admin quand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "public" => FALSE,
    Je sépare mon enregistrement en deux parties.
    Un pour le post standard où "post-content" est un tableau.
    Un pour le post_meta pour le reste des champs persos.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
            $post_panier_id = wp_insert_post([
                'post_type' => TYPE_PANIER,
                // 'post_title' => 'Nouvelle demande',
                'post_content' => $serialize_list_article,
     
            ]);
     
            $SD_data = Array(
                'nom' => $nom,
                'courriel'=>$courriel,
                'url' => wp_slash( $url),
                'message'=> $message,
                'lettre'=> $lettre,
                'reponse' => $reponse,
                );
     
     
    add_post_meta($post_panier_id, 'SD_data', $SD_data);
    Je créé les champs custom et je les remplis dans une classe à part.
    avec les hooks 'manage_sdpanier_posts_columns' et 'manage_sdpanier_posts_custom_column'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            add_filter('manage_sdpanier_posts_columns', [self::class, 'add_sdpanier_columns']);
            add_filter('manage_sdpanier_posts_custom_column', [self::class, 'add_sdpanier_custom'], 10, 2);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
        public static function add_sdpanier_columns($columns)
        {
            unset($columns['author']);
     
             return array_merge(
                $columns,
                array(
                    'identite' => 'Identité',
                    'articles' => 'Articles',
                    'message' => 'Message',
                    'date' => $columns['date'],
                    'reponse' => 'Répondu',
                )
            );
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    <?php
        public static function add_sdpanier_custom($column, $post_id)
        {
     
            $Data_meta = get_post_meta($post_id, '');
            $Datas_demande = get_post($post_id);
            $Datas_demande = json_decode(json_encode($Datas_demande), true);
     
     
            $Data_meta = unserialize($Data_meta['SD_data'][0]);                 
     
     
            $list_articles_array = unserialize($Datas_demande['post_content']);
     
            $List_identite = array(
                'nom' => $Data_meta['nom'],
                'courriel' => $Data_meta['courriel'],
                'url' => $Data_meta['url'],
            );
     
     
            $message = $Data_meta['message'];
            $reponse = $Data_meta['reponse'];
     
            if ($column == 'identite') {
                if ($List_identite) {
                ?>
                    <div class="SD_admin_table_identite">
                        <!-- <div -->
                        <div class="SD_admin_recap_identite">
                            <!-- <p><b><u>Informations demandées pour :</u></b> -->
                            <table>
     
                                <!-- <td class="SD_admin_tr_send"> -->
                                <tr>
                                    <td><?= $List_identite['nom'] ?></td>
                                </tr>
                                <tr>
                                    <td><?= $List_identite['courriel'] ?></td>
                                </tr>
                                <tr>
                                    <td><a href="<?= $List_identite['url'] ?>"><?= $List_identite['url'] ?></a></td>
                                </tr>
     
                                <!-- </td> -->
                            </table>
                        </div>
                    </div>
                <?php
     
     
     
                } else {
                    echo ('--');
                }
            }
            if ($column == 'articles') {
                if ($list_articles_array) {
     
                ?>
                    <div class="SD_admin_table">
                        <div class="SD_admin_recap_transmis">
                            <!-- <p><b><u>Informations demandées pour :</u></b> -->
                            <table>
                                <tr>
                                    <th>Article</th>
                                    <th>Référence</th>
                                </tr>
                                <?php
                                foreach ($list_articles_array as $elem) {
     
                                ?>
                                    <tr class="SD_admin_tr_send">
                                        <td><a href="<?= $elem['Lien'] ?>"><?= $elem['Article'] ?></a> </td>
                                        <td><?= $elem['Reference'] ?> </td>
                                    </tr>
                                <?php
                                }
                                ?>
                            </table>
                        </div>
                    </div>
                <?php
                } else {
                    echo ('--');
                }
            }
            // //-----------
            if ($column == 'message') {
                if ($message) {
                    echo ($message);
                } else {
                    echo ('--');
                }
            }
            // //-----------
            if ($column == 'reponse') {
     
                if ($reponse) {
     
                ?>
                    <input type="hidden" value="false" name="<?= self::META_KEY ?>">
                    <input type="checkbox" value="true" name="<?= self::META_KEY ?>" <?php checked($reponse, 'true') ?>>
                    <!-- <label for="monthemesponso">Cet article est sponsorisé ?</label> -->
                <?php
     
                } else {
                    echo ('--');
                }
            }
        }
    Nom : admin_panier.png
Affichages : 119
Taille : 12,5 Ko

    J'ai d'autres problèmes, comme par exemple pouvoir cocher la case "répondu" et enregistrer "true" dans le post_meta, mais je considère cette partie comme résolue.
    Merci

  5. #5
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Bonjour,
    Je reviens partager des informations pour ceux qui rencontreraient le même souci que moi.

    Je rappelle mon objectif.
    Gérer les demandes d'informations soumises par formulaire.
    Colonnes : Date, identité (courriel, nom, url), Articles (tableau d'articles), Message, Réponse faite (checkbox admin).

    En fait, j'ai complétement revu ma copie.
    Je créé toujours un post_type personnel (avec show_ui false) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public static function SD_types()
        {
            register_post_type('sdpanier', [
                'label' => 'SD Panier',
                'public' => false,
                'show_ui' => false,
                'show_in_rest' => false,
                'has_archive' => false,
            ]);
        }
    mais au lieu d'utiliser la page admin du post_type j'ai créé une page par add_menu_page pour gérer mon administration.
    La page par défaut du post_type comportait des fonctionnalités dont je n'avais pas besoin (comme "Ajouter") et il en manquait dont j'avais au contraire absolument besoin (comme la pagination).
    J'avais bricolé avec des morceaux de codes et du html, mais rien ne fonctionnait dynamiquement. Mieux valait faire les choses dans les règles.

    La difficulté en repartant de zéro et en utilisant "add_menu_page", c'est d'utiliser la classe "class-wp-list-table.php" sous "wp-admin/includes".

    Il existe un peu de littérature sur la façon de faire.
    Voici les deux liens qui m'ont le plus aidé :
    https://wpmudev.com/blog/wordpress-admin-tables/
    et


    En résumé :

    - Créer un post_type
    - Créer une page avec add_menu_page
    - Étendre la classe class-wp-list-table
    - instancier les fonctions requises ('prepare_items', 'get_columns', 'get_hidden_columns', 'get_sortable_columns', 'column_default')
    - instancier les fonctions de la classe qui nous intéressent (row_action, actions groupées, recherche par date, recherche générale, pagination...)
    - Affichage de la table

    Je ne peux pas présenter mon code entier.
    Je partage certaines choses (commentées) qui pourraient être utiles, car j'ai bien galéré et sacrifié des neurones par camion benne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    <?php
     
     
    class PanierAdminMenuPage
    {
     
        public static function register()
        {
            add_action('init', [self::class, 'SD_types']);
            add_action('admin_menu', [self::class, 'add_panier_menu']);
        }
     
     
        public static function add_panier_Menu()
        {
            // Affichage des réponses en attente : Warning bulle
            // J'utilise un transient
            // https://wordpress.stackexchange.com/questions/15567/add-update-notification-bubble-to-admin-menu-item
            // Je dois redéfinir/ recalculer le nombre à chaque appel de la page (ce nombre est par ailleurs modifiable par l'admin (checkbox 'réponse envoyée', ou mise à la corbeille) et par javascript)
     
            $warnings = array();
     
            $Mon_query = new WP_query(array(
                'post_type'  => 'sdpanier', 
                'post_status' => 'draft',        // Mon post-type est enregistré en 'draft' par défaut (demande soumise par formulaire) et l'admin peut mettre à la corbeille puis supprimer définitivement 
            ));
     
     
            if ($Mon_query->have_posts()) {
     
                while ($Mon_query->have_posts()) {
                    $Mon_query->the_post();
                    $the_id = get_the_ID();
                    $the_status=get_post_status();
                    $Data_meta = get_post_meta($the_id, '');
                    $Data_meta = unserialize($Data_meta['SD_data'][0]);
                    $reponse = $Data_meta['reponse'];  // La valeur que j'utilise pour compter les demandes auxquelles je n'ai pas encore répondu (meta donnée)
     
                    if ($the_status == 'draft' && $reponse == "false") {
                        $warnings = array_merge($warnings, array($the_id));
                    }
     
                }
                    set_transient('SD_attente', $warnings);
                    wp_reset_postdata();
     
            }
     
            if($warnings){
            // Affichage d'une bulle à côté du nom du menu, nombre de réponses en attente
     
            $warning_count = count( $warnings );
     
            $warning_title = esc_attr( sprintf( '%d plugin warnings', $warning_count ) );
            $menu_label = sprintf( 'Panier %s', "<span class='update-plugins check_demande count-$warning_count' title='$warning_title'><span class='plugin-count update-count'>" . number_format_i18n($warning_count) . "</span></span>" );
            add_menu_page('Paramètres', $menu_label, 'manage_options', 'panier', [self::class, 'SD_Rendu_list_page'], 'dashicons-editor-customchar', 4);
     
        }
            else
            {
             // si pas de demande en attente 
            add_menu_page('Paramètres', 'Panier', 'manage_options', 'panier', [self::class, 'SD_Rendu_list_page'], 'dashicons-editor-customchar', 4);
     
            }
        }
     
    // création du custom type 
        public static function SD_types()
        {
            register_post_type('sdpanier', [
                'label' => 'SD Panier',
                'public' => false,
                'show_ui' => false,
                'show_in_rest' => false,
                'has_archive' => false,
            ]);
        }
     
     
     
     
        public static function SD_Rendu_list_page()
        {
            ob_start();
            include_once plugin_dir_path(__FILE__) . 'paniers.php';     // Fichier principal du menu
            $template = ob_get_contents();
            ob_end_clean();
            echo $template;
        }
    }
    Et deux méthodes de ma classe 'SDTableList' qui étend "class-wp-list-table' (dans paniers.php):

    Début du fichier avec 'prepare_items' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?php
     
    // https://developer.wordpress.org/reference/classes/wp_list_table/
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
     
     
    class SDTableList extends WP_List_Table
    {
        // Prepare_items
        public function prepare_items()
        {
            $user_search_key = isset($_REQUEST['s']) ? wp_unslash(trim($_REQUEST['s'])) : ''; // filtre de recherche générale
     
            $data = $this->sd_list_table_data(); // C'est dans cette fonction que sont récupérées et mises en formes les données 
     
     
            // -------------------------- PAGINATION ----------
            $per_page = 4;   // Valeur pouvant provenir de 'option de l'écran' que je n'ai pas implémenté
     
            $current_page = $this->get_pagenum();
            $total_items = count($data);               // données non filtrées  
     
            $this->set_pagination_args(array(
                'total_items' => $total_items,
                'per_page'    => $per_page,
                'total_pages' => ceil($total_items / $per_page)
            ));
     
            // Search ------------
            if ($user_search_key) {
                $data_search = $this->filter_table_data($data, $user_search_key);    // données filtrées par la recherche générale 
                $total_items = count($data_search);               
     
                $this->set_pagination_args(array(
                    'total_items' => $total_items,
                    'per_page'    => $per_page,
                    'total_pages' => ceil($total_items / $per_page)
                ));
                $this->items = array_slice($data_search, (($current_page - 1) * $per_page), $per_page);
            } else {
                $this->items = array_slice($data, (($current_page - 1) * $per_page), $per_page);
            }
            //  ----------------------------------------------------------------
     
     
            $columns = $this->get_columns();
            $hidden = $this->get_hidden_columns();
            $sortable = $this->get_sortable_columns();
     
            $this->_column_headers = array($columns, $hidden, $sortable);
     
     
            // ROW actions et Actions groupées (nécessite la checkbox cb en première colonne) 
            $this->handle_table_actions();
     
     
        } // fin de 'prepare_items'
    ...
    et voici la fonction d'affichage (en dehors de la classe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    <?php 
    function sd_show_data_list_table()
    {
                $sd_table = new SDTableList();
     
                $sd_table->prepare_items();
        ?>
        <!-- --------------------------------------------- EN TETE  -->
        <div class="wrap">
            <!-- <h1 class="wp-heading-inline" >SD Panier</h1>
    <h3 style="margin-bottom: 7px;">Gestion des demandes d'informations</h3> -->
            <table>
                <tr>
                    <h1 class="wp-heading-inline">SD Panier</h1>
                </tr>
                <tr>
                    <h3 style="margin-bottom: 7px;">Gestion des demandes d'informations</h3>
                </tr>
            </table>
            <?php $sd_table->views(); ?>               // affiche : Tous(#) | Corbeille(#)  
     
            <!-- </div> -->
     
            <!-- --------------------------------------------- SEARCH BOX  -->
            <!-- <div class="wrap">     -->
            <div id="sd-list-table">
                <div id="sd-post-body">
                    <form id="sd-list-form" method="get">
                        <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
                        <?php
     
                        $sd_table->search_box("Rechercher", "post");
     
                        $sd_table->display();
     
     
                        ?>
                    </form>
                </div>
            </div>
        </div>
        <!-- ---------------------------------------------------------- -->
    <?php
     
    }
     
    sd_show_data_list_table();
    Voilà pour le code, c'est très parcellaire mais ça peut permettre de débuter.
    J'utilise des scripts et des requêtes ajax pour gérer les évènement de mes checkbox 'réponse envoyée' (changement du post_status (draft ou trash) et modification méta donnée (réponse faite), puis mise à jour du transient qui affiche la bulle warnings.

    N'hésitez pas à me questionner, je serais heureux d'aider.
    Merci,

    Nom : SD_admin_panier.png
Affichages : 126
Taille : 39,1 Ko

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    merci d'avoir détaillé ce que vous avez utilisé, ça pourra être très utile à d'autre développeurs d'extension.

    au sujet des neurones perdus, la bonne nouvelle c'est que le temps passé à comprendre le code de wordpress vous sera rendu plusieurs fois dans vos futurs projets.
    et au bout d'un moment, vous aurez tellement de wordpress dans la tête que vous aurez le même réflexe que moi, c'est à dire que pour chaque nouveau projet vous allez d'abord réfléchir à comment le faire avec wordpress. (en fait, ce n'est peut-être un si bonne nouvelle que ça, je vous laisse en décider )

  7. #7
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Vous voulez dire que je vais me demander comment élever mes enfants ou comment boire une bière en utilisant wordpress !?
    Mais c'est horrible !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PrestaShop] Multiboutiques : pas de gestion des stocks si panier commun activé
    Par GalopaWXY dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 02/06/2015, 20h59
  2. [POI] gestion de la quote/apostrophe en premier caractère
    Par msieur_tim dans le forum Documents
    Réponses: 0
    Dernier message: 23/02/2010, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo