1

我正在尝试使用打印 AZ 栏来根据字母点击过滤条目。(即点击“A”只显示“A”列表,点击“B”只显示“B”列表,如果没有“C”列表比“C”不显示“ABDE”)

这是在 PHP 中,是自定义 DRUPAL 模块的一部分。内容已经按字母顺序排列。

我知道下面有很多代码,我只是不知道在哪里或应用什么来解决这个问题。

预先感谢您的所有帮助。

艾伦

我试图将 RED OUTLINED 框放入 RED FILLED-IN 框中。

在此处输入图像描述

抱歉花了这么长时间才上图。谢谢你的帮助!

<?php

// NITAAC Calendar Synchronization Module
// Based off of Assyst's origonal solution
// Re-written to only pull updates where needed

// TODO: write a proper help section
function cloud_computing_data_help($path, $arg){
  switch ($path){
  case "admin/help#cloud_computing_data":
    $text = '<p>' . t("TODO - WRITE A HELP FILE.") . '</p>';
    return $text;
    break;
  }
}

/** 
 * Menu functions
 */
function cloud_computing_data_menu()
{
    $items = array();

  $items['cloud-computing/cio-sp3'] = array(
    'title' => 'Cloud Computing',
    'description' => '',
    'page callback' => 'cloud_computing_data_grid_display',
    'access callback' => TRUE,
  );

  $items['cloud-computing/update-from-node/%'] = array(
    'title' => 'Cloud Computing data update',
    'description' => 'Utility to update the CIO-SP3/SB Cloud Computing data in the database based on a sheetnode',
    'page callback' => 'cloud_computing_data_populate_from_node',
    'page arguments' => array(2),
    'access arguments' => array('access administration pages'),
  );

    return $items;
}

/**
 * Block Definitions
 */
function cloud_computing_data_block_info(){
  $blocks['cloud_computing_filters'] = array(
    'info' => t('NITAAC Cloud Computing Filters'),
    'status' => 1,
    'region' => 'subfeature_top',
    'visibility' => BLOCK_VISIBILITY_LISTED,
    'weight' => '999',
    'pages' => 'cloud-computing/cio-sp3',
    'cahce' => DRUPAL_CACHE_PER_ROLE,
  );
  return $blocks;
}

function cloud_computing_data_theme(){
  $module_path = drupal_get_path('module', 'cloud_computing_data');

  $base = array(
    'file' => 'theme.inc',
    'path' => "$module_path/theme",
  );

  return array(
    'cloud_computing_page' => $base + array(
      'template' => 'cloud-computing-page',
      'variables' => array('companies' => array()),
    ),
    'cloud_computing_item' => $base + array(
      'template' => 'cloud-computing-item',
      'variables' => array('company' => array()),
    ),
    'cloud_computing_item_details' => $base + array(
      'template' => 'cloud-computing-item-details',
      'variables' => array('company' => array()),
    ),
  );
}

/// Page Definition Functions //////////////////////////////////////////////////

