Quantcast
Channel: Grafikart | Derniers Sujets du forum
Viewing all 1542 articles
Browse latest View live

Symfony, Message d'erreur - Unable to generate a url

$
0
0

Bonjour,

Je code avec symfony et twig depuis peu et malgrés mes nombreuses recherches je n'arrive pas à trouver mon problème..

Mon but est de créer un lien Developpeur web dans ma Navbar qui sera redirigé vers une nouvelle page.
(je tien a préciser que j'ai 2 autres liens qui fonctionnent parfaitement avec la manipulations ci dessous)..

Je met donc ma route en place

developpeur:
path: /developpeur
controller: App\Controller\HomeController::developpeur

Mon controller également

public function developpeur(){
return $this->render('page/developpeur.html.twig');
}

Et mes vues (twig)

<li class="nav-item active">
around <a class="nav-link lien" href="{{ path ('developpeur') }}">Developpeur web<span class="sr-only">(current)</span></a>around
</li>

Je me retrouve donc avec le message d'erreur suivant :

An exeption has been thrown during the rendering of a template ("Unable to generate a URL for the named route "developpeur" as such route does not exist.")

Je ne comprend pas pourtant les autres pages fonctionnent niquel avec cette manipulaion..
Si quelqu'un peu éclairer ma lanterne je suis tout ouïe

Bonne journée!


Soucis inclusion controller sur un template

$
0
0

Bonjour à tous ,

je m'explique, j'ai une map du monde cliquable par continents au format svg, quand je clique sur un continent j'aimerais que cela me renvoi sur la page de celui-ci que j'ai inclus dans ma base de donnée.
J'ai réussi a faire cette opération dans le menu de mon header en utilisant la methode "Render" de controller ou j'ai un menu déroulant qui m'affiche les continents que j'ai récupérer depuis ma bdd comme ceci :

fichier base.html.twig

<div class="map_list">
                                <ul>
                                    {{ render(controller('App\\Controller\\DestinationController::index')) }}
                                </ul>
                            </div>

fichier destination/index.html.twig

<ul>
    {% for continent in continents %}
    <li><a href="{{ path('destination', {'slug': continent.slug}) }}">{{ continent.continents }}</a></li>
    {% endfor %}
</ul>

Fichier DestinationController.php

    public function __construct(ContinentRepository $continent, DestinationRepository $country)
    {
        $this->continent = $continent;
        $this->country = $country;
    }

    /**
     * @Route("/destination", name="destinations")
     * @param ContinentRepository $continent
     * @param  DestinationRepository $country
     * @return Response
     */

    public function index(): Response
    {
        $continents = $this->continent->findAll(Continent::class);
        $country = $this->country->findAll(Destination::class);

        return $this->render('destination/index.html.twig', [
            'continents' => $continents,
            'destinations' => $country

        ]);


    }

    /**
     * @Route("/destination/{slug}", name="destination")
     * @param ContinentRepository $continent
     * @return Response
     */

    public function continent($slug): Response
    {
        $continent = $this->getDoctrine()->getRepository(Continent::class)->findOneBy([
            'slug' => $slug
        ]);


        return $this->render('destination/show.html.twig', compact('continent'));

    }

Et dans mon fichier "pages/home.html.twig" j'ai cette MAP ou j'aimerais inclure dans chaque balises "a" le lien vers le continent concerné de ma base de donnée. Si quelqu'un a une piste ce serais super !! :)

<div class="map">
                        <svg version="1.1"
                             id="svg2" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
                             xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 2000 1001">

                            <a id="continent-AS" xlink:title="Asie" xlink:href="#"><path  inkscape:connector-curvature="0" class="Asie" d="M1370.3,311.3h-4.6l-3.3-0.4l-2.1,2.3l-1.8,0.6l-1.3,1l-2.2-1.7
                        l-0.9-4.3l-1.4-0.2V307l-2.7-1.2l-1.5,1.8l0.2,2.1l-0.5,0.7l-2.7-0.1l-0.8,2.4l-1.8-1l-2.8,1.7l-1.5-0.6l-3.7-1.1h-2.5l-1.4-0.2
                        l-2.5-1.4l-0.3,1.8l-3.5,1l0.1,4.1l-2.1,1.6l-3.4,0.7l-0.3,2.4l-3.3,0.6l-5.1-1.9l-0.4,6.4l-0.4,3.7l2.1,0.7l-1.4,2.8l2.3,4.1
                        l0.9,3.2l3.7,0.9l0.9,3.2l-3.3,4.6l8.2,2.6l4.5-0.7l2.8,0.6l0.8-1.1l3.3,0.4l5.7-2.1l-0.7-4.3l2-2.9h3.4l0.2-1.4l3.4-0.7l1.8,0.5
                        l1.5-1.4l-0.9-3l1.3-3l2.6-1.3l-2.6-3.3l4.4,0.2l0.8-1.8l-0.7-2l1.7-2.2l-1.2-2.6l-1.6-2.2l2.1-2.2l4.5-1l5-0.6l2.1-1l2.4-0.6
                        L1370.3,311.3L1370.3,311.3z M1296.5,370.9l-1.1-1.8l-2.6,3.1l-3.2,3.3l-2.8,3.4l-2.8-0.2
                        l-3.9-0.2l-3.6,0.8l-0.3-1.4l-0.9,0.2l0.3,1.2l2.2,5.1l14.4,2.6l0.9-1l-0.1-2.1l1.2-2.1l-0.3-2.1l2.1-1l-0.9-0.6l0.1-3.3h2.4
                        L1296.5,370.9L1296.5,370.9z M1240.8,304.4l-0.8-3.5l-2.1-0.9l-2.1-1.4l0.9-1.6l-2.7-1.8l0.6-1.2
                        l-1.9-0.9l-1.2-1.4l-5.9,0.8l1.1,1.8v2.5l3.6,1.2l2.1,1.5l0.9-0.2l1.5,1.4h2l0.2,0.8l2.4,2.9L1240.8,304.4L1240.8,304.4z M1233.2,299.4l-0.9,0.2l1,1.9l2.7,2.3l3.2,0.7l-2.4-2.9l-0.2-0.8h-2
                        L1233.2,299.4L1233.2,299.4z M1242.1,292l-3.7-3l-1.3-0.2l-0.9,0.7l2.7,2.7l-0.5,0.6l-2.4-0.3l-3.6-1.4l-0.9,0.8l1.2,1.4l1.9,0.9
                        l-0.6,1.2l2.7,1.8l-0.9,1.6l2.1,1.4l2.1,0.9l0.8,3.5l4.5-3.7l1.6-0.4l1.6,1.5l-1,2.5l3.3,2.7l1.1-0.2l-0.7-2.6l1.5-1.2l0.3-1.8
                        l-0.1-4l3.6-0.4l-1.7-1.4l-2.1-0.2l-3-3.6l-2.9-2.6l0,0l-2.2,2l-0.4,1.2L1242.1,292L1242.1,292z M1470.3,389.5l-3.9-8.1l-1.3,0.1l-0.2,3.2l-3-2.6l0.9-2.9l2.1-0.3
                        l1.4-4.2l-2.9-0.9l-4.3,0.1l-4.6-0.7l-1-3.5l-2.3-0.3l-4.1-2.2l-1,3.4l3.9,2.7l-2.7,1.9l-0.7,1.8l3.2,1.4l-0.3,3l2.2,3.8l1.4,4.1
                        l1.9,0.5l1.5,0.6l0.5-1l2.1,1l1.1-2.8l-0.8-2.1l4.4,0.2l2.4,2.9l1.3,2.5l0.7,2.6l1.7,2.6l-0.9-4.1l1.8,0.8L1470.3,389.5
                        L1470.3,389.5z M1460.2,360.5l-2.3-1.4l-2.5-0.1l-3.6-1.2l-2.2,1.3l-2.2,3.8l0.3,1

Erreur 500, je ne comprend pas

SQLSTATE[42000]: Syntax error or access violation: 1064

$
0
0

Salut la grande famille des développeurs back :)

