Константин Ильин

Константин Ильин

С нами с 10 февраля 2014; Место в рейтинге пользователей: #131
16 ноября 2016, 19:55
2
+2
Чтож, уже ноябрь, но лучше поздно чем никогда)

Спасибо Сергей Шлокову, он на пальцах мне обьяснил что так как я хотел сделать выше — нельзя.
Последовательность такая:
1. Нажимается кнопка.
2. В функции кнопки вызывается ajax запрос к процессору который выдает поля.
3. Только когда ajax выполнился вызывается окно. В вызов окна сразу подсовываются готовые поля, сформированные из ответа ajax.

Код функции процессора — process ()
public function process()
    {
        /*некий код*/
	$fields = '';
        // Существует какая то некая таблица в которой 1 строка это поле
        $table = $this->modx->getTableName('FieldsItems');
        $query = $this->modx->query("SELECT * FROM ".$table." WHERE active = 1");
	
        if (!is_object($query)) {
           
           return $this->failure($this->modx->lexicon('fl_data_err_get_field'));

        }else{

           $arr = $query->fetchAll(PDO::FETCH_ASSOC);

           foreach ($arr as $value) {

               $fields[] = array(
                    'xtype' => 'textarea',
                    'fieldLabel' => $value['name'],
                    'name' => "fl-".$value['code'],
                    'id' => 'ext-gen-fl-'.$value['code'],
                    'anchor' => "99%",
                    'allowBlank' => "false",
                    'value' => $fieldsValues[$value['code']] 
                );
           }

        }
        return $this->success('',$fields); // Возвращаем массив полей
    }

Как это в EXT.JS. Тут два запроса ajax, первый получает поля, второй к процессору get который выдает данные об объекте.
MODx.Ajax.request({
            url: Fl.config.connectorUrl
            ,params: {
                action: "mgr/data/get_fields", // Тот самый процессор который выдает поля
                id_res: MODx.request.id,
            }
            ,listeners: {
                success: {fn: function(res) {
                    
                    var fieldsArr = res['object']; // Ответ от процессора с полями, он возвращает массив с данными полей
                    fieldsArr = fieldsArr || {}; 
                    MODx.Ajax.request({
                        url: this.config.url,
                        params: {
                            action: 'mgr/data/get',
                            id: MODx.request.id,
                        },
                        listeners: {
                            success: {
                                fn: function ( r ) { 
                                   
                                    var w = MODx.load({
                                        xtype: 'fl-data-window-update',
                                        id: Ext.id(),
                                        addFields: fieldsArr, // Здесь передаем поля в вызов окна
                                        record: r,
                                        listeners: {
                                            success: {
                                                fn: function () {
                                                    this.refresh();
                                                }, scope: this
                                            },
                                            hide: {
                                                fn: function () {
                                                    setTimeout(function(){w.destroy();},200);
                                                }, scope: this
                                            }
                                        }
                                    });
                                    w.reset();
                                    w.setValues(r.object);
                                    w.show(e.target);
                                }, scope: this
                            }
                        }
                    });
                }, scope: this}
            }
        });

В extende окна:
Ext.extend(Fl.window.UpdateItem, MODx.Window, {

    getFields: function (config) {
        return [{
            xtype: 'hidden',
            name: 'id',
            id: config.id + '-id',
            value: config.id
        },{
            xtype: 'xcheckbox',
            boxLabel: _('fl_lang_active'),
            name: 'active',
            id: config.id + '-active',
            checked: true,
        },
            config.addFields   // ВОТ ТУТ И ДОБАВЛЯЮТСЯ ПОЛЯ, т.е. тот массив полей который передали в ajax запросе
        ];
    },

    loadDropZones: function () {
    }

});
Ext.reg('fl-data-window-update', Fl.window.UpdateItem);
Как то так, наверняка посмотрев через год на этот код будет такая мысль:
«Под чем я был кода писал этот код»
15 ноября 2016, 16:05
0
[2016-11-15 15:56:18] (ERROR @ /-/core/components/minishop2/custom/payment/msppayanyway.class.php : 10) Recoverable error: Argument 1 passed to msppayanyway::__construct() must be an instance of xPDOObject, instance of modX given, called in /-/core/xpdo/xpdo.class.php on line 1246 and defined
Это связанно с сегодняшним обновлением MODX?
14 ноября 2016, 11:47
0
Hello Mark! Lest you orde all an interpreter can let Vasili Naumkin(bezumkin) and Nicholas Lanets will be a bridge between you and the Russian-speaking community for better communication? That is to say officials modx in the Russian-speaking community and be part of your team.
10 ноября 2016, 12:27
0
Василий, обрати пожалуйста свой взор на эту небольшую проблему)
09 ноября 2016, 21:16
0
Василий подскажи пожалуйста в чем проблема, точнее она схожа с вышеописанной:
выдает ошибку ms2_gallery_err_no_product и на первом товаре сбрасывается.

1. В цикле создаю товары, класс указан msProduct
2. Закачиваю на сервер картинку
3. Закачиваю картинку через процессор.

