Here are some of the "tricky" ways I've manipulated Drupal to get the job done, without resorting to custom modules or theming.
The menus module in Drupal core allows you to manipulate the system menus through the admin GUI interface (admin >> build >> menus)
However, it does not give you control over at least two key aspects of the menu:
These can be controlled if the menu is built programmatically. For these reasons, I created a custom lasqueti menu module (lasqueti_menu). This module does the following:
See the following pages for more information about working with and maintaining these tabbed menus.
The idea behind tabbed navigation is to provide the user with a spatial orientation to the context of the page they are viewing. The tabbed layout creates its own, implicit "breadcrumb" by always showing the user exactly where they are in the structure. Thus, you'll notice that the breadcrumb has been removed from these pages.
The tabbed menus only present information that is available elsewhere on the site. It is meant as a seperate navigational structure, primarily aimed at users who are new to the site, and simply want to browse around. Thus, the tabs are organized into "categories of interest" - so users can view all content on the site related to their interests.
To this end, tabs "pull-in" two distinct kinds of data:
The teaser lists are almost all generated by a single view named "by_category". This view simply lists teasers for all nodes, using a "Taxonomy:term id" as an argument. The tabbed menu code supplies the relevant taxonomy terms for the Views argument when the view is built, to pull-in all the related nodes. In this way, whenever a new node is added or a the categories of a node are modified, it will automatically show up on the right tabbed page.
When a list of teasers is presented, there is always a "heading" node placed at the top of the list (simply by tagging it with the right categories and making it "sticky"). Although this "heading node" is just a normal node with the title set to the tab title and the body containing an overview of the tab's contents, it is not used as a normal node, and should not appear in any other displays (I hope!). Some special logic was added to template.php and node.tpl.php to handle this node, but ultimately, these may need to be stored in a special node type so their display in other lists can be contolled more easily. An alternate implementation would be to display the heading node explicitly during _display_view in the custom tabs module. This way those nodes could be controlled very precisely.
Pages in the Farmer's Market, with their associated produce lists, represent a fairly complex set of inter-relations. Understanding how the various node types, cck fields, categories, and views fit together will take some time. However, setting up and maintaining a Farmer's Market page is not hard, but you need to be quite careful to get the relationships right:
Thus, a "Famer's Market page" is a Market Page, tagged with Topic "Farmer's Market, with the same URL path as a term in the Lasqueti Market category. These rules are used to identify these pages in the code - so pages that don't adhere will not be considered part of the Farmer's Market, and won't work correctly. This is a little sketchy, perhaps even a bit hacky, and limits the re-use of the Product node type ouside the Farmer's Market - but it was expedient, and seemed cleaner than creating a new node type or yet another taxonomy. Although the Topic category is used to identify Farmer's Market pages, the Lasquti Market term and URL path still need to be identical for Taxonomy Redirect to work.
The Author of a correctly configured Farmer's Market page will see two new tabs on their page:
These two tabs are created by the custom Lasqueti Menu module - they are "dynamic" local menu items. It is important to note that only the page author will see these tabs, so once the admin gives authorship over to another user, they won't see these tabs anymore. I could not figure out how to make this work so admin always sees all.
There are three distinct "Product List" views:
The upshot?
When user's create a new product, they need to select both the correct Lasqueti Market taxonomy (so the product is listed correctly in the Farmer's Market) and the correct Market Page node reference (so the product is added to their mini-gallery). The node reference selector uses the user_pages view to restict them to selecting references to only pages they own. This is good because it avoids confusion and mistakes, but it is bad because it means the admin cannot create these node reference links without first "masquarading" as the author of the page. The Lasqueti Market category terms would be more difficult to restrict in this way, so they are open, and thus prone to error.
This reliance on authorship for a number of the functions (e.g., edit tab availablitity, node editing access, node reference list, etc.) also implies that only one person can manage a given market page. It is certainly possible to set-up group access and do things based on groups rather than author, but there would be a lot of overhead (and extra work!). An easy workaround would be to create a group ID for the website that all members of the group could use to update the shared resource.