2011-01-03 23 views
6

Tôi có một danh sách khổng lồ các công ty (nodetype: company, field duy nhất là title) mà tôi muốn hiển thị theo cách tốt đẹp. dictionnary như thế này:Drupal: cách sắp xếp và hiển thị các nút nhóm theo chữ cái đầu tiên trong dạng xem

A 
Abc company 
Alot of work company 

B 
Beautiful company 
Best company 

Cố gắng tìm cách để làm điều đó một cách trang nhã; không có module nào tồn tại cho điều đó. Bất kỳ ý tưởng ?

Trả lời

2

Để thực hiện những gì bạn muốn làm bằng Chế độ xem và không phải một số mô-đun được đóng góp khác, như Bảng thuật ngữ, bạn sẽ phải xác định và chủ đề chế độ xem của riêng bạn.

Trước tiên, bạn sẽ cần phải tạo một nút mới Xem. Tôi sẽ gọi nó là myglossary, nhưng nó không quan trọng. Đảm bảo rằng một trong các trường của bạn là tiêu đề nút và được sắp xếp theo tiêu đề nút, tăng dần. Nói cách khác, thứ tự chữ cái. Tôi giả sử bạn sẽ sử dụng kiểu hàng không định dạng (mặc định), nhưng bạn có thể làm điều gì đó tương tự với các kiểu hàng khác.

Sau đó, bạn sẽ phải tham gia chủ đề của mình. Từ thư mục views/theme, sao chép mẫu views-view-unformatted.tpl.php vào thư mục của chủ đề bạn đang sử dụng. Đổi tên thành chế độ xem-view-unformatted - myglossary.tpl.php để nó sẽ chỉ được sử dụng cho chế độ xem này. Sau đó, mở tập tin template.php của chủ đề của bạn, và thêm một chức năng preprocess:

//Change mytheme to your theme name 
function mytheme_preprocess_views_view_unformatted__myglossary(&$vars) { 
    //If you have the devel module installed, 
    //this is a great way to see all the available variables 
    //dpm($vars); 

    $results = $vars['view']->result; 
    $rows = $vars['rows']; 

    //Sort rows into letter sets 
    $letters = array(); 
    $i = 0; 
    foreach ($results as $result) { 
    $first_letter = strtolower(substr($result->node_title, 0, 1)); 
    if (is_array($letters[$first_letter])) { 
     array_push($letters[$first_letter], $rows[$i]); 
    } 
    else { 
     $letters[$first_letter] = array($rows[$i]); 
    } 
    $i++; 
    } 

    //Generate glossary navigation 
    $nav = ''; 
    foreach($letters as $letter => $rows) { 
    $num = count($rows); 
    $cap_letter = strtoupper($letter); 
    $nav .= <<<NAV 
<a href="#$letter" class="letter_link"> 
    $cap_letter 
</a> 
($num) 
NAV; 
    } 

    //Add to variables 
    $vars['nav'] = $nav; 
    $vars['letters'] = $letters; 
} 

Sau đó, bạn sẽ phải thay đổi mẫu tập tin bạn đã sao chép qua trước đó để thêm trong điều hướng, và để sản xuất các hàng theo kiểu bảng chú giải thuật ngữ:

<?php if (!empty($title)): ?> 
    <h3><?php print $title; ?></h3> 
<?php endif; ?> 

<?php if (!empty($nav)): ?> 
    <div id="glossary_nav"> 
    <?php print $nav; ?> 
    </div> 
<?php endif; ?> 

<?php foreach ($letters as $letter=>$rows): ?> 
    <a name="<?php print $letter ?>"></a> 
    <h4 class="letter"> 
    <?php print strtoupper($letter); ?> 
    </h4> 
    <?php foreach ($rows as $id=>$row): ?> 
    <div class="<?php print $classes[$id]; ?>"> 
    <?php print $row; ?> 
    </div> 
    <?php endforeach;?> 
<?php endforeach; ?> 

Bạn có thể cần phải tạo lại sổ đăng ký chủ đề để các thay đổi của bạn hiển thị trên trang web của bạn.

+0

Cách tiếp cận này có thể hoạt động, nhưng bạn không cần thực hiện việc này. Bạn có thể đạt được cùng một ảnh hưởng mà không cần bất kỳ mã tùy chỉnh nào. – messedup

6

Hãy xem the Views module, cung cấp chế độ xem được gọi là "Bảng thuật ngữ". Đó là loại nội dung theo thứ tự bảng chữ cái, và tạo ra một chỉ số thư của các loại. Ngoài ra hãy xem http://drupal.org/node/441024 mặc dù có thể cô đã sử dụng the Glossary module. Ngoài ra còn có một mô-đun gọi là Dictionary (demo).

+0

Thx gần như những gì tôi muốn; theo liên kết của bạn và đến một http://nanwich.info/glossary đó chính xác những gì tôi muốn. Nhưng tôi bị mắc kẹt trong quan điểm args; tôi muốn hiển thị tất cả các chữ cái nhưng tôi chỉ có thể chỉ định 1 ký tự – Disco

+0

Bạn không thể để trống khung nhìn arg và sau đó nó sẽ hiển thị tất cả? – shanabus

