{"record":{"id":"015d69537aafa1ca","repo":"phacility/phabricator","slug":"unsupported-bulk-edit-type-s","errorCode":null,"errorMessage":"Unsupported bulk edit type \"%s\".","messagePattern":"Unsupported bulk edit type \"(.+?)\"\\.","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/applications/transactions/editengine/PhabricatorEditEngine.php","lineNumber":2663,"sourceCode":"\n    $object = $this->newEditableObject();\n    $fields = $this->buildEditFields($object);\n\n    $edit_types = $this->getBulkEditTypesFromFields($fields);\n    $template = $object->getApplicationTransactionTemplate();\n\n    $raw_xactions = array();\n    foreach ($xactions as $key => $xaction) {\n      PhutilTypeSpec::checkMap(\n        $xaction,\n        array(\n          'type' => 'string',\n          'value' => 'optional wild',\n        ));\n\n      $type = $xaction['type'];\n      if (!isset($edit_types[$type])) {\n        throw new Exception(\n          pht(\n            'Unsupported bulk edit type \"%s\".',\n            $type));\n      }\n\n      $edit_type = $edit_types[$type];\n\n      // Replace the edit type with the underlying transaction type. Usually\n      // these are 1:1 and the transaction type just has more internal noise,\n      // but it's possible that this isn't the case.\n      $xaction['type'] = $edit_type->getTransactionType();\n\n      $value = $xaction['value'];\n      $value = $edit_type->getTransactionValueFromBulkEdit($value);\n      $xaction['value'] = $value;\n\n      $xaction_objects = $edit_type->generateTransactions(\n        clone $template,","sourceCodeStart":2645,"sourceCodeEnd":2681,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/transactions/editengine/PhabricatorEditEngine.php#L2645-L2681","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Use exactly the type keys the bulk edit UI for that form offers (what you configure in the bulk dialog is by construction valid)","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","For custom fields, confirm the field class implements bulk edit support and its key matches what you send","Prefer the 1:1 transaction type name over ad-hoc aliases when building bulk transactions"],"exampleFix":"// before\n$xactions = array(\n  array('type' => 'project', 'value' => array('PHID-PROJ-xyz')),\n);\n// Exception: Unsupported bulk edit type \"project\".\n\n// after: use the field's actual bulk edit type key\n$xactions = array(\n  array('type' => 'projects', 'value' => array('PHID-PROJ-xyz')),\n);","handlingStrategy":"validation","validationCode":"// Restrict bulk payloads to types the form actually offers:\nforeach ($xactions as $i => $xaction) {\n  if (!isset($edit_types[$xaction['type']])) {\n    unset($xactions[$i]); // or fail loudly\n  }\n}\n// Populate $edit_types from the bulk edit UI choices or the engine's\n// advertised edit types for the same form.","typeGuard":"function isSupportedBulkType($type, array $edit_types) {\n  return is_string($type) && isset($edit_types[$type]);\n}","tryCatchPattern":"try {\n  $engine->applyBulkTransactions($objects, $xactions);\n} catch (Exception $ex) {\n  if (strpos($ex->getMessage(), 'Unsupported bulk edit type') !== false) {\n    // the named type is not bulk-editable for this form; drop it and resubmit\n  } else {\n    throw $ex;\n  }\n}","preventionTips":["Build bulk payloads from the same type list the bulk edit UI presents","Do not assume Conduit transaction type names are bulk-editable verbatim","For custom fields, verify bulk support exists before exposing them to bulk jobs"],"tags":["phabricator","edit-engine","bulk-edit","unknown-type","php"],"backgroundTag":"invalid-request-payload","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}