Symfony & FOSUserBundle : « Integrity constraint violation: 1062 Duplicate entry »

Si vous utilisez le FOSUserBundle sous Symfony 2.5 et que vous avez modifé votre formulaire d’inscription en redéfinissant le « RegistrationFormType ». En essayant de vous inscrire 2 fois avec la même adresse email, à la place d’une jolie erreur vous allez avoir droit à un gros plantage avec l’erreur « … Integrity constraint violation: 1062 Duplicate entry … »

Arrêtez de vous arrachez les cheveux vous n’y êtes pour rien, cela vient d’un bug de la version 2.5 de Symfony. Pour le corriger il faut passer l’api validation du framework en version 2.4 comme ceci :

Dans le fichier /app/config/config.yml

1
2
framework:
    validation: { enabled: true, api: 2.4, enable_annotations: true }

Réponse trouvé dans cette discussion : https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1516

Symfony et « csrf token invalid », formulaire ok en local mais pas sur serveur

J’ai été confronté à un problème avec symfony (et le FOSUserBundle), les formulaires d’enregistrement et de connexion indiquaient « csrf token invalide » sur le serveur alors que tout fonctionnait en local sous wamp.

Après pas mal de recherche il s’avère que cela est le cas sous les serveurs OVH ayant à la racine un fichier .ovhconfig, je n’ai pas d’explications mais le fait de changer dans ce fichier la version de php (la passé de 5.4 à 5.5) résout le problème.

Mémo : Ligne de commande Symfony

Quelques ligne de commandes utile pour symfony. A compléter.

Générer un bundle:
php app/console generate:bundle --namespace=Acme/HelloBundle --format=yml

Générer les entités de l’application « Acme » :
php app/console doctrine:generate:entities Acme

Met à jour la structure de la base de données en fonction des entités :
php app/console doctrine:schema:update --force

Vider le cache :
php app/console cache:clear

Liste des routes :
php app/console router:debug

Générer un controlleur CRUD (listing, modification, suppression, ajout) d’une entité Doctrine :
php app/console generate:doctrine:crud --entity=AcmeBlogBundle:Post

Mettre à jour les dépendance avec composer :
\dans\ma\racine \chemin\vers\composer.phar update

FOSUserBundle : Redirection aprés inscription

Pour avoir recherché un moment la solution pour rediriger un utilisateur après la création de son compte sous symfony (version 2.4) avec le FOSUserBundle sans trouver le résultat convenable, voici la solution :

Création du fichier \Acme\MemberBundle\EventListener\RegistrationConfirmListener.php dans votre UserBundle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
namespace Casting\MemberBundle\EventListener;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\UserEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

/**
 * Redirection aprés enregistrement d'un utilisateur
 */

class RegistrationConfirmListener implements EventSubscriberInterface
{
    private $router;

    public function __construct(UrlGeneratorInterface $router)
    {
        $this->router = $router;
    }

    /**
     * {@inheritDoc}
     */

    public static function getSubscribedEvents()
    {
        return array(
                FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationConfirm'
        );
    }

    public function onRegistrationConfirm(\FOS\UserBundle\Event\FormEvent $event)
    {
        $url = $this->router->generate('nom_de_ma_route');

        $event->setResponse(new RedirectResponse($url));
    }
}

et dans Acme\MemberBundle\Resources\config\services.yml

1
2
3
4
5
6
services:
    redirect_register_user.registration.completed:
        class: Casting\MemberBundle\EventListener\RegistrationConfirmListener
        arguments: [@router]
        tags:
            - { name: kernel.event_subscriber }

via

Initialiser l’environnement wordpress dans un script externe

Il arrive de devoir utiliser les constantes, variables, fonctions et méthodes de l’environnement wordpress et de son thème sur un script à part. Pour valider un paiement par exemple via le fichier appelé par la banque, ou encore la création d’une vraie tache cron.

