memberdata
Wordpress plugin to manage external membership data
by Michiel Uitdehaag · github.com/muisit/memberdata · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/muisit/memberdata/archive/refs/heads/main.zipGeneric data management of row based entities.
Description
MemberData
This is a generic Wordpress plugin to manage data of non-site users, hypothetical 'members' of an external organisation. It features a grid interface for reading the collected data and a configurable set of attributes, with validation rules, for each data entry. The collected data can be downloaded to a spreadsheet.
Plugin Interface
The plugin defines the following filters and actions on which to interface:
memberdata_loaded(): plugin has registered all its callbacks and classes. Hook into this to load dependent pluginsmemberdata_attribute_types(array $types): a filter that returns a dictionary of attribute type settings. The key is the machine name for the type as used in attributes, the values is a list of type settings:label, optionalrules, anoptionstype field determining the type entry field for the options and anoptdefaultsetting to fill theoptionswith a default if no value is given. If nooptionsare provided, theoptionsare not available for entry in the front-end.memberdata_configuration($configuration): this assembles an array of attributes for a specific sheet. The order of the array determines the display order in the front end interface. Each entry has aname, atype, an optionalruleslist filled with the default settings of the type and afilterboolean value ('Y' or 'N') indicating if this attribute can be used to filter in the front end display. The configuration parameter consists of a dictionary with asheetID and aconfigurationarray, which will hold the result.memberdata_save_configuration($configuration): this stores the sheet-related configuration for the plugin. The configuration is a dictionary with entries for each sheet named 'sheet-' + sheet-ID, which holds an array of attributes. The order of the array determines the order of the header. This filter will rename attributes if an attribute entry has an 'originalName' field which differs from the 'name' field.memberdata_find_members(array $settings): this filter assembles a list of members and their attribute values. Hook into this to add new attributes or adjust existing attributes. The core assembly is done at priority500. The$settingsarray can contain fields foroffsetandpagesize(0ornullmeans no paging),sorter(attribute name) andsortDirection(ascordesc), afilterobject (dictionary containing objects with asearchentry for free-text-search, and/or avaluesentry containing a list of specific values to filter on, and/or a value 'trashed' indicating the soft-deleted members should be searched as well), acutoffvalue indicating at which count paging can be disregarded, alistvalue containing the found members (merge with this list) and acountvalue containing the total count of all available members. Also provide thesheetID to determine the sheet to find members in.memberdata_save_member(Member: $member): this is called when a client wants to add a new member. Hook into this to create dependent structures for new members. The basic creation of the new member is done at priority500, any filter before that can adjust the member model to be saved, any filter after that can use the newly saved model (with a database identifier).memberdata_save_attributes(array $settings): this is called when a client wants to save a single or a set of attributes. The settings array consists ofmember(Member model),attributes(dictionary of attribute->value),messages(array of validation messages) andconfiguration(array of supported attributes, as returned bymemberdata_configuration, optional)memberdata_values($settings): filter to retrieve a set of unique values for a specific attribute field. Thesettingsarray contains asheetID, an entryfieldto indicate the attribute name and an entryvalueswhich contains the result list.memberdata_find_sheets($results): retrieve all available sheets. The return value is the results parameter.memberdata_save_sheet($settings): validate and save a sheet. The settings is a dictionary containing asheetmodel that is validated and amessagesarray that contains any error messages. This filter runs at priority500, before that, the model is not saved or updated (idmay not be valid).
Examples
add_action('memberdata_loaded', function () { /* perform dependent plugin initialisations */})
$types = \apply_filters('memberdata_attribute_types', []);
$attributes = \apply_filters('memberdata_configuration', ['sheet' => $sheetId, 'configuration' => []])['configuration'] ?? [];
$members = \apply_filters('memberdata_find_members', ['list' => [], 'sheet' => $sheetId', 'sorter' => 'Name', 'sortDirection' => 'asc', 'offset' => 0, 'pagesize' => 20, 'filter' => ['Name' => ['search' => 'Pete']]])['list'] ?? [];
\apply_filters('memberdata_save_member', $member);
\apply_filter('memberdata_save_attributes', ['member' => $member. 'attributes' => ['Name' => 'Pete'], 'messages' => []]);
$filterValues = \apply_filters('memberdata_values', ['sheet' => $sheetId, 'field' => 'Name', 'values' => []])['values'] ?? [];
$sheets = \apply_filters('memberdata_find_sheets', []);
\apply_filters('memberdata_save_sheet', ['sheet' => $sheetModel, 'messages' => []]);
Validation
Each attribute of each row can contain a list of validation rules, separated by bars ('|'). Some rules can have a parameter, which is specified like: 'max=12' or 'lte=30.2'. Rules are applied after converting the value using any formatting specified in the options field, if applicable.
The following rules are currently available:
Transformation Rules
- int: value is converted to a whole number (integer)
- float: value is converted to a floating-point number
- bool: value is set to 'Y' for entries containing the text 'yes', 'true', 'on', 't', 'y' (case insensitive), and set to 'N' otherwise
- trim: whitespace is trimmed from the value left and right
- upper: value is converted to upper case
- lower: value is converted to lower case
- ucfirst: first letter is converted to upper case
Length or Size Rules
- lte: value has a length (text), value (numeric) or date less than or equal to the parameter
- lt: value has a length (text), value (numeric) or date less than the parameter
- eq: value has a length (text), value (numeric) or date equal to the parameter
- gt: value has a length (text), value (numeric) or date greater than the parameter
- gte: value has a length (text), value (numeric) or date greater than or equal to the parameter
- min: alias for 'gte'
- max: alias for 'lte'
Other Rules
- required: marks the field as a required entry, cannot be left blank
- nullable: marks the field as not-required, allowed blank (same as leaving out 'required')
- fail: always fails field validation (not usable in this context)
- skip: skip validation on this field
- email: value is validated to be an e-mail address
- url: value is validated to be a URL/website address
- date: value is validated to be a date, input field uses the format specified in the options
- datetime: value is validated to be a date + time (after 1970-01-01), input field uses the format specified in the options
- enum: value is one of a list of allowed values, input field uses the bar-separated list in the options
Frequently Asked Questions
Can I connect a contact form to the collection?
Not at the moment and not through this plugin. A dependent plugin is planned to manage forms for data collection.
Can I import data using a spreadsheet?
Not yet.
Changelog
1.0
Initial version