BuddyPress vs Drupal Commons: crea tu red social con software libre

Creo que alguna vez comenté por aquí que estoy trabajando en el desarrollo de módulos para la red social PHPFox. No es que me convenza mucho este cms para la creación de redes sociales, la verdad, pero es cosa de la empresa. En todo caso, creo que PHPFox tiene una documentación que en el mejor de los casos es chapucera y en el peor inexistente, una comunidad profundamente inactiva y mercantilizada y un grave problema de rendimiento y escalabilidad. Y además hay que pagar licencia.

Por eso dediqué unos días a buscar opciones libres para crear una red social, no porque a mi empresa le interese (que de momento parece que están muy contentos con Fox) sino por mera curiosidad, y tal vez para montar alguna algún día, pero es sólo una chorrada que me ronda la cabeza.

A lo que íbamos, ¿qué dos opciones libres suenan con más fuerza? Pues BuddyPress y Drupal Commons. Ambos no son un CMS propiamente dicho, sino extensiones para otros CMS que nos dan la funcionalidad de red social

BuddyPress, como te puedes imaginar, está desarrollado para WordPress. Su instalación es simple: instalas WordPress ( a poder ser, la última versión), subir el plugin al servidor e instalarlo desde el menú de instalar plugins. Total, que en 10 minutos tienes montado todo en tu servidor.

Drupal Commons, evidentemente, es un plugin para Drupal. Su instalación es todavía más sencilla: sólo debes seleccionar el perfil Drupal Commons durante la instalación de Drupal, y listo.

En cuanto a funcionalidades, BuddyPress es menos completo que Commons. El plugin de wordpress incluye un stream de actividades de los usuarios, perfiles extendidos, posibilidad de conectar con amigos, posibilidad de crear grupos extensibles, mensajes privados, foros de discusión y todas las fucionalidades de WordPress para crear blogs. Lo básico para crear una comunidad.

Commons por su parte viene de serie más completo: los perfiles de usuario incluyen más variables, es capaz de crear automáticamente grupos respecto a la información del perfil, incluye foros de discusión, blogs (eso sí, en este caso menos potentes que los de wordpress), creación y gestión de eventos, creación de wikis, administración de documentos, integración con RSS, noticias, mayor control de la privacidad, editor WYSIWYG para los textos, estadísticas de la comunidad

Bueno, parece que ahí gana Commons ¿o no? Piénsalo bien, más funcionalidades no significa mejor. No quiero decir que Commons por abarcar mucho apriete poco, no, simplemente que es posible que en tu comunidad no necesites todas las funcionalidades que Drupal Commons trae por defecto. Y que no vengan por defecto en BuddyPress no significa que no existan para este, sólo que las tienes que instalar aparte.

En cuanto a diseño, el que incluye por defecto BuddyPress me parece más atractivo, pero ambos pueden ser modificados y personalizados, ya sea a través de la edición manual del css, a través de simples menús de personalización o adquiriendo alguna plantilla (las hay gratis y de pago). En todo caso, para gente que no sepa CSS Drupal Commons es más cómodo de personalizar.

Al ser software libre ambos tienen una amplia comunidad por detrás: Commons está apoyado y mantenido por Acquia, los cuales además de permitirte la descarga gratuita del plugin también ofertan de forma comercial hosting y mantenimiento para tu red. Commons tiene un API que te permitirá desarrollar módulos para extender su funcionamiento, además de tener acceso a miles de módulos. Con BuddyPress tienes menos módulos específicos, pero con todo dispones de todos los módulos de Worpress para añadir.

No voy a decir que uno sea peor que el otro. Creo que para un usuario avanzado BuddyPress es más flexible, y para uno novato Commons, aunque más grande, puede ser más fácil de gestionar al no tener que andar instalando plugins. En todo caso, a vosotros corresponde decidir. Yo todavía tengo que hacer más testeos caseros con ambos, pero ya tengo un par de ideas rondando la cefa.

Procesar un formulario con PHPFox (operaciones CRUD)

En los últimos tiempos he estado trabajando con el CMS PHPFox para creación de redes sociales. He de decir que la documentación sobre el mismo es, en el mejor de los casos ambigua y en el peor insuficiente, teniendo que recurrir muchas veces al “voy a ver cómo está hecho aquí, y si se parece lo copio”. Por cierto, si no sabes inglés date por jodido que la documentación está toda en la lengua de los inmortales bardos Poe, Shakespeare y Lemmy.

