Wordpress: migliorare la lista dei commenti

Mercoledì 22 Ottobre, 2008

Il template standard di Wordpress (come altri) normalmente preve un layout alternato per la lista dei commenti. Nel template standard di esempio è impostata una classe css alt, secondo la logica:

PHP:
  1. // file comments.php
  2. <li <?php echo $oddcomment; ?>id="comment-<?php comment_ID() ?>">
  3. [...]
  4. /* Changes every other comment to a different class */
  5. $oddcomment = ( empty( $oddcomment ) ) ? 'class="alt" ' : '';

Questo fa si che nel tag li $oddcomment sia impostato una volta a vuoto ("") e una volta a class="alt". Una modifica utile potrebbe essere quella di introdurre un ulteriore classe quando è l'autore del blog a commentare un post:

image

Io, ad esempio, ho usato il seguente codice nel file comments.php:

PHP:
  1. <?php
  2.     $authcomment = ($comment->user_id==3)?' authcomment':'';
  3.     $classcomment = ( empty( $classcomment ) ) ? ( ($authcomment=='')?' alt':'' ) : ''
  4. ?>
  5. <li class="<?=$classcomment?><?=$authcomment?>" id="comment-<?php comment_ID() ?>">

La riga $comment->user_id==3 può variare in base all'ID del vostro utente. Io, ad esempio, non uso l'amministratore per rispondere sul blog, ma ho un mio utente con ID=3. Normalmente l'ID dell'amministratore è 1, se usate questa utenza potete scrivere: $comment->user_id==1. In questo modo oltre ad avere l'alternanza di layout sui commenti lasciati dai visitatori, risulta immediatamente riconoscibile la risposta dell'autore del blog.

Post correlati

Wordpress: modifcare AdminBigWidth per gli sviluppatori

Venerdì 17 Ottobre, 2008

AdminBigWidth è un Plugin per Wordpress in grado di impostare l'area di lavoro dell'amministrazione a tutto schermo. È un plugin davvero semplice e banale, infatti il suo codice non fa altro che modificare la classe CSS .wrap:

PHP:
  1. function AdminBigWidth () {
  2.     echo '<style type="text/css">.wrap{max-width:none}</style>';
  3. }
  4. add_action('admin_head','AdminBigWidth');

Per chi come me usa l'editor di Wordpress in modalità HTML potrebbe risultare utile impostare dei caratteri a spaziatura fissa, come il Courier, invece del font proposto di default. In questo modo, almeno per gli sviluppatori, risulta più facile allineare codici sorgenti. Per fare questo basta aggiungere, sullo stile di AdminBigWidth, una nuova impostazione CSS che si rifletta sull'editor quando è in modalità HTML. Si potrebbe scrivere un Plugin (di due righe) per fare questo, tuttavia è meglio sfruttare proprio il codice di AdminBigWidth, così da evitare un ulteriore carico dovuto all'ennesimo Plugin:

PHP:
  1. function AdminBigWidth () {
  2.   echo '<style type="text/css">.wrap{max-width:none}#editorcontainer #content{font-family:"Courier New", Courier, monospace}</style>';
  3. }
  4. add_action('admin_head','AdminBigWidth');

Post correlati

Una classe countDown in Javascript

Lunedì 13 Ottobre, 2008

Nel post 3D CountDown con FIVe3D (vedi anche How I Did It: scrivere un countdown in Flash), veniva proposta una classe per la creazione di un oggetto CountDown in Actionscript, eccone una versione simile in Javascript:

