2013-04-23 2 views
1

문자 A를 사용하여 문자를 클릭하여 항목을 필터링하려면 A-Z 막대를 사용하려고합니다. (예 : "A"를 클릭하면 "A"목록 만 표시되고 "B"는 "B"목록 만 표시, "C"가 아닌 경우 "C"가 표시되지 않음, "ABDE")PHP를 사용하여 사용자 정의 Drupal 모듈에 A-Z 막대 설정

This PHP에 있으며 사용자 정의 DRUPAL 모듈의 일부입니다. 내용은 이미 알파벳 순으로되어 있습니다.

아래 코드가 많이 있다는 것을 알고 있습니다.이 문제를 해결하기 위해 어디서 또는 무엇을 적용해야할지 모릅니다.

귀하의 모든 도움에 미리 감사드립니다. 적색을 얻으려고 노력

앨런

임은 RED 채워진 상자에 상자를 설명했다.

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

보기로 이동하여 용어집보기를 활성화하십시오! –

+0

이 모듈은 블록에 내장 된 사용자 정의 모듈입니다. 그것은 실시간으로, Drupal 시스템에 업로드 된 speadsheet로부터 만들어진 배열의 내용을 렌더링합니다. 나는 건축이나 디자인을하지 않았고, 불행하게도 그것을 처음부터 재구성 할 시간이나 자원이 없다. 다른 생각들 – Alan

+0

용어집 모듈을 수정하고보기 자동 갱신 모듈을 설치하여 원하는 것을 얻을 수 있습니다! 원하는 방식으로보기를 사용자 정의 할 수도 있습니다. 더 명확하게 스크린 샷을 게시 할 수 있습니까? –

답변

0

용어집 모드를 사용해보십시오. 이 부분을 참조하십시오

관련 문제