Как правильно выводить тв-поля?

Всем здравствуйте. Не получается вывести значения тв-полей через феном. Чанк-шаблон для открытой работы выглядит так:
<div class="col">
  <div class="image-block">
	{'!Gallery'|snippet:['album'=>$_modx->resource.pagetitle]}
  </div>
</div>
<div class="col">
  <div class="description-block">
  	<p><b>Описание: </b>{$_modx->resource.description}</p>
	<p><b>Дата выполнения работы: </b>{$_pls['$_modx->resource.portfolio-date']}</p>
	<p><b>Список выполненных работ: </b>{$_pls['$_modx->resource.portfolio-completed_tasks']}</p>
	<p><b>Комментарий к работе: </b>{$_pls['$_modx->resource.portfolio-comment']}</p>
	<p><b>О клиенте: </b>{$_pls['$_modx->resource.portfolio-about']}</p>
	<a href="{$_pls['$_modx->resource.portfolio-url']}" class="btn btn-primary">Перейти на сайт заказчика</a>
  </div>
</div>
Вроде бы код верный, читал документацию, но почему то не выводит. Что я упустил? Через теги наподобие [[*portfolio-date]] всё выводит. Также пробовал через getPlaceholder(), но не помогло. Пробовал и без $_pls — тоже не вышло
al1ve
17 апреля 2019, 12:23
106
+1

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

Андрей
17 апреля 2019, 12:37
0
А так если попробовать:
{$_pls['portfolio-date']}
    al1ve
    17 апреля 2019, 13:32
    0
    попробовал — не вышло. ну если что — этот чанк вызывается в шаблоне таким кодом:
    <div class="content-color">
    	  <h1>{$_modx->resource.pagetitle}</h1>
    	  <div class="row">
    	  {$_modx->getChunk('portfolio-item-description_template')}
    	  </div>
    	  </div>
    Проверил — не влияет ли тире в названии чанка на работоспособность. Вроде не влияет.