JavaScript:
  1. /**
  2. * CountDown Class
  3. *
  4. * @author        Giovambattista Fazioli
  5. * @email         g.fazioli@undolog.com
  6. * @web           http://www.undolog.com
  7. *
  8. * @param    dd   (string) 'month day, year'
  9. *
  10. */
  11. function countDown( dd ) {
  12.     // init target time
  13.     var target            = new Date( dd );
  14.     this.targetTime        = target.getTime();
  15.    
  16.     /**
  17.      * refresh countdown
  18.      */
  19.     this.refresh = function() {
  20.         var today                 = new Date();
  21.         var currentTime           = today.getTime();
  22.         // time left
  23.         this._leftMilliseconds    = (this.targetTime - currentTime);
  24.         this._leftSeconds         = Math.floor( this._leftMilliseconds / 1000 );
  25.         this._leftMinutes         = Math.floor( this._leftSeconds / 60 );
  26.         this._leftHours           = Math.floor( this._leftMinutes / 60 );
  27.         // no module
  28.         this.leftDays             = Math.floor( this._leftHours / 24 );
  29.         // for print
  30.         this.leftMilliseconds     = this._leftMilliseconds % 1000;
  31.         this.leftSeconds          = this._leftSeconds % 60;
  32.         this.leftMinutes          = this._leftMinutes % 60;
  33.         this.leftHours            = this._leftHours % 24;
  34.     }
  35.     this.refresh();
  36. }

Esempio

JavaScript:
  1. var cd = new countDown( '1 1, 2009' );
  2. // mostra quanti giorni, ore, minuti, secondi e millisecondi al primo gennaio 2009
  3. document.write( cd.leftDays + "," + cd.leftHours + "," + cd.leftMinutes + "," + cd.leftSeconds + "," + cd.leftMilliseconds );

Post correlati

Actionscript 3.0: tutto con l’operatore new

Giovedì 31 Gennaio, 2008

Sempre nell'ottica di "uniformare", come già accaduto con gli eventi (vedi La nuova gestione degli eventi di Flash CS3 e Flash CS3: la nuova gestione degli eventi), una delle tante novità presenti in Actionscript 3.0 è la scomparsa di tutti quei metodi ad hoc dedicati alla creazione di particolari oggetti, come: createEmptyMovieClip() o il famosissimo attachMovie(). Con Actionscript 3.0 l'operatore new è sufficiente a svolgere tutte le operazioni di creazione. Un nuovo MovieClip, ad esempio, viene creato (runtime) con il seguente codice:

Actionscript:
  1. var mioClip:MovieClip = new MovieClip();
  2. addChild(mioClip);

image Ma veniamo al dunque! Se ho un simbolo nella libreria e voglio aggiungerlo runtime come procedo se attachMovie() è scomparso? La soluzione non è molto dissimile da quello che accadeva in Actionscript 2.0. Prima di tutto bisogna andare nel pannello di libreria, selezionare il simbolo e aprire la finestra proprietà. A questo punto spuntare la casella di concatenamento Esporta per ActionScript - come accadeva in Flash 8. Un simbolo di libreria ha sempre come Classe base flash.display.MovieClip, ma questo non ci interessa granchè. La cosa interessante, invece, è il parametro Classe che viene impostato di default (quando si spunta Esporta per ActionScript) con il nome del simbolo. Quello che è importante sottolineare è che questa è una nuova modalità di Flash CS3 (e quindi ActionScript 3.0). Il simbolo, per essere esportato, deve avere una Classe di riferimento. La curiosità risiede nel fatto che non siamo costretti a creare per forza una nostra Classe (estesa da flash.display.MovieClip), anche se potremmo farlo. Continua a leggere... »

Post correlati

Classi, Oggetti e Istanze

Martedì 29 Gennaio, 2008

Ho notato spesso confusione quando si parla di Classi, Oggetti ed Istanze. Chi non è particolarmente istruito sulla programmazione ad oggetti spesso confonde il vero significato di questi termini. Sapevo, tuttavia, che esistono due scuole di pensiero riguardo alla definizione di Classe e Oggetto. A me piace la "scuola" che indica la Classe come definizione di un possibile Oggetto e, quindi, l'Oggetto come Istanza della Classe.

Sembra banale, tuttavia mi è capitato - discorrendo con altri - di trovarmi in "conflitto" (per così dire) e poi cadere in equivoci, quando si usano questi termini, partendo casomai dal presupposto che "l'altro" li intenda esattamente come noi.

