Làm cách nào để tắt trường tiêu đề trên biểu mẫu chỉnh sửa nút?


8

Làm cách nào để ẩn hoặc tắt trường tiêu đề trên biểu mẫu chỉnh sửa nút?

Nếu tôi làm như vậy từ loại nội dung Quản lý tab hiển thị biểu mẫu ( admin/structure/types/manage/CONTENT_TYPE_MACHINE_NAME/form-display), thì tôi sẽ gặp một số lỗi ràng buộc toàn vẹn trong nhật ký.

Vì vậy, tôi không muốn hiển thị trường tiêu đề mặc định trong biểu mẫu chỉnh sửa Node. Nếu tôi ẩn trường tiêu đề bình thường như các lĩnh vực khác. Có màn hình trắng sau khi tạo nút. Và nhật ký cho biết trường tiêu đề không thể rỗng .... và cứ thế ...


Bạn đang tìm kiếm Node::setTitle?
Jimmy Ko

@JimmyKom Cảm ơn bạn đã bình luận. hãy để tôi viết lại, tôi không muốn hiển thị trường tiêu đề mặc định trong biểu mẫu chỉnh sửa nút. Nếu tôi ẩn trường tiêu đề bình thường như các lĩnh vực khác. Có màn hình trắng sau khi tạo nút. Và nhật ký cho biết trường tiêu đề không thể rỗng .... và cứ thế ...
Mudassar Ali

bạn có giải quyết vấn đề của bạn không?
Adrian Cid Almaguer

Câu trả lời:


6

Bạn có thể sử dụng hàm hook_form_alter () để thay đổi bất kỳ biểu mẫu nào (bao gồm cả biểu mẫu chỉnh sửa nút) và tắt trường Tiêu đề . Kiểm tra mã mẫu dưới đây:

use Drupal\field_collection\Entity\FieldCollectionItem;

function [MODULE_NAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  switch ($form_id) {
    case 'node_[CONTENT_TYPE]_edit_form':
      $form['title']['#disabled'] = 'disabled';
      break;
  }
}

Nếu bạn chỉ thay đổi một hình thức, bạn có thể kiểm tra hàm hook_form_FORM_ID_alter () và thay đổi FORM_ID bằng nút_ [CONTENT_TYPE] _edit_form trong đó CONTENT_TYPE là dạng loại nút của bạn.

BIÊN TẬP :

Để tự động đặt tiêu đề nút mà không cho phép người dùng xem trường tiêu đề, bạn có thể sử dụng Mô-đun nhãn thực thể tự động . Mô-đun này là phiên bản dành cho D8, nhưng chúng tôi có thể dùng thử nếu hoạt động đúng.

Nếu không muốn sử dụng mô-đun Nhãn thực thể tự động , bạn có thể thử thực hiện tương tự với mã tùy chỉnh, kiểm tra mã mẫu tại đây


Cảm ơn nhưng vô hiệu hóa các lĩnh vực không phải là một vấn đề. Dường như lõi drupal không cho phép tạo nút mà không có tiêu đề. Làm thế nào bạn sẽ giải quyết lỗi này từ DBDrupal\Core\Entity\EntityStorageException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null: INSERT INTO {node_field_data}
Mudassar Ali

Ok, về cơ bản, bạn không muốn hiển thị trường tiêu đề không thêm hoặc chỉnh sửa nội dung nút và cho phép người dùng tạo nội dung, phải không? Nếu có, hãy xem mô-đun Nhãn thực thể tự động này nếu điều này có ích. Các mô-đun hiện đang ở phiên bản dev của nó.
Yogesh

đó là trong dev cho D8. không chắc chắn an toàn để sử dụng ...
Mudassar Ali

1
Nếu mô-đun Nhãn thực thể tự động không hoạt động, bạn có thể thử mã mẫu được cung cấp trên liên kết này Tự động điền tiêu đề Drupal 8 không? .
Yogesh

