文字のクリックに基づいてエントリをフィルタリングするために、AZ バーの印刷を使用しようとしています。(つまり、「A」をクリックすると「A」のリストのみが表示され、「B」をクリックすると「B」のリストのみが表示されます。「C」のリストよりも「C」のリストが表示されない場合は、「ABDE」が表示されます)
これは PHP であり、カスタム DRUPAL モジュールの一部です。内容はすでにアルファベット順になっています。
以下にたくさんのコードがあることは知っていますが、この問題を解決するためにどこに何を適用すればよいかわかりません。
よろしくお願いいたします。
アラン
赤枠のボックスを赤塗りつぶしボックスに入れようとしています。
すみません、画像アップに時間がかかりました。お世話になりました!
<?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();
}