Skip to main content Help Control Panel

Login   A+   A-

Community «   Le forum «   Besoin d'aide «  

Étendre la classe Page

Problem has been recorded

Issue description

Bon, je n'ai pas le vocabulaire correct en français probablement mais voici mon questionnement.

Dans skin.php, on peut mettre du code qui "remplace" celui de skin_skeleton.php pour un skin particulier. C'est ce code qui sera exécuté plutôt que le code de référence. C'est la significatiopn de "Class Skin extends Skin_skeleton". C'est exact ?

Je voudrais faire de même avec des bouts de code (fonctions) de page.php Y a-t-il moyen de créer une classe qui "extends Page" ? Où mettre ces bouts de code pour qu'ils s'appliquent au skin sans modifier le script de référence page.php qui sera écrasé à la prochaine mise à jour ?

Comments

Bernard
avatar
from nearby-an-airport
Associate, 6796 posts

on Jan. 17


Tu as parfaitement compris la façon dont YACS permet à un développeur d'étendre, ou de modifier, les fonctionnalités de mise en page par le code, en plus des possibiltiés déjà offertes par les feuilles de style.

A ce jour, ce mécanisme de surcharge n'est pas disponible pour skins/page.php, tout simplement parce que ce script est utilisé seulement à l'intérieur de template.php. Il suffit donc de remplacer l'appel de page::unefonction() par ton propre code directement dans template.php.
Tof
from Grenoble-Chambery
518 posts

on Jan. 17


Bonsoir Alain,

La classe Page.php peut effectivement être étendue dans un autre script mais je te conseille d'y réfléchir à deux fois avant.

En effet, les fonctions de cette page appellent des fonction de plus haut niveau définies dans le skin.php

Je n'ai personnellement jamais eu besoin de dériver la classe Page, et je pense que Bernard non plus sinon il l'aurait fait en standard.

Il m'est arrivé à mes débuts avec Yacs d'y songer, mais je me suis vite rendu compte que c'était inutile et qu'on pouvait faire plus propre et plus joli en dérivant une fonction de skin.php et/ou en modifiant un css. 

Lasares
avatar
from L'Île-Bizard à Montréal, Québec
709 posts

on Jan. 17


Bernard : Si j'ai bien compris, c'est tout simple. Tu me dis que les appels à page.php existent seulement dans template.php. Aucun autre script ne fait appel au contenu de page.php

Donc, si je modifie template.php, j'ai ce que je veux dans mon skin, sans affecter les autres skins et sans risquer que ce qui se trouve dans page.php soit exécuté par ailleurs à l'intérieur du skin choisi.

À la rigueur, si je recopiais le contenu de page.php dans template.php et que je supprimais page.php, yacs fonctionnerait (avec ce skin seulement, bien sûr). J'ai bon ?
Lasares
avatar
from L'Île-Bizard à Montréal, Québec
709 posts

on Jan. 17


Tof : merci de tes bons conseils. Effectivement, vaut mieux faire doublement attention.

Pour info, ce qui me pousse à vouloir modifier page.php, c'est que je veux modifier la construction du bas de page, qui y est spécifiée par function footer.

Avec ce que me dit Bernard, je comprends qu'il me suffit de reproduire cette fonction dans le template.php du skin et d'y faire les modifications que je désire (en remplaçant Page::footer par Template::footer dans le code initial du template).

Est-ce que j'ai bien compris ?
Tof
from Grenoble-Chambery
518 posts

inspired from Lasares on Jan. 18


Lasares :

Tu y es presque

Template::footer() est l'appel de la fonction footer de la classe Template.

Sauf que la classe Template n'existant pas, l'appel de Template::footer te renverra une erreur "class Template not found" .

Tu peux définir une fonction footer dans le template.php : function footer() { toncode }   et remplacer l'appel de Page::footer() par footer(); . Ensuite tu mets le code souhaité dans la fonction footer() de ton template.php.

 

 
Lasares
avatar
from L'Île-Bizard à Montréal, Québec
709 posts

on Jan. 18


Tof :

OK, un gros merci de me guider ainsi.

Ma première compréhension était qu'on appelait comme tu me l'indique une fonction dans la même page. Mais comme je n'en trouvais pas d'exemple dans les scripts de yacs (pas assez fouillé, je suppose), j'en avais déduit à tort qu'il fallait faire précéder par le nom du script (mais je comprends maintenant que ce n'est pas le nom du script qui précède, c'est le nom d'une classe). J'y arrive.
Bernard
avatar
from nearby-an-airport
Associate, 6796 posts

on Jan. 18


Alain, si tu considères que les fonctions sont un simple moyen de regrouper des lignes de code ensemble, tu peux sans doute t'en passer comlètement dans ton cas.

la solution la plus simple, c'est de recopier le contenu de la fonction et non l'ensemble de la fonction elle-même.

Là où tu avais :
Page::footer();



Tu mets à la place :
// the last paragraph
echo '<p>';

// execution time and surfer name, for logged user only (not for indexing
    
robots!)
if(
is_callable(array('Surfer''get_name')) && Surfer::get_name() &&
    
is_callable(array('i18n''s'))) {
    
$execution_time round(get_micro_time() - $context['start_time'], 2);
    echo 
sprintf(i18n::s('Page prepared in %.2f seconds for %s'),
    
$execution_timeucwords(Surfer::get_name())).BR;
}

// site copyright
if(isset($context['site_copyright']))
    echo 
'&#169; '.$context['site_copyright'];

// a command to authenticate
if(is_callable(array('Surfer''is_logged')) && !Surfer::is_logged() &&
    
is_callable(array('i18n''s')))
    echo 
' - '.Skin::build_link('users/login.php'i18n::s('login'),
    
'basic').' ';

// about this site
if(is_callable(array('i18n''s')) && is_callable(array('Articles',
    
'get_url')))
    echo 
' - '.Skin::build_link(Articles::get_url('about'), i18n::s('about
    this site'
), 'basic').' ';

// privacy statement
if(is_callable(array('i18n''s')) && is_callable(array('Articles',
    
'get_url')))
    echo 
' - '.Skin::build_link(Articles::get_url('privacy'), i18n::s('privacy
    statement'
), 'basic').' ';

// a reference to YACS
if(is_callable(array('i18n''s')))
    echo 
' - '.sprintf(i18n::s('powered by %s'),
    
Skin::build_link(i18n::s('http://www.yetanothercommunitysystem.com/'),
    
i18n::s('yacs'), 'external'));

// all our feeds
if(is_callable(array('i18n''s')))
    echo 
' - '.Skin::build_link('feeds/'i18n::s('rss feeds'), 'basic');

// end of the last paragraph
echo '</p>';



Et après, tu tripatouilles les commandes pour ajuster le tir ...

Bien sûr, ça fait un fichier plus gros, et c'était l'une des motivations initiales pour faire un script skins/page.php et réduire la taille des templates; Mais au moins YACS ne te limite pas du tout quand aux possibilités de mise en page.

Un autre point important, c'est que le template peut tout à fait contenir du HTML standard, là où le texte reste fixe. D'ailleurs à l'origine, le PHP a été conçu pour s'incruster dans du HTML. Dans le cas de YACS, gestionnaire de contenu dynamique, on peut dire que les fichiers ne contiennent plus que de PHP. Mais dans ton template, libre à toi de mettre en bas de page le code HTML que tu souhaites, après la balise de fin du code PHP '?' suivi de '>', tout à la fin du fichier.

Rate this page
Posted by Lasares on Jan. 17, edited by Bernard on Jan. 18, (popular)