Internet Information Services is not installed. You must have Internet Information Services installed in order to use the SharePoint Products and Technologies Configuration Wizard
Sí alguna vez han obtenido este error al momento de instalar SharePoint 2007 sobre Windows Server 2008 R2, la solución es sumamente sencilla. Solo se necesita agregar el servicio "IIS Management Compatibility" al role de "Web Server IIS". ¿Y que como se hace esto?. A continuación descrito con imágenes.
viernes, 28 de mayo de 2010
viernes, 14 de mayo de 2010
SharePoint 2010 SDK y Language Pack's
Justo lo que dice en el título amigos míos, ya está disponible para su descarga el SDK de SharePoint 2010, asi como el language pack para SharePoint Foundation y el language pack para SharePoint 2010.
La mecánica de instalación de los paquetes de idiomas es la misma que la descrita en mi post anterior: Instalando Language Pack's en SharePoint 2010
Sin duda, recursos de básicos para conocer a fondo SP 2010.
La mecánica de instalación de los paquetes de idiomas es la misma que la descrita en mi post anterior: Instalando Language Pack's en SharePoint 2010
Sin duda, recursos de básicos para conocer a fondo SP 2010.
Etiquetas:
Desarrollo SharePoint,
Language Pack's,
SharePoint 2010
jueves, 13 de mayo de 2010
Propiedad CustomProperty del PeoplePicker
Una vez que ya sabemos cómo extender la funcionalidad del peoplepicker. Hay un tópico que es de mucha utilidad para darle mayor poder a nuestro control.
¿Qué pasa si queremos enviarle un dato a nuestro control para utilizarlo dentro la lógica de recuperación, filtrado y presentación de datos?
Pues en estos casos existe la propiedad CustomProperty de tipo string que heredamos de EntityEditorWithPicker, y que podemos utiizar para propósitos diversos.
Escenario:
En mi caso, yo necesitaba excluir a algunos usuarios (sin ninguna relación preestablecida). Por lo que al instanciar el control CustomPeoplePicker asignaba en una cadena separada por comas, los usuarios que no podían ser seleccionados en el control.
Acto seguido recuperaba la propiedad en el método OnLoad de la clase CustomPickerDialog que deriva de PickerDialog.
Dejo el codigo completo de la solución para mayor referencia.
Happy coding!
¿Qué pasa si queremos enviarle un dato a nuestro control para utilizarlo dentro la lógica de recuperación, filtrado y presentación de datos?
Pues en estos casos existe la propiedad CustomProperty de tipo string que heredamos de EntityEditorWithPicker, y que podemos utiizar para propósitos diversos.
Escenario:
En mi caso, yo necesitaba excluir a algunos usuarios (sin ninguna relación preestablecida). Por lo que al instanciar el control CustomPeoplePicker asignaba en una cadena separada por comas, los usuarios que no podían ser seleccionados en el control.
protected override void CreateChildControls() { if (!_error) { try { base.CreateChildControls(); Blog.WebControls.CustomPeoplePicker picker = new Blog.WebControls.CustomPeoplePicker(); picker.CustomProperty = "juan.topo@contoso.com"; picker.ID = "customPicker1"; // Your code here... this.Controls.Add(picker); } catch (Exception ex) { HandleException(ex); } } }
Acto seguido recuperaba la propiedad en el método OnLoad de la clase CustomPickerDialog que deriva de PickerDialog.
protected override void OnLoad(EventArgs e) { CustomQueryControl control = (CustomQueryControl)this.QueryControl; control.ExcludedUsers = this.Page.Request.QueryString["CustomProperty"]; base.OnLoad(e); }Como se puede observar, el parámetro que establecimos previamente, es pasado en el querystring hacia el PickerDialog con el key "CustomProperty". Una vez recuperado podemos asignarlo a alguna propoedad propia para ser utilizada posteriormente.
Dejo el codigo completo de la solución para mayor referencia.
Happy coding!
Etiquetas:
Desarrollo SharePoint,
PeoplePicker,
SharePoint
miércoles, 12 de mayo de 2010
Tercer Simposio Latinoamericano de SharePoint en México
Si, de nuevo este año se llevará a cabo el Simposio latinoamericano de SharePoint en México, (el tercero). Por lo que es de mi mayor agrado invitarlos a que asistan y conozcan un poco más de las nuevas caracteristicas que vienen en SP 2010.
Me permito citar la información proporcionada en el blog de Luis Du Solier.
SharePoint 2010, La nueva plataforma de productividad para la empresa y la Web
La Comunidad de SharePoint México y Microsoft, te invitan al tercer Simposio Latinoamericano de SharePoint en la Ciudad de México. En este evento contaremos con grandes expositores de Latinoamérica y de Estados Unidos quienes compartirán con nosotros las mejores prácticas y recomendaciones así como las ventajas y beneficios de la versión de SharePoint 2010
La cita es
Fecha: jueves 3 de junio
Lugar: Hacienda de los Morales
Dirección: Vázquez de Mella 525 Col. Del Bosque, Polanco, 11510 México D.F.
Tel. (55) 5283 30 54 / 55
Horario: 8 am a 8 pm (por la mañana Developers, tarde IT Pro). Les invitamos a que lleguen a partir de las 8 de la mañana para el registro (no olviden llevar sus hojas de registro)
Consulta la agenda y Regístrate aquí
Etiquetas:
Eventos SharePoint,
SharePoint 2010
jueves, 6 de mayo de 2010
Extendiendo el control PeoplePicker
Ahora presentaré un pequeño ejemplo de cómo se puede extender el control People Picker, que tanto gusta a los usuarios, pero que en ciertos escenarios (siempre habrá un usuario anormal) no satisface los requerimientos funcionales al cien por ciento, lo que nos llevará irremediablemente a tirar código.
Al final de esta demostración nos daremos cuenta que al extender este control podemos realizar búsquedas sobre diferentes objetos y/o diferentes fuentes de datos, porque este control no está casado con objetos de tipo SPUser como se podría pensar en primera instancia.
Sin más, pasemos al código.Para poder extender la funcionalidad de este control, basicamente tenemos que heredar de tres clases: EntityEditorWithPicker, PickerDialog y SimpleQueryControl.
Dejemos que el código se explique solo :)
Happy Coding!
Al final de esta demostración nos daremos cuenta que al extender este control podemos realizar búsquedas sobre diferentes objetos y/o diferentes fuentes de datos, porque este control no está casado con objetos de tipo SPUser como se podría pensar en primera instancia.
Sin más, pasemos al código.Para poder extender la funcionalidad de este control, basicamente tenemos que heredar de tres clases: EntityEditorWithPicker, PickerDialog y SimpleQueryControl.
Dejemos que el código se explique solo :)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.WebControls; using System.Collections; using Microsoft.SharePoint; namespace Blog.WebControls { public class CustomPeoplePicker : EntityEditorWithPicker { protected bool m_onInitCalled; protected string m_commaSeparatedAccountsDelayedUntilOnInit; public CustomPeoplePicker() { } protected override void OnInit(EventArgs e) { base.OnInit(e); //definimos el tipo del PickerDialog this.PickerDialogType = typeof(CustomPickerDialog); this.m_onInitCalled = true; if (!string.IsNullOrEmpty(this.m_commaSeparatedAccountsDelayedUntilOnInit)) { base.UpdateEntities(this.GetAccountsEntities(this.m_commaSeparatedAccountsDelayedUntilOnInit)); this.m_commaSeparatedAccountsDelayedUntilOnInit = null; } } ////// Devuleve la lista de usuarios seleccionados en forma de cadena /// /// ///private string GetResolvedEntityAccounts() { if (this.ResolvedEntities == null) { return string.Empty; } if (this.ResolvedEntities.Count == 0) { return string.Empty; } List names = new List (); string list = string.Empty; foreach (PickerEntity entity in this.ResolvedEntities.OfType ()) { names.Add(entity.Key); } list = string.Join(this.EntitySeparator.ToString(), names.ToArray()); return list; } protected ArrayList GetAccountsEntities(string commaSeparatedAccounts) { ArrayList list = new ArrayList(); if (commaSeparatedAccounts != null) { foreach (string str in commaSeparatedAccounts.Split(new char[] { this.EntitySeparator }, StringSplitOptions.RemoveEmptyEntries)) { string str2 = str.Trim(); if (!string.IsNullOrEmpty(str2)) { PickerEntity entity = new PickerEntity(); entity.Key = str2; list.Add(entity); } } } return list; } /// /// Valida las entidades /// /// ///public override PickerEntity ValidateEntity(PickerEntity needsValidation) { needsValidation.IsResolved = false; ; CustomQueryControl c = new CustomQueryControl(); foreach (CustomUser user in c.GetPeople()) { if (needsValidation.Key.Equals(user.EmployeeNumber, StringComparison.InvariantCultureIgnoreCase)) { needsValidation.IsResolved = true; } } return needsValidation; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.WebControls; using System.Collections; namespace Blog.WebControls { public class CustomPickerDialog : PickerDialog { public CustomPickerDialog() : base(new CustomQueryControl(), new TableResultControl(), new CustomPeoplePicker()) { ArrayList columnDisplayNames = ((TableResultControl)base.ResultControl).ColumnDisplayNames; columnDisplayNames.Clear(); columnDisplayNames.Add("Employee Number"); columnDisplayNames.Add("Email"); columnDisplayNames.Add("Name"); ArrayList columnNames = ((TableResultControl)base.ResultControl).ColumnNames; columnNames.Clear(); columnNames.Add("EmployeeNumber"); columnNames.Add("Email"); columnNames.Add("Name"); ArrayList columnWidths = ((TableResultControl)base.ResultControl).ColumnWidths; columnWidths.Clear(); columnWidths.Add("20%"); columnWidths.Add("30%"); columnWidths.Add("50%"); } protected override void OnLoad(EventArgs e) { CustomQueryControl control = (CustomQueryControl)this.QueryControl; base.OnLoad(e); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.WebControls; using System.Data; namespace Blog.WebControls { public class CustomQueryControl : SimpleQueryControl { public CustomQueryControl() { Load += CustomQueryControl_Load; } void CustomQueryControl_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { EnsureChildControls(); mColumnList.Items.Add("EmployeeNumber"); mColumnList.Items.Add("Name"); mColumnList.Items.Add("Email"); } } protected override int IssueQuery(string search, string groupName, int pageIndex, int pageSize) { CustomUser[] usersAux = this.GetPeople(); if (usersAux == null) return 0; ListallPeople = new List (usersAux); if (allPeople.Count == 0) return 0; List searchPeople = new List (); DataTable resultTable = null; searchPeople = allPeople; if (groupName == "Name" && !string.IsNullOrEmpty(search)) { searchPeople = allPeople.Where(x => SearchString.Match(x.Name, search)).ToList(); } else if (groupName == "Email" && !string.IsNullOrEmpty(search)) { searchPeople = allPeople.Where(x => SearchString.Match(x.Email, search)).ToList(); } resultTable = GetPeopleTable(searchPeople.ToArray()); PickerDialog.Results = resultTable; PickerDialog.ResultControl.PageSize = resultTable.Rows.Count; return resultTable.Rows.Count; } private DataTable GetPeopleTable(CustomUser[] people) { DataTable dummyTable = new DataTable(); dummyTable.Columns.Add("EmployeeNumber"); dummyTable.Columns.Add("Name"); dummyTable.Columns.Add("Email"); foreach (CustomUser person in people) { DataRow row1 = dummyTable.NewRow(); row1["Name"] = person.Name; row1["EmployeeNumber"] = person.EmployeeNumber; row1["Email"] = person.Email; dummyTable.Rows.Add(row1); } return dummyTable; } string _excludedUsers; public string ExcludedUsers { get { return this._excludedUsers; } set { this._excludedUsers = value; } } public virtual CustomUser[] GetPeople() { List people = new List (); //agregar toda la logica necesaria para obtener los usuarios people.Add(new CustomUser() { EmployeeNumber = "11111", Email = "juan.topo@contoso.com", Name ="Juan G. Topo" }); people.Add(new CustomUser() { EmployeeNumber = "22222", Email = "max.power@contoso.com", Name = "Max Power" }); people.Add(new CustomUser() { EmployeeNumber = "33333", Email = "bambi.venado@contoso.com", Name = "Venado Bambi" }); people.Add(new CustomUser() { EmployeeNumber = "44444", Email = "homero.simpson@contoso.com", Name = "Homero J. Simpson" }); return people.ToArray(); } public override PickerEntity GetEntity(DataRow dr) { PickerEntity entity = new PickerEntity(); entity.DisplayText = dr["Name"].ToString(); entity.Key = dr["EmployeeNumber"].ToString(); entity.Description = dr["Email"].ToString(); entity.IsResolved = true; return entity; } } }
Happy Coding!
Etiquetas:
Desarrollo SharePoint,
PeoplePicker,
Web parts
Suscribirse a:
Entradas (Atom)