phacility/phabricator · error · Exception

Unsupported bulk edit type "%s".

Error message

Unsupported bulk edit type "%s".

What it means

Bulk edit (used by the 'edit multiple selected objects' / bulk job machinery) validates each submitted transaction's 'type' against the map of edit types the engine derives from its fields (getBulkEditTypesFromFields). A type key not present in that map throws this exception before any object is touched.

Source

Thrown at src/applications/transactions/editengine/PhabricatorEditEngine.php:2663

    $object = $this->newEditableObject();
    $fields = $this->buildEditFields($object);

    $edit_types = $this->getBulkEditTypesFromFields($fields);
    $template = $object->getApplicationTransactionTemplate();

    $raw_xactions = array();
    foreach ($xactions as $key => $xaction) {
      PhutilTypeSpec::checkMap(
        $xaction,
        array(
          'type' => 'string',
          'value' => 'optional wild',
        ));

      $type = $xaction['type'];
      if (!isset($edit_types[$type])) {
        throw new Exception(
          pht(
            'Unsupported bulk edit type "%s".',
            $type));
      }

      $edit_type = $edit_types[$type];

      // Replace the edit type with the underlying transaction type. Usually
      // these are 1:1 and the transaction type just has more internal noise,
      // but it's possible that this isn't the case.
      $xaction['type'] = $edit_type->getTransactionType();

      $value = $xaction['value'];
      $value = $edit_type->getTransactionValueFromBulkEdit($value);
      $xaction['value'] = $value;

      $xaction_objects = $edit_type->generateTransactions(
        clone $template,

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Use exactly the type keys the bulk edit UI for that form offers (what you configure in the bulk dialog is by construction valid)
  2. If scripting, enumerate valid types from the engine's edit types (e.g. the types listed by the corresponding *.edit method metadata) and intersect with your payload before submission
  3. For custom fields, confirm the field class implements bulk edit support and its key matches what you send
  4. Prefer the 1:1 transaction type name over ad-hoc aliases when building bulk transactions

Example fix

// before
$xactions = array(
  array('type' => 'project', 'value' => array('PHID-PROJ-xyz')),
);
// Exception: Unsupported bulk edit type "project".

// after: use the field's actual bulk edit type key
$xactions = array(
  array('type' => 'projects', 'value' => array('PHID-PROJ-xyz')),
);
Defensive patterns

Strategy: validation

Validate before calling

// Restrict bulk payloads to types the form actually offers:
foreach ($xactions as $i => $xaction) {
  if (!isset($edit_types[$xaction['type']])) {
    unset($xactions[$i]); // or fail loudly
  }
}
// Populate $edit_types from the bulk edit UI choices or the engine's
// advertised edit types for the same form.

Type guard

function isSupportedBulkType($type, array $edit_types) {
  return is_string($type) && isset($edit_types[$type]);
}

Try / catch

try {
  $engine->applyBulkTransactions($objects, $xactions);
} catch (Exception $ex) {
  if (strpos($ex->getMessage(), 'Unsupported bulk edit type') !== false) {
    // the named type is not bulk-editable for this form; drop it and resubmit
  } else {
    throw $ex;
  }
}

Prevention

When it happens

Trigger: Submitting a bulk job payload (e.g. via bulk editor or a script driving it) with type "project", "assign", or a custom field key that no field advertises for bulk editing; using a Conduit transaction type name that the corresponding field does not expose as a bulk edit type.

Common situations: Reusing Conduit 'transactions' type names in bulk payloads; fields whose bulk support is disabled; custom fields registered without a bulk edit type; version changes renaming edit type keys.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/015d69537aafa1ca. Report an issue: GitHub.