Tutorial
Hacer un SelectWidget dinámico
09/04/2007

Para hacer un SelectWidget que recupere valores de la Base de Datos, debemos crear una clase nueva, hermana de CmsSelectWidget.

Código:
import org.opencms.db.CmsDbPool;

import org.opencms.db.generic.CmsSqlManager;
import org.opencms.file.CmsObject;
import org.opencms.widgets.A_CmsSelectWidget;
import org.opencms.widgets.I_CmsWidget;
import org.opencms.widgets.I_CmsWidgetDialog;
import org.opencms.widgets.I_CmsWidgetParameter;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;


public class CmsSelectDatabaseWidget extends A_CmsSelectWidget {

/**
* Creates a new select widget.<p>
*/
public CmsSelectDatabaseWidget() {

// empty constructor is required for class registration
super();
}

/**
* Creates a select widget with the select options specified in the given configuration List.<p>
*
* The list elements must be of type <code>{@link CmsSelectWidgetOption}</code>.<p>
*
* @param configuration the configuration (possible options) for the select widget
*
* @see CmsSelectWidgetOption
*/
public CmsSelectDatabaseWidget(List configuration) {

super(configuration);
}

/**
* Creates a select widget with the specified select options.<p>
*
* @param configuration the configuration (possible options) for the select box
*/
public CmsSelectDatabaseWidget(String configuration) {

super(configuration);
}

/**
* @see org.opencms.widgets.I_CmsWidget#getDialogWidget(org.opencms.file.CmsObject, org.opencms.widgets.I_CmsWidgetDialog, org.opencms.widgets.I_CmsWidgetParameter)
*/
public String getDialogWidget(CmsObject cms, I_CmsWidgetDialog widgetDialog, I_CmsWidgetParameter param) {

String id = param.getId();
StringBuffer result = new StringBuffer(16);

result.append("<td class=\"xmlTd\" style=\"height: 25px;\"><select class=\"xmlInput");
if (param.hasError()) {
result.append(" xmlInputError");
}
result.append("\" name=\"");
result.append(id);
result.append("\" id=\"");
result.append(id);
result.append("\">");

// get select box options from default value String
ArrayList options = new ArrayList();
ArrayList options_values = new ArrayList();

//accedemos a base de datos para obtener las opciones
CmsSqlManager manager = new CmsSqlManager();
java.sql.Connection con;
try {
con = manager.getConnection(CmsDbPool.getDefaultDbPoolName());

PreparedStatement stmt = manager.getPreparedStatementForSql(con,"select codigo, name from people");
ResultSet rs;
rs = stmt.executeQuery();

while (rs.next()) {
options_values.add(rs.getString(1));
options.add(rs.getString(2));
}
rs.close();
stmt.close();

con.close();

} catch (SQLException e) {
e.printStackTrace();
}

String selected = getSelectedValue(cms, param);
for(int i=0; i<options.size(); i++){
// create the option
result.append("<option value=\"");
result.append(options_values.get(i));
result.append("\"");
if ((selected != null) && selected.equals((String)options_values.get(i))) {
result.append(" selected=\"selected\"");
}
result.append(">");
result.append(options.get(i));
result.append("</option>");
}

result.append("</select>");
result.append("</td>");

return result.toString();
}

/**
* @see org.opencms.widgets.I_CmsWidget#newInstance()
*/
public I_CmsWidget newInstance() {

return new CmsSelectDatabaseWidget(getConfiguration());
}
}

Elías Gago