Voila, je rencontre un petit voir un sacré problème depuis plusieurs jours à vrai dire.
Le topo est que j'ai deux entités, Company et Group. ( L'entité maître est Company et donc esclave est Group )
J'aimerai ajouté un group à une company mais il m'est impossible d'y arriver....
Je tombe sur cette erreur lorsque je valide le formulaire d'ajout :

An exception occurred while executing 'INSERT INTO group (title, company_id) VALUES (?, ?)' with params ["test", 5]:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group (title, company_id) VALUES ('test', 5)' at line 1

Voici l'entité Company :

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CompanyRepository")
 * @UniqueEntity(fields="title", message="Cette entreprise existe déjà !!!")
 */
class Company
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $contactCompany;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $contactName;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $contactEmail;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $contactPhone;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $address;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $address2;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $zip;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $city;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $country;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $website;

    /**
     * @ORM\Column(type="text")
     */
    private $permissionReminder;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Group", mappedBy="company", cascade={"remove"})
     */
    private $groups;

    public function __construct()
    {
        $this->groups = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getContactCompany(): ?string
    {
        return $this->contactCompany;
    }

    public function setContactCompany(string $contactCompany): self
    {
        $this->contactCompany = $contactCompany;

        return $this;
    }

    public function getContactName(): ?string
    {
        return $this->contactName;
    }

    public function setContactName(string $contactName): self
    {
        $this->contactName = $contactName;

        return $this;
    }

    public function getContactEmail(): ?string
    {
        return $this->contactEmail;
    }

    public function setContactEmail(string $contactEmail): self
    {
        $this->contactEmail = $contactEmail;

        return $this;
    }

    public function getContactPhone(): ?string
    {
        return $this->contactPhone;
    }

    public function setContactPhone(string $contactPhone): self
    {
        $this->contactPhone = $contactPhone;

        return $this;
    }

    public function getAddress(): ?string
    {
        return $this->address;
    }

    public function setAddress(string $address): self
    {
        $this->address = $address;

        return $this;
    }

    public function getAddress2(): ?string
    {
        return $this->address2;
    }

    public function setAddress2(?string $address2): self
    {
        $this->address2 = $address2;

        return $this;
    }

    public function getZip(): ?string
    {
        return $this->zip;
    }

    public function setZip(string $zip): self
    {
        $this->zip = $zip;

        return $this;
    }

    public function getCity(): ?string
    {
        return $this->city;
    }

    public function setCity(string $city): self
    {
        $this->city = $city;

        return $this;
    }

    public function getCountry(): ?string
    {
        return $this->country;
    }

    public function setCountry(string $country): self
    {
        $this->country = $country;

        return $this;
    }

    public function getWebsite(): ?string
    {
        return $this->website;
    }

    public function setWebsite(?string $website): self
    {
        $this->website = $website;

        return $this;
    }

    public function getPermissionReminder(): ?string
    {
        return $this->permissionReminder;
    }

    public function setPermissionReminder(string $permissionReminder): self
    {
        $this->permissionReminder = $permissionReminder;

        return $this;
    }

    /**
     * @return Collection|Group[]
     */
    public function getGroups(): Collection
    {
        return $this->groups;
    }

    public function addGroup(Group $group): self
    {
        if (!$this->groups->contains($group)) {
            $this->groups[] = $group;
            $group->setCompany($this);
        }

        return $this;
    }

    public function removeGroup(Group $group): self
    {
        if ($this->groups->contains($group)) {
            $this->groups->removeElement($group);
            // set the owning side to null (unless already changed)
            if ($group->getCompany() === $this) {
                $group->setCompany(null);
            }
        }

        return $this;
    }
}