function cloud_computing_data_grid_display_filters(){

  // form definition
  $filters = array(
    '#method' => 'get',
    '#tree' => true,
    '#theme_wrappers' => array('form'),
    '#no_redirect' => true,
    '#always_process' => true,
    '#type' => 'form',
    '#token' => false,
    '#after_build' => array('cloud_computing_data_grid_display_filters_unset_id'),
    '#attributes' => array(
      'class' => array('cc-filters'),
    ),
  );

  // get service provider listing
  $qry = db_select('cloud_computing_capability_data', 'cd');
  $qry -> fields('cd', array(
    'service_provider',
    ))
    -> orderBy('service_provider', 'ASC')
    -> groupBy('service_provider');

  $result = $qry -> execute();
  $providers = array();
  foreach($result as $provider_serialized){
    $provider_parts = explode(';',$provider_serialized->service_provider);
    foreach($provider_parts as $part){
      $part = trim($part);
      if (!empty($part)){
        $providers[$part] = $part;
      }
    }
  }

  $qry = db_select('cloud_computing_capability_data', 'cd');
  $qry -> fields('cd', array(
    'contract',
  ))
  -> orderBy('contract', 'ASC')
  -> groupBy('contract');

  $result = $qry -> execute();
  $contracts = array();
  foreach($result as $row){
    $contracts[$row->contract] = $row->contract;
  }

  // contract dropdown
  $filters['contract'] = array(
    '#type' => 'select',
    '#title' => t('Contract'),
    '#default_value' => 'Any',
    '#options' => array(
      'any' => 'Any'
    ),
    '#multiple' => false,
    '#name' => 'contract',
  );

  foreach($contracts as $contract){
    $contract_plain = check_url($contract);
    $contract_plain = preg_replace('/\s/','-',strtolower($contract_plain));
    $filters['contract']['#options'][$contract_plain] = $contract;
  }

  // providers dropdown
  $filters['service_provider'] = array(
    '#type' => 'select',
    '#title' => t('Service Provider'),
    '#default_value' => 'Any',
    '#options' => array(
      'any' => 'Any'
    ),
    '#multiple' => false,
    '#name' => 'provider',
  );

  foreach($providers as $provider){
    $provider_plain = check_url($provider);
    $provider_plain = preg_replace('/\s/','-',strtolower($provider_plain));
    $filters['service_provider']['#options'][$provider_plain] = $provider;
  }

  // services checkboxes
  $filters['services'] = array(
    '#attributes' => array(
      'class' => array('checkbox-list'),
      ),
    '#type' => 'container',
  );

  $filters['services']['iaas'] = array(
    '#type' => 'checkbox',
    '#title' => t('IaaS'),
    '#value' => false,
    '#name' => 'iaas',
  );

  $filters['services']['paas'] = array(
    '#type' => 'checkbox',
    '#title' => t('PaaS'),
    '#value' => false,
    '#name' => 'paas',
  );

  $filters['services']['saas'] = array(
    '#type' => 'checkbox',
    '#title' => t('SaaS'),
    '#value' => false,
    '#name' => 'saas',
  );

  $filters['services']['eaas'] = array(
    '#type' => 'checkbox',
    '#title' => t('EaaS'),
    '#value' => false,
    '#name' => 'eaas',
  );

  // if the form was submitted previously...
  if (!empty($_GET)){

    // handle previous submissions manually for service provider
    if (isset($_GET['provider'])){
      $provider_plain = check_url($_GET['provider']);
      $provider_plain = preg_replace('/\s/','-',strtolower($provider_plain));
      if (isset($filters['service_provider']['#options'][$provider_plain])){
        $filters['service_provider']['#value'] = $provider_plain;
      }
      $filters['us_hosting']['#value'] = check_plain($_GET['hosted']);
    }

    // handle previous submissions manually for contract
    if (isset($_GET['contract'])){
      $contract_plain = check_url($_GET['contract']);
      $contract_plain = preg_replace('/\s/','-',strtolower($contract_plain));
      if (isset($filters['contract']['#options'][$contract_plain])){
        $filters['contract']['#value'] = $contract_plain;
      }
    }

    // handle previous submissions manually for services
    foreach($filters['services'] as $k => &$service){
      if (isset($_GET[$service['#name']])){
        $service['#value'] = $_GET[$service['#name']] ? true : false;
      }
    }
  }

  // add service description label
    $filters['services']['description'] = array(
    '#type' => 'markup',
    '#name' => 'Services Offerings',
    '#markup' => '<div class="checkbox-label">Service Offerings</div>',
    '#weight' => -1,
  );

  // services checkboxes
  $filters['filter'] = array(
    '#attributes' => array(
      'class' => array('submission-buttons'),
      ),
    '#type' => 'container',
  );

  // add service description label
    $filters['filter']['description'] = array(
    '#type' => 'markup',
    '#name' => 'Filter Results',
    '#markup' => '<div class="submission-buttons-label">Filter Results</div>',
    '#weight' => -1,
  );

  // add submit button
  $filters['filter']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Filter'),
    '#submit' => array('cloud_computing_data_grid_display_filters_submit'),
    '#name' => '',
    '#processed' => true,
  );

  $path = base_path() . 'cloud-computing/cio-sp3';

  $filters['filter']['reset'] = array(
    '#type' => 'markup',
    '#name' => 'reset',
    '#markup' => '<a class="reset-button" href="' . $path . '">Reset</a>'
  );

  return $filters;
}

function cloud_computing_data_grid_display_filters_unset_id($form){
  unset($form['#build_id'], $form['form_build_id'], $form['form_id']);
  return $form;
}

function cloud_computing_data_grid_display_filters_submit(){
  return;
}

function cloud_computing_data_block_view($delta = ''){
  switch($delta){
    case 'cloud_computing_filters':
      $block['subject'] = t('Cloud Computing Filters');

      $form_state = array();
      $filters = drupal_build_form('cloud_computing_data_grid_display_filters', $form_state);
      $filters['#action'] = base_path() . 'cloud-computing/cio-sp3';
      $block['content'] = drupal_render($filters);

      return $block;
  }
  return null;
}






/**
 *  Class to help make managing company data easier.
 */
class cloud_computing_data_company{

