Vlad Brise

Vlad Brise

С нами с 02 мая 2018; Место в рейтинге пользователей: #62
Vlad Brise
13 марта 2019, 12:06
1
0
Добрый день, попробуйте создать заказ через процессор, я например так и делаю по аяксу.
Пример рабочего процессора:
class orderCreate extends modProcessor

{
  public $name;
  public $phone;
  public $street;
  public $building;
  public $room;
  public $city;
  public $email;
  public $user_id;
  public $cost;
  public $createdon;
  public $object;
  public $order;
  /* @var pdoTools $pdo */
  protected $pdo;
  protected $toEmail;
  protected $prod_id;
  protected $ms2;
  protected $alias_id;
  
  public function initialize()
  {
    $this->pdo = $this->modx->getService('pdoTools');
    $this->ms2 = $this->modx->getService('miniShop2');
    $this->createdon = date('Y-m-d H:i:s');
    $this->name = trim(htmlspecialchars($_POST['name']));
    $this->phone = trim(htmlspecialchars($_POST['phone']));
    $this->email = trim(htmlspecialchars($_POST['email']));
    $this->city = trim(htmlspecialchars($_POST['city']));
    $this->street = trim(htmlspecialchars($_POST['street']));
    $this->building = trim(htmlspecialchars($_POST['building']));
    $this->room = trim(htmlspecialchars($_POST['room']));
    $this->prod_id = (int)trim(htmlspecialchars($_POST['id']));
    if (!$this->object = $this->modx->getObject('modResource', $this->prod_id)){
      return $this->failure('Такого товара не существует');
    }

    

    return parent::initialize();
  }
  public function process()
  {
    
    $create = $this->createOrder();
    if ($create != true) {
      return $this->failure($create);
    }
    return $this->success('Заказ успешно создан');
  }
  public function createOrder()
  {
    $order = $this->modx->newObject('msOrder');
    $order->fromArray([
      'num' => $this->getNum(),
      'user_id' => $this->getCustomerId(),
      'createdon' => $this->createdon,
      'delivery' => 1,
      'payment' => 1,
      'email' => $this->email,
      'cart_cost' => $this->object->get('price'),
      'cost' => $this->object->get('price'),
      'status' => 1,
      'context' => 'web'
    ]);
    
    $this->beforeSave($order);
    if (!$order->save()) {
      return 'Ошибка создания заказа';
    }
    $this->ms2->changeOrderStatus($order->get('id'), 1);

    
    return true;

  }

  public function getCustomerId()
  {


    if ($this->modx->user->isAuthenticated()) {
      $profile = $this->modx->user->Profile;
      if (!$profile->get('email')) {
        $profile->set('email', $this->email);
        $profile->save();
      }
      $uid = $this->modx->user->id;
    } else {
      if ($user = $this->modx->getObject('modUser', array('username' => $this->email))) {
        $uid = $user->get('id');
      } elseif ($profile = $this->modx->getObject('modUserProfile', array('email' => $this->email))) {
        $uid = $profile->get('internalKey');
      } else {
        /** @var modUser $user */
        $user = $this->modx->newObject('modUser', array('username' => $this->email, 'password' => md5(rand())));
        $profile = $this->modx->newObject('modUserProfile', array(
          'email' => $this->email,
          'fullname' => $this->name,
        ));
        $user->addOne($profile);
        /** @var modUserSetting $setting */
        $setting = $this->modx->newObject('modUserSetting');
        $setting->fromArray(array(
          'key' => 'cultureKey',
          'area' => 'language',
          'value' => $this->modx->getOption('cultureKey', null, 'en', true)
        ),'', true);
        $user->addMany($setting);
        $user->save();

        if ($groups = $this->modx->getOption('ms2_order_user_groups', null, false)) {
          $groups = array_map('trim', explode(',', $groups));
          foreach ($groups as $group) {
            $user->joinGroup($group);
          }
        }
        $uid = $user->get('id');
      }
    }

    return $uid;
  }


  public function beforeSave(msOrder $order){
    $addressArray = [
      'receiver' => $this->name,
      'phone' => $this->phone,
      'email' => $this->email,
      'city' => $this->city,
      'street' => $this->street,
      'building' => $this->building,
      'room' => $this->room
    ];
    /** @var msOrderAddress $address */
    $address = $this->modx->newObject('msOrderAddress');
    $address->fromArray(array_merge($addressArray, [
      'user_id' => $this->getCustomerId(),
      'createdon' => $this->createdon,
    ]));
    $productArr = [];

    $product = $this->modx->newObject('msOrderProduct');


    $product->fromArray([
      'product_id' => $this->prod_id,
      'cost' => $this->object->get('price'),
      'price' => $this->object->get('price'),
      'name' => $this->object->get('pagetitle'),
    ]);

    $productArr[] = $product;

    $order->addOne($address);
    $order->addMany($productArr);
  }
  
