Подключение к БД по install.php

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Подключение к БД по install.php

Сообщение Luchanka »

Здравствуйте, Друзья! Прошу не судить меня строго за мои может быть не корректные вопросы. Я сегодня первый раз на форуме, меня зовут Ирина. До этого использовала CMS Drupal, но всё же хотелось попытаться изучить framework. Перечитала не мало статей и отзывов, остановила свой выбор на Yii, думаю не зря. Изучаю по видео и текстовым урокам, найденным в инете, немного сложновато по началу, но хочется надеяться, что освою. Длинное у меня вступление получилось, ближе к делу.

Не могу найти нигде информации, о том, как прописать подключение к БД по файлу install.php. Такая функция реализована на сайте http://eximuscommerce.com/, они продают готовый интернет магазин на базе Yii. Вобщем у них уже в архиве предустановленные файлы + файл install.php (демка бесплатная полнофункциональная).
При инсталляции нужно просто в командной строке вписать http://название сайта/install.php, и начинается установка, в БД не нужно прописывать поля.
Вложения
2.jpg
2.jpg (39.06 КБ) 4650 просмотров
1.jpg
1.jpg (48.35 КБ) 4650 просмотров
Аватара пользователя
iAchilles
Сообщения: 41
Зарегистрирован: 2014.09.11, 19:44

Re: Подключение к БД по install.php

Сообщение iAchilles »

Привет, Ирина!
Посмотрите, что внутри этого install.php.
Настройки подключения к СУБД в Yii задаются либо через файл конфигурации приложения (protected/config/main.php), пример:

Код: Выделить всё

