Сергей

Сергей

С нами с 11 мая 2015; Место в рейтинге пользователей: #354
Fi1osof
06 августа 2019, 11:17
2
+5
Вообще, если говорить про серверную часть и насколько хорош php и плох js, я бы посмотрел вот на что: измучивший всех phpThumb. Вот никогда не испытывал кайфа с ним. А в какой-то момент он вообще с задачей не справился и мне пришлось юзать Imagick (и довольно много написать кода под решение задачи). В MODX до сих пор юзается этот динозавр phpThumb.

1. Вопрос: кто вообще что-то на замену phpThumb юзает?

2. Уже от меня: покопав интернеты, для php манипуляции изображениями сейчас вроде самая популярная эта либа: github.com/avalanche123/Imagine
3700+ звезд и проект живой.
Вот для себя в JS я использую github.com/lovell/sharp
13 600+ звезд. Это на порядок больше.
И на мой взгляд библиотека в разы просто качественней чем любая php-библиотека для работы с картинками, с которой я сталкивался.

И я скажу, что если сравнивать качество библиотек и документации по php и js, то php только за это вспоминаю как страшный сон. Может сейчас с композером экосистема php и меняется к лучшему, но я этого на себе не успел ощутить. А вот с js ориентироваться гораздо проще и удобней. И этому есть еще как минимум пара сопутствующих моментов:
1. Работающие примеры. Что вы делаете, когда смотрите пример кода на php? Правильно — как-то разворачиваете у себя и тестируете. А если версия php не та? А если какой либы не хватает? Сам процесс тестирования php — это гемор.
А что мы имеем с JS? codesandbox.io/ codepen.io/ jsfiddle.net/ stackblitz.com/ и еще 100500 сервисов (включая отладку в IDE).
Если я что-то ищу, прежде чем реально потянуть себе на сервер это, я могу за минуту оттестировать и решить для себя надо оно мне или нет.
2. Более активное сообщество. Вероятней всего вытекает из первого. Так как вся инфраструктура js значительно более активная и живая, и сообщество тоже живое. На гитхабе часто получаешь ответы очень оперативно. А по трендовым компонентам жизнь бурлит буквально ежеминутно.
Сергей Шлоков
15 мая 2019, 20:30
3
+2
Статья в стиле профессиональных журналистов. Заголовок об одном, статья о другом. И в итоге — «есть ли жизнь на Марсе или не жизни на Марсе, науке не известно». )

Ну так можно украсть?
Хоть бы слово сказал, где был этот сниффер. Т.е. загружался откуда то или файл был залит на сервер? Это разные вектора атаки.

Вообще, тема безопасности будет подниматься всё чаще. Информатизация общества. Интел опять заявил о дырке в процессоре. На хабре попадалась статья про расширения браузера, сливающие данные. А ещё недобросовестные разработчики — недавно Николай Ланец выкладывал ссылку про очень известное дополнение для Node.js, которое воровало биткоины. Плюс огромная армия младоразработчиков, которые умудряются оставлять дырки даже в статических файлах или устраиваются работать в крутые студии. И в результате видим такое. Да даже Facebook хранил пароли в открытом виде.
Самая главная уязвимость — человек. )

П.С. Оставлю тут, может кому пригодится.
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';
Лично мне так удобнее, не знаю как остальным, но решение рабочее.
Мы просто используем методы минишоповского класса создания заказа, и будет все точно так же как и при стандартном оформлении, даже сообщение пользователю придет.
Никита
11 февраля 2019, 22:32
1
0
Фронт компилишь двумя путями, с двумя конфигами для запросов
1) dev сервер. Среда разработки веб-приложения на vue.js собираемая вебпаком. В алиас конфигов дева и прода кидаем два разных пути. dev и prod. Запросы по api осуществляются через import config from 'config'.
axios.get(config.index.get)…

2) пишем в этот конфиг все url для ajax-запросов.
3) создаём папку на сервере со скриптами, в роли обработчиков запросов. Указываем в modx о том что это статичные сниппеты и возвращаем данные в json. На место чанка писать в json никто не запрещает
Илья
17 мая 2018, 13:45
1
0
Спасибо!

Вот, для всех кто ищет ответ:
[[+ms2g.1]] - {'ms2g.1' | placeholder}
[[+ms2g.0.url]] - {'ms2g.0.url' | placeholder}
[[+ms2g.0.description]] - {'ms2g.0.description' | placeholder}
[[+ms2g.0.190x143]] - {'ms2g.0.214x143' | placeholder}
Денис
19 декабря 2017, 12:01
1
+1
Значения фильтров и так сортируются по алфавиту, точнее с помощью функции natcasesort. Настроить их просто так нельзя. Вам нужно создать свой класс обработчик фильтра, наследуемый от класса mse2FiltersHandler, который находится в файле core/components/msearch2/model/msearch2/filters.class.php и переопределить метод sortFilters, а после указать его(свой класс) в системной настройке mse2_filters_handler_class.
Володя
20 октября 2017, 16:51
1
0
насколько я знаю есть событие msieOnCompleteImportProduct
окончание импорта всех продуктов. Вот и напишите плагин на него.
и лучше сделать что то в таком роде
$table = $modx->getTableName('msProductData');
foreach (array('price','old_price') as $field) {
	$sql = "UPDATE {$table} SET {$field} = Ceil({$field}) WHERE {$field} > 0";
        $q = $modx->prepare($sql);
        $q->execute();
}
это будет быстрее чем getCollection и цикл.

ps. Код не проверял.
Володя
21 августа 2017, 12:33
1
+1
вызовите его самостоятельно
$res->save();
$modx->invokeEvent('OnDocFormSave',array(
                'mode' => modSystemEvent::MODE_UPD,
                'id' => $res->get('id'),
                'resource' => &$res,
                'object' => &$res,
            ));
Илья Уткин
17 февраля 2017, 08:35
1
+1
Запросы INSERT и UPDATE на PDO (but1head где-то поделился, я к себе утащил)
Игорь
10 февраля 2017, 04:45
3
+1
Однако остался нерешенный момент с файлом robots.txt, а именно строкой Host:

В контексте создаем и публикуем ресурс (например, robots.txt) с пустым шаблоном: тип ресурса — документ, тип содержимого — text, псевдоним — robots. В содержимое пишем:
User-agent: *
Allow: /
Host: [[++http_host]]
Sitemap: [[++site_url]]sitemap.xml