lunes, 16 de diciembre de 2013

Entendiendo las diferentes ribbons en Sharepoint 2010

En el post Cómo añadir un boton personalizado a la ribbon en Sharepoint 2010, os enseñe cómo se añadia un botón personalizado a una ribbon y os di un pequeño truco para poder localizar la ribbon en la que queremos añadir el botón.

Bien, en este post os detallare donde se localiza cada ribbon para que asi os sea mas fácil encontrar la 'ruta'.

Si entramos en una lista ya creada en Sharepoint 2010 Designer, en la ribbon superior veremos un botón desplegable llamado CustomAction, al hacer click se deplegara y veremos esto:

Vale, estas són todas las opciones que tenemos para añadir un botón a la ribbon, cada opción pertenece a una ribbon distinta donde visualizaremos nuestro botón. Aqui os lo detallos:

List Item Menu: es el menu contextual de cada item de lista, ahi se nos mostrará este botón.
Display Form Ribbon: el botón se muestra al visualizar un item de una lista.
Edit Form Ribbon: el botón se muestra al editar un item de una lista.
New Form Ribbon: el botón se muestra al añadir un item de una lista.
View Ribbon: se muestra al seleccionar uno o varios items de una lista.

Saludos y espero que les haya servido.


miércoles, 11 de diciembre de 2013

Cómo cambiar la contraseña de un usuario de active directory desde Sharepoint 2010

En este post os voy a enseñar a cómo cambiar la cantraseña de un usuario de active directory. Eso si, utilizando .NET Framework 3.5.

Primero de todo definiremos la función que hara que un usuario pueda cambiarse la contraseña:

 using System.DirectoryServices.AccountManagement;  
 public static string ChangePassword(string adminUser, string adminPassword,  
   string domain, string container, string userName, string newPassword)  
 {  
   try  
   {  
     PrincipalContext principalContext =   
       new PrincipalContext(ContextType.Domain, domain, container,   
         adminUser, adminPassword);  
     UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, userName);  
     if (user == null) return "El usuario no existe";  
     user.SetPassword(newPassword);  
     return user.Name;  
   }  
   catch (Exception ex)  
   {  
     return ex.Message;  
   }  
 }  

Como veis, primero de todo creamos un objecto de tipo PrincipalContext que lo utilizaremos simplemente para buscar el usuario, para que lo encuentre en nuestro site.
A continuación vamos a buscar el usuario con un objecto UserPrincipal pasandole el principalContext y el nombre del usuario conectado (en el caso que sea el Admin que quiera cambiar el pass de un user, le tendra que pasar el login name del user, se entiende...).

Y finalmente la llamada seria asi:

 ChangePassword(@"DOMAIN\Administrator", "password", "DOMAIN",  
  "DC=Domain,DC=COM", userName, newPassword);  

Si veis, como container le paso "DC=CONTOSO,DC=COM", el primer DC es el nombre del servidor y el segundo creo que es el dominio web, pero os lo podria asegurar.

Y como dominio solamente es pasarle el nombre de dominio en el qual esta el servidor.

Para no tener que ir pasando el nombre y pass del Admin, recomiendo tener 2 parametros en el web.config que contenga estos 2 datos.

Espero que os haya ayudado,
Saludos.

martes, 10 de diciembre de 2013

Cómo redirigir a una página de nuestro site desde una webpart sandboxed solution.

Uno de los inconvenientes y limitaciones que tenemos en una webpart que se 'deployara' como Sandboxed solution es que no tenemos privilegios para utilizar el Response.Redirect() y tampoco el ScriptManager (nos impide llamar a un script desde servidor).

El único truco que me sirvió para re-dirigir a una página fue este:

Primero tenemos que crear un control asp:Literal en nuestra .acsx

<asp:Literal ID="litRedirect" runat="server" />

Lo segundo que tendremos que hacer, desde codebehind, sera añadirle al atributo text un script que tenga simplemente un location.href.

SPWeb web = SPContext.Current.Web;
string url = web.Url + "/Lists/TuLista/AllItems.aspx";
litRedirect.Text = "<script type='text/javascript'>top.location.href = '"+url+"';</script>";

Bueno yo aquí hago un top.location.href=""; porque quería re-dirigir desde un popup, y sharepoint es tan listo que si haces un windows.location, te abre otro popup con la url.

Parece una tontería pero a mi me llevo rato saber el porque me abría la url en otro popup.

Espero que os haya servido.

Saludos.





Cómo desactivar el customError en sharepoint.

En este post os voy ha enseñar cómo desactivar el horrible mensaje de error que tiene por defecto sharepoint.



Para cambiar los parámetros que nos hará que podamos capturar y ver el error nos tenemos que ir al web.config. Pero ojo, tenemos dos web.config que configurar.

El primero reside en:
 C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config

