As the author, I use those classes in a lot of the forms I build, in a variety of ways, on my client projects.
I usually do something similar to the code fragment below for processing forms; this should reveal how to easily delete items, with a delete confirmation step/form (please note this is not complete functional snippet code, just some fragments showing some possibilities):
<?php
//INITIALIZE AND LOAD DATA AND THE MAKEFORM CLASS HERE
// (left out for brevity)
// set some required fields
$requiredFields= array (
'Username' => 'web_users:user_name',
'Password' => 'web_users:password',
'Email address' => 'web_user_attributes:email',
'First name' => 'person:first_name',
'Last name' => 'person:last_name',
'Expiration date' => 'member:expire_date',
'Street address' => 'address:street',
'City' => 'address:city',
'State' => 'address:state',
'Zip' => 'address:zip',
);
$invalidFields= array ();
$deleteConfirm= false;
if (isset ($_POST)) {
if (isset ($_POST['save']) || isset ($_POST['save_x'])) {
foreach ($_POST as $post_key => $post_val) {
if (empty ($post_val) && $key= array_search($post_key, $requiredFields, true)) {
$invalidFields[$post_key]= $key;
}
}
if (empty ($invalidFields)) {
// DO YOUR INSERTS/UPDATES/ETC. HERE
// (left out for brevity)
} else {
$modx->setPlaceholder('messagebox', '<p class="warning">' . implode('<br />', $invalidFields) . '</p>');
}
}
elseif (isset ($_POST['delete_confirm']) || isset ($_POST['delete_confirm_x'])) {
$modx->setPlaceholder('messagebox', '<p class="warning">You are about to delete this subscriber! Clicking Delete this below will remove this subscriber from the database permanently.</p><br />');
$formElements= array (
'person' => array (
'type' => 'hidden',
'name' => 'person',
'value' => $person_id,
),
'delete' => array (
'type' => 'image',
'name' => 'delete',
'value' => 'Delete this item',
'alt' => 'Delete this item',
'src' => 'assets/images/delete-this.png',
'extra' => ' or <a title="Cancel" href="[~[*id*]~]&person=' . $person_id . '">Cancel</a>',
),
);
$makeForm->setFormElements($formElements);
$personForm= $makeForm->buildForm();
$modx->setPlaceholder('personForm', $personForm);
return $output;
}
elseif (isset ($_REQUEST['delete']) || isset ($_REQUEST['delete_x'])) {
if (isset ($person_id) && is_object($person)) {
//NOW ACTUALLY DELETE SOMETHING AND REDIRECT, OR STAY AND PRESENT ERRORS
if ($person->remove()) {
$modx->sendRedirect($modx->makeUrl($modx->documentObject['parent']));
} else {
$modx->setPlaceholder('messagebox', '<p class="error">There was an error when attempting to remove this user! Contact support for assistance if the problem persists.</p>');
}
} else {
$modx->setPlaceholder('messagebox', '<p class="error">There was an error when attempting to remove a user! Contact support for assistance if the problem persists.</p>');
}
}
}
// BUILD YOUR FORM HERE
$formElements= array (
'person' => array (
'type' => 'hidden',
'name' => 'person',
'value' => $person_id,
),
'person:first_name' => array (
'type' => 'text',
'label' => 'First Name',
'name' => 'person:first_name',
'value' => $person->get('first_name'),
'size' => '50',
'maxlength' => '100',
),
'person:middle_name' => array (
'type' => 'text',
'label' => 'Middle Name',
'name' => 'person:middle_name',
'value' => $person->get('middle_name'),
'size' => '50',
'maxlength' => '100',
),
'person:last_name' => array (
'type' => 'text',
'label' => 'Last Name',
'name' => 'person:last_name',
'value' => $person->get('last_name'),
'size' => '50',
'maxlength' => '100',
),
'web_users:username' => array (
'type' => 'text',
'label' => 'Username',
'name' => 'web_users:user_name',
'value' => $webUserId? $webUser['username']: '',
'size' => '50',
'maxlength' => '100',
),
'web_users:password' => array (
'type' => 'password',
'label' => 'Password',
'name' => 'web_users:password',
'value' => $webUserId? $webUser['password']: '',
'size' => '50',
'maxlength' => '100',
),
'web_user_attributes:email' => array (
'type' => 'text',
'label' => 'Email Address',
'name' => 'web_user_attributes:email',
'value' => $webUserId? $webUser['email']: '',
'size' => '100',
'maxlength' => '255',
),
'member:expire_date' => array (
'type' => 'text',
'label' => 'Member Expiration Date',
'name' => 'date1',
'value' => $webUserId? $member->get('expire_date', 'm/d/Y'): strftime('m/d/Y', mktime(0,0,0,date('m'),date('d'),date('Y')+1)),
'size' => '20',
'maxlength' => '20',
'extra' => '<script type="text/javascript" id="js1">var cal1 = new CalendarPopup(\'datediv1\');cal1.showYearNavigation();cal1.showYearNavigationInput();</script><a href="#" onclick="cal1.select(document.forms[0].date1,\'anchor1\',\'MM/dd/yyyy\'); return false;" title="Choose date with calendar" name="anchor1" id="anchor1"><img src="assets/images/calendar.png" alt="[ calendar ]" /></a> <a href="[~102~]#date"><img src="assets/images/help.png" alt="[ help ]" /></a><div style="position:absolute;display:inline;width:180px;height:1px;"><div id="datediv1" style="width:100%;"></div></div>',
),
'address:street' => array (
'type' => 'text',
'label' => 'Street Address',
'name' => 'address:street',
'value' => $address->get('street'),
'size' => '80',
'maxlength' => '255',
),
'address:city' => array (
'type' => 'text',
'label' => 'City',
'name' => 'address:city',
'value' => $address->get('city'),
'size' => '80',
'maxlength' => '255',
),
'address:state' => array (
'type' => 'select',
'label' => 'State',
'name' => 'address:state',
'options' => $makeForm->createOptions($stateOptions, $address->get('state'), true),
'size' => '1',
),
'address:zip' => array (
'type' => 'text',
'label' => 'Zip',
'name' => 'address:zip',
'value' => $address->get('zip'),
'size' => '10',
'maxlength' => '20',
),
'address:country' => array (
'type' => 'hidden',
'name' => 'address:country',
'value' => 'USA',
),
'primary_phone:number' => array (
'type' => 'text',
'label' => 'Primary phone',
'name' => 'primary_phone:number',
'value' => $primaryPhone->get('number'),
'size' => '20',
'maxlength' => '20',
),
'secondary_phone:number' => array (
'type' => 'text',
'label' => 'Secondary phone',
'name' => 'secondary_phone:number',
'value' => $secondaryPhone->get('number'),
'size' => '20',
'maxlength' => '20',
),
'save' => array (
'type' => 'image',
'name' => 'save',
'value' => $person_id ? 'Update this item' : 'Add this item',
'src' => $person_id ? 'assets/images/update-item.png':'assets/images/add-this-item.png',
'extra' => ' or <a title="Cancel" href="[~[*parent*]~]">Cancel</a>',
),
);
if ($person_id) {
$formElements['delete']= array (
'type' => 'image',
'name' => 'delete_confirm',
'value' => 'Delete this item',
'alt' => 'Delete this item',
'src' => 'assets/images/delete-this.png',
'class' => 'rightup',
);
}
// ETC...
?>
And a full page view of the listing is just a matter of creating a target page where you pass a unique identifier from which you can retrieve the data and present it however you so choose.