Voici les quelques lignes à placer en début de fichier. Pour charger le bon thème en mode multisite voir la dernière ligne.

1
2
3
4
5
6
7
//Indiquer le dommaine
$_SERVER['HTTP_HOST'] = 'www.monsite.fr';
//chargement de l'environnement, indiquer le chemin du fichier wp-load.php de la racine de wordpress
$wp_load_loc = "/chemin/du/fichier/wp-load.php";
require_once($wp_load_loc);
//en multisite, pour passer sur le bon environnement si besoin
switch_to_blog(3);// Indiquer l'identifiant du blog souhaité évidement.

via

Mémo : barre admin de WordPress

Afficher la barre admin seulement pour les utilisateurs administrateurs :

1
2
3
4
5
6
7
8
9
10
add_filter('show_admin_bar', 'bar_is_admin');

function bar_is_admin() {
    $user = wp_get_current_user();
    if ($user->roles[0] == 'administrator') {
        return true;
    } else {
        return false;
    }
}

La barre est appelé via la fonction « wp_footer(); » juste avant la fermeture de la balise « </body> »

Installer Symfony 2 sous windows (pour l’utiliser sous wamp)

INSTALLATION SYMFONY (wamp étant considéré comme installé.)

Ouvrir l’invite de commande, et taper php puis entrée
1) Si php n’est pas reconnu l’ajouter au PATH :
- Panneau de configuration > Système et sécurité > Système > Paramètres système avancés
- Variables d’environnement
- Variables système -> Path -> Modifier
- Ajouter le bon chemin [;C:\wamp\bin\php\php5.4.12;] (à adapter selon la version php de wamp)
Redémarrer invite de commande.

2) Installer composer
Invite de commande :
- se placer dans wampp\www (cd C:\wamp\www)
- C:\wamp\www> php -r « eval(‘?>’.file_get_contents(‘http://getcomposer.org/installer’)); »
- Vérifier version : C:\wamp\www>php composer.phar –version
- Mettre à jour : C:\wamp\www>php composer.phar self-update

3) Installer Git
- Télécharger et éxécuter msysgit

4) Installer symfony
Invite de commande
- se placer dans le dossier d’installation souhaité (exemple cd C:\wamp\www\symfony)
- php ..\composer.phar create-project symfony/framework-standard-edition dev-master

Si erreur : « you must enable the openssl extension to download files via https »
- Trouver la ligne ;extension=php_openssl.dll dans wamp/bin/php/php#.#.##/php.ini et supprimer ; en début de ligne.
- Recommencer étape 4

5) Paramétrer avec composer
Invite de commande
- se placer dans le dossier d’installation de symfony
- php ..\composer.phar install

6) Vérifier la configuration
- aller dans le dossier de l’instalation /web/config.php

Suivre les indications

PHP : Lister tous les liens d’une URL distante (curl, expressions régulières)

Voici un petit script PHP commenté permettant de récupérer le code source d’une url , ici en paramètre $_GET. De chercher dans ces sources tous les liens <a href= »… »> et de les lister.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Initialisation curl
$c = curl_init();
//url à telecharger en parametre, ici $_GET['url']
curl_setopt($c, CURLOPT_URL, $_GET['url']);
//Option curl : pour récupérer le contenus de la requete sous forme de chaine
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
//Option curl : on ne veux pas le contenu du header
curl_setopt($c, CURLOPT_HEADER, false);
//Option Curl : On suit les redirections
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
//on éxécute curl
$html = curl_exec($c);
//On ferme culr
curl_close($c);
//l'expression régulière permettant de trouver les liens
$output = preg_match_all('/<a.+href=[\'"]([^\'"]+)[\'"].*>/Ui', $html, $matches);
//pour chacuns des element trouvés
for ($i = 0; $i < $output; $i++) {
    //on affiche le contenue du lien href
    echo $matches[1][$i] . '<br>';
}