Điểm:1

Đang cố trả lại vùng trong đề xuất chủ đề cho khối cây sách mô-đun sách

lá cờ cn

Chỉnh sửa câu hỏi dựa trên thông tin từ @NoSssweat

Mô-đun sách sử dụng cùng một hook cho khối cây sách và chế độ xem chỉ mục được hiển thị trong trang sách.

Tôi đã sử dụng đoạn mã dưới đây để trả về các đề xuất tên tệp để tôi có thể ghi đè đầu ra html cho khối cây sách ở một vùng cụ thể - "thanh bên đầu tiên". Tôi mong đợi đoạn mã dưới đây sẽ phun ra một cái gì đó như book-tree--book-toc-180--sidebar-first.html.twig. Thay vào đó, nó chỉ đưa ra gợi ý tên tệp đã được gợi ý:

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180.html.twig
   x book-tree.html.twig
-->

Gợi ý tên tệp này giống với nội dung chính trên trang sách. Làm cách nào tôi có thể nhắm mục tiêu bất kỳ khối cây sách nào trong thanh bên đầu tiên khu vực?

// Thêm biến vùng vào khối.
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
function uswds_subtheme_pre process_book_tree__book_toc_180(&$variables) {
    if (isset($variables["elements"]["#id"])) {
        $block_id = $variables["elements"]["#id"];
        $block = \Drupal\block\Entity\Block::load($block_id);

        nếu ($khối) {
            $variables["content"]["#attributes"]["region"] = $block->getRegion();
        }
    }
}

// thêm đề xuất mẫu dựa trên tên khu vực
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
function uswds_subtheme_theme_suggestions_book_tree__book_toc_180_alter(mảng &$suggestions, mảng $variables) {
    if (isset($variables["attributes"]["region"])) {
        $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["thuộc tính"]["khu vực"];
    }
}

lần thử thứ 2 Tôi đã làm như bên dưới và nó hoạt động nhưng nó chỉ hoạt động đối với khối mặc định của mô-đun sách, mặc dù bất kỳ plugin khối mô-đun sách nào khác hầu hết đều sử dụng sách-tree.html.twig