return array(
    'components' => array(
        'db' => array(
            'connectionString' => 'mysql:host=localhost;dbname=test',
            'emulatePrepare'   => true,
            'username'         => 'root',
            'password'         => '',
            'charset'          => 'utf8',
            'tablePrefix'      => '',
            'schemaCachingDuration'      => 3600,
        ),
в этом случае создается компонент приложения, который позволяет взаимодействовать с базой данных и доступ к этому компоненту в коде приложения можно получить так: Yii::app()->db.
Либо можно создать "на лету" подключение к БД, для этого нужно создать экземпляр класса CDbConnection, в конструктор передать dsn, имя пользователя БД, пароль пользователя.
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

Здравствуйте, iAchilles! Спасибо за ответ!
В db (main.php) у них прописано так:

Код: Выделить всё

'db'=>array(
            'connectionString'      => 'mysql:host=127.0.0.1;dbname=',
            'username'=>'',
            'password'=>'',
            'enableProfiling'       => YII_DEBUG, // Disable in production
            'enableParamLogging'    => YII_DEBUG, // Disable in production
            'emulatePrepare'        => true,
            'schemaCachingDuration' => YII_DEBUG ? 0 : 3600,
            'charset'               => 'utf8',
Затем, после того, как заполняются поля для регистрации в БД и заканчивается вся регистрация в db меняется на:

Код: Выделить всё

'db'=>array(
            'connectionString'=>'mysql:host=localhost;dbname=exim',
            'username'=>'Имя пользователя указанное при регистрации',
            'password'=>'Пароль указанный при регистрации',
            'enableProfiling'       => YII_DEBUG, // Disable in production
            'enableParamLogging'    => YII_DEBUG, // Disable in production
            'emulatePrepare'        => true,
            'schemaCachingDuration' => YII_DEBUG ? 0 : 3600,
            'charset'               => 'utf8',
Файл install.php

Код: Выделить всё

<?php

$config=array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'protected',
    'sourceLanguage'=>'ru',
    'modules'=>array(
        'install',
    ),
    'import'=>array(
        'application.models.*',
        'application.components.*',
    ),
    'components'=>array(
        'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>true,
            'rules'=>array(
                '/'=>'install/default',
        )),
        'cache'=>array(
            'class'=>'CDummyCache',
        ),
        'languageManager'=>array(
            'class'=>'SLanguageManager'
        ),
    ),
    'params'=>array(),
);

error_reporting(0);
define('VERSION', '1.5');

// change the following paths if necessary
$yii=dirname(__FILE__).'/framework/yii.php';
//defined('YII_DEBUG') or define('YII_DEBUG', true);
//defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3);

require_once $yii;
Yii::createWebApplication($config)->run();
 
Полный файл main.php до инсталяции:

Код: Выделить всё

<?php

// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder')
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'language'=>'ru',
    //'sourceLanguage'=>'ru',
    // pre-loading components
    'preload'=>array('log'),

    // autoloading model and component classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
        'application.components.payment.*',
        'application.components.validators.*',
        'application.modules.core.models.*',
        'application.modules.users.models.User',
        // Rights module
        'application.modules.rights.*',
        'application.modules.rights.components.*',
    ),

    'modules'=>array(
        
        'action_logger',
        'admin'=>array(),
        'rights'=>array(
            'layout'=>'application.modules.admin.views.layouts.main',
            'cssFile'=>false,
            'debug'=>YII_DEBUG,
        ),
        'core',
    ),

    // application components
    'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
            'class'=>'BaseUser',
            'loginUrl'=>'/users/login'
        ),
        'urlManager'=>array(
            'urlFormat'=>'path',
            'class'=>'SUrlManager',
            'showScriptName'=>false,
            'useStrictParsing'=>true,
            'rules'=>array(
                '/'=>'store/index/index',
                'admin/auth'=>'admin/auth',
                'admin/auth/logout'=>'admin/auth/logout',
                'admin/<module:\w+>'=>'<module>/admin/default',
                'admin/<module:\w+>/<controller:\w+>'=>'<module>/admin/<controller>',
                'admin/<module:\w+>/<controller:\w+>/<action:\w+>'=>'<module>/admin/<controller>/<action>',
                'admin/<module:\w+>/<controller:\w+>/<action:\w+>/*'=>'<module>/admin/<controller>/<action>',

                'filemanager/connector' => 'admin/fileManager/index',

                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

                'admin'=>'admin/default/index',
                'rights'=>'rights/assignment/view',
                'rights/<controller:\w+>/<id:\d+>'=>'rights/<controller>/view',
                'rights/<controller:\w+>/<action:\w+>/<id:\d+>'=>'rights/<controller>/<action>',
                'rights/<controller:\w+>/<action:\w+>'=>'rights/<controller>/<action>',
                'gii'=>'gii',
                'gii/<controller:\w+>'=>'gii/<controller>',
                'gii/<controller:\w+>/<action:\w+>'=>'gii/<controller>/<action>',
            ),
        ),
        'db'=>array(
            'connectionString'      => 'mysql:host=127.0.0.1;dbname=',
            'username'=>'',
            'password'=>'',
            'enableProfiling'       => YII_DEBUG, // Disable in production
            'enableParamLogging'    => YII_DEBUG, // Disable in production
            'emulatePrepare'        => true,
            'schemaCachingDuration' => YII_DEBUG ? 0 : 3600,
            'charset'               => 'utf8',
        ),
        'request'=>array(
            'class'=>'SHttpRequest',
            'enableCsrfValidation'=>true,
            'enableCookieValidation'=>true,
            'noCsrfValidationRoutes'=>array(
                '/processPayment',
                '/accounting1c/default/',
                '/filemanager/connector',
            )
        ),
        'errorHandler'=>array(
            // use 'site/error' action to display errors
            'errorAction'=>'site/error',
        ),
        'authManager'=>array(
            'class'=>'RDbAuthManager',
            'connectionID'=>'db',
        ),
        'cache'=>array(
            'class'=>'CFileCache',
        ),
        'languageManager'=>array(
            'class'=>'SLanguageManager'
        ),
        'fixture'=>array(
            'class'=>'system.test.CDbFixtureManager',
        ),
        'cart'=>array(
            'class'=>'ext.cart.SCart',
        ),
        'currency'=>array(
            'class'=>'store.components.SCurrencyManager'
        ),
        'mail'=>array(
            'class'=>'ext.mailer.EMailer',
            'CharSet'=>'UTF-8',
        ),
        'settings'=>array(
            'class'=>'application.components.SSystemSettings'
        ),
        'log'=>YII_DEBUG===true ? require('logging.php') : null,
    ),
    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'=>array(
        // this is used in contact page
        'adminEmail'=>'[email protected]',
        'adminPageSize'=>30,
    ),
);
 