Voici l'entité Group :

<?php

namespace App\Entity;

use App\Entity\User;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="App\Repository\GroupRepository")
 */
class Group
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="groups")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="groups", cascade={"remove"})
     */
    private $user;

    public function __construct()
    {
        $this->user = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getCompany(): ?company
    {
        return $this->company;
    }

    public function setCompany(?company $company): self
    {
        $this->company = $company;

        return $this;
    }

    /**
     * @return Collection|User[]
     */
    public function getUser(): Collection
    {
        return $this->user;
    }

    public function addUser(User $user): self
    {
        if (!$this->user->contains($user)) {
            $this->user[] = $user;
        }

        return $this;
    }

    public function removeUser(User $user): self
    {
        if ($this->user->contains($user)) {
            $this->user->removeElement($user);
        }

        return $this;
    }
}

Et voici le formulaire d'ajout d'un group à une company :

<?php

namespace App\Form;

use App\Entity\User;
use App\Entity\Group;
use App\Repository\UserRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class FormAddGroupType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, [
                'label' => 'Nom du groupe'
            ])
            ->add('user', EntityType::class, [
                'class' => User::class,
                'label' => 'Liste des utlisateurs',
                'query_builder' => function (UserRepository $ur)
                {
                    return $ur->createQueryBuilder('u')
                            ->orderBy('u.firstname', 'ASC');
                },
                'choice_label' => 'firstname',
                'expanded' => true,
                'multiple' => true
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Group::class,
        ]);
    }
}

Je ne l'ai peut être pas précisé, mais quand j'ajoute un group à une company, j'envoie l'id de la company dans l'url histoire de l'injecter directement dans le formulaire enfin dans l'entité.

Merci de votre précieuse aide :D

Symfony Questions Formulaires

$
0
0

Bonjour,

Je développe depuis peu et je me pose une question sur les formulaires.

Mon outil a pour but de faire de l'encodage rapide.
L'utilisateur lambda se connecte, et remplit un formulaire avec des infos de base (intitulé , année de prod, état du produit, ...).
L'utilisateur, avec droit, se connecte et peut également remplir le formulaire, mais il peut aussi changer le formulaire.
Il peut définir des valeurs par défaut pour certain champs.
Il peut ajouter/supprimer des champs.
.....

Genre comme dans un CMS mais pas aussi complexe.

Où pourrais-je trouver des pistes d'idée/solution.

D'avance merci.

Mettre des contraintes sur un attribut

$
0
0

Bonjour,

Dans mon entity j'aimerais créer un attribut avec des contraintes suite:

  • Auto-généré (automatique)
  • Contient 6 chiffres obligatoirement
  • Unique

J'ai par exemple commencer comme ceci après j'arrive pas à terminer:

 @ORM\Reference()
     * @ORM\GeneratedValue()
     * @Assert\Unique
     * @ORM\Column(type="string", length=6)
     */
    private $reference;

Afficher le choix de catégorie et sous-catégorie dans buildForm

