We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 11092
    • 6 Posts
    Привет!
    Есть дерево документов


    Статьи (1)
    * Недвижимость (11)
    o Эконом (111)
    o Элитная (112)
    * Авто (12)
    o седан (111)
    o универсал (112)

    Необходимо список документов вывести в следующем виде:

    <select name="doc">
    <option disabled>Недвижимость</option>
    <option value="Эконом">Эконом</option>
    <option selected value="Элитная">Элитная</option>
    <option disabled>Авто</option>
    <option value="седан">седан</option>
    <option value="универсал">универсал</option>
    </select>

    сделал так:

    $results = $modx->getChildIds (’1’);
    echo’ <select name="parent">’;
    foreach ($results as $key => $value)
    {
    $var=$modx->getDocument ($value);
    $ed= ($var[’isfolder’]==1) ? ’disabled’ : ’’;
    $sel=($var[’id’]==$idтекущейстраницы) ? ’selected’:’’;
    echo’<option ’.$sel.’ ’.$ed.’ value="’.$var[’id’].’">’.$var[’pagetitle’].’</option>’;
    }
    echo ’</select>’;
    но, выводит не так как хотелось бы:

    <select name="doc">
    <option disabled>Недвижимость</option>
    <option disabled>Авто</option>
    <option value="Эконом">Эконом</option>
    <option selected value="Элитная">Элитная</option>
    <option value="седан">седан</option>
    <option value="универсал">универсал</option>
    </select>

    как победить?

    сильно не пинать только учусь...



      • 24707
      • 16 Posts
      Я задавал глубину прохода 1 для $results = $modx->getChildIds (’1’);
      Потом использовал $modx->getActiveChildren();
        • 11092
        • 6 Posts
        Quote from: Redduck at Dec 28, 2010, 02:56 PM

        Я задавал глубину прохода 1 для $results = $modx->getChildIds (’1’);
        Потом использовал $modx->getActiveChildren();

        не совсем понял как это решает задачу?

        А если дерево документов больше:

        * Недвижимость (11)
        o Эконом (111)
        # 1 комн
        # 2 комн
        # 3 комн
        o Элитная (112)
        * Авто (12)
        o седан (111)
        o универсал (112)

        Мне кажется здесь без рекурсивной функции не обойтись...
          • 785
          • 2,113 Posts
          При использовании такого подхода получается очень много запросов к базе данных – лично я сделал бы все с помощью прямых запросов к базе данных (а не через getDocument), в этом случае можно обойтись одним запросом, если предварительно с помощью getChildIds построить список. А для того, чтобы отсортировать в нужном порядке, надо немного логику доработать.
            Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
            Статьи о MODx, регулярно новые публикации
            • 11092
            • 6 Posts
            Quote from: AKots at Dec 28, 2010, 03:43 PM

            А для того, чтобы отсортировать в нужном порядке, надо немного логику доработать.
            Вот, вот... как???
              • 24707
              • 16 Posts
              У меня просто дерево документов ограничено 2 вложениями и больше не предусмотрено.
              Если много документов то действительно будет много запросов к базе данных.
              У документа есть параметр [*parent*] - номер (ID) родительского документа, может он тебе поможет
                • 785
                • 2,113 Posts
                Quote from: Goodeeny at Dec 28, 2010, 03:56 PM

                Вот, вот... как???
                Например, как предлагалось, вызвать getChildIds с глубиной 1, то есть getChildIDs(1, 1) и сохранить в массиве. Потом сделать цикл по массиву и в цикле снова вызвать getChildIds и поместить результаты во вложенные массивы. Так делать, пока дочерних документов не будет найдено. В итоге получится массив с иерархией документов, который можно использовать при выводе. Параллельно с добавлением элементов в этот массив надо формировать строку ID, чтобы одним запросом к базе получить все нужные документы. После этого можно все выводить.
                  Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                  Статьи о MODx, регулярно новые публикации
                  • 24707
                  • 16 Posts
                  Quote from: AKots at Dec 29, 2010, 07:16 AM

                  Quote from: Goodeeny at Dec 28, 2010, 03:56 PM

                  Вот, вот... как???
                  Например, как предлагалось, вызвать getChildIds с глубиной 1, то есть getChildIDs(1, 1) и сохранить в массиве. Потом сделать цикл по массиву и в цикле снова вызвать getChildIds и поместить результаты во вложенные массивы. Так делать, пока дочерних документов не будет найдено. В итоге получится массив с иерархией документов, который можно использовать при выводе. Параллельно с добавлением элементов в этот массив надо формировать строку ID, чтобы одним запросом к базе получить все нужные документы. После этого можно все выводить.


                  Наверно в цикле лучше вызвать $modx->getActiveChildren(); Тут ты получишь все необходимые параметры а не только id дочерних документов.
                    • 785
                    • 2,113 Posts
                    Quote from: Redduck at Dec 29, 2010, 02:46 PM

                    Наверно в цикле лучше вызвать $modx->getActiveChildren();
                    Не слишком удачная идея – так в цикле каждый раз будут обращения к базе данных, лучше сначала без обращения к базе определить все необходимые ID, а потом одним запросом получить все остальные данные.
                      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                      Статьи о MODx, регулярно новые публикации