Еще мне не понятно с модулями в файле main.php так:

Код: Выделить всё

 'modules'=>array(
        
        'action_logger',
        'admin'=>array(),
        'rights'=>array(
            'layout'=>'application.modules.admin.views.layouts.main',
            'cssFile'=>false,
            'debug'=>YII_DEBUG,
        ),
        'core',
    ),
На самом деле в папке modules так:
Вложения
modules.jpg
modules.jpg (25.27 КБ) 4628 просмотров
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Подключение к БД по install.php

Сообщение Neuromance »

Стартовый пост чертовски напоминает рекламу eximuscommerce :D

Luchanka, ты же в последнем комментарии сама привела пример конфига для подключения к БД)
А по поводу модулей - в папке modules лежат модули проекта. Они к проекту не подключены, если просто там лежат. Подключаются к проекту они как раз в main.php
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

Я ни в коем разе не рекламирую eximuscommerce, я просто привела один из примеров функционала, который мне нужен.
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

Ребята, так ни у кого и нет рекомендаций к моей проблеме?
Аватара пользователя
Beaten_Sect0r
Сообщения: 234
Зарегистрирован: 2011.06.15, 14:58
Откуда: Ярославль
Контактная информация:

Re: Подключение к БД по install.php

Сообщение Beaten_Sect0r »

Luchanka писал(а):Ребята, так ни у кого и нет рекомендаций к моей проблеме?
даже не понял в чем вопрос.
указывайте при инсталяции ваши данные к базе данных.
_https://coru.ws
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

Дак вопрос в том и состоит. Как прописать инсталляцию к БД.
Аватара пользователя
Beaten_Sect0r
Сообщения: 234
Зарегистрирован: 2011.06.15, 14:58
Откуда: Ярославль
Контактная информация:

Re: Подключение к БД по install.php

Сообщение Beaten_Sect0r »

где устанавливаете?
_https://coru.ws
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

На локалхосте
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Подключение к БД по install.php

Сообщение Neuromance »

У вас вопрос по конкретно установке eximuscommerce.com или в принципе вы не знаете, как подключение к БД задавать?
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

Neuromance писал(а):У вас вопрос по конкретно установке eximuscommerce.com или в принципе вы не знаете, как подключение к БД задавать?
eximuscommerce.com я привела в качестве примера по формированию полей БД. У меня нет вопросов по eximuscommerce.com.

Вопрос в другом.
В

Код: Выделить всё

'db'=>array(
нужно прописывать подключение вручную (база данных, имя пользователя, пароль и тд) с этим всё понятно. Но я не могу понять как сделать, чтобы при первом открытии были поля для подключения к базе данных, типа как в обычной CMS (ложим в корневую папку сайта, затем вводим URL и первым делом появляются поля для соединения с базой данных). Далее тоже самое и с таблицами типа page, нужно заходить в БД, там создавать таблицу, а затем уже работать с этой таблицей...
Вложения
Поля для подключения к БД
Поля для подключения к БД
3.jpg (62.51 КБ) 4537 просмотров
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Подключение к БД по install.php

Сообщение Neuromance »

Перечитал еще раз тему. Теперь понял, что требуется :)
Очень похоже на то, что ExCommerce парсят файл и подменяют его данные теми, которые пришли из формы.
Аватара пользователя
iAchilles
Сообщения: 41
Зарегистрирован: 2014.09.11, 19:44

Re: Подключение к БД по install.php

Сообщение iAchilles »

