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

  1. Enter the Project ID from your octobercms.com account/client area and resubmit
  2. If the form was customized, ensure the input is named exactly project_id (the handler reads post('project_id'))
  3. 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

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


AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21). Data as JSON: /api/errors/28b537608d1dbbb2. Report an issue: GitHub.