Io la vedo in questo modo; una Classe è una definizione! Viene appunto definita una classe di possibili oggetti. La Classe è l'insieme di metodi e proprietà (se volete possiamo aggiungere anche gli eventi - che altro non solo che speciali metodi...) che possiederà l'oggetto.

Ad esempio quando scriviamo in Actionscript, o qualsiasi altro linguaggio ad oggetti:

Actionscript:
  1. class MiaClasse {
  2.     function MiaClass() {}
  3.     function MioMetodo() {}
  4. }

Abbiamo definito una Classe e non un Oggetto. Al limite abbiamo "definito" un "possibile" oggetto. Potremmo addirittura sostenere, e non a torto, che l'Oggetto esiste a runtime mentre la Classe no (in verità esistono Classi dinamiche che possono essere definite - e poi usate per creare oggetti - anche a runtime). Escludo le classi statiche, ovviamente che - alla fine - altro non sono che sotto-istanze (o istanze nascoste) e quindi oggetti veri e propri.

Quando invece abbiamo:

Actionscript:
  1. var mioOggetto:MiaClasse = new MiaClasse();

Ecco che mioOggetto è una istanza di MiaClasse()! Cioè mioOggetto è un Oggetto - appunto - di tipo MiaClasse().

Ne deriva, proprio nella filosofia ad oggetti, che di Oggetti di tipo MiaClasse() ne posso avere quanti ne voglio, cosa che non può essere - per la definizione stessa - di MiaClasse(). Ad esempio, se vale ed ha senso la relazione:

Actionscript:
  1. var mioOggetto_1:MiaClasse = new MiaClasse();
  2. var mioOggetto_2:MiaClasse = new MiaClasse();
  3. var mioOggetto_3:MiaClasse = new MiaClasse();
  4. ...
  5. var mioOggetto_n:MiaClasse = new MiaClasse();

Non ha significato:

Actionscript:
  1. class MiaClasse {
  2.     function MiaClass() {}
  3.     function MioMetodo_2() {}
  4. }
  5.  
  6. class MiaClasse {
  7.     function MiaClass() {}
  8.     function MioMetodo_2() {}
  9. }
  10.  
  11. class MiaClasse {
  12.     function MiaClass() {}
  13.     function MioMetodo_3() {}
  14. }

Istanza e Oggetto, quindi, coincidono e sono usate alternativamente per lo stesso significato in diversi contesti.

Probabilmente non frega molto a nessuno... questione di esigenze di completezza... :)

Post correlati

Classi e ID nei CSS

Giovedì 7 Settembre, 2006

Ecco alcuni brevi consigli su come usare class e id nei fogli di stile. Tenete subito in considerazione che l'uso di tecniche Javascript avanzate, come lo stesso uso di motori Ajax, può entrare in conflitto con i consigli esposti qui! E vedremo alla fine il perchè.

Avendo a disposizione sia l'attributo class="" che l'attributo id="" per legare un TAG ad uno stile, spesso si rimane confusi e non si capisce quale sia la differenza o, comunque, la scelta migliore tra i due. In verità segnare un TAG tramite la classe o tramite l'id ai fini del CSS non cambia nulla, o quasi. Quello che cambia è il nostro modo di pensare alla pagina e di utilizzare in modo corretto id e classi senza ritrovarci poi a pentirci delle scelte fatte.

Una precisazione sull'ereditarietà

Prima di iniziare vorrei cogliere l'occasione per sottolineare un comportamento importante degli stili, ovvero il coscading o ereditarietà. In pratica un sottoelemento eredita le caratteristiche dell'elemento padre, a meno di non specificare esplicitamente che è !important. Vediamo un esempio che può chiarire meglio questa situzione. Immaginiamo di aver creato il seguente foglio di stile:

CSS:
  1. #a_box p {font-size:14px}
  2. #b_box p {font-size:22px}

e il seguente codice HTML:

HTML:
  1. <div id="a_box">
  2.    <p>Primo testo direttamente sotto a_box</p>
  3.    <div id="b_box">
  4.        <p>Secondo testo sotto b_box e a sua volto sotto a_box</p>
  5.    </div>
  6. </div>

