Михаил

Михаил

С нами с 03 апреля 2015; Место в рейтинге пользователей: #18454
Сегодня в 03:33
0
Вот так отображаются поля довольно красиво! Нужно создать поля: allowed_resources, date_start, date_end в базе данных в таблице modx_user_attributes. Это плагин:
<?php
/**
 * Plugin for adding custom fields to user profile
 * Events: OnMODXInit, OnUserFormPrerender, OnUserFormSave
 */

switch ($modx->event->name) {
    case "OnMODXInit":
        // Добавляем поля в карту объектов MODX
        $map = array(
            'modUserProfile' => array(
                'fields' => array(
                    'allowed_resources' => null,
                    'date_start' => null,
                    'date_end' => null,
                ),
                'fieldMeta' => array(
                    'allowed_resources' => array(
                        'dbtype' => 'varchar',
                        'precision' => '191',
                        'phptype' => 'string',
                        'null' => true,
                        'default' => null,
                    ),
                    'date_start' => array(
                        'dbtype' => 'int',
                        'precision' => '20',
                        'phptype' => 'integer',
                        'null' => true,
                        'default' => null,
                    ),
                    'date_end' => array(
                        'dbtype' => 'int',
                        'precision' => '20',
                        'phptype' => 'integer',
                        'null' => true,
                        'default' => null,
                    ),
                ),
            ),
        );

        foreach ($map as $class => $data) {
            $modx->loadClass($class);
            foreach ($data['fields'] as $field => $default) {
                if (!isset($modx->map[$class]['fields'][$field])) {
                    $modx->map[$class]['fields'][$field] = $default;
                    if (isset($data['fieldMeta'][$field])) {
                        $modx->map[$class]['fieldMeta'][$field] = $data['fieldMeta'][$field];
                    }
                }
            }
        }
        break;
    
    case "OnUserFormPrerender":
        // Проверяем существование пользователя
        if (!isset($user) || !is_object($user) || $user->get('id') < 1) {
            return;
        }

        $profile = $user->getOne('Profile');
        if (!$profile) {
            return;
        }

        // Получаем значения полей
        $allowedResources = $profile->get('allowed_resources') ?: '';
        $dateStart = $profile->get('date_start');
        $dateEnd = $profile->get('date_end');

        // Форматируем даты
        $dateStartFormatted = (!empty($dateStart) && is_numeric($dateStart)) 
            ? date('Y-m-d', $dateStart) 
            : '';
        $dateEndFormatted = (!empty($dateEnd) && is_numeric($dateEnd)) 
            ? date('Y-m-d', $dateEnd) 
            : '';

        // Экранируем для JavaScript
        $allowedResources = htmlspecialchars($allowedResources, ENT_QUOTES, 'UTF-8');

        $js = <<<JS
<script type="text/javascript">
Ext.onReady(function() {
    Ext.ComponentMgr.onAvailable('modx-user-tabs', function(panel) {
        panel.on('beforerender', function() {
            // Находим левую колонку первой вкладки
            var tabPanel = this.items && this.items.items && this.items.items[0];
            if (!tabPanel) return;
            
            var formPanel = tabPanel.items && tabPanel.items.items && tabPanel.items.items[0];
            if (!formPanel) return;
            
            var leftCol = formPanel.items && formPanel.items.items && formPanel.items.items[0];
            if (!leftCol) return;

            // Создаем FieldSet с правильным layout
            var customFields = new Ext.form.FieldSet({
                title: 'Доступ к ресурсам',
                collapsible: true,
                collapsed: false,
                style: 'margin-top: 15px; margin-bottom: 15px;',
                autoHeight: true,
                layout: 'form',  // КЛЮЧЕВОЕ: включает отображение fieldLabel
                labelWidth: 150,
                anchor: '100%',
                defaults: {
                    anchor: '100%',
                    msgTarget: 'under'
                },
                items: [
                    {
                        xtype: 'textfield',
                        name: 'allowed_resources',
                        fieldLabel: 'Разрешенные ресурсы',
                        maxLength: 191,
                        value: '{$allowedResources}',
                        listeners: {
                            afterrender: function(cmp) {
                                if (Ext.QuickTips) {
                                    Ext.QuickTips.register({
                                        target: cmp.getEl(),
                                        text: 'ID ресурсов через запятую (например: 1,5,12,43)'
                                    });
                                }
                            }
                        }
                    },
                    {
                        xtype: 'datefield',
                        name: 'date_start',
                        fieldLabel: 'Дата начала доступа',
                        format: 'Y-m-d',
                        value: '{$dateStartFormatted}',
                        emptyText: 'Выберите дату начала'
                    },
                    {
                        xtype: 'datefield',
                        name: 'date_end',
                        fieldLabel: 'Дата окончания доступа',
                        format: 'Y-m-d',
                        value: '{$dateEndFormatted}',
                        emptyText: 'Выберите дату окончания'
                    }
                ]
            });

            // Добавляем в левую колонку
            leftCol.add(customFields);
            
            // Обновляем layout
            if (leftCol.doLayout) {
                leftCol.doLayout();
            }
            if (panel.doLayout) {
                panel.doLayout();
            }
        });
    });
});
</script>

<style type="text/css">
/* Стили для полей */
.x-fieldset {
    border: 1px solid #d0d0d0;
    padding: 10px;
    margin-bottom: 10px;
}
.x-fieldset legend {
    font-weight: bold;
    color: #333;
    padding: 0 5px;
}
.x-form-item {
    margin-bottom: 10px;
}
.x-form-item-label {
    font-weight: bold !important;
    color: #555;
    font-size: 12px;
}
.x-form-field-wrap {
    margin-bottom: 5px;
}
</style>
JS;

        $modx->controller->addHtml($js);
        break;
        
    case "OnUserFormSave":
        if (!isset($user) || !is_object($user)) {
            return;
        }
        
        $profile = $user->getOne('Profile');
        if (!$profile) {
            return;
        }
        
        $modified = false;
        
        // Сохраняем allowed_resources
        if (isset($_POST['allowed_resources'])) {
            $value = trim($_POST['allowed_resources']);
            $profile->set('allowed_resources', $value !== '' ? $value : null);
            $modified = true;
        }
        
        // Сохраняем date_start
        if (isset($_POST['date_start'])) {
            if (!empty($_POST['date_start'])) {
                $timestamp = strtotime($_POST['date_start']);
                if ($timestamp !== false) {
                    $profile->set('date_start', $timestamp);
                    $modified = true;
                }
            } else {
                $profile->set('date_start', null);
                $modified = true;
            }
        }
        
        // Сохраняем date_end
        if (isset($_POST['date_end'])) {
            if (!empty($_POST['date_end'])) {
                $timestamp = strtotime($_POST['date_end']);
                if ($timestamp !== false) {
                    $profile->set('date_end', $timestamp);
                    $modified = true;
                }
            } else {
                $profile->set('date_end', null);
                $modified = true;
            }
        }
        
        // Сохраняем профиль только если были изменения
        if ($modified) {
            $profile->save();
        }
        break;
}
03 апреля 2025, 12:03
0
Спасибо! За ответ… Буду искать почему так. Жаль документации нет к компоненту…
03 апреля 2025, 12:03
0
Спасибо! За ответ… Буду искать почему так. Жаль документации нет к компоненту…
03 апреля 2025, 10:35
0
Array
(
[razmer] => 30
[dough] => Тонкое
[modifications] => Array
(
[0] => 29
[1] => 31
[2] => 51
[3] => 52
[4] => 53
)

[modification] => 0
) вот такой массив уходит в корзину при выборе только одной опции. Я выбрал размер (это 29 модификация) и должна была отправится ещё 31 модификация(она по умолчанию выбрана), а вот почему отправляется 51,52,53 (это checkbox) которые даже не выбраны… Не понятно!
04 апреля 2023, 16:12
0
По артикулу так и не ищет (((
13 декабря 2022, 21:36
0
ibb.co/kShNhN3
github.com/sweetalert2/sweetalert2/commit/47a88ca55c4aa4ffba61f2b2e732791ac08ec66f#diff-a6b38c88286015f973053c05716c670cdf9a2e4bb50c105f47830331d87cd431

Это стремно господа… Подмешивать в код украинскую музыку и гавнить всем подряд… Это не достойно звание разработчика!
05 июня 2022, 10:24
0
Просто нужно скобки { } в скрипте отделить пробелами
25 октября 2021, 10:08
0
Практически все дополнения с modstore перестали устанавливаться после скачивания.… Что то изменили в самом репопозитории??
13 июля 2020, 21:07
0
Добрый день! Не с того не с сего компонент перестал работать. Не понятно я его даже не трогал. Пишит «Ошибка расчета доставки!» Вот скрин: Кто нибудь встречался с такой проблемой?
13 мая 2020, 09:32
0
Как создать копию default-MIGX-grid?
11 мая 2020, 20:03
0
Тоже задавался этим вопросом до сих пор не нашёл ответа :(
17 февраля 2020, 22:17
0
Походу мне продали старьё((( Я не доволен (((
17 февраля 2020, 14:45
0
Столкнулся с проблемой когда купил это расширение. Оказывается у Яндекс кассы вышел новый API, а этот модуль сделан под старый. Пришлось упрашивать менеджеров чтобы они подсоединили старый API. Так что при покупке учитывайте это...Да и вопрос к разработчику: А будет ли обновлён этот модуль под новый API ?????
29 января 2020, 12:34
0
Просто тут написано:
«Далее как описано в статье подключаем плагин:if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('order_table', '{core_path}components/minishop2/custom/order_table/index.php');
}», а в статье это не описано. От сюда и всё запара с этим мануалом…
29 января 2020, 11:31
0
У меня почему-то не заработало(((. ЧТо то как то трудно добавляются поля в админку в заказы. Не получается сделать… Уже много всяких мануалов прочитал… Непонятно как это сделать. Слишком намудрили в этом минишопе
29 января 2020, 09:44
0
А как подключить плагин? В каком файле он подключается?
18 июля 2019, 11:01
0
У меня такая же проблеме. Можете подсказать? Что вы сделали чтобы заработали товары???
17 июля 2019, 15:07
0
Подскажите пожалуйста! В поддержке не отвечают. Может кто то здесь знает. Купил компонент mSync. Установил настроил. Начал делать выгрузку. Категории товаров выгрузились, а сами товары не выгружаются(((. В логах вот такие ошибки:
[mSync] Не удалось создать привязку для параметров 1
[mSync] Привязка к товару для торгового предложения с uuid=90a9c35b-5cc4-11e8-806c-002522592c90 не найдена.
Что делать? Как быть?
02 июля 2019, 15:54
0
Компонент из упаковки почему-то не работает ( а именно не работает добавление событий в календарь).
какая то ошибка в js скрите. Кто знает решение подскажите пожалуйста )))!
28 июня 2019, 12:22
0
Это нужно где то в настройках прописывать или уже всё само настроено? Спасибо за ответ…