Doug Whiteley wrote:
> [snip]
>> Or use symlinks.
>>
Hi Guys,
Thanks for all the help. I actually came up with a pretty nice solution
that is (so far) working quite well. I'll post what I've done so far in
case anyone else tries this.
Scenario: I'm a single developer managing two (or more) catalogs. My
goal was to re-use as much code as possible from the catalogs but still
retain the flexibility to separate portions of code in an organized
manner. I got this idea from studying the Magento software and I really
liked they way they handled multi store setups.
The goals were this...
1) Store all catalogs in the same directory structure
2) Share as much (or as little) configuration setting between catalogs.
3) Allow separation of pages, blocks of code and themes simply by
placing files in different directories and not having to make
configuration changes.
4) Minimal or no use of symlinks to ease SVN configuration and enhance
organizational intuitiveness.
5) Minimal duplication of configuration settings.
And a lot more (to verbose to post)
So the solution I came up with was to use Subcatalog, PageDir,
TemplateDir and a lot of 'ParseVariables Yes' goodness. With this setup
I can create catalog specific or theme specific changes simply by moving
or creating the file in subcategories. I can also use shared blocks of
code with the same flexibility. And all this without making
configuration changes or using symlinks. So far, it's working pretty
good. Here are the (relevant portions) of the config files.
#========================================================================#
# interchange.cfg
#========================================================================#
Catalog store1 /home/interchange/catalogs /cgi-bin/store1
SubCatalog store2 store1 /home/interchange/catalogs /cgi-bin/store2
#==========================================================================#
# catalog.cfg (Config file for store1)
#==========================================================================#
# This is the first catalog or "Parent" catalog configuration file.
# It does not matter which catalog is the parent since they all parse
# the default.cfg file in the same manner. The only difference is that
# This file must be named catalog.cfg where as the subcatalogs configuration
# files are named after the shop. Example: shop1.cfg, shop2.cfg etc.
#==========================================================================#
ParseVariables Yes
#==========================================================================#
# Set some variables that are unique to this catalog only
#==========================================================================#
Variable SERVER_NAME store1.com
Variable CATALOGNAME store1
# Database setup
DatabaseAuto dbi:mysql:store1 user pass
#==========================================================================#
# Include the default configuration for all catalogs
#==========================================================================#
include default.cfg
#==========================================================================#
# Include the catalog specific configuration
#==========================================================================#
include etc/__CATALOGNAME__/actionmaps.cfg
#==========================================================================#
# store2.cfg (Config file for store2)
#==========================================================================#
ParseVariables Yes
#==========================================================================#
# Set some variables that are unique to this catalog only
#==========================================================================#
Variable SERVER_NAME store2.com
Variable CATALOGNAME store2
# Database setup
DatabaseAuto dbi:mysql:store2 user pass
#==========================================================================#
# Include the default configuration for all catalogs
#==========================================================================#
include default.cfg
#==========================================================================#
# Include the catalog specific configuration
#==========================================================================#
include etc/__CATALOGNAME__/actionmaps.cfg
#==========================================================================#
# default.cfg (Config file for all shared catalogs)
#==========================================================================#
# This is the default configuration file for all shared catalogs.
#==========================================================================#
Message Parsing default.cfg for catalog __CATALOGNAME__ ...
# Parse variables in this configuation file.
ParseVariables Yes
# Disable this for production
Pragma dynamic_variables
# Turn this on to get debug info
Variable DEBUG 1
# Override the default data directory (default products)
DataDir data
#==========================================================================#
# Set some variables
#==========================================================================#
Variable SECURE_SERVER __SERVER_NAME__
Variable CATALOGDIR /home/interchange/catalogs
Variable CGI_DIR /home/httpd/vhosts/__SERVER_NAME__/cgi-bin
Variable CGI_URL
Variable CACHEDIR /var/cache/interchange/__CATALOGNAME__
Variable DOCROOT /home/httpd/vhosts/__SERVER_NAME__/httpdocs
Variable ICROOT /usr/local/interchange
Variable LOGDIR /var/log/interchange/__CATALOGNAME__
Variable SAMPLEHTML __DOCROOT__/__CATALOGNAME__
Variable SAMPLEURL http://__SERVER_NAME__
#==========================================================================#
# Read in shared variables for all catalogs
#==========================================================================#
Database default_variables default_variables.txt TAB
VariableDatabase default_variables
#==========================================================================#
# Read in catalog specific variables, overriding shared if they exist
#==========================================================================#
Database __CATALOGNAME___variables __CATALOGNAME___variables.txt TAB
VariableDatabase __CATALOGNAME___variables
#==========================================================================#
# Read in global templates
#==========================================================================#
DirConfig Variable templates
#==========================================================================#
# If we have a theme set (Variable THEME) then adjust the search
# order of PageDir and TemplateDir so that the theme specific
# directories are searched first.
#==========================================================================#
ifdef THEME
Message Configuring catalog __CATALOGNAME__ with theme __THEME__ ...
# Include a theme file for any theme specific configurations
# This is not required, only optional. Theme files are read
# in ascending order (or bottom up) so that theme configuration
# files are read last so they can override other settings.
include templates/__THEME__/theme.cfg
include templates/__CATALOGNAME__/__THEME__/theme.cfg
# Pick up an entire directory of variables if defined.
DirConfig Variable themes/__THEME__
DirConfig Variable themes/__CATALOGNAME__/__THEME__
# Setup the catalog pages directory, this take precedence over TemplateDir.
PageDir pages/__CATALOGNAME__/__THEME__
# Now we set TemplateDir. We include the PageDir directory so that files
# relative to the PageDir directory will be found.
TemplateDir pages/__CATALOGNAME__/__THEME__
TemplateDir pages/__THEME__
TemplateDir pages/__CATALOGNAME__
# Now we setup the search order for the blocks directory.
TemplateDir blocks/__CATALOGNAME__/__THEME__
TemplateDir blocks/__THEME__
# If used, define search order of tables and directories for page data.
# PageTables page_data___CATALOGNAME_____THEME__
# PageTables page_data___CATALOGNAME__
endif
#==========================================================================#
# End of theme configuration
#==========================================================================#
#==========================================================================#
# If no theme is defined then we set the PageDir
#==========================================================================#
ifndef THEME
PageDir pages/__CATALOGNAME__
endif
#==========================================================================#
# These get set regardelss of theme existence.
#==========================================================================#
TemplateDir pages/__CATALOGNAME__
TemplateDir pages
TemplateDir blocks/__CATALOGNAME__
TemplateDir blocks
# PageTables page_data___CATALOGNAME__
# PageTables page_data
#==========================================================================#
# All done with PageDir, TemplateDir and Themes.
# Now we setup general conifuration stuff
#==========================================================================#
Message Sending __CATALOGNAME__ errors to __LOGDIR__/error.log
AutoVariable ImageDir
ImageDir /images/__CATALOGNAME__/
#ImageDirSecure /images/__CATALOGNAME__/
ErrorFile __LOGDIR__/error.log
AsciiTrack __LOGDIR__/tracking.log
TrackFile __LOGDIR__/usertrack.log
SessionDatabase __CACHEDIR__/session
ScratchDir __CACHEDIR__/tmp
VendURL http://__SERVER_NAME____CGI_URL__
SecureURL __SECURE_SERVER____CGI_URL__
RunDir /var/run/interchange/__CATALOGNAME__
etc, etc etc.......
There is of course a lot more, but this should give a general idea of
the direction. If anyone spots a "Gotcha" please let me know. :)
--
- - -- ---- ---------------------------- --- -- - -
Marty Tennison
- -- --- --------------------------------------- --- --