$
0
0

Bonjour à tous et à toutes, j'héspere que vous allez bien!

Ce que je fais

J'ai rencontre un petit problème, je suis entrain de creer un site web de type vitrine avec le systeme CRUD des categories, sous-catégories et les produits.
Actuellement le projet on peut le visualiser sous ce format:

|       **FENÊTRES**      --|         **VOLETS**           -|      **PORTES**    -| -> MainCategory (Entité)
|:------------------------- |:--------------------------:|  -------------------:|
|     Fenetrês PVC  ------ |           Roulants         ----| Porte d'éntrée ----| -> SubCategory (Entité)
|:------------------------- |:--------------------------:|  -------------------:|
| *Fenêtre model 1*  ----|   *Volets model PVC*  -|  *Porte en bois* ---| -> Product (Entité)
| *Fenêtre model 2* ---- |   *Volets model ALU*  -| *Porte en acier* ---| -> Suite des produits

Les entités sont composé par la relation OneToMany:
"MainCategory<-SubCategory<-Product"

ps: "--" j'ai utilsé les traits pour remplacer les espaces

Ce que je veux

Au moment de la création d'un produit, je vois que les SubCategory c'est qui est normal. Mais je souhaite afficher les 2 choix possible, le premier doit être pre rempli par des MainCategory et le deuxième doit être vide, au moment quand on sélectionne le premier l'une dès ses "MainCategory" par la suite faire apparaitre dans le 2e choix de ces sous-catégories "SubCategory".

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('model')
            ->add('color')
            ->add('descOne')
            ->add('descTwo')
            ->add('createdAt')
            ->add('subCategory')
        ;
    }

Ce que j'obtiens

Actuellement j'ai dans mon formulaire j'ai que les SubCategory.

App\Entity\Groupe object not found by the @ParamConverter annotation.

$
0
0

Bonjour la communauté des devs,
Je reviens vers vous en ce beau lundi car j'ai un nouveau problème :D

Voici le topo, on se trouve sur une page qui détaille les données d'une entreprise ( Company )et on peut également, via cette page, y ajouter un groupe, le podifier ou le supprimer.
L'ajout du groupe se passe très. Par contre quand je veux modifier ce groupe, Symfony m'affiche cette erreur :

App\Entity\Groupe object not found by the @ParamConverter annotation.

Le lien du template qui permet d'ajouter un groupe et de supprimer et de modifier :

<td class="d-flex justify-content-around align-items-center">
                            <a href="{{ path('groupe.edit', {'id':company.id, 'group_id':group.id}) }}" class="m-2"><i class="gg-pen"></i></a>
                            {% if is_granted('ROLE_ADMIN') %}
                            <a href="{{ path('groupe.delete', {'id':company.id, 'group_id':group.id}) }}" class="m-2"><i class="gg-trash text-danger"></i></a>
                            {% endif %}
                        </td>

Maintenant le cotroller poiur faire un edit de ce groupe :

/**
     * @Route("/company/{id}/editGroupe/{group_id}", name="groupe.edit")
     * @IsGranted("ROLE_ADMIN")
     */
    public function editGroup(Company $compagny, Groupe $group, Request $request, EntityManagerInterface $emi)
    {

        $form = $this->createForm(FormAddGroupType::class, $group);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
            $emi->flush();
            $this->addFlash('success', 'Le groupe a bien été modifié');

            return $this->redirectToRoute('company.show', ['id' => $company->getId()]);
        }

        return $this->render('company/editGroup.html.twig', [
            'form' => $form->createView()
        ]);
    }

Pour infos, dans le lien qui renvoit vers la méthode editGroup(), j'envoie l'id de la company ainsi que l'id du groupe.

Merci pour votre aide et au plaisir de vous aider également


An exception occurred while executing 'UPDATE groupe SET company_id

$
0
0

Salut tout le monde,
Je reviens en cette même journée avec un problème de suppression d'un groupe appartenant à une company.
Relation entre Groupe et Company : ManyToOne :

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="groups")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