Luchanka писал(а):Но я не могу понять как сделать, чтобы при первом открытии были поля для подключения к базе данных, типа как в обычной CMS (ложим в корневую папку сайта, затем вводим URL и первым делом появляются поля для соединения с базой данных).
Вы собираетесь проектировать CMS? Если нет, то первоначальную настройку базы, добавление таблиц, заполнение начальными данными, в Yii удобно выполнять с помощью миграций.
Если нужна именно эта форма, то делайте следующее:
1. Модель формы (CFormModel) для ввода значений, которые необходимы для создания CDbConnection.
2. В /protected/config/main.php по умолчанию не указывайте настроек для компонента приложения, позволяющего работать с СУБД ("db").
3. В контроллере проверяйте is_null(Yii::app()->getComponent('db')) - значит БД не настроена, рендерьте вью с формой.
4. После получения значений из формы сделайте, что-то вроде этого (не забудьте про правила валидации для полей модели!):

файл вашего контроллера, action для работы с настройкой БД.

Код: Выделить всё

...

if (!is_null(Yii::app()->getComponent('db'))
{
    //База настроена, редирект или вью, который нужен в случае, если настройка бд уже произведена.
}

$formModel = new YourFormModel();
$formModelName = get_class($formModel);
$request = Yii::app()->request;

if (is_null($request->getParam($formModelName)))
{
     //Рендерим представление с формой. $this->render();
     Yii::app()->end();
}

//Данные получены
$formModel->attributes = $request->getParam($formModel);

if ($formModel->validate())
{
   $dbArray = array('components' => array('db' => array(
                                                 'connectionString' => 'mysql:host=' . $formModel->host . ';dbname=' . $formModel->dbName, 
                                                 'username' => $formModel->username, 
                                                 'password' => $formModel->password)));
   $config = require(Yii::getPathOfAlias('application.config') . '/main.php');
   $newConfig = CMap::mergeArray($config, $dbArray);
  //Сохраняете в файл.
   file_put_contents(Yii::getPathOfAlias('application.config') . '/main.php', '<?php return ' . var_export($newConfig, true) . ';');
}
Luchanka
Сообщения: 16
Зарегистрирован: 2014.09.15, 21:07

Re: Подключение к БД по install.php

Сообщение Luchanka »

iAchilles писал(а):
Luchanka писал(а):Но я не могу понять как сделать, чтобы при первом открытии были поля для подключения к базе данных, типа как в обычной CMS (ложим в корневую папку сайта, затем вводим URL и первым делом появляются поля для соединения с базой данных).
Вы собираетесь проектировать CMS? Если нет, то первоначальную настройку базы, добавление таблиц, заполнение начальными данными, в Yii удобно выполнять с помощью миграций.
Если нужна именно эта форма, то делайте следующее:
1. Модель формы (CFormModel) для ввода значений, которые необходимы для создания CDbConnection.
2. В /protected/config/main.php по умолчанию не указывайте настроек для компонента приложения, позволяющего работать с СУБД ("db").
3. В контроллере проверяйте is_null(Yii::app()->getComponent('db')) - значит БД не настроена, рендерьте вью с формой.
4. После получения значений из формы сделайте, что-то вроде этого (не забудьте про правила валидации для полей модели!):

файл вашего контроллера, action для работы с настройкой БД.

Код: Выделить всё

...

if (!is_null(Yii::app()->getComponent('db'))
{
    //База настроена, редирект или вью, который нужен в случае, если настройка бд уже произведена.
}

$formModel = new YourFormModel();
$formModelName = get_class($formModel);
$request = Yii::app()->request;

if (is_null($request->getParam($formModelName)))
{
     //Рендерим представление с формой. $this->render();
     Yii::app()->end();
}

//Данные получены
$formModel->attributes = $request->getParam($formModel);

if ($formModel->validate())
{
   $dbArray = array('components' => array('db' => array(
                                                 'connectionString' => 'mysql:host=' . $formModel->host . ';dbname=' . $formModel->dbName, 
                                                 'username' => $formModel->username, 
                                                 'password' => $formModel->password)));
   $config = require(Yii::getPathOfAlias('application.config') . '/main.php');
   $newConfig = CMap::mergeArray($config, $dbArray);
  //Сохраняете в файл.
   file_put_contents(Yii::getPathOfAlias('application.config') . '/main.php', '<?php return ' . var_export($newConfig, true) . ';');
} 
Спасибо Вам за ответ! Пока не совсем понятно... Да, я хочу создать небольшую CMS, чтобы у меня была готовая основная заготовка.
Ответить