1
Làm thế nào để bạn xác định các nút trong giao diện quản trị nếu chúng không có tiêu đề? Làm thế nào bạn có kế toán cho dữ liệu meta và như vậy? Điều này là khá không chính thống, chỉ cần nói. Tốt nhất để điền vào một số giá trị, bằng cách nào đó.
Kevin

4

tl; dr: Chỉ định tiêu đề mặc định và không cho phép người dùng thay đổi tiêu đề.

Trạng thái hồ sơ thay đổi D7 → D8 :

node_type-> has_title bị xóa theo hướng hiển thị biểu mẫu thực thể

Bây giờ có thể định cấu hình hành vi của tiện ích tiêu đề nút bằng cách sử dụng biểu mẫu Entity, cờ đặc biệt để ẩn phần tử biểu mẫu tiêu đề cho các nút không còn cần thiết nữa.

Để ẩn tiêu đề cho một loại nút nhất định, hãy sử dụng giao diện người dùng "Quản lý hiển thị biểu mẫu" hoặc ẩn nó bằng một đoạn như sau:

$form_display = entity_get_form_display('node', 'article', 'default');
$form_display->removeComponent('title');
$form_display->save();

Sau khi đọc nó, tôi đã thử một vài cách để làm điều đó. Chỉ có câu cuối cùng hoạt động, vì vậy câu trả lời này sẽ đóng vai trò là lời cảnh báo về những điều không nên thử:

Chỉnh sửa cấu hình entity_form_display

Nếu đó là mô-đun của riêng bạn, hãy chỉnh sửa core.entity_form_display.node.my_content_type.default.ymlvà xóa titlekhóa khỏi content. Điều này hoạt động cho các trường, nhưng nếu tôi loại bỏ tiêu đề hoặc bất kỳ thứ mặc định nào khác như quảng cáo, tạo, v.v., chúng vẫn được hiển thị trên biểu mẫu tại /node/add/my_content_type.

Sửa đổi thực thể_form_display trong mã

Thêm mã này vào my_module_install:

$form_display = entity_get_form_display('node', 'my_content_type', 'default');
$form_display->removeComponent('title');
$form_display->save();

Điều này hoạt động trực quan, nhưng có ba vấn đề với giải pháp này: - Nó vẫn gây ra các lỗi ràng buộc toàn vẹn mà bạn đề cập đến. - Nó làm cho cấu hình trong cơ sở dữ liệu ghi đè lên cấu hình trong tệp khi cài đặt, đó là một ý tưởng tồi, IMHO. - entity_get_form_displaykhông được dùng nữa

Ẩn nó trong cấu hình entity_form_display

Ẩn nó đi, nhưng đừng xóa nó. Trong core.entity_form_display.node.my_content_type.default.yml:

hidden:
  title: false

Bằng cách thử nghiệm và lỗi, tôi tìm thấy logic được đảo ngược ở đây. Điều này cũng gây ra các lỗi ràng buộc toàn vẹn mà bạn đề cập đến.

Ẩn nó bằng CSS

Tôi đã thử điều này và dường như các chuỗi trống cũng không được phép cho tiêu đề. Vì vậy, bạn phải tạo loại thực thể của riêng mình, nó sẽ tái hiện hầu hết mã từ mô-đun nút lõi hoặc ...

Giải pháp làm việc duy nhất tôi có thể tìm thấy

Chỉ định tiêu đề mặc định và không cho phép người dùng thay đổi tiêu đề.

function my_module_form_node_my_content_type_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  $form['title']['#disabled'] = 'disabled';
  $form['title']['widget'][0]['value']['#default_value'] = 'none';
}

Bạn có thể đổi nonethành my_moduledấu thời gian hoặc nhãn hiệu bơ đậu phộng yêu thích của bạn.


2

Đây là cách tôi giải quyết vấn đề này trong một dự án. Tại thời điểm này, Nhãn thực thể tự động không có phiên bản Drupal 8, nếu bạn thấy mã bạn sẽ chỉ tìm thấy tệp info.yml.

Bạn luôn cần đặt tiêu đề, vì vậy trong quá trình tạo thực thể bạn đặt tiêu đề.

