Yii: создание демонстрационного сайта без репликации базы кода

Мне нужно настроить демонстрационный сайт, чтобы пользователи могли попробовать веб-приложение перед регистрацией. Демонстрация будет основана на производственном коде, однако потребует незначительных изменений кода: подключение к демонстрационной базе данных, автоматическое создание / вход в новую гостевую учетную запись для каждого пользователя и т. Д.

Очевидным решением является репликация моей базы кода в качестве второго демонстрационного веб-сайта и редактирование по мере необходимости. Синхронизировать демонстрационный код с производственным кодом достаточно просто, добавив ветку в subversion. Однако я менее чем в восторге от перспективы делать два обновления на моем сервере (производственный, а затем демонстрационный) каждый раз, когда я перехожу код из разработки в производство.

Сначала я думал, что смогу воспроизвести веб-сайт с помощью модуля. Однако неясно, возможно ли это.

Есть ли в Yii механизм для запуска измененной версии веб-сайта (файл конфигурации и выбранные контроллеры)?


person Jason George    schedule 30.11.2012    source источник
comment
Вы имеете в виду несколько бэкендов с URL-адресами, такими как site.com/ и site.com/admin?   -  person Stefano Mtangoo    schedule 30.11.2012
comment
Что касается переключения между демонстрационной / реальной базой данных: yiiframework.com/forum/index.php/topic/ Разве этого нельзя добиться с помощью фильтров RBAC и / или контроллера и параметров уровня приложения?   -  person JPR    schedule 30.11.2012
comment
Лучший способ добиться этого - работать с двумя разными конфигурационными файлами.   -  person ThomasVdBerge    schedule 30.11.2012
comment
@Stefano Правильно. Мне нужно, чтобы демонстрационный сайт был доступен с demo.site.com (или, что эквивалентно site.com/demo).   -  person Jason George    schedule 30.11.2012
comment
@JPR К сожалению, мои сценарии использования не подходят для этого типа настройки. Пользователи являются кураторами, которые создают общедоступный контент. Чтобы полностью продемонстрировать систему, тестовые пользователи должны иметь возможность создавать контент (входить в систему) и просматривать этот контент в качестве гостя (выход из системы). Я действительно не вижу простого решения, которое скрыло бы демонстрационный контент от широкой публики, но сделало бы его доступным для просмотра демо-пользователю. Я бы предпочел разделить весь демонстрационный контент на отдельный URL-адрес.   -  person Jason George    schedule 30.11.2012
comment
@ThomasVdBerge Согласен. Детали реализации - вот где я немного нечеткий. Решения, предложенные Иваном Буттинони и Эрни, кажутся многообещающими.   -  person Jason George    schedule 30.11.2012


Ответы (3)


Для этого настроено демонстрационное приложение testdrive - после того, как вы установить, обратите внимание на отдельные index-test.php и protected/config/test.php.

В отличие от предложения @ IvanButtinoni, вам потребуется доступ к index-test.php вместо index.php, поэтому вам может потребоваться изменить ваш .htaccess, если вы используете чистые URL-адреса, чтобы разрешить доступ к index-test.php.

Когда я это делаю, я обычно пишу собственный init в базовом controller.php:

    public function init() {
            // use test layout if using test config
            if (isset(Yii::app()->params['test'])) {
                    $this->layout='//layouts/test';
            }
            parent::init();
    }

Очевидно, у меня есть тестовый параметр в моем test.php. . .

Единственное различие между моими двумя макетами заключается в том, что в одном из них устанавливается ярко-желтый цвет фона, чтобы было ясно, что вы находитесь на тестовой площадке.

