Как правильно выводить тв-поля?
Всем здравствуйте. Не получается вывести значения тв-полей через феном. Чанк-шаблон для открытой работы выглядит так:
<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 — тоже не вышло Комментарии: 20
А так если попробовать:
{$_pls['portfolio-date']}
попробовал — не вышло. ну если что — этот чанк вызывается в шаблоне таким кодом:
<div class="content-color">
<h1>{$_modx->resource.pagetitle}</h1>
<div class="row">
{$_modx->getChunk('portfolio-item-description_template')}
</div>
</div>
Проверил — не влияет ли тире в названии чанка на работоспособность. Вроде не влияет. {$_modx->resource.tv_name}
или{$_modx->resource.portfolio-date}
— в вашем случае
Для плейсхолдеров с точкой или тире нужно использовать $_pls.
ну я пробовал с $_pls — не сработало. Может дело в чём-то другом? пробовал ещё через переменную — тоже не вышло. К примеру, такой код:
{var $portfolio_date = $_pls['portfolio-date']}
{$portfolio_date}
Да, проверил, не работает.
Тогда почему бы не использовать верный синтаксис и переименовать переменные в соответствии с правилами?
Тогда почему бы не использовать верный синтаксис и переименовать переменные в соответствии с правилами?
Во многих местах MODX используются плейсхолдеры, которые нельзя указывать в Fenom, так как они не соотвествуют правилам наименования переменных PHP. Например, плейсхолдеры с точкой (MODX обычно выставляет так данные массивов) или с тире (ТВ параметры).
Ну раз есть способ обойти, то почему бы его не использовать. Но, видимо, придётся переименовать. Попробую.
ну да, переименование тв-полей в духе 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']}. Может я забыл где то исправить значение тв?
Покажи вызов сниппета, который этот чанк выводит.
<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>
Задать в вызове пустой префикс и будет работать:
Также можно сократить:
'tvPrefix' => ' '
Либо если не обнулять, то будет работать так - {$_pls['tv.portfolio_url']}
Также можно сократить:
{$_modx->makeUrl($id)} до {$id | url}
да, tvPrefix помог. Спасибо большое =) только я не пойму — почему так? Вроде и без префикса работало. Значит в аналогичных вызовах придётся тоже добавлять 'tvPrefix'=>' '?
Все эти моменты можно прочитать в документации:
&tvPrefix — tv. у pdoResources и пусто у других сниппетовИсходя из того что в element pdoPage по дефолту стоит pdoResources, нужно обнулять префикс.
аа… понял. Буду знать
теперь какая то другая ошибка выскочила. Не отображаются картинки из галереи в списке работ. Вот код элемента работы.
В консоли браузера пишет следующее:
1. вставить этот код напрямую:
3. пробовал написать тупо {$thumbnail}
Как правильно вызывать плейсхолдер [[+thumbnail]]? Попробовал ещё добавить 'toPlaceholder'=>'thumbnail', но тоже ничего не вышло
<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', но тоже ничего не вышло
Тут как бы всё элементарно, Gallery просто не умеет работать с Fenom, потому надо использовать стандартный синтаксис. Далеко не все дополнения, тем более старые, умеют работать с Fenom.
Если это так важно, то можно использовать ms2Gallery или UserFiles,
Если это так важно, то можно использовать ms2Gallery или UserFiles,
ну не критично, просто я думал, что если оставлять стандартные теги modx, то сайт будет работать чуть медленнее, чем если бы он полностью состоял из тегов фенома. Ну и я почему то думал что все сниппеты умеют работать с феномом и поэтому хотел перевести все страницы и теги на феном. Или это не обязательно?
Можно воспользоваться решениями вроде — https://modx.pro/help/13824#comment-90537.
Можно джойнить в pdoResources, примерно как то так:
Или же как писал выше пользоваться решениями которые умеют в fenom из коробки.
А насчёт скорости, можно сделать два шаблона с нужными вызовами и сравнить с помощью — debugParser. Ну и раздел с тестированием производительности есть в документации — https://docs.modx.pro/komponentyi/pdotools/parser
Можно джойнить в 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
хорошо, спасибо. Ну и хотелось бы узнать — а обязательно переводить ВСЕ чанки сниппетов на феном? или оставить стандартные теги modx? Как вы обычно делаете?
Ничего не обязательно. Просто использование fenom существенно облегчает процесс разработке. Многие вещи делать в разы удобнее и быстрее. Плюс сам сайт начинает работать быстрее.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.