// Thêm biến vùng vào khối.
function uswds_subtheme_pre process_block(&$variables) {
  if (isset($variables["elements"]["#id"])) {
    $block_id = $variables["elements"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);

    nếu ($khối) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

// thêm đề xuất mẫu dựa trên tên khu vực
function uswds_subtheme_theme_suggestions_alter(mảng &$suggestions, mảng $variables, $hook) {
  if (isset($variables["attributes"]["region"])) {
    $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["thuộc tính"]["khu vực"];
  }
}
No Sssweat avatar
lá cờ ua
Điều này có trả lời câu hỏi của bạn không? [Xác định khối menu được hiển thị ở khu vực nào](https://drupal.stackexchange.com/questions/218907/determine-which-region-a-menu-block-is-rendered-in)
lá cờ cn
@NoSssweat - không hoàn toàn, vì tôi đang tìm kiếm xem liệu có thể thực hiện được trong cành cây không
lá cờ cn
@NoSssweat - câu hỏi thêm: Tôi đã cố gắng thêm phần này thông qua chủ đề phụ của mình bằng cách tạo tệp my_subtheme.theme, nhưng điều này dường như không hoạt động (tôi đoán là tính kế thừa không hoạt động theo cách đó?).
No Sssweat avatar
lá cờ ua
Giả sử chủ đề phụ của bạn được đặt làm chủ đề hiện tại, thì nó sẽ hoạt động, có lẽ bạn đã không xóa bộ đệm để các móc được chọn?
lá cờ cn
@NoSssweat - xem cập nhật. Đã xóa bộ nhớ cache.
Điểm:2
lá cờ ua

hoặc làm thế nào tôi có thể làm điều gì đó trong cành cây, như {% if khu vực == 'thanh bên đầu tiên' %} và chỉ ghi đè lên book-tree.html.twig

// Thêm thuộc tính vùng vào khối.
function uswds_subtheme_pre process_block(&$variables) {
  if (isset($variables["elements"]["#id"])) {
    $block_id = $variables["elements"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);
    nếu ($khối) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

/**
 * Triển khai hook_pre process_HOOK().
 *
 * Tạo biến vùng
 *
 * Loại bỏ thuộc tính khu vực được thêm vào uswds_subtheme_pre process_block() vì nó
 * không phải là thuộc tính HTML hợp lệ.
 */
function uswds_subtheme_pre process_book_tree(&$variables) {
  if (isset($variables['attributes']['region'])) {
    // tạo biến vùng cho book-tree.html.twig
    $variables['khu vực'] = $variables['thuộc tính']['khu vực'];
    // hủy đặt thuộc tính html không hợp lệ.
    unset($variables['attributes']['region']);
  }
}
lá cờ cn
Thật không may, điều này không bao giờ được gọi là - `uswds_subtheme_pre process_book_tree`.
No Sssweat avatar
lá cờ ua
Nó phải như vậy, bạn đã xóa bộ nhớ cache chưa? Nếu có, hãy kiểm tra xem nó có bị lỗi khi đặt điều kiện không.
Điểm:1
lá cờ cn

Sử dụng tất cả sự trợ giúp từ @NoSssweat và tôi đã có thể làm việc này:

// Thêm biến vùng vào khối.
function uswds_subtheme_pre process_block(&$variables) {
  if (isset($variables["elements"]["#id"])) {
    $block_id = $variables["elements"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);

    nếu ($khối) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

// thêm đề xuất mẫu dựa trên tên khu vực
function uswds_subtheme_theme_suggestions_alter(mảng &$suggestions, mảng $variables, $hook) {
  if (isset($variables["attributes"]["region"])) {
    $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["thuộc tính"]["khu vực"];
  }
}

Kết quả đầu ra nào (gợi ý thứ hai bao gồm cả khu vực):

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180--sidebar-first.html.twig
   x book-tree.html.twig
-->

Cập nhật lên phiên bản làm việc:

<?php
// Thêm biến vùng vào khối. Chỉ áp dụng cho một số phiên bản plugin sử dụng book-tree.html.twig 
function uswds_subtheme_pre process_block(&$variables) {
    if (isset($variables["elements"]["#id"])) {
      $block_id = $variables["elements"]["#id"];
      $block = \Drupal\block\Entity\Block::load($block_id);
  
      nếu ($khối) {
        $variables["content"]["#attributes"]["region"] = $block->getRegion();
      }
    }
  }

// Thêm đề xuất mẫu vào khối. Có vẻ như hoạt động ở mọi nơi, nhưng không nhắm mục tiêu vào cây sách
hàm uswds_subtheme_theme_suggestions_block_alter(mảng &$suggestions, mảng $variables){
    if (!empty($variables['elements']['#id'])) {
        $block = \Drupal\block\Entity\Block::load($variables['elements']['#id']);
        $region = $block->getRegion();
        // thêm đề xuất với ID khu vực và khối
        $suggestions[] = 'chặn__' . $ khu vực . '__' . $variables['elements']['#id'];
        // thêm đề xuất với id khu vực
        $suggestions[] = 'chặn__' . vùng $;
    }
}


// thêm đề xuất mẫu dựa trên tên khu vực
function uswds_subtheme_theme_suggestions_alter(mảng &$suggestions, mảng $variables, $hook) {
  if (isset($variables["attributes"]["region"])) {
    $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["thuộc tính"]["khu vực"];
  }
}
No Sssweat avatar
lá cờ ua
Tôi đã sử dụng Bartik khi viết mã, bạn nên thêm chức năng hook cuối cùng của tôi; nếu không, bạn sẽ có một thuộc tính HTML bất hợp pháp.
lá cờ cn
@NoSssweat - một câu hỏi nữa (và cảm ơn vì tất cả sự trợ giúp) - đoạn mã trên của tôi dường như chỉ hoạt động cụ thể với khối do mô-đun sách cung cấp. Nó không cung cấp gợi ý cho bất kỳ plugin nào khác, mặc dù các plugin khác cũng phụ thuộc vào `book-tree.html.twig`. Làm cách nào để tôi nhận được đề xuất bổ sung cho BẤT KỲ khối nào đang sử dụng `book-tree.html.twig` và đã xuất ra `book-tree--book-toc-180.html.twig`?
lá cờ cn
@NoSssweat hoặc làm cách nào tôi có thể thực hiện điều gì đó trong twig, chẳng hạn như `{% if region == 'sidebar-first' %}` và chỉ cần ghi đè `book-tree.html.twig`?
No Sssweat avatar
lá cờ ua
xem [câu trả lời mới nhất của tôi](https://drupal.stackexchange.com/a/308235/27710)
Điểm:1
lá cờ ua

Rất vui, vì đây là một cuốn sách chứ không phải thực đơn, quá trình này tương tự, nhưng không hoàn toàn giống nhau. Tôi đã hy vọng bạn sẽ tìm ra nó.

Nhưng dù sao đi nữa, ở đây bạn đi:

/**
 * Triển khai hook_pre process_HOOK().
 *
 * Truyền giá trị vùng khối cho nội dung để giá trị này có thể được sử dụng trong
 * uswds_subtheme_theme_suggestions_menu_alter() vì $variables['elements']
 * không có sẵn ở đó.
 */
function uswds_subtheme_pre process_block(&$variables) {
  if (isset($variables['elements']['#id']) && $variables['base_plugin_id'] === 'book_navigation') {
    $region = \Drupal\block\Entity\Block::load($variables['elements']['#id'])->getRegion();
    $content = $variables['content'];
    foreach ($content as $content_key => $content_info) {
      if (is_numeric($content_key)) {
        $variables['content'][$content_key]['#attributes']['region'] = $region;
      }
    }
  }
}

/**
 * Triển khai hook_theme_suggestions_HOOK_alter().
 *
 * Cung cấp gợi ý sách dựa trên khu vực.
 */
function uswds_subtheme_theme_suggestions_book_tree_alter(&$suggestions, mảng $variables) {
  if (isset($variables['attributes']['region'])) {
    $suggest = 'book__' . $variables['theme_hook_original'] . '__' . $variables['attributes']['region'];
    $suggestion = str_replace('-', '_', $suggestion);
    $suggestions[] = $suggestions;
  }
}

/**
 * Triển khai hook_pre process_HOOK().
 *
 * Loại bỏ thuộc tính khu vực được thêm vào uswds_subtheme_pre process_block() vì nó
 * không phải là thuộc tính HTML hợp lệ.
 */
function uswds_subtheme_pre process_book_tree(&$variables) {
  if (isset($variables['attributes']['region'])) {
    unset($variables['attributes']['region']);
  }
}
lá cờ cn
Thật không may, tôi không thấy bất kỳ thay đổi nào trong đề xuất cho book-tree.html.twig
lá cờ cn
Nhìn xa hơn, tôi không tin rằng chức năng thứ hai đang thực thi, vì tôi có thể thay đổi một số giá trị - chẳng hạn như 'book__' thành 'books__' và thay đổi đó không bao giờ xảy ra.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.