I thought it would be fun to put together a small demonstration of this today using the references, views, date and rules modules, but no php coding.
In a nutshell, create a 'slot' content type that has fields for date, start time, end time, unique title & user reference. Create a node for each session slot, leaving the user references blank.
To control access I created a manager and a volunteer role and added some users with those roles. Mangers can add/edit/delete slots, volunteers can be assigned to slots, view a list of their appointments, assign themselves, open spots and remove assigned slots.
Create a view with displays for listing volunteers. Create a view for listing slots, unassigned slots, assigned slots and slots assigned to a user. Add links to allow user to assign and unassign from a slot.
Create a view for volunteer's profile tabs that shows their current assignments. Embed another view in the footer that shows available slots. Add links to cancel and add assignments by linking to node/[nid]/assign and node/[nid]/unassign, which will be handled by a pair of rules.
Create rules to assign and unassign the current user from a given slot.
Here is the overview of the "assign" operation rule. Basically, when a volunteer visits a slot page with the word assign appended, we check that the slot is unassigned and fill the slot's user reference field with the current user.
It was fun figuring out how to do this without any programming, although that would be my preference instead of using rules.
There are lots of details as to how to configure the views and rules, but nothing very tricky. Things like handling access, menus, formatting, tokens, etc.
This is just a simple approach for use with limited sessions, e.g. conference sessions. For repeated daily slots such as for office appointments, separate slot and appointment types make more sense and add a little to the complexity with forward and backward references between 'slots' and 'appointments' but could still be built in a similar manner.
I hope this helps.
I thought it would be fun to put together a small demonstration of this today using the references, views, date and rules modules, but no php coding.
In a nutshell, create a 'slot' content type that has fields for date, start time, end time, unique title & user reference. Create a node for each session slot, leaving the user references blank.
To control access I created a manager and a volunteer role and added some users with those roles. Mangers can add/edit/delete slots, volunteers can be assigned to slots, view a list of their appointments, assign themselves, open spots and remove assigned slots.
Create a view with displays for listing volunteers. Create a view for listing slots, unassigned slots, assigned slots and slots assigned to a user. Add links to allow user to assign and unassign from a slot.
Create a view for volunteer's profile tabs that shows their current assignments. Embed another view in the footer that shows available slots. Add links to cancel and add assignments by linking to node/[nid]/assign and node/[nid]/unassign, which will be handled by a pair of rules.
Create rules to assign and unassign the current user from a given slot.
Here is the overview of the "assign" operation rule. Basically, when a volunteer visits a slot page with the word assign appended, we check that the slot is unassigned and fill the slot's user reference field with the current user.
It was fun figuring out how to do this without any programming, although that would be my preference instead of using rules.
There are lots of details as to how to configure the views and rules, but nothing very tricky. Things like handling access, menus, formatting, tokens, etc.
This is just a simple approach for use with limited sessions, e.g. conference sessions. For repeated daily slots such as for office appointments, separate slot and appointment types make more sense and add a little to the complexity with forward and backward references between 'slots' and 'appointments' but could still be built in a similar manner.
I hope this helps.