THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Je fais des tests pour apprendre à créer des modules.
Je suivi la doc pour créer en ligne de commande le modèle et le fichier sql. Aparement, tous les fichiers ont été créé. Par contre, lorsque j'active le module, la table n'est pas créé... Faut-il déclarer quelques chose dans config ? J'ai regardé dans d'autres modules pour voir, mais je n'ai rien trouvé. J'ai également demandé de l'aide à mon ami Google, mais il me parle beaucoup de Thelia 1...

Une piste ?

Merci d'avance !

Offline


Pour que les tables soient créées lors de l'activation du module, utilise la méthode BaseModule::postActivation() pour exécuter le SQL de création du schéma dans la classe principale de ton module :

    public function postActivation(ConnectionInterface $con = null)
    {
        $database = new Database($con);
        
        $database->insertSql(null, [ __DIR__ . '/Config/thelia.sql' ]);
    }

OpenStudio Toulouse

Offline


Merci de ta réponse.

J'ai essayé :

public function postActivation(ConnectionInterface $con = null)
    {
        $database = new Database($con);
        
        $database->insertSql(null, [ __DIR__ . '/Config/thelia.sql' ]);
    }

J'ai une erreur... J'ai rajouté :

use Propel\Runtime\Connection\ConnectionInterface;

Plus d'erreur, mais la table n'est toujours pas créée...

J'ai essayé :

    public function postActivation(ConnectionInterface $con = null)
    {
        $database = new Database($con->getWrappedConnection());

        $database->insertSql(null, array(__DIR__ . '/Config/thelia.sql'));
    }

Je l'ai vu dans un autre module, mais ça ne marche pas non plus...
Je me demande ou est déclaré __DIR__... Peut être est-il mal configuré...

Sinon, une autre piste ?

Offline


array(__DIR__ . '/Config/thelia.sql') = syntaxe PHP 5.3
[ __DIR__ . '/Config/thelia.sql' ] = syntaxe PHP 5.4 et plus (short array syntax)

__DIR__ est une constante magique PHP : http://php.net/manual/fr/language.const … efined.php

Il existe le fichier Config/thelia.sql ? Si oui, il y a quoi dedans ?

Tu l'as déclarée dans quel fichier la méthode postActivation() ?


OpenStudio Toulouse

Offline


thelia.sql :

# This is a fix for InnoDB in MySQL >= 4.1.x
# It "suspends judgement" for fkey relationships until are tables are set.
SET FOREIGN_KEY_CHECKS = 0;

-- ---------------------------------------------------------------------
-- product_rel
-- ---------------------------------------------------------------------

DROP TABLE IF EXISTS `product_rel`;