Андрей Перевезенцев
17 апреля 2019, 12:50
0
{$_modx->resource.tv_name}
или
{$_modx->resource.portfolio-date}
— в вашем случае
    Андрей
    17 апреля 2019, 13:03
    0
    Для плейсхолдеров с точкой или тире нужно использовать $_pls.
      al1ve
      17 апреля 2019, 13:34
      0
      ну я пробовал с $_pls — не сработало. Может дело в чём-то другом? пробовал ещё через переменную — тоже не вышло. К примеру, такой код:
      {var $portfolio_date = $_pls['portfolio-date']}
      {$portfolio_date}
        Андрей
        17 апреля 2019, 13:57
        +1
        Да, проверил, не работает.

        Тогда почему бы не использовать верный синтаксис и переименовать переменные в соответствии с правилами?

        Во многих местах MODX используются плейсхолдеры, которые нельзя указывать в Fenom, так как они не соотвествуют правилам наименования переменных PHP. Например, плейсхолдеры с точкой (MODX обычно выставляет так данные массивов) или с тире (ТВ параметры).
          al1ve
          17 апреля 2019, 14:12
          0
          Ну раз есть способ обойти, то почему бы его не использовать. Но, видимо, придётся переименовать. Попробую.
          al1ve
          17 апреля 2019, 16:01
          0
          ну да, переименование тв-полей в духе portfolio_date решило проблему, но теперь в чанке-шаблоне не срабатывает вывод ссылки. точнее, ссылка не выводит куда надо.
          <div class="col">
            <div class="card portfolio-item {$cls}">
          	<a href="{$_modx->makeUrl($id)}">
          	{'!Gallery'|snippet:[
          	'thumbTpl'=>'portfolio-image-thumb',
          	'album'=> $pagetitle,
          	'limit'=>'1'
          	]}</a>
          	<div class="card-body">
          	  <a href={$_modx->makeUrl($id)}><h5 class="card-title">{$pagetitle}</h5></a>
          	  <p class="card-text">{$introtext}</p>
          	  <a href="{$portfolio_url}" class="btn btn-primary">Перейти на сайт заказчика</a>
          	</div>
            </div>
          </div>
          по идее, теперь должно работать, но ни {$portfolio_url}, ни {$_modx->getPlaceholder('portfolio_url')} почему то не срабатывает. Он выводит только на главную страницу. в &includeTVs я исправил название тв-поля. До этого вроде срабатывал код {$_pls['portfolio-url']}. Может я забыл где то исправить значение тв?
            Андрей
            17 апреля 2019, 16:37
            0
            Покажи вызов сниппета, который этот чанк выводит.
              al1ve
              17 апреля 2019, 16:52
              0
              <div class="row">
              {'!pdoPage' | snippet:[
              'parents' => '19',
              'level' => '1',
              'includeTVs' => 'portfolio_url',
              'tpl' => 'portfolio-item',
              'sortdir' => 'ASC' ]}
              
              {$_modx->getPlaceholder('!page.nav')}
              </div>
              Но в коде чанка открытой работы ссылка ведёт куда нужно:
              <div class="col">
                <div class="image-block">
              	{'!Gallery'|snippet:['album'=>$_modx->resource.pagetitle]}
                </div>
              </div>
              <div class="col">
                <div class="description-block">
                	<p><b>Описание: </b>{$_modx->resource.description}</p>
              	<p><b>Дата выполнения работы: </b>{$_modx->resource.portfolio_date}</p>
              	<p><b>Список выполненных работ: </b>{$_modx->resource.portfolio_completedTasks}</p>
              	<p><b>Комментарий к работе: </b>{$_modx->resource.portfolio_comment}</p>
              	<p><b>О клиенте: </b>{$_modx->resource.portfolio_about}</p>
              	<a href="{$_modx->resource.portfolio_url}" class="btn btn-primary">Перейти на сайт заказчика</a>
                </div>
              </div>
                Андрей
                17 апреля 2019, 17:19
                +1
                Задать в вызове пустой префикс и будет работать:
                'tvPrefix' => ' '
                
                Либо если не обнулять, то будет работать так - {$_pls['tv.portfolio_url']}

                Также можно сократить:
                {$_modx->makeUrl($id)} до {$id | url}
                  al1ve
                  17 апреля 2019, 17:27
                  0
                  да, tvPrefix помог. Спасибо большое =) только я не пойму — почему так? Вроде и без префикса работало. Значит в аналогичных вызовах придётся тоже добавлять 'tvPrefix'=>' '?
                    Андрей
                    17 апреля 2019, 17:49
                    +1
                    Все эти моменты можно прочитать в документации:

                    &tvPrefix — tv. у pdoResources и пусто у других сниппетов
                    Исходя из того что в element pdoPage по дефолту стоит pdoResources, нужно обнулять префикс.
                      al1ve
                      17 апреля 2019, 18:07
                      0
                      аа… понял. Буду знать
    al1ve
    18 апреля 2019, 10:33
    0
    теперь какая то другая ошибка выскочила. Не отображаются картинки из галереи в списке работ. Вот код элемента работы.
    <div class="col">
      <div class="card portfolio-item {$cls}">
    	<a href="{$_modx->makeUrl($id)}">
    	{'!Gallery'|snippet:[
    	'thumbTpl'=>'portfolio-image-thumb',
    	'album'=> $pagetitle,
    	'limit'=>'1'
    	]}</a>
    	<div class="card-body">
    	  <a href={$_modx->makeUrl($id)}><h5 class="card-title">{$pagetitle}</h5></a>
    	  <p class="card-text">{$introtext}</p>
    	  <a href="{$portfolio_url}" class="btn btn-primary">Перейти на сайт заказчика</a>
    	</div>
      </div>
    </div>
    А вот код чанка-шаблона.
    <img src="{$_modx->getPlaceholder('thumbnail')}" class="card-img-top img-fluid img-thumbnail"/>
    [[+thumbnail]] работает исправно. Вроде до этого {$_modx->getPlaceholder('thumbnail')} у меня нормально работал.
    В консоли браузера пишет следующее:
    Failed to load resource: the server responded with a status of 403 (Forbidden)
    А в самом исходном коде страницы выводит это:
    <img src="{$_modx->getPlaceholder('thumbnail')}" class="card-img-top img-fluid img-thumbnail"/></a>
    Что я пробовал:
    1. вставить этот код напрямую:
    'thumbTpl'=>'<img src="{$_modx->getPlaceholder('thumbnail')}" class="card-img-top img-fluid img-thumbnail"/>'
    2. пробовал написать {'thumbnail'|placeholder}
    3. пробовал написать тупо {$thumbnail}

    Как правильно вызывать плейсхолдер [[+thumbnail]]? Попробовал ещё добавить 'toPlaceholder'=>'thumbnail', но тоже ничего не вышло
      Андрей
      18 апреля 2019, 14:50
      0
      Тут как бы всё элементарно, Gallery просто не умеет работать с Fenom, потому надо использовать стандартный синтаксис. Далеко не все дополнения, тем более старые, умеют работать с Fenom.

      Если это так важно, то можно использовать ms2Gallery или UserFiles,
        al1ve
        18 апреля 2019, 15:57
        0
        ну не критично, просто я думал, что если оставлять стандартные теги modx, то сайт будет работать чуть медленнее, чем если бы он полностью состоял из тегов фенома. Ну и я почему то думал что все сниппеты умеют работать с феномом и поэтому хотел перевести все страницы и теги на феном. Или это не обязательно?
          Андрей
          19 апреля 2019, 13:30
          0
          Можно воспользоваться решениями вроде — https://modx.pro/help/13824#comment-90537.

          Можно джойнить в pdoResources, примерно как то так:
          &class=`galAlbumItem`
          &loadModels=`gallery`
          &select=`{
              "galAlbumItem": "*",
              "galItem": "*"
          }`
          &leftJoin=`{
              "galItem":{"class":"galItem", "on":"galItem.id = galAlbumItem.item"}
          }`

          Или же как писал выше пользоваться решениями которые умеют в fenom из коробки.

          А насчёт скорости, можно сделать два шаблона с нужными вызовами и сравнить с помощью — debugParser. Ну и раздел с тестированием производительности есть в документации — https://docs.modx.pro/komponentyi/pdotools/parser
            al1ve
            19 апреля 2019, 17:55
            0
            хорошо, спасибо. Ну и хотелось бы узнать — а обязательно переводить ВСЕ чанки сниппетов на феном? или оставить стандартные теги modx? Как вы обычно делаете?
              Николай Савин
              19 апреля 2019, 18:35
              0
              Ничего не обязательно. Просто использование fenom существенно облегчает процесс разработке. Многие вещи делать в разы удобнее и быстрее. Плюс сам сайт начинает работать быстрее.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.