Podría empezar por lo básico, pero está más o menos bien explicado en su documentación (a la que sólo podrás acceder si tienes una cuenta de usuario… de pago, of course), donde te explican más o menos cómo crear tu primer módulo. Por desgracia, tras explicar lo más básico (lo más de lo más, porque esto no está explicado…) se quedan ahí, y no profundizan para acercarse al tema de la persistencia de datos ni a las operaciones CRUD (Create, Read, Update and Delete).

Para el acceso a la base de datos necesitarás al menos tres archivos, ya que PHPFox trabaja sobre la arquitectura MVC: un template (será la vista), un controller (controlador) y un service (el modelo).

Si habéis leído la documentación básica de phpfox ya sabréis en qué carpeta tenéis que meter cada archivo y cómo nombrarlo. Ahora os adjunto un ejemplo de como sería el código del template, seguido de su explicación:

<form method="post" action="{url link='phpfoxexperiment/form'}">
  <input type="number" name="val[orden]" id="orden" placeholder="orden"/>
  <br/>
  <input type="text" name="val[texto]" id="texto" placeholder="texto"/>
  <br/>
  <input type="submit" value="Add" class="button" name="val[add]" /> 
</form>

Por partes; en el action hemos usado esa variable porque así generará directamente un link a nuestra dirección seguido de ese directorio. En cuanto al nombre de los campos como “val[loquesea]” tiene también una explicación: se considera buena práctica no usar en PHPFox las variables de entorno $_GET y $_POST para recoger los datos de los formularios, en lugar de eso utilizamos el método getArray de la clase request, como verás en el ejemplo e abajo del php.

<?php 

class Phpfoxexperiment_Component_Block_Form extends Phpfox_Component 
{     
    public function process() 
    {         	
	if (($aVal = $this->request()->getArray('val'))) // getArray() nos permite recoger indistintamente valores $_GET y $_POST 
	{  
		  		 
		if(isset($aVal['add']) && !empty($aVal['add'])) // miramos si se ha pulsado el botón enviar 
		{  
		    if(isset($aVal['orden']) && !preg_match("/^[[:digit:]]+$/", $aVal['orden'])) //esto es una validación de los datos por expresión regular
		    {
			$this->url()->send('phpfoxexperiment.basic', null, 'Error'); //en caso de que los datos no sean correctos avisa a una página de error
		    }
		    else{
			if (Phpfox::getService('phpfoxexperiment')->add($aVal)) // llamamos al servicio para guardar los datos
			{ 				 
			    $this->url()->send('phpfoxexperiment.basic', null, 'Added with success');	//en caso de éxito lo comunicamos			 
			}else{
     			     $this->url()->send('phpfoxexperiment.basic', null, 'Error'); //en caso de error también
			}
		    }
		  }
		}         		 
	} 
}
?>

Como ves en el ejemplo se invoca al método add del servicio phpfoxexperiment. Ese método es el que hará la inserción en la base de datos. No se trata de un método del sistema, sino de uno creado por mi dentro del servicio. Aquí el código del mismo

<?php 
  
class Phpfoxexperiment_Service_Phpfoxexperiment extends Phpfox_Service  
{ 
    public function getData($iUser)
	
    { 
        return $this->database()->select('e.aescrypt') 
            ->from(Phpfox::getT('experiment'), 'e')
	    ->where('e.orden < 60 and user = '.$iUser)             
            ->execute('getRows'); 
    }
	public function add($aVal){ 
     
        $this->database()->insert( 
          Phpfox::getT('experiment'), 
          array(
            'user'=>Phpfox::getUserId(),
            'orden'=>$aVal['orden'], 
            'aescrypt'=>$aVal['texto'] 			
          ) 
        ); 
	return true;

    } 
} 
  
?>

En cambos casos accedo a la base de datos (MySQL) a través de los métodos de la clase database() de phpfox, que teóricamente ya implementa seguridad contra inyección sql y otros posbiles ataques. El return del final servirá para confirmar que la transacción se ha realizado. En el primer ejemplo se recuperar unos datos (teniendo en cuenta el id del usuario) y en el siguiente se insertan.

En fin, una explicación muy básica, pero que os ayudará a ir empezando a desarrollar módulos para este CMS.