[opencms-dev] Solved: Automatic Recent News List

Salvador Santander dominion.salvador.ext at juntadeandalucia.es
Fri Aug 8 12:05:02 CEST 2003


If you want to have a channel in your site with the most recent news of
other channels, you must compile this class ( sorry by the spanish
comment... )
The use of this class is very easy, you must compile this class( substitute
the name of package ) and copy the classess generated by the compiler in the
directory occlasses/company/news/ . In the template you must write: <method
name="eGetRecentNewList">maxNumberOfNews, channel1, channel2....</method>
and you will obtein a list of recent news of these channels.

/*
 * RecentNewsTemplate.java
 *
 * Created on 7 de agosto de 2003, 11:54
 */

package company.news;

import com.opencms.modules.homepage.news.*;
import com.opencms.template.*;
import com.opencms.file.*;
import com.opencms.core.*;


import java.util.*;
import java.text.*;

/**
 * Clase que da soporte a la alimentación automática de un canal de
noticias.
 * Al utilizar esta clase el canal que se muestra es un resumen de las
noticias
 * más actuales de
 * @author  Salvador Santander Gutiérrez
 * @company dominion t.i. ( www.dominion.es )
 */
public class RecentNewsTemplate extends NewsTemplate
{

    /**
     * Clase que sirve para ordenar las noticias por fecha
     * @author  Salvador Santander Gutiérrez
     * @company dominion t.i. ( www.dominion.es )
     */
    private class NCDDateComparator implements Comparator
    {
        /***
         * Método para pasar la cadena a un objeto date
         * @param stringDate Cadena a analizar
         * @return Devuelve un objeto Date con la fecha en particular
         */
        private Date parseDate( String stringDate )
        {
            String spainMonth;
            String englishMonth;
            String correctStringDate = "";

            try
            {
                // Extraemos el mes
                spainMonth = stringDate.substring( 3, 6 ).toLowerCase();

                // Lo traducimos
                if ( spainMonth.equals( "ene" ) )
                    englishMonth = "jan";
                else if ( spainMonth.equals( "feb" ) )
                    englishMonth = "feb";
                else if ( spainMonth.equals( "mar" ) )
                    englishMonth = "mar";
                else if ( spainMonth.equals( "abr" ) )
                    englishMonth = "apr";
                else if ( spainMonth.equals( "may" ) )
                    englishMonth = "may";
                else if ( spainMonth.equals( "jun" ) )
                    englishMonth = "jun";
                else if ( spainMonth.equals( "jul" ) )
                    englishMonth = "jul";
                else if ( spainMonth.equals(  "ago" ) )
                    englishMonth = "aug";
                else if ( spainMonth.equals( "sep" ) )
                    englishMonth = "sep";
                else if ( spainMonth.equals(  "oct" ) )
                    englishMonth = "oct";
                else if ( spainMonth.equals( "nov" ) )
                    englishMonth = "nov";
                else if ( spainMonth.equals( "dic" ) )
                    englishMonth = "dec";
                else
                    englishMonth = spainMonth;

                correctStringDate = stringDate.substring( 0, 3 )
                + englishMonth + stringDate.substring( 6 );

                return new Date( correctStringDate );
            }
            catch ( Exception e )
            {
                throw new java.lang.RuntimeException( "Error ordenando fecha
pasada: " + stringDate + ", fecha traducida: " + correctStringDate );
            }
        }

        public int compare( Object obj1, Object obj2 )
        {
            NewsContentDefinition new1 = ( NewsContentDefinition ) obj1;
            NewsContentDefinition new2 = ( NewsContentDefinition ) obj2;

           Date date1 = parseDate( new1.getDate() );
           Date date2 = parseDate( new2.getDate() );

           return date2.compareTo( date1 );
        }
    }