person ernie    schedule 30.11.2012
comment
Это похоже на то, что я имел в виду. Судя по фрагменту кода, в файле конфигурации есть флаг для переключения между тестовым и рабочим сайтом. Мне нужно иметь возможность запускать оба сайта одновременно с разрешением сайта, определяемым базовым URL-адресом (demo.site.com vs site.com). - person Jason George; 30.11.2012
comment
@JasonGeorge У меня есть тестовый параметр в моей конфигурации test.php, который получается только при доступе к index-test.php. Похоже, вы могли бы сделать то же самое с помощью перезаписи URL. Основное различие между этим и Иваном заключается в том, что я просто документирую, как это делает пример приложения (CMap :: arrayMerge находится в тестовой конфигурации, а не в том, как у Ивана он есть в индексе) - person ernie; 30.11.2012
comment
+1 Все вокруг. Это работает исключительно хорошо. Это позволяет мне настроить пользовательскую конфигурацию для демо-пользователей на основе URL-адреса. Спасибо за разъяснения. - person Jason George; 01.12.2012

Никогда не делай раньше, так что просто идея

решение с несколькими файлами в другом каталоге

создайте отдельный демо-каталог и сопоставьте его с вашим демо-URL

В этот каталог поместите этот index.php (может быть и ваш .htaccess)

<?php
$yii=_PRODUCTION_PATH_.'/framework/yii.php';
$config_prod=_PRODUCTION_PATH_.'/protected/config/main.php';
$config_demo=dirname(__FILE__).'/demo_main.php';

require_once($yii);

$config = CMap::mergeArray($config_prod,$config_demo);

Yii::createWebApplication($config)->run();

demo_main.php переопределяет классы (user, db), чтобы улучшить демонстрационный опыт:

<?php
return array(
        'basePath'=>_PRODUCTION_DIR_.DIRECTORY_SEPARATOR.'..',
        'components'=>array(
             'user' => array(
                  // here you override the user class with a DEMO only user
                  'class'=>'DemoUser',
             )
        ),

решение со всеми файлами сайта производства в другом каталоге

Здесь следует index.php в корневом каталоге

<?php

$yii='../framework/yii.php';

$configMain = include dirname(__FILE__).'/protected/config/main.php';
$configProd = include dirname(__FILE__).'/protected/config/production.php';
$configDemo = include dirname(__FILE__) . '/protected/config/demo.php';

require_once($yii);
// for the demo version
// instead of the comment can be an *if* or any solution to manage 2 configs
//$config = CMap::mergeArray($configMain,$configProd);
$config = CMap::mergeArray($configMain,$configDemo);

Yii::createWebApplication($config)->run();

demo.php является аналогом "demo_main.php" переопределения классов и конфигов для демонстрационной версии сайта.

person Ivan Buttinoni    schedule 30.11.2012
comment
Это выглядит особенно многообещающим. - person Jason George; 30.11.2012
comment
+1 Мне нравится конфигурация здесь, но у меня были проблемы с сообщением «Невозможно разрешить сайт запроса». ошибка и CMap был недоступен до require_once ($ yii). Комбинируя ваше предложение о настраиваемом классе DemoUser с конфигурацией Эрни, вы получите полное решение. Спасибо! - person Jason George; 01.12.2012
comment
@JasonGeorge, я немного опоздал, но исправил проблему с CMap. По поводу вашего вопроса: похоже, вам нужны 2 URL-адреса одного и того же сайта без дублирования ядра и позволяющие демо-сайту вносить изменения. А как насчет добавления / изменения / удаления документов / изображений сайта? Поэтому я думаю в отдельный каталог, чтобы избежать повреждения файлов - person Ivan Buttinoni; 01.12.2012

Если я хорошо понял (согласно комментариям к исходному сообщению), то есть несколько способов. Вот ссылка, которая, я думаю, может очень помочь. Он помог мне настроить и, возможно, поможет вам! В Yii 2 он будет изначально поддерживаться

http://www.yiiframework.com/wiki/33/

person Stefano Mtangoo    schedule 30.11.2012
comment
+1 Спасибо Стефано, это тоже полезно. С нетерпением жду неотъемлемой поддержки в Yii 2. - person Jason George; 01.12.2012