Михаил

Михаил

Был в сети 23 мая 2026, 18:35
Заказы принимаю
vectorserver
vectorserver
Я думаю это лешнее, сейчас использую 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
Павел Гвоздь
Павел Гвоздь
Это
echo 'Идентификатор = '.$userArray['id'].'
'
      .'Логин = '.$userArray['username'].'
'
      .'Имя = '.$userArray['fullname'].'
'
      .'Email = '.$userArray['email'].'

';
Я бы так сделал:
print_r(join(PHP_EOL, [
    'Идентификатор = ' . $userArray['id'],
    'Логин = ' . $userArray['username'],
    'Имя = ' . $userArray['fullname'],
    'Email = ' . $userArray['email'],
]);
На работу скрипта никак не влияет, но блин, красиво!)
Андрей
Андрей
Как-то так, не уверен, что 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
Dolce
Точно, не удалил лишений код — как следствие и скопировал не то. Вот для селектов:
$(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();
                    });

   });
Андрей
Андрей
Я на одном проекте так делал, просто хук написал который отправляет письмо и файл.

Создаете сниппет, например 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;
Илья Уткин
Илья Уткин
Вот без подзапроса — с использованием 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>";
    }
}
Илья Уткин
Илья Уткин
<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>
А про файлы вопрос сложнее, чем кажется на первый взгляд. В двух словах не расскажешь.
Максим Кузнецов
Максим Кузнецов
Дмитрий Кондаков
Дмитрий Кондаков
Создаете плагин на событие 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. на всякий случай сделайте бэкап БД перед тестированием плагина
Игорь Зябко
Игорь Зябко