Imagen personalizada en los títulos de los mensajes

Algunos foros están dando a sus usuarios nuevas formas de personalizar sus perfiles. Últimamente estoy viendo bastantes foros con imágenes elegidas por los usuarios al lado de los títulos de sus mensajes.

Según tengo entendido, esto es algo muy sencillo de implementar en la plataforma Jcink, pero en Foroactivo puede ser un poco más lioso. He decidido hacer esta guía para enseñaros como hacerlo en Foroactivo en unos muy sencillos pasos utilizando mi plugin de modificaciones a los perfiles.

Funcionamiento

El usuario podrá acceder a su perfil, donde un nuevo campo aparecerá para que introduzcan la URL a una imagen que deseen que aparezca en sus mensajes, al lado de los títulos.

Continuar leyendo “Imagen personalizada en los títulos de los mensajes”

Temas con barra de desplazamiento y mejoras en la visualización del texto

Es ya bien sabido que cada vez se utiliza más la técnica de las barras de desplazamiento o «scroll» para aprovechar espacio en las páginas. Se empezó en su momento con las tablillas, donde el scroll permitía centrar la atención en sus diseños detallistas y dejar en segundo plano lo menos importante: el texto. Ahora, podemos verlas desde en descripciones de foros, las últimas 24h o incluso algunos atrevidos están empezando a crear tendencia incluyendo el scroll en la leyenda de los grupos.

Continuar leyendo “Temas con barra de desplazamiento y mejoras en la visualización del texto”

Variables CSS

El lenguaje CSS ha sufrido unas cuantas mejoras desde que la especificación de su versión número tres salió a la luz. De entre las mejoras, siempre he estado siguiendo de reojo a la evolución de las variables CSS, puesto que suponen un gran avance en la editabilidad y escalabilidad de los códigos CSS.

Considero que esta característica ha madurado lo suficiente y tiene el soporte necesario por parte de los navegadores más corrientes para poder ser utilizado a día de hoy. Es por ello que os vengo a informar sobre ella y a enseñaros, de forma general, cómo utilizarla.

Continuar leyendo “Variables CSS”

Cambiar el diseño del foro dependiendo de la estación

No sé para que demonios puede servir este código, pero por las risas aquí os lo dejo. Con este JS podréis cambiar el diseño del foro dependiendo de la estación del año. Está preparado para seguir una lógica única para todos los usuarios (las estaciones del hemisferio norte o del sur).

Detalles a tener en cuenta

  • Funciona en todas las versiones de Foroactivo e incluso en Jcink (yay 🙃)
  • Por motivos de sencillez, se considera que todos los años las estaciones cambian el día 21.
  • Por motivos de usabilidad para los administradores de foros de RPG, todos los usuarios comparten la misma estación.

Continuar leyendo “Cambiar el diseño del foro dependiendo de la estación”

Cambiar el diseño del foro dependiendo del foro/categoría

El otro día estabamos hablando en el Chat de Rol sobre las características de phpBB y no se tardó en mencionar la posibilidad de cambiar el diseño dependiendo del foro en el que el usuario se encuentre.

Aunque yo sea partidario de que se utilize phpBB, un usuario del FDF pidió soporte para hacer esto en Foroactivo y me pareció interesante hacerle el código. Como tampoco me parece bien dejar el código tan solo en el FDF lo publico por aquí.

Características

El código tiene un funcionamiento similar a aquel que hice hace unas semanas para cambiar el diseño del foro dependiendo del grupo. Es decir, crea una clase única en el elemento «body» dependiendo del foro en el que te encuentres. Además, también expandí la funcionalidad del código un poco. A continuación explico de forma detallada sus características:

  1. Crea una clase única del foro en el que te encuentres y la aplica a la etiqueta body.
  2. Además, también genera clases para todos los foros y categorías padre de dicho foro.
  3. Si te encuentras en un tema, la misma lógica anterior se aplica: tienes disponible clases del foro en el que te encuentres y sus foros/categorías antepasados.

