Засунуть TV в плейсхолдер

Приветствую, друзья! Помогите, пожалуйста, разобраться, как запихнуть значение TV в плейсхолдер?
Задача: требуется запихнуть значение TV с названием sklad-id (тип ввода — текст) в плейсхолдер skladID

Что было сделано:
1) TV с именем sklad-id заполнено значением: 45,39 (просто через запятую перечисляются id нужных складов)
2) Для заполнения плейсхолдера нужным значением был создан сниппет sklady со следующим содержимым:

// в переменную idskladov получаем значение из твешки sklad-id
$idskladov = $modx->resource->get('sklad-id');
// в плейсхолдер skladID запихиваем полученную переменную
$modx->setPlaceholder('skladID', '$idskladov');

Перед тем, как вызывать плейсхолдер skladID, делаю вызов сниппета [[sklady]] для инициализации плейсхолдера. Далее когда вызываю

[[+skladID]]

вместо ожидаемого значения 45,39, введенного ранее в тв, получаю:

Array ( [0] => sklad-id [1] => [2] => default [3] => [4] => text )

А мне нужно в плейсхолдере вывести точно такое же значение, какое было в твшке…
Ури
04 июля 2017, 15:16
modx.pro
2 332
0

Комментарии: 18

Михаил
04 июля 2017, 20:41
+1
$modx->resource->getTVValue('tvvalue')
    Ури
    04 июля 2017, 22:00
    0
    Михаил, правильно ли я понимаю, что приведенная вами запись будет работать для текущего ресурса? Подскажите, пожалуйста, как будет выглядеть запись для использования в чанке?
    Андрей Коробков
    04 июля 2017, 23:56
    +1
    1.
    $idskladov = $modx->resource->getTVValue('sklad-id');
    2. Кавычки возможно не те, уберите
    $modx->setPlaceholder('skladID', $idskladov);
    3. Думаю, что сниппет нужно вызывать не кешированным (не факт, что обязательно):
    [!sklady!]
      Андрей Коробков
      05 июля 2017, 00:26
      0
      На evo заработался:) 3 — так
      [[!sklady]]
        Ури
        05 июля 2017, 00:48
        0
        Спасибо! Для текущего ресурса такой вариант отрабатывает хорошо. Значение TV попадает в плейсхолдер skladID.
        А как быть, если сниппет

        [[!sklady]]

        должен вызываться внутри выборки pdoResources? Например, если это страница категории? В этом случае конструкция

        $modx->setPlaceholder('skladID', $idskladov);

        вставляет в плейсхолдер skladID значение TV самой страницы категории, а нужно вставлять значения TV элементов выборки pdoResources
          Андрей Коробков
          05 июля 2017, 00:57
          0
          Немного поменять архитектуру, — в сниппете должны приниматься параметры, и он должен принимать параметры, как то так:
          [[!sklady? &id=`[[*id]]`]]
          внутри выборки так:
          [[!sklady? &id=`[[+id]]`]]
          или типа того… А лучше продумайте архитектуру
            Ури
            05 июля 2017, 10:31
            0
            Да, архитектура получилась запутанная )
            Андрей, помогите, пожалуйста переписать этот кусочек кода

            $idskladov = $modx->resource->getTVValue('sklad-id');

            так, чтобы он вытягивал ТВ sklad-id' с учетом полученного

            [[+id]]
              Володя
              05 июля 2017, 20:18
              +1
              resource->getTVValue
              понятно что getTVValue получает тв из ресурса. если вам нужен другой ресурс, получите его например с помощью getObject, а затем получите из него нужный вам тв
              if ($resource = $modx->getObject('modResource', $id)) {
              	$idskladov = resource->getTVValue('sklad-id');
              }
                Ури
                05 июля 2017, 21:18
                0
                Владимир, на ваш код появляется синтаксическая ошибка unexpected t_object_operator — в чем может быть проблема?
                  Володя
                  05 июля 2017, 21:26
                  +2
                  Знак $ пропустил перед resource наверно оттого. Учитесь проверять код…
                    Ури
                    05 июля 2017, 22:39
                    0
                    Стараюсь ) Просто уже второй день затык с этой задачей, голову сломал, туплю уже жестко )
                Андрей Коробков
                05 июля 2017, 20:39
                +1
                Может вопрос поставлен неверно? Зачем вам запихивать sklad-id в skladID, чем не устраивает нативный плейсхолдер sklad-id? Приведите код
                  Ури
                  05 июля 2017, 22:33
                  0
                  Андрей, сейчас постараюсь обрисовать ситуацию. Код приведу ниже.
                  Стоит задача вывести таблицу продукции, где столбцы это: Наименование товара, Спецификация, Склад, Цена с НДС, Цена без НДС. Соответственно строки это отдельный вид продукции.
                  Решил виды продукции сделать отдельными ресурсами с дополнительными полями.
                  В ячейке продукции «Склад» нужно будет указать склады (дополнительное поле sklad-id, где через запятую перечисляю айдишники нужных складов — склады тоже отдельные ресурсы). Каждый склад будет отображаться в таблице в виде ссылки, щелкая по которой будут отображаться контакты менеджеров выбранного склада, отвечающих за выбранный тип продукции во всплывающем окне.
                  В основном таблицу продукции получается вывести без проблем, кроме ячеек со складами. Для вывода ресурсов продукции (строк таблицы) использую pdoResources. Для вывода складов в ячейке «Склад» тоже использую выборку pdoResources, где в параметр
                  &resources
                  хочу передать значения из дополнительного поля sklad-id ресурса вида продукции (чтобы из всего множества складов в ячейке вывести только те, где есть данная продукция).
                  Итого у меня получается ситуация, когда я внутри одной выборки pdoResources (когда формирую виды продукции в строках таблицы) использую еще одну выборку pdoResources (для формирования нужного списка складов).
                  Проблема заключается в том, что я во внутреннюю выборку pdoResources, формирующую склады в ячейке, не могу в параметр
                  &resources
                  запихнуть значение дополнительного поля sklad-id ресурса с видом продукции.
                  Поэтому я решил при формировании строки с видом продукции (во внешней выборке pdoResources) в плейсхолдер skladID запихнуть значение дополнительного поля sklad-id ресурса продукции. А далее я этот плейсхолдер хочу использовать уже во внутренней выборке pdoResources, формирующей склады, засунув его в параметр
                  &resources
                  .
                  Надеюсь, получилось пояснить задумку.
                  Для вывода таблицы продукции получил такой код:

                  <div class="divtable"> <!-- Вывожу заголовки таблицы -->
                  	<div class="divtable-row divtable-row__title">
                  		<div class="divtable-col divtable-col__name">Наименование товара</div>
                  		<div class="divtable-col divtable-col__spec">Спецификация</div>
                  		<div class="divtable-col divtable-col__adr">Склад</div>
                  		<div class="divtable-col divtable-col__nds">Цена с НДС за тонну СРТ*</div>
                  		<div class="divtable-col divtable-col__nonds">Цена без НДС за тонну</div>
                  	</div>
                  
                  <!-- Первая выборка формирует строки таблицы с видами продукции -->	
                  [[!pdoResources?
                  	&tpl=`@INLINE 
                  	<div class="divtable-row">
                  		<div class="divtable-col divtable-col__name">[[+pagetitle]]</div>
                  		<div class="divtable-col divtable-col__spec">[[#[[+id]].specifikaciya]]</div>
                  		<div class="divtable-col divtable-col__adr">
                  			
                  			<!-- Вызываю сниппет, где должен формироваться плейсхолдер со значением из дополнительного поля sklad-id -->
                  			[[!sklady? &id=`[[+id]]`]]
                  
                  			<!-- Запускаю выборку нужных складов в ячейке Склад, где в параметр &resources  хочу подсунуть полученный плейсхолдер skladID, который должен содержать нужные айдишники складов из дополнительного поля ресурса продукции sklad-id  -->
                  			[[!pdoResources?
                  				&parents=`28`
                  				&tplWrapper=`@INLINE <ol> [[+output]]</ol>`
                  				&tpl=`@INLINE <li><a class="popup-modal" href="#[[+id]]">[[#[[+id]].pagetitle]]</a></li>`
                  				&sortby=`publishedon`
                  				&sortdir=`DESC`
                  				&depth=`0`
                  				&includeTVs=`sklad-id`
                  				&resources=`[[+skladID]]`
                  			]]
                  		
                  		</div>
                  
                  		<div class="divtable-col divtable-col__nds">[[#[[+id]].nds]]</div>
                  		<div class="divtable-col divtable-col__nonds">[[#[[+id]].nonds]]</div>
                  	</div>
                  	`
                  	&sortby=`menuindex`
                  	&sortdir=`ASC`
                  	&parents=`21`
                  	&depth=`0`
                  	&includeTVs=`specifikaciya,sklad,sklad-id,nds,nonds`
                  ]]
                  </div>

                  Код сниппета sklady по подсказке Владимира сейчас имеет вид:

                  if ($resource = $modx->getObject('modResource', $id)) {
                  	$idskladov = $resource->getTVValue('sklad-id');
                  }
                  $modx->setPlaceholder('skladID', $idskladov);

                  Но почему-то данный сниппет не отлавливает значение дополнительного поля sklad-id
                    Андрей Коробков
                    05 июля 2017, 22:48
                    0
                    бедный сервер:(… Как писал выше, все это полностью нужно переписать… На сейчас думаю поможет следующее:
                    Копируете сниппет sklady например в sklady1, содержание:
                    $idskladov = "";
                    if ($resource = $modx->getObject('modResource', $id)) {
                    	$idskladov = $resource->getTVValue('sklad-id');
                    }
                    return $idskladov;
                    Убираете вызов
                    [[!sklady? &id=`[[+id]]`]]
                    И вместо
                    &resources=`[[+skladID]]`
                    вставляете
                    &resources=`[[!sklady1? &id=`[[+id]]`]]`
                    не уверен, правда, что парсер это переварит
                      Ури
                      05 июля 2017, 23:01
                      0
                      Пока знаний не хватает сделать правильнее )
                      Сделал, как вы написали, но вместо нужных складов (указанных в дополнительном поле), выводятся все. Кажется, сниппет не отлавливает значение тв…
                      Андрей, если я вам доступы дам к сайту, а вы бы там пошаманили, сколько бы стоили ваши услуги, чтобы разобраться с такой логикой?
                      Андрей Коробков
                      05 июля 2017, 23:03
                      0
                      Тупанул слегка… Хотя работать должно… Почему не используете плейсходеры
                      <div class="divtable"> <!-- Вывожу заголовки таблицы -->
                      	<div class="divtable-row divtable-row__title">
                      		<div class="divtable-col divtable-col__name">Наименование товара</div>
                      		<div class="divtable-col divtable-col__spec">Спецификация</div>
                      		<div class="divtable-col divtable-col__adr">Склад</div>
                      		<div class="divtable-col divtable-col__nds">Цена с НДС за тонну СРТ*</div>
                      		<div class="divtable-col divtable-col__nonds">Цена без НДС за тонну</div>
                      	</div>
                      
                      <!-- Первая выборка формирует строки таблицы с видами продукции -->	
                      [[!pdoResources?
                      	&tpl=`@INLINE 
                      	<div class="divtable-row">
                      		<div class="divtable-col divtable-col__name">[[+pagetitle]]</div>
                      		<div class="divtable-col divtable-col__spec">[[+tv.specifikaciya]]</div>
                      		<div class="divtable-col divtable-col__adr">
                      
                      			<!-- Запускаю выборку нужных складов в ячейке Склад, где в параметр &resources  хочу подсунуть полученный плейсхолдер skladID, который должен содержать нужные айдишники складов из дополнительного поля ресурса продукции sklad-id  -->
                      			[[!pdoResources?
                      				&parents=`28`
                      				&tplWrapper=`@INLINE <ol> [[+output]]</ol>`
                      				&tpl=`@INLINE <li><a class="popup-modal" href="#[[+id]]">[[+pagetitle]]</a></li>`
                      				&sortby=`publishedon`
                      				&sortdir=`DESC`
                      				&depth=`0`
                      				&includeTVs=`sklad-id`
                      				&resources=`[[+tv.sklad-id]]`
                      			]]
                      		
                      		</div>
                      
                      		<div class="divtable-col divtable-col__nds">[[+tv.nds]]</div>
                      		<div class="divtable-col divtable-col__nonds">[[+tv.nonds]]</div>
                      	</div>
                      	`
                      	&sortby=`menuindex`
                      	&sortdir=`ASC`
                      	&parents=`21`
                      	&depth=`0`
                      	&includeTVs=`specifikaciya,sklad,sklad-id,nds,nonds`
                      ]]
                      </div>

                      напоминает чем то анекдот, как текст распечатали, потом отсканировали, картинку вставили в ворд и отправили
                        Ури
                        05 июля 2017, 23:23
                        0
                        Вы про это
                        &resources=`[[+tv.sklad-id]]`
                        ?
                        Если да, то изначально так и пробовал делать, но так не работает.
                        По аналогии запись
                        [[+id]]
                        в выборке складов формирует айдишники складов.
                        Таким образом сейчас запись
                        &resources=`[[+tv.sklad-id]]`
                        в выборке складов будет искать значения дополнительных полей sklad-id у складов, хотя нужные дополнительные поля заполняются для видов продукции
            Андрей Коробков
            05 июля 2017, 23:14
            0
            tpl попробуйте перенести в чанк (вместо @INCLUDE)
            и
            <!-- Запускаю выборку нужных складов в ячейке Склад.....
            перед ним проверку нужно сделать, что tv.sklad-id не пустой

            во вложенном pdoResources
            &includeTVs=`sklad-id`
            лишнее — не используется
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              18