Всего 123 801 комментарий

Николай
09 января 2023, 17:32
0
Ну, в текущих реалиях свой впн (окно в мир) приоритетнее к сожалению.
Принимает ли линод российские карты это интересно-)) Я лет на 5 вперед денег закинул ещё до «всего этого», так что узнаю не скоро.
Алексей Смирнов
09 января 2023, 16:11
0
Вы не все параметры прочли. посмотрите параметр optionFilters
Наумов Алексей
09 января 2023, 16:09
0
Самое простое:

[[!ecMessages?
&threads=`*`
&tpl=`tpl.ecMessages.Row.all`
&limit=``
&messages=`[[!getMessageIdFromRequest]]`
]]
и создаем сниппет getMessageIdFromRequest:
<?
$messageId = intval($modx->getOption('id', $scriptProperties, 0));

return $messageId;
но тут нет никакой «защиты» от неверно переданного id (несуществующего, например, или удаленного).
Артур Шевченко
09 января 2023, 15:31
0
В minishop2 оплата на сайте не происходит. Во всяком случае не знаю ни одного модуля, который бы позволял произвести оплату не покидая сайт. В методе оплаты же есть метод getPaymentLink и именно он должен возвращать ссылку на страницу оплаты вашего мерчанта, после чего в обработчике заказа будет выполнен редирект.
Vladimir
09 января 2023, 15:26
0
Нужно чтобы именно был редирект на страницу оплаты, а не чтобы заполнение данных происходило через сайт.
Владислав
09 января 2023, 15:23
0
Понял, спасибо за ответ, попробую
Артур Шевченко
09 января 2023, 15:23
0
В minishop2 предусмотрена возможность добавлять собственные сервисы. Вот пример. В документации к вашему платёжному сервису есть раздел Платёж по API думаю вам стоит использовать именно этот способ проведения платежа, а не JS.
Владислав
09 января 2023, 15:21
0
Там не указан синтаксис выборки по опциям, только &where=`{«Data....} и &where=`{«Vendor....} и ни то ни другое не выводят опции.
Vladimir
09 января 2023, 15:16
0
Сам обработчик пытался сделать, и пытался регистрировать как показано в доках минишопа, но он даже не появляется.
<?php

if (!class_exists('msPaymentInterface')) {
    require_once dirname(__FILE__, 3) . '/minishop2/mspaymenthandler.class.php';
}

class mspEpayHalykBank extends msPaymentHandler implements msPaymentInterface
{

    /**
    * mspEpayHalykBank constructor.
    *
    * @param xPDOObject $object
    * @param array $config
    */
    function __construct(xPDOObject $object, $config = array())
    {
        parent::__construct($object, $config);

        $siteUrl = $this->modx->getOption('site_url');
        $assetsUrl = $this->modx->getOption('assets_url') . 'components/minishop2/';
        $paymentUrl = $siteUrl . substr($assetsUrl, 1) . 'custom/payment/mspepayhalykbank.php';

        $this->config = array_merge(array(
            'grant_type' => 'client_credentials',
            'debug' => $modx->getOption('epay_debug'),
            'paymentEpayUrl' => $this->config['debug'] == 1 ? 'https://testoauth.homebank.kz/epay2/oauth2/token' : 'https://epay-oauth.homebank.kz/oauth2/token',
            'scope' => 'webapi usermanagement email_send verification statement statistics payment',
            'client_id' => $modx->getOption('epay_client_id'),
            'client_secret' => $modx->getOption('epay_client_secret'),
            'currency' => 'KZT',
            'terminal' => $modx->getOption('epay_terminal_id'),
            'postLink' => $siteUrl.'/core/components/epay/succsess.php',
            'failurePostLink' => $siteUrl.'/core/components/epay/error.php'
        ), $config);
    }


    /**
    * @param msOrder $order
    *
    * @return array|string
    */
    public function send(msOrder $order)
    {
        if ($order->get('status') > 1) {
            return $this->error('ms2_err_status_wrong');
        }
        $params = array_merge(
            $this->config,
            array(
                'invoiceID' => $_POST['invoiceId'],
                'amount' => $_POST['amount'],                
            )
        );


        $response = $this->request($params, $this->getPaymentLink($order));
        if (is_array($response) && !empty($response['access_token'])) {

            return $this->success('', array('redirect' => $this->config['checkoutUrl'] . urlencode($token)));
        } else {
            $this->modx->log(
                modX::LOG_LEVEL_ERROR,
                '[miniShop2] Payment error while request. Request: ' . print_r(
                    $params,
                    1
                ) . ', response: ' . print_r(
                    $response,
                    1
                )
            );

            return $this->success('', array('msorder' => $order->get('id')));
        }
    }