  // instance variables
  public $name              = '';
  public $contract          = '';
  public $roles             = array();   
  public $service_providers = array();
  public $cloud_types       = array();
  public $us_hosted         = array();
  public $iaas              = false;
  public $paas              = false;
  public $saas              = false;
  public $eaas              = false;
  public $fedramp           = false;
  public $other             = false;

  // function to build object from DB row
  public static function build($row){
    $instance = new cloud_computing_data_company();

    $instance -> ccid              = $row -> ccid;
    $instance -> delta             = $row -> delta;
    $instance -> name              = $row -> company;
    $instance -> contract          = $row -> contract;
    $instance -> roles             = explode(';',$row -> role);
    $instance -> service_providers = explode(';',$row -> service_provider);
    $instance -> cloud_types       = explode(';',$row -> cloud_type);
    $instance -> us_hosted         = explode(';',$row -> us_hosted);
    $instance -> iaas              = $row -> iaas;
    $instance -> paas              = $row -> paas;
    $instance -> saas              = $row -> saas;
    $instance -> eaas              = $row -> eaas;
    $instance -> fedramp           = $row -> fedramp;
    $instance -> other             = $row -> other;

    return $instance;
  }

  // function to un-foobar an array of terribly formatted spreadsheet data
  public static function un_foobar_array($foobar_array){

    $assoc_parts = array();
    foreach($foobar_array as $foobar_item){
      $foobar_item = preg_replace('/\?/','',$foobar_item);
      $foobar_item = preg_replace('/(,|;|(<br\/>)|([0-9]\.))/',',',$foobar_item);
      $foobar_parts = explode(',', $foobar_item); // BOOM!    <-- FUUUUNNY
      foreach($foobar_parts as $part){
        $part = trim($part);
        if (!empty($part)){
          $assoc_parts[$part] = $part;
        }
      }
    }

    $fixed_array = array();
    foreach($assoc_parts as $k => $v){
      $fixed_array[] = $v;
    }
    sort($fixed_array);
    return $fixed_array;
  }

  // function to merge multiple companies into one 
  // I wish it were as effecient as the one AT&T uses to combat anti-monopoly measures   <--- FUNNY AGAIN
  public static function merge($companies){
    $merged_company = new cloud_computing_data_company();

    // uncommented string processing code ahead

    foreach($companies as $company){
      if (!empty($company -> name)){
        $merged_company -> name = trim($company -> name);
      }

      $company -> contract = trim($company -> contract);
      if (!empty($company -> contract)){
        $merged_company -> contract = trim($company -> contract);
      }

      $merged_company -> roles = array_merge($merged_company->roles, $company->roles);
      $merged_company -> service_providers = array_merge($merged_company->service_providers, $company->service_providers);
      $merged_company -> cloud_types = array_merge($merged_company->cloud_types, $company->cloud_types);
      $merged_company -> us_hosted = array_merge($merged_company->us_hosted, $company->us_hosted);

      if (($company->iaas) && (strtolower($company->iaas) != 'no')){
        $merged_company -> iaas = true;
      }
      if (($company->paas) && (strtolower($company->paas) != 'no')){
        $merged_company -> paas = true;
      }
      if (($company->saas) && (strtolower($company->saas) != 'no')){
        $merged_company -> saas = true;
      }
      if (($company->eaas) && (strtolower($company->eaas) != 'no')){
        $merged_company -> eaas = true;
      }

      $company -> fedramp = trim($company -> fedramp);
      if (!empty($company -> fedramp)){
        $merged_company -> fedramp = trim($company -> fedramp);
      }
      $company -> other = trim($company -> other);
      if (!empty($company -> other)){
        $merged_company -> other = trim($company -> other);
      }
    }

    // fix all of the corrupt arrays
    $merged_company -> roles = cloud_computing_data_company::un_foobar_array($merged_company -> roles);
    $merged_company -> service_providers = cloud_computing_data_company::un_foobar_array($merged_company -> service_providers);
    $merged_company -> cloud_types = cloud_computing_data_company::un_foobar_array($merged_company -> cloud_types);
    $merged_company -> us_hosted = cloud_computing_data_company::un_foobar_array($merged_company -> us_hosted);

    return $merged_company;
  }

  // function to get DB fields
  public static function db_fields(){
    return array(
      'ccid',
      'delta',
      'company',
      'contract',
      'role',
      'service_provider',
      'cloud_type',
      'us_hosted',
      'iaas',
      'paas',
      'saas',
      'eaas',
      'fedramp',
      'other',
    );
  }