En este tendremos que modificar para que nos quede de la siguiente manera:

  1. <customErrors mode=”Off” /> 
  2. <SafeMode MaxControls=”200″ CallStack=”true” DirectFileDependencies=”10″  TotalFileDependencies=”50″ AllowPageLevelTrace=”false”>
  3. <compilation batch=”false” debug=”true” optimizeCompilations=”true”>
El segundo reside en:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\web.config

En este tendremos que modificar para que nos quede de la siguiente manera:
  1. <customErrors mode=”Off” />

Y con esto ya podríamos ver capturados los errores. No os olvides de hacer un iisreset.

Saludos.

viernes, 6 de diciembre de 2013

Cómo añadir un boton personalizado a la ribbon en Sharepoint 2010

En este post os voy a explicar de la manera mas fácil que se, cómo añadir un botón a una ribbon de sharepoint.

Dejadme que os haga una previa explicación de cómo lo hice yo. Primero de todo lo hice con un Proyecto Sharepoint 2010 de tipo Sandboxed Solution, este tipo de soluciones son un poco más complicadas ya que tienen muchas restricciones. Decir también que es aconsejable trabajar con el Visual Estudio 2010.

Aquí una referencia de las capacidades y limitaciones de una Sandbox Solution:  http://msdn.microsoft.com/en-us/library/ee231562.aspx

Primero de todo vamos a crear un Empty Sharepoint Project, y cuando hagamos click a Ok nos aparecerá esta pantalla, aquí es donde le tenemos que decir que deploye como una Sandboxed solution.


Una vez tengamos el proyecto creado, añadiremos un Empty Element que sera el elemento que contenga el código del botón. 


Ahora empezaremos a picar código ;).

Abrimos el elemento que hayamos creado, recomendable re-nombrarlo, y nos damos cuenta que es XML. Yo lo he re-nombrado CustomButton.xml.

En este primer paso solo os explicare a añadir el botón en un grupo de la ribbon existente. Para saber en que grupo hay dos truquillos:

  1. Podemos mirar en el XML de nuestro sharepoint donde están ya definidos todos los botones de la ribbon: {SharePoint Root}\TEMPLATE\GLOBAL\XML\CMDUI.XML. A mi me fue realmente útil.
  2. Tambien podemos ir al Sharepoint 2010 designer, y en una lista que hayamos creado por defecto le podemos añadir un botón (Action)  y mirar donde nos lo localiza.

Ahora si, una vez hemos abierto el CustomButton.xml, le insertamos este código que añadira un boton que se vera en la ribbon de cuando tenemos un elemento seleccionado de una lista.


 <
CustomAction Id="Ribbon.ListItem.Custom1"  
          Location="CommandUI.Ribbon.ListView"  //Este atributo hace referencia a la ribbon donde se añadira el botón, hay varias                      ribbons.
          RegistrationId="100"  //Le podemos asignar el botón para que se vea solo en un content type o en una lista.
          RegistrationType="List"  
          Rights="ApproveItems">  //Permisos que se le asignaran al botón.
   <CommandUIExtension>  
    <CommandUIDefinitions>  
     <CommandUIDefinition Location="Ribbon.ListItem.Workflow.Controls._children"> //Le indicamos en que grupo de la ribbon se vera.  
      <Button Id="Ribbon.ListItem.Workflow.Approve"  
          Command="ApproveItems"  //Referencia al CommandUIHandler.
          Image16by16="SiteAssets/Approve16.png"  
          Image32by32="SiteAssets/Approve32.png"  
          TemplateAlias="o2"  
          LabelText="Approve"  
          Alt="Approve"  
          ToolTipTitle="Approve Displayer"  
          ToolTipDescription="Approve items."  
          Sequence="10"  
          CommandType="General"/>  
     </CommandUIDefinition>  
    </CommandUIDefinitions>  
    <CommandUIHandlers>  
     <CommandUIHandler  
      Command="ApproveItems"  //Identificador que se usara en el Command del botón.
      EnabledScript="javascript: Enable();"  //Permite asignarle un script para decidir cuando activar el botón.
      CommandAction="javascript: ApproveSelectedItemsId();" />  //Permite asignarle una función o una url. 
    </CommandUIHandlers>  
   </CommandUIExtension>  
  </CustomAction>  

Para tener una mayor referencia de todos los atributos de todos los elementos que interfieren en la creación de un botón, os dejo este enlace: http://msdn.microsoft.com/en-us/library/ms460194.aspx

Es muy importante que tengáis muy claro en que ribbon queréis que os salga el botón y en que grupo de botones de la ribbon, por experiencia crea bastante confusión.

Para poder tener un script con todas las funciones que llamemos desde el CommanUIHandler, simplemente tendremos que añadir otro CustomAction:


 <CustomAction  
   Id="ApproveItems.Script"  //Id acompañado de .Script para tipo script.
   Location="ScriptLink"  //ScriptLink para tipo script, solo he usado este metodo.
   ScriptSrc="~Site/SiteAssets/CustomButtonsScript.js" Sequence="100"></CustomAction>  