    /**
    * Building query
    *
    * @param array $params Query params
    *
    * @return array/boolean
    */
    public function request($params = array(), $paymentEpayUrlFull)
    {
        $myCurl = curl_init();
        curl_setopt_array($myCurl, array(
            CURLOPT_URL => $paymentEpayUrlFull,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query($params)
        ));


        $response = curl_exec($myCurl);
        if (curl_errno($myCurl)) {
            $result = curl_error($myCurl);
        }


        header('Content-type: application/json');

        curl_close($myCurl);

        return $response;
    }


    /**
    * Returns a direct link for continue payment process of existing order
    *
    * @param msOrder $order
    *
    * @return string
    */
    public function getPaymentLink(msOrder $order)
    {
        return $this->config['paymentEpayUrl'] . '?' .
        http_build_query(array(
            'action' => 'continue',
            'msorder' => $order->get('id'),
            'mscode' => $this->getOrderHash($order),
        ));
    }
}
Роман
09 января 2023, 15:12
0
В итоге сделал так, вроде работает :), может кому зайдет еще.
Для проверки ID на конце alias воспользовfлся explode и end

<?php
if ($modx->event->name == 'OnDocFormSave') {
    
if ($mode == 'new') {
    // resource created
         if ($resource->get('template') == 2) {
    if (!empty($resource->get('alias'))) {
              $resource->set('alias',$resource->get('alias').'-'.$resource->get('id'));
              $resource->save();
        }else{
            $resource->set('alias',$resource->get('pagetitle').'-'.$resource->get('id'));
            $resource->save();
        }
}
}
else {
   // existing resource was updated
    if ($resource->get('template') == 2) {
  
         if (!empty($resource->get('alias'))) {
            
                 $array = explode('-', $resource->get('alias'));
                 $altid = end($array);

           if ($altid != $resource->get('id')) {
               $resource->set('alias',$resource->get('alias').'-'.$resource->get('id'));
               $resource->save();
             }
            
        }else{
            //$resource->set('alias',$resource->get('pagetitle').'-'.$resource->get('id'));
            //$resource->save();
        }  
    }
}
}
Михаил
09 января 2023, 14:21
0
Создал отдельную страницу — вывожу там отзыв
[[!ecMessages?
&threads=`*`
&tpl=`tpl.ecMessages.Row.all`
&limit=``
&messages=`5`
]]
Делаю ссылку отзыву «Читать весь отзыв» site.ru/reviews?id=5
Вопрос как автоматизировать этот процесс?
Артур Шевченко
09 января 2023, 13:44
0
Ну это больше похоже на целую статью, которую явно писал авторизованный пользователь. Мне кажется в этом случае использовать easyComm не очень удобно, я бы использовал Tickets или написал бы своё решение.
Михаил
09 января 2023, 13:37
0
Сам понимаю что незачем, но нужно чтобы было как тут otzovik.com/reviews/hotel_snegiri_russia_siktivkar/
Предполагаются очень длинные отзывы.
Константин Ильин
09 января 2023, 13:32
0
а, да) Я просто копирнул из примеров) Вызывал сомнение этот параметр, но не трогал)
Сейчас все норм и сохраняется, а сохраняется наверно потому что, я до этого под админом открывал сайт, т.е. не был авторизирован в контексте)
Спасибо Артур! буду дальше тестировать :)
Михаил
09 января 2023, 13:29
0
Добрый день. Вывожу карту со всеми ресурсами из определенного родителя. Как вывести только определенные ресурсы? Например, выводить только те ресурсы у которых заполнен какой нибудь TV
Код вызова:
[[!yandexMaps?
	&tvCoords=`coords`
	&styleMapBlock=`width:100%; height:600px;`
	&zoom=`12`
	&showMoreLink=`true`
	&showMoreLinkTpl=`balloon`
	&fieldForBalloonContent=`introtext`
	&fieldForHint=`pagetitle`
		&objectsTypesJSON=`[
	{
	"Adresa": {
		"parent":30",
		"preset":"islands#redDotIcon"
			}
		}
	]`
]]
Артур Шевченко
09 января 2023, 13:28
0
Нельзя сделать ссылку на страницу, которой нет))) Да и зачем отзыву целая страница? Я чаще всего делаю разворачивающийся текст, реже модалку с полным текстом. Но если прям надо страницу, то надо создать ресурс, в котором будете вызывать сниппет ecMessages, который будет по переданным get-параметрам получать из БД нужный отзыв.
Роман
09 января 2023, 13:20
0
Благодарю! Спасибо что откликаетесь.
Артур Шевченко
09 января 2023, 13:18
+1
Ну так-то, конечно не работает))) Ты указал, что имя пользователя надо брать из поля email, а имя пользователя у тебя не равно email.
Артур Шевченко
09 января 2023, 13:14
1
+1
Я просто вариант предложил, а ты делай как больше нравится)))
Роман
09 января 2023, 13:13
0
Спасибо, попробую! ereplace интересно, обойтись без доп самописного сниппета будет хорошо