    /**
     * Return current number of order
     *
     * @return string
     */
    public function getNum()
    {
        $cur = date('ym');
        $num = 0;

        $c = $this->modx->newQuery('msOrder');
        $c->where(array('num:LIKE' => "{$cur}%"));
        $c->select('num');
        $c->sortby('id', 'DESC');
        $c->limit(1);
        if ($c->prepare() && $c->stmt->execute()) {
            $num = $c->stmt->fetchColumn();
        }
        if (empty($num)) {
            $num = date('ym') . '/0';
        }
        $num = explode('/', $num);
        $num = $cur . '/' . ($num[1] + 1);

        return $num;
    }

}

return 'orderCreate';
Лично мне так удобнее, не знаю как остальным, но решение рабочее.
Мы просто используем методы минишоповского класса создания заказа, и будет все точно так же как и при стандартном оформлении, даже сообщение пользователю придет.
Vlad Brise
12 марта 2019, 23:07
0
Попробуйте в сниппете msGetOrder поставить в параметр tpl пустую строку, и открыть страницу оформленного заказа, выведутся все доступные плейсхолдеры и в чанке вы их можете вывести.
Например:
{$placeholder}
Vlad Brise
03 марта 2019, 00:23
0
У вас походу Fenom включен, после фигурных скобок в вашем коде поставьте пробелы и все заработает. Скорее всего вы в шаблоне или в чанке js прописали, там как раз они есть
Vlad Brise
03 марта 2019, 00:20
0
Не совсем понятно, что вы хотите этим условием добиться
Vlad Brise
24 февраля 2019, 11:36
+1
Я этим и занимаюсь сейчас, пишу заметку
Vlad Brise
23 февраля 2019, 23:57
0
Я постоянно сталкиваюсь с задачами, решаю их и думаю, блин а как же круто было написать дополнение на основе этого, а потом смотрю, уже это придумали давным — давно. Единственное на что меня хватает, так это на какие-то готовые мини решения, которые я здесь публикую. А вообще я восхищаюсь, штамповать такое количество дополнение почти каждую неделю, это еще нужно постараться, респект, короче, есть на кого равняться :)
Vlad Brise
23 февраля 2019, 22:08
0
Андрей, ты просто нескончаемый генератор идей, как у тебя это получается? Делись секретами :D
Дополнение крутое, молодец :)
Vlad Brise
23 февраля 2019, 21:17
-2
Можно, я делал такое
Vlad Brise
18 февраля 2019, 23:08
0
Не плохо. Сейчас работаю над похожим проектом, только заказчик требует очень подробную статистику по заказам, товарам, какие товары зарезервированы пользователем, а какие нет, короче много всякой инфы и я решил делать такую црмку на Ларке, спустя месяц работы могу сказать, что MODX прекрасно работает вместе с Laravel и довольно шустро, мне кажется фронтенд статистику лучше делать на Ларе, чисто мое мнение.
Vlad Brise
04 января 2019, 14:34
0
Он не вызывается, а помещается в переменную, потом его можно вызывать. Мой способ уже не актуален, так как ему нужно по публикации выводить.
Vlad Brise
04 января 2019, 13:47
0
1 — означает опубликован. Я не пользовался стандартным синтаксисом уже сто лет, так что понятия не имею, просто включите феном и попробуйте, вы можете использовать два шаблонизатора
Vlad Brise
04 января 2019, 13:17
0
В таком случае
{if $_modx->resource.publishedon == 1}Содержимое{/if}
Но лучше первый вариант, если нет ресурсов, то ничего не выведет.
Vlad Brise
04 января 2019, 13:11
0
Лучше всего это делать на Fenom. Если я правильно понял ваш вопрос
{set $news = '!pdoResources'|snippet:[
    'parents' => 'айди ресурса с новостями'
  ]}
  {if $news}
    {$news} {*Здесь вызываем сниппет*}
  {/if}
Vlad Brise
20 декабря 2018, 01:05
+1
Был рад помочь:)
Vlad Brise
20 декабря 2018, 00:40
+2
Скорее всего это из-за какого-то расширения. У меня была похожая проблема. Установил MusVk и словил такой конфликт, удалите некоторые расширения и проверьте.
Vlad Brise
19 декабря 2018, 15:03
+2
Спасибо, но уже три месяца это работает и ни разу не было проблем. Как возникнут, сразу вспомню ваши слова :)
Vlad Brise
19 декабря 2018, 14:27
+2
У ЦБ есть определенный лимит подключений в определенный промежуток времени, не думаю, что стоит делать больше одного запроса в ЦБ. Я это уже проверял.