We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 28630
    • 31 Posts
    Имеется такая структура дерева документов.


    Услуги


    • Услуга1
      [list]
      [li]Портфолио
      [list]
      [li]Элемент портфолио1-1
    • Элемент портфолио1-2
    [/li]
    [li]Прайс

    • Элемент прайса1-1
    • Элемент прайса1-2
    [/li]
    [/list]
    [/li]

    [li]Услуга2

    • Портфолио
      [list]
      [li]Элемент портфолио2-1
    • Элемент портфолио2-2
    [/li]
    [li]Прайс

    • Элемент прайса2-1
    • Элемент прайса2-2
    [/li]
    [/list]
    [/li]

    [/list]

    Для каждой услуги (услуга1, услуга2, ...) имеются две вложенных каталога с фиксированными именами (Портфель и Прайс), непосредственно в которых располагаются элементы.

    Каким образом можно узнать с родительского ресурса (Услуга1) идентификатор документа с заданным именем (pagetitle)?

    На текущий момент у меня получилось, не очень красивое решение.

    [[getResources@РядТаблицы?
    	&parents=`
    		[[getResources?
    			&depth=`0`
    			&parents=`[[*id]]`
    			&where=`{"pagetitle:=":"Прайс"}`
    			&tpl=`tpl`
    			&showHidden=`1`
    		]]
    `]]
    


    где tpl
    [[+id]]
    



      • 20380
      • 118 Posts
      А у вас шаблоны разные? Тогда можно использовать один вызов getResources на всю вложенность, а потом в tpl использовать условие (если использовать сниппет if, это будет выглядеть так: [[if?&subject=`[[+template]]`&operand=`id шаблона Элемент портфолио`&operator=`==`&then=`здесь сам вывод темплейта`]]. Таким образом уменьшится количество запросов к базе, но увеличится то количество того, что они возвращают.) Это немного криво, зато проще.
      П. С. Не совсем уверена в параметрах operand и operator, могла их перепутать, проверьте, прежде чем использовать.
      П. П. С. Но это все если не писать свой сниппет и не делать свои запросы к базе (глядя на ваше решение, я пришла к выводу, что вам этого не хочется). Хотя,даже если делать свои запросы, придется делать 2 запроса: чтобы узнать потомков текущего узла и чтобы узнать его потомков.
        • 28630
        • 31 Posts
        Quote from: Mraymax at Aug 31, 2010, 02:54 AM

        А у вас шаблоны разные? Тогда можно использовать один вызов getResources на всю вложенность, а потом в tpl использовать условие...
        Как-то это некрасиво. Шаблоны действительно разные, пустые. Используется возможности TV данного шаблона для формирования содержания.

        У меня вообще была идея обеспечить прозрачность редактирования содержания используя правило наименьшей неожиданности. Т.е. хранить содержание в дереве документов.

        Quote from: Mraymax at Aug 31, 2010, 02:54 AM

        ...
        П. П. С. Но это все если не писать свой сниппет и не делать свои запросы к базе (глядя на ваше решение, я пришла к выводу, что вам этого не хочется). Хотя,даже если делать свои запросы, придется делать 2 запроса: чтобы узнать потомков текущего узла и чтобы узнать его потомков.

        Наверное стоит составить какой-то простенький сниппет, под EVO было что-то вроде GrandchildIDs http://modxcms.com/extras/package/?package=191 и GetChildIds http://modxcms.com/extras/package/?package=169, т.е. нужен механизм на подобии Ultimateparent только в другом направлении так скажем smiley

        Если кто-нибудь подкинет идейку буду весьма признателен.
          • 20380
          • 118 Posts
          Так если вас не смущает создание собственного сниппета, используйте getDocumentChildren два раза. В Revo он работает? Не знаю точно, но вроде должен
            • 28630
            • 31 Posts
            Quote from: Mraymax at Aug 31, 2010, 10:28 AM

            Так если вас не смущает создание собственного сниппета, используйте getDocumentChildren два раза. В Revo он работает? Не знаю точно, но вроде должен

            getDocumentChildren deprecated http://bobsguides.com/revolution-objects.html

            А вот насчет сниппета получилось следущее (взял код отсюда http://rtfm.modx.com/display/revolution20/Templating+Your+Snippets)

            ПолучитьДочь
            <?php
            
            $docid = (isset($docid))? $docid: $modx->documentIdentifier;
            $name = (isset($name))? $name: 'Прайс';
            
            /* first, build the query */
            $c = $modx->newQuery('modResource');
            /* we only want published and undeleted resources */
            $c->where(array(
              'published' => true,
              'deleted' => false,
            ));
            
            /* get all the children of ID */
            $children = $modx->getChildIds($docid,1);
            if (count($children) > 0) {
                $c->where(array(
                    'id:IN' => $children,
                ));
            }
            /* sort by menuindex ascending */
            $c->sortby('menuindex','ASC');
            /* get the resources as xPDOObjects */
            $resources = $modx->getCollection('modResource',$c);
            
            $output = '';
            foreach ($resources as $resource) {
            
            	if ( $resource->get('pagetitle') == $name) {
            			$output .= $resource->get('id');
            		}
               
            }
            return $output;
            ?>


            Вызов:
            [[ПолучитьДочь? &name=`Прайс`]]
            Вроде работает, есть что подправить?
              • 20380
              • 118 Posts
              Я только в упор не понимаю, зачем нужна проверка pagetitle при выводе, если можно указать номер template в условии (или, если так хотите, по pagetitle, но тоже не в выводе, а в условиях).
              Потом пользователь заполнять будет, и может в pagetitle как-нибудь опечататься. А номер template - это номер, там ошибиться нельзя при выборе.
              Так что тут

                      'id:IN' => $children,
                      'template'=> '1', // Не уверена, что вокруг цыфры нужны ковычки

              Ну, и условие из вывода убрать нафиг
              foreach ($resources as $resource) {
              			$output .= $resource->get('id');   
              }

              Понятно, что передавать переменную в сниппет тоже не надо
                • 28630
                • 31 Posts
                Quote from: Mraymax at Aug 31, 2010, 02:21 PM

                Я только в упор не понимаю, зачем нужна проверка pagetitle при выводе, если можно указать номер template в условии (или, если так хотите, по pagetitle, но тоже не в выводе, а в условиях)...

                Да, так будет правильней. У меня два дочерних шаблона, относительно родительского документа - "Прайс (2)", "Портфолио (3)"

                Quote from: Mraymax at Aug 31, 2010, 02:21 PM

                ...
                Понятно, что передавать переменную в сниппет тоже не надо

                А это как раз для того чтобы выбрать интересующий раздел дерева документов - либо "Прайс (2)" либо "Портфолио (3)"
                  • 20380
                  • 118 Posts
                  А это как раз для того чтобы выбрать интересующий раздел дерева документов - либо "Прайс (2)" либо "Портфолио (3)"
                  Но это не нужно, если вы будете ставить условие по темплейту wink