У меня есть веб-приложение с множеством лиц, и до сих пор я реализовал его с помощью создания тем. Тема - это набор HTML, CSS и изображений, которые будут использоваться с общей серверной частью.
Вещи выложены так:
code/
themes/theme1
themes/theme2
И каждый экземпляр веб-приложения имеет файл конфигурации, в котором указано, какую тему следует использовать. Пример:
theme = "theme1"
Теперь новые бизнес-правила просят меня внести изменения в определенные темы, которые не могут быть достигнуты простым изменением html / css / images и требуют изменения серверной части. В некоторых случаях эти изменения необходимо применить к группе тем.
Мне интересно, как лучше всего разместить это на диске, а также как обработать это в коде. Я уверен, что кто-то другой столкнулся с этим.
Одна идея - иметь:
code/common
code/theme1
code/theme2
themes/theme1
themes/theme2
Затем пусть мой общий код установит include_path так, чтобы сначала выполнялся поиск code/theme1, а затем code/common.
Затем, если я хочу специализироваться, скажем, класс LogoutPage для theme2, я могу просто скопировать страницу из code/common по тому же пути в code/theme2, и он подберет специализированную версию.
Одна из проблем с этой идеей состоит в том, что будет несколько классов с одним и тем же именем. Хотя теоретически они никогда не будут включены в одно и то же исполнение, я не смогу расширить исходный базовый класс.
Что, если бы я создал уникальное имя для базового класса? например Theme1LogoutPage extends LogoutPage. Одна проблема, которую я могу предвидеть, - это когда некоторый общий код (например, Dispatcher) ссылается на LogoutPage. Я могу добавить условия диспетчеру, но мне интересно, есть ли более прозрачный способ справиться с этим?
Другой вариант, который я могу придумать, - это поддерживать отдельные ветки для каждой темы, но я думаю, что это может потребовать много работы.
И последнее, что следует учитывать, - это то, что функции могут возникать в одной теме, а затем требовать слияния с общей кодовой базой.
Любой вклад приветствуется. Если это имеет какое-то значение, это среда LAMP.






У меня нет конкретной рекомендации. Тем не менее, я настоятельно рекомендую НЕТ использовать ярлык ... Используйте решение, которое вам будет удобно, чтобы добавить третью тему или что-то изменить в следующем году. Дублирование - враг ремонтопригодности.
Спасибо за комментарии Хапкидо. Я согласен с вашим утверждением о дублировании.
Я бы исследовал использование шаблона стратегии как средства для реализации различных функций в разных версиях сайта. Имейте Factory, который принимает вашу конфигурацию и предоставляет на ее основе соответствующую стратегию кода. Каждая стратегия может реализовывать некоторый общий интерфейс, чтобы они были взаимозаменяемыми с точки зрения вызывающего класса. Это изолирует ваши изменения для реализации новых стратегий в классе Factory, классе конфигурации и любых новых классах стратегии, которые вам необходимо реализовать для внесения изменений. Вы можете сделать то же самое (или подобное) с любыми пользовательскими элементами управления, которые должны различаться в разных версиях.
Я проиллюстрирую псевдокодом (который может подозрительно выглядеть как 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();
Спасибо за развернутый ответ! Итак, вы предлагаете должна быть одна кодовая база. Код должен быть специализированным не на основе предполагаемого сайта, а на его функциональности. Затем в файле конфигурации (для каждого сайта) будет указано, какие функции предлагаются пользователям этим сайтом. Это правильно?
Вы используете мастер-страницы? Если вам нужен другой макет и элементы пользовательского интерфейса, вы можете просто иметь другой набор главных страниц для каждого из ваших экземпляров. Если вам нужно настраиваемое поведение, вы можете изучить внедрение зависимостей. Spring.NET и т. д.
Вы изменили свой вопрос, чтобы указать, что ваша среда не является ASP.NET. Я отвечал, исходя из предположения, что вы работаете в ASP.NET. Извиняюсь.
Вам нужны шаблоны.
После этого вы можете отделить свой код от презентации.
Я очень рекомендую умные шаблоны. Также PEAR template_it.
Это также сделает ваш код более удобным в сопровождении. Цель состоит в том, чтобы не было HTML в вашем php и не было PHP в вашем html.
тогда все, что вам нужно сделать, это изменить шаблон html, который используется для каждой темы. или папка шаблонов.
У вас могло быть: / общий / код
И: / имя сайта / код
Все файлы в / common / code являются абстрактными классами. Для каждого файла в / common / code просто создайте соответствующий файл неабстрактного класса в / sitename / code, который НАСЛЕДУЕТ от абстрактного класса в / common / code.
Таким образом, вам нужно только внести ИЗМЕНЕНИЯ в / sitename / code. Все остальное - это основная функциональность, которая существует только в / common / code.
Здесь важно убедиться, что вы добавляете только методы общественный к абстрактным классам. Таким образом, методы доступны для всех сайтов, а классы со всех сайтов могут обрабатываться / работать одинаково.
Я бы сделал:
[название темы] / [подпапка] по умолчанию / общий по умолчанию / общий / html по умолчанию / общий / CSS красный / код красный / обычный красный / общий / HTML красный / общий / css красный / код зеленый / общий зеленый / общий / HTML
Поэтому, если код или какой-либо другой компонент не существует, он вернется к значениям по умолчанию.
Но на самом деле я бы разделил веб-сайт на svn, поэтому общий код, если он будет развиваться, я могу объединить его и т. д. См. Subversion по адресу: http://subversion.tigris.org/
Почему вы проголосовали против моего вопроса? Здесь миллион и один опрос о том, какой корм для собак вы кормите своей собакой. Это актуальный вопрос дизайна. Почему бы просто не проигнорировать это, если оно к вам не относится?