Voici le topo, nous sommes sur la page d'une Company. Celle ci contient des groupes qui lui sot associés.
Je peux créer des groupes et les modifier masi je ne peux pas les supprimer...c'est fort dommage :'(

Le message d'erreur qui s'affiche est le suivant :

An exception occurred while executing 'UPDATE groupe SET company_id = ? WHERE id = ?' with params [null, 10]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'company_id' cannot be null

Entité Company en lien avec groups (qui fait référence à l'entité Groupe) :

/**
     * @ORM\OneToMany(targetEntity="App\Entity\Groupe", mappedBy="company", cascade={"remove"})
     */
    private $groups;

Entité Groupe en lien avec company (qui fait référence à l'entité Company) :

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="groups")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

Le template qui envoie, via l'hyperlien, l'id de la company en question et du groupe en question :

<a href="{{ path('groupe.delete', {'id':company.id, 'group_id':group.id}) }}" class="m-2"><i class="gg-trash text-danger"></i></a>

Et la méthode deleteGroupe du controller :

/**
     * @Route("/company/{id}/deleteGroup/{group_id}", name="groupe.delete")
     * @ParamConverter("group", options={"id" = "group_id"})
     * @IsGranted("ROLE_ADMIN")
     */
    public function deleteGroup(Company $company, Request $request)
    {   
        $idg = $request->attributes->get('group_id'); // On récupère l'id du groupe
        $emi = $this->getDoctrine()->getManager();
        $group = $this->getDoctrine()->getRepository(Groupe::class)->findOneBY([
            'company' => $company->getId(),
            'id' => $idg
        ]);
        $company->removeGroup($group);
        $emi->flush();
        $this->addFlash('success', 'Le groupe a bien été supprimé avec succès');

        return $this->redirectToRoute('company.show', ['id' => $company->getId()]);
    }

Merci pour votre précieuse aide

Liip fonctionne en local pas sur server :(

$
0
0

Bonjour,

J'ai suivi le tutoriel "symfony 4 par l'exemple", tout fonctionne bien en local autant en dev qu'en prod.
Mais une fois mis en place sur mon server, les images ne s'affichent plus.

Voila mon fichier liip_imagine.yaml:

liip_imagine:
    # valid drivers options include "gd" or "gmagick" or "imagick"
    driver: "gd"
    filter_sets:
        thumb:
            quality: 75
            filters:
                thumbnail: { size: [360, 230], mode: inset, allow_upscale: true  }
        medium:
            quality: 75
            filters:
                thumbnail: { size: [800, 530], mode: inset, allow_upscale: true  }

J'ai beau chercher sur la doc, à part utiliser la commande:

php bin/console liip:imagine:cache:resolve /images/films/5e78a5ebb3148728089886.jpg

Mais ils faudrait le faire pour chaque images et le but est de generer automatiquement.

Voila ce que le server me renvoie:

[Mon Mar 23 12:04:12 2020] 2.14.59.82:56817[404]:/media/cache/resolve/thumb/images/films/5e763edede65a713019776.jpg - No such file or directory

Au secours (inserez votre pseudo ici), vous etes mon seul espoir ! ;)

Comment faire la gestion des événements dans Symfony

$
0
0

Bonjour les amis,

Je suis actuellement en train de me former sur la gestion des événements dans symfony.
Et dans la doc il est écrit ceci :

"That's it! Your services.yaml file should already be setup to load services from the EventSubscriber directory. Symfony takes care of the rest."

Ma question est : Comment je fais pour savoir que mon fichier servives.yaml charge bien les services du dossier EventSubscriber ?

Je travaille actuellement sur symfony 4.4

Voici le lien de la doc en question
https://symfony.com/doc/current/event_dispatcher.html

Comment faire un eventListener ?

$
0
0

Salut les amis,

Voilà je suis en train de me former sur la gestion des événements sur Symfony.

Jusqu'à maintenant tous se passe bien !

J'ai le code suivant :

Lorsqu'un utilisateur se connecte à l'application, un listerner détecte l’événement de connexion et met à jour le champs last_login_at dans la bdd

Jusqu’à maintenant tous se passe bien.

Le problème apparaît lorsque l'utilisateur souhaite se déconnecter.

En effet à la déconnexion, la méthode onSecurityAuthenticationSuccess du listener est toujours appelé.

Problème une fois déconnecté on ne peut plus récupérer un user (dans la session)

Conséquence : ça bug !

### Ce que je voudrait :

C'est pouvoir
- Enregistrer la date de la dernière connexion dans la bdd
- N'appelé la méthode onSecurityAuthenticationSuccess seulement à la connexion et non pas à la connexion et à la déconnexion
- De plus j'ai un champs is_in_line dans la bdd et je voudrais qu'à la déconnexion, je puis détecter l'évenement "deconnexion" et mettre à jour ce champs

Comment puis-je faire ça ?

Voici mon code pour le listerner

    public function onSecurityAuthenticationSuccess(AuthenticationEvent $event){

        $user = $event->getAuthenticationToken()->getUser();

        if ($user) {

            //dd($user);
            $user->setLastLoginAt(new \Datetime('now'));

            $this->em->persist($user);
            $this->em->flush();
        }
    }

infinite scroll ajax avec knpPaginator

$
0
0

Bonjour,

J'aimerais savoir si c'est possible avec le bundle KnpPaginator d'insérer le pluggin infinite scroll ajax
j'ai essayé en vain toute la journée, j'ai cherché de la doc mais je n'ai rien trouvé donc je me permets de venir sur ce forum poser la question
merci

Le js ne charge pas une fois en prod

$
0
0

Bonjour les amis

Je rencontre un soucis en ce moment.

J'ai fait mon site, tous fonctionne à merveille.

Mais quand je mets mon site en ligne et en prod et que je veux charger un fichier js dans mon fichier twig.

ça ne fonctionne pas.

Pourtant quand je met le code js directement dans le fichier twig, le code js avec JQUERY fonctionne très bien.

Mais le même code dans fichier séparé selon que je sois en environnement de production ou en environnement de développement

Fonctionne dans un cas et ne fonctionne pas dans un autre.

Pourtant le css et le reste charge correctement !

D'où peut venir ce problème ?

Deployer site Symonfy 4 sur OVH

$
0
0

Bonjour,

J'ai voulu déployer mon site fait en Symfony 4 et ai uploadé via FTP mes fichiers (sauf le vendor) fait un composer install en ssh mais j'ai une page blanche "Site en construction" (page de site en construction serait plus appropriée) et ne voit pas mon erreur.
J'ai suivi la méthode de : https://openclassrooms.com/fr/courses/3619856-developpez-votre-site-web-avec-le-framework-symfony/3626249-deployer-son-site-symfony-en-production

J'ai vidé mes caches avant l'upload via FTP car l'autre logiciel recommandé "Capifony " est introuvable sur leur site.

Avez vous un tuto plus explicite et plus actualisé que celui d'OC ou une méthode qui fonctionne?
PS: j'ai modifié mon .env pour commenter ma BDD pour l'heure (pas grave si le site reste statique pour l'heure)

D'avance merci.
Olivier


impossible de persister un formulaire

$
0
0

Bonjour,
Je débute sur Symfony et je rencontre depuis quelques jours un problèmes.
Mon projet est le suivant: créer un utilitaire pour administrer des sondages.
Voci mes règles de gestion:

  • Chaque sondage a plusieurs propositions de réponse.
  • Chaque utilisateur répondre à un seul sondage.
  • Chaque utilisateur peut choisir une ou plusieurs propositions de réponse (attention: il est possible que le sondage ait plusieurs réponses possibles). Voici mes trois entités:
  • survey.php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**

  • @ORM\Entity(repositoryClass="App\Repository\SurveyRepository")
    /
    class Survey
    {
    /
    *

    • @ORM\Id()
    • @ORM\GeneratedValue()
    • @ORM\Column(type="integer") */ protected $id;

    /**

    • @ORM\Column(type="string", length=500) */ protected $question;

    /**

    • @ORM\Column(type="boolean") */ protected $multiple;

    /**

    • @ORM\OneToMany(targetEntity="App\Entity\Proposition", mappedBy="survey", cascade={"persist"}, orphanRemoval=true) */ protected $propositions;

    /**

    • @ORM\OneToMany(targetEntity="App\Entity\User", mappedBy="survey", cascade={"persist"}, orphanRemoval=true) */ protected $users;

    public function __construct()
    {
    $this->propositions = new ArrayCollection();
    $this->users = new ArrayCollection();
    }

    public function getId(): ?int
    {
    return $this->id;
    }

    public function getQuestion(): ?string
    {
    return $this->question;
    }

    public function setQuestion(string $question): self
    {
    $this->question = $question;

    return $this;
    

    }

    public function getMultiple(): ?bool
    {
    return $this->multiple;
    }

    public function setMultiple(bool $multiple): self
    {
    $this->multiple = $multiple;

    return $this;
    

    }

    /**

    • @return Collection|Proposition[] */ public function getPropositions(): Collection { return $this->propositions; }

    public function addProposition(Proposition $proposition): self
    {
    if (!$this->propositions->contains($proposition)) {
    $this->propositions[] = $proposition;
    $proposition->setSurvey($this);
    $this->propositions->add($proposition);
    }
    }

    /**

    • @return Collection|User[] */ public function getUsers(): Collection { return $this->users; }

    public function addUser(User $user): self
    {
    if (!$this->users->contains($user)) {
    $this->users[] = $user;
    $user->setSurvey($this);
    }

    return $this;
    

    }
    }

  1. proposition.php <?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**

  • @ORM\Entity(repositoryClass="App\Repository\PropositionRepository")
    /
    class Proposition
    {
    /
    *

    • @ORM\Id()
    • @ORM\GeneratedValue()
    • @ORM\Column(type="integer") */ private $id;

    /**

    • @ORM\ManyToOne(targetEntity="App\Entity\Survey", inversedBy="propositions")
    • @ORM\JoinColumn(nullable=false) */ private $survey;

    /**

    • @ORM\Column(type="string", length=255) */ private $wording;

    /**

    • @ORM\ManyToMany(targetEntity="App\Entity\User", mappedBy="propositions") */ private $users;

    public function __construct()
    {
    $this->users = new ArrayCollection();
    }

    public function getId(): ?int
    {
    return $this->id;
    }

    public function getSurvey(): ?survey
    {
    return $this->survey;
    }

    public function setSurvey(?survey $survey): self
    {
    $this->survey = $survey;

    return $this;
    

    }

    public function getWording(): ?string
    {
    return $this->wording;
    }

    public function setWording(string $wording): self
    {
    $this->wording = $wording;

    return $this;
    

    }

    /**

    • @return Collection|User[] */ public function getUsers(): Collection { return $this->users; }

    public function addUser(User $user): self
    {
    if (!$this->users->contains($user)) {
    $this->users[] = $user;
    $user->addProposition($this);
    }

    return $this;
    

    }
    }

  1. user.php namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**

  • @ORM\Entity(repositoryClass="App\Repository\UserRepository")
    /
    class User
    {
    /
    *

    • @ORM\Id()
    • @ORM\GeneratedValue()
    • @ORM\Column(type="integer") */ private $id;

    /**

    • @ORM\ManyToOne(targetEntity="App\Entity\Survey", inversedBy="users")
    • @ORM\JoinColumn(nullable=false) */ private $survey;

    /**

    • @ORM\ManyToMany(targetEntity="App\Entity\Proposition", inversedBy="users") */ protected $propositions;

    public function __construct()
    {
    $this->propositions = new ArrayCollection();
    }

    public function getId(): ?int
    {
    return $this->id;
    }

    public function getSurvey(): ?survey
    {
    return $this->survey;
    }

    public function setSurvey(?survey $survey): self
    {
    $this->survey = $survey;

    return $this;
    

    }

    /**

    • @return Collection|proposition[] */ public function getPropositions(): Collection { return $this->propositions; }

    public function addProposition(proposition $proposition): self
    {
    if (!$this->propositions->contains($proposition)) {
    $this->propositions[] = $proposition;
    }

    return $this;
    

    }
    }

    Ma relation ManyToMany a créé une table user_proposition dans ma BDD.
    Quand je crée un sondage:
    1. S'il y a plusieurs réponses possibles: des checkbox sont présentées à l'utilisateur.
    2. S'il y a une seule réponse possible: des boutons radios sont présentés à l'utilisateur.

    Voci le formulaire UserType:

namespace App\Form;

use App\Entity\User;
use App\Entity\Proposition;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use App\Repository\PropositionRepository;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormInterface;

class UserType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $survey = $options['survey'];
    $multiple = $options['multiple'];

    if ($multiple == 1)
        $param = "true";
    else
        $param = "false";

    $choices = array();
    foreach ($options['propositions'] as $proposition) {
        $wording = $proposition->getWording();
        $choices[$wording] = $wording;
    }

        //...

    if ($param == "false") {
        $builder->add('propositions', ChoiceType::class, array(
            'choices' => $choices,
            'expanded' => true,
            'multiple' => false,
        ));
    } else {
        $builder->add('propositions', EntityType::class, [
            'class' => Proposition::class,
            'expanded' => true,
            'multiple' => true,
            'query_builder' => function (EntityRepository $proposition) use ($survey) {
                return $proposition->createQueryBuilder('u')
                    ->where('u.survey = :survey')
                    ->setParameter('survey', $survey);
            },
            'choice_label' => 'wording',
        ]);
    }    

}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => User::class,
        'survey' => null,
        'multiple' => null,
        'propositions' => null,
    ]);
}

}

