jueves, 29 de abril de 2010

Popup para seleccionar lista

Alguna vez nos hemos preguntado como mostrar una propiedad que nos permita seleccionar una lista dentro de la site collection, de la misma forma que hace la content query webpart "CQWP". El siguiente post intentará mostrar como hacer esto:

Lo primero que se ha hecho es crear un editor part que carga un user control, este user control tendría que tener un textbox para añadir la url de la lista, y un botón que llame a un javascript, en nuestro caso "launchpicker" que nos permita mostrar el popup.



var lastSelectedListSmtPickerId = '';

function launchPicker(id) {

if (!document.getElementById) return;

var listurlfield = document.getElementById(id);
var defaulturl = '<%=SPContext.Current.Web.ServerRelativeUrl %>';

var url = defaulturl;

if (listurlfield != null && listurlfield.value != '') {
url = listurlfield.value.substring(0, listurlfield.value.lastIndexOf('/'));
}

var callback = function(results) {
if (results == null || results == undefined || results[1] == null || results[2] == null) return;

lastSelectedListSmtPickerId = results[0];
var listUrl = '/';
if (results[1].charAt(0) == '/') results[1] = results[1].substring(1);
listUrl = listUrl + results[1];
if (listUrl.substring(listUrl.length - 1) != '/') listUrl = listUrl + '/';
if (results[2].charAt(0) == '/') results[2] = results[2].substring(1);
listUrl = listUrl + results[2];
listurlfield.value = listUrl;
};

LaunchPickerTreeDialog('CbqPickerSelectListTitle', 'CbqPickerSelectListTitle', 'listsOnly', '', url, lastSelectedListSmtPickerId, '', '', '/_layouts/images/smt_icon.gif', '', callback);
}



Luego nuestra editor part tendría que cargar dinámicamente este user control que hemos creado, además ha de implementar los métodos Synchanges, de donde obtendremos el valor actual configurado en la webpart y el método ApplyChanges donde haremos un set de la propiedad de la webpart.



public class FooEditorPart: EditorPart
{
#region Fields

protected GetListUserControl editorUC;

#endregion

#region Constructor

public FooEditorPart(string webpartid)
{
this.ID = "FooEditorPart" + webpartid;
this.Title = "Link Editor";
}

#endregion

#region Overriden Methods

///
/// Create the controls
///

protected override void CreateChildControls()
{
base.CreateChildControls();

try
{
editorUC = (GetListUserControl)this.Page.LoadControl("~/_CONTROLTEMPLATES/GetListUserControl.ascx");

Controls.Add(editorUC);
}
catch (Exception ex)
{
LogHelper(ex)
}
}

///
/// Get the value from webpart
///

public override void SyncChanges()
{
EnsureChildControls();

WebpartFoo webPart = WebPartToEdit as WebpartFoo;
if (webPart != null)
{
editorUC.TbListUrl.Text = webPart.LinkList;
}
}

///
/// ApplyChanges in webpart
///

///
public override bool ApplyChanges()
{
EnsureChildControls();
WebpartFoo webPart = WebPartToEdit as WebpartFoo;
if (webPart != null)
{
webPart.LinkList= editorUC.TbListUrl.Text;
}
return true;
}

#endregion
}



Por último nuestra webpart tendrá que tener una propiedad string con el atributo WebBrowsable(false), y tendrá que implementar la interfaz IWebEditable, esto nos obliga a implementar el método CreateEditorParts, donde añadiremos nuestro nuevo editor part, y la propiedad WebBrowsableObject.



public class WebpartFoo: WebPart, IWebEditable
{
#region Properties

[Personalizable(PersonalizationScope.Shared)]
[WebBrowsable(false)]
public string LinkList { get; set; }

#endregion

#region Default Constructor
public WebpartFoo()
{
ExportMode = WebPartExportMode.All;
}

#endregion


#region IWebEditable Members

EditorPartCollection IWebEditable.CreateEditorParts()
{
List editors = new List();

// Add the base editor parts
EditorPartCollection baseParts = base.CreateEditorParts();
foreach (EditorPart basePart in baseParts)
editors.Add(basePart);

editors.Add(new FooEditorPart(this.ID));
return new EditorPartCollection(editors);
}

object IWebEditable.WebBrowsableObject
{
get { return this; }
}

#endregion

}



