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.

Classes

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

ConstantValueDescription
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_DEPTH64Guard 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).

NameTypeDescription
$memberIdintThe owning member.
$parentIdintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$moduleNamestringThe registering module of the folder type.
$folderTypestringThe folder type name.
$parentIdintThe parent folder id, or 0 for root.
$namestringThe 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.

NameTypeDescription
$memberIdintThe owning member.
$folderIdintThe 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).

NameTypeDescription
$memberIdintThe owning member.
$folderIdintThe folder to move.
$newParentIdintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$folderIdintThe 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.

NameTypeDescription
$folderIdintThe folder id.

Returns string The permalink string.

Rename

MemberFolder::Rename(int $memberId, int $folderId, string $name): MemberFolderData

Rename a folder the member owns.

NameTypeDescription
$memberIdintThe owning member.
$folderIdintThe folder to rename.
$namestringThe 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.

NameTypeDescription
$moduleNamestringThe folder type's module.
$folderTypestringThe 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.

NameTypeDescription
$frame?callableAn 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.

NameTypeDescription
$moduleNamestringThe folder type's module.
$folderTypestringThe folder type name.
$frame?callableAn 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().

NameTypeDescription
$moduleNamestringThe folder type's module.
$folderTypestringThe 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.

NameTypeDescription
$folderIdintThe folder id.

Returns string The folder URL.

MemberFolder::UrlByPermalink(string $permalinkString): string

The site URL for a folder from its permalink string and the Route() anchor.

NameTypeDescription
$permalinkStringstringThe 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().

NameTypeDescription
$contentRecordobjectThe 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().

NameTypeDescription
$sortRecordobjectThe 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().

NameTypeDescription
$viewRecordobjectThe 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.

NameTypeDescription
$moduleNamestringThe registering module.
$folderTypestringThe 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.

NameTypeDescription
$moduleNamestringThe module name.
$typestringThe 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.

NameTypeDescription
$moduleNamestringThe registering module.
$folderTypestringThe folder type name.
$declarecallableA 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

PropertyTypeDescription
$folder->idintThe folder id (readonly).
$folder->memberIdintThe owning member (readonly).
$folder->moduleNamestringThe registering module of the folder type (readonly).
$folder->typestringThe folder type name (readonly).
$folder->parentIdintThe single parent, 0 for root (readonly).
$folder->namestringThe folder name (readonly).
$folder->positionintThe sort position among its siblings (readonly).
$folder->addedintThe creation timestamp (readonly).
$folder->deletedintThe soft-delete timestamp, 0 when live (readonly).
Functions

__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.

NameTypeDescription
$idintThe folder id.
$memberIdintThe owning member.
$moduleNamestringThe registering module.
$typestringThe folder type name.
$parentIdintThe single parent, 0 for root.
$namestringThe folder name.
$positionintThe sort position.
$addedintThe creation timestamp.
$deletedintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$parentIdintThe 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.

NameTypeDescription
$memberIdintFilter by member, or 0 for any.
$moduleNamestringFilter by module, or blank for any.
$typestringFilter 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.

NameTypeDescription
$memberIdintThe owning member.
$moduleNamestringThe folder type's module.
$typestringThe folder type name.

Returns int The root folder count.

fromRow

MemberFolderDatabase::fromRow(stdClass $row): MemberFolderData

Build a folder data object from a database row.

NameTypeDescription
$rowstdClassThe member_folder table row.

Returns MemberFolderData The folder data.

Get

MemberFolderDatabase::Get(int $id): MemberFolderData

Read a folder by id.

NameTypeDescription
$idintThe 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.

NameTypeDescription
$idintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$moduleNamestringThe registering module.
$typestringThe folder type name.
$parentIdintThe parent folder id, or 0 for root.
$namestringThe folder name.
$positionintThe sort position.
$addedintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$parentIdintThe 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.

NameTypeDescription
$memberIdintFilter by member, or 0 for any.
$moduleNamestringFilter by module, or blank for any.
$typestringFilter by type, or blank for any.
$startintThe row offset.
$countintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$moduleNamestringThe folder type's module.
$typestringThe folder type name.
$startintThe row offset.
$limitintThe 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.

NameTypeDescription
$idintThe folder id.
$timestampintThe delete timestamp.

Returns void

UpdateName

MemberFolderDatabase::UpdateName(int $id, string $name): void

Update a folder's name.

NameTypeDescription
$idintThe folder id.
$namestringThe new name.

Returns void

UpdateParent

MemberFolderDatabase::UpdateParent(int $id, int $parentId, int $position): void

Update a folder's parent and sort position.

NameTypeDescription
$idintThe folder id.
$parentIdintThe new parent folder id, or 0 for root.
$positionintThe 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.

Functions

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.

NameTypeDescription
$moduleNamestringThe folder type's module.
$folderTypestringThe folder type name.
$parentIdintThe parent folder id, or 0 for the top level.
$doneUrlstringThe 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.

NameTypeDescription
$folderIdintThe folder to rename.
$currentNamestringThe current folder name, pre-filled into the field.
$doneUrlstringThe 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

ConstantValueDescription
MemberFolderPage::PER_PAGE24Content rows per page, the unit the paging bar counts.
MemberFolderPage::MAX_FOLDERS1000Upper 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.

NameTypeDescription
$folderMemberFolderDataThe 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.

NameTypeDescription
$folderIdintThe folder to render.
$pageintThe 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.

NameTypeDescription
$memberIdintThe owning member.
$moduleNamestringThe folder type's module.
$folderTypestringThe folder type name.
$pageintThe 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.

NameTypeDescription
$folderMemberFolderDataThe 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.

Functions

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.

NameTypeDescription
$moduleNamestringThe content's owning module.
$contentTypestringThe content's type name.
$countFncallablefn(int $folderId): int, the number of this content in a folder.
$renderFncallablefn(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.

NameTypeDescription
$keystringThe opaque sort key.
$labelstringThe 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.

NameTypeDescription
$keystringThe opaque view key.
$labelstringThe label shown in the switcher.

Returns void