forena-8.x-1.x-dev/src/FrxPlugin/Template/FrxFieldTable.php

src/FrxPlugin/Template/FrxFieldTable.php
<?php
/**
 * @file FrxFieldTable
 * Template that displays a table of column/value vertically.
 */
namespace Drupal\forena\Template;

/**
 * Field Table Template
 *
 * @FrxTemplate(id="FrxFieldTable", name="Fields")
 */
class FrxFieldTable extends TemplateBase {
  public $templateName = 'Table of Fields';


  /**
   * Extract table configuration from the HTML
   * @see FrxRenderer::scrapeConfig()
   */
  public function scrapeConfig(\SimpleXMLElement $xml) {
    $config=array();
    $this->extractTemplateHTML($this->reportDocDomNode, $config, array('table'));
    $tds = $this->extractXPathInnerHTML('*//td', $this->reportDocDomNode, FALSE);
    $ths = $this->extractXPathInnerHTML('*//th', $this->reportDocDomNode, FALSE);
    $columns = array_combine($ths, $tds);
    $i=0;
    foreach($columns as $label=>$token) {
      $i++;
      $key = trim($token, '{}');
      $config['columns'][$key] = array(
          'contents' => $token,
          'label' => $label,
          'include' => 1,
          'weight' => $i,
      );
    }
    return $config;
  }


  public function generate() {
    $config = $this->configuration; 
    $config['foreach'] = '*';
    $config['class'] = 'FrxFieldTable';
    $div = $this->blockDiv($config);
    $columns = $this->columns($xml);
    // PUt on the header
    $this->removeChildren($div);
    $this->addFragment($div, $config['header']);
    $table = $this->setFirstNode($div, 4, 'table');

    $r=0;
    if ($config['columns']) foreach ($config['columns'] as $key => $col) if ($col['include']) {
      $r++;
      $tbody = $this->addNode($table, 6, 'tbody');
      $tr = $this->addNode($tbody, 8, 'tr');
      $th_attrs = array();
      if ($r==1) {
        $th_attrs = array('style' => 'width: 25em;');
      }

      $th = $this->addNode($tr, 10, 'th', $col['label']);
      $td = $this->addNode($tr, 10, 'td', $col['contents']);
    }

    // Decide to inlcude columns
    $found_columns = $this->columns($xml);
    if (!$found_columns) {
      $found_columns = $this->columns($xml, '/*');
      $attrs = array();
    }

    $include_column = 0;
    $weight = 0;
    if (!@$config['columns']) {
      $include_column = 1;
    }
    else {
      $weight = count($config['columns']);
    }

    foreach ($found_columns as $column => $label) {
      $token = '{' . $column . '}';
      if (!isset($config['columns'][$column])) {
        $weight++;
        $config['columns'][$column] = array(
            'contents' => $token,
            'include' => $include_column,
            'label' => $label,
            'weight' => $weight,
        );
      }
    }
  }

  /**
   * Template configuration form
   * @parmater $configuration form
   */
  public function configForm($config) {
    // Load header informationi from parent config.
    $form = parent::configForm($config);
    $this->weight_sort($config['columns']);
    $form['columns'] = array('#theme' => 'forena_element_draggable',   '#draggable_id' => 'FrxTable-columns');
    foreach ($config['columns'] as $key => $col) {
      $ctl = array();
      $ctl['label'] = array(
          '#type' => 'textfield',
          '#size' => 30,
          '#title' => t('Label'),
          '#default_value' => $col['label'],
      );

      $ctl['contents'] = array(
          '#type' => 'textfield',
          '#size' => '30',
          '#title' => t('Data'),
          '#default_value' => $col['contents'],
      );

      $ctl['include'] = array(
          '#type' => 'checkbox',
          '#title' => t('Include'),
          '#default_value' => $col['include'],
          '#ajax' => $this->configAjax()
      );

      $ctl['weight'] = array(
          "#type" => 'weight',
          '#title' => t('Weight'),
          '#delta' => 50,
          '#default_value' => $col['weight'],
      );

      $form['columns'][$key] = $ctl;
    }
    return $form;
  }

  public function configValidate(&$config) {
    parent::configValidate($config);
    $this->weight_sort($config['columns']);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc