Posts dans "Catalyst"

Affichage ppp

Ajouté le 15.01.2008 - 00:00  •  Commentaires (0)

Affichage page par page du contenu : rien de plus simple ;)

Contexte : on a par exemple un blog avec pas mal d'articles, et on veut pas tout afficher d'un coup, de peur de faire fuir le lecteur s'étant perdu sur notre site suite à une recherche google sur "sextoyz"...

Principe : on va découper les catégories en tranches de X articles maximum. On fera une liste de lien quelque part dans la page permettant d'accéder aux autres articles. On donnera un argument supplémentaire à ces liens.

Côté Controller :
use Math::Cephes qw(:utils);
my ($self, $c, $category, $now) = @_ ;
my $jump = 3;
my $threads;


$category contiendra donc la catégorie en cours de lecture; $now contiendra la page en cours; $threads servira pour la partie suivante, ainsi que le use Math::Cephes qw(:utils).


$now = $now || 0 ;
$threads = [
$c->model('mydb::table')->search(
{type => $id_cat},
{order_by => 'id DESC',
rows=>$jump, offset=>$now*$jump
} )
] ;

On regarde si $now existe. Si oui, c'est qu'on est déjà sur une page au sein de la catégorie (ça peut être 0, 1, 2....). Donc dans ce cas, il faut prendre la tranche d'articles depuis le dernier affiché non-compris. offset indique le nombre de tuples à laisser de côté depuis le PREMIER résultat de la requête. row permet de limiter à X tuples la sortie. Cela revient exactement à
select ... from ... where id_cat=... order by id desc, limit $now*$jump, $jump

Si $now n'existe pas, on vient d'arriver sur la page de la catégorie, donc simpl, on ordonne comme on veut, on limite à $jump et basta.

Ensuite, vient la mise en place des liens permettant d'accéder aux autres pages.
Pour se faire :
# get max nb of thread in this category
my $max = $c->model('mydb::table')->search( {type => $id_cat} )->count;
my $i=0;
my $pages;
$max = ceil($max/$jump);
while ($i<$max) {
$pages .= ($i==$now)? '<span class="spacedLinks">'.$i.'</span>' : '<a class="spacedLinks" href="'.$c->uri_for('/blog/part/').$id_cat.'/'.$i.'">'.$i.'</a>';
$i++;
}

Comme on peut le voir, c'est très simple : il suffit de savoir combien il y a d'articles dans la catégorie, de prendre le plafond de la division par le nombre d'articles à afficher et... rah pis merde, zavez qu'à comprendre le code :->

On blance ce qu'on doit dans $c->stash-stash, kou-roukou-kou... oué, ok.
Bref, on balance dans le TT, qui lui nous fera simplement l'affichage... Et ça, je vous laisse gérer.

# fin du speech. A vous de jouer avec.

Lire plus

Trucs utiles 1

Ajouté le 14.01.2008 - 00:00  •  Commentaires (0)

Certes il y a les tutos... mais ils ne disent pas tout, de loin s'en faut !
DONC... vais me lancer dans du blabla plus ou moins technique, qui me servira d'aide-mémoire par la suite.

Système en UTF-8 + TTSite : soucis en vue quand y a du traitement avec Filter et ce genre de trucs.
Solution : le forcer à prendre de l'UTF-(
Comment ? simple : on installe Catalyst::View::TT::ForceUTF8 et on configure dans myapp/lib/View/TT.pm en mettant
use base 'Catalyst::View::TT::ForceUTF8';
en lieu et place du
use base 'Catalyst::View::TT'; précédent.

Cela permet d'éviter 2-3 soucis d'encodage au final.

Pour faire un menu cool avec des catégories classées par nom, et les X derniers éléments par catégories, c'est un peu plus trash. Mais joli je trouve. Voyez plutôt :
sub createMenu : Private {
	my ($self, $c) = @_ ;
	
	my $types = $c->model('NimoDB::Types')->search({} , {order_by => 'me.title ASC'} ) ;
	my @menu;
	while(my $t = $types->next) {
		push @menu, [$t, $t->content->search(undef, {order_by=>'id DESC' ,rows=>'4'})] ;
	}
	$Data::Dumper::Useperl = 1;
	$c->stash->{types} = @menu;
}


2-3 explications : On récupère les catégories en premier, puis on parcourt l'array obtenu, et on récupère pour chaque catégorie les X derniers éléments . On push tout ça dans un array. Et on le balance dans stash..
Du côté de TT :
<ul>
  [% FOREACH type IN types -%]
    <li class="menu"><a href="[% Catalyst.uri_for('/blog/part/') _ type.0.id -%]">[% type.0.title -%] ([% type.0.content_rs.count -%])</a></li>
    [% IF menu.content_rs.count != 0 -%]
      [% FOREACH el IN type -%]
      	[% IF el.type %]
      	<li class="sst"><a href="[% Catalyst.uri_for('/blog/comments/') _ el.id -%]">[% el.title -%]</a>  <span class="mini">([% el.time -%])</span></li>
      	[% END %]
      [% END -%]
    [% END -%]
  [% END -%]
</ul>

En gros on parcourt la liste, et pour créer les sous-menus on saut le premier élément (qui est la catégorie).

Merci à castaway pour ce truc. Sans elle, je serais encore en train de tourner en rond avec des requêtes foireuses -.-'

Lire plus

Découverte

Ajouté le 13.01.2008 - 00:00  •  Commentaires (0)

Je viens de m'y mettre , et j'ai déjà 2-3 trucs à donner/dire. Cool nan?

Pour commencer, faut pas avoir peur du côté "perlesque" de la chose : j'ai dû faire, pour coder ce blog, à tout péter 3 lignes de vrai perl. Tout le reste est repris par les plugins de Catalyst.

Ensuite, pour le dév : suivez le tuto, il est complet et pas mal simple, tout en vous faisant voir à peut près tout ce qu'il faut pour faire un site en un rien de temps. La preuve, y a ce blog :P.

Et surtout, n'hésitez pas à aller poser des questions sur les chans IRC associés (irc.perl.org, #catalyst, #tt et #dbix-class ), l'équipe sur place est vraiment sympa.

Pour le reste... Suffit de lire. Y a juste le petit côté *passage en prod" qui m'a posé un problème, en ce sens que je ne connais pas du tout FastCGI.. Après avoir passé un moment sur google, j'en suis arrivé à faire un truc con :
script/myapp_fastcgi.pl -d -l /tmp/myapp.socket -n 2
pour lancer un serveur fastcgi, puis il m'a suffit de configurer lighttpd pour qu'il écoute sur /tmp/myapp.socket.
Ainsi, catalyst tourne avec le user qu'on veut, lighttpd est de toutes façons aussi avec son propre user virtuel... Bref, c'est pas trop mal.

Alors.. A vos éditeurs !!

Quelques liens :
Installation
Tutorial

Lire plus