1

Nếu bạn sử dụng mô-đun Chế độ xem, bạn đã thử sử dụng phương pháp tiền xử lý trong mẫu chưa? Bạn sẽ không được trả lại dữ liệu từ nguồn dữ liệu của bạn trong thời trang đó nhưng bạn có thể sắp xếp nó bằng bất kỳ phương pháp tùy ý bạn muốn một khi nó được trả lại, nó sẽ giống như thế này:

function templatename_preprocess_views_view__All_Images(&$vars) 
{ 
    global $base_url; 
$images = array(); 
//drupal_add_js('$("a.colorbox").colorbox();','inline'); 
foreach($vars['view']->result as $img) 
{ 
    $nid = $img->nid; 
    $node = node_load($nid); 
    $images[$nid]['orig_img_url'] = $base_url . '/' . file_create_path($node->images['_original']); 
    $images[$nid]['thumb_img_url'] = $base_url . '/' . file_create_path($node->images['thumbnail']); 
} 
$vars['images'] = $images; 

}

Bằng cách đó bạn có thể sắp xếp theo chữ cái đầu tiên và thực hiện thay đổi cho mảng và nó sẽ được gửi ra để xem của bạn trong thời trang bạn mong muốn. Đây là một ví dụ tôi đã thực hiện cho các đường dẫn hình ảnh nhưng bạn có thể sử dụng nhiều phương thức phân loại của PHP để có được sắp xếp mà bạn yêu cầu.

+0

Bạn có thể đưa ra một số ví dụ không? – Disco

+0

sử dụng print_r ($ vars) để xem bạn sẽ làm việc với biến nào. Sau đó, bạn có thể thay đổi các biến này trước khi chúng được sử dụng trong chế độ xem của bạn. –

1

Mô-đun Views grouping Limit có thể đưa bạn đến nơi muốn đi.

+0

Không; tôi không muốn giới hạn thực sự; tôi muốn nhóm BY chữ cái đầu tiên của tiêu đề nút. – Disco

12

Bạn không thực sự cần phải đi xuống đường dẫn mã để đạt được điều này. Bạn có thể thấy một số điều này được mô tả tại đây: http://drupal.org/node/641342

Về cơ bản, thêm tiêu đề nút vào chế độ xem hai lần. Đầu tiên là trường thông thường của bạn với các liên kết, v.v. Thứ hai là cho nhóm.

Trường thứ hai bạn đánh dấu để loại trừ khỏi màn hình, xóa nhãn và cắt trường thành độ dài tối đa là 1 (bỏ chọn các tùy chọn ranh giới từ, dấu ba chấm và html).

Sau đó, trong tùy chọn "kiểu hàng", bạn sẽ tìm thấy cài đặt "nhóm theo" và bạn chỉ cần chọn trường tiêu đề nút thứ hai.

Bạn có thể cần phải áp dụng thêm theming nếu bạn muốn có nó trông một cách nào đó hoặc có thể thêm neo cho mỗi chữ cái, nhưng mặt khác nên hoạt động cho phiên bản 6 của Drupal với tầm 2 mô-đun

Ngoài ra, tôi nên chỉ ra nhóm theo mô-đun http://drupal.org/project/views_groupby có thể cung cấp một số chức năng bổ sung nhưng không thực sự cần thiết cho câu hỏi ban đầu.

+0

suy nghĩ tốt đẹp, vì tôi đang giải quyết một vấn đề tương tự, làm thế nào bạn sẽ "điền vào" các chữ cái không mang lại bất kỳ kết quả nào? – magtak

+0

nvm nhận bản thân: http://drupal.stackexchange.com/questions/20754/views-group-by-first-letter-of-results/20855 – magtak

+0

Với Drupal 7 Tôi không thể tìm thấy "kiểu hàng" hoặc " nhóm theo ", nhưng tìm thấy các điều khiển tương đương trong Hiển thị -> Chi tiết trang -> Định dạng -> Định dạng -> Cài đặt – tremby

0

Bạn có thể đạt được chức năng tương tự bằng cách tạo chế độ xem với bộ lọc AZ (hoặc bạn có thể thay đổi mã đó). Tôi đã viết một bài về vấn đề này tại số blog của tôi. Hy vọng nó giúp.

1

điều này có thể được thực hiện đơn giản bằng lượt xem. Tôi đã làm nó để tạo một danh sách tương tự cho phân loại:

  1. Tôi đã tạo một danh sách đơn giản về tất cả các thuật ngữ phân loại tức là tên thuật ngữ là trường.
  2. Sau đó, tôi đã thêm trường thuật ngữ phân loại một lần nữa nhưng lần này tôi đã sử dụng nó để lấy tên đầu tiên của thuật ngữ, đặt lại đầu ra-> số giới hạn của ký tự-> true. và đặt giới hạn thành 1. Đồng thời loại trừ trường này khỏi màn hình.
  3. Bây giờ, hãy chuyển đến Định dạng-> cài đặt và sử dụng trường ký tự đơn cho nhóm . Cuối cùng, sắp xếp các kết quả với bộ lọc hạn phân loại.
Các vấn đề liên quan