Рекомендации по управлению несколькими специализированными версиями одного приложения

У меня есть веб-приложение с множеством лиц, и до сих пор я реализовал его с помощью создания тем. Тема - это набор 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.

Почему вы проголосовали против моего вопроса? Здесь миллион и один опрос о том, какой корм для собак вы кормите своей собакой. Это актуальный вопрос дизайна. Почему бы просто не проигнорировать это, если оно к вам не относится?

Mat 29.10.2008 05:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
241
6

Ответы 6

У меня нет конкретной рекомендации. Тем не менее, я настоятельно рекомендую НЕТ использовать ярлык ... Используйте решение, которое вам будет удобно, чтобы добавить третью тему или что-то изменить в следующем году. Дублирование - враг ремонтопригодности.

Спасибо за комментарии Хапкидо. Я согласен с вашим утверждением о дублировании.

Nick Berardi 29.10.2008 05:52

Я бы исследовал использование шаблона стратегии как средства для реализации различных функций в разных версиях сайта. Имейте 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();

Спасибо за развернутый ответ! Итак, вы предлагаете должна быть одна кодовая база. Код должен быть специализированным не на основе предполагаемого сайта, а на его функциональности. Затем в файле конфигурации (для каждого сайта) будет указано, какие функции предлагаются пользователям этим сайтом. Это правильно?

Eggs McLaren 29.10.2008 07:25

Вы используете мастер-страницы? Если вам нужен другой макет и элементы пользовательского интерфейса, вы можете просто иметь другой набор главных страниц для каждого из ваших экземпляров. Если вам нужно настраиваемое поведение, вы можете изучить внедрение зависимостей. Spring.NET и т. д.

Вы изменили свой вопрос, чтобы указать, что ваша среда не является ASP.NET. Я отвечал, исходя из предположения, что вы работаете в ASP.NET. Извиняюсь.

sliderhouserules 31.10.2008 19:52

Вам нужны шаблоны.

После этого вы можете отделить свой код от презентации.

Я очень рекомендую умные шаблоны. Также PEAR template_it.

http://www.smarty.net/

Это также сделает ваш код более удобным в сопровождении. Цель состоит в том, чтобы не было 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/

Другие вопросы по теме