2013-04-23 79 views
1

我試圖使用打印A-Z欄來根據字母點擊過濾條目。 (即點擊「A」只顯示「A」列表,點擊「B」只顯示「B」列表,如果沒有「C」列表而不是「C」列表,則顯示「ABDE」)在自定義Drupal模塊中使用PHP設置A-Z欄

在PHP中,是定製DRUPAL模塊的一部分。內容已經按字母順序排列。

我知道有很多代碼在下面,我只是不知道在哪裏或者什麼要應用來解決這個問題。

非常感謝您的幫助。

艾倫

我試着去獲得紅色標出箱成紅色填充的框。

enter image description here

對不起了這麼久才的圖像了。謝謝你的幫助!

<?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(); 





} 
+1

轉到視圖並啓用術語表視圖! – 2013-04-23 16:20:34

+0

該模塊是一個內置於塊中的自定義Mod。它實時渲染從一個數字表格上傳到Drupal系統的數組中的內容。我沒有建立或設計它,不幸的是我沒有時間或資源來重建它從一個視圖。任何其他想法 – Alan 2013-04-23 16:23:29

+0

您可以修改詞彙表模塊並安裝視圖自動刷新模塊來實現您想要的!您還可以以您想要的方式自定義該視圖!也許你可以發佈一個屏幕截圖,使其更清晰! – 2013-04-23 16:58:58

回答