Registries, widgets, search, and how modules avoid knowing about each other.

How do I make two modules work together? Through a registry in System, not a direct reference. A module that names another cannot be installed without it, and fatals on a site where it is switched off. Developers How do I get my module's content into search? Register a content type with a find callback that takes the viewer's group ids and filters by them. A find that ignores the viewer is a leak. Developers How do I make my content work with OpenSearch? Add documents and gates callbacks to your content type. documents yields what to index; gates says which containers a viewer may read. Provide both or your type is skipped entirely. Developers How do I add a widget other people can place? Register a widget type in register() with a render callback returning HTML. Filter by the viewer's groups inside it — a widget renders on pages you are not thinking about. Developers How do I let people comment on something my module owns? Use the discussions service. It gives your record a hidden topic and reuses posts, so comments get editing, reporting, reactions and moderation without you building any of it. Developers How do I make my module honour account deletion? Register your tables with the personal_data service in boot(). One line per table naming the column that points at a member. Developers What is the difference between a module and an extension? A module ships with Convoro; an extension is a package somebody installs into extensions/. The code is the same shape — the console can scaffold and package one for you. Developers