use Drupal\node\NodeInterface;

/**
 * Implements hook_ENTITY_TYPE_create
 */
function YOUR_MODULE_node_create(NodeInterface $node) {
  switch ($node->getType()) {
    case 'CONTENT_TYPE_MACHINE_NAME':
      $node->title = 'Date: ' . date('Y-m-d G:i:s');
      break;
  }
}

Và phần khác là ẩn tiêu đề ở dạng nút, để làm điều này bạn có thể sử dụng:

/**
 * Implements hook_form_alter().
 */
function YOUR_MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  //With this you will know your form_id (see in the next function YOUR_FORM_ID)
  dpm($form_id);
}

Và trong cái móc này bạn sẽ ẩn tiêu đề, với cái này bạn làm thủ thuật

/**
 * Implements hook_form_FORM_ID_alter().
 */
function YOUR_MODULE_form_YOUR_FORM_ID_alter(array &$form, FormStateInterface $form_state, $form_id) {
  $form['title']['#access'] = FALSE;
}

1

Bạn cũng có thể sử dụng mô-đun tiêu đề nút tự động. Điều này sẽ cho phép bạn đặt tiêu đề nút thành bất cứ điều gì bạn muốn trong cấu hình loại nội dung, nhưng sẽ không hiển thị trường khi thêm hoặc chỉnh sửa.


0

Tôi thấy tiêu đề này hữu ích theo nhiều cách trong trình xây dựng bố cục: - Hiển thị xem trước nội dung - Sử dụng nó làm Id khối

Giải pháp của tôi tạo ra các tiêu đề tự động bằng cách sử dụng tiêu đề loại khối và đếm số lượng khối từ cùng loại.

function [module]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  if ($form_id === 'layout_builder_add_block') {
    // Get the blocks plugins id counter.
    $bundle = $form['settings']['block_form']['#block']->bundle();
    $plugin_id = 'inline_block:' . $bundle;

    // Get the blocks plugins id count array.
    if ($node = $form_state->getTemporary()['gathered_contexts']['layout_builder.entity']->getContextData()->getEntity()) {
      $block_count = 0;
      foreach ($node->layout_builder__layout as $section) {
        $components = $section->section->getComponents();
        foreach ($components as $block) {
          if ($plugin_id === $block->getPluginId()) {
            $block_count += 1;
          }
        }
      }
    }

    // If not exist start from 0.
    // Insert default title.
    $form['settings']['label']['#default_value'] = t('%title-%title_id', [
      '%title' => $form['settings']['admin_label']['#plain_text'],
      '%title_id' => $block_count,
    ]);
    // Change title description.
    $form['settings']['label']['#title'] = t('Block id');
    $form['settings']['label']['#description'] = t('Automatic id generator. Can be modified by user but must be unique.');
    // Update and hide display title checkbox.
    // $form['settings']['label_display']['#default_value'] = FALSE;
    // $form['settings']['label_display']['#access'] = FALSE;
  }

  if ($form_id === 'layout_builder_update_block') {
    // Change title description.
    $form['settings']['label']['#title'] = t('Block id');
    $form['settings']['label']['#description'] = t('Automatic id generator. Can be modified by user but must be unique.');
    // Update and hide display title checkbox.
    // $form['settings']['label_display']['#default_value'] = FALSE;
    // $form['settings']['label_display']['#access'] = FALSE;
  }
}

/**
 * HOOK_preprocess_block.
 */
function [module]_preprocess_block(&$variables) {
  // Add id into block.
  $label = qfcc_structure_normaliseLabelToId($variables['label']);
  if (!$label) {
    $label = rand(100, 999);
  }
  $variables['attributes']['id'] = 'block-' . $label;
}

function [module]_normaliseLabelToId($text) {
  if (!$text) {
    return NULL;
  }

  $text = trim(strtolower($text));
  $text = str_replace(' ', '-', $text);
  $text = str_replace('_', '-', $text);
  $text = preg_replace('/[^a-z0-9\-]/', '', $text);
  return $text ?? NULL;
}

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.