  // function to convert to array for DB insertion
  public function db_values(){
    return array(
      'ccid'             => $this->ccid,
      'delta'            => $this->delta,
      'company'          => $this->name,
      'contract'         => $this->contract,
      'role'             => implode(';',$this->roles),
      'service_provider' => implode(';',$this->service_providers),
      'cloud_type'       => implode(';',$this->cloud_types),
      'us_hosted'        => implode(';',$this->us_hosted),
      'iaas'             => $this->iaas,
      'paas'             => $this->paas,
      'saas'             => $this->saas,
      'eaas'             => $this->eaas,
      'fedramp'          => $this->fedramp,
      'other'            => $this->other,
    );
  }

  // function to convert to array for theming
  public function to_array(){
    return array(
      'ccid'              => $this->ccid,
      'delta'             => $this->delta,
      'company'           => $this->name,
      'name'              => $this->name,
      'contract'          => $this->contract,
      'roles'             => $this->roles,
      'service_providers' => $this->service_providers,
      'cloud_types'       => $this->cloud_types,
      'us_hosted'         => $this->us_hosted,
      'iaas'              => $this->iaas,
      'paas'              => $this->paas,
      'saas'              => $this->saas,
      'eaas'              => $this->eaas,
      'fedramp'           => $this->fedramp,
      'other'             => $this->other,
    );
  }

}

/**
 * This function displays a grid of cloud computing companies
 */
function cloud_computing_data_grid_display($arg){

  // Definitely should have just used views here. Opted to do it live, because
  // I didn't want to create more useless nodes to store cloud 
  // computing details. Really should have just made a "cloud computing dossier"
  // content type or something. At least this executes (comparitively) fast...

  $form_state = array('method' => 'get');
  $filters = drupal_build_form('cloud_computing_data_grid_display_filters', $form_state);

  // get companies   ------------use this to filter company names and apply A-Z Filter----------
  $companies = array();    // array of company names for filtering

  $qry = db_select('cloud_computing_capability_data', 'cd');
  $qry -> fields('cd', cloud_computing_data_company::db_fields());

  // add service provider filter
  if (!empty($form_state['values']['service_provider'])){
    if (strtolower($form_state['values']['service_provider']) != 'any'){
      $provider_plain = check_plain($form_state['values']['service_provider']);
      $provider_wildcards = preg_replace('/-/','%',strtolower($provider_plain));
      $provider_wildcards = '%' . $provider_wildcards . '%';

      $qry -> condition('cd.service_provider', $provider_wildcards, 'LIKE');
    }
  }

    // add service provider filter
  if (!empty($form_state['values']['contract'])){
    if (strtolower($form_state['values']['contract']) != 'any'){
      $contract_plain = check_plain($form_state['values']['contract']);
      $contract_wildcards = preg_replace('/-/','%',strtolower($contract_plain));
      $contract_wildcards = '%' . $contract_wildcards . '%';

      $qry -> condition('cd.contract', $contract_wildcards, 'LIKE');
    }
  }

  // filter by services offered
  $iaas_required = $form_state['values']['services']['iaas'];
  $paas_required = $form_state['values']['services']['paas'];
  $saas_required = $form_state['values']['services']['saas'];
  $eaas_required = $form_state['values']['services']['eaas'];

  if ($iaas_required){ $qry -> condition('cd.iaas', true); }
  if ($paas_required){ $qry -> condition('cd.paas', true); }
  if ($saas_required){ $qry -> condition('cd.saas', true); }
  if ($eaas_required){ $qry -> condition('cd.eaas', true); }

  $qry -> orderBy('cd.company', 'ASC');
  $company_rows = $qry -> execute();

  foreach ($company_rows as $row){
    $company = cloud_computing_data_company::build($row);
    $companies[$company -> name] = $company->to_array();
  }

  $companies_themed = array();
  foreach($companies as $name => $company){
    $company['services_display'] = array();
    $company['services_display']['IaaS'] = cloud_computing_data_wrap_service($company['iaas'], 'IaaS');
    $company['services_display']['PaaS'] = cloud_computing_data_wrap_service($company['paas'], 'PaaS');
    $company['services_display']['SaaS'] = cloud_computing_data_wrap_service($company['saas'], 'SaaS');
    $company['services_display']['EaaS'] = cloud_computing_data_wrap_service($company['eaas'], 'EaaS');
    $companies_themed[] = theme('cloud_computing_item', array('company' => $company));
  }

  $res_path = drupal_get_path('module', 'cloud_computing_data');

  drupal_add_css($res_path . '/theme/cloud-computing.css');
  drupal_add_js($res_path . '/theme/cloud-computing-grid.js');

  return theme('cloud_computing_page', array('companies' => $companies_themed));
}

// filter by company name




