Primer logotipo de SMC Dije que no iba a añadir nuevas "features" a SMC hasta no tener documentado todo el código escrito y reutilizado (también hay que documentarlo) hasta el momento, pero (siempre hay un pero) no he podido evitar liarme y liarme con algo que de todos modos tenía que hacer.

Al fin y al cabo tengo ya documentada algo más de la mitad de una de las clases más importantes de SMC, si no la más importante, como es la que hace las veces de "interfaz" con la base de datos, siempre que es posible. Así que hoy me he preguntado, ¿cómo implementar el asunto de los Feeds en SMC?

Y me he puesto a ello. Y si lo refiero aquí es porque creo que ha quedado relativamente bien. Incluso puedo decir que me he divertido haciéndolo, aunque, tampoco ha estado el asunto libre de algún "¿y ahora qué?", que, afortunadamente, creo haber sacado adelante.

Lo primero que me he planteado ha sido encontrar alguna clase para PHP que me ayudara a "escribir" los Feeds, y, la he encontrado en FeedCreator, escrita por Kai Blankenhorn (pronúnciese Blankenhorn :)

Sin embargo, aunque he comprobado que FeedCreator funciona, y no sólo eso, sino que tiene características más que interesantes (puede ser útil en un momento dado), se encuentra para PHP4, y, aunque podía usarla tal cual o "reescribirla" para PHP5 (es mucho decir "reescribirla", pero, vaya), digo, que, después de pensarlo un poco he creído conveniente construir para SMC su propia clase FeedCreator, evidentemente, mucho más sencilla. Y así lo he hecho.

Pero, lo sorprendente es que, después de algunas dificultades, más que nada porque no terminaba yo de aclararme con ciertos "concetos", resulta que el asunto ha sido relativamente sencillo, y, como he dicho, hasta en ciertos momentos gratificante. Verás porqué.

La clase FeedCreator que he escrito (o empezado a escribir) es muy sencilla, y, por el momento sólo genera feeds del formato RSS 2.0, también muy "sencillitos". Pero el gusto ha sido poder utilizar el mismo "sistema" que se usa en SMC para dar salida a cualquier petición por parte del usuario, es decir, poder usar el "loop de post" exactamente igual que hacen los temas de SMC.

No sólo el "loop de post" (¿invento de los chicos de WordPress?, yo cogí la idea de ahí, y de ahí pasé a crear también un "loop de comentarios"), sino que también hace uso la clase FeedCreator del "loop de comentarios" de SMC. ¿Qué significa esto? Pues que, el método "principal" de la clase FeedCreator de SMC queda tal que así:

(Queda tal que así por el momento, porque, evidentemente, está sujeto a cambios, y además, puede contener algún que otro problema del que no me hubiera percatado, al fin y al cabo, acabo de escribirlo.)

private function MakeFeed(){
  global $input, $query;
  $rootUrl = $input->GetRootUrl();
  $this->MakeFeedHeader();
  if($query->HavePosts()){
    while($query->HavePosts()){
      $query->GetPostData();
      $itemLink = StringsEx::AddWebSlash(
        $rootUrl.$query->GetPostPermalink()
      );
      if($query->IsSingle()){
        $feedItem = array(
          'link' => $itemLink,
          'title' => $query->GetPostTitle(),
          'description' => $query->GetPostContent(),
          'pubdate' => $query->GetPostDatetime()
        );
        $this->MakeFeedItem($feedItem);
        if($query->HaveComments()){
          $commentsCount = 0;
          while($query->HaveComments()){
            $query->GetCommentData();
            $commentID = $query->GetCommentID();
            if($query->IsCommentApproved()){
              $feedItem = array(
                'link' => $itemLink."#comment-{$commentID}",
                'title' => $query->GetCommentAuthorName(),
                'description' => $query->GetCommentContent(),
                'pubdate' => $query->GetCommentDateTime()
              );
              $this->MakeFeedItem($feedItem);
            }
            $commentsCount++;
            if($commentsCount >= 10){
              break;
            }
          }
        }
      }else{
        $feedItem = array(
          'link' => $itemLink,
          'title' => $query->GetPostTitle(),
          'description' => $query->GetPostContent(),
          'pubdate' => $query->GetPostDatetime()
        );
        $this->MakeFeedItem($feedItem);
      }
    }
  }else{
    $this->MakeNoPostItem();
  }
  $this->MakeFeedFooter();
  $this->PrintFeed();
  return true;
}

¿Verdad que es chulo? Bueno, a lo mejor a ti no te lo parece. Es igual. Disculpa esta inmodestia por mi parte. El caso es que SMC puede ahora "dar salida" a una petición en formato RSS. ¿Y cómo lo hace? Pues, sencillamente, añadiendo a cualquier petición el argumento "feed".

¿Qué quiere esto decir? Pues que, si quieres "suscribirte" a las últimas entradas en todo el sitio web y usas una URL como la siguiente para acceder al sitio:

http://www.misitioconsmc.com/

El feed con las últimas entradas se encuentra en:

http://www.misitioconsmc.com/feed/

Pero, todas estas URLs también servirían su correspondiente feed:

http://www.misitioconsmc.com/una-entrada/feed/
 
http://www.misitioconsmc.com/category/software/feed/
 
http://www.misitioconsmc.com/tag/delphi/feed/
 
http://www.misitioconsmc.com/search/tu+busqueda/feed/

¿Verdad que es chulo? Discúlpame otra vez. :) Con la particularidad de que cuando se solicita el feed de una entrada en concreto, o una página del sitio, el feed contendrá en su primer "item" el "contenido" de la entrada en cuestión, y los siguientes contendrán los comentarios a la entrada, si esta cuenta con ellos.

Esto último ha ido curioso, puesto que, si bien los comentarios de una entrada de SMC se muestran ordenados del más viejo al más nuevo, en el Feed había de darse lo contrario: los últimos comentarios tenían que aparecer en primer lugar. Je, je, je. Y bueno, pues, haciendo cierto cambio en un determinado método de la clase SmcDB... así es como se ordenan los comentarios cuando se trata de un Feed.

Además... bueno, ha sido una tontería, yo no creo en "esas cosas", pero, el caso es que cuando he ido a hacer la copia de seguridad "incremental" que llevo a cabo de SMC cada cierto tiempo, luego de haber estado con el asunto de los Feeds, resulta que a la copia de seguridad le ha correspondido el nombre: "SMC_051107f". O sea. :P

En feed... Creo que ha merecido la pena salirme de la tarea impuesta por mí mismo de no hacer nada más hasta no documentar lo hecho y bla, bla, bla. Pues sí. Tengo que hacerlo, y de hecho no he dejado de estar en ello, pero, tampoco se ha dado mal salirme un poco de la senda que yo mismo, ya digo, me había marcado.