MemberFolder
Reference for the MemberFolder module: a generic, member-owned folder tree that any application table can organise its own rows into. The module owns structure only, folders and their permalinks; the application keeps a FolderID column on its own table and registers, per folder type, how to count and render its rows.
This page is a pure reference. For how the framework fits together, see the Guide.
MemberFolder- the member-owned folder tree, its operations, routing and URLs.MemberFolderConfig- declarative registration of folder types and their content.MemberFolderData- immutable data for a single folder in a member's tree.MemberFolderDatabase- all SQL for the member_folder table.MemberFolderForm- self-contained create and rename folder forms.MemberFolderPage- renders folder and root pages and their sub-pages.MemberFolderTypeConfig- the declaration calls used inside a folder type closure.
MemberFolder
The member-owned folder tree, plus the routing that renders a folder page by permalink. Membership of application rows is not stored here; this class owns only the tree: create, rename, move, delete, children and path, each ownership-checked, single-parent and cycle-safe. Every folder gets a permalink so a site can address it anywhere.
Constants
| Constant | Value | Description |
|---|---|---|
MemberFolder::PERMALINK_TYPE | 'member_folder' | The permalink item type shared by all folders; one dispatch resolves the whole tree. |
MemberFolder::ROUTE_NAME | 'MemberFolder' | The reverse-routing name recorded by Route() so folder links can be generated back. |
MemberFolder::MAX_DEPTH | 64 | Guard for tree walks (breadcrumbs, cycle checks, subtree collection). |
Children
MemberFolder::Children(int $memberId, int $parentId): array
The direct sub-folders of a parent folder (0 for the member's root).
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$parentId | int | The parent folder id, or 0 for root. |
Returns array A list of MemberFolderData.
Create
MemberFolder::Create(int $memberId, string $moduleName, string $folderType, int $parentId, string $name): MemberFolderData
Create a folder of a registered type under a parent (0 for the member's root), owned by the member, and give it a permalink. Rejects an unknown type or a parent the member does not own.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$moduleName | string | The registering module of the folder type. |
$folderType | string | The folder type name. |
$parentId | int | The parent folder id, or 0 for root. |
$name | string | The folder name (up to 250 characters). |
Returns MemberFolderData The created folder.
Delete
MemberFolder::Delete(int $memberId, int $folderId): void
Soft-delete a folder and its whole sub-tree. The application rows that referenced these folders are untouched.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$folderId | int | The folder to delete. |
Returns void
Move
MemberFolder::Move(int $memberId, int $folderId, int $newParentId): MemberFolderData
Reparent a folder. Rejects self-parenting and cycles (moving a folder into its own descendant).
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$folderId | int | The folder to move. |
$newParentId | int | The new parent folder id, or 0 for root. |
Returns MemberFolderData The moved folder.
Path
MemberFolder::Path(int $memberId, int $folderId): array
The breadcrumb from the member's root down to and including a folder.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$folderId | int | The folder to trace to. |
Returns array A root-first list of MemberFolderData.
PermalinkString
MemberFolder::PermalinkString(int $folderId): string
The folder's permalink string, for links and sharing.
| Name | Type | Description |
|---|---|---|
$folderId | int | The folder id. |
Returns string The permalink string.
Rename
MemberFolder::Rename(int $memberId, int $folderId, string $name): MemberFolderData
Rename a folder the member owns.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$folderId | int | The folder to rename. |
$name | string | The new name (up to 250 characters). |
Returns MemberFolderData The renamed folder.
RootUrl
MemberFolder::RootUrl(string $moduleName, string $folderType): string
The URL of a folder type's root view, resolved from where the application mounted RouteType(). This is the member's root page and the paging base for it.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The folder type's module. |
$folderType | string | The folder type name. |
Returns string The root view URL.
Route
MemberFolder::Route(?callable $frame = null): void
Mount the folder pages at the current routing location and dispatch a folder permalink to its pages. Records a named anchor for link generation, and renders only for the folder's logged-in owner.
| Name | Type | Description |
|---|---|---|
$frame | ?callable | An optional frame fn(callable $routes) that wraps the owner's folder pages in the site document; omit for raw content. |
Returns void
RouteType
MemberFolder::RouteType(string $moduleName, string $folderType, ?callable $frame = null): void
Mount a member's root view for one folder type at the current routing location, and record a per-type named anchor so its URL and paging resolve back to here. Mount it inside logged-in-only routing; it does not itself check login.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The folder type's module. |
$folderType | string | The folder type name. |
$frame | ?callable | An optional frame fn(callable $content) supplying the surrounding chrome; omit for raw content. |
Returns void
TypeRouteName
MemberFolder::TypeRouteName(string $moduleName, string $folderType): string
The per-type named-route key recorded by RouteType() and read back by RootUrl().
| Name | Type | Description |
|---|---|---|
$moduleName | string | The folder type's module. |
$folderType | string | The folder type name. |
Returns string The route name.
Url
MemberFolder::Url(int $folderId): string
The site URL for a folder, from the Route() anchor and the folder's permalink string.
| Name | Type | Description |
|---|---|---|
$folderId | int | The folder id. |
Returns string The folder URL.
UrlByPermalink
MemberFolder::UrlByPermalink(string $permalinkString): string
The site URL for a folder from its permalink string and the Route() anchor.
| Name | Type | Description |
|---|---|---|
$permalinkString | string | The folder's permalink string. |
Returns string The folder URL.
MemberFolderConfig
Declarative registration of folder types and the content that goes inside them. Type() opens a folder type and runs a closure in which the type's content, views and sorts are declared. The registry is also read back by the module.
AddContent
MemberFolderConfig::AddContent(object $contentRecord): void
Record one content kind on the type currently being declared. Called by MemberFolderTypeConfig::Content().
| Name | Type | Description |
|---|---|---|
$contentRecord | object | The content record to add. |
Returns void
AddSort
MemberFolderConfig::AddSort(object $sortRecord): void
Record one sort option on the type currently being declared. Called by MemberFolderTypeConfig::Sort().
| Name | Type | Description |
|---|---|---|
$sortRecord | object | The sort record to add. |
Returns void
AddView
MemberFolderConfig::AddView(object $viewRecord): void
Record one view option on the type currently being declared. Called by MemberFolderTypeConfig::View().
| Name | Type | Description |
|---|---|---|
$viewRecord | object | The view record to add. |
Returns void
GetType
MemberFolderConfig::GetType(string $moduleName, string $folderType): ?object
The registered type record for a module and folder type, or null when none is registered.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The registering module. |
$folderType | string | The folder type name. |
Returns ?object The type record, or null.
Key
MemberFolderConfig::Key(string $moduleName, string $type): string
The "module/type" key used throughout the module.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The module name. |
$type | string | The type name. |
Returns string The composite key.
Type
MemberFolderConfig::Type(string $moduleName, string $folderType, callable $declare): void
Declare a folder type and, inside the closure, the content, views and sorts it holds. Idempotent: a repeated (module, type) is ignored.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The registering module. |
$folderType | string | The folder type name. |
$declare | callable | A closure that declares the type's content, views and sorts. |
Returns void
MemberFolderData
Immutable data for a single folder in a member's tree. Structural only: it names a node, its owner, its (module, type) tag, its single parent (0 for root) and its sort position.
Properties
| Property | Type | Description |
|---|---|---|
$folder->id | int | The folder id (readonly). |
$folder->memberId | int | The owning member (readonly). |
$folder->moduleName | string | The registering module of the folder type (readonly). |
$folder->type | string | The folder type name (readonly). |
$folder->parentId | int | The single parent, 0 for root (readonly). |
$folder->name | string | The folder name (readonly). |
$folder->position | int | The sort position among its siblings (readonly). |
$folder->added | int | The creation timestamp (readonly). |
$folder->deleted | int | The soft-delete timestamp, 0 when live (readonly). |
__construct
new MemberFolderData(int $id = 0, int $memberId = 0, string $moduleName = '', string $type = '', int $parentId = 0, string $name = '', int $position = 0, int $added = 0, int $deleted = 0)
Create folder data from its structural fields.
| Name | Type | Description |
|---|---|---|
$id | int | The folder id. |
$memberId | int | The owning member. |
$moduleName | string | The registering module. |
$type | string | The folder type name. |
$parentId | int | The single parent, 0 for root. |
$name | string | The folder name. |
$position | int | The sort position. |
$added | int | The creation timestamp. |
$deleted | int | The soft-delete timestamp, 0 when live. |
Returns MemberFolderData
ToObject
$folder->ToObject(): object
The public shape returned to API clients, without the soft-delete marker.
Returns object The public folder object.
MemberFolderDatabase
All SQL for the member_folder table. Pure data access, no rule enforcement or ownership logic. Every query that lists folders excludes soft-deleted rows.
CountChildren
MemberFolderDatabase::CountChildren(int $memberId, int $parentId): int
Count a member's live direct sub-folders of a parent.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$parentId | int | The parent folder id, or 0 for root. |
Returns int The child count.
CountFiltered
MemberFolderDatabase::CountFiltered(int $memberId, string $moduleName, string $type): int
Count folders matching the given filters, ignoring any zero or blank filter argument.
| Name | Type | Description |
|---|---|---|
$memberId | int | Filter by member, or 0 for any. |
$moduleName | string | Filter by module, or blank for any. |
$type | string | Filter by type, or blank for any. |
Returns int The matching count.
CountRootByType
MemberFolderDatabase::CountRootByType(int $memberId, string $moduleName, string $type): int
Count a member's root folders of a given type.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$moduleName | string | The folder type's module. |
$type | string | The folder type name. |
Returns int The root folder count.
fromRow
MemberFolderDatabase::fromRow(stdClass $row): MemberFolderData
Build a folder data object from a database row.
| Name | Type | Description |
|---|---|---|
$row | stdClass | The member_folder table row. |
Returns MemberFolderData The folder data.
Get
MemberFolderDatabase::Get(int $id): MemberFolderData
Read a folder by id.
| Name | Type | Description |
|---|---|---|
$id | int | The folder id. |
Returns MemberFolderData The folder data.
GetOptional
MemberFolderDatabase::GetOptional(int $id): ?MemberFolderData
Read a folder by id, or null when there is no such row.
| Name | Type | Description |
|---|---|---|
$id | int | The folder id. |
Returns ?MemberFolderData The folder data, or null.
Insert
MemberFolderDatabase::Insert(int $memberId, string $moduleName, string $type, int $parentId, string $name, int $position, int $added): int
Insert a folder row and return its new id.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$moduleName | string | The registering module. |
$type | string | The folder type name. |
$parentId | int | The parent folder id, or 0 for root. |
$name | string | The folder name. |
$position | int | The sort position. |
$added | int | The creation timestamp. |
Returns int The new folder id.
SelectChildren
MemberFolderDatabase::SelectChildren(int $memberId, int $parentId): array
A member's live direct sub-folders of a parent, oldest sort position first.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$parentId | int | The parent folder id, or 0 for root. |
Returns array A list of MemberFolderData.
SelectFiltered
MemberFolderDatabase::SelectFiltered(int $memberId, string $moduleName, string $type, int $start, int $count): array
A paged, filtered list of folders for operators, newest first. A zero or blank filter argument is ignored.
| Name | Type | Description |
|---|---|---|
$memberId | int | Filter by member, or 0 for any. |
$moduleName | string | Filter by module, or blank for any. |
$type | string | Filter by type, or blank for any. |
$start | int | The row offset. |
$count | int | The page size, 1 to 1000. |
Returns array A list of MemberFolderData.
SelectRootByType
MemberFolderDatabase::SelectRootByType(int $memberId, string $moduleName, string $type, int $start, int $limit): array
A page of a member's root folders of a given type, name-ordered.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$moduleName | string | The folder type's module. |
$type | string | The folder type name. |
$start | int | The row offset. |
$limit | int | The page size, 1 to 1000. |
Returns array A list of MemberFolderData.
SoftDelete
MemberFolderDatabase::SoftDelete(int $id, int $timestamp): void
Mark a folder soft-deleted at the given timestamp.
| Name | Type | Description |
|---|---|---|
$id | int | The folder id. |
$timestamp | int | The delete timestamp. |
Returns void
UpdateName
MemberFolderDatabase::UpdateName(int $id, string $name): void
Update a folder's name.
| Name | Type | Description |
|---|---|---|
$id | int | The folder id. |
$name | string | The new name. |
Returns void
UpdateParent
MemberFolderDatabase::UpdateParent(int $id, int $parentId, int $position): void
Update a folder's parent and sort position.
| Name | Type | Description |
|---|---|---|
$id | int | The folder id. |
$parentId | int | The new parent folder id, or 0 for root. |
$position | int | The new sort position. |
Returns void
MemberFolderForm
Self-contained folder forms the module provides so a site can drop folder management into its own routing. Each form posts back to the current URL, validates, calls the ownership-checked MemberFolder operation, and redirects to a done URL. Place these inside logged-in-only routing.
Create
MemberFolderForm::Create(string $moduleName, string $folderType, int $parentId, string $doneUrl): void
A create-folder form: one name field that, on submit, creates a folder of the given type under a parent (0 for the member's top level), owned by the logged-in member, then redirects to the done URL.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The folder type's module. |
$folderType | string | The folder type name. |
$parentId | int | The parent folder id, or 0 for the top level. |
$doneUrl | string | The URL to redirect to on success. |
Returns void
Rename
MemberFolderForm::Rename(int $folderId, string $currentName, string $doneUrl): void
A rename-folder form: one name field pre-filled with the current name that, on submit, renames the folder (ownership-checked) and redirects to the done URL.
| Name | Type | Description |
|---|---|---|
$folderId | int | The folder to rename. |
$currentName | string | The current folder name, pre-filled into the field. |
$doneUrl | string | The URL to redirect to on success. |
Returns void
MemberFolderPage
Renders folder content into the Ui library; the site frame is applied by the caller's routing. It renders one folder by permalink, a member's root view for a folder type, and the create and rename sub-pages.
Constants
| Constant | Value | Description |
|---|---|---|
MemberFolderPage::PER_PAGE | 24 | Content rows per page, the unit the paging bar counts. |
MemberFolderPage::MAX_FOLDERS | 1000 | Upper bound on the folder cards listed in one view. |
CreateSubfolder
MemberFolderPage::CreateSubfolder(MemberFolderData $folder): void
The create-a-sub-folder page for a folder: a title and the module's self-contained create form.
| Name | Type | Description |
|---|---|---|
$folder | MemberFolderData | The parent folder. |
Returns void
Render
MemberFolderPage::Render(int $folderId, int $page = 1): void
Render one folder's page: its title, sub-folders and a paged contents. Renders nothing when the folder is missing or soft-deleted. Does not check viewer ownership; the caller's dispatch gates that.
| Name | Type | Description |
|---|---|---|
$folderId | int | The folder to render. |
$page | int | The contents page number, from 1. |
Returns void
RenderRoot
MemberFolderPage::RenderRoot(int $memberId, string $moduleName, string $folderType, int $page = 1): void
Render a member's root for one folder type: their top-level folders, then a paged listing of their rows that sit in no folder.
| Name | Type | Description |
|---|---|---|
$memberId | int | The owning member. |
$moduleName | string | The folder type's module. |
$folderType | string | The folder type name. |
$page | int | The contents page number, from 1. |
Returns void
RenameFolder
MemberFolderPage::RenameFolder(MemberFolderData $folder): void
The rename page for a folder: a title and the module's self-contained rename form.
| Name | Type | Description |
|---|---|---|
$folder | MemberFolderData | The folder to rename. |
Returns void
MemberFolderTypeConfig
The declaration calls used inside a MemberFolderConfig::Type() closure. Content() registers a kind of content a folder of the type holds, binding the folder browser to the application's own rows through count and render callbacks. View() and Sort() declare an ordered vocabulary rendered as a switcher, the first declared being the default.
Content
MemberFolderTypeConfig::Content(string $moduleName, string $contentType, callable $countFn, callable $renderFn): void
Register one kind of content that folders of the enclosing type contain, with callbacks that count and render the application's own rows for a folder id.
| Name | Type | Description |
|---|---|---|
$moduleName | string | The content's owning module. |
$contentType | string | The content's type name. |
$countFn | callable | fn(int $folderId): int, the number of this content in a folder. |
$renderFn | callable | fn(int $folderId, string $view, string $sort, int $start, int $limit): void, echoes SSR markup for a page of content. |
Returns void
Sort
MemberFolderTypeConfig::Sort(string $key, string $label): void
Declare a sort (ordering) option: the key is passed to the render callback and the label is shown.
| Name | Type | Description |
|---|---|---|
$key | string | The opaque sort key. |
$label | string | The label shown in the switcher. |
Returns void
View
MemberFolderTypeConfig::View(string $key, string $label): void
Declare a view (layout) option: the key is passed to the render callback and the label is shown.
| Name | Type | Description |
|---|---|---|
$key | string | The opaque view key. |
$label | string | The label shown in the switcher. |
Returns void