CREATE TABLE `product_rel`
(
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `visible` TINYINT DEFAULT 0 NOT NULL,
    `position` INTEGER DEFAULT 0 NOT NULL,
    `product_id` INTEGER(11),
    `created_at` DATETIME,
    `updated_at` DATETIME,
    `version` INTEGER DEFAULT 0,
    `version_created_at` DATETIME,
    `version_created_by` VARCHAR(100),
    PRIMARY KEY (`id`),
    INDEX `FI_product_id` (`product_id`),
    CONSTRAINT `fk_product_id`
        FOREIGN KEY (`product_id`)
        REFERENCES `product` (`id`)
        ON UPDATE RESTRICT
        ON DELETE CASCADE
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- product_rel_i18n
-- ---------------------------------------------------------------------

DROP TABLE IF EXISTS `product_rel_i18n`;

CREATE TABLE `product_rel_i18n`
(
    `id` INTEGER NOT NULL,
    `locale` VARCHAR(5) DEFAULT 'en_US' NOT NULL,
    `title` VARCHAR(255),
    `description` LONGTEXT,
    `chapo` TEXT,
    `postscriptum` TEXT,
    PRIMARY KEY (`id`,`locale`),
    CONSTRAINT `product_rel_i18n_FK_1`
        FOREIGN KEY (`id`)
        REFERENCES `product_rel` (`id`)
        ON DELETE CASCADE
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- product_rel_version
-- ---------------------------------------------------------------------

DROP TABLE IF EXISTS `product_rel_version`;

CREATE TABLE `product_rel_version`
(
    `id` INTEGER NOT NULL,
    `visible` TINYINT DEFAULT 0 NOT NULL,
    `position` INTEGER DEFAULT 0 NOT NULL,
    `product_id` INTEGER(11),
    `created_at` DATETIME,
    `updated_at` DATETIME,
    `version` INTEGER DEFAULT 0 NOT NULL,
    `version_created_at` DATETIME,
    `version_created_by` VARCHAR(100),
    `product_id_version` INTEGER DEFAULT 0,
    PRIMARY KEY (`id`,`version`),
    CONSTRAINT `product_rel_version_FK_1`
        FOREIGN KEY (`id`)
        REFERENCES `product_rel` (`id`)
        ON DELETE CASCADE
) ENGINE=InnoDB;

# This restores the fkey checks, after having unset them earlier
SET FOREIGN_KEY_CHECKS = 1;

C'est en gros l'exemple généré en ligne de commande...
Je viens de remarquer qu'il il avait un ligne vide au début... Est-ce un problème ?

J'ai délclaré le postaction dans :
C:\wamp64\www\thelia-test\thelia1\local\modules\ArtabanMPTTest1SellerShop\ArtabanMPTTest1SellerShop.php

Merci de ton aide ;-)

Offline


Tout à l'air OK, ça devrait fonctionner.

Met toi en mode développement, tu auras peut-être des indices supplémentaires.


OpenStudio Toulouse

Offline


Merci.
Je vais essayer avec ce mode un peu plus tard. Là, je vais voir pour créer un thème. J'aurais peut être des questions aussi. ;-)

Offline


En mode développement, le module ne s'active pas, mais je n'ai pas de message d'erreur...

Réglage mysql de départ :

sql_mode

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Vu dans log :

2: WARNING [Thelia.php:checkMySQLConfigurations()] {130} 2017-09-08 7:53:30: Remove sql_mode STRICT_TRANS_TABLES. Please configure your MySQL server.
3: WARNING [Thelia.php:checkMySQLConfigurations()] {137} 2017-09-08 7:53:30: Remove sql_mode ONLY_FULL_GROUP_BY. Please configure your MySQL server.

Commande sql exécutée :

set global sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Ne semble pas avoir résolu le problème...

Je continuerais à chercher plus tard.

Offline


La doc wrote:

If you’re using MySQL 5.6 or newer, change the sql_mode configuration parameter in the [mysqld] section of the my.ini configuration file to remove the STRICT_TRANS_TABLES part. You’ll get something like:

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION


OpenStudio Toulouse

Offline


Bon, ça marche toujours pas...

Je vais repartir de 0 et essayer avec une table plus simple. Genre juste un id et un nom.

Je vous tiens au courant.

Offline


Bon, je suis reparti de 0.

dans le my.ini de sql sur mon wamp j'ai mis :

[mysqld]
port = 3306
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

et dans mon thelia\local\modules\ArtabanMarketplace\ArtabanMarketplace.php ,j'ai

<?php

/* * ********************************************************************************** */
/*      This file is part of the Thelia package.                                     */
/*                                                                                   */
/*      Copyright (c) OpenStudio                                                     */
/*      email : dev@thelia.net                                                       */
/*      web : http://www.thelia.net                                                  */
/*                                                                                   */
/*      For the full copyright and license information, please view the LICENSE.txt  */
/*      file that was distributed with this source code.                             */
/* * ********************************************************************************** */

namespace ArtabanMarketplace;

use Thelia\Module\BaseModule;
use Propel\Runtime\Connection\ConnectionInterface;
use Thelia\Install\Database;

class ArtabanMarketplace extends BaseModule {

    /** @var string */
    const DOMAIN_NAME = 'artabanmarketplace';

    public function postActivation(ConnectionInterface $con = null) {
        $database = new Database($con);

        $database->insertSql(null, [__DIR__ . '/Config/thelia.sql']);
    }

}

En gros, je crois que mon server est bien réglé maintenant. et il devait manquer le

use Thelia\Install\Database;

dans mon code précédent...