Création de son premier formulaire

Bonjour,

Je suis entrain de me lancer dans la création de mon premier formulaire dans mon nouveau module intitulé moduletest.

Dans /modultest/core/modules/modModuletest.class.php j’ai :

[code]
$this->menu[$r]=array(‹ fk_menu ›=>‹ fk_mainmenu=moduletest,fk_leftmenu=PremierMenu ›, // ‹  › if this is a top menu. For left menu, use ‹ fk_mainmenu=xxx › or ‹ fk_mainmenu=xxx,fk_leftmenu=yyy › where xxx is mainmenucode and yyy is a leftm$
‹ type ›=>‹ left ›, // This is a Left menu entry
‹ titre ›=>‹ Formulaire Dolibarr ›,
‹ mainmenu ›=>‹ moduletest ›,
‹ leftmenu ›=>‹ PremierMenu ›,
‹ url ›=>‹ moduletest/card.php?action=create&leftmenu=PremierMenu ›,
‹ langs ›=>‹ mymodule@mymodule ›, // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
‹ position ›=>102,
// ‹ enabled ›=>’$conf->mymodule->enabled’, // Define condition to show or hide menu entry. Use ‹ $conf->mymodule->enabled › if entry must be visible if module is enabled. Use '$leftmenu==

De ce fait, dès que je clique sur Formulaire Dolibarr, je suis redirigé vers /moduletest/card.php

Par ailleurs j’ai crée spécialement une nouvelle table dans /moduletest/sql/llx_moduletest_myobject.sql :

CREATE TABLE llx_moduletest_myobject( -- BEGIN MODULEBUILDER FIELDS rowid INTEGER AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(255) NOT NULL, prenom VARCHAR(255) NOT NULL, datenaissance DATETIME NOT NULL, adresse VARCHAR(255) NOT NULL, codepostal INTEGER NOT NULL, fk_country integer DEFAULT 0, tms TIMESTAMP NOT NULL, import_key varchar(14) -- END MODULEBUILDER FIELDS ) ENGINE=innodb;

Enfin, j’ai mon fichier /moduletest/card.php :

// Load Dolibarr environment
$res=0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include($_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php");
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME
$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;
while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; }
if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include(substr($tmp, 0, ($i+1))."/main.inc.php");
if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php");
// Try main.inc.php using relative path
if (! $res && file_exists("../main.inc.php")) $res=@include("../main.inc.php");
if (! $res && file_exists("../../main.inc.php")) $res=@include("../../main.inc.php");
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res) die("Include of main fails");

require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';

$langs->load("mymodule@mymodule");

$id             = (GETPOST('id','int'):$user->id);
$action         = GETPOST('action','alpha');
$mode           = GETPOST('mode','alpha');
$confirm        = GETPOST('confirm','alpha');
$subaction      = GETPOST('subaction','alpha');
$group          = GETPOST("group","int",3);
$cancel         = GETPOST('cancel');

/*
 * Actions
 */

