RSS
 

Drupal 7: вывод графиков с помощью модуля flot

Написал тут модуль, который умеет выводить выбранные поля ноды в качестве графиков. Правда, тут выяснилось, что для моих задач ноды не очень подходят, так что буду его практически полностью переписывать. И чтобы добро не пропадало, вот:

<?php
 
function test_flot_menu() {
 
  $items['admin/config/flot'] = array(
    'title' => 'Flot settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('test_flot_settings_form'),
    'access callback' => TRUE,
    'type' => MENU_LOCAL_TASK,
  );
 
  $items['user/%/flot'] = array(
    'title' => 'Flot',
    'page callback' => 'test_flot_page',
    //'page arguments' => array('test_flot_form', 1),
    'access callback' => TRUE, 
    'type' => MENU_LOCAL_TASK,
  );
 
  return $items;
}
 
 
function test_flot_settings_form() {
  $instance = field_info_instances('node', 'symptoms');
 
  $options = array();
  foreach($instance as $machine_name => $field_info) {
    if (strpos($machine_name, 'field_') == 0) {
	  $options[$machine_name] = $field_info['label'];
	}
  }
 
  $form['test_flot_fields_to_display'] = array(
    '#type' => 'checkboxes',
    '#options' => $options,
	'#default_value' => variable_get('test_flot_fields_to_display', array('field_symptom1', 'field_symptom2')),
    '#title' => t('Which symptoms would you like to track?'),
  );
 
 
  // Submit button
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save settings'),
  );
 
  return $form;
}
 
/**
 * Save configuration settings
 */
function test_flot_settings_form_submit($form, &$form_state) {
 
  variable_set('test_flot_fields_to_display',
               $form_state['values']['test_flot_fields_to_display']);
 
  drupal_set_message(t('The settings have been saved'));
}
 
 
function test_flot_page() {
  global $user;
 
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', '<bundle_name>')
  ->propertyCondition('status', 1)
  ->propertyCondition('uid', $user->uid, '=')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // run the query as user 1
 
  $result = $query->execute();
  if (isset($result['node'])) {
    $news_items_nids = array_keys($result['node']);
    $news_items = entity_load('node', $news_items_nids);
  }
 
  $fields = variable_get('test_flot_fields_to_display', array('field1', 'field2'));
 
  foreach($fields as $k=>$v) {
    if (empty($v)) {
	  unset($fields[$k]);
	}
  }
 
 
 
  $data = array();
  foreach($news_items as $item) {
    foreach($fields as $fld)  {
	  //date('y-m-d', $item->created)
	  $data[$fld][] = array($item->created, $item->{$fld}[LANGUAGE_NONE][0]['value']);
    } 
  }
 
 
  $instance = field_info_instances('node', '<bundle_name>');
  $dat = array(); $i=0;
  foreach($fields as $fld)  {
 
    $dat[$i] = new flotData($data[$fld]);
    $dat[$i]->label = $instance[$fld]['label'];
	//$dat[$i]->points = new flotPoint(array('radius' => 5));
	++$i;
  }
 
        $style = new flotStyle();
        $style->xaxis->mode = 'time';
//        $style->xaxis->tickSize = array(1, "month");
//        $style->yaxis->ticks = 15;
//        $style->grid->labelMargin = 5;
//        $style->legend->position = "ne";  
 
  $variables = array(
    'data' => $dat,
    'element' => array(
      'id' => 'flot-example-normal',
      'class' => 'flot-example',
      'style' => "width:600px;height:400px",
    ),
	'options' => $style,
    'legend' => TRUE,
   // 'zoom' => TRUE,
  );
  return theme('flot_graph', $variables);
}
 
?>

В настройках можно выбрать какие поля ноды мы хотим отобразить. Дата создания будет отложена по ОХ, все остальные - по OY.

soul

03 Jul 2012 at about 15:11.

Другие настройки стилей

Другие настройки стилей графика:

  $style = new flotStyle();
  $style->xaxis->mode = 'time';
  //$style->xaxis->timeformat = "%d %b %y - %h:%m";
  // $style->xaxis->tickSize = array(1, "day");
  $style->xaxis->ticks = 10;
  // $style->xaxis->tickSize = array(1, "month");
  // $style->yaxis->ticks = 15;
  $style->yaxis->title = 'hello';
  $style->yaxis->min = SYMPTOM_PROGRESS_CHART_MIN_OY;
  $style->yaxis->max = SYMPTOM_PROGRESS_CHART_MAX_OY;
  // $style->grid->labelMargin = 5;
  // $style->legend->position = "ne";