使用 PHP 在自定义 Drupal 模块中设置 A-Z 栏

Posted

技术标签:

【中文标题】使用 PHP 在自定义 Drupal 模块中设置 A-Z 栏【英文标题】:Set up a A-Z Bar in a Custom Drupal module using PHP 【发布时间】:2013-04-23 15:10:16 【问题描述】:

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

这是在 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();





 

【问题讨论】:

转到视图并启用词汇表视图! 这个模块是一个自定义的模块,内置在一个块中。它实时渲染从上传到 Drupal 系统的电子表格构建的数组中的内容。我没有建造或设计它,不幸的是我没有时间或资源将它从头开始重建为视图。任何其他想法 您可以修改词汇表模块并安装视图自动刷新模块来实现您想要的!您还可以按照自己的方式自定义该视图!也许您可以发布屏幕截图以使其更清晰! 我在顶部添加了一张图片,希望为我正在寻找的内容提供指导。如果这是一个观点,我不需要寻求帮助,这很容易。感谢大家的帮助。 好的。使用词汇表视图,如果您已经进行了演示,则可以添加那些过滤器(如果这些过滤器是 CCK/Field API 字段)。顺便提一句。您是否演示了词汇表视图? 【参考方案1】:

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

【讨论】:

以上是关于使用 PHP 在自定义 Drupal 模块中设置 A-Z 栏的主要内容,如果未能解决你的问题,请参考以下文章

Vue unicons - 在自定义图标中设置 viewBox

Drupal 8添加javascript并使用自定义模块在钩子中传递数据

使用依赖属性在自定义类中设置属性

Drupal,在自定义 php 页面上嵌入视图块/结果

如何在自定义 HttpMessageHandler 中设置属性?

在自定义 uitableviewcell 中设置图像会导致延迟