Select List dinámica (PHP) de valores CiviCRM recuperados via API en el módulo CCK (Drupal)
Lo primero de todo, decir que este artículo se refiere a CiviCRM 2.2 usado con Drupal 6.10.
Para poder sacarle el máximo partido al fabuloso CiviCRM y poder usar la información de su base de datos con plena libertad en los nodos de Drupal, hay quien opta por usar el módulo Views. No es mala idea, pero yo finalmente me he decidido por CCK, aunque quizá lo complete usando Views puntualmente.
El caso es que estoy trabajando en la web para una ONG que facilita la donación on-line a los proyectos que sus organizaciones afiliadas tienen por el mundo. Al crear los campos para mi tipo de contenido ("Proyecto") quería incluir uno que permitiese al administrador generar nodos de nuevos proyectos indicando cuál es la organización afiliada correspondiente con la facilidad que supone simplemente elegir de una lista.
Pero la lista de afiliados crece por momentos mientras otros administradores los añaden desde CiviCRM, de modo que la lista de items en esa "select list" de Allowed Values no puede ser estática; debe atacar la base de datos de CiviCRM y recopilar los nombres de los afiliados (en mi caso, buscando a través de la API de CiviCRM de Contacts aquellos incluidos en el Grupo 'All Affiliates', que tiene group_id = 5.
Para ello hay que usar la opción que CCK ofrece de "override allowed values" (Advanced usage only: PHP code that returns a keyed array of allowed values. Should not include <?php ?> delimiters. If this field is filled out, the array returned by this code will override the allowed values list above.)
Para ello, el código que introduzcamos allí deberá darle a Drupal un return con el array de los afiliados, array que debemos hacer que deje de ser asociativo y que deberemos ordenar alfabéticamente después.
De modo que este sería el código (sin abrir/cerrar etiquetas php, pues dejaría de funcionar):
civicrm_initialize();
require_once 'api/v2/Contact.php';
$groupId = 5;
$params = array( 'group' => array( $groupId => 1),
'return.sort_name' => 1
);
$values = array('contact_id', 'sort_name');
$contacts = civicrm_contact_search( $params);
$result = array_values($contacts);
$n=0;
$final = array();
foreach ($result as $key => $value) {
$final[$n] = $result[$n]['sort_name'];
$n++;
}
sort($final);
return($final);
Entiendo que es un post demasiado concreto, pero quizá a alguno se le ocurre alguna idea pensando en esto.
Sigue la conversación en CiviCRM Forums


(2 votes, average: 4.50 out of 5)