если убрать запуск процессора gallery, то товары создаются нормально.

id и image точно передаются.

foreach($TVR_hm as $tvr){
    echo '--- Создан <b>Товар</b> '.$tvr['pagetitle']. '
';
    $newTVR = creatRes($tvr['pagetitle'],$newPodCat['id'],8);

    $img = $hmURL.$tvr['image'];
				
	$file_name = str_replace("/","",substr( $img, strripos( $img,'/')));
	$origFileName = $_SERVER["DOCUMENT_ROOT"].'/'.$tmp.$file_name; 
	
	$image = str_replace('//', '/', MODX_BASE_PATH . $tmp . $file_name);

	//загрузка файла на сервер
	upload($img,$origFileName);
	
	//загрузки файла для товара
	$params = array('id' => $newTVR['id'], 'name' => $file_name, 'file' => $image);
	$response = $modx->runProcessor('gallery/upload',$params, array('processors_path' =>                                                   MODX_CORE_PATH.'components/minishop2/processors/mgr/'));
	if ($response->isError()) {
		echo "Error on upload \"$image\": \n". print_r($response->getAllErrors(), 1);
	}

	unlink($image);
}

function creatRes($pagetitle,$parent,$template,$class = 0){
    
    global $modx;
    $classR = 'msProduct';
    if($class == 1){
        $classR = 'msCategory';
    }
    $data['class_key']      = $classR;
    $data['context_key']    = 'web';
    $data['template']       = $template;
    $data['published']      = 1;
    $data['parent']         = $parent;
    $data['pagetitle']      = $pagetitle;
    
    $new_res = $modx->runProcessor('resource/create', $data);
    
    return $new_res->getObject();
}
Пробовал (нашел где-то), $modx->error->reset(); в цикл пихать, проходит первую категорию, товары создаются с картинками. Помимо того, что долго он еще и вешается, мол массив пустой, хотя он не пустой, в общем это костыль какой-то.
Подскажите пожалуйста
08 ноября 2016, 12:44
+1
п… — другого слова нет. О какой такой нашей безопасности может идти речь если они себя не состоянии обезопасить.
08 ноября 2016, 12:13
0
Ну вот я поэтому имел ввиду не один человек, а группу экспертов модх.
08 ноября 2016, 11:37
+2
С каждым заходом в эту тему, так становится печальнее… Где-то писали про любовь к модх — она постепенно угасает (скоро будет: «прошла любовь, завяли помидоры»).
Дабы этого не произошло со всеми и со мной надо найти какое-то решение, потому что здесь оставляем комментарии и дыр выявляется много, а там в кабинетах модх скорее всего ничего не меняется. Где-то месяц назад или более Василий выкладывал новость о создание команды на будущее развитие модх (вроде так было, поправьте если путаю), так вот я предлагаю собрать похожую «команду»,«совет»,«консорциум», просто группа, которая напишет большой БагРепорт и будет в будущем писать о дырах модх, а также если есть решение.

Например: Василий, Николай и Евгений Борисов, они ребята «авторитетные» и о них в модх знают, проще говоря к ним прислушаются. Написали в модх, что вот там то дыра, поправить можно так-то, в модх увидят, что письмо от этой команды и рассмотрят его и отнесутся с серьезностью, а не просто забьют. Так сказать нужно подсказывать разработчикам («подпинывать») модх, но тем самым сделать очень большое дело!!!
Глядишь и команда Simple Dream тоже подключится или кто то другой. Даже, хотя бы исходя из финансовой точки зрения, из-за дыр не будет пользователей модх и никто не будет покупать в магазине дополнения и много разных вытекающих последствий…

Ведь это любовь к модх, а за любовь надо бороться.
06 ноября 2016, 11:20
+3
Префикс (не зря же его придумали), как и соль в паролях, создан для защиты от злоумышленников и не зря при установке есть возможность указать его.
Плохо то, что в modx можно сделать sql-инъекцию.
06 ноября 2016, 10:43
0
Понял))
Допустим если не идти легким путем, т.е. не менять префикс, а решать проблему в корне, я так понимаю в ядре копаться?
А ты им предложил в корне проблему решать(может даже решение дал) или они завтра напишут срочно все меняйте префиксы?))
06 ноября 2016, 10:27
0
Николай, первое это конечно огромное большое спасибо за «защиту» наших сайтов!
Печально конечно, я до недавнего времени думал, что modx лучшая из лучших, считал гарантом и людям говорил зачем тебе битрикс за 20 тысяч в год если есть modx с большими возможностями и безопасностью. А оказывается дыр полно. Префикс старался менять на сайтах, но все же он не был супер сложным.

Практически все эти проблемы решаются сменой префиксов таблиц и сокрытием папки коннекторов.
Есть еще проблемы и как они решаются? т.е. я так понимаю их много и от этого становится еще печальней.

Парни из modx что-то ответили? или надо их сайт взломать, чтоб они поняли…
04 ноября 2016, 19:46
0
Ребят подскажите, как правильно работать с подключение к сторонней бд

