En uno de los clientes, me han pedido que los PDF no se abrieran en el navegador.
Esto les supone un problema porque al cerrar el PDF, suelen cerrar el navegador y luego tiene que volver a entrar.
Para resolver este problema, en la configuración avanzada de la biblioteca, existe la posibilidad de abrir los documentos en la aplicación nativa:
Pero en nuestro caso, esto no funciona porque en la configuración del propio Adobe Reader, tienen marcado que se abra en el navegador. Cambiar esto les supone un gran trastorno dentro de la empresa, así que tome la opción de hacerlo vía JQuery:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
/*Que se ejecute cuando ya se haya cargado toda la página*/
$(document).ready(function(){
/*Buscamos todos los documentos que acaben en .pdf*/
$('[href$=".pdf"]').each(function(){
/*Vacio el onclick que suele traer*/
$(this).attr('onclick','');
/*Y le pongo el atributo target="_blank"*/
$(this).attr('target','_blank');
});
});
</script>
Incluyendo dicho código en la pagina maestra, ya lo tendríamos disponible para toda la colección de sitios.
Fácil y sencillo. Y el cliente ha quedo contento.
sábado, 21 de febrero de 2015
miércoles, 21 de enero de 2015
Imprimir una zona de una vista de datos
Uno de los clientes para los que trabajo, pidió que hiciera una vista de datos en la que salían unas peticiones mensuales. Hasta aquí, nada nuevo.
Lo siguiente que se le ocurrió, era que quería imprimirse esa vista de datos. Para ello, ni corto, ni perezoso, le propuse que diera a imprimir desde el navegador.
Esa solución, como no podía ser de otra manera, no le gusto. Quería imprimir sólo los datos, pero que no saliera la URL, ni partes del portal, sólo los datos.
Para ello, decidimos hacerlo con jquery, para ello en el table que se crea antes de recorrer todos los valores:
<table border="0" width="100%" cellpadding="2" cellspacing="0">
<tr valign="top">
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<th class="ms-vh" width="1%" nowrap="nowrap"></th>
</xsl:if>
<th class="ms-vh" nowrap="nowrap">Título</th>
<th class="ms-vh" nowrap="nowrap">Cuerpo</th>
<th class="ms-vh" nowrap="nowrap">Caduca</th>
</tr>
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
<xsl:with-param name="FirstRow" select="1" />
<xsl:with-param name="LastRow" select="$dvt_RowCount" />
</xsl:call-template>
</table>
Lo que haremos será ponerle un class="ZonaImprimible" quedando:
<table border="0" width="100%" cellpadding="2" cellspacing="0" class="ZonaImprimible">
Esto nos servirá para definir que parte será la que imprimiremos, en este caso todo el table.
Tras la tabla, pondremos un botón que nos sirva para imprimir:
</table>
<p><input type="button" class="Impresora" value="Imprimir"/></p>
Y por último, pondremos la referencia a jquery y los archivos que necesitamos. El código que nos hará que se imprima sólo la tabla será:
<script src="/PruebasVarias/Biblioteca/jquery-1.10.2.js"></script>
<script src="/PruebasVarias/Biblioteca/jquery-ui-1.10.4.custom.js"></script>
<script src="/PruebasVarias/Biblioteca/jquery.PrintArea.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".Impresora").bind("click",function() {
$(."ZonaImprimible").printArea(mode : "popup", popClose : true);
});
});
</script>
Esto hará que se nos imprima sólo la tabla y que veamos en un popup lo que vamos a imprimir.
Es importante tener en cuenta, que si no metemos la hoja de estilos dentro de la zona a imprimir, lo que imprimiremos será sólo texto plano.
Para más información y más posibilidades, se puede consultar:
https://plugins.jquery.com/PrintArea/
http://www.jqueryscript.net/other/Print-Specified-Area-Of-A-Page-PrintArea.HTML
Como siempre, tome la idea de:
http://www.martiniglesias.eu/blog/imprimir-un-area-determinada-del-documento-con-jquery/207
Lo siguiente que se le ocurrió, era que quería imprimirse esa vista de datos. Para ello, ni corto, ni perezoso, le propuse que diera a imprimir desde el navegador.
Esa solución, como no podía ser de otra manera, no le gusto. Quería imprimir sólo los datos, pero que no saliera la URL, ni partes del portal, sólo los datos.
Para ello, decidimos hacerlo con jquery, para ello en el table que se crea antes de recorrer todos los valores:
<table border="0" width="100%" cellpadding="2" cellspacing="0">
<tr valign="top">
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<th class="ms-vh" width="1%" nowrap="nowrap"></th>
</xsl:if>
<th class="ms-vh" nowrap="nowrap">Título</th>
<th class="ms-vh" nowrap="nowrap">Cuerpo</th>
<th class="ms-vh" nowrap="nowrap">Caduca</th>
</tr>
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
<xsl:with-param name="FirstRow" select="1" />
<xsl:with-param name="LastRow" select="$dvt_RowCount" />
</xsl:call-template>
</table>
<table border="0" width="100%" cellpadding="2" cellspacing="0" class="ZonaImprimible">
Esto nos servirá para definir que parte será la que imprimiremos, en este caso todo el table.
Tras la tabla, pondremos un botón que nos sirva para imprimir:
</table>
<p><input type="button" class="Impresora" value="Imprimir"/></p>
Y por último, pondremos la referencia a jquery y los archivos que necesitamos. El código que nos hará que se imprima sólo la tabla será:
<script src="/PruebasVarias/Biblioteca/jquery-1.10.2.js"></script>
<script src="/PruebasVarias/Biblioteca/jquery-ui-1.10.4.custom.js"></script>
<script src="/PruebasVarias/Biblioteca/jquery.PrintArea.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".Impresora").bind("click",function() {
$(."ZonaImprimible").printArea(mode : "popup", popClose : true);
});
});
</script>
Esto hará que se nos imprima sólo la tabla y que veamos en un popup lo que vamos a imprimir.
Es importante tener en cuenta, que si no metemos la hoja de estilos dentro de la zona a imprimir, lo que imprimiremos será sólo texto plano.
Para más información y más posibilidades, se puede consultar:
https://plugins.jquery.com/PrintArea/
http://www.jqueryscript.net/other/Print-Specified-Area-Of-A-Page-PrintArea.HTML
Como siempre, tome la idea de:
http://www.martiniglesias.eu/blog/imprimir-un-area-determinada-del-documento-con-jquery/207
viernes, 19 de diciembre de 2014
Cómo editar una página de SharePoint que aparece la edición deshabilitada
En un cliente, que trabaja con un SharePoint 2007, he detectado que la master tiene errores de código, producidos al intentar personalizarla.
Eso ha dado como resultado, que al intentar editar la página de inicio, he visto que la opción Editar página, que sale del menú de Acciones de sitio, aparece deshabilitada.
Necesitaba agregar una nueva lista a una Zona de Elementos Web. Así que buscando por internet, he encontrado una solución, que consiste en añadir a la URL el parámetro "?ToolPaneView=2".
En caso de que en la URL ya aparezca algún parámetro, como por ejemplo:
http://misitio/default.aspx?ID=12
Lo que deberíamos hacer es añadirlo como "&ToolPaneView=2".
La idea la encontré en:
http://davidandrewsmith.us/2009/09/11/edit-page-option-greyed-out-or-missing-or-disabled/
Eso ha dado como resultado, que al intentar editar la página de inicio, he visto que la opción Editar página, que sale del menú de Acciones de sitio, aparece deshabilitada.
Necesitaba agregar una nueva lista a una Zona de Elementos Web. Así que buscando por internet, he encontrado una solución, que consiste en añadir a la URL el parámetro "?ToolPaneView=2".
En caso de que en la URL ya aparezca algún parámetro, como por ejemplo:
http://misitio/default.aspx?ID=12
Lo que deberíamos hacer es añadirlo como "&ToolPaneView=2".
La idea la encontré en:
http://davidandrewsmith.us/2009/09/11/edit-page-option-greyed-out-or-missing-or-disabled/
sábado, 22 de noviembre de 2014
SharePoint 2007 en modo sólo lectura
En un cliente para el cual estamos haciendo una migración de SharePoint 2007 a 2013.
Y uno de los pasos que hemos decidido tomar, es poner SharePoint 2007 en modo sólo lectura, para que los usuarios sigan pudiendo acceder a consultar los datos, pero que no tenga permisos para modificar nada.
Para ello, entraremos en la administración central e iremos a "Application Management > Site Collection quotas and locks".
En la ventana que se nos abrirá seleccionaremos la Colección de Sitios deseada y veremos en que estado se encuentra:
En dicha ventana, podremos fijar el estado de la colección de sitios a sólo lectura y definir el mensaje que los usuarios verán:
Tras aceptar estos cambios, veremos en la colección de sitios, que ya no nos aparecerán la opciones de añadir contenidos, independientemente del nivel de permisos que tengamos. Y que el menú de acciones estará vacío.
Y uno de los pasos que hemos decidido tomar, es poner SharePoint 2007 en modo sólo lectura, para que los usuarios sigan pudiendo acceder a consultar los datos, pero que no tenga permisos para modificar nada.
Para ello, entraremos en la administración central e iremos a "Application Management > Site Collection quotas and locks".
En la ventana que se nos abrirá seleccionaremos la Colección de Sitios deseada y veremos en que estado se encuentra:
En dicha ventana, podremos fijar el estado de la colección de sitios a sólo lectura y definir el mensaje que los usuarios verán:
Tras aceptar estos cambios, veremos en la colección de sitios, que ya no nos aparecerán la opciones de añadir contenidos, independientemente del nivel de permisos que tengamos. Y que el menú de acciones estará vacío.
lunes, 6 de octubre de 2014
¿Dónde están las Migas en SharePoint 2013?
Hoy me ha tocado acceder a un SharePoint 2013, que hemos instalado a un cliente que conocía las versiones anteriores de SharePoint. Como son viejos conocidos, le he hecho una presentación de todo lo nuevo que trae... Sigo enamorado de las búsquedas...
Y el cliente ha quedado encantado, pero lo primero que ha echado de menos han sido las migas.
Como no era mi primer SharePoint 2013, no he entrado en pánico y simplemente le he dicho la verdad. SharePoint 2013 no muestra las migas. Pero tranquilo, que puedo hacer que aparezcan.
Para ello, he descargado una copia de Seattle.master (es de buenas prácticas no tocar los archivos de Microsoft, sino crear una copia y trabajar con ellos). La he renombrado y he comenzado ha modificar el archivo.
Lo primero que he hecho, ha sido localizar la zona que pone:
<div class="ms-breadcrumb-dropdownBox" style="display:none;">
Ya que por defecto están dejando toda la zona oculta, por eso quitaremos style="display:none;", quedando:
<div class="ms-breadcrumb-dropdownBox">
En la siguiente línea tendremos el control:
<SharePoint:AjaxDelta id="DeltaBreadcrumbDropdown" runat="server">
<SharePoint:PopoutMenu
Visible="false"
runat="server"
Que como vemos esta oculto, por el código Visible="false", así que lo pondremos a "true":
<SharePoint:AjaxDelta id="DeltaBreadcrumbDropdown" runat="server">
<SharePoint:PopoutMenu
Visible="true"
runat="server"
Puede que dependiendo del tema que tengamos aplicado, puede que no se pinte correctamente el icono, para ello, basta con poner antes de cerrar el div de la clase ms-breadcrumb-dropdownBox, lo siguiente:
<script type="text/javascript">
document.getElementById("GlobalBreadCrumbNavPopout-anchor").innerHTML='<img style="border-width:0;position:absolute;left:-215px !important;top:-120px !important;" alt="Navigate Up" src="/_layouts/15/images/spcommon.png?rev=27">';
</script>
Tras esto, he guardado los cambios en el archivo y he subido el archivo desde la configuración del sitio raíz de la colección de sitios, seleccionando la opción:
Y tras publicar como versión principal, nuestro archivo, lo he aplicado desde la configuración del sitio raíz, por medio de la opción:
Y nos quedaría algo tan útil como:
Si, queremos unas migas de pan horizontales, recomiendo el siguiente enlace:
sábado, 13 de septiembre de 2014
SharePoint y el uso de fuentes
Es muy común, cuando haces un proyecto para una gran empresa. El hecho de que tengan una tipografía corporativa.
Para que un navegador sea capaz de interpretar esa tipografía:
Con lo cual nos centraremos en la segunda opción, que nos serviría también para portales de Internet.
Existen multitud de soluciones. De hecho hasta ahora, en mi empresa se venía utilizando Cufon: http://cufon.shoqolate.com/generate/
Es un sitio que básicamente consiste, en que subes el archivo de tipografía (.ttf) y el sitio te genera una serie de JavaScript. Los cuales subimos a nuestro portal y referenciamos desde el mismo.
Su funcionamiento es muy simple, consiste en pasarle como parámetros del JavaScript, los estilos que queremos que se les aplique Cufon, para que aparezcan con la tipografía deseada. Y Cufon convertirá dicha tipografía en una imagen.
Para su utilización bastaría con subir los archivos JavaScript al servidor y hacer una referencia a ellos dentro de la etiqueta <head> que tenemos en la página maestra (master page):
Y ya que los usuario tienen que poder editar dicho contenido de estos Editores de Contenido. Busque una alternativa.
La alternativa es Font-face. Es una propiedad de CSS, que nos permite hacer uso de una fuente, que no este en el equipo del usuario. Pero para sorpresa mía, Internet Explorer (de la versión 6 a la 8), no es capaz de interpretar los archivos ttf. Pero si es capaz de interpretar los archivos eot.
Para ello, lo primero que deberemos hacer es usar un conversor para tener ambos archivos. Personalmente hay dos que utilizo y que me han dado buenas conversiones:
http://www.kirsle.net/wizards/ttf2eot.cgi
http://www.fontsquirrel.com/fontface/generator
https://www.web-font-generator.com/
El segundo te habilita la descarga de un rar, donde se incluye la fuente en varios formatos y un html de ejemplo para que veas la transformación en el navegador que se desee.
En caso de que estos conversores no hagan la conversión deseada, bastaría con buscar alguno alternativo.
Tras obtener los dos archivos, los subimos a nuestro portal. E incluiremos en la hoja de estilos del sitios, la siguiente referencia:
Ahora ya sólo tendríamos que utilizar dicha fuente, en los estilos que nos interese, simplemente utilizando su NombreUtilDeLaFuente:
Puede que en función del navegador que utilicemos, no nos valga sólo con la fuente en formato eot o ttf y necesitemos otras extensiones.Para ver más detalles podemos consultar:
http://www.w3schools.com/cssref/css3_pr_font-face_rule.asp
https://css-tricks.com/snippets/css/using-font-face/
Para que un navegador sea capaz de interpretar esa tipografía:
- Debe estar instalada en el equipo del usuario: Por ejemplo en Windows, suelen estar en C:\WINDOWS\Fonts
- Debe ser facilitadas por el servidor
Con lo cual nos centraremos en la segunda opción, que nos serviría también para portales de Internet.
Existen multitud de soluciones. De hecho hasta ahora, en mi empresa se venía utilizando Cufon: http://cufon.shoqolate.com/generate/
Es un sitio que básicamente consiste, en que subes el archivo de tipografía (.ttf) y el sitio te genera una serie de JavaScript. Los cuales subimos a nuestro portal y referenciamos desde el mismo.
Su funcionamiento es muy simple, consiste en pasarle como parámetros del JavaScript, los estilos que queremos que se les aplique Cufon, para que aparezcan con la tipografía deseada. Y Cufon convertirá dicha tipografía en una imagen.
Para su utilización bastaría con subir los archivos JavaScript al servidor y hacer una referencia a ellos dentro de la etiqueta <head> que tenemos en la página maestra (master page):
<head runat="server"> <meta http-equiv="X-UA-Compatible" content="IE=8"/> <meta name="GENERATOR" content="Microsoft SharePoint"/> <meta name="progid" content="SharePoint.WebPartPage.Document"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Expires" content="0"/> <SharePoint:RobotsMetaTag runat="server"/> <title id="onetidTitle"><asp:ContentPlaceHolder id="PlaceHolderPageTitle" runat="server"/></title> <SharePoint:CssLink runat="server" Version="4"/> <SharePoint:Theme runat="server"/> <SharePoint:ULSClientConfig runat="server"/> <script type="text/javascript"> var _fV4UI = true; </script> <SharePoint:ScriptLink language="javascript" name="core.js" OnDemand="true" runat="server"/> <SharePoint:CustomJSUrl runat="server"/> <SharePoint:SoapDiscoveryLink runat="server"/> <asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server"> </asp:ContentPlaceHolder> <SharePoint:DelegateControl runat="server" ControlId="AdditionalPageHead" AllowMultipleControls="true"/> <SharePoint:SPShortcutIcon runat="server" IconUrl="/_layouts/images/favicon.ico"/> <asp:ContentPlaceHolder id="PlaceHolderBodyAreaClass" runat="server"/> <asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat="server"/> <SharePoint:SPPageManager runat="server"/> <SharePoint:SPHelpPageComponent Visible="false" runat="server"/> <script type="text/javascript" src="/PublishingImages/cufon/cufon-yui.js"></script> <script type="text/javascript" src="/PublishingImages/cufon/ClanPro-Book_450.font.js"></script> <script type="text/javascript" src="/PublishingImages/cufon/ClanPro-Thin_250.font.js"></script> <script type="text/javascript" src="/PublishingImages/cufon/ClanPro-Black_900.font.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> </head>
Al final de nuestra página maestra, antes de cerrar la etiqueta </body> deberiamos incluir la llamada al archivo JavaScript, pasandole como parámetros los estilos a los que le queremos aplicar Cufon y finalmente, llamar a la función que nos actualiza los estilos de Cufon:
<script type="text/javascript"> Cufon.replace('.menu-horizontal a', { fontFamily: 'ClanPro-Book' }); Cufon.replace('.titularCabecera', { fontFamily: 'ClanPro-Thin' }); Cufon.replace('.tituloMenuLateral, .ms-WPTitle, .ms-WPTitle a', { fontFamily: 'ClanPro-Black' }); Cufon.replace('.titularNoticia, .titularAviso, .titularComunicado, .cabeceraAviso a, .cabeceraComunicado a', {hover:true, fontFamily: 'ClanPro-Book' }); Cufon.replace('.subtituloNoticia, .cabeceraNoticia a, .tituloOtrasNoticias, .tituloAR, .subtituloAviso, .subtituloComunicado, .tituloOtrosComunicados, .tituloVisitas, .tituloAplicacion', {hover:true, fontFamily: 'ClanPro-Black' }); Cufon.now(); </script>
Esta solución tenía un problema y consistía en que si aplicábamos Cufon a un Editor de Contenido, cuando volvemos a editar dicho Editor de Contenido veremos que el código ha cambiado debido a la aplicación de Cufon y que hace que nos ralentice la edición de las páginas:
Y ya que los usuario tienen que poder editar dicho contenido de estos Editores de Contenido. Busque una alternativa.
La alternativa es Font-face. Es una propiedad de CSS, que nos permite hacer uso de una fuente, que no este en el equipo del usuario. Pero para sorpresa mía, Internet Explorer (de la versión 6 a la 8), no es capaz de interpretar los archivos ttf. Pero si es capaz de interpretar los archivos eot.
Para ello, lo primero que deberemos hacer es usar un conversor para tener ambos archivos. Personalmente hay dos que utilizo y que me han dado buenas conversiones:
http://www.kirsle.net/wizards/ttf2eot.cgi
http://www.fontsquirrel.com/fontface/generator
https://www.web-font-generator.com/
El segundo te habilita la descarga de un rar, donde se incluye la fuente en varios formatos y un html de ejemplo para que veas la transformación en el navegador que se desee.
En caso de que estos conversores no hagan la conversión deseada, bastaría con buscar alguno alternativo.
Tras obtener los dos archivos, los subimos a nuestro portal. E incluiremos en la hoja de estilos del sitios, la siguiente referencia:
<style type="text/css">
@font-face {
font-family: NombreUtilDeLaFuente;
src: url("http://servidor/subsitio/carpeta/Nombredelarchivodelafuente.eot");
src: url("http://servidor/subsitio/carpeta/Nombredelarchivodelafuente.ttf");
} </style>
Ahora ya sólo tendríamos que utilizar dicha fuente, en los estilos que nos interese, simplemente utilizando su NombreUtilDeLaFuente:
<style type="text/css">
.NavegacionLateral {
font-family: NombreUtilDeLaFuente;
font-size:18pt;
}
</style>
Puede que en función del navegador que utilicemos, no nos valga sólo con la fuente en formato eot o ttf y necesitemos otras extensiones.Para ver más detalles podemos consultar:
http://www.w3schools.com/cssref/css3_pr_font-face_rule.asp
https://css-tricks.com/snippets/css/using-font-face/
Etiquetas:
2007,
2013,
CSS,
Cufon,
Font-face,
Fonts,
Fuente,
JavaScript,
JQuery,
MOSS,
Presentación,
Sharepoint,
Sharepoint 2010,
Sharepoint 2013,
Sharepoint Designer
sábado, 16 de agosto de 2014
Recortar texto con ... en una SharePoint
Muchas veces, nos piden que en una vista de datos sólo aparezcan los 250 primero caracteres o un número que nos determinen de caracteres de un campo de varias líneas de texto.
El problema reside en que ese tratamiento sobre un campo de varias lineas de texto, no podemos hacerlo en XSL, en concreto cuando el campo de varias lineas de texto, permite texto enriquecido.
Ya que internamente, lo que se guarda es código HTML. Y al quedarnos sólo con un número determinado de caracteres conseguiremos situaciones, como quedarnos con código HTML en el que se abren etiquetas pero falta el cierre. Pudiendo darse cosas "curiosas" en lo que veríamos en nuestro navegador.
Para ello el truco más recurrido, es tratar el texto desde el lado cliente con JavaScript. Para ello podremos aplicar el siguiente código:
/*Justo tras acabar de cargarse el código de nuestra página (ready), se ejecutará nuestro código*/
$(document).ready(function(){
/*Buscamos todos los elementos HTML que hemos asociado a la clase descripcion, para ser analizados y ver si hay que recortarlos*/
$('.descripcion').each(function(){
/*Variable en la cual indicaremos el número máximo de caracteres a mostrar*/
var longitud=300;
/*Vemos si para cada uno de estos elementos, superan la longitud máxima o no*/
if($(this).text().length > longitud){
/*En el caso de que se supere, nos quedaremos con los 300 primeros caracteres*/
var texto=$(this).text().substring(0,longitud);
/*Para evitar palabras incompletas, buscaremos el último espacio en blanco*/
var indiceUltimoEspacio= texto.lastIndexOf(' ');
/*Nos quedaremos con el texto que hay antes del último espacio en blanco y pondremos puntos suspensivos*/
texto=texto.substring(0,indiceUltimoEspacio) +'<span class="puntos">...</span>';
/*Lo encapsulamos todo dentro de un div con la misma clase, para mantener los estilos*/
var primeraParte = '<div class="descripcion">' + texto + '</div>';
/*Y los pintamos en la posición donde estaba el texto largo*/
$(this).html(primeraParte);
};
});
});
Si lo que quisiéramos hubiera sido darle la posibilidad de que al hacer clic en los puntos suspensivos se mostrará todo el texto, la función sería:
/*Justo tras acabar de cargarse el código de nuestra página (ready), se ejecutará nuestro código*/
$(document).ready(function(){
/*Buscamos todos los elementos HTML que hemos asociado a la clase description, para ser analizados y ver si hay que recortarlos*/
$('.description').each(function(){
/*Variable en la cual indicaremos el número máximo de caracteres a mostrar*/
var longitud=300;
/*Vemos si para cada uno de estos elementos, superan la longitud máxima o no*/
if($(this).text().length > longitud){
/*En el caso de que se supere, nos quedaremos con los 300 primeros caracteres*/
var texto=$(this).text().substring(0,longitud);
/*Para evitar palabras incompletas, buscaremos el último espacio en blanco*/
var indiceUltimoEspacio= texto.lastIndexOf(' ');
/*Nos quedaremos con el texto que hay antes del último espacio en blanco y pondremos puntos suspensivos*/
texto=texto.substring(0,indiceUltimoEspacio) +'<span class="puntos">...</span>';
/*Lo encapsulamos todo dentro de un div con la misma clase, para mantener los estilos*/
var primeraParte = '<div class="description">' + texto + '</div>';
var segundaParte = '<span class="texto-oculto" style="display:none;">' + $(this).text().substring(indiceUltimoEspacio,$(this).text().length - 1) + '</span>';
/*Y los pintamos en la posición donde estaba el texto largo*/
$(this).html(primeraParte + segundaParte);
/*Ponemos una zona */
$(this).after('<span class="Mas_info">Ver más</span>');
};
});
/*Cuando hagamos clic en Mas_info se lanzará esta parte*/
$('.Mas_info').click(function(){
/*Comprobamos si el texto-oculto esta oculto*/
if($(this).prev().find('.texto-oculto').css('display') == 'none'){
/*En ese caso mostramos el texto oculto*/
$(this).prev().find('.texto-oculto').css('display','inline');
/*Ocultamos los puntos suspensivos*/
$(this).prev().find('.puntos').css('display','none');
/*Y cambiamos el texto por Ver menos*/
$(this).text('Ver menos');
}
/*justo lo contarios*/
else{
$(this).prev().find('.texto-oculto').css('display','none');
$(this).prev().find('.puntos').css('display','inline');
$(this).html('Ver más');
};
});
});
Hay que tener en cuenta, que antes de poner todo este código debe haber una referencia a Jquery, ya sea externa:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
O interna.
El problema reside en que ese tratamiento sobre un campo de varias lineas de texto, no podemos hacerlo en XSL, en concreto cuando el campo de varias lineas de texto, permite texto enriquecido.
Ya que internamente, lo que se guarda es código HTML. Y al quedarnos sólo con un número determinado de caracteres conseguiremos situaciones, como quedarnos con código HTML en el que se abren etiquetas pero falta el cierre. Pudiendo darse cosas "curiosas" en lo que veríamos en nuestro navegador.
Para ello el truco más recurrido, es tratar el texto desde el lado cliente con JavaScript. Para ello podremos aplicar el siguiente código:
/*Justo tras acabar de cargarse el código de nuestra página (ready), se ejecutará nuestro código*/
$(document).ready(function(){
/*Buscamos todos los elementos HTML que hemos asociado a la clase descripcion, para ser analizados y ver si hay que recortarlos*/
$('.descripcion').each(function(){
/*Variable en la cual indicaremos el número máximo de caracteres a mostrar*/
var longitud=300;
/*Vemos si para cada uno de estos elementos, superan la longitud máxima o no*/
if($(this).text().length > longitud){
/*En el caso de que se supere, nos quedaremos con los 300 primeros caracteres*/
var texto=$(this).text().substring(0,longitud);
/*Para evitar palabras incompletas, buscaremos el último espacio en blanco*/
var indiceUltimoEspacio= texto.lastIndexOf(' ');
/*Nos quedaremos con el texto que hay antes del último espacio en blanco y pondremos puntos suspensivos*/
texto=texto.substring(0,indiceUltimoEspacio) +'<span class="puntos">...</span>';
/*Lo encapsulamos todo dentro de un div con la misma clase, para mantener los estilos*/
var primeraParte = '<div class="descripcion">' + texto + '</div>';
/*Y los pintamos en la posición donde estaba el texto largo*/
$(this).html(primeraParte);
};
});
});
Si lo que quisiéramos hubiera sido darle la posibilidad de que al hacer clic en los puntos suspensivos se mostrará todo el texto, la función sería:
/*Justo tras acabar de cargarse el código de nuestra página (ready), se ejecutará nuestro código*/
$(document).ready(function(){
/*Buscamos todos los elementos HTML que hemos asociado a la clase description, para ser analizados y ver si hay que recortarlos*/
$('.description').each(function(){
/*Variable en la cual indicaremos el número máximo de caracteres a mostrar*/
var longitud=300;
/*Vemos si para cada uno de estos elementos, superan la longitud máxima o no*/
if($(this).text().length > longitud){
/*En el caso de que se supere, nos quedaremos con los 300 primeros caracteres*/
var texto=$(this).text().substring(0,longitud);
/*Para evitar palabras incompletas, buscaremos el último espacio en blanco*/
var indiceUltimoEspacio= texto.lastIndexOf(' ');
/*Nos quedaremos con el texto que hay antes del último espacio en blanco y pondremos puntos suspensivos*/
texto=texto.substring(0,indiceUltimoEspacio) +'<span class="puntos">...</span>';
/*Lo encapsulamos todo dentro de un div con la misma clase, para mantener los estilos*/
var primeraParte = '<div class="description">' + texto + '</div>';
var segundaParte = '<span class="texto-oculto" style="display:none;">' + $(this).text().substring(indiceUltimoEspacio,$(this).text().length - 1) + '</span>';
/*Y los pintamos en la posición donde estaba el texto largo*/
$(this).html(primeraParte + segundaParte);
/*Ponemos una zona */
$(this).after('<span class="Mas_info">Ver más</span>');
};
});
/*Cuando hagamos clic en Mas_info se lanzará esta parte*/
$('.Mas_info').click(function(){
/*Comprobamos si el texto-oculto esta oculto*/
if($(this).prev().find('.texto-oculto').css('display') == 'none'){
/*En ese caso mostramos el texto oculto*/
$(this).prev().find('.texto-oculto').css('display','inline');
/*Ocultamos los puntos suspensivos*/
$(this).prev().find('.puntos').css('display','none');
/*Y cambiamos el texto por Ver menos*/
$(this).text('Ver menos');
}
/*justo lo contarios*/
else{
$(this).prev().find('.texto-oculto').css('display','none');
$(this).prev().find('.puntos').css('display','inline');
$(this).html('Ver más');
};
});
});
Hay que tener en cuenta, que antes de poner todo este código debe haber una referencia a Jquery, ya sea externa:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
O interna.
Suscribirse a:
Entradas (Atom)







