We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 31022
    • 328 Posts
    Здравствуйте!

    Создаю каталог на Дитто, производителя товара делаю tv, DropDownList. Возможные значения первоначально были такими:
    @SELECT `pagetitle` FROM `modx_site_content` WHERE `parent` = "5"


    В итоге появлялся этот самый лист со списком названий документов в определенной папке (id=5). Эта папка была как раз про производителей, а каждый документ, соответственно, информацией о конкретной фабрике.

    В процессе появилась необходимость разбить производителей по категориям товаров: одни фабрики производят елки, вторые производят палки. В структуре это было осуществлено добавлением в папку с фабриками подпапок по категориям, в которых, собственно, находились сами фабрики.

    И запрос для tv переделался:
    @SELECT `pagetitle` FROM `modx_site_content` WHERE `parent` = "99" OR `parent` = "100" OR `parent` = "101" OR `parent` = "102"


    Где 99, 100, 101, 102 это id категорий.

    А теперь вот вопрос. Я, конечно, понимаю, что последний представленный запрос работает. Но только до тех пор, пока не появится новая категория для производителей. И придется его переделать.

    Какой запрос (и можно ли вообще) составить, чтобы выдавался именно второй уровень иерархии? Или есть другой путь?

    Спасибо!

    UPD. Cейчас пробую создать сниппет, который выводит список id категорий, а потом прикручу его либо через @CODE, либо @CHUNK. Дело за малым. Написать код, который выводит список id с определенным родительским документом. Посоветуйте чего-нибудь по php почитать, а? Не справочник, а учебник только.
      • 31022
      • 328 Posts
      Покурил php маленько, посмотрел GetTitleParent и вот что насоставлял:
      $query = "SELECT alias FROM ".$modx->db->config['table_prefix']."site_content WHERE parent = 5";
      $result = mysql_query($query);
      $num = mysql_num_rows($result);
      print "Количество документов: $num <br>"; //это я для проверки, работает вообще или нет. Выводит правильное количество.
      
      while($rowz = mysql_fetch_array($result));
      
      print $rowz['alias']."zzz2!<br>"; // zzz2 и zzz тоже проверка.
      print "zzz!";
      
      end; // в учебниках здесь пишут endwhile;, но мне на это почему-то выдается unexpected T_ENDWHILE. А на end; ничего не выдается.
      


      Подскажите, если не сложно, в чем я ошибаюсь? Здесь я хочу получить список алиасов документов с родительским id=5.
        • 785
        • 2,113 Posts
        Чтобы получить такой список, нужен примерно такой сниппет:
        $tblsc= $modx->getFullTableName("site_content");
        $parent=5;
        $query = "SELECT alias FROM $tblsc WHERE parent=$parent";
        $result= $modx->db->query($query);
        $output= "";
        while ($row = $modx->db->getRow($result)) {
        	$output.= ($row['alias'])." ";
        }
        print $output;
          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 31022
          • 328 Posts
          AKots, спасибо большое за твой пост. Я начал сравнивать и понял, что главный косяк моего скрипта -- цикл while. Спасибо, а то бы я еще очень долго долбался с ним.

          Переделал маленько скрипт под Главную Задачу (: . Теперь я использую вложенный цикл while, чтобы получить pagetitle дочерних документов для разделов каталога. Ведь все это создавалось для того, чтобы в tv при заполнении товара можно было выбрать фабрику-производителя, а они разбилисьна категории и простая привязка @SELECT не сработала. Вот из-за чего сырбор.

          Теперь, что делаю я. Сниппет getFactories выдает мне искомые pagetitle. Вот его код:
          <?php
          $query = "SELECT id FROM ".$modx->db->config['table_prefix']."site_content WHERE parent = 5";
          $result = mysql_query($query);
          while($rowz = mysql_fetch_assoc($result)) {
          
            $query2 = "SELECT pagetitle FROM modx_site_content WHERE parent = ".$rowz['id'];
            $result2 = mysql_query($query2);
            while($rows = mysql_fetch_assoc($result2)) {
              print $rows['pagetitle']."||";
            };
          
          };
          
          ?>
          


          Теперь я хочу запихнуть результат работы сниппета в tv (даже разделитель предусмотрительно сделал (: ). Доки говорят нам, что есть привязка @CHUNK. Ок. Создаю чанк getFactoriesChunk, а из него запускаю $modx->runSnippet(’getFactories’); И,естественно, вызываю в возможных значениях tv: @CHUNK getFactoriesChunk.

          В итоге на странице редактирования товара в поле редактирования tv он пишет заветное $modx->runSnippet(’getFactories’); и все.

          Как всавить результат работы сниппета в возможные значения tv?

          UPD. Попробовал @EVAL и весь сниппет одной строкой. В принципе, получилось. Но не то. Он выдает *строку* "Фабрика 1||Фабрика 2||Фабрика 3||..." и только после нее *пустой* DropDownList. Как быть?
            • 31022
            • 328 Posts
            Есть предположение, что это связано с типом данных.

            Когда последний оператор в предыдущем коде -- print, возвращается строка, как я понимаю. И она не подходит для DropDownList. Когда я ставлю вместо него return, первый элемент массива влезает в выпадающее меню, но только первый. Это если без завершения ."||" Если поставить такую добавку (разделитель возможных значений tv), то появляется дополнительное пусто место: строка, если это выпадающий список, пустой чекбокс, если это чекбокс и т.п.

            Как же вывести полный массив?

            upd. поменял название темы.
              • 31022
              • 328 Posts
              А когда в конце возвращаю весь результат второго запроса, то в возможных значениях tv появляются-таки нужные имена документов, но только первого подраздела. Дальше почему-то перебор while не идет. Или идет, но результат берется только первого раздела. Такой код:

              
              $query = "SELECT id FROM ".$modx->db->config['table_prefix']."site_content WHERE parent = 5"; // спрашиваем id документов, с родителем id=5
              $result = mysql_query($query);
              while($rowz = mysql_fetch_assoc($result)) { // режем массив и перебираем элементы
              
                $query2 = "SELECT pagetitle FROM modx_site_content WHERE parent = ".$rowz['id']; // спрашиваем названия страниц с родительским документом, выдаваемым в цикле
                $result2 = mysql_query($query2);
                return $result2; //возвращаем массив, в котором собраны названия страниц документов из папок, для которых (для папок) родительский id=5.
              
              
                • 31022
                • 328 Posts
                Все, заработало. Все дело было в расположении вывода массива. Надо было сделать его после всех while. Ну и еще я взял метод получения рядов, предложенный AKots (спасибо ему еще раз за помощь). Вот финальный код:

                <?php
                $parent = 5; 
                $query = "SELECT id FROM ".$modx->db->config['table_prefix']."site_content WHERE parent = ".$parent;
                $result = mysql_query($query);
                while($rowz = mysql_fetch_assoc($result)) {
                
                  $query2 = "SELECT pagetitle FROM modx_site_content WHERE parent = ".$rowz['id'];
                  $result2 = mysql_query($query2);
                  while($rows = $modx->db->getRow($result2)) {
                    $output.= $rows['pagetitle']."||";
                  };
                };
                return $output;
                ?>
                


                Этот код, записанный в одну строчку, с привязкой @EVAL в возможных значениях tv выдает список названий документов третьего уровня определенного раздела (документа 1 уровня). В данном случае, с id=5.

                Выводы:
                -в детстве учить пхп надо было (:
                -не нашел вообще информации о типе и формате данных, принимаемых в tv.
                  • 785
                  • 2,113 Posts
                  Жуть – сколько же запросов в цикле делается. Лучше после первого запроса в цикле получить массив дочерних ID, с помощью implode объединить их в строку, разделенную запятыми и отправить запрос типа WHERE id IN ($ids), где $ids – полученная строка. В итоге в любом случае потребуется два запроса? а не множество.
                    Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                    Статьи о MODx, регулярно новые публикации
                    • 31022
                    • 328 Posts
                    Спасибо, дельно. Запросов действительно много. Попробую реализовать предложенный алгоритм. Буду разбираться.
                      • 52337
                      • 8 Posts
                      Спасибо за вопрос, он мне помог много в чем разобраться.
                      И придумал даже возможное решение, можно вместо OR использовать AND и значок не равно "<>" и тем самым исключить остальные категории, которые не нужны или помудрить с логическими функциями