octobercms/october · warning · ValidationException
system::lang.project.id.missing
system::lang.project.id.missing
Error message
Please specify a Project ID to use.
What it means
onAttachProject is the AJAX handler behind Settings > System > Updates > Attach project. It reads post('project_id') and throws a ValidationException bound to the project_id field when the value is empty after trim(), so the backend redisplays the form with the field highlighted instead of contacting the gateway.
Source
Thrown at modules/system/controllers/Updates.php:243
return 'positive';
}
/**
* onLoadProjectForm displays the form for entering a license key
*/
public function onLoadProjectForm()
{
return $this->makePartial('project_form');
}
/**
* onAttachProject validates the project ID and execute the project installation
*/
public function onAttachProject()
{
try {
if (!$projectId = trim(post('project_id'))) {
throw new ValidationException(['project_id' => Lang::get('system::lang.project.id.missing')]);
}
// Validate input with gateway
$manager = UpdateManager::instance();
$result = $manager->requestProjectDetails($projectId);
// Check project status
$isActive = $result['is_active'] ?? false;
if (!$isActive) {
throw new ValidationException(['project_id' => __("License is unpaid or has expired. Please visit octobercms.com to obtain a license.")]);
}
// Store project details
$manager->storeProjectDetails($result);
// Add gateway as a composer repo
$this->ensureComposerRegistered();
View on GitHub (pinned to b608633a7e)
Solutions
- Enter the Project ID from your octobercms.com account/client area and resubmit
- If the form was customized, ensure the input is named exactly project_id (the handler reads post('project_id'))
- Paste the ID without surrounding whitespace; trim() handles it but empty-after-trim still fails
Example fix
<!-- before: field name mismatch, handler receives nothing --> <input type="text" name="projectId"> <!-- after --> <input type="text" name="project_id">
Defensive patterns
Strategy: validation
Validate before calling
// client-side, before the AJAX submit
const id = document.querySelector('input[name=project_id]').value.trim();
if (!id) { alert('Project ID is required'); return; } Prevention
- Keep the input named project_id; the handler reads post('project_id')
- Paste the Project ID from the octobercms.com account page, not from emails
- Leave client-side required validation enabled on the attach-project modal
When it happens
Trigger: Submitting the attach-project form with an empty or whitespace-only project ID; a customized form that no longer posts a field named project_id; the input removed by a browser extension or failed autofill.
Common situations: User submits the modal too early; custom-themed backend form renamed the input; JS validation disabled.
Related errors
- License is unpaid or has expired. Please visit octobercms.co
- Cannot find the requested row group.
- Inspector container ${$containerHolder.data['inspector-conta
- Cannot switch to container: a container element is not found
- Inspector surface unique ID should be defined.
AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21).
Data as JSON: /api/errors/28b537608d1dbbb2.
Report an issue: GitHub.