Il risultato sul browser sarà effettivamente quello desiderato, il primo paragrafo sarà reso con il font 14 pixel e il secondo paragrafo con il font a 22 pixel! Proviamo ora ad usare class al posto di id:

CSS:
  1. #c_box p {font-size:14px}
  2. .d_box p {font-size:22px}

codice HTML:

HTML:
  1. <div id="c_box">
  2.    <p>Primo testo direttamente sotto c_box</p>
  3.    <div class="d_box">
  4.        <p>Secondo testo sotto d_box e a sua volto sotto c_box</p>
  5.    </div>
  6. </div>

Il risultato sul browser (provato su FireFox 1.5+ e su IE6), questa volta, sarà diverso! Cosa è accaduto? Il div con classe d_box ha ereditato il font-size del primo div con id c_box. Un id, quindi, obbliga le classi "figlie" ad ereditare i propri attributi (anche se questo non è valido per tutti gli stili). Per eliminare il problema bisogna indicare esplicitamente, con la keywork !important, il font-size nella classe d_box, come mostrato qui sotto:

CSS:
  1. #c_box p {font-size:14px}
  2. .d_box p {font-size:22px !important}

In questo modo imponiamo di prendere in considerazione il nuovo stile definito con la classe d_box.

Usando esclusivamente le classi:

CSS:
  1. .c_box p {font-size:14px}
  2. .d_box p {font-size:22px}

codice HTML:

HTML:
  1. <div class="c_box">
  2.    <p>Primo testo direttamente sotto c_box</p>
  3.    <div class="d_box">
  4.        <p>Secondo testo sotto d_box e a sua volto sotto c_box</p>
  5.    </div>
  6. </div>

Il risultato sul browser sarà quello iniziale, entrambi i paragrafi saranno resi correttamente. Morale: massima attenzione quindi quando si usano gli stile in cascading... se è vero che non c'è una immediata differenza tra classi e id è anche vero che il loro uso non è del tutto identico. Altrimenti perchè esisterebbero due modi di indirizzamento?

Regola

Tuttavia esiste un modo per sapere chi "vince" quando si imposta uno stile. Questa tecnica viene normalmente chiamata Cascade Rule 3.
Si fornisce un valore ad ogni selettori, o riga dichiarativa CSS. Questo valore ha la forma A-B-C.

1) Addizionare 1 ad A per ogni id nel selettore
2) Addizionare 1 ad B per ogni class nel selettore
3) Addizionare 1 ad C per ogni TAG nel selettore

Vediamo un esempio:

