FoxMaSk'Z h0m3 - Dev-Gamer World


lundi, février 4 2008

PunBB 1.3 beta - la magie des 'hameçons' (aka Hook)

Après de très long mois d'attente (près de 18?), PunBB 1.3 sort en version béta avec quelques nouveautés dont :

  • le support de l'utf-8
  • des 'hooks'

cela parait peu dit comme cela mais attention les yeux ....

les hooks permettent dès maintenant, de créer des "extensions" sans toucher au coeur du code de punbb.
Ainsi l'avantage est de pouvoir produire des extensions de son choix qui soit installable / désinstable avec aisance et une maintenance accrue.

un exemple :
dans le script header.php on trouve la ligne suivante :

($hook = get_hook('hd_template_loaded')) ? eval($hook) : null;

celle ci permet d'ajouter ce que l'on veut après que le template se soit chargé.

Pour exploiter ce hook, prennons l'exemple "Random Quote" permettant de changer la description du forum aléatoirement.

le noeud hook id identifie quel hook de punbb on compte exploiter, ici donc hook id vaut hd_template_loaded

une fois installé dans le répertoire extensions, rendez vous dans l'administration du forum puis installez l'extension.

vous verrez immédiatement le hook produire son effet en changeant la description ;)

Pour info, les hooks commençants par :

  1. hd_ sont dans le header
  2. ft_ sont dans le footer
  3. in_ sont dans l'index
  4. li_ sont dans le login
  5. dl_ sont dans delete
  6. ex_ sont dans externe
  7. he_ sont dans l'aide
  8. mi_ sont dans misc
  9. mr_ sont dans moderate
  10. po_ sont dans post
  11. pf_ sont dans profile
  12. rg_ sont dans register
  13. re_ sont dans rewrite
  14. se_ sont dans search
  15. ul_ sont dans userlist
  16. vf_ sont dans viewforum
  17. vt_ sont dans viewtopic

vous voici parés prêt à créer/migrer vos MOD existantes ;-)

mercredi, décembre 26 2007

CakePHP - PunBB - statistique du forum

Quelques conceptes de bases.

Pour pouvoir afficher des info réutilisables dans ses Views CakePHP fourni des "Helpers" et des Elements Le Helper étend les possibilités des Vues et les Elements sont des petits bouts de code php/html qui peuvent étre affichés plusieurs fois dans la même page.

Ainsi donc le "bloc de stats" pourrait très bien être affiché dans plusieurs pages pour chacun des plugins news/articles/lexique etc..

Donc nous allons faire un element "app/views/elements/stats.ctp" comme suit :

<?php
$bloc->startBloc(__('Forums statistics',true), 'stats');				
				
$pt_total_users = $this->requestAction('users/nbUsers');
$pt_last_user 	= $this->requestAction('users/lastUser');	
$pt_total_posts = $this->requestAction('forum/stats');
?>
<ul>
<li><?php echo __('Total numbers of members:',true).' '.$pt_total_users['0']['0']['total_user']?></li>
<li><?php echo __('Newest resgistered user:',true).' <a href="'.pt_forum_url.'profile.php?id='.$pt_last_user['0']['User']['id'].'">'.$pt_last_user['0']['User']['username']?></a></li>
<li><?php echo __('Total numbers of topics:',true).' '.$pt_total_posts['0']['0']['total_topics']?></li>
<li><?php echo __('Total numbers of posts:',true).' '.$pt_total_posts['0']['0']['total_posts']?></li>
</ul>
<?php
$bloc->endBloc();
?>

comment tout cela fonctionne :

dans le script app/app_controller.php de notre applications nous faisons ceci :

class AppController extends Controller {
public $helpers = array ('Bloc','Html');
...
}

et le helper bloc contient ceci (app/views/helpers/bloc.php):

<?php
class BlocHelper extends Helper {
 	 	
 	function startBloc($title='',$id='') {	
		static $i;	
		$id = $id != '' ? $id : $i;		
		$res = '';
		$res .= "\t".'<div class="block" id="'.$id.'">'."\n";		
		if ($title!='')
			$res .= "\t".'<h2><span>'.$title.'</span></h2>'."\n";		
		$res .= 
		"\t\t".'<div class="box" id="box_'.$id.'">'."\n";
		
		if (PT_DEFAULT_THEME == 'punbb') 
			$res .= "\t\t\t".'<div class="inbox">'."\n";
		
		echo $res;
		$i++;
	}
	function endBloc() {
 		if (PT_DEFAULT_THEME == 'punbb') {		
			echo 
			"\t\t\t".'</div>'."\n".
			"\t\t".'</div>'."\n".
			"\t".'</div>';
 		} 
 		else {
 			echo 
			"\t\t".'</div>'."\n".
			"\t".'</div>'; 			
 		}
	} 
 	
}
?>

