CMS moguta cms

Ну что, всех можно поздравить.
Усилена защита файлов Moguta.CMS
С ростом популярности проекта стало увеличаться число пиратских копий, которые часто содержат в себе вредоносные файлы и ломают часть функций системы, тем самым портят репутациию компании и впечатления о продукте в целом.
В связи с этим мы зашифровали файлы ядра движка программой IonCube и теперь на хостинге клиента обязательно должен быть установлен модуль Ioncube loader. К счастью большинство современных хостингов уже соответствуют этому требованию.
Разработчики идиоты, если решили использовать IonCube. С чего они взяли, что их система популярна? Про нее вообще почти никто не знает и популярность ее была обеспечена только из-за того, что ей пользовались так называемые "пираты". Так вот эти пираты и могли стать в конечном счете покупателями движка. А теперь с этим IonCube разработчики пусть сами едят свой продукт.
 
Интересует как настроить горизонтальный фильтр товаров в шаблоне Для просмотра ссылки Войди или Зарегистрируйся пробежался поиском по ветке форума - решения не нашел, также обратил внимание на то что не у одного меня Для просмотра ссылки Войди или Зарегистрируйся вместо выпадающего списка значений характеристик товаров знак "?" если брать другой шаблон - все нормально Подразумеваю что как то неправильно что то делаю...
 
Последнее редактирование:
А у кого-то получилось установить гипермаркет? У меня на хосте версия пхп 5.4, скачал соответствующий релиз а оно 500 ошибку выдает. (что это за ошибка знаю и возможные меры принял)
На php5.6 прекрасно встал. На 7.0 и 7.1 не хочет.
 
А у кого-то получилось установить гипермаркет? У меня на хосте версия пхп 5.4, скачал соответствующий релиз а оно 500 ошибку выдает. (что это за ошибка знаю и возможные меры принял)
На версии PHP - 5.5.35 встал без проблем.
 
А есть уже у кого то установщик гипермаркета ?)
поделитесь ? хочу поклацать.
 
А есть уже у кого то установщик гипермаркета ?)
поделитесь ? хочу поклацать.
Скачать можно на оф сайте Бета версию.
<-------------- добавлено через 297 сек. -------------->
А есть уже у кого то установщик гипермаркета ?)
поделитесь ? хочу поклацать.
Более точно:
Скрытое содержимое доступно для зарегистрированных пользователей!
 
Давайте разберемся в этом вопросе.
В файле mg-core/lib/actioner.php есть такой кусок
PHP:
  /**
   * Получает данные по вводимому email в форме заказа.
   * @return boolean
   */
  public function getUserEmail() {
    $emails = array('mark-avdeev@mail.ru', 'mark-avdeev2@mail.ru');
    $this->data = $emails;
    return true;
  }
Это метод класса Actioner. Сам по себе он ничего не делает, а вот его вызовов найти не удалось. Поэтому предлагаю проверить отсылается там что-то или нет следующим образом. Замените в массиве адреса почты 'mark-avdeev@mail.ru', 'mark-avdeev2@mail.ru' на свои или на один свой и посмотрите, что вам придет на почту и придет ли.
Например:
PHP:
    public function getUserEmail() {
    $emails = array('my-poshta@mail.ru');
    $this->data = $emails;
    return true;
  }
Поковырялся. Как видно по самой функции она совершенно тупая, видимо это какой-то зародыш, который ничем не стал. Вызовов этой функции я тоже не нашел. Так что по-моему ложная тревога.
 
Куда ни сунься, везде все допиливать руками приходится.

Стандартный импорт csv в могуте умеет делать импорт изображений по ссылке при условии включения соотв. настройки в config.ini

Код:
; загрузка изображений по ссылкам из csv
HTTP_IMGCSV_DOWNLOAD = 1

Импорт по ссылке работает, но только если у вас там 1 изображение, т.е. несколько ссылок не принимаются. Чтобы исправить этот недостаток я поправил метод createProduct в классе import (файл /mg-core/lib/import.php)

