Symfony 2 Embedded Forms: Catchable Fatal Error: Argument 1 passed to Entity::addProperty must be an instance of XX\MyClass, array given

Encore une abstraction qui fuit.

Si jamais vous avec un problème avec un ManyToMany et que vous rencontrez une erreur du type : Symfony 2 Embedded Forms: Catchable Fatal Error: Argument 1 passed to Entity::addProperty must be an instance of XX\MyClass, array given, c’est que vous avez peut-être le même problème que moi, à savoir : une mauvaise déclaration de votre type de formulaire.

Enfin… mauvaise… disons qu’il manque des choses, et que logiquement, tant qu’on n’a pas une connaissance parfaite des rouages de Symfony, on ne comprend pas pourquoi ça ne fonctionne pas.

Je vais donc vous dire ce qu’il me manquait : j’avais une table personne et une table adresse.
Ces deux tables étaient reliées par une relation ManyToMany : une personne peut avoir une ou plusieurs adresses, et à une même adresse, plusieurs personnes peuvent habiter (heureusement ! 😉 ).

Dans la déclaration du type d’adresse, tout semblait cohérent, il n’y avait aucune erreur, mais il manquait une seule chose : la fonction setDefaultOption(). Je vous la fais courte : le code qui suit fonctionne.

Même si cette astuce ne fonctionne pas pour vous, essayez de suivre mon raisonnement : j’ai refait complètement un projet en partant de zéro, en suivant les instructions ici (Symfony 2 : Comment imbriquer une Collection de Formulaires) : et ensuite j’ai comparé pas à pas avec mon code. Pour en arriver aux six petites lignes qui manquaient : la fonction setDefaultOption().

<?php

namespace MaSociete\Bundle\MyBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver;
use Symfony\Component\Form\FormBuilderInterface;

class AdresseType extends AbstractType
{
   /**
    * Builds the form.
    *
    * This method is called for each type in the hierarchy
    * starting form the top most type. Type extensions can
    * further modify the form.
    *
    * @see FormTypeExtensionInterface::buildForm()
    *
    * @param FormBuilderInterface $builder The form builder
    * @param array                $options The options
    */
    public function buildForm(
        FormBuilderInterface $builder,
        array $options
    ) {
        $builder->add('adresse1', 'text')
            ->add('adresse2', 'text')
            ->add('cp', 'text')
            ->add('ville', 'text');
        }
    public function setDefaultOptions(
        \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver
    ) {
        $resolver->setDefaults(array(
            'data_class' => 'MaSociete\Bundle\MyBundle\Entity\Adresse',
        ));
    }
    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'MaSociete\Bundle\MyBundle\Entity\Adresse',
        );
    }
    public function getName()
    {
        return 'adresse';
    }
}

Linux équipe plus de 95 % des 500 supercalculateurs les plus puissants au monde

Je cite, citation prise ici :

Pour résumer 493 supercalculateurs sont Linux + Unix. Il y en a 6 sous Windows !
Soit 1,2 %.
Aucun Apple. Ah si ! Le système d’origine d’apple, BSD : 1 sur 500, soit 0.2 %.

Que dire de plus ? Les chiffres parlent d’eux-même.

Si Linux a du mal à s’imposer dans le monde des ordinateurs de bureau, l’OS open source se taille une part de lion dans l’embarqué (notamment avec Androïd pour les smartphones) et dans le monde des superordinateurs.

La dernière liste du top 500 des supercalculateurs les plus puissants du monde montre que Linux équipe plus de 95 % des appareils présents dans la liste.

Au total 482 supercalculateurs du top 500 fonctionnent sous Linux.
Ce qui fait une part de marché de près de 96,4 % pour l’OS. Il est suivi par Unix, qui fonctionne sur onze appareils. Quatre systèmes fonctionnent sur une combinaison de systèmes d’exploitation. Windows équipe juste deux appareils de la liste et BSD un seul superordinateur.

Coding game : les résultats : olivier pons

Je suis content, je suis 92ème sur 1167 :

Coding Game résultat pour Olivier Pons 92ème sur 1167

Dans les faits, si on enlève ceux qui sont à 0% (on ne sait pas s’ils ont participé ou pas), je suis 92ème sur 871. Ce qui n’est pas trop mal.
Si j’avais réussi à résoudre le second challenge en entier, j’aurais été dans les 40 premiers…

Vous pouvez avoir accès à mes codes sources ainsi qu’aux résultats ici.

J’étais content pour le premier, réalisé assez rapidement (32 minutes) :
Coding Game 2013 11 22 analyse 1

Alors que pour le second, j’ai galéré comme un fou (sachant que je suis allé chercher une pizzas et que je l’ai mangé en famille pendant le concours) :

Coding Game 2013 11 22 analyse 2

Ce qu’il y a de marrant, c’est qu’en travaillant en local, je me suis ressorti le fichier décompressé au format texte et c’était amusant à voir :

Coding Game 2013 11 22 notes de musiques fichier décompressé au format texte

Développement : Coding contest !

Nouveau challenge de codeurs !

C’est pour le fun, essayez vous aussi 

Le principe est simple

Vous aurez deux puzzles de programmation à résoudre.

Pour ce faire, vous pourrez choisir votre langage favori parmi ceux-ci : Java, C, C++, C#, Javascript, PHP, Python, Ruby, Objective-C, Haskell and Go.
La durée moyenne d’un challenge est de 2 heures et 30 minutes.

J’y serai, le 23 novembre !