Ainsi paré : le controlleur principal dispose d'un helper bloc
donc la vue peut utiliser $bloc->endBloc et ->startBloc

ceci est une premiere etape :
suit ensuite dans notre element les 3 lignes :


$pt_total_users = $this->requestAction('users/nbUsers');
$pt_last_user 	= $this->requestAction('users/lastUser');	
$pt_total_posts = $this->requestAction('forum/stats');

ces 3 lignes effectuent des "requestAction" lequelles permettent d'accèder aux methodes nbUser et lastUser de la class UsersController et à la methode stats de la class ForumControllers, en voici le détail :


<?php
class UsersController extends AppController {
	public $name 	= 'Users';
[...]
	public function lastUser () {		
		$strQuery =  'SELECT id, username FROM '.DB_PREFIX.'users as User' .
						' ORDER BY registered DESC LIMIT 1';
		$resultset = $this->User->query($strQuery);
		return $resultset; 									
	}	
	public function nbUsers () {
		
		$strQuery = 'SELECT COUNT(id)-1 AS total_user FROM '.DB_PREFIX.'users AS User ';		  
		$resultset = $this->User->query($strQuery);
		return $resultset; 	
     }
[...]
}

ceci nous permet donc d'avoir facilement les information de stats de notre forum de manière utlra simplissime dans un bloc qui s'affichera ou bon vous semble comme suit :

<?php  echo $this->renderElement('stats');?>

lundi, décembre 24 2007

CakePHP - PunBB - architecture generale

Voici l'architecture générale avec la liste des répertoires de son application

- app
--- config contient les fichiers de config de son application tel database.php, bootstrap.php etc..

--- controllers contient les controllers de votre application

--- locales contient les traductions

--- models contient les models

--- plugins contient des applications nommé plugins (détail plus bas)

--- vendors contient des librairies externes à CakePHP et nécéssaire à son application

--- views contient les views de votre application

--- webroot contient la partie "web" de votre application --- webroot/forum/ l'endroit où est installé punBB !

le répertoire plugins reprend l'integralité de l'arborscence MVC ce qui donne :

  1. plugins
  2. - news
  3. - news/news_app_controller.php class du controller du plugins news
  4. - news/news_app_model.php class du mdel du module du plugin news
  5. - news/controllers/news_controller.php le controlleur du plugin news
  6. - news/models/news.php le model du plugin news
  7. - news/views/themed/punbb/news/index.ctp la vue principale du module news

La configuration apache devra donc définir un VirtualHost sur le répertoire app/webroot/ comme DOCUMENT_ROOT.

jeudi, décembre 6 2007

CakePHP et PunBB : introduction

Après l'édpisode des comparatifs de framework PHP, voici une astuce pour vous permettre de franchir le pas vers CakePHP (un bon framework PHP utilisant MVC) tout en utilisant PunBB comme outil de forum.

L'idée de base est la suivante : je veux créer un portail basé sur le framework CakePHP mais en utilisant une seul et unique session entre mon portail et mon forum.

Donc pour y parvenir, dans le script dispatcher.php de CakePHP je fais le classique include du script common.php de punbb comme suit :

j'edite le script cake/dispatcher.php et au dessus de

 class Dispatcher extends Object {

j'ajoute :

 define('PUN_ROOT',WWW_ROOT. 'forums/');
 require PUN_ROOT.'include/common.php';

de là, partout dans CakePHP nous avons la "main" sur les variables punBB et la gestion de la session.

Donc dans mon controlleur gérant l'utilisateur contiendra ni plus ni moins qu'un copier/coller du code de gestion de la fonction login (avec l'action = in et out selon le cas)

  class UsersController extends AppController {
      public function login ()
    {
    	global $pun, $db, $pun_config, $db_type, $lang_login;
        $this->set('error', false);
       #soumission du formulaire de login
        if (!empty($this->data))
        {
      #analyse du login/pass ; recherche dans la base et creation du cookie
       }
     }
   }

évidement on n'oubliera pas d'ajouter un global $pun_user par exemple, dans la fonction login, pour manipuler les données que cette variable contient.

Dans un prochain billet, j'aborderai les vues (le V de MVC ;) et comment produire un menu et recuperer dans un bloc de son portail les 'n' derniers sujets recents du forum.

dimanche, juin 10 2007

PunBB : la simplicité même ?!

L'équipe de PunBB, l'outil de forum, nous gratifie d'un tuto en vidéo détaillant toutes les étapes possibles sur punBB, allant de l'installation à la gestion de son forum en passant par l'installation de nouveaux thèmes pour finir par l'ajout de liens supplémentaires dans le menu horizontal.