Vlad Brise

Vlad Brise

С нами с 02 мая 2018; Место в рейтинге пользователей: #45
Vlad Brise
21 марта 2019, 10:01
0
Ну ручками добавить, если выводятся инпуты циклом то:
{foreach ['email','city','index',] as $field}
    {if $field === 'email'} {*перечислить поля к которым нужно добавить*}
    <div class="form-group required">
      <input type="text" id="email" placeholder="Email" name="email" value="" class="form-control">
    </div>
    {/if}
{/foreach}
Vlad Brise
18 марта 2019, 22:20
+1
очень круто! Ваня молодец, заморочился :)
Vlad Brise
15 марта 2019, 20:48
0
Я не силен в extJs, много чего не знаю, но за советы, спасибо, я то хочу сделать максимально правильно.
Vlad Brise
15 марта 2019, 19:46
0
Спасибо за подсказку, похоже у меня дефицит внимания разыгрался.
Я то хотел проверить контекст web, и не заметил что поставил восклицательный знак вначале, сейчас исправлю :)
Vlad Brise
15 марта 2019, 15:53
+1
Исправил дыры в безопасности, убрал сырые запросы и поставил проверку пользователя, теперь все по человечески. Прошу прощения за говнокод.
Vlad Brise
13 марта 2019, 12:40
0
Не будет, там метод создания пользователя минишопа, которому даются стандартные права user-member
Vlad Brise
13 марта 2019, 12:06
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:21
0
Интересно, а если пользователь случайно нажал обновить, то ему заново придётся фильтры включать. Или это нормальная практика?
Vlad Brise
23 февраля 2019, 21:17
-2
Можно, я делал такое