Сразу оговорюсь, что Yii знаю совсем недавно, возможно это все в нем есть "из коробки", но я не видел.
Итак...
Этап первый. Работаем с формой регистрации:
1. открываем \protected\views\site\register.php, здесь находится форма регистрации. Добавляем следующий код в любое удобное место, например, после телефона:
- Код: Выделить всё
<div class="row">
<?php echo $form->labelEx($model,'terms'); ?>
<?php echo $form->checkBox($model,'terms'); ?>
<?php echo $form->error($model,'terms'); ?>
</div>
Не забудем про административную часть (файл \protected\modules\users\views\backend\_form.php):
- Код: Выделить всё
<div class="rowold">
<?php echo $form->labelEx($model,'terms'); ?>
<?php echo $form->checkBox($model,'terms'); ?>
<?php echo $form->error($model,'terms'); ?>
</div>
2. открываем файлик \protected\models\User.php
в начало файла после
- Код: Выделить всё
public $recoverPasswordLink;
добавляем
- Код: Выделить всё
public $terms;
ищем в коде функцию attributeLabels() и добавляем туда строчку, которая отвечает за надпись в форме рядом с галочкой:
- Код: Выделить всё
'terms' => Yii::t('users', 'I accept the <a href="{href}" class="fancy">terms and conditions</a>', array('{href}' => Yii::app()->createUrl('/terms/main/index'))),
Теперь у нас есть форма с галочкой, надписью и ссылкой на соглашение. Благодаря установленному классу "fancy", ссылка откроется во всплывающем окне :) Поехали дальше...
Для того, чтобы движок смог правильно отреагировать на согласие или несогласие пользователя, ищем код в секции rules:
- Код: Выделить всё
array('username, email, verifyCode, phone', 'required', 'on' => 'register'),
добавляем туда правила обработки данных от пользователя
- Код: Выделить всё
array('terms, username, email, verifyCode, phone', 'required', 'on' => 'register'),
array('terms', 'boolean', 'on' => 'register'),
array('terms', 'compare', 'compareValue' => true, 'message' => Yii::t('users', 'You must agree to the terms and conditions') ),
Открываем \protected\controllers\SiteController.php и в функцию createUser после
- Код: Выделить всё
if ($isActive)
$model->active = 1;
if ($activateKey)
$model->activatekey = $activateKey;
дописываем:
- Код: Выделить всё
$model->terms = true;
При создании пользователя, принудительно сохраняем его согласие в базу (валидация происходит ранее), иначе во время дальнейшего редактирования данных будут возникать ошибки.
Все, на данном этапе мы имеем уже готовую форму, и правила проверки введенных данных.
В принципе, можно этим и ограничиться, если есть страница с соглашением по какому-либо адресу, которую можно посмотреть, перейдя по ссылке...
Достаточно просто поменять /terms/main/index в вышеприведенном коде на нужный нам адрес.
Не забудьте потом зайти в управление переводами и перевести значения новых фраз на русский. Они появятся там автоматически, при первом выводе на страницу.
Ну а для полного счастья, можно допилить админку :)
Этап второй. Работаем со страницей пользовательского соглашения и админкой.
Для редактирования соглашения мы будем использовать клонированный и почти генетически модифицированный модуль Service "Обслуживание сайта" :)
Приводить все изменения не буду, т.к. долго. Просто подключим его (см. аттач). Модуль нужно положить в папку \protected\modules
1. открываем \protected\views\layouts\main-admin.php, ищем в двух местах такой код:
- Код: Выделить всё
array('label' => tc('Site service '), 'icon' => 'icon-wrench', 'url' => $baseUrl . '/service/backend/main/admin', 'active' => isActive('service'), 'visible' => issetModule('service')),
и добавляем после него для каждого случая строчку:
- Код: Выделить всё
array('label' => tc('Site service '), 'icon' => 'icon-wrench', 'url' => $baseUrl . '/service/backend/main/admin', 'active' => isActive('service'), 'visible' => issetModule('service')),
array('label' => tc('Terms and conditions'), 'icon' => 'icon-wrench', 'url' => $baseUrl . '/terms/backend/main/admin', 'active' => isActive('terms'), 'visible' => issetModule('terms')),
Теперь мы имеем свой пункт меню в админке.
2. открываем \protected\config\main-free.php, подключаем новый модуль.
В секции 'import' добавляем строчку:
- Код: Выделить всё
'application.modules.terms.models.Terms',
В секции 'modules' добавляем:
- Код: Выделить всё
'terms',
3. для правильного функционирования модуля, необходимо создать таблицу в БД.
Вот кусок запроса для MySQL:
- Код: Выделить всё
CREATE TABLE IF NOT EXISTS `ore_terms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`page` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- Dumping data for table `ore_terms`
--
INSERT INTO `ore_terms` (`id`, `page`) VALUES
(1, '<p>\r\n 2013-04-02 18:43:15</p>\r\n');
Вместо текста соглашения - просто вчерашняя дата и время...
Не забываем поменять префикс ore_, если это требуется.
И обязательно почистите кэш \protected\runtime\cache, а то может не заработать!!
Рекомендуется к прочтению! class="fancy" и колесо мышки [решено]
Удачи!