[RESOLU] [Symfony2]Ajouter une vue au bundle Pagerfanta

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 oct. 2012, 19:11

Salut,

dans mon petit projet Symfony 2 j'ai ajouté ce bundle en utilisant Composer (génial ce machin): https://github.com/whiteoctober/WhiteOc ... antaBundle

Dans le readme on voit que pour ajouter une vue il faut la déclarer dans services.xml (au passage si quelqu'un sait comment on dit à Symfony qu'on veut utiliser le fichier YAML au lieu du XML ça m'intéresse):

Code : Tout sélectionner

<service id="pagerfanta.view.default" class="Pagerfanta\View\DefaultView" public="false"> <tag name="pagerfanta.view" alias="default" /> </service>
Ce que j'ai fait avec un truc dans le genre (de tête, je ne suis pas chez moi):

Code : Tout sélectionner

<service id="pagerfanta.view.tablefooter" class="Pagerfanta\View\TableFooterView" public="false"> <tag name="pagerfanta.view" alias="tablefooterview" /> </service>
La vue en question qui n'est pour l'instant qu'un copier/coller de ça : https://github.com/whiteoctober/Pagerfa ... ltView.php je l'ai mise dans app/Resources/PagerFanta/View d'après ce que j'ai compris de cet article: http://symfony.com/doc/2.0/cookbook/bun ... tance.html ce qui marche très bien pour les vues Twig mais là je ne suis pas sûr.

Bref j'appelle ma vue en faisant

Code : Tout sélectionner

{{ pagerfanta('entities', 'tablefooterview') }}
Mais j'ai une ClassNotFoundException sur : Pagerfanta\View\DefaultView

Est-ce bien la bonne méthode ? Faut-il que déclare explicitement Pagerfanta quelque part (genre dans le kernel) ? Pour l'instant je n'ai fait que ajouter le PagerfantaBundle.

Je m'y perds un peu, merci pour vos eclaircissements. :)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

31 oct. 2012, 19:12

Personne n'a d'idée ? Où est-ce qu'on place les classes étendant un bundle existant ? :(

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 nov. 2012, 13:00

Bon j'ai fini par la mettre dans mon propre Bundle, sous un dossier View. Je ne sais pas si c'est la convention mais ça marche.

Mammouth du PHP | 568 Messages

12 nov. 2012, 21:06

Dans le readme on voit que pour ajouter une vue il faut la déclarer dans services.xml (au passage si quelqu'un sait comment on dit à Symfony qu'on veut utiliser le fichier YAML au lieu du XML ça m'intéresse):

Code : Tout sélectionner

<service id="pagerfanta.view.default" class="Pagerfanta\View\DefaultView" public="false"> <tag name="pagerfanta.view" alias="default" /> </service>
Yo,

Juste quelques précisions,

Pour charger un fichier de service en Yaml, il te faut simplement utiliser le bon FileLoader.

En gros, tu créé un répertoire DependencyInjection dans ton bundle, dans lequel tu va ajouter ton extension (ex: MonProjetMonBundleExtension.php) et via la méthode load de la classe tu charge le fichier que tu veux:
<?php

namespace MonProjet\Bundle\MonBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension,
Symfony\Component\DependencyInjection\ContainerBuilder,
Symfony\Component\DependencyInjection\Loader\YamlFileLoader,
Symfony\Component\Config\FileLocator;

class MonProjetMonBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}
Si tu veux charger le fichier de service en XML tu charge XmlFileLoader au lieu de YmlFileLoader.

EDIT: concernant la surcharge de vue de bundle, normalement le simple fait de créer un répertoire du nom du Bundle et d'y coller les fichiers .html.twig suffit. Mais je n'utilise pas le pagerfanta et la doc n'est pas très clair, j'utilise le bundle KnpPaginator pour faire cela, il est plutôt flexible. Si tu as besoin d'aide sur d'autre point, je peux t'aider, je suis en plein dedans :)

Mammouth du PHP | 568 Messages

12 nov. 2012, 21:20

Bon après un peu de lecture,

Il semble possible de surcharger la class de vue utiliser via le service, en Yml cela donne;

Code : Tout sélectionner

services: pagerfanta.view.default: class: Pagerfanta\View\DefaultView public: false tags: [{ name: pagerfanta.view, alias: default }]
Il te suffit (je pense), de définir ton propre fichier de vue via la class appeler (-- class: MonBundle\View\CustomView --)

D'après la doc, tu peux ainsi avoir plusieurs type de vue;

Code : Tout sélectionner

services: pagerfanta.view.my_view_1: class: Pagerfanta\View\OptionableView arguments: - @pagerfanta.view.default - { proximity: 2, previous_message: Anterior, next_message: Siguiente } public: false tags: [{ name: pagerfanta.view, alias: my_view_1 }] pagerfanta.view.my_view_2: class: Pagerfanta\View\OptionableView arguments: - @pagerfanta.view.default - { proximity: 5 } public: false tags: [{ name: pagerfanta.view, alias: my_view_2 }]
Et tu les utilise comme ceci:

Code : Tout sélectionner

{{ pagerfanta(pagerfanta, 'my_view_1') }} {{ pagerfanta(pagerfanta, 'my_view_2') }}
Ensuite, je ferais un simple copier / coller du fichier DefaultView présent dans le bundle (que tu copie dans ton Bundle et que tu renomme en MonBundle\View\CustomView par exemple), tu test si ça marche et puis tu modifie ce que tu veux dans cette class.

Tiens mois au courant, j'ai un skype si tu veux en parler.

Bon courage et a+

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

20 nov. 2012, 00:08

Merci pour ta réponse. Je vais d'abord essayer d'utiliser le fichier yml pour charger les services, ensuite de surcharger ma vue. Bien que ce que tu dises ("Il te suffit (je pense), de définir ton propre fichier de vue...") c'était ce que j'avais compris de la doc Symfony, qui a très bien marché pour redéfinir mes pages d'erreur mais que je n'ai pas réussi pour celle du PagerFanta. J'ai pas trop accès à internet chez moi pour l'instant donc c'est galère d'essayer un truc et de venir poster le lendemain au boulot, mais je réessaierai et je te tiendrai au courant.

Merci de t'être penché sur mon problème, en tout cas.