Continuar leyendo “Cambiar el diseño del foro dependiendo del foro/categoría”

Personalización de Perfiles: En pestañas y campos con clases independientes

El primer plugin que os traigo es un dos en uno. El siguiente plugin permitirá poner en tu foro:

  • Perfiles en pestañas. Podrás elegir cuántas perstañas tendrá cada perfil, qué cosa se ve en cada una de ellas y en qué orden y cuál (o cuáles) son las que se verán por defecto.
  • Campos de perfil con clases independientes. Podrás personalizar cada campo del perfil con CSS, puesto que cada uno tendrá su clase independiente. También divide cada campo en dos elementos, el título y el contenido, para una mayor personalización. Además, incluyo la posibilidad de quitar los dos puntos después de cada título.

De momento este plugin solo puede hacer esas dos cosas. Al estar hospedado en un servidor, podré añadir nuevas características en un futuro sin que tengáis que hacer nada más que activar qué nuevas características queréis para vuestro foro.

Aunque pueda parecer que instalar este plugin es muy complicado puesto que esta entrada es bastante larga, no os echéis atrás. Simplemente me he tomado la molestia de explicar hasta el más mínimo detalle para que nadie se pierda, pero tanto texto tan solo explica unos pasos que se hacen en menos de cinco minutos.

Quiero aclarar que esas dos características disponibles en el plugin no se activan al mismo tiempo. Podréis elegir cuál de las dos (o las dos) queréis aplicar en vuestro foro. El plugin está pensado pensando en la eficiencia, por lo que si una de las características no la queréis activar, no supondrá que el código se tenga que ejecutar en vuestro foro.

Instalación

Vete a la gestión de JavaScripts del PA y añade el siguiente JS solo en los temas:

/*! Custom Post Profiles v1.0.1 | Flerex | flerex.blog */
eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+c+'\\b','g'),k[c])}}return p}('(8($){5 18=8(11){11=11.60().70();5 29="àáäâèéëêìíïîòóöôùúüûñç·/69,:;";5 47="64------";68(5 17=0,37=29.51;17<37;17++){11=11.20(66 67(29.44(17),\'21\'),47.44(17))}11=11.20(/[^58-62-9 -]/21,\'\').20(/\\59+/21,\'-\').20(/-+/21,\'-\');49 11};$.65.80=8(40){5 32=[\'84ó83 82 85 86 88\',\'87://81.71.74\'];41.48(32[0]);41.48(32[1]);5 15=$.73({26:[],39:72,53:38,50:38,},40);49 4.46(8() {5 $4=$(4);31(15.39){5 56=18;$4.16(\'.2-14\').46(8(){5 10=$(4).23(\'.2-14-10\').23(\'.10\').23(\'19\').75(),7=$(4).23(\'.2-14-7\').27(),18=56(10);$(4).27(\'<19 13="2-14-10">\'+10+(15.53?\': \':\'\')+\'</19><19 13="2-14-7"></19>\').33(\'2-14-\'+18).16(\'.2-14-7\').27(7)})}31(15.26.51){5 35=$(\'<6 13="2-79"></6>\'),34=$(\'<6 13="2-3-7-28"></6>\'),24=$(\'<6 13="2-43-28"></6>\');$4.78(24).55(34).55(35);15.26.45(8(3){5 30=18(3.10),22=$(\'<6 13="2-3 2-3-\'+30+(3.52?\' 12\':\'\')+\'">\'+3.10+\'</6>\'),25=$(\'<6 13="2-3-7 2-3-7-\'+30+(3.52?\' 12\':\'\')+\'"></6>\');35.42(22);34.42(25);22.61(\'63\',8(){$4.16(\'.2-3.12\').36(\'12\');22.33(\'12\');$4.16(\'.2-3-7.12\').36(\'12\');25.33(\'12\')});3.7.45(8(54) {$4.16(54).77(25)})});31(15.50){24=$4.16(\'.2-43-28\');24.57()}}})}}(76));',10,89,'||postprofile|tab|this|var|div|content|function||label|str|active|class|field|settings|find|i|slug|span|replace|g|tabTrigger|children|remainsContainer|tabContent|tabStructure|html|container|from|tabSlug|if|copyright|addClass|contentContainer|tabContainer|removeClass|l|true|uniqueFieldClass|options|console|append|remains|charAt|forEach|each|to|log|return|deleteRemains|length|default|withColon|element|prepend|slugf|remove|a|s|trim|on|z0|click|aaaaeeeeiiiioooouuuunc|fn|new|RegExp|for|_|toLowerCase|tumblr|false|extend|com|text|jQuery|appendTo|wrapInner|tabs|customProfile|flerex|de|n|Personalizaci|perfiles|por|http|Flerex'.split('|')));