Si os fijáis en las url tanto del script como de las imágenes, apuntan a SiteAssets que es simplemente la carpeta que se muestra en nuestro site desde el Sharepoint 2010 designer. No me digáis porque pero para el script es necesario poner ~Site/ delante, sino no lo encuentra.

Y con este ya podríais ver el botón en la ribbon. Pero hay diferentes ribbons en nuestro sharepoint y no me quedaría tranquilo si no os enseñara cuales hay. Pero os lo voy a explicar en otro post para que no se os haga tan largo.

Aqui os dejo una imagen del Sharepoint 2010 designer en el momento que se crea una Action o botón en una lista. Para que os lo podáis tomar como ejemplo. En las settings del Action veréis la location de la ribbon.


Espero que os haya ayudado un poco, ya que de explicar es algo complicado.

Saludos.

miércoles, 4 de diciembre de 2013

Cómo realizar consultar a SQLite en Android

En el post anterior os enseñe cómo crear una BD SQLlite en Android, bien pues en este post os voy a enseñar como realizar consultas.

Ya sabéis que quien se sepa manejar con cualquier lenguaje de Base de Datos, os resultara realmente fácil.

Para realizar consultas os seran necesarias estos 2 imports:

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

Una vex tengamos el proyecto creador con la clase BDHelper del post anterior, en la MainActivity podremos recuperar todos los datos de una tabla de la siguiente manera:


 
public DBHelper dbh;  
public SQLiteDatabase db; 

 
dbh = new DBHelper(this,"BD");  
db = dbh.getReadableDatabase();  

Cursor c1 = db.rawQuery("select * from table", null);  
 while(c1.moveToNext()){  
      Log.d("APP", ">" + c1.getInt(c1.getColumnIndex("column1")));  
      Log.d("APP",">" + c1.getInt(c1.getColumnIndex("column2")));  
      Log.d("APP",">" + c1.getString(c1.getColumnIndex("column3")));  
 }  

Primero tendremos que crear los objectos que nos abran la conexion a la base de datos: dbh y db. Es muy sencillo.

Luego, en un objecto Cursor le asignaremos la query a partir del metodo que nos ofrece db.rawQuery().

Y por ultimo, solo tendremos que recorrer el Cursor con la sencilla instrucción moveToNext().

Y con este sencillo bucle recuperaremos toda la info de una tabla.

Cómo crear la Base de Datos SQLite de Android

En este post os voy a enseñar cómo empezar a usar la base de datos interna de android SQLite.
Ya no explico que antes de todo crear la MainActivity ya que al crear un nuevo proyecto es automático.
Primero de todo tendremos que crear la base de datos, para ello necesitamos una clase que extienda de SQLiteOpenHelper, que es la clase que nos dará servicio a SQLite. El metodo onCreate se lanzara siempre y cuando la BD no este creada, y el onUpgrade si os digo al verdad no lo he utilizado aun.  Como veis el script que incorpora el execSQL, es muy sencillo, no hay nada de nuevo con SQL.
 public class DBHelper extends SQLiteOpenHelper{  
 public DBHelper(Context context, String name) {  
  super(context, name, null, 1);  
  // TODO Auto-generated constructor stub  
  }  
 @Override  
  public void onCreate(SQLiteDatabase db) {  
  // TODO Auto-generated method stub  
  try {  
  // Creación directa de una tabla  
  db.execSQL("CREATE TABLE ejemplo( "+  
  "id INTEGER PRIMARY KEY AUTOINCREMENT, "+  
  "campo1 INTEGER, "+  
  "campo2 INTEGER,"+  
  "campo3 TEXT" +  
  ");" );  
  }  
  catch(Exception e){  
 //TODO capturar error.  
  }  
  }  
 @Override  
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  // TODO Auto-generated method stub  
  db.execSQL("DROP TABLE IF EXISTS ejemplo");  
  // Cridem a la creació  
  onCreate(db);  
  }  
 }  

Y por ultimo (si en solo 2 pasos lo tendréis), en nuestra activity solo tendremos que crear un objeto BDHelper para que nos cree la BD si aun no la tenemos creada y con el objeto SQLiteDatabase ya podremos empezar a manipular la BD, pero eso os lo enseñare en otro post.


 public DBHelper dbh;  
 public SQLiteDatabase db;  
 dbh = new DBHelper(this,"BD");  
 db = dbh.getReadableDatabase();  

Como veis en el código de arriba, necesitamos crear un objeto DBHelper pasando el context y el nombre de la conexión. Y con este objecto creamos el objeto SQLiteDatabase para poder manipular la BD. Yo lo he declarado en el onCreate de la MainActivity.

Espero que os sirva, Saludos.