Обновлено: 27 декабря 2014, 21:35
 Marabar

Дата регистрации и активности в свою таблицу

Многие, наверное, задавались вопросом — почему в MODX revolution не предусмотрены колонки с датой регистрации и датой последней активности пользователя. Хотя..., в таблице modx_user_attributes существуют две колонки, поля которых хранят дату последней авторизации — lastlogin, и дату текущей авторизации — thislogin. И не одна из них не хранит дату последней активности юзера. Т.е., если пользователь обновил страницу, то значения в них остаются прежними — не меняются, и как я понимаю — они привязаны к сессии. Здесь же, мы попробуем создать свою, пользовательскую таблицу в базе данных, куда будем помещать дату регистрации и активности пользователя.

Собственно этот эксперимент появился благодаря топику Василия Наумкина: Расширенные поля пользователей, о полях я знал и пользуюсь ими, но вот идея создания собственной таблицы — заинтересовала.

Создание таблицы и необходимые файлы через MIGX.

Для создание таблицы и генерации необходимых каталогов и файлов, воспользуемся компонентом MIGX. Можно установить через менеджер пакетов. После установки и обновления страницы, MIGX будет доступен в меню «Компоненты» или «Приложения» — зависит от версии MODX revolution.
Заполняем поля:
Marabar_screenshot_00007.png

  • Package Name: — userscontrol
  • table-prefix: — Если ваши таблицы используют префикс по умолчанию modx_, тогда Default Prefix. Если префикс другой, то выбирайте Custom Prefix и в следующем поле укажите его.
  • custom-prefix: —
В табе Create Package жмём Create Package. После этого должен создаться наш пакет в /core/components/userscontrol/, с вложенными каталогами /model/schema/ в которых пустой файл usersсontrol.mysql.schema.xml. Сейчас мы его заполним.

В табе Xml Schema в поле Schema помещаем следующее:
<?xml version="1.0" encoding="UTF-8"?>
<model package="userscontrol" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
    <object class="usersControl" table="users_control" extends="xPDOSimpleObject">
        <field key="internalKey" dbtype="int" precision="10" phptype="integer" null="false" index="unique" />
        <field key="regactive" dbtype="int" precision="11" phptype="integer" null="false" default="0" />
        <field key="lastactive" dbtype="int" precision="11" phptype="integer" null="false" default="0" />
        <index alias="internalKey" name="internalKey" primary="false" unique="true" type="BTREE">
            <column key="internalKey" length="" collation="A" null="false" />
        </index>

        <aggregate alias="User" class="modUser" local="internalKey" foreign="id" cardinality="one" owner="foreign" />
    </object>
</model>
И жмём Save Schema, соглашаемся в появившемся окне — наша схема сохранена в выше упомянутый файл. За счёт этой схемы будет создана таблица в базе данных MySQL и необходимые файлы для связки с ней.

Таб parse Schema — создаём необходимые xpdo-классы и map-файлы, нажав parse Schema. В их создании можно убедиться, перейдя в каталог /core/components/userscontrol/model/. Настало время создания таблицы.

Таб create Tables — жмём на create Tables и готово! Таблица создана.

Плагин сохранения даты регистрации и даты активности.

Для контроля за датой регистрации и датой последней активности зарегистрированного пользователя, напишем плагин userscontrol на события OnUserSave и OnLoadWebDocument.
<?php
switch ($modx->event->name) {
    case 'OnUserSave':
 
    	if ($user && $mode == 'new') {
    	    $profile = $user->getOne('Profile');
    		    
    	    $id = $profile->get('id');
    	    
    	    $myRow = $modx->newObject('usersControl');
    	    
    	    $data = array(
                'internalKey' => $id,
                'regactive' => time(),
            //    'lastactive' => time(),
            );
    	    
    	    $myRow->fromArray($data);
    	    $myRow->save();
    	}
    	
    break;
	
    case 'OnLoadWebDocument':
	// Сохраняем дату открытия любой страницы сайта, если пользователь авторизован
	if ($modx->user->isAuthenticated($modx->context->key)) {
            $id = $modx->user->id;
            
            // Ищем его в базе
            $myRow = $modx->getObject('usersControl', array('internalKey' => $id));
            
            // Если есть меняем текущую активность
            if ($myRow) {
                $myRow->set('lastactive', time());
                $myRow->save();
            }else{
                // Если нет, создаём новую запись с этим юзером и сохраняем
                $myRow = $modx->newObject('usersControl');
        
                $data = array(
                    'internalKey' => $id,
                    'lastactive' => time(),
                );
        
                $myRow->fromArray($data);
                $myRow->save();
            }
        
        }
        
    break;

}
В системной настройке extension_packages регистрируем наш пакет. Если этот ключ уже создан, и он присутствует в настройках системы — просто добавьте этот код через запятую, но перед закрывающейся квадратной скобкой.
,{"userscontrol":{"path":"[[++core_path]]components/userscontrol/model/"}}
Если же этой настройки нет, необходимо создать её, как на картинке, и поместить в поле «значение» следующее:
[{"userscontrol":{"path":"[[++core_path]]components/userscontrol/model/"}} ]
Marabar_screenshot_00009.png

Вот зараза)), закрывающаяся квадратная скобка упорно перескакивает при сохранении и встаёт перед фигурными. Добавил пробел — будьте внимательны при копировании.

Этот плагин будет срабатывать при сохранении нового пользователя (Системное событие OnUserSave должно быть отмечено), а в поля: internalKey и regactive — запишутся: ID и текущая дата в формате UNIX, соответственно. Сейчас можно попробовать пробную регистрацию, если всё сделано правильно — должно работать. Если кому-то нужно и дату активации сохранять при регистрации, раскомментируйте в массиве: 'lastactive' => time(),.

Также, он будет контролировать активность авторизованных пользователей (Системное событие OnLoadWebDocument должно быть отмечено), и записывать новое значение в соответствующее пользователю поле — lastactive, нашей таблицы.

Отображение данных из пользовательской таблицы

На самом деле, здесь вариантов масса, и это не должно вызвать трудности. Отобразить значения полей таблицы можно с помощью любого сниппета, который умеет работать с пользовательской таблицей, например — Rowboat. Так же и в установленном MIGX есть сниппет migxLoopCollection. Приведу несколько примеров:
<ul>
    [[migxLoopCollection?
        &packageName=`userscontrol`
        &classname=`usersControl`
        &tpl=`myChunk`
    ]]
</ul>
<ul>
    [[Rowboat?
        &table=`modx_users_control`
        &tpl=`myChunk`
    ]]
</ul>
Чанк myChunk:
<li>[[+internalKey]] - [[+regactive:date=`%d-%m-%Y`]] - [[+lastactive:date=`%d-%m-%Y - %H:%M`]]</li>
   Marabar Инструкции 1    5 0

Комментарии ()




    Вы должны авторизоваться , чтобы оставлять комментарии.

    Marabar 21 сентября 2018, 00:32
    Login в MODX revolution 25
    Marabar 17 мая 2018, 12:22
    Выводим облако тегов в MODX revo 17
    medortex 14 июля 2017, 16:26
    Меню Аккордеон в MODX revo 54
    Madao 16 мая 2017, 18:28
    msMiniCartDynamic 3
    Семён 05 мая 2017, 23:30
    Создание ресурсов из фронтенда 41
    Филитович Владимир 26 февраля 2017, 22:25
    Apache 2.2.22, установка и настройка 41
    valery 30 ноября 2016, 15:51
    phpMyAdmin 3.5.1, установка и настройка 3