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

    Вот решаю такую задачу. При формировании вывода Ditto надо сконструировать ссылку на "related" документ. То есть. Выводится список товаров, у каждого есть производитель. Вот на страницу производителя (внутри системы, естественно) и надо послать.

    При создании документа есть tv factory -- это название фабрики. Делается @select-ом по pagetitle’ам раздела производителей. Но для конструирования ссылки необходим alias документа-фабрики, а не pagetitle.

    Возможно ли как-то создать некую зависимую tv, чтобы при выборе названия фабрики в нее подставлялся alias выбранного имени?

    Вариант сделать еще один @select по alias’ам и вручную подставлять не очень правилен, думается.
      • 23451
      • 232 Posts
      тут http://www.modxcms.com/Related-1.0.2-2092.html во втором примере не ваш случай описан?
        • 31022
        • 328 Posts
        Хм, спасибо большое, не сталкивался. Разберусь -- обрисую ситуацию.
          • 31022
          • 328 Posts
          Очень прикольная штука. Надо рассказать.

          Я тут уже задолбал вопросами о создании всяких кривых tv, чтобы в них выводилось то да се. Чтобы, например, при редактировании товара была tv’шка с выбором производителя в выпадающем списке. И эта же tv позволяла на странице производителя сделать простой вызов Ditto с фильтрацией по ней на равенство pagetitle, выводящий из каталога все товары этого производителя.

          Решалась у меня эта задача (спасибо советам с форума) через @select-привязку для tv "factory":
          @SELECT `pagetitle` FROM `modx_site_content` WHERE `parent` = "99" OR `parent` = "100" OR `parent` = "101" OR `parent` = "102"


          Эта штука выдавала в список названия документов с родителями 99-102 (это разделы производителей).

          А на странице производителя фильтровалась Ditto как
          [!Ditto? &tpl=`productLine` &parents=`4` &depth=`3`  &filter=`tvfactory,[*pagetitle*],1` [...] !]


          Все работало замечательно и не требовало никаких изменений. Пока не возникла необходимость сделать ссылку на производителя в общем списке товаров (см. первый пост). Вот тут-то и началось. Моя переменная хранит pagetitle. Для конструирования ссылки нужен alias. Именно конструирования, ибо нужно было сделать нечто типа
          <a href="[(base_url)]/[[getParentAlias]]/...alias конкретной фабрики...">[+factory+]</a>


          Сниппет getParentAlias был подсмотрен в соседней теме и содержит обращение к API:
          <?php
          $parent = $modx->getParent($id=-1,1,'alias');
          return ($parent[alias]);
          ?>


          А вот как добыть "...alias конкретной фабрики..." я так и не нашел. Пока Pisto Ganza не ткнул в Related.

          Этот замечательный сниппет решает стоящие перед ним задачи и сам ставит новые, до него не существовавшие. Ну, как обычно, короче. Ставится все по инструкции, все замечательно. Обязательно надо почитать связанную тему на форуме. Там 50% информации, всего на 2-х страницах.

          Как решилась моя задача с ним. Создал новую tv "relatedFactory" (вместо просто factory) со значением:
          @EVAL return $modx->runSnippet('Related', array("parents"=>"99,100,101,102"));


          То есть, вместо @select теперь работает @eval. Эта конструкция выдает мне в выпадающий список значения pagetitle’ов, а сама оперирует id. И это здорово. Я не знаю точно, как оно там внутри работает, но это классно.

          Теперь мы имеем. Ссылку на нужную страницу производителя, так:
          <a href="[~[+relatedFactory+]~]">[+relatedFactory:getPagetitle+]</a>

          Никакого конструирования, ничего мудреного. Но что за :getPagetitle? А в [+relatedFactory+] хранятся id! конструкция :getPagetitle увидена в теме форума про Related, является сниппетом phx:getPagetitle и содержит:
          <?php
          $pagetitle= $modx->runSnippet('GetField', array("docid"=>$output)); // GetField returns pagetitle by default
          return $pagetitle;
          ?>

          Ага, используется вызов еще одного сниппета, GetField. Преобразует переданный id в pagetitle.

          Фильтрация на странице произвоителя осуществляется точно так же, за исключением замены pagetitle на id:
          [!Ditto? &tpl=`productLineFactory` &parents=`4` &depth=`3` &filter=`tvrelatedFactory,[*id*],1` [...] !]


          Пока (на Денвере) все работает как надо.

          Однако, количество запросов к базе, при некешируемом вызове Дитто, порядка 35. При кешируемом -- 6. Хотя, я не помню, честно говоря, сколько было до этого.

          Короче, если вам понадобится сделать связанные документы, Related, думается, очень серьезное подспорье.
            • 33694
            • 742 Posts
            Познавательно и очень содержательно. Спасибо, umanuma.
              • 12791
              • 26 Posts
              umanuma вот вы с помощью related попадаете с товара на производителя. А наоборот не знаете как организовать связь. То есть выдать товары по выбору производителю. Учитывая что связь устанавливалась от товара к производителю, а не наоборот..
                • 31022
                • 328 Posts
                Это легче легкого: делается фильтрацией Дитто. У вас же есть tv с id фабрики на каждом товаре? Ну и все, задавайте фильтр на равенство этому tv. Весь вызов такой:

                [!Ditto? &tpl=`productLineFactory` &summarize=`100` &parents=`4` &depth=`3` &noResults=`<p>Извините, по Вашему запросу ничего не найдено.</p>` &hideFolders=`1` &filter=`tvrelatedFactory,[*id*],1` &debug=`0` &hiddenFields=`newMark`!]
                  • 12791
                  • 26 Posts
                  Ditto это хорошо но мне нужен все-таки wayfinder.
                  А еще вопрос, когда я сделал TV параметр, а потом создаю новый документ, то он вместо списка значений выдает загадочное слово INHERIT.
                  И только после сохранения этого документа, а потом последующего редактирования уже появляется нормальный список значений.
                  Это фича Modx или Related ??