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

Всем здравствуйте. Не получается вывести значения тв-полей через феном. Чанк-шаблон для открытой работы выглядит так:
<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
modx.pro
1 707
+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 существенно облегчает процесс разработке. Многие вещи делать в разы удобнее и быстрее. Плюс сам сайт начинает работать быстрее.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        20