THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline

#1 Class AbstractCrudController

(17-09-2015 16:05:25)


Bonjour,

Encore moi smile
je dois gérer  la position et la visibilité de mon objet
je constate que les modules passent par la class AbstractCrudController
j'y comprends rien

vous avez un mode d’emploi ? une procédure pour générer le script ?.....

Merci

Offline


CRUD = https://fr.wikipedia.org/wiki/CRUD

Les contrôleurs du BO (et de certains modules qui manipulent des tables) héritent de cette classe abstraite qui prend en charge la majorité du code nécessaire aux opération CRUD. (Si "classe abstraite" ne te dit rien, il te faut creuser dans les concepts de la programmation orientée objet)

Pour gérer facilement la position, ton Model doit utiliser le trait Thelia\Model\Tools\PositionManagementTrait, il implémente quasiment tout ce qu'il faut.

Inspire toi de ce qui existe déjà, par exemple la gestion des marques (Brands).


OpenStudio Toulouse

Offline


Merci Roadster31

N’étant pas informaticien, j'apprends tout par moi même sur internet, la partie orientée objet m'est un peu difficile à comprendre.
As tu un lien qui explique tout cela, en français de préférence ?

je m'inspire beaucoup de ce que je trouve dans Thelia, j'arrive à comprendre certaines logiques mais dans cette class ça me dépasse je ne comprends pas le besoin de certaines fonctions...cela fait beaucoup d'un seul coup smile
mais je vais y arriver ... je vais y arriver .... c'est ce que je me dis ... à force.... smile

Edit: j'essaie en m'inspirant du module Keyword mais je me perds vite car il y a du code de partout pour gérer la position, en ligne, hors ligne...
avec des events....  je ne sais pas par ou commencer pour comprendre

Last edited by Debutant (18-09-2015 07:59:48)

Offline


Tu devrais trouver de très bons tutos et cours sur openclassrooms (anciennement site du zéro, où on reprend tout à zéro !) pour en apprendre un peu plus sur la programmation en PHP : https://openclassrooms.com/courses/prog … jet-en-php

Pour ce qui est de ton problème, une fois que ta classe hérite d'AbstractCrudController, tu as accès à ses méthodes, entre autres celles-ci devraient t'être utiles :
$this->setToggleVisibilityAction()
$this->updatePositionAction()

Bon courage pour la suite smile

Offline


Merci Etienne63
Je connais déjà ce site smile
mais ce n'est pas facile de trouver du temps et d'apprendre.......les nuits sont courtes

ETIENNE63 wrote:

Pour ce qui est de ton problème, une fois que ta classe hérite d'AbstractCrudController, tu as accès à ses méthodes, entre autres celles-ci devraient t'être utiles :
$this->setToggleVisibilityAction()
$this->updatePositionAction()

mais pour que ma classe hérite d'AbstractCrudController, il y a du code de partout, ne sachant pas si tout est utile pour mon problème...
je suis un peu dérouté
ça fait beaucoup....à en tomber les bras sad
mais bon je vais y arriver smile  je n'ai pas le choix si je veux bien faire

Offline


bonjour,

j'essaie bien que mal à mettre en place cette class
Dans TestControler, j'ai

namespace Test\Controller;

use Test\Event\TestToggleVisibilityEvent;
use Test\Event\TestEvents;
use Test\Form\TestCreationForm;

use Test\Model\TestQuery;

use Propel\Runtime\Exception\PropelException;
use Thelia\Controller\Admin\AbstractCrudController;
use Thelia\Controller\Admin\unknown;
use Thelia\Core\Event\UpdatePositionEvent;
use Thelia\Core\Security\AccessManager;
use Thelia\Model\Base\FolderQuery;
use Thelia\Form\Exception\FormValidationException;