// Соединяемся с базой данных:
$dsn = "mysql:host=$host;dbname=$databasename;port=$port;charset=$charset";
$config_options = array(xPDO::OPT_TABLE_PREFIX => 'modx_');
$xpdoH = new xPDO($dsn, $username, $password,$config_options,[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION]);

// Проверяем успешность подключения:
if($xpdoH->connect())
{
    echo '<div class="alert alert-success">Подключение к БД  - <strong>Успешно</strong></div>';
}else{
    echo '<div class="alert alert-danger">Подключение к БД  - <strong>НЕ Удалось</strong></div>';
    return;
}
Данный код обрабатывает норм, подключение успешно.

Далее, делаю такой код:
$h = $xpdoH->query("SELECT * FROM modx_site_content WHERE parent = 2");
$res_hl = $h->fetchAll(PDO::FETCH_ASSOC);
Выводит все норм.

Но хотелось бы работать с обьектами, т.е. так:
$hr = $xpdoH->newQuery('modResource');
$hr->select(array('modResource.*'));
$hr->prepare();
$hr->stmt->execute();
$res_hr = $hr->stmt->fetchAll(PDO::FETCH_ASSOC);
Но этот код выдает пустой массив…

Запрос распечатываю вижу такие строчки:
[sql] => SELECT modResource.* FROM  AS `modResource`
Т.е. после FROM не указана таблица

Подскажите пожалуйста, что надо сделать?
26 октября 2016, 15:35
0
Приветствую! Подскажите пожалуйста:
1. Не могу понять как получить массив $data в событии, не выводится ничего
Еще в этом событии есть массив $data — дополнительные параметры, присланные юзером при добавлении товара в корзину. Там может быть цвет, размер и вообще, что угодно.
И как в него что-то передать? Пробовал просто input
<input type="hidden" name="newPrice" value="123123">
//или так
<input type="hidden" name="data[newPrice]" value="qweqweqwe">
в плагине пытаюсь получить его, ничего не выводит, даже array( ) не выводит
$modx->log(modX::LOG_LEVEL_ERROR, print_r($data,true));

2. Как из options удалить Опцию, т.е. чтоб она в корзине не отображалась?

Вот весь код плагина:
switch ($modx->event->name) {

    case 'msOnBeforeAddToCart': 
        $modx->log(modX::LOG_LEVEL_ERROR, print_r($options,true));
        $modx->log(modX::LOG_LEVEL_ERROR, print_r($data,true));

        $product->set('price', $options['newPrice']);
        unset($options['newPrice']);
    break;
22 октября 2016, 14:34
0
Володя, скажи пожалуйста смогу ли я такое реализовать при помощи msOptionsPrice2:
Есть Опция(общая) размеры sizes (тоже множественный выбор, но не стандартная size), сделал так чтобы были уже готовые значения и можно было просто выбирать.

так вот:
Есть несколько размеров, допустим 10, 30, 50. Они общие, т.е. эта опция для групп ресурсов одинаковая. Соответственно на каждую группу ресурсов своя цена на размеры. Допустим так:
- Категория 1
	10 цена 1000р
	30 цена 1200р
	50 цена 1400р
- Категория 2
	10 цена 1100р
	30 цена 1300р
	50 цена 1500р
В каждом товаре выбираю только размер товара, из предложенных. К примеру:
Товар 1 - размеры 10, 30
Товар 2 - размеры 50
Товар 3 - размеры 10,50
Соответственно нужно выводить опции-цены только которые выбраны для товара.

Можно ли чтобы не вбивать в каждый товар размер и его цену(создавать модификации), а назначить глобально как-то, т.е. для Категории как в коде выше?

Вопрос не к компоненту, лучше наверно использовать существующее поле size, но как там связать это все и чтоб были значения(т.е. размеры 10, 30, 50 уже вбиты и можно было только выбирать)?
21 октября 2016, 16:15
0
от блин, как все просто оказалось)) Спасибо)
21 октября 2016, 09:44
0
Вопрос «новичковый», как приводить массив, который отдает newQuery, в массив без префикса
Array
(
    [0] => Array
        (
            [msProduct_id] => 1
            [msProduct_type] => document
	    ........
	)
)
Чтобы был такого вида:
Array
(
    [0] => Array
        (
            [id] => 1
            [type] => document
	    ........
	)
)
20 октября 2016, 14:21
0
Да это так. Я это понимал, но я не понимал почему открыв страницу home запускался сниппет другого ресурса т.е. test 1.
20 октября 2016, 14:19
+1
Обновился, все решилось.
ато я 2-а дня мучился(даже вывело из себя немного:) и не понимал где собака зарыта, только вчера нашел проблему.
Спасибо Василий! и за оперативность конечно огромное спасибо!
20 октября 2016, 14:13
0
На разных хостингах и сайтах пробовал, всегда 1 не обрабатывается. Версия конечно была свежая, до обновления от Василия :)