Voici le SurveyController:

namespace App\Controller;

use App\Entity\User;
use App\Entity\Survey;
use App\Form\UserType;
use App\Form\SurveyType;
use App\Entity\Proposition;
use App\Repository\PropositionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SurveyController extends AbstractController
{

/**
* @Route("/answer/{id}", name="survey_answer")
*/
public function survey_answer($id, Request $request, EntityManagerInterface $manager)
{
$survey = $this->getDoctrine()->getRepository(Survey::class)->find($id);
$user = new User();
$form = $this->createForm(UserType::class, $user, array(
'survey' => $survey->getId(),
'multiple' => $survey->getMultiple(),
'propositions' => $survey->getPropositions(),
));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setSurvey($survey);
foreach($form["propositions"]->getData() as $proposition) {
$user->addProposition($proposition);
}
$manager->persist($user);
$manager->flush();
return $this->redirectToRoute('survey_list');
}
return $this->render('survey/answer.html.twig', [
'controller_name' => 'SurveyController',
'form' => $form->createView(),
'survey' => $survey,
]);
}
}

Mon problème :
Quand j'ai plusieurs réponses possibles et que je valide mon formulaire, je n'ai aucun problème.
en revanche, quand j'ai qu'une seule réponse possible, j'ai une erreur : Could not determine access type for property "propositions" in class "App\Entity\User": The property "propositions" in class "App\Entity\User" can be defined with the methods "addProposition()"" but the new value must be an array or an instance of \Traversable, "string"

