Điểm:-1

Làm cách nào để xóa một số đơn vị đo lường khỏi tiện ích Trường vật lý?

lá cờ cn

Tôi đang cố gắng thay đổi tiện ích cho các trường được triển khai bởi trường vật lý mô-đun, sử dụng hook_field_widget_form_alter().

Tôi đang cố xóa một số đơn vị khỏi danh sách lựa chọn, nhưng không có danh sách lựa chọn nào trong phần tử $.

Làm cách nào để thay đổi các đơn vị đó?

Điểm:2
lá cờ us

What the widget returns for the Measurement field is the rendering array built with the following code. (See MeasurementDefaultWidget::formElement().)

$element = [
  '#type' => 'physical_measurement',
  '#measurement_type' => $this->fieldDefinition->getSetting('measurement_type'),
  '#allow_unit_change' => $this->getSetting('allow_unit_change'),
  '#default_value' => $items[$delta]->getValue(),
] + $element;

if (!$this->getSetting('allow_unit_change')) {
   $element['#available_units'] = [$default_unit];
}

There isn't any option list, because that is built from the physical_measurement form element class. (See Measurement::processElement().)

$element['unit'] = [
  '#type' => 'select',
  '#options' => $units,
  '#default_value' => $default_value ? $default_value['unit'] : $unit_class::getBaseUnit(),
  '#title_display' => 'invisible',
  '#field_suffix' => '',
];

In hook_field_widget_form_alter(), the list of the allowed units are contained in $element['#available_units'], which could not be set when all the units for that measure are allowed.
The following code can be used to get all the units a physical_measurement field uses (which are restricted from its measurement type).

use Drupal\physical\MeasurementType;

$unit_class = MeasurementType::getUnitClass($element['#measurement_type']);
$units = array_keys($unit_class::getLabels());

When $element['#allow_unit_change'] is FALSE, which is used to mean it's not possible to change the unit associated with the field, $element['#available_units'] contains the only allowed unit. In that case, hook_field_widget_form_alter() should not alter $element['#available_units'].

As side note, since the question is asking about removing measure units, the module code doesn't allow to add more units because the classes to handle them have code similar to the following one, used by the VolumeUnit class.

/**
 * {@inheritdoc}
 */
public static function getBaseFactor($unit) {
  self::assertExists($unit);
  $factors = [
    self::MILLILITER => '0.000001',
    self::CENTILITER => '0.00001',
    self::DECILITER => '0.0001',
    self::LITER => '0.001',
    self::CUBIC_MILLIMETER => '0.000000001',
    self::CUBIC_CENTIMETER => '0.000001',
    self::CUBIC_METER => '1',
    self::CUBIC_INCH => '0.00001638706',
    self::CUBIC_FOOT => '0.02831685',
    self::FLUID_OUNCE => '0.00002957353',
    self::US_GALLON => '0.0037854118',
  ];

  return $factors[$unit];
}

/**
 * {@inheritdoc}
 */
public static function assertExists($unit) {
  $allowed_units = [
    self::MILLILITER, self::CENTILITER, self::DECILITER, self::LITER,
    self::CUBIC_MILLIMETER, self::CUBIC_CENTIMETER, self::CUBIC_METER,
    self::CUBIC_INCH, self::CUBIC_FOOT, self::FLUID_OUNCE, self::US_GALLON,
  ];
  if (!in_array($unit, $allowed_units)) {
    throw new \InvalidArgumentException(sprintf('Invalid volume unit "%s" provided.', $unit));
  }
}

Đă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.