Как в modExtra добавить выпадающий список с категориями товара minishop2?

Всем привет. Столкнулся с проблемкой, не могу вывести, при создании или редактировании записей в своём компоненте, список категорий товаров из minishop2. Недавно только освоил добавление выпадающих списков и сохранение id из другой таблицы. Как я понимаю все категории храняттся в modResource с class_key = msCategory.

Пробовал в контроллере добавлять 3 js из minishop2 и прописывать xtype: «minishop2-combo-category», но это не прокатывает.

$this->addJavascript($this->miniShop2->config['jsUrl'] . 'mgr/minishop2.js');
        $this->addJavascript($this->miniShop2->config['jsUrl'] . 'mgr/misc/ms2.utils.js');
        $this->addJavascript($this->miniShop2->config['jsUrl'] . 'mgr/misc/ms2.combo.js');
Как вывести при редактировании или создании категории товаров из minishop2?
SEQUEL.ONE
26 февраля 2019, 09:56
modx.pro
1
670
0

Комментарии: 4

Наумов Алексей
26 февраля 2019, 11:31
0
Попробуй
xtype="minishop2-combo-category"
github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/misc/ms2.combo.js#L89

Если не прокатит или не тот функционал, сделай по аналогии свой xtype, только про процессор (который mgr/category/getcats ) не забудь, что он тоже нужен.
    SEQUEL.ONE
    26 февраля 2019, 11:53
    0
    А как правильно прописать путь для

    mgr/category/getcats
    По умолчанию он же будет искать в директории моего компонента или мне нужно будет создать у себя этот процессор?
      SEQUEL.ONE
      26 февраля 2019, 13:05
      0
      Всё получилось. Только вот не могу разобраться как можно сделать выборку по указаным категориям. Мне выводит все созданные, а хотелось бы чтобы выводило только указанные. Я так понимаю это здесь можно указать:

      <?php
      
      class PayPanelCategoryGetCatsProcessor extends modObjectGetListProcessor
      {
          public $classKey = 'msCategory';
          public $defaultSortField = 'id';
          public $defaultSortDirection = 'ASC';
          protected $item_id = 0;
      
      
          /**
           * @return bool
           */
          public function initialize()
          {
              if ($this->getProperty('combo') && !$this->getProperty('limit') && $id = (int)$this->getProperty('id')) {
                  $this->item_id = $id;
              }
              $this->setDefaultProperties(array(
                  'start' => 0,
                  'limit' => 20,
                  'sort' => $this->defaultSortField,
                  'dir' => $this->defaultSortDirection,
                  'combo' => false,
                  'query' => '',
              ));
      
              return true;
          }
      
      
          /**
           * @return array|string
           */
          public function process()
          {
              $beforeQuery = $this->beforeQuery();
              if ($beforeQuery !== true) {
                  return $this->failure($beforeQuery);
              }
              $data = $this->getData();
              $list = $this->iterate($data);
      
              return $this->outputArray($list, $data['total']);
          }
      
      
          /**
           * @return array
           */
          public function getData()
          {
              $data = array();
              $limit = intval($this->getProperty('limit'));
              $start = intval($this->getProperty('start'));
      
              /* query for chunks */
              $c = $this->modx->newQuery($this->classKey);
              $c = $this->prepareQueryBeforeCount($c);
              $data['total'] = $this->modx->getCount($this->classKey, $c);
              $c = $this->prepareQueryAfterCount($c);
      
              $sortClassKey = $this->getSortClassKey();
              $sortKey = $this->modx->getSelectColumns($sortClassKey, $this->getProperty('sortAlias', $sortClassKey), '',
                  array($this->getProperty('sort')));
              if (empty($sortKey)) {
                  $sortKey = $this->getProperty('sort');
              }
              $c->sortby($sortKey, $this->getProperty('dir'));
              if ($limit > 0) {
                  $c->limit($limit, $start);
              }
      
              if ($c->prepare() && $c->stmt->execute()) {
                  $data['results'] = $c->stmt->fetchAll(PDO::FETCH_ASSOC);
              }
      
              return $data;
          }
      
      
          /**
           * @param array $data
           *
           * @return array
           */
          public function iterate(array $data)
          {
              $list = array();
              $list = $this->beforeIteration($list);
              $this->currentIndex = 0;
              /** @var xPDOObject|modAccessibleObject $object */
              foreach ($data['results'] as $array) {
                  $objectArray = $this->prepareResult($array);
                  if (!empty($objectArray) && is_array($objectArray)) {
                      $list[] = $objectArray;
                      $this->currentIndex++;
                  }
              }
              $list = $this->afterIteration($list);
      
              return $list;
          }
      
      
          /**
           * @param xPDOQuery $c
           *
           * @return xPDOQuery
           */
          public function prepareQueryBeforeCount(xPDOQuery $c)
          {
              $c->select('id,parent,pagetitle,context_key');
              $c->where(array(
                  'class_key' => 'msCategory',
              ));
      
              if ($this->item_id) {
                  $c->where(array('id' => $this->item_id));
              } elseif ($query = $this->getProperty('query')) {
                  $c->where(array('pagetitle:LIKE' => "%$query%"));
              }
      
              return $c;
          }
      
      
          /**
           * @param array $resourceArray
           *
           * @return array
           */
          public function prepareResult(array $resourceArray)
          {
              $resourceArray['parents'] = array();
              $parents = $this->modx->getParentIds($resourceArray['id'], 2,
                  array('context' => $resourceArray['context_key']));
              if ($parents[count($parents) - 1] == 0) {
                  unset($parents[count($parents) - 1]);
              }
              if (!empty($parents) && is_array($parents)) {
                  $q = $this->modx->newQuery('msCategory', array('id:IN' => $parents));
                  $q->select('id,pagetitle');
                  if ($q->prepare() && $q->stmt->execute()) {
                      while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
                          $key = array_search($row['id'], $parents);
                          if ($key !== false) {
                              $parents[$key] = $row;
                          }
                      }
                  }
                  $resourceArray['parents'] = array_reverse($parents);
              }
      
              return $resourceArray;
          }
      
      }
      
      return 'PayPanelCategoryGetCatsProcessor';
        Наумов Алексей
        26 февраля 2019, 17:03
        0
        Чет много кода))

        Смотри, пример процессора, который выдает список категорий из Tickets. При этом они фильтруются по введенному пользователю значению (поиск по pagetitle).

        <?php
        
        class boardAdvertCategoryGetListProcessor extends modObjectGetListProcessor
        {
            public $classKey = 'TicketsSection';
            public $languageTopics = array('resource');
            public $defaultSortField = 'pagetitle';
        
            /** {@inheritDoc} */
            public function prepareQueryBeforeCount(xPDOQuery $c) {
        
                if ($this->getProperty('combo')) {
                    $c->leftJoin('modResource','Rubric','`TicketsSection`.`parent` = `Rubric`.`id`');
                    $c->select($this->modx->getSelectColumns($this->classKey, $this->classKey, ''));
                    $c->select('`Rubric`.`pagetitle` as `rubric`');
                }
                else {
                    $c->select($this->modx->getSelectColumns($this->classKey, $this->classKey, ''));
                }
                $query = $this->getProperty('query');
                $c->where(array('class_key' => 'TicketsSection'));
                if (!empty($query)) {
                    $c->where(array('pagetitle:LIKE' => '%'.$query.'%'));
                }
        
                $id = $this->getProperty('id');
                if (!empty($id)) {
                    $c->where(array('id' => $id));
                }
                return $c;
            }
            /** {@inheritDoc} */
            public function prepareRow(xPDOObject $object) {
                if ($this->getProperty('combo')) {
                    $array = array(
                        'id' => $object->get('id'),
                        'pagetitle' => $object->get('pagetitle'),
                        'rubric' => $object->get('rubric'),
                    );
                }
                else {
                    $array = $object->toArray();
                }
                return $array;
            }
        }
        
        return 'boardAdvertCategoryGetListProcessor';
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4