Ошибка в коде подготовки коллекции товаров Принято

2

если я хочу добавить JOIN в коллекцию, я не могу задать собственный алиас, покажу в коде

например я хочу добавить такой джоин с таблицей shop_product_stocks то алиас получится ps1, так как я внедряю его через хук productsCollectionPrepared или productsCollectionFilter то на этом этапе еще не заджойнилась таблица артикулов, которая получит такой же алиас и будет конфликт..
но вроде как есть возможность по хитрому через массив задать все нужные параметры джойна, но нет, там ошибка

ниже код такого джойна где все параметры передаются как массив

ниже на скрине видно код самой функции построения джойна, если таблица передана в виде массива, все хорошо строки 3068, где переменная $table перестает быть массивом и переопределяется просто строкой с именем таблица, но нам дальше нужен массив! чтоб дальше передать его в функцию получения алиаса, ниже покажу сам код функции алиаса

вот код получения алиаса.. тут так же проверяется если это массив то мы получаем алиса по ключу alias.. но мы его ни когда не получим а поэтому всегда перейдем к автоматическом получению его и первых букв таблиц

почему в параметр 

$this->join_index

не попадает джоин я не знаю, так бы хотя бы цифра добавилась нужная если даже вручную алиас не получается задать

как обычно я предлагаю код решения

задача появилась из за этой проблемы https://support.webasyst.ru/forum/28318/sortirovka-v-poseleniyakh-s-uchetom-osnovnogo-sklada/

чтоб можно было сделать джоин с остатками по складам и по текущей витрине получить остатки склада и отсортировать

9 комментариев

  • -1

    пятерка за анализ кода и тройбан за смекалку.

     решение "хакерское":

    $method = new ReflectionMethod('shopProductCollection', 'getAlias');
    $method->setAccessible(true);
    $method->invoke($collection, ['table' => '...', 'alias' => '...']);
    

    решение "сын подруги":

    $collection->addJoin(['table' => ['table' => '...', 'alias' => '...'], ...], ...);


    • +2

      я использую готовый объект коллекции в хуке products_collection.prepared.. тут не идет речь о переопределении методов

      • 0

        где ты нашел переопределение метода?

        • +3

          а как ты предлагаешь уже у созданного объекта коллекции что то изменить??
          вот код к примеру обработчика хука products_collection.prepared

              public function productsCollectionPrepared($collection){
                  
                  $collection->addJoin([
                      'table'=>'shop_product_stocks',
                      'alias'=>'sps',
                      'on'=>'p.id=sps1.product_id',
                      'type'=>'LEFT',
                  ]);
              }
              

          второй вариант решения тоже не подойдет, с вложенным массивом, на строчке 3081 попадет массив, в sql вместо имени таблицы будет array.. 

          в моем случае нет возможности наследовать класс shopProductsCollection  для переопределения метода addJoin и/или использовать там рефлексию с вызовом метода getAlias, так как объект уже создан.. так какие варианты без исправления ошибки кода разработчиками? и я вообще не понял этих умных комментов, вы наверно привыкли изворачиваться с вебасистом, а не сообщать об ошибках которые исправить меньше минуты

        • -2

              public function productsCollectionPrepared($collection)
              {
                  $method = new ReflectionMethod('shopProductCollection', 'getAlias');
                  $method->setAccessible(true);
                  $method->invoke($collection, ['table'=> 'shop_product_stocks', 'alias'=> 'sps']);
                  $collection->addJoin([
                      'table'=>'shop_product_stocks',
                      'alias'=>'sps',
                      'on'=>'p.id=sps1.product_id',
                      'type'=>'LEFT',
                  ]);
              }

        • +1

          я думал проблема в том что таблица shop_product_skus подключается позже и с $this->join_index какая то ошибка, но нет.. там просто хардкодинг алиаса ps1

          нет чтоб для для этой таблицы сделать нормальный уникальный алиас, разработчики хардкодят тот который генерится автоматом и не подумали о том что такой же алиас может быть и с другой таблицей

          у меня же конкретно ошибка возникала из за этого

          тупо если есть хоть один алиас PS в таблице индексов то добавляется такая выборка

          Добавить комментарий

          Чтобы добавить комментарий, зарегистрируйтесь или войдите