Aleksandr Huz

Aleksandr Huz

С нами с 02 августа 2014; Место в рейтинге пользователей: #20
Aleksandr Huz
04 июля 2018, 10:07
1
+1
Мое решение:
1. В форму вставляем скрытое поле с файлом
<input type="hidden" name="attach_file" value="IMG_1035.JPG" />

2. Удаляем хук email

3. Добавляем свой хук (email_file)
<?php
$pdo = $modx->getService('pdoTools');
$siteName = $modx->getOption('site_name');
$emailsender = $modx->getOption('emailsender');
$emailTo = $modx->getOption('emailTo', $scriptProperties, $emailsender, true);
$fields = $hook->getValues(); 
$message = $pdo->getChunk('email', $fields);
$subject = $modx->getOption('emailSubject', $scriptProperties, $siteName, true);

$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, $message);
$modx->mail->set(modMail::MAIL_FROM, $emailsender);
$modx->mail->set(modMail::MAIL_FROM_NAME, $siteName);
$modx->mail->set(modMail::MAIL_SUBJECT, $subject);
$modx->mail->address('to', $emailTo);
$modx->mail->address('reply-to', $emailsender);
if(!empty($fields['attach_file'])) {
    $modx->mail->attach($modx->getOption('base_path').$fields['attach_file']);
}
$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;
Aleksandr Huz
30 июня 2018, 13:02
+1
Да, вы правы.
Нужно вот так
<?php
/** @var modX $modx */
if($modx->event->name == 'OnDocFormRender') {
        
    // Прячем TV для всех контекстов, кроме web(ru)
    if(!$resource) return; // Выходим, если это новый ресурс
    if($resource->get('context_key') !== 'web') {
        $hideTV = 'MODx.hideTV("tv20");'; // 20 - id tv

        $modx->regClientStartupHTMLBlock("<script>
            Ext.onReady(function(){ 
                $hideTV 
            });
        </script>");
    }
}
Aleksandr Huz
30 июня 2018, 12:15
0
Да, вместо 20 поставить 19.
$hideTV = 'MODx.hideTV("tv19");';
Вы включили событие OnDocFormRender для плагина?
Aleksandr Huz
30 июня 2018, 09:17
0
Через плагин можно:
<?php
/** @var modX $modx */
if($modx->event->name == 'OnDocFormRender') {
        
    // Прячем TV для всех контекстов, кроме ru
    if($modx->getOption('cultureKey') !== 'ru') {
        $hideTV = 'MODx.hideTV("tv20");'; // 20 - id tv

        $modx->regClientStartupHTMLBlock("<script>
            Ext.onReady(function(){ 
                $hideTV 
            });
        </script>");
    }
}
Aleksandr Huz
29 июня 2018, 16:09
+2
Еще одна таблица нужна — modTemplateVarResource
<?php
$art = 23; // id tv
$query = $modx->newQuery('msProduct');
$query->leftJoin('msProductData', 'Data');
$query->leftJoin('modTemplateVarResource', 'art', 'msProduct.id = art.contentid AND art.tmplvarid = ' . $art);
$query->groupby('msProduct.id');
$query->where(array(
    'msProduct.parent:IN' => [10, 20],
    'Data.price' => '60',
    'art.value' => '10'
));
$products= $modx->getCollection('msProduct', $query);
 
foreach ($products as $k => $product) { 
    $title = $product->get('pagetitle');
}
Aleksandr Huz
28 июня 2018, 13:06
0
Артем, я ошибся, нужно не только поменять функцию ready, а и удалить анонимную функцию, которая оборачивает весь код или удалить параметр jQuery из функции.
Aleksandr Huz
27 июня 2018, 19:13
0
Ну конечно можно))))
{'pdoResources' | snippet: [
    'parents' => 7,
    'includeTVs' => 'migx_tv',
    'tpl' => '@INLINE {set $output = $_modx->getPlaceholder("output")?:[]}{set $output[$id] = $_pls["tv.migx_tv"]}{$_modx->setPlaceholder("output", $output)}'
]}
И получаем плейсхолдер с готовым массивом
{$_modx->getPlaceholder('output')}

Обратите внимание, что ключи полученного массива — это id ресурса. Но можно и не указывать ключ))
set $output[$id] = ...
Aleksandr Huz
27 июня 2018, 12:28
0
Круто. Спасибо)
Aleksandr Huz
27 июня 2018, 11:31
0
Артем, привет.
Есть несколько вопросов.

1. Зачем 2 раза регистрировать скрипт?
$modx->regClientScript($js);
if (preg_match('/\.js$/i', $js)) {
	$js .= '?v=' . substr(md5($version), 0, 10);
}
$modx->regClientScript($js);

2. Если jquery загружать асинхронно(defer), то код не сработает.
Если поменять функцию ready то все будет работать.
$(document).ready(function ($) {
     modAlertify.initialize();
});
на
document.addEventListener('DOMContentLoaded', function(){
     modAlertify.initialize();
});

Aleksandr Huz
27 июня 2018, 11:01
0
Для вывода ресурсов можно воспользоваться сниппетом pdoResources
В чанке получаем tv каждого ресурса, для этого прописываем название tv в параметре includeTVs
Aleksandr Huz
25 июня 2018, 11:42
+2
Поздравляю!
Очень интересно, сколько же действительно в магазине дополнений))
Картинка кликабельна.
Aleksandr Huz
25 июня 2018, 11:36
+1
Покажите исходный код.
Вы поменяли $item на $galItem?
Aleksandr Huz
24 июня 2018, 14:41
1
+1
Потому что, нужно так:
'id' => $id,
Aleksandr Huz
24 июня 2018, 14:36
0
Кстати, если включить сортировку
&sortby :'{"parent":0}',
то сначала будут выводиться ресурсы с родителем 0, а затем уже все дочерние.
Aleksandr Huz
24 июня 2018, 14:28
0
Все потому, что сортировка идет по menuindex
Дочерние ресурсы начинают отчет заново с 0, поэтому и выводиться сначала все ресурсы с menuindex = 0
Aleksandr Huz
22 июня 2018, 13:28
+1
Как вывести MIGX через Fenom с другой страницы
{var $gallery = 7 | resource: 'gallery' | fromJSON}
7 = id нужно страницы.

а вот хотелось бы на главной вывести 6 результатов, как это сделать?
{set $limit = 6}
{foreach $gallery as $idx => $item}
    {if $idx < $limit}
     ...
    {/if}
{/foreach}
Aleksandr Huz
21 июня 2018, 12:33
1
+1
Можно через модификатор:
$fenom->addModifier('tvname', function ($tvname) {
    // Получаем объект TV по имени
    $tv = $modx->getObject('modTemplateVar',array('name' => $tvname));
    // id текущего ресурса
    $id = $modx->resource->id;
    // значение tv
    $value = $tv->renderOutput($id);
    
    // Ищем необходимое значение и возвращаем навазние
    $tvlist = explode('||', $tv->get('elements'));
    foreach ($tvlist as $item) {
        $arr = explode('==',$item);
        if($arr[1] == $value) {
            return $arr[0];
        }
    }
    return $tvname;
});

В чанке:
{'name TV' | tvname}
Aleksandr Huz
19 июня 2018, 14:33
0
Спасибо))
Aleksandr Huz
19 июня 2018, 13:51
0
Подскажите, как разместить код по катом?