Как подружить pdoPage с выборкой дублей тикетов? Решено

Дополнение: pdoPage

[Решено] Мне необходимо вывести Тикеты, у которых есть чекбокс в ТВполе1, ТВполе2, ТВполе3. При том, что Тикет может иметь несколько включенных полей и в выборку должно попадать соответствующее количество дублей этого Тикета.
Простое условие в $where[0] = "(paneloff1 = 'Включить') OR (paneloff2 = 'Включить')OR (paneloff3 = 'Включить')"; — выбирает только «уникальные» значения.
Я добавил в снипет getTickets трехтактный цикл в секцию (// Fields to select).
Тогда getTickets выводит Тикеты с дублями, как требуется. Если обернуть getTickets в пагинацию, пагинация «ломается» и не работает. Похоже в pdoPage передаются только данные последнего запросы выборки = $pdoFetch->run();, а предыдущие не учитываются. Не могу понять откуда pdoPage из getTickets выбирает переменные total, totalVar и куда в getTickets отдает limit, offset.
Подскажите, пожалуйста, что тут можно сделать?
12 октября 2016, 01:00    Вадим   
1    448 0

Комментарии (10)

  1. Вадим 12 октября 2016, 21:07 # 0
    Ещё кто-нибудь, кроме Василия Наумкина, знает этот снипет?! Киньте хоть в какую сторону, где откапывать?!
    1. Вадим 13 октября 2016, 18:03 # -1
      Ну, и где наши мастодонты? Все тихаряться? Никто вам не поверит, что не знаете ответа на такой легкий вопрос для профи. Просыпайтесь господа!
      А я тем временем закинул в getTickets такую конструкцию
      $total = count($output);
      $totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');
      $modx->setPlaceholder($totalVar,$total);
      $limit=$modx->getOption('limit', $scriptProperties, 8);
      $offset=$modx->getOption('offset', $scriptProperties, 0);
      
      Чтобы скормить pdoPage количество тикетов для вывода. В пагинации теперь рисует две страницы- это правильно. А вот лимит в 8 игнорирует и выводит 10 тикетов, при переходе на вторую страницу показывает снова первую (считает такой переход ошибкой).
      Что еще поворошить? Подсказываем, не стесняемся, рассмотрю даже самые невероятные идеи.
      1. Вадим 16 октября 2016, 10:41 # 0
        Помочь кто-нибудь может?! Просим автора, Василий, не посчитайте за труд, бросьте взгляд пожалуйста! Мольба!
        1. Илья Уткин 16 октября 2016, 11:19 # +1
          Ответ-то есть, но готового решения никто не предоставит, так как задача довольно специфическая. Теория такая:

          Нужно производить выборку по объектам modTemplateVarResource, к каждому из которых «приджойнить» соответствующий ресурс (тикет), тогда у вас и будут соответствующие «дубли».

          А вот чтобы реализовать это на практике, нужно составить правильный запрос, для чего нужно создать тестовый сервер, создать эти ТВ-шки, несколько тикетов и тестировать. Это, конечно, долго и никто бесплатно делать этого не собирается.
          1. Вадим 16 октября 2016, 21:15 # 0
            Фу, выдохнул с облегчением, значит не вопиющий глас в пустыне! Спасибо за реплей!
            У меня большое желание сделать что-то самостоятельно, это приносит удовлетворение.
            Благодарю за пинок в нужном направлении :), а то я стал затухать, мне как раз не хватало идей, вариантов. Попробую поработать с объектами modTemplateVarResourc
            1. Вадим 20 октября 2016, 15:52 # 0
              Сделал вывод тикетов используя объекты modTemplateVarResource. Вы правы, это более грамотный подход.
              Но вопрос все равно остался открытым. pdoPage никак не оборачивает. В обычном режиме getTickets сам не заполняет плейсходер, а «total» устанавливается в placeholder для пагинации в pdoFetch когда запускается метод run. Так как я использую pdoFetch::getCollection и затем pdoFetch::getObject, то этот плайсходер не заполняется и пагинация тупит.
              1. Илья Уткин 24 октября 2016, 13:28 # 0
                Ну так total же можно и самостоятельно устанвить
                $modx->setPlaceholder($totalVar, $total);
                1. Вадим 25 октября 2016, 00:15 # 0
                  Да, я делал и писал об этом выше, пагинатор появлялся, но при попытке перехода на другие страницы сбрасывал на первую :(
            2. Вадим 25 октября 2016, 00:51 # 0
              помогло вот это решение — how-to-make-the-output-of-getcollection-with-pagination-pages
              Особая благодарность Илье Уткину за поддержку!
              1. Вадим 27 октября 2016, 14:10 # 0
                1. pdoPage из getTickets выбирает переменные total, totalVar через плэйсхолдер totalVar, который устанавливается в значение total в методе setTotal() класса pdoFetch при запуске метода run().
                2. pdoPage в getTickets отдает limit, offset через параметры $scriptProperties.
                Вы должны авторизоваться, чтобы оставлять комментарии.