    /***
     * Método para obtener las noticias más recientes de los canales que se
hayan pasado
     * por parametro
     * @param cms CmsObject Objeto para acceder a los recursos de opencms.
     * @param tagcontent Contenido de la etiqueta del método. Contiene los
canales que se quieren mostrar.
     *                   USO del método:
     *                   <method name=eGetRecentNewList>numNoticias, canal1,
canal2...</method>
     * @param doc Documento XML de la plantilla.
     * @param userObj Tabla hash con los parametros.
     * @return Devuelve una cadena con el codigo html de la lista de
noticias a mostrar
     * @throws CmsException
     */
     public Object eGetRecentNewsList( CmsObject cms, String tagcontent,
A_CmsXmlContent doc, Object userObject )
     throws CmsException
     {
         CmsXmlTemplateFile template = ( CmsXmlTemplateFile ) doc; //
Plantilla XML
         Vector channelNames = new Vector(); // Lista con los nombres de los
canales
                                             // de los que se quiere obtener
la lista
                                             // de noticias
         StringBuffer newsStringList = new StringBuffer();  // Lista de
todas las cadenas de noticias( en html )
         Vector actualChannelNewList = null;                // Lista de
noticias del canal actual
         Vector allNewList = new Vector();                  // Lista de las
noticias de todos los canales
         String actualChannelName;                          // Nombre del
canal que se está analizando
         NewsChannelContentDefinition actualChannel;        // Canal que se
está analizando
         int maxNumberOfNews = 4;                           // Numero de
noticias que se quieren obtener
         Iterator itChannelNames;                           // Iterador para
recorrer la lista de nombres de canales
         Iterator itAllNewList;                             // Iterador para
recorrer la lista de todas las noticias
         NewsContentDefinition actualNew;                   // Guarda el
contenido de la noticia actual

         // Analizamos el contenido de la etiqueta
         if ( !tagcontent.equals( "" ) )
         {
            StringTokenizer tagContentTokenizer = new StringTokenizer(
tagcontent, "," );

            if ( tagContentTokenizer.countTokens() >= 2 )
            {
                // Extraemos el numero de noticias máximo
                if ( tagContentTokenizer.hasMoreTokens() )
                {
                    try
                    {
                        maxNumberOfNews = Integer.valueOf(
tagContentTokenizer.nextToken().trim() ).intValue();
                    }
                    catch ( Exception e )
                    {
                        throw new java.lang.RuntimeException(
"[eGetRecentNewList]: Primer parámetro debe ser el número máximo de
noticias" );
                    }
                }

                // Ahora extraemos el numero de canales de los que se
quieren coger las noticias
                while ( tagContentTokenizer.hasMoreTokens() )
                {
                    actualChannelName =
tagContentTokenizer.nextToken().trim();
                    channelNames.add( actualChannelName );
                }
            }
            else
                throw new java.lang.RuntimeException( "[eGetRecentNewList]:
Debe de haber al menos dos parámetros: número de noticias y nombre de un
canal" );
         }
         else
             throw new java.lang.RuntimeException( "[eGetRecentNewList]:
Debe de haber al menos dos parámetros: número de noticias y nombre de un
canal" );

         itChannelNames = channelNames.iterator();

         while ( itChannelNames.hasNext() )
         {
             // Obtenemos el nombre del canal
             actualChannelName = ( String ) itChannelNames.next();

             // Obtenemos el canal
             actualChannel = new NewsChannelContentDefinition(
actualChannelName );

             // Obtenemos la lista de noticias
             actualChannelNewList = NewsContentDefinition.getNewsList( new
Integer( actualChannel.getIntId() ), "" + maxNumberOfNews );

             // Recorremos todas las noticias para insertarlas en la lista
de noticias
             for(int i = 0; i < actualChannelNewList.size(); i++)
             {
                 actualNew = ( NewsContentDefinition )
actualChannelNewList.elementAt(i);

                 // Lo añadimos a la lista de todas las noticias
                 allNewList.add( actualNew );
             }
         }

         // Ordenamos la lista para que las primeras sean las más recientes
         Collections.sort( allNewList, new NCDDateComparator() );

         // Recorremos todas las noticias para insertarlas en la cadena
resultado
         itAllNewList = allNewList.iterator();

         int numberOfNews = 0;

         while ( itAllNewList.hasNext() && ( numberOfNews <=
maxNumberOfNews ) )
         {
             actualNew = ( NewsContentDefinition ) itAllNewList.next();

             template.setData( "id"          , actualNew.getUniqueId(
null ) );
             template.setData( "headline"    , actualNew.getHeadline() );
             template.setData( "description" , actualNew.getDescription() );
             template.setData( "author"      , actualNew.getAuthor() );
             template.setData( "date"        , actualNew.getDate() );
             template.setData( "link"        , actualNew.getLink() );
             template.setData( "linkText"    , actualNew.getLinkText() );
             template.setData( "text"        , actualNew.getText() );
             template.setData( "channel"     , actualNew.getChannel() );
             template.setData( "a_info1"     , actualNew.getA_info1() );
             template.setData( "a_info2"     , actualNew.getA_info2() );
             template.setData( "a_info3"     , actualNew.getA_info3() );

             // "this" and "userObject" have to be passed here altough this
is not said in the documentation!!!
             String temp = template.getProcessedDataValue( "newsentry",
this, userObject);
             newsStringList.append( temp );

             numberOfNews++;
         }

         return newsStringList.toString();
     }
}




More information about the opencms-dev mailing list