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.

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.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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

Appendix: 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)