/**
 * This function wraps a service name in a span and adds an icon in order
 * to indicate whether a given company provides said service.
 */
function cloud_computing_data_wrap_service($value, $name){
  global $base_url;
  $module_path = $base_url . '/' . drupal_get_path('module', 'cloud_computing_data');
  $returnVal = "";
  if ($value){
    $returnVal .= "<span class='cloud-service-offering offered' title='This contract holder provides $name.'>$name";
    $returnVal .= "<img class='icon' src='{$module_path}/theme/service-provided.png' alt='This contract holder provides $name.'/>";
    $returnVal .= "</span>";
  } else {
    $returnVal .= "<span class='cloud-service-offering not-offered' title='This contract holder does not provide $name.'>$name";
    $returnVal .= "<img class='icon' src='{$module_path}/theme/service-not-provided.png' alt='This contract holder does not provide $name.'/>";
    $returnVal .= "</span>";
  }
  return $returnVal;
}

/**
 * The function that went here has been deleted.
 */ 

/// Database Population Functions //////////////////////////////////////////////

/**
 * This function accepts the nid of a sheetnode, and updates the cloud computing
 * database using the data from said node. It is indended to be triggered via
 * a url redirect (implemented by Rules) after saving the node in question.
 */
function cloud_computing_data_populate_from_node($nid){

  // ensure we have a viable node to work with
  $node = node_load($nid);
  if (!$node){
    drupal_set_message('The specified node was not found.', error);
    return array();
  }
  if ($node -> type != 'sheetnode'){
    drupal_set_message('The specified node is not of the correct type (not a sheetnode).', error);
    return array();
  }

  // include socialcalc api functionality from sheetnode
  require_once(drupal_get_path('module', 'sheetnode') . '/socialcalc.inc');

  // standard column mapping for cloud computing sheet
  $col_mapping = array(
    'A' => 'company',
    'B' => 'contract',
    'C' => 'role',
    'D' => 'service_provider',
    'E' => 'cloud_type',
    'F' => 'us_hosted',
    'G' => 'iaas',
    'H' => 'paas',
    'I' => 'saas',
    'J' => 'eaas',
    'K' => 'fedramp',
    'L' => 'other',
  );

  $sheetnodes = db_query("SELECT * FROM {sheetnode} WHERE nid in (:nid) GROUP BY nid", array(':nid' => $nid));
  if (empty($sheetnodes)){
    throw new Exception('Unable to find a sheetnode with matching id in database.');
  }
  foreach($sheetnodes as $sheetnode){
    $sheet = socialcalc_parse_sheet((string) $sheetnode->value);
  }

  // transpose values into an easy-to-reference 2d array
  $rows = array();
  foreach($sheet['cells'] as $loc => $cell){
    $row = preg_replace('/[^0-9]/', '',$loc);
    $col = preg_replace('/[0-9]/', '',$loc);
    $rows[$row][$col] = $cell['datavalue'];
  }

  $unmerged_companies = array();
  $last_company_name = '';
  foreach($rows as $k => $row){

    $mapped_row = array();
    foreach($row as $row_key => $row_val){
      $mapped_row[$col_mapping[$row_key]] = $row_val;
    }

    $company = cloud_computing_data_company::build((object)$mapped_row);

    if (!(empty($company->name))){
      $last_company_name = $company -> name;
    } else {
      $company -> name = $last_company_name;
    }

    if (!isset($unmerged_companies[$company -> name])){
      $unmerged_companies[$company -> name] = array();
    }

    $unmerged_companies[$company -> name][] = $company;
  }

  $companies = array();
  foreach($unmerged_companies as $name => $company_group){
    $company = cloud_computing_data_company::merge($company_group);
    if (strtolower($company -> name) != 'company'){
      $companies[$company -> name] = $company;
    }
  }

  // clear existing data
  $query = db_delete('cloud_computing_capability_data') -> where(1);
  $query -> execute();

  // insert new values into database.
  $query = db_insert('cloud_computing_capability_data');
  $query -> fields(cloud_computing_data_company::db_fields());

  $ccid = 0;
  foreach($companies as $name => $row){

    $delta = 0;
    $row->ccid = $ccid;
    $row->delta = $delta;

    $query->values($row->db_values());
    $ccid++;
  }

  $query->execute();
  drupal_set_message('The CIO-SP3 / SB Cloud Computing database has been updated!');
  drupal_set_message("Debug info: $ccid companies recognized and added to database.");
  drupal_goto("node/$nid");
  return array();





 }
4

1 回答 1

0

尝试词汇表视图模式。看到这个http://www.youtube.com/watch?v=18Ajtmstxsg

于 2013-10-07T15:32:12.310 回答