[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