Это переделанный метод. Линиями выделен измененный кусок.
PHP:
  /**
   * Создает продукт в БД если его не было.
   * @param type $product - массив с данными о продукте.
   * @param type $catId - категория к которой относится продукт.
   */
  public function createProduct($product, $catId = null) {

    $model = new Models_Product();
    $variant = $product['variant'];
    $img_var = $product['image'];
    $property = $product['property'];
    $product['price'] = MG::numberDeFormat($product['price']);
    $product['old_price'] = MG::numberDeFormat($product['old_price']);
    unset($product['cat_url']);
    unset($product['variant']);
    unset($product['image']);
    unset($product['property']);
//************************************************
    //Если у нас несколько изображений, качаем их по очереди
    $images = explode('|', $product['image_url']);
    if(is_array($images)){
        foreach($images as &$image){
            self::$downloadLink==false;
            // если в строке содержится ссылка
            if (strpos($image, "http:") !== false|| strpos($image, "https:") !== false) {
                self::$downloadLink = true;
                $this->downloadImgFromSite($image);
                $image = basename($image);
            }
        }
        $product['image_url'] = implode('|', $images);
    }
  
    //если у нас в изображениях есть доп. параметры, вытащим их оттуда
    if(strpos($product['image_url'], '[:param:]')!==false) {
        // Парсим изображение, его alt и title.
      $images = $this->parseImgSeo($product['image_url']);
      $product['image_url'] = $images[0];
      $product['image_alt'] = $images[1];
      $product['image_title'] = $images[2];  

    }
//************************************************
    if($catId === null){
      // 1 находим ID категории по заданному пути.
      $product['cat_id'] = MG::translitIt($product['cat_id'], 1);
      $product['cat_id'] = URL::prepareUrl($product['cat_id']);

      if($product['cat_id']){
        $product['cat_id'] = (empty($product['cat_id'])) ? $product['cat_url'] : $product['cat_id'];
      
        $url = URL::parsePageUrl($product['cat_id']);
        $parentUrl = URL::parseParentUrl($product['cat_id']);
        $parentUrl = $parentUrl != '/' ? $parentUrl : '';              
      
        $cat = MG::get('category')->getCategoryByUrl($url, $parentUrl);    
        $product['cat_id'] = $cat['id'];
      }
    }else{
      $product['cat_id'] = $catId;
    }

    if($catId == -1){
      unset($product['cat_id']);
    }else{
      $product['cat_id'] = !empty($product['cat_id']) ? $product['cat_id'] : 0;
    }  
  
    if(!empty($product['id'])&&  is_numeric($product['id'])){  
        $dbRes = DB::query('SELECT `id`, `url`, `title` FROM `'.PREFIX.'product` WHERE `id` = '.DB::quote($product['id'], 1));
    
      if($res = DB::fetchArray($dbRes)){      
        if($res['title'] == $product['title']){
          $product['url'] = $res['url'];
        }      
         unset($product['id']);
      }else{
        if(empty($_SESSION['csv_import_full'])){
          $_SESSION['csv_import_full'] = 'y';
          $this->formateMogutaCMS(self::$fullProduct, true);
          return;
        }else{
          unset($_SESSION['csv_import_full']);
        }      
        $arrProd = $model->addProduct($product);              
      }            
    }  
  
    if(empty($arrProd)){
      // 2 если URL не задан в файле, то транслитирируем его из названия товара.
      $product['url'] = !empty($product['url'])?$product['url']:preg_replace('~-+~','-',MG::translitIt($product['title'], 0));
      $product['url'] = str_replace(array(':', '/'),array('', '-'),$product['url']);
      $product['url'] = URL::prepareUrl($product['url'], true);  

    
      if($_POST['identifyType'] == 'name'){
        if(empty($product['cat_id']) || $product['cat_id'] == 0){
          $alreadyProduct = $model->getProductByUrl($product['url']);
        }else{
          $alreadyProduct = $model->getProductByUrl($product['url'], $product['cat_id']);
        }
      }elseif(!empty($product['code'])){
        $res = DB::query('
          SELECT id, url
          FROM `'.PREFIX.'product`
          WHERE code = '.DB::quote($product['code'])
        );
      
        $alreadyProduct = DB::fetchAssoc($res);
      
        if(!$alreadyProduct){
          $res = DB::query('
            SELECT p.id, p.url
            FROM `'.PREFIX.'product` p
              LEFT JOIN `'.PREFIX.'product_variant` pv
                ON pv.product_id = p.id
            WHERE pv.code = '.DB::quote($product['code'])
          );
        
          $alreadyProduct = DB::fetchAssoc($res);
        }
      
        if(empty($alreadyProduct)){
          if($product['cat_id'] == 0){
            $alreadyProduct = $model->getProductByUrl($product['url']);
          }else{
            $alreadyProduct = $model->getProductByUrl($product['url'], $product['cat_id']);
          }
        }
      }  

      // Если в базе найден этот продукт, то при обновлении будет сохранен ID и URL.
      if(!empty($alreadyProduct['id'])){
        $product['id'] = $alreadyProduct['id'];
        $product['url'] = $alreadyProduct['url'];
      }
    
      if(empty($_SESSION['csv_import_full']) && (empty($alreadyProduct['id']) || !empty($variant))){
        $_SESSION['csv_import_full'] = 'y';
        $this->formateMogutaCMS(self::$fullProduct, true);
        return;
      }else{
        unset($_SESSION['csv_import_full']);
      }
    
      // обновляем товар, если его не было то метод вернет массив с параметрами вновь созданного товара, в том числе и ID. Иначе  вернет true      
      $arrProd = $model->updateProduct($product);
    }
      
    $product_id = $product['id']?$product['id']:$arrProd['id'];  
    $categoryId = $product['cat_id'];
    $productId = $product_id;
    $listProperty = $property;
    $arrProperty = $this->parseListProperty($listProperty);

    foreach($arrProperty as $key => $value){
      $type = 'string';
      $data = '';
      // Если характеристика сложная, то выделим параметры - тип, значение, наценки.
      if ($value[0]=='['&&$value[strlen($value)-1]==']'&&stristr($value, 'type')!== FALSE
        &&stristr($value, 'value')!== FALSE&&stristr($value, 'product_margin')!== FALSE) {
        if(preg_match("/type=([^&]*)value/", $value, $matches))  {
          $type = trim($matches[1]);
        }
        if(preg_match("/value=([^&]*)product_margin/", $value, $matches))  {
          $value_prop = trim($matches[1]);
        }
        if(preg_match("/product_margin=([^&]*)]/", $value, $matches))  {
          $data = trim($matches[1]);
        }
        $value = $value_prop;
      }
      $this->createProperty($key, $value, $categoryId, $productId, $type, $data);
    }
    if(!$variant){
      return true;
    }
  
    $var = $model->getVariants($product['id'], $variant);
    $varUpdate = null;
  
    if(!empty($var)){
      foreach($var as $k => $v){
        if($v['title_variant'] == $variant && $v['product_id'] == $product_id){
          $varUpdate = $v['id'];
        }
      }
    }

    // Иначе обновляем существующую запись в таблице вариантов.
    $varFields = array(    
      'price',
      'old_price',
      'count',
      'code',
      'weight',
      'activity',
      'currency_iso'
    );
  
    $newVariant = array(
      'product_id' => $product_id,
      'title_variant' => $variant,
    );
  
    if($img_var){
      $newVariant['image'] = $img_var;
    }
  
    if($_POST['schemeType'] != 'default'){
      foreach(self::$notUpdate as $id){
        $notUpdateFields[$id] = self::$fields[$this->typeCatalog][$id];
      }  
    }      
  
    foreach($varFields as $field){
      if(isset($product[$field])){
        if(!in_array($field, $notUpdateFields)){
          $newVariant[$field] = $product[$field];
        }      
      }
    }
  
    $model->importUpdateProductVariant($varUpdate, $newVariant, $product_id);

    // Обновляем продукт по первому варианту.
    $res = DB::query('
      SELECT  pv.*
      FROM `'.PREFIX.'product_variant` pv  
      WHERE pv.product_id = '.DB::quote($product_id).'
      ORDER BY sort
    ');
    if($row = DB::fetchAssoc($res)){

      if(!empty($row)){
        if($product['title']){
          $row['title'] = $product['title'];
        }      
      
        $row['id'] = $row['product_id'];
        unset($row['image']);
        unset($row['sort']);
        unset($row['title_variant']);
        unset($row['product_id']);
        $model->updateProduct($row);
      }
    }
  }
 
Последнее редактирование:
Давайте разберемся в этом вопросе.
В файле mg-core/lib/actioner.php есть такой кусок
PHP:
  /**
   * Получает данные по вводимому email в форме заказа.
   * @return boolean
   */
  public function getUserEmail() {
    $emails = array('mark-avdeev@mail.ru', 'mark-avdeev2@mail.ru');
    $this->data = $emails;
    return true;
  }
Это метод класса Actioner. Сам по себе он ничего не делает, а вот его вызовов найти не удалось. Поэтому предлагаю проверить отсылается там что-то или нет следующим образом. Замените в массиве адреса почты 'mark-avdeev@mail.ru', 'mark-avdeev2@mail.ru' на свои или на один свой и посмотрите, что вам придет на почту и придет ли.
Например:
PHP:
    public function getUserEmail() {
    $emails = array('my-poshta@mail.ru');
    $this->data = $emails;
    return true;
  }
Официально подтверждаю отсылка писем осуществляется!
2017-10-10_19-02-41.png

Поковырялся. Как видно по самой функции она совершенно тупая, видимо это какой-то зародыш, который ничем не стал. Вызовов этой функции я тоже не нашел. Так что по-моему ложная тревога.
А вызывается эта функция сбоем. я тестировал загрузку фотографий и т.д. при загрузке вышел сбой! вылезла техническая информация с низу админки и тут же пришло сообщение мне на почту на ту которую я изменил в
PHP:
/**
   * Получает данные по вводимому email в форме заказа.
   * @return boolean
   */
  public function getUserEmail() {
    $emails = array('mark-avdeev@mail.ru', 'mark-avdeev2@mail.ru');
    $this->data = $emails;
    return true;
  }
 
Последнее редактирование модератором:
Официально подтверждаю отсылка писем осуществляется!
Для просмотра ссылки Войди или Зарегистрируйся
Это сообщение формируется function sendBugReport() в файле actioner.php. При возникновении ошибок в админке отправляется отчет на support@moguta.ru.
 
Назад
Сверху