2012-02-03 2 views
0

J'essaie de développer une simple liste d'archives mensuelles pour le blog de mon site. J'ai tiré les enregistrements de la base de données, et maintenant j'ai juste besoin de les classer en conséquence de sorte qu'ils apparaissent ainsi:CodeIgniter - Archives mensuelles

<h4>February '12</h4> 

<ul> 
    <li>Article 1</li> 
    <li>Article 1</li> 
    <li>Article 1</li> 
</ul> 

<h4>January '12</h4> 

<ul> 
    <li>Article 1</li> 
    <li>Article 1</li> 
    <li>Article 1</li> 
</ul> 

Et ainsi de suite.

est ici la fonction de mon contrôleur qui tire les dossiers:

public function get_archives() 

{ 

    $query = $this->db->query(" 
     SELECT id, 
     title, 
     date_published 
     FROM blog_post 
     ORDER BY date_published DESC 
    "); 

    if ($query->num_rows() > 0) 

    { 

     return $query->result(); 

    } 

} 

Et j'ai ensuite transmis ces résultats à mon avis en utilisant les archives $. La valeur date_published renvoie un horodateur de par exemple 2012-01-13 18:39:53.

Quelle serait la meilleure approche à ce sujet?

Répondre

3

Comme vous les avez déjà triés dans un ordre chronologique, vous pouvez simplement les parcourir en boucle et imprimer l'en-tête chaque fois que la partie année-mois de la date change.

Exemple:

// get list of blog-items 
$archives = $this->get_archives(); 

$last_year_month = ""; 

// traverse items in foreach loop 
foreach($archives as $d) { 
    // extract year and month 
    $year_month = substr($d["date_published"], 0, 7); 

    // if year and month has changed 
    if ($year_month != $last_year_month) { 
    // if not the first heading, close previous UL 
    if ($last_year_month != "") echo "</ul>\n"; 

    $last_year_month = $year_month; 

    echo "<h4>" . date("M", mktime(0, 0, 0, intval(substr($year_month, 5, 2)) - 1, 1, 1970)) . " " . substr($year_month, 2, 2) . "</h4>\n"; 

    // opening UL for next list 
    echo "<ul>\n"; 
    } 

    echo " <li>" . $d["title"] . "</li>\n"; 
} 
// only print if an UL was opened 
if ($last_year_month != "") echo "</ul>\n"; 
+0

Parfait! Merci beaucoup! Une dernière question cependant. Comment puis-je convertir par exemple 2012-02 en Février '12? – Prefontaine

+0

J'ai modifié la réponse en conséquence. (S'il vous plaît tester si ça fonctionne.) –

+2

Très, très proche. J'ai dû modifier légèrement une ligne. echo "

". date ("F", mktime (0, 0, 0, intval (substr ($ year_month, 5, 2)) - 1, 1, 1970)). "". "'". substr ($ year_month, 2, 2). "

"; Merci beaucoup pour votre aide. Vous êtes une aubaine! – Prefontaine