Inscrivez vous !
Si jamais plus de trois personnes se sont inscrites via le lien précédent, et ont dépassé un score de 0% (= y sont allées), j’aurais un t-shirt codingame 😉

IUT informatique : script Shell pour injecter la base de données WordPress

Dumper la base de données

mysqldump -u root -pmysql wordpresslocal > 2013.12.19.wordpresslocal.sql

Réinjecter la base de données

mysql -u root -pmysql -e "DROP DATABASE IF EXISTS wordpresslocal;"
mysql -u root -pmysql -e "CREATE DATABASE wordpresslocal DEFAULT CHARACTER SET utf8;"
mysql -u root -pmysql -e "USE wordpresslocal ; GRANT ALL PRIVILEGES ON wordpresslocal   TO 'v69a6YK614454xA'@'localhost' IDENTIFIED BY 'nQ1e7NfDRXG2q6H';"
mysql -u root -pmysql -e "USE wordpresslocal ; GRANT ALL PRIVILEGES ON wordpresslocal.* TO 'v69a6YK614454xA'@'localhost' IDENTIFIED BY 'nQ1e7NfDRXG2q6H';"
mysql -u root -pmysql wordpresslocal < 2013.12.19.wordpresslocal.sql

IUT : comment faire fonctionner WordPress en local

Solution trouvée ici

Créer un fichier .htaccess à la racine de ce que vous avez décompressé. Ce fichier doit contenir :

DirectoryIndex index.php index.html
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

PhpStorm, Windows / WAMP et xdebug : howto – la solution

Si jamais vous êtes comme moi, et que vous n’avez pas réussi à faire fonctionner PhpStorm avec xdebug sous Windows avec WAMP, vous avez peut-être le même problème que moi à savoir : le serveur Apache semble mal configuré – ou configurable, et incapable d’utiliser Php correctement avec xdebug.

Je passe toutes les étapes de configuration « classiques », parce qu’elles sont simples et bien documentées – y compris dans PhpStorm. Malgré tout ça, il se peut que cela ne fonctionne pas.

La solution :

Solution PhpStorm RunDebug Configurations pour Windows - WAMP

En fait il faut configurer PhpStorm pour qu’il ne passe pas par Apache, mais qu’il lance le serveur Php intégré (si, Php a un serveur HTTP, cherchez dans la documentation).

Et ainsi, le déboguage en ligne fonctionnera.

C’est grâce à cette vidéo que j’ai eu l’idée d’essayer :

http://www.youtube.com/watch?v=LUTolQw8K9A

Bien sûr, si vous essayez xdebug sous Linux, vous aurez nettement moins de difficultés :).

Symfony 2 Notice: Undefined offset: 0 in vendor/…/Hydration/SimpleObjectHydrator.php line 103

Voici un petit problème que j’ai résolu.

Supposons que vous ayez plusieurs entités qui descendent d’une seule.
Dans l’entité mère, vous précisez ce qui va différencier les autres via la propriété DiscriminatorColumn :

/**
 * @ORM\Entity
 * @ORM\Table(name="table_de_base")
 * @ORM\InheritanceType("JOINED")
 * @ORM\Entity(
 *   repositoryClass="SOCIETE\Bundle\MegaSuperBundle\Repository\PersonRepository"
 * )
 * @ORM\DiscriminatorColumn(name="person_type", type="integer")
 * @ORM\DiscriminatorMap({"1" = "PersonneBoss", "2" = "PersonneLarbin"})
 */
abstract class Personne extends BaseUser
{
...
}

Cela signifie en clair : l’entité «PersonneBoss», descendante de «Personne», aura aura la valeur «1» dans le champ person_type, et l’entité descendante «PersonneLarbin», de «Personne», aura la valeur «2» dans le champ person_type. C’est, comme son nom l’indique, un «discriminateur».

Si jamais vous vous retrouvez avec une erreur de ce type : Notice: Undefined offset: 0 in vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php line 103, alors il se peut, comme c’était le cas pour moi, que les valeurs pour le «discriminateur» n’aient pas été correctement renseignées : dans mon cas, les valeurs étaient soit null, soit 0 et en fait cette valeur sert apparemment d’indice dans une table afin de pouvoir faire la jointure avec les descendants : donc il essayait de chercher une table avec l’indice 0, alors que je n’ai précisé que 1PersonneBoss») ou 2PersonneLarbin»)… donc pour la valeur 0, forcément, Symfony sort un Notice: Undefined offset: 0.

Bref, si vous avez une erreur comme celle-là, vérifiez que les valeurs en base de données sont cohérentes avec vos déclarations !

symfony 2 : isset et null avec Twig

Une des questions qu’on cherche le plus souvent avec Twig, c’est comment vérifier si une variable existe ou pas ?

La réponse se fait en trois étapes :

  1. Vérifier si une variable existe (= si elle a été initialisée) :
    En php, c’est isset().
    En Twig, c’est defined.
    Exemple de code Twig :

    {% if app.user is defined %}
    Code html
    {% endif %}
  2. Vérifier si une variable n’est pas null (= elle est définie, mais contient la valeur null) :
    En php, c’est !is_null().
    En Twig, c’est is not null.
    Exemple de code Twig :

    {% if app.user is not null%}
    Code html
    {% endif %}
  3. Vérifier si une variable existe et qu’elle n’est pas null (= elle est définie, et contient autre chose que la valeur null) :
    En php, c’est isset() && (!is_null()).
    En Twig, c’est is defined and is not null.
    Exemple de code Twig :

    {% if app.user is defined and app.user is not null%}
    Code html
    {% endif %}

En espérant que cela aide du monde !