¡Ya está! El plugin está instalado.

Modificaciones

El plugin depende de mi propuesta de estructura estándar de los perfiles para poder funcionar, así que si no la tienes en tu foro, ¿a qué esperas? Lleva un minuto colocarla y te hará la vida más fácil.


Lo siguiente solo se debería instalar si tienes la intención de activar la parte del plugin «perfiles en pestañas». Vete a tu CSS y añade lo siguiente:

/**
*
* PERFILES EN PESTAÑAS
* Este código oculta todas las pestañas que no sean las activas
*
*/
.postprofile-tab-content {
   display: none;
}

.postprofile-tab-content.active {
   display: block;
}

Activación

Una vez que ya hemos instalado el plugin solo tenemos que decirle que se active. Esta es la parte que normalmente os liaría pero ya “no more”.

Añade el siguiente JS (y muéstralo solo en los temas (para decirle al plugin que se active solo en los temas, que es donde están los perfiles). Ten en cuenta de que puedes añadirlo si deseas después del anterior código del apartado de instalación, pero por claridad recomiendo hacerlo en uno nuevo.

$(function() {
	$('.postprofile').customProfile({
		// Aquí la configuración del plugin
	});
});

La traducción del código anterior sería más o menos lo siguiente:

Activa para los perfiles, que en mi foro se llaman “.postprofile” (por defecto en FA y en la modificación que os he dado arriba) el plugin “customProfile”, que tiene las siguientes configuración.

Si os fijáis, he dejado un comentario que dice “Aquí la configuración del plugin”. En esta parte es donde le diréis al plugin qué queréis que haga.

Campos con clases independientes

Empecemos por la parte de los campos del perfil con clases independientes. Si queréis activar esta parte tan solo tenéis que añadir a la configuración la siguiente línea:

uniqueFieldClass: true,

¿Activar las clases únicas en los campos del perfil? Sí.

Simple, ¿qué? En caso de que queráis quitar los dos puntos (es necesario tener la anterior opción activada) solo tenéis que añadir esta otra configuración:

withColon: false,

¿Los campos tienen dos puntos? No.

Perfiles en pestañas

Esta es la parte más compleja. No porque sea difícil, que no lo es, si no porque es la configuración más larga. Para activar esta parte del plugin voy a explicarme mejor con un ejemplo:

tabStructure:  [

    {
        label: 'Información',
        default: true,
        content: [
            '.postprofile-avatar',
            '.postprofile-username',
            '.postprofile-rank',
        ]
    },

    {
        label: 'Campos',
        content: [
            '.postprofile-fields',
            '.postprofile-rpg',
            '.postprofile-contact',
        ]
    }

],

La anterior configuración es la configuración para lo que yo considero una estructura «estándar» de las pestañas en los foros. Es lo que más suelo ver y básicamente tiene las siguientes características:

  • Dos pestañas.
  • Una pestaña «Información» que contiene el avatar, el rango y el nombre
  • Una pestaña «Campos» que contiene los perfiles, los botones de contacto y la hoja de personaje en caso de que el foro la tuviese.
  • La pestaña «Información» activa por defecto.

Si estás de acuerdo con esta configuración ya no deberías siquiera seguir leyendo. Copia y pega lo anterior y ya estarías listo.

En caso de que no seas tan conformista y quieras una configuración única, el funcionamiento es el siguiente:

Dentro del apartado tabStructure se van a poner distintas pestañas, las cuales están representadas por varios campos entre llaves ({, }). Todo el contenido entre estas llaves representa una pestaña y solo una. Cada pestaña tiene el campo «label», el cual se mostrará en el propio botón de la pestaña y el campo content, que a su vez contiene varios selectores que se corresponden a cada elemento que contendrá dicha pestaña.

A parte de estos dos campos, existe un tercer campo opcional llamado «default» el cual, si se le da valor true, cada vez que entres a un tema, dicha (o dichas) pestaña se mostrará activa por defecto. Sí, he dicho dichas porque no vi razón alguna para no permitir esto. Seguro que a alguien se le ocurre algo muy original con esto.

Ahora bien, en cuanto al orden en el que aparecen las pestañas… También lo he hecho muy simple. El orden en el que aparezcan en la configuración es el que se seguirá (el orden en el que aparecen las llaves correspondientes a cada pestaña).

Para el orden del contenido de cada pestaña (si el avatar va antes o después del nombre, etc.) se seguirá la lógica anterior. El orden de los selectores del campo «content» es el que se seguirá.

Si has seguido todos los pasos bien, tu código debería parecerse a este:

$(function() {
   $('.postprofile').customProfile({
        uniqueFieldClass: true,
        tabStructure:  [

            {
                label: 'Información',
                default: true,
                content: [
                    '.postprofile-avatar',
                    '.postprofile-username',
                    '.postprofile-rank',
                ]
            },

            {
                label: 'Campos',
                content: [
                    '.postprofile-fields',
                    '.postprofile-rpg',
                    '.postprofile-contact',
                ]
            }

        ],
   });
});

El resultado es el siguiente:

Quiero dejar constancia de que no he añadido ningún tipo de CSS que sea de personalización. Es por ello que las pestañas aparecerán unas encimas de otras sin ningún diseño. Si hacéis clic en ellas podréis comprobar que la lógica funciona, que es lo que yo proporciono, pero la parte de diseño os corresponde totalmente a vosotros.

Selectores

He dejado algún que otro selector muy interesante para la personalización del código:

  • .postprofile-tabs: Contenedor de las pestañas (los botones)
  • .postprofile-tab: Cada pestaña (los botones).
  • .postprofile-tab-content: Contenedor del contenido de una pestaña cualquiera
  • .postprofile-tab-content-{NOMBRE}: El contenedor del contenido específico de la etiqueta NOMBRE.
  • .postprofile-tab-content.active: Contenedor del contenido de una pestaña cualquiera que está actualmente activa
  • .postprofile-tab.active: Una pestaña que está actualmente activa

Eso es todo para el primer plugin que publico. Si tenéis cualquier tipo de duda no dudéis en enviarme un mensaje privado.

Estructura estándar de los perfiles

A la hora de personalizar los perfiles, mucha gente (yo me incluyo) ha ideado selectores que muchas veces son muy engorrosos o ineficientes cuando se podrían hacer de otra forma. Para crear selectores reutilizables en cualquier foro, propongo un estándar de estructura de los perfiles bastante lógica, básica y fácil de entender.

Recomiendo utilizar esta estructura en cualquier foro o diseño nuevo. Nada más empezar a diseñar, instala esta estructura para hacer tu vida más simple.

En esta entrada básicamente explicaré cómo instalar esta estructura y finalmente proporcionaré algunos selectores para que veáis cuánto se simplifican los que hasta ahora se estaban utilizando.

Características

¿Por qué utilizar esta estructura?

  • Permite crear un estándar de selectores simples y reutilizables.
  • Simplifica la estructura de los perfiles.
  • Permite personalizar el perfil de nuevas formas antes no accesibles.
  • Está mejor organizado.

Instalación

Vete a la plantilla viewtopic_body y busca:

<div class="postprofile" id="profile{postrow.displayed.U_POST_ID}">
    <!-- div class="online2"></div-->
    <dl><dt>
            {postrow.displayed.POSTER_AVATAR}
            <br><strong style="font-size:1.2em">{postrow.displayed.POSTER_NAME}</strong>
        </dt>
        <dd>{postrow.displayed.POSTER_RANK_NEW}{postrow.displayed.RANK_IMAGE}</dd>
        <dd><br></dd>
        <dd>
            <!-- BEGIN profile_field -->
            {postrow.displayed.profile_field.LABEL} {postrow.displayed.profile_field.CONTENT}{postrow.displayed.profile_field.SEPARATOR}
            <!-- END profile_field -->
            {postrow.displayed.POSTER_RPG}
        </dd>
        <dd><br></dd>
        <dd>
            {postrow.displayed.PROFILE_IMG} {postrow.displayed.PM_IMG} {postrow.displayed.EMAIL_IMG}<!-- BEGIN contact_field --> {postrow.displayed.contact_field.CONTENT}<!-- END contact_field -->
        </dd>
    </dl></div>

Sustitúyelo por:

<div class="postprofile" id="profile{postrow.displayed.U_POST_ID}">
    <div class="postprofile-avatar">{postrow.displayed.POSTER_AVATAR}</div>
    <div class="postprofile-username">{postrow.displayed.POSTER_NAME}</div>
    <div class="postprofile-rank">{postrow.displayed.POSTER_RANK_NEW}{postrow.displayed.RANK_IMAGE}</div>
    <div class="postprofile-fields">
        <!-- BEGIN profile_field -->
        <div class="postprofile-field">
            <span class="postprofile-field-label">{postrow.displayed.profile_field.LABEL}</span>
            <span class="postprofile-field-content">{postrow.displayed.profile_field.CONTENT}</span>
            <span class="postprofile-field-separator">{postrow.displayed.profile_field.SEPARATOR}</span>
        </div>
        <!-- END profile_field -->
    </div>
    <div class="postprofile-rpg">{postrow.displayed.POSTER_RPG}</div>
    <div class="postprofile-contact">
        <span class="postprofile-contact-profile">{postrow.displayed.PROFILE_IMG}</span>
        <span class="postprofile-contact-pm">{postrow.displayed.PM_IMG}</span>
        <span class="postprofile-contact-email">{postrow.displayed.EMAIL_IMG}</span>
        <!-- BEGIN contact_field -->
        <span class="postprofile-contact-field">{postrow.displayed.contact_field.CONTENT}</span>
        <!-- END contact_field -->
    </div>
</div>

¡Ya está! ¿Qué creías, que iba a ser muy complicado?

Selectores disponibles

  • .postprofile-rpg: Contiene todos los campos generados de la hoja de personaje.
  • .postprofile-contact: Contiene todos los campos de contacto del perfil.
  • .postprofile-field: Cada uno de los campos del perfil.
  • .postprofile-fields: Nótese la «s». Contiene todos los campos del perfil.
  • .postprofile-field-label: Contiene el nombre del campo de perfil.
  • .postprofile-field-content: Contiene el contenido del campo de perfil.
  • .postprofile-field-separator: Contiene el separador del campo de perfil.
  • .postprofile-contact-profile: Contiene el botón de ir al perfil.
  • .postprofile-contact-pm: Contiene el botón de enviar mensaje privado.
  • .postprofile-contact-email: Contiene el botón de enviar email.
  • .postprofile-contact-field: Cada botón de contacto que no es niguno de los tres anteriores. Por limitaciones de Foroactivo no es posible identificar cada botón de contacto personalizado sin recurir a JavaScript.
  • .postprofile-rank: Contiene el rango del usuario.
  • .postprofile-username: Contiene el nombre del usuario.
  • .postprofile-avatar: Contiene el avatar.

Ejemplos de códigos

Fijar el tamaño del avatar

.postprofile-avatar img {
    width: 200px;
    height: 200px;
}

No permitir que el tamaño del avatar sea más grande que el perfil

Si no tienes el anterior código, colocar este es una buena medida de seguridad.

.postprofile-avatar img {
    max-width: 100%;
}

Cambiar el tamaño o fuente del nombre del usuario

.postprofile-username {
    /* Tamaño de fuente */
    font-size: 20px;
    /* Tipo de fuente */
    font-family: 'Helvetica Neue', sans-serif; /* Recuerda que siempre debes poner de último sans-serif, serif, etc. dependiendo del tipo de fuente */
}

Y ahora mismo no se me ocurren más. ???? Si quieres que añada alguno más envíame un mensaje privado.

Plugins

Quería comentar que a partir de ahora voy a trabajar de una forma distinta a la hora de dar códigos, para solucionar alguno de los problemas más comunes que me he encontrado:

  • Eficiencia. Aunque siempre me planteo hacer los códigos de la forma más eficiente posible, sí es cierto que existen formas desaprovechadas de hacer que los códigos que publico carguen prácticamente al instante en vuestros foros.
  • Corrección de errores o puestas a punto. Todo el mundo tiene errores y, si en algún momento quiero corregir algo o cambiar alguna parte del código para hacerlo más eficiente, todas aquellas personas que ya lo hayan instalado en su foro no tendrán el código actualizado a no ser que lo vuelvan a hacer.
  • Abstracción. Muchas veces los códigos pueden resultar complicados y muy largos. A la vista de una persona que no entienda qué está pasando ahí, editarlos para que sean únicos a vuestro foro puede ser algo un poco complejo. A pesar de que siempre intento que mis códigos sean lo menos modificables posibles y que se adapten a los foros de forma automática, no siempre esto es posible.

Para corregir estos problemas he encontrado una solución perfecta para todos. A partir de ahora los códigos que publique tendrán un formato plugin y serán hospedados en un CDN propio. ¿Qué significa esto para los anteriores problemas?

  • En cuanto a la eficiencia, utilizar un CDN permite que cuanta más gente utilice mis códigos, menos probabilidades haya de que los códigos siquiera se tengan que cargar en tu foro. ¿Qué significa esto? Pues que si un visitante ya ha entrado a un foro que utilice cierto código mío, al entrar a tu foro no tendrá que volver a cargarlo porque ya va a estar en su ordenador. Es decir, el código cargará prácticamente al instante. Esto se lleva haciendo en el desarrollo web desde hace tiempo. Por ejemplo, Foroactivo carga jQuery de la misma forma, utiliando el CDN de Google.
  • En cuanto a la corrección de errores, tener el código hospedado en un servidor me permite corregir errores y mejorar los códigos de manera que el usuario (vosotros) no tengáis que hacer nada. Vuestros foros tendrán siempre la mejor versión de los códigos totalmente funcional sin tener que hacer nada.
  • Por último, la abstracción que permiten los plugins me permite pasar de lo que hacía hasta ahora, que era proporcionar los códigos con la parte editable y la no editable, a daros los códigos con tan sólo la parte editable. Lo he estado probando y es que es todo mucho más simple y fácil.

Por otro lado, aprovecho también para comentar algo que muchas personas me han preguntado y la verdad es que me gusta que se pregunte. Es sobre los créditos.

Veréis, a mí en este momento me dá bastante igual si me ponéis en los créditos de vuestro foro. Siempre se agradece si me enlazáis a este Tumblr, pero quiero dejar constancia que no es obligatorio. Lo que sí que no me gusta es que cambiéis partes de los códigos que hacen referencia a “flerex” o comentarios que tienen el propósito de demostrar la autoría del código. Son cosas que ningún usuario va a ver a no ser que indigue en el código fuente de la página, asi que no debería haber ningún problema.

Dicho esto, ya tengo un plugin preparado para estrenar este nuevo sistema. Esperemos que vaya todo perfecto lel.