class TestController extends AbstractCrudController
{
    public function __construct()
    {
        parent::__construct(
            'test',
            'manual',
            'order',

            'admin.test',

            null,
            null,
            null,
            TestEvents::TEST_TOGGLE_VISIBILITY,
            TestEvents::TEST_UPDATE_POSITION
        );
    }

lorsque je modifie la visibilité j'obtiens l'erreur suivante

ClassNotFoundException in TestController.php line 47: Attempted to load class "TestEvents" from namespace "Test\Event".
Did you forget a "use" statement for another namespace?

la ligne 47 = TestEvents::TEST_TOGGLE_VISIBILITY,
pourtant j'ai bien le use Test\Event\TestEvents;  phpstorm me propose bien les events lors de l’écriture
alors pourquoi ? elle est ou mon erreur ?

Last edited by Debutant (22-09-2015 14:27:41)

Offline


je ne comprends pas cette erreur
dans TestEvents.php

namespace Test\Event;

use Test\Model\Base\Test;
use Thelia\Core\Event\ActionEvent;

class TestEvents extends ActionEvent
{
    const TEST_TOGGLE_VISIBILITY = 'test.action.toggleVisibility';
    const TEST_UPDATE_POSITION   = 'test.action.updatePosition';
.....

j'ai bien le use Test\Event\TestEvents; dans TestController.php

une idée ? je ne sais plus ou chercher

Offline


Est-ce que la classe Test\Event\TestEvents se trouve bien dans le sous-dossier Event dans le dossier du module ?

Thelia charge les classes PHP contenues dans les modules en suivant les standard PSR-0/PSR-4, qui spécifient que a partir du dossier racine qui est chargé (le dossier du module dans ce cas), les classes doivent se trouver dans un arborescence de sous-dossiers correspondant à leur namespace.

Offline


Grand Merci BCBRR

J'avais mal écrit TesTEvents
en quittant l’écran pour m’aérer la tête
un regard neuf a vu smile

Offline


Bonjour,

pour comprendre la mise en place de cette class, je m'inspire du module Keyword (module très utile !)
mais j'ai constaté un problème lorsque l'on delete un keyword
on est redirigé vers la page localhost/admin/module/keyword
qui ne fonctionne pas, mon url_site étant : http://localhost/thelia215/web

je ne vois pas corriger cela
ou chercher ?

merci

Offline


Bonjour,

au départ à la déclaration de ma table, j'avais mis pour le champ 'position' la valeur par défaut '1'
Problème à chaque création, la nouvelle entrée prenait la position '1'
j'ai supprimé cette valeur par défaut
je constate maintenant qu'à chaque enregistrement position = null
comment faire en sorte qu'il prenne la valeur de la plus haute position +1
j'ai mal fait quelque chose ?

merci

edit:
j'ai mis dans Test\Model\Test.php

    public function create()
    {
        $con = Propel::getWriteConnection(DistributionnetworkTableMap::DATABASE_NAME);

        $con->beginTransaction();

        try {
            $this->save($con);
            $this->setPosition($this->getNextPosition())->save($con);
            $con->commit();

        } catch (\Exception $ex) {

            $con->rollback();
            throw $ex;
        }

        return $this;
    }

mais ça ne fait rien sad

Last edited by Debutant (30-09-2015 09:50:44)

Offline


C'est normal que ça ne fasse rien. Qui appelle cette methode create() ?

Ton model doit utiliser le trait  PositionManagementTrait. Regarde comment c'est fait dans Model\Brand.


OpenStudio Toulouse

Offline


Merci Roadster31

J'ai fait comme ça

    use ModelEventDispatcherTrait;
    use PositionManagementTrait;

    /**
     * {@inheritDoc}
     */
    public function preInsert(ConnectionInterface $con = null)
    {
        $this->dispatchEvent(TestEvents::BEFORE_CREATETEST, new TestEvents($this));
        // Set the current position for the new object
        $this->setPosition($this->getNextPosition());

        return true;
    }

j'obtiens cette erreur

ContextErrorException in Test.php line 14: Runtime Notice: Declaration of Test\Model\Test::preInsert() should be compatible with Test\Model\Base\Test::preInsert(Propel\Runtime\Connection\ConnectionInterface $con = NULL)

ajout de
use Propel\Runtime\Connection\ConnectionInterface;

c'est bon Grand Merci ROADSTER31

Last edited by Debutant (30-09-2015 11:20:59)