Дмитрий Мансуров

Дмитрий Мансуров

Был в сети 28 мая 2022, 17:29
Заказы принимаю
<?php
if ($modx->event->name == 'mSyncOnProductOffers') {
    //$modx->log(1, 'mSyncOnProductOffers $xml ' . print_r($xml,1));
    $resource->setTVValue('edizm',(string)$xml->БазоваяЕдиница->attributes()->НаименованиеПолное);
    $resource->save();
}
Передача единиц измерения в ТВ поле в плагине для компонента mSync
Я конечно понимаю, что времени уже прошло много — 3 года, нго считаю нужным оставить эту инфу здесь
Ссыль на параметры аватара на яндексе
/core/components/hybridauth/providers/Yandex.php
меняем
$userProfile->photoURL = 'http://upics.yandex.net/' . $userProfile->identifier . '/normal';
на
$userProfile->photoURL = 'https://avatars.yandex.net/get-yapic/' . $userProfile->identifier . '/islands-retina-50';
Сам отвечаю — не верно!
Создал плагин
switch ($modx->event->name) {
    case 'msShiptorOnGetProductOption':         
        if(isset($params['options'][$mode]) && intval($params['options'][$mode]) > 0){
            $response['data'] = array(
                    'value' => $params['options'][$mode]
                );
            $this->modx->event->returnedValues = $response;
        }
        break;
}
Я прописал опции атрибутами, да хоть ТВ полями можно главное передать их
<input name="options[width]" type="hidden" value="20">
<input name="options[length]" type="hidden" value="20">
<input name="options[height]" type="hidden" value="3">
Может это никому и не нужно, но у меня заявки создаются а значит и расчет нужен верный и с этими данными я заявку кидаю
Но есть sdk, кривущщая дока к нему и руки, допилить не сложно, но есть сюрпризы типа когда цену на сквозную доставку считаешь и она считается по тому же СДЭКу, а вот отправить в заказ нельзя ибо СДЭК не поддерживает.
Не могу удержаться от примера из AddPackage
setPhone(<телефон>) Задает электронную почту получателя. Аргумент должен быть строкой, содержащей действующий номер телефона в формате +79123456789
Проверка номера телефона на корректность, кстати, более придирчивая, чем у miniShop2
Я дописал и поправил ваш код.
Теперь он не путается со сниппетом localizator и дружит с ТВ полями
Работает так
{9 | locfield : 'tv_name'}
Можно использовать id tv поля, можно имя (видно из кода)
Запилил я это все в плагин (проверено)
<?php

/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        /** @var Fenom $fenom
            Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы. 
            Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
        */
        $pdo = $modx->getService('pdoTools');

        // localizator
        $fenom->addModifier('locfield', function ($id, $field = null) use ($pdo, $modx) {
            $pdo->debugParserModifier($id, 'locfield');
            
            /** @var modResource $resource */
            if (empty($id)) {
                $resource = $modx->resource;
            } elseif (!is_numeric($id)) {
                $field = $id;
                $resource = $modx->resource;
            } elseif (!$resource = $pdo->getStore($id, 'resource')) {
                $resource = $modx->getObject('modResource', $id);
                $pdo->setStore($id, $resource, 'resource');
            }
            
            $key =  $modx->getOption('cultureKey');
            if( $modx->getOption('cultureKey') != 'ru' ) {
                $q = $modx->newQuery( "localizatorContent" );
                $q->where( array( "`resource_id` = '" . $id . "'", "`key` = '" . $key . "'" ) );
                $q->select( array( $field ) );
                $s = $q->prepare();  // print $q->toSQL(); die;
                $s->execute();
                $array = $s->fetch(PDO::FETCH_ASSOC);
                $field_value = $array[$field];
                if(empty($field_value)){
                    if(is_numeric($field)){
                        $tvId = intval($field);
                    }else{
                        $tvObj = $modx->getObject('modTemplateVar', array('name' => $field));
                        $tvId = $tvObj->get('id');
                    }
                    
                    $q = $modx->newQuery( "locTemplateVarResource" );
                    $q->where( array( "`contentid` = '" . $id . "'", "`key` = '" . $key . "'", "`tmplvarid` = '" . $tvId . "'" ) );
                    $q->select(  'value'  );
                    $s = $q->prepare();   
                    $s->execute();
                    $array = $s->fetch(PDO::FETCH_ASSOC);
                    
                    return $array['value'];
                }else{
                    return $field_value;
                }
                
            }
            
            $output = '';
            if (!empty($resource)) {
                if (!empty($field)) {
                    if (strtolower($field) == 'content') {
                        $output = $resource->getContent();
                    } else {
                        $output = $resource->get($field);
                        if (is_null($output)) {
                            $output = $resource->getTVValue(preg_replace('#^tv\.#i', '', $field));
                        }
                    }
                } else {
                    $output = $resource->toArray();
                }
            }
            $pdo->debugParserModifier($id, 'locfield');
            return $output;
        });
        break;
}
Галочку
pdoToolsOnFenomInit
не забудьте

И для страждущих getImageList (проверено)
[[getImageList?  &tpl=`why_we.tpl` &value=`[[*why_we]]`]]
или даже так, когда данные в другом ресурсе (не успел проверить, но вроде должно)
{'getImageList' | snippet : [
    'tpl' => 'why_we.tpl',
    'value' => (9 | locfield : 'tv_name')
]}
Доброе время суток.
Подскажите в какое поле мне добавить
"popular":{"key":"Популярный","type":"boolean"},"new":{"key":"Новый","type":"boolean"},"favorite":{"key":"Распродажа","type":"boolean"}
В МС поля с именами Популярный, Новый, Распродажа (тип флажок) созданы.
Например
"tv6":{"key":"На главной","type":"boolean"}
Я добавил в moysklad_product_attributes и прекрасно работает
Спустя несколько лет вопрос все еще актуален поэтому напишу краткую инструкцию
Редактируем файлы
core/components/minishop2/model/minishop2/mscarthandler.class.php
Ищем
$count = inval($count);

(у меня это строка 153)
Меняем на
$count = floatval($count);
Файл:
core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php
Ищем
'count' => 
    array (
      'dbtype' => 'int',
      'precision' => '10',
      'phptype' => 'integer',
      'attributes' => 'unsigned',
      'null' => true,
      'default' => 1,
    ),
меняем на
'count' => 
    array (
      'dbtype' => 'decimal',
      'precision' => '10,2',
      'phptype' => 'float',
      'null' => true,
      'default' => 1,
    ),
Файл:
core/components/minishop2/model/schema/minishop2.mysql.schema.xml
Ищем
<field key="count" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="true" default="1"/>
меняем на
<field key="count" dbtype="decimal" precision="10,2" phptype="float"  null="true" default="1"/>