// If create a request
if ($action == 'create')
{
        $object = new Moduletest($db);
        $db->begin();
            $nom = GETPOST('nom');
            $prenom = GETPOST('prenom');
            $datenaissance = dol_mktime(0, 0, 0, GETPOST('datenaissance_month'), GETPOST('datenaissance_day'), GETPOST('datenaissance_year'));
            $adresse=GETPOST('adresse');
            $codepostal=GETPOST('codepostal');

            $valideur = GETPOST('valideur');


            // If no nom
            if (empty($nom))
            {
                setEventMessages($langs->trans("Pas de nom"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no prénom
            if (empty($prenom))
            {
                setEventMessages($langs->trans("Pas de prénom"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no date naissance
            if (empty($datenaissance))
            {
                setEventMessages($langs->trans("Pas de date de naissance"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no adresse
            if (empty($adresse))
            {
                setEventMessages($langs->trans("Pas d'adresse"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no codepostal
            if (empty($codepostal))
            {
                setEventMessages($langs->trans("Pas de code postal"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no validator designated
            if ($valideur < 1)
            {
                setEventMessages($langs->transnoentitiesnoconv('InvalidValidatorCP'), null, 'errors');
                $error++;
            }

            $result = 0;

            if (! $error)
            {
            $object->nom = $nom;
            $object->prenom = $prenom;
            $object->datenaissance = $datenaissance;
            $object->adresse = $adresse;
            $object->codepostal = $codepostal;
            $result = $object->create($user);
                if ($result <= 0)
                {
                        setEventMessages($object->error, $object->errors, 'errors');
                        $error++;
                }
            }
// If no SQL error we redirect to the request card
            if (! $error)
            {
                        $db->commit();

                header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
                exit;
            }
            else
                {
                $db->rollback();
            }
    }
}


llxFooter();
$db->close();

?>

Dès que je clique sur mon left menu -> Formulaire Dolibarr, j’obtiens une page blanche. Serait-il possible d’avoir un petit peu d’aide sur la création des formulaires car je ne trouve quasiment rien sur le wiki, etc …system

De ce fait, dès que je clique sur Formulaire Dolibarr, je suis redirigé vers /moduletest/card.php

Par ailleurs j’ai crée spécialement une nouvelle table dans /moduletest/sql/llx_moduletest_myobject.sql :

CREATE TABLE llx_moduletest_myobject( -- BEGIN MODULEBUILDER FIELDS rowid INTEGER AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(255) NOT NULL, prenom VARCHAR(255) NOT NULL, datenaissance DATETIME NOT NULL, adresse VARCHAR(255) NOT NULL, codepostal INTEGER NOT NULL, fk_country integer DEFAULT 0, tms TIMESTAMP NOT NULL, import_key varchar(14) -- END MODULEBUILDER FIELDS ) ENGINE=innodb;

Enfin, j’ai mon fichier /moduletest/card.php :

// Load Dolibarr environment
$res=0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include($_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php");
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME
$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;
while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; }
if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include(substr($tmp, 0, ($i+1))."/main.inc.php");
if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php");
// Try main.inc.php using relative path
if (! $res && file_exists("../main.inc.php")) $res=@include("../main.inc.php");
if (! $res && file_exists("../../main.inc.php")) $res=@include("../../main.inc.php");
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res) die("Include of main fails");

require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';

$langs->load("mymodule@mymodule");

$id             = (GETPOST('id','int'):$user->id);
$action         = GETPOST('action','alpha');
$mode           = GETPOST('mode','alpha');
$confirm        = GETPOST('confirm','alpha');
$subaction      = GETPOST('subaction','alpha');
$group          = GETPOST("group","int",3);
$cancel         = GETPOST('cancel');

/*
 * Actions
 */

// If create a request
if ($action == 'create')
{
        $object = new Moduletest($db);
        $db->begin();
            $nom = GETPOST('nom');
            $prenom = GETPOST('prenom');
            $datenaissance = dol_mktime(0, 0, 0, GETPOST('datenaissance_month'), GETPOST('datenaissance_day'), GETPOST('datenaissance_year'));
            $adresse=GETPOST('adresse');
            $codepostal=GETPOST('codepostal');

            $valideur = GETPOST('valideur');


            // If no nom
            if (empty($nom))
            {
                setEventMessages($langs->trans("Pas de nom"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no prénom
            if (empty($prenom))
            {
                setEventMessages($langs->trans("Pas de prénom"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no date naissance
            if (empty($datenaissance))
            {
                setEventMessages($langs->trans("Pas de date de naissance"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no adresse
            if (empty($adresse))
            {
                setEventMessages($langs->trans("Pas d'adresse"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no codepostal
            if (empty($codepostal))
            {
                setEventMessages($langs->trans("Pas de code postal"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no validator designated
            if ($valideur < 1)
            {
                setEventMessages($langs->transnoentitiesnoconv('InvalidValidatorCP'), null, 'errors');
                $error++;
            }

            $result = 0;

            if (! $error)
            {
            $object->nom = $nom;
            $object->prenom = $prenom;
            $object->datenaissance = $datenaissance;
            $object->adresse = $adresse;
            $object->codepostal = $codepostal;
            $result = $object->create($user);
                if ($result <= 0)
                {
                        setEventMessages($object->error, $object->errors, 'errors');
                        $error++;
                }
            }
// If no SQL error we redirect to the request card
            if (! $error)
            {
                        $db->commit();

                header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
                exit;
            }
            else
                {
                $db->rollback();
            }
    }
}


llxFooter();
$db->close();

?>

Dès que je clique sur mon left menu -> Formulaire Dolibarr, j’obtiens une page blanche. Serait-il possible d’avoir un petit peu d’aide sur la création des formulaires car je ne trouve quasiment rien sur le wiki, etc …’ to show if leftmenu system is selecte$
‹ enabled ›=> 1,
‹ perms ›=>‹ 1 ›, // Use ‹ perms ›=>’$user->rights->mymodule->level1->level2’ if you want your menu with a permission rules
‹ target ›=>’’,
‹ user ›=>2);
$r++;[/code]

De ce fait, dès que je clique sur Formulaire Dolibarr, je suis redirigé vers /moduletest/card.php

Par ailleurs j’ai crée spécialement une nouvelle table dans /moduletest/sql/llx_moduletest_myobject.sql :

CREATE TABLE llx_moduletest_myobject( -- BEGIN MODULEBUILDER FIELDS rowid INTEGER AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(255) NOT NULL, prenom VARCHAR(255) NOT NULL, datenaissance DATETIME NOT NULL, adresse VARCHAR(255) NOT NULL, codepostal INTEGER NOT NULL, fk_country integer DEFAULT 0, tms TIMESTAMP NOT NULL, import_key varchar(14) -- END MODULEBUILDER FIELDS ) ENGINE=innodb;

Enfin, j’ai mon fichier /moduletest/card.php :

// Load Dolibarr environment
$res=0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include($_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php");
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME
$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;
while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; }
if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include(substr($tmp, 0, ($i+1))."/main.inc.php");
if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php");
// Try main.inc.php using relative path
if (! $res && file_exists("../main.inc.php")) $res=@include("../main.inc.php");
if (! $res && file_exists("../../main.inc.php")) $res=@include("../../main.inc.php");
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res) die("Include of main fails");

require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';

$langs->load("mymodule@mymodule");

$id             = (GETPOST('id','int'):$user->id);
$action         = GETPOST('action','alpha');
$mode           = GETPOST('mode','alpha');
$confirm        = GETPOST('confirm','alpha');
$subaction      = GETPOST('subaction','alpha');
$group          = GETPOST("group","int",3);
$cancel         = GETPOST('cancel');

/*
 * Actions
 */

// If create a request
if ($action == 'create')
{
        $object = new Moduletest($db);
        $db->begin();
            $nom = GETPOST('nom');
            $prenom = GETPOST('prenom');
            $datenaissance = dol_mktime(0, 0, 0, GETPOST('datenaissance_month'), GETPOST('datenaissance_day'), GETPOST('datenaissance_year'));
            $adresse=GETPOST('adresse');
            $codepostal=GETPOST('codepostal');

            $valideur = GETPOST('valideur');


            // If no nom
            if (empty($nom))
            {
                setEventMessages($langs->trans("Pas de nom"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no prénom
            if (empty($prenom))
            {
                setEventMessages($langs->trans("Pas de prénom"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no date naissance
            if (empty($datenaissance))
            {
                setEventMessages($langs->trans("Pas de date de naissance"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no adresse
            if (empty($adresse))
            {
                setEventMessages($langs->trans("Pas d'adresse"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no codepostal
            if (empty($codepostal))
            {
                setEventMessages($langs->trans("Pas de code postal"), null, 'errors');
                $error++;
                $action='create';
            }

            // If no validator designated
            if ($valideur < 1)
            {
                setEventMessages($langs->transnoentitiesnoconv('InvalidValidatorCP'), null, 'errors');
                $error++;
            }

            $result = 0;

            if (! $error)
            {
            $object->nom = $nom;
            $object->prenom = $prenom;
            $object->datenaissance = $datenaissance;
            $object->adresse = $adresse;
            $object->codepostal = $codepostal;
            $result = $object->create($user);
                if ($result <= 0)
                {
                        setEventMessages($object->error, $object->errors, 'errors');
                        $error++;
                }
            }
// If no SQL error we redirect to the request card
            if (! $error)
            {
                        $db->commit();

                header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
                exit;
            }
            else
                {
                $db->rollback();
            }
    }
}


llxFooter();
$db->close();

?>

Dès que je clique sur mon left menu -> Formulaire Dolibarr, j’obtiens une page blanche. Serait-il possible d’avoir un petit peu d’aide sur la création des formulaires car je ne trouve quasiment rien sur le wiki, etc …

moduletest.zip (31.5 KB)
Je vous ajoute mon module de test avec l’impossibilité d’afficher la page contenant le formulaire :confused:
Malheureusement je ne trouve pas la solution à mon problème :s

Bon apparemment ce sont 2 champs de mon formulaire qui me posent problème : datenaissance et fk_country.
Malgré qu’ils soient remplis dans mon formulaire, il ne veut pas enregistrer celui ci dans la BDD car ces 2 champs semblent poser problème.

Je remets mon module en format .zip qui est à jour, si quelqu’un peut me donner un petit coup de main ?

Merci d’avance

moduletest_2017-11-02.zip (40 KB)

D’après les logs apache2, voici l’erreur :

[code]
[Thu Nov 02 16:10:58.901961 2017] [:error] [pid 23752] [client 172.30.10.67:56017] PHP Fatal error: Uncaught Error: Call to undefined method FormFile::create() in /var/www/html/dolibarr/htdocs/moduletest/card.php:116\nStack trace:\n#0 {main}\n thrown in /var/www/html/dolibarr/htdocs/moduletest/card.php on line 116, referer: http://172.30.10.180/moduletest/card.php?action=create&idmenu=392&mainmenu=moduletest&leftmenu=[/code

J’ai pu résoudre ce problème, mais j’en obtiens un autre. Dès que je valide mon formulaire il me dit :

Table 'dolibarr.llx_myobject' doesn't exist errors

Or dans ma fonction create, j’ai bien : [code]
$sql = "INSERT INTO ".MAIN_DB_PREFIX.« moduletest_myobject( »;[/code

Bonjour :happy:
dolibarr.llx_myobject est différent de llx_moduletest_myobject

Je sais bien et c’est pourquoi il y a un problème :confused: Sauf que nul part je fais la mention de llx_myobject.

Après 3-4 jours j’ai trouvé l’erreur !
Dans /moduletest/class/myobject.class.php j’ai la ligne suivante :

/** * @var string Name of table without prefix where object is stored */ public $table_element = 'moduletest_myobject';

Initialement c’était marqué :

/** * @var string Name of table without prefix where object is stored */ public $table_element = 'myobject';

Et cela semble maintenant fonctionner :happy:

:tongue:

ManuD
bonjour, j’ai la même prob
Pas de date de naissance
Pas de pays
vous pouvez m’aider svp
merci