Personalmente, non avrei aggiunto tutto quel codice non visibile alla pagina, solo per gestire due pulsanti. Io avrei fatto una questione più gestita da JS:
In PHP avrei generato la pagina senza i dati e fatto caricare gli script corretti:
codice:
<div id = "Articoli" class="Loading">
In Caricamento
</div>
Poi al caricamento della pagina, avrei lanciato un richiesta AJAX ad una pagina PHP per ottenere i dati nella giusta quantità in formato JSON (la stessa pagina l'avrei riutilizzata per ottenere i dati filtrati, con più o meno elementi).
Una volta ottenuti i dati in un formato usabile:
codice:
[
{
"id" : 1,
"title" : "Articolo 1",
"description" : "Questa è la descrizione dell'articolo",
"favourite" : true,
"score" : 4.5
}
{
"id" : 2,
"title" : "Articolo 2",
"description" : "Bla bla bla",
"favourite" : false,
"score": 2
}
.....
]
Quando ottieni una risposta JSON con una richiesta AJAX in jQuery, se gli passi il parametro dataType: 'json' nel costruttore, ottieni come argomento passato alla funzione di CallBack l'oggetto JS corrispondente ai dati passati.
Quindi otterresti l'array di dati da manipolare per creare la lista degli articoli, devi solo creare un format per gli articoli, in HTML fisso che andrai a popolare con i dati che ti servono.
Per esempio:
Codice PHP:
var obj; //Metti di avere il singolo oggetto articolo qui
var articolo = "<div class = \"Article\">";
articolo += "<div class = \"Title\">";
articolo += obj.title
articolo += "<a href=\"favourite.php?id="+obj.id+"&action="+(obj.favourite ? "add" : "remove")+"\" class = \"FavouriteToogler\">";
articolo += (obj.favourite ? "Aggiungi ai Favoriti" : "Rimuovi dai Favoriti") + "</a>";
articolo += "</div>";
articolo += "<div class=\"Description\">"+obj.description+"</div>";
articolo += "</div>";
$(articolo).appendTo('#Articoli');
Esegui questo su ogni articolo ritornato dalla richiesta AJAX e la lista è completata con i dati che ti servono. Infine, crei una funzione da applicare sugli elementi a.FavouriteToogler che blocchi l'evento onclick ed invii la richiesta ajax all'HREF dell'elemento chiamante. A seconda della risposta poi cambi il contenuto ed l'HREF del link in modo che sia sempre attivo e non necessiti di hide, show e cambiamenti eccessivi.