Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2021-01-10 19:32:22

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

[résolu]Formulaire et traitement réponse

Bonjour et.... meilleure année

Je bloque sur un truc "bizarre".
J(Dc 2.18, multiblogs et simple blog, php 5.6x et 7.3x, local wampserver)

Description du pb
Pour satisfaire à mon besoin de documentation des classes, je tente de créer un plug.
Ce plug est installé dans un dossier /all-blogs/plugins/classinfos/ (multi) ou /dc/plugins/classinfos/ (simple)
Il comporte un fichier index.php qui me pose pb.

A savoir
* j'ai créé un formulaire avec un champ texte de type

form::field('class_name', 40, 255, '', 'maximal', '', false, '', true)

+ formNonce() +submit

* j'ai testé la capture de l'exploitation de la valeur "class_name", avec :

    if (isset($_POST['class_name'])
...
   $choice = trim(html::escapeHTML($_POST['class_name']));
#puis verif class exists avec une fonction qui me renvoie l'existence/le nom de la classe insensible à la casse
   function className ($cl) {
...
        foreach ( get_declared_classes() as $c ) {

ni le formulaire ni la fonction ne pose pb

seulement voilà...
*- si j'appelle la fonction if (isset($_POST['class_name'])... après le formulaire: résultat ok -> nom de la classe car elle existe.
mais
*- si j'appelle la fonction if (isset($_POST['class_name'])... avant le résultat est vide, même si la classe existe !
...

Pour résumer :
- je ne comprends pas pourquoi la fonction (avec le même argument issu du formulaire OU donné pour tester)
ne renvoie pas le même résultat quand son appel est fait avant ou après le formulaire....

Donc question:
* Cela vous est-il déjà arrivé ?
* Si oui comment y remédier ?

Merci de vos réponses
Bernard

Dernière modification par nanart (2021-01-12 21:24:12)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#2 2021-01-11 17:12:25

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : [résolu]Formulaire et traitement réponse

Bonjour
Si j'ai bien compris ton histoire, $_POST['class_name'] ne peux pas exister avant l'envoie du formulaire, vu que c'est lui qui génère la variable.


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#3 2021-01-11 18:29:54

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : [résolu]Formulaire et traitement réponse

En fait c'est pas tout à fait ça: Peut-être me suis-je mal exprimé ?

* $_POST['class_name'] placé avant le formulaire
    - récupère 'class_name' et l'envoie vers la function
    - vérifié car si je dis à la fonction de me retourner ($classname l'argument de la fonction), c'est ok
    - mais la function (qui utilise get_declared_classes()) ne me renvoie aucun résultat  (vide si je déclare $return=null avant la boucle foreach get_declared_classes()...
    si je lui envoie une valeur "fictive" (nom d'une classe existante, ex form), même résultat

* $_POST['class_name'] placé après le formulaire
    - récupère 'class_name' et l'envoie vers la function
    --> la function me renvoie un résultat ok

testé de même avec appel direct de la fonction avec une valeur "fictive" (sans passer par $_POST):
- si le test est avant => null
- si le test est placé après => résultat ok.

J'utilise get_declared_classes() car class_exists (qui est dit insensible à la casse) me renvoie un résultat sensible à la casse (que ce soit sous php 5.6 ou 7.x). Autre avantage de get_declared_classes() c'est que je peux coller une regex qui permet notamment de trouver les fonctions (name) qui sont précédées d'un namespace, par ex (namespace/classe)

Bref (?) la fonction fonctionne ;-) que si son appel est après le formulaire...

Je finis pas me demander si ce n'est pas la fonction php get_declared_classes() qui interfère...
Mais vois pas comment; du moins pas la logique.
Vais essayer de voir avec la fonction class_exists si le pb est différent ou non...

Dernière modification par nanart (2021-01-11 18:34:27)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#4 2021-01-12 06:30:35

nikrou
Membre
Inscription : 2007-10-02
Site Web

Re : [résolu]Formulaire et traitement réponse

J'ai lu plusieurs fois ton message et je dois avouer que je ne comprends pas. Peut-être pourrais-tu mettre un peu plus de code !


Je préfère être atteint de parkinson plutôt qu'alzheimer : je prefère renverser un peu de ma bière plutôt qu'oublier de la boire !

Présentez vos photos simplement avec Phyxo !

Hors ligne

#5 2021-01-12 14:32:06

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : [résolu]Formulaire et traitement réponse

Ex avec function (dt regex) ok si je l'appelle en mettant son appel sous le formulaire

    function className ($cl) {
        if (!isset($cl)) { return null; }
        $pattern = '/\b' .$cl .'$/i';
        $return = null;
        #search
        foreach ( get_declared_classes() as $c ) {
            // preg_match_all ( string $pattern , string $subject , array &$matches = null , int $flags = PREG_PATTERN_ORDER , int $offset = 0 ) : int|false|null
            preg_match_all($pattern, $c, $matches, PREG_SET_ORDER, 0);
            if ($matches) {
                $return = $c;
                break;
            }
        }

        return $return;
    }//className

Dernière modification par nanart (2021-01-12 15:00:19)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#6 2021-01-12 14:37:39

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : [résolu]Formulaire et traitement réponse

test sans passer par $_POST

$ctest = className('FORM');

avant le formulaire (qui est sur la même page) -> Null
après le formulaire (qui est sur la même page) -> 'form'


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#7 2021-01-12 14:40:28

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : [résolu]Formulaire et traitement réponse

Formulaire (au cas où) - est dans une div

    <fieldset id="choose_class">
        <legend><?php echo __('Choose your class'); ?></legend>
        <form method="post" action="<?php echo($p_url); ?>" id="my_class">
        <p>
            <label class="required" for="field_maximal">
                <abbr title="<?php echo(__('Required field')); ?>">*</abbr>
                <?php echo __('your class name:'); ?>
            </label>
            <p class="warning"><?php echo __('The name is matched in a case-insensitive manner.'); ?></p>
            <?php echo(form::field('class_name', 40, 255, $class_choice, 'maximal', '', false, '', true)); ?>
        </p>
            <p><?php echo $core->formNonce(); ?></p>
            <p>
                <input type="submit" name="class_choosed" value="<?php echo __('Choose this class'); ?>" />
            </p>
        </form>
    </fieldset>
 

réponse du form est ok, vérifié via print_r

Dernière modification par nanart (2021-01-12 14:57:23)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#8 2021-01-12 15:56:07

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : [résolu]Formulaire et traitement réponse

Trouvé une réponse possible....

Si je demande si la classe 'form' existe elle n'apparait pas dans get_declared_classes()
si je ne l’appelle pas avant via  un formulaire

Ce qui voudrait dire, sauf erreur de ma part, que la classe form n'est chargée qu'à la demande....

Faudra donc que je trouve une autre solution...
Peut-être en provocant un $_autoload et en interceptant l'erreur ?
Mais reste que là je suis dépendant de la casse....

Dernière modification par nanart (2021-01-12 15:58:27)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#9 2021-01-12 21:38:58

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : [résolu]Formulaire et traitement réponse

J'avais bêtement imaginé que class_exists, etc listait toutes les classes existantes!
Mais, si j'ai bien compris, une classe n'existe que si elle est chargé (upload & co)

Du coup je vais m'intéresser à digests où toutes les classes de dc utilisables sont, à priori, listées...
donc info d'ousse que j'en suis à venir


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map