J'ai cherché sur internet. Malheureusement, ne n'ai rien trouvé de probant.
Auriez-vous une idée s'il-vous-plaît?
Espérant avoir été assez clair,
Vous en remerciant par avance,

Problème création database Symfony 5

$
0
0

Bonjour à tous,

Je suis la formation Symfony avec la version 5.0.5.

Ce que je fais

Je suis actuellement à créer la base de donnée avec la commande :

php bin/console doctrine:database:create

J'ai configuré mon fichier .env comme décrit dans le tutoriel.

DATABASE_URL=mysql://root:root@127.0.0.1:3306/MaSuperAgence 

Ce que j'obtiens

Malheureusement j'obtiens une erreur récurrente provenant vraisemblablement des fichiers contenus dans le dossier Driver de Vendor
(aucune modification apportée dans ce dossier)

In AbstractMySQLDriver.php line 106:

  An exception occurred in driver: could not find driver


In PDOConnection.php line 31:

  could not find driver


In PDOConnection.php line 27:

  could not find driver

Quelqu'un aurait-il une idée? Merci d'avance.

Générer des données précises en base

$
0
0

Salut les amis!

J'essaie de me mettre à Symfony (je suis plutôt Laravel) pour étoffer mes connaissances...
Je fais des tests et je cherche à faire quelque chose de très simple: je veux ajouter des données dans la base en ligne de commande.
"Fait une fixture, bon sang !" me direz-vous... Mais voilà, comme un seed dans Laravel (pour ceux qui connaissent), je veux simplement ajouter des données préétablies (par exemple une liste de 10 catégories, qui, théoriquement, ne vont jamais bouger) et ne pas flusher toute ma base pour ça...

