Skip to content

phlppschrr/ProcessWirePhpStormMeta

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ProcessWire PhpStorm Meta

Generates .phpstorm.meta.php/ directory for ProcessWire API autocompletion in PhpStorm. The directory approach is more robust than a single-file .phpstorm.meta.php and avoids known issues with the single-file format.

Features

  • Autocomplete wire container keys for wire('...') and Wire::wire('...')
  • Autocomplete module names for Modules::get() and Modules::install()
  • Autocomplete field names for Fields::get()
  • Autocomplete template names for Templates::get()
  • Autocomplete unique page names for Pages::get()
  • Autocomplete hookable methods for Wire::addHook*()
  • Autocomplete page status constants/strings for Page::status(), addStatus(), removeStatus(), hasStatus()
  • Autocomplete field flags for Field::addFlag(), removeFlag(), hasFlag()
  • Autocomplete template cache-expire constants for Template::cacheExpire()
  • Autocomplete Inputfield collapsed constants for Inputfield::collapsed()
  • Autocomplete sort flags for WireArray::sort()/sortFlags()/unique() and PageArray::sort()/sortFlags()/unique()
  • Optional: Field type autocompletion per Page class (when enabled in module config)
  • Incremental writes: Only changed files are written — no git noise from unchanged files
  • Deterministic ordering: All dynamic sections use stable alphabetical sorting

Installation

  1. Copy the module folder into site/modules/ProcessWirePhpStormMeta/.
  2. Install the module in the ProcessWire admin.

Usage

  • Default path: site/assets/.phpstorm.meta.php/ (configurable in module settings).
  • The directory is regenerated automatically when fields, templates, or modules change (debounced).
  • You can manually regenerate from the module settings screen.
  • Optional: enable "Generate page-class field metadata" in module settings for field type hints per Page class. This is intentionally basic. For richer field stubs, use AutoTemplateStubs.

Autoload modes

  • admin (default): module runs meta generation only on admin requests.
  • always: runs on every request — useful when frontend hooks trigger regeneration.

Config overrides via site/config.php

All settings can be set in site/config.php. Values set here are shown as disabled in the module UI:

$config->ProcessWirePhpStormMeta = [
    'autoloadMode' => 'always',
    'autoRegenerate' => true,
    'generatePageClassFieldMeta' => true,
];

Extending

Add custom completions via the generateCustomMetaContent() hook. Multiple hooks concatenate. The output lands in custom.meta.php inside the meta directory.

This example autocompletes block names for renderBlock() — a custom function that renders site/templates/blocks/*.php partials:

// $content = renderBlock('hero', $page);

$wire->addHookAfter("ProcessWirePhpStormMeta::generateCustomMetaContent", function($event) {
    $names = [];
    foreach (glob(wire()->config->paths->templates . "blocks/*.php") ?: [] as $f) {
        $names[] = pathinfo($f, PATHINFO_FILENAME);
    }
    if (empty($names)) return;
    $custom = "\n    registerArgumentsSet(\"block_names\",\n";
    foreach ($names as $n) $custom .= "        \"{$n}\",\n";
    $custom .= "    );\n\n";
    $custom .= "    expectedArguments(\\ProcessWire\\renderBlock(), 0, argumentsSet(\"block_names\"));\n";
    $event->return .= $custom;
});

Examples

Modules

$tracy = $modules->get('TracyDebugger');
// Autocomplete + correct class type for navigation and code insight

Wire Container

$page = wire('page');
$pages = $this->wire('pages');
$cache = wire('cache');
// Autocomplete for keys like page/pages/cache/etc.

Fields

$body = $fields->get('body');
// Autocomplete field names, fewer typos

Templates

$tpl = $templates->get('basic-page');
// Autocomplete template names

Pages

$home = $pages->get('/');
// Maps to the page class when page classes are enabled

Page Status

$page->status(Page::statusHidden);
$page->addStatus('draft');
$page->removeStatus(Page::statusUnpublished);
$page->hasStatus('locked');

Field Flags

$field->addFlag(Field::flagAutojoin);
$field->removeFlag(Field::flagAccess);
$field->hasFlag(Field::flagGlobal);

Template Cache Expire

$template->cacheExpire(Template::cacheExpireParents);

Inputfield Collapsed

$inputfield->collapsed(Inputfield::collapsedYesAjax);

Sort Flags

$items->sort('title', SORT_NATURAL | SORT_FLAG_CASE);
$items->sortFlags(SORT_NATURAL);
$items->unique(SORT_STRING);

Page-Class Field Metadata (Optional)

$home = $pages->get('/');
// $home is HomePage (page class)
// Field types are inferred from the template fieldgroup
// e.g. $home->hero_image -> Pageimage or Pageimages depending on field settings

Hooks

$wire->addHookAfter('Pages::save', function($event) {
    // Autocomplete hookable methods while typing the hook string
});

Notes

  • Hook scanning reads ProcessWire core, modules, admin templates, and page classes to build the hook list.
  • If page classes are enabled, page names map to their page class; otherwise they map to Page.
  • All dynamic entries are alphabetically sorted to ensure stable, deterministic output.
  • Improvement suggestions and PRs are welcome.

License

Mozilla Public License 2.0. See LICENSE.

Releases

Packages

Contributors

Languages