CSS:
  1. 0-0-1 = 1       -[ p {color:red}
  2. 0-1-1 = 11      -[ p.largetext
  3. 1-0-1 = 101    -[ p#largetext
  4. 1-0-2 = 102    -[ body p#largetext
  5. 1-1-3 = 113    -[ body p#largetext ul.mylist
  6. 1-1-4 = 114    -[ body p#largetext ul.mylist li

Il valore più alto vince. Nel caso due regole hanno lo stesso peso, vince l'ultima definita.

Consigli

Una strada potrebbe essere questa: usare la classe quando il comportamento visivo di un TAG può variare a seconda del suo contenitore madre. Usare id quando il comportamente visivo è univoco, cioè prescinde dal suo contenitore madre.

Un esempio chiarificatore di questo approccio potrebbe essere il seguente: il comportamento di un ipotetico titolo. In questo caso useremo la class="title" e in base al contenitore superiore regolare i vari comportamenti. Il file CSS potrebbe essere:

HTML:
  1. <div id="codice"><code>.title { ...... }
  2. </code><code>#listProducts .title { ........ }
  3. #listUsers .title { ....... }</code></div>

Nella realtà, addirittura, le cose sono anche meglio visto che abbiamo i TAG Hn che ci aiutano. In un caso reale la classe title sarebbe inutile. In pratica la tecnica è quella di usare gli id come selettori di comportamento (infatti vengono spesso indicati come id-selector). Una situazione reale potrebbe essere quindi:

HTML:
  1. <div id="codice"><code>h1 { ...... }
  2. </code><code>#listProducts h1 { ........ }
  3. #listUsers h1 { ....... }</code></div>

Abbiamo dunque tre comportamenti diversi in base al selettore. La regola principale potrebbe essere la seguente: se questo TAG si comporterà visivamente in modo diverso a seconda del contenitore usare class!

In questa casistica, tra l'altro, rientrano molti elementi del layout visivo come ad esempio le liste ul. Queste si possono comportare in modo diverso a seconda del contenitore madre: possono avere un aspetto nella barra di navigazione, un altro nella pagina principale, un altro ancora nella barra laterale, ecc... Tuttavia quello che ci serve, nella maggioranza dei casi, è il solo selettore id, utilizzando al meglio i TAG standard messi a disposizione dell'HTML.

Per esempio è buona regola usare le liste ul o ol quando si può, i TAG titolo Hn, i TAG strong, acronym, code, insomma limitare div e span altrimenti rendiamo inutile l'uso degli stili, inondando inoltre la rete con bit supeflui. Spesso, infatti, non si conoscono nemmeno tutti i TAG HTML. Alcuni Web Designer sembrano ignorare alcuni dei più utili TAG presenti nell'attuale standard HTML. Certo alcuni TAG (come anche alcuni attributi, eventi, stili e, ahimè, altre varie cosine...) sono confinati nello standard di qualche specifico browser, ma ci sono molti TAG pienamente supportati da praticamente tutti i browser esistenti (Safari compreso - apropos ma Apple ha forse dimenticato di aver sviluppato un suo browser?!).

I fogli di stile, ancora ahimè, sono anch'essi soggetti a qualche incomprensione sparsa quà e là. Ai Web Designer non resta che pazientare sperando in un futuro più standard e meno variabile. Utilizzare gli id come selettori, quindi, non può esimersi dall'essere anch'esso coinvolto in un effetto collaterale legato all'uso di Javascript. Tramite il linguaggio lato client più diffuso, se attivato nel browser, è possibile ottenere un puntatore ad uno specifico TAG o elemento della pagina. Questo oggi viene risolto con estrema facilità (un pò di tempo fa era leggermente più complesso, a causa delle sempre presenti incompatibilità tra browser!) tramite il metodo getElementByID() messo a disposizione dall'oggetto document.

Come si evince dallo stesso nome del metodo, getElementByID() recupera il puntatore in base all'id dell'elemento. Il problema che ha a che fare con i fogli di stile risiede nel fatto che l'id in questione è proprio lo stesso utilizzato da getElementByID() per rintracciare l'elemento. Quindi immaginiamo di dover scrivere una Web Application che gestisce una serie di post-it a video, caso mai con il position:absolute attivato. Questo significa che di post-it sulla pagina ne potrei avere un numero imprecisato di n. Il Web Designer che vuole scrivere il foglio di stile per quest'oggetto, seguendo la nostra regola precedente sceglierebbe di usare un div contenitore e assegnargli un id="postIt". In questo modo seguirebbe la nostra regola in quando un post-it non si comporta per se stesso in modo visivamente differente a seconda del contenitore madre. Nella nostra specifica esso è un'oggetto unico e quindi è corretto associargli un'id. I guai arrivano quando il programmatore Javascript (i personaggi di questa ministoria sono 2 diversi ma la questione sarebbe ugualmente imbarazzante anche per un'unico sviluppatore...) tenta di ottenere un puntatore ad uno specifico post-it! Esso si accorge presto che non può usare l'ID come discriminatore in quanto se sulla pagina esistono più elementi con lo stesso ID allora getElementByID() non può restituire un'unico puntatore, al limite può restituire un elenco (array), una lista di elementi che si chiamano tutti allo stesso modo.

Questa lunga e noiosa discussione porta con se una nota conseguenza. Nello sviluppo HTML/Javascript/CSS e in particolare nei fogli di stili, molto dipende dalla visione generale. Non esiste davvero una regola valida per qualsiasi soluzione. Saper vedere il progetto nella sua completezza può aiutare di più delle regole prefissate.

Post correlati