On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Дорого времени суток.
    Заморочился с созданием меню, Wayfinder не хотел бы использовать ввиду его громоздкости и ненужного функционала.

    Итак пишу код :

    <?php
    //определяем функцию

    function  CreateMenu ($res)  {
    // идет скучное форматирование вывода хтмл для каждого документа. роли не играет поэтому приводить не буду.
    //Дальше я проверяю существует ли для данного документа дочерние,
    //и пытаюсь рекурсивно вызвать функцию построение ХТМЛ

    if ($results = $modx->getDocumentChildren($value["id"])) { //если есть дочерние документы обрабатываем их.
    CreateMenu ($results);
    }
    }



    $results = $modx->getDocumentChildren(0);
    $output = "<!-- Start Menu Out -->";
    $output.= CreateMenu ($results);
    $output.= "<!-- End Menu Out -->";
    // Возвращаем результат работы сниппета
    return $output;
    ?>


    И в итоге получаю грабли:
    Fatal error: Call to a member function getDocumentChildren() on a non-object in www\manager\includes\document.parser.class.inc.php(769) : eval()’d code on line 29

    Я так понял, что внутри опрееляемой мной функции я не мог использовать API?
    Как обойти эти грабли?
    • Quote from: Tohin at Feb 23, 2009, 05:17 PM

      Я так понял, что внутри опрееляемой мной функции я не мог использовать API?
      global $modx; - внутри своей функции.
        Разработка сайтов и программных модулей на MODX.
        Опыт работы на MODx с 2005 года. Высокое качество.
        Компания Baltic Design Colors: http://www.bdcolors.ru.
      • Огромное спасибо. Тупанул конечно лихо...

        Офтоп: При использовании тега [ code ] внутри русские буковки не отображаются.... embarrassed Хотя наверно и так это известно...
        • Опять видать тупю... Никак не могу заставить вернуть отсортированный по menuindex массив...
          Пишу.
          $results = $modx->getDocumentChildren(
          $id = $startid,
          $active = 1,
          $deleted = 0,
          'id, pagetitle, published, menuindex, deleted, hidemenu, menutitle',
          $where = 'hidemenu = 0',
          $sort='menuindex');
          
          print_r($results);


          получаю массив по id...

          [0] => Array
          (
          [id] => 1
          [pagetitle] => Главная
          [published] => 1
          [menuindex] => 100
          [deleted] => 0
          [hidemenu] => 0
          [menutitle] => Главная
          )

          [1] => Array
          (
          [id] => 47
          [pagetitle] => О нас
          [published] => 1
          [menuindex] => 5
          [deleted] => 0
          [hidemenu] => 0
          [menutitle] => О нас
          )
          )

          Перехватил sql:
          SELECT DISTINCT sc.id, sc.pagetitle, sc.published, sc.menuindex, sc.deleted, sc.hidemenu, sc.menutitle
          FROM `modx`.`modx_site_content` sc
          LEFT JOIN `modx`.`modx_document_groups` dg ON dg.document = sc.id
          WHERE sc.parent = '52'
          AND sc.published =1
          AND sc.deleted =0
          AND hidemenu =0
          AND (
          sc.privateweb =0
          )
          GROUP BY sc.id
          ORDER BY sc.menuindex ASC 
          LIMIT 0 , 30 

          Проблема в "GROUP BY sc.id", однако в описании API я не нашел как отключить этот параметр...
          • Ждать решения надоело...

            Нашел саму функцию:
             function getDocumentChildren($parentid= 0, $published= 1, $deleted= 0, $fields= "*", $where= '', $sort= "menuindex", $dir= "ASC", $limit= "") {
                    $limit= ($limit != "") ? "LIMIT $limit" : "";
                    $tblsc= $this->getFullTableName("site_content");
                    $tbldg= $this->getFullTableName("document_groups");
                    // modify field names to use sc. table reference
                    $fields= 'sc.' . implode(',sc.', preg_replace("/^\s/i", "", explode(',', $fields)));
                    $sort= ($sort == "") ? "" : 'sc.' . implode(',sc.', preg_replace("/^\s/i", "", explode(',', $sort)));
                    if ($where != '')
                        $where= 'AND ' . $where;
                    // get document groups for current user
                    if ($docgrp= $this->getUserDocGroups())
                        $docgrp= implode(",", $docgrp);
                    // build query
                    $access= ($this->isFrontend() ? "sc.privateweb=0" : "1='" . $_SESSION['mgrRole'] . "' OR sc.privatemgr=0") .
                     (!$docgrp ? "" : " OR dg.document_group IN ($docgrp)");
                    $sql= "SELECT DISTINCT $fields
                          FROM $tblsc sc
                          LEFT JOIN $tbldg dg on dg.document = sc.id
                          WHERE sc.parent = '$parentid' AND sc.published=$published AND sc.deleted=$deleted $where
                          AND ($access)
                          GROUP BY sc.id " .
                     ($sort ? " ORDER BY $sort $dir " : "") . " $limit ";
                    $result= $this->dbQuery($sql);
                    $resourceArray= array ();
                    for ($i= 0; $i < @ $this->recordCount($result); $i++) {
                        array_push($resourceArray, @ $this->fetchRow($result));
                    }
                    return $resourceArray;
                }
            


            Если я закомментирую "GROUP BY sc.id" ? (вроде так работает)
            Это баг или фича? Или у меня кривые руки?
            • Quote from: Tohin at Mar 06, 2009, 11:27 AM

              Если я закомментирую "GROUP BY sc.id" ? (вроде так работает)
              Это баг или фича? Или у меня кривые руки?
              Если у Вас MySQL 5.0.51, то дело именно в баге данной версии сервера баз данных.
              http://bugs.mysql.com/bug.php?id=35181 - смотрим сюда.
              Если закомментируете, то в принципе не должно быть особых проблем (я однажды тоже так делал).
              Но по большому счету лучше обновить MySQL.
                Разработка сайтов и программных модулей на MODX.
                Опыт работы на MODx с 2005 года. Высокое качество.
                Компания Baltic Design Colors: http://www.bdcolors.ru.