Je veux simpement pouvoir ajouter des données au fil de mes avancées sur un projet, exactement comme je le ferait pour une migration, pour que quiconque travaille également sur le projet puisse installer les données aditionnelles en une ligne de dommande.

portail web multi applicatif

$
0
0

Bonjour,

Je suis un junior dev qui a intégré une équipe de développement PHP qui gère deux portail web constitués de multiples applications répondant à des besoins très variés de nos utilisateurs ...

Le tout est écrit en PHP objet + MVC. Le portail apporte un cadre ainsi que différents utilitaires aux applications ( PDO, css, gestion des authentifications , des sessions, des outils pour les dates ... etc ... )
Le tout marche plutôt bien et répond aux besoins. Néanmoins certains choix d'architecture répondaient aux connaissances de l'époque des SENIOR DEV de l'équipe et ne sont plus à leur goût ...

Nous avons parmi nous un étudiant en apprentissage. D'où l'idée d'enclencher la réécriture d'un des deux portails.

Historiquement, tout était fait à la main, "artisanalement" sans Framework, avec l'adjonction de qques librairies ( genre Jquery ...). Notre étudiant apprend Symfony. Donc histoire de ne pas réinventer la roue et de partir sur une structure solide sur laquelle de nouveaux DEV pourront se greffer plus facilement, nous testons la possibilité de migrer le tout sous Symfony. Il y a de quoi apprendre avec divers tutos, la doc conséquente et les TPs de notre étudiant ... Nous profitons du confinement pour tester le framework et monter en compétences sur le sujet :)

Notre problème principal est: Gérer une appli web avec Symphony OK, mais gérer un site multi applicatif ??? On se voit mal utiliser une instance de Symfony par application ?! Qui plus est, comment gérer des base de données isolée par application. En fait nous apprécions l'idée d'un portail surplombant les applications en leur apportant un cadre et des outils et permettant une cohérence dans la présentation des applications ainsi que dans leur architecture et leur ergonomie général. Ainsi, nous ne savons pas quelle architecture de base utilisée !

*On est donc preneur de toute idées, indications, articles, liens, critiques qui nous permettraient de faire un choix d'architecture raisonnable ! *
Merci déjà à ceux qui auront pris le temps de lire ce post !
Dispo pour apporter toute précisions utile !

Take care ( Comme ils disent ...)

JL

Clé étrangère polymorphe sur Symfony

$
0
0

Salut à tous!

Me voila avec un problème théorique:
J'ai des tables de contenu article, diaporama et groupement et j'aimerai créer un table global_content qui regroupe tout. (Les tables de contenu ont chacune des champs différents mais j'ai plusieurs tables à y associer quel que soir le type de contenu.)

J'ai pensé à faire ça de 3 façons differentes:

  • dans global_content, je fais une ligne type_content (donc article, diaporama ou groupement) et une ligne content_id polymorphique qui peut contenir l'id d'une des autres tables) --> le mieux, je pense
  • je peux faire en sorte de mettre la clé étragère non pas du côté global_content mais plutôt du côté des tables de contenu avec un global_content_id dans chacune
  • je peux faire des clé étrangères nullable article_id, diaporama_id et groupement_id --> je ne suis déjà pas certain que ce soit possible de créer des clé étrangères nullable et en terme de bonnes pratiques, je pense que c'est du caca

Qu'en pensez-vous ? Si vous me conseillez la première solution, quelqu'un sait-il comment faire ?

Merci les potes!

Viewing all 1542 articles
Browse latest View live