Cómo crear campos custom para Search API + SOLR en Drupal 7

Author Top
nightwalkr

Antes de explicarles los pasos les comentare que esto se enfocó en un proyecto que utiliza commerce y se ocupaba que en el search existiera un filtro para ordenar por el producto más vendidos, utilizando Apache SOLR como motor de búsqueda.

1. Implementación del hook_entity_property_info_alter

El hook hook_entity_property_info_alter() permitirá agregar el campo custom llamado “Mas vendido” como un campo más entre la configuración de campos en el index del Search Api.

/**
 * Implements hook_entity_property_info_alter().
 */

function mi_modulo_entity_property_info_alter(&$info){
    $info['node']['properties']['mas_vendido'] = array(
      'type' => 'text',
      'label' => t('Mas vendido'),
      'sanitized' => TRUE,
      'getter callback' => 'mi_modulo_index_property_mas_vendido_callback',
    );
}

En la propiedad ‘getter callback’ se define la función que retornara el resultado según sea el proceso a realizar, en este caso se calculará el número de veces que un producto a sido comprado.

function mi_modulo_index_property_mas_vendido_callback($item) {
  $nid = $item->nid;
  return mi_modulo_returnar_numero_compras($nid);
}

Quiero recordarles que commerce no cuenta con una función propia para saber cuantas veces a sido comprado un producto por lo cual realice un db_query algo extenso pero que me calcula tal resultado en la función ‘mi_modulo_returnar_numero_compras’

function mi_modulo_returnar_numero_compras($nid = 0){
      $query = "SELECT node.nid, node.title, SUM(commerce_line_item.quantity) AS 'ventas'
              FROM node
              INNER JOIN field_revision_field_producto field_revision_field_producto ON field_revision_field_producto.entity_id = node.nid
              INNER JOIN field_data_commerce_product field_data_commerce_product ON field_data_commerce_product.commerce_product_product_id = field_revision_field_producto.field_producto_product_id
              INNER JOIN commerce_line_item commerce_line_item ON field_data_commerce_product.entity_id = commerce_line_item.line_item_id
              INNER JOIN commerce_order commerce_order ON commerce_line_item.order_id = commerce_order.order_id
              LEFT JOIN field_data_commerce_total field_data_commerce_total ON commerce_line_item.line_item_id = field_data_commerce_total.entity_id AND (field_data_commerce_total.entity_type = 'commerce_line_item' AND field_data_commerce_total.deleted = '0')
              WHERE ( commerce_order.status IN ('completed') ) AND node.nid = :nid
              GROUP BY node.nid
              ORDER BY ventas DESC";

    $result = db_query($query, array(':nid' => $nid));

    $ventas = 0;

    foreach ($result as $key => $value) {
      $ventas = intval($value->ventas) ;
    }
    return $ventas;
}

2. Configuración del index en el search api

Entre la configuración de los índices creados desde el search api, se dirigen al tab de campos 

Debemos buscar del campo custom “Mas vendido” agregado desde código y se hace su activación.

Es super importante indicarle el tipo de formato “Número entero” en el cual se retornará en la vista del search ya que si se deja por defecto en Fulltext pueden durar días buscando una explicación del porqué no aparece como una opción entre los filtros de ordenamiento para la vista o página del búsqueda. 

3. Configuración de la vista de search

Editan la vista que se utiliza para visualizar los resultados de la búsqueda, agregando un nuevo criterio de ordenamiento “Mas vendido”.

Se debe activar la opción para que el criterio sea expuesto y aplicar para que se guarden los cambios.

Se guarda la vista y el filtro de ordenamiento por ventas queda funcionando en la pagina de búsqueda. 

Espero que haya sido de su agrado.