3

我有一个有很多面孔的 Web 应用程序,到目前为止,我已经通过创建主题来实现它。主题是一组要与通用后端一起使用的 html、css 和图像。

事情是这样布置的:

code/
themes/theme1
themes/theme2

Web 应用程序的每个实例都有一个配置文件,说明应该使用哪个主题。例子:

theme="theme1"

现在新的业务规则要求我对某些主题进行更改,而这些主题无法通过简单地更改 html/css/images 并需要更改后端来实现。在某些情况下,这些更改需要应用于一组主题。

我想知道如何最好地将它放在磁盘上,以及如何在代码中处理它。我敢肯定,其他人一定遇到了这个问题。

一个想法是:

code/common
code/theme1
code/theme2
themes/theme1
themes/theme2

然后让我的通用代码设置首先搜索的include_path内容code/theme1,然后code/common.

然后,如果我想专门说LogoutPagetheme2,我可以简单地将页面从复制code/common到相同的路径下code/theme2,它会选择专门的版本。

这个想法的一个问题是会有多个具有相同名称的类。尽管理论上它们永远不会包含在同一个执行中,但我无法扩展原始基类。

那么,如果我要为基类起一个唯一的名称呢?例如Theme1LogoutPage extends LogoutPage。我可以预见的一个问题是当一些通用代码(比如 Dispatcher)引用LogoutPage. 我可以向调度程序添加条件,但我想知道是否有更透明的方式来处理这个问题?

我能想到的另一个选择是为每个主题维护单独的分支,但我认为这可能需要大量工作。

最后要考虑的一件事是,功能可能源自一个主题,然后需要合并到公共代码库中。

非常感谢任何输入。如果有什么不同,那就是 LAMP 环境。

4

6 回答 6

1

我没有具体的建议。但是,我强烈建议不要走捷径……使用您会觉得很舒服的解决方案来添加第三个主题或明年更改某些内容。
重复是可维护性的敌人。

于 2008-10-29T02:41:42.620 回答
1

我将研究使用策略模式作为在不同版本的站点中实现不同功能的一种手段。拥有一个工厂,它接受您的配置并基于它提供适当的代码策略。每个策略都可以实现一些通用接口,以便从调用类的角度来看它们是可互换的。这将隔离您的更改以对 Factory 类、Configuration 类以及您需要实现以进行更改的任何新策略类实施新策略。您可以对需要在不同版本之间有所不同的任何用户控件执行相同(或类似)操作。

我将用伪代码进行说明(可能看起来很像 C#)

public interface ILogoutStrategy
{
   void Logout();
}

public abstract class AbstractLogoutStrategy : ILogoutStrategy
{
   public virtual void Logout()
   {
      // kill the sesssion
   }
}

public class SingleSiteLogoutStrategy : AbstractLogoutStrategy
{
   public void Logout()
   {
      base.Logout();
      // redirect somewhere
   }
}

public class CentralAuthenticationSystemLogoutStrategy : AbstractLogoutStrategy
{
   public void Logout()
   {
      base.Logout();
      // send a logout request to the CAS
      // redirect somewhere
   }
}

public static class StrategyFactory
{
   public ILogoutStrategy GetLogoutStrategy(Configuration config)
   {
      switch (config.Mode)
      {
         case Mode.CAS:
            return new CentralAuthenticationSystemLogoutStrategy();
            break;
         default:
         case Mode.SingleSite:
           return new SingleSiteLogoutStrategy();
           break;

      }
   }
}

示例用法:

ILogoutStrategy logoutStrategy = StrategyFactory.GetLogoutStrategy( config );
logoutStrategy.Logout();
于 2008-10-29T03:33:16.413 回答
0

您需要的是模板。

然后,您可以将代码与演示文稿分开。

我强烈推荐 smarty 模板。还有 PEAR template_it。

http://www.smarty.net/

这也使您的代码更易于维护。目的是在您的 php 中没有 html,并且在您的 html 中没有 php。

那么您需要做的就是更改用于每个主题的 html 模板。或模板文件夹。

于 2008-11-11T03:02:26.610 回答
0

您在使用母版页吗?如果您需要不同的布局和 UI 内容,您可以为每个实例设置一组不同的母版页。如果您需要自定义行为,那么您可能需要研究依赖注入。Spring.NET 等

于 2008-10-29T04:05:29.737 回答
0

我会做:

[主题名称]/[子文件夹] default/common default/common/html default/common/css red/code red/common red/common/html red/common/css red/code green/common green/common/html

因此,如果代码或任何其他组件不存在,它将回退到默认值。

但实际上我会在 svn 中对网站进行分支,所以如果它发展了通用代码,我可以合并它等等。请参阅 Subversion:http ://subversion.tigris.org/

于 2009-05-09T02:14:52.897 回答
0

你可以有:/common/code

并且:/站点名称/代码

/common/code 中的所有文件都是抽象类。对于 /common/code 中的每个文件,只需在 /sitename/code 中创建一个相应的非抽象类文件,该文件继承自 /common/code 中的抽象类。

这样,您只需要在 /sitename/code 中实现 CHANGES 其他所有内容都是仅存在于 /common/code 中的核心功能

这里要做的重要事情是确保您只向抽象类添加公共方法。这样,所有站点都可以使用这些方法,并且可以相同地处理/处理来自所有站点的类。

于 2009-05-08T16:58:02.687 回答