A partir de aquí ya podriamos usar nuestra lista seleccionada, cómo curiosidad, remarcar que el popup al obtener la url de la lista no le añade el /Lists ni la url correcta de la lista, sino que le añade el title de la lista, por lo que para poder desde codigo obtener la lista podriamos hacer algo como lo siguiente:



private void foo()
{
if (!String.IsNullOrEmpty(LinkList))
{
string UrlWeb = LinkList.Substring(0, LinkList.LastIndexOf("/"));
string ListName = LinkList.Substring(LinkList.LastIndexOf("/") + 1);

using (SPWeb web = SPContext.Current.Site.OpenWeb(UrlWeb))
{
SPList list = web.Lists[ListName];

// TODO
}
}
}

viernes, 16 de abril de 2010

Crear exclude crawling rules programmatically

Añadir "exclude crawling rules" es muy sencillo.

Los pasos a seguir serían los siguiente:

1. Obtener el Search Context

//get the site SSP's search server instance
SearchContext searchContext = SearchContext.GetContext(site);

2. Obtener el Content Source

//get the content source for the search server
Content sspContent = new Content(searchContext);

3. Añadir la crawl rule a la colección de crawlrules del content source

string rule = "http://*/forms/*";
//create the crawl rule, setting the type of crawl rule and the crawl rule string
CrawlRule crawlRule = sspContent.CrawlRules.Create(CrawlRuleType.ExclusionRule, rule);

4. Añadir propiedades

crawlRule.FollowComplexUrls = true;

5. Commit la regla en la base de datos

//commit the rule in the database
crawlRule.Update();


Esta información ha sido extraída del siguiente blog:

http://blog.richfinn.net/blog/2008/06/19/CreateSearchCrawlRulesProgrammatically.aspx

martes, 13 de abril de 2010

FORO DE ARQUITECTOS BARCELONA

El próximo 13 de Mayo se hará en Barcelona un FORO DE ARQUITECTOS, donde entre otras cosas se presentará la propuesta Arquitectura DDD N-Layer.

Podéis registraros en siguiente link:

http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032446174&Culture=es-ES

jueves, 8 de abril de 2010

SharePoint fields objects

A continuación se muestra una tabla donde se definen los diferentes nombres de classe para cada tipo de datos de MOSS 2007, esta información ha sido extraida del siguiente blog:

http://www.tonstegeman.com/Blog/Lists/Posts/Post.aspx?List=70640fe5%2D28d9%2D464f%2Db1c9%2D91e07c8f7e47&ID=32


miércoles, 7 de abril de 2010

Evitar pop-up warning al editar un item

Hoy me he encontrado un problema al editar un item, este item tiene un custom field que hace postback, y al hacerlo me aparece el siguiente mensaje:





Si pulsamos cancelar no hay problema, pero al pulsar OK, esto implica que aparezca el siguiente error al intentar luego guardar el item.






La solución la he extraido de una respuesta de un conocido amigo (Edin Kapic) en un foro. Añado enlace al post original: http://social.msdn.microsoft.com/Forums/es-ES/mossdeves/thread/3d46ab13-b821-4f31-939a-678eb30be81f



El problema viene dado que cuando tenemos la feature de publishing activada, se añade un javascript que nos controla cuando estamos en edición y nos pregunta antes de salir de la página, si queremos guardar los cambios.



La solución es desactivar la feature de publishing o añadir un tag script en nuestra página donde ponga la variable g_bWarnBeforeLeave a false, ya que es esta variable por la que pregunta el javascript antes mencionado.