SEQUEL.ONE

SEQUEL.ONE

Был в сети 30 июня 2026, 13:59
Заказы принимаю
Aleksandr Huz
Aleksandr Huz
Теперь понятно. Значит нам в массив нужно добавить поле с заголовками товаров.

Примерно, так:
public function prepareRow(xPDOObject $object)
{
        $array = $object->toArray();
        
        $q = $this->modx->newQuery('modResource');
        if(!is_array($array['products'])) {
            $array['products'] = explode(',', $array['products']);
        }
        $q->where(array('id:IN' => $array['products']));
        $q->select(array('pagetitle'));
        if($q->prepare() && $q->stmt->execute()) {
            $resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
            $array['productsTitle'] = array_map(function($res){
                return $res['pagetitle'];
            },$resources);
            $array['productsTitle'] = implode(',', $array['productsTitle']);
        }
        

        $array['actions'] = [];

      ....
}
Теперь в место products подставляем productsTitle

Удаляем ненужный код:
функцию — outputArray
и вот эти строчки тоже ни к чему
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$products = $item->get('products');
vectorserver
vectorserver
Так проще и быстрее, без обид друг)
Код сниппета ParseInsta:
<?php
//ParseInsta
$cacheKey = "insta_".md5($url);

$returnCache = $modx->cacheManager->get("$cacheKey");

if(!$returnCache){
    $doc = new DOMDocument();
    $doc->loadHTMLFile($url);
    $xpath = new DOMXpath($doc);
    $sharedData = $xpath->query("//html/body/script[1]")->item(0)->textContent;
    $str = $sharedData;
    $modx->cacheManager->set($cacheKey, $str, 7200*60);
    return $str;
}

return $returnCache;
И далее JSON обрабатываем через JS или конвертуть в массив и использовать в чанках
<script>
var instaphotos = [[ParseInsta? $url=`https://www.instagram.com/explore/tags/кофесос`]];
//bla bla bla
</script>
Александр Туниеков
Александр Туниеков
Я тупо в ресолвере через newObject добавляю. Если есть лучше вариант, то будет интересно узнать.
resolve.default_fields.php
/** @var xPDOTransport $transport */
/** @var array $options */
/** @var modX $modx */
if ($transport->xpdo) {
    $modx =& $transport->xpdo;
	/** @var array $options */
	switch ($options[xPDOTransport::PACKAGE_ACTION]) {
		case xPDOTransport::ACTION_INSTALL:
			$fields = [
				[
					'name'=>'res_id',
					'label'=>'Мероприятие',
					'dbtype'=>'int',
					'precision'=>10,
					'phptype'=>'integer',
					'xtype'=>'tevent-univers-combo',
					'sort'=>1,
					'validate'=>'required',
					'select_query'=>
'{
    "parents":"0",
    "template":"1"
}',
					'filter'=>true,
					'active'=>true,
				],
///еще поля
			];
			foreach($fields as $field){
				if(!$in_field = $modx->getObject('tEventField',['name'=>$field['name']])){
					if($in_field = $modx->newObject('tEventField')){
						$in_field->fromArray($field);
						if(!$in_field->save()) $modx->log(xPDO::LOG_LEVEL_ERROR, "[tEvent] field {$field['name']} not add!");
					}
				}
			}
			$modx->log(xPDO::LOG_LEVEL_INFO, '[tEvent] Successfully add Default fields!');
			break;

	}
}
Prihod
Prihod
Выполни в консоли код
$pkgName = 'msFieldsManager';
$pkgNameLower = mb_strtolower($pkgName);
$modelPath = $modx->getOption("{$pkgNameLower}.core_path", null, $modx->getOption('core_path') ."components/{$pkgNameLower}/") . 'model/';
 $modx->addPackage($pkgNameLower, $modelPath);
  $manager = $modx->getManager();

$manager->addField('MsfmProcessors', 'storage_id', array('before' => 'id'));
 $manager->addField('MsfmFields', 'fieldset_id', array('before' => 'id'));
$manager->addField('MsfmFields', 'dbindex', array('before' => 'dbdefault'));
$manager->addField('MsfmFields', 'default_value', array('before' => 'dbdefault'));
$manager->addField('MsfmFields', 'grid', array('before' => 'required'));
$manager->addField('MsfmFields', 'sortable', array('before' => 'required'));
$manager->addField('MsfmFields', 'unit', array('before' => 'extjs'));
$manager->addIndex('MsfmFields', 'name');
mngatoff
mngatoff
достаточно триггернуть событие change на input:count, и запрос отправится стандартными средствами минишопа.

я вот так делаю (немного вырвано из контекста, но принцип ясен):
<script>
$(document)
    .on('click touchend', countButton, function (e) { // где countButton - кнопки плюс и минус
        e.preventDefault();
        var $container = $(this).closest('.ms2_form'),
        $count = $container.find('[name="count"]'),
        num = $count.val();
        if (isNaN(num) === false) { // страховочка от, например, пустого поля
            num = parseInt(num, 10);
            switch ($(this).data('ms2-count')) { // соответственно, у кнопок должен быть атрибут data-ms2-count="plus или minus"
                case 'plus':
                    num = num + 1;
                    $count.val(num);
                    break;
                case 'minus':
                    if (num <= 1) return;
                    num = num - 1;
                    $count.val(num);
                    break;
            }
        } else {
            return false;
        }
        $count.trigger('change'); // инициализируем отправку на сервер.
    })
    .on('change keypress keyup', '.ms2_form [name="count"]', function() {
        if ($(this).val().match(/\D/)) {
            this.value = $(this).val().replace(/\D/g,''); // следим на лету, чтобы в поле были только цифры
        }
        if (parseInt($(this).val(), 10) < 1) {
            this.value = 1; // следим на лету, чтобы в поле было не меньше единицы
        }
    });
</script>
SEQUEL.ONE
SEQUEL.ONE
Сегодня удалось победить отправку почты из формы на reg.ru

Во-первых я настроил smtp сервер от Яндекса по мануалу
modhost.pro/help/email
Во-вторых надо было настроить DNS. Тех. поддержка reg.ru в этом помогла:

В SPF-записи отсутствует ip-адрес хостинга:

site.com. 300 IN TXT «v=spf1 redirect=_spf.yandex.net»

Это ошибка связана с политикой DMARC. Вам необходимо добавить ip-адрес сервера хостинга 192.168.255.255 в SPF-запись. Она примет следующий вид:

v=spf1 ip4:192.168.255.255 redirect=_spf.yandex.net
Ну а в третьих проверить параметр emailTo, является ли введённый адрес реальным.
И да, очень помог компонент QuickEmail со сниппетом:

[[!QuickEmail?
    &to=`my-mail@mydomain.ru`
    &debug=`1`
]]