私の問題はこれに密接に関連していると思います:ページで複数回使用すると、スニペットがコンテンツを複製します
私の問題の要素は次のとおりです...
$modx->loadedResources : ページ読み込み時にスニペットを介してメインの $modx オブジェクトに登録された (空の) 配列。配列は、DB からランダムにフェッチされたリソースのリソース ID を保持するため、同じリソースが同じページに 2 回表示されることはありません。
loadRandomResource : XPDO スタイルのクエリを使用して DB からランダムなリソースをロードするスニペット。
$modx->parseChunk()
チャンク内のプレースホルダーをリソース データで埋めるために使用します。呼び出しごとに、フェッチされたリソースの ID が$modx->loadResources
配列に追加されます。
新しいランダム リソースをフェッチするたびに、リソース ID が配列に適切に格納されているかどうかを確認するために、デバッグを使用しました。次に、loadRandomResource スニペットを呼び出すたびに、db が異なる結果を返すかどうかを確認しました。また、重複した結果が返されないことも確認できます (XPDO クエリで既に読み込まれているリソース ID を除外しています)。
ただし、ページ テンプレート全体の 3 つのさまざまな場所でスニペットを呼び出すと、3 つのスニペット呼び出しのすべてが同じリソースをレンダリングします。これは奇妙です。私のデバッグでは、固有のデータが DB からロードされ、レンダリングのためにチャンクに送信されていることが示されているためです。 .
スニペット コードとチャンク マークアップの両方を以下に示します。誰にもアイデアはありますか?どんな助けでも大歓迎です!
loadRandomResource スニペット
$criteria = $modx->newQuery('modResource');
$criteria->select(array('id','pagetitle'));
$criteria->sortby('RAND()');
$criteria->limit(1);
$whereOptions = array(
'parent' => 2,
'deleted' => false,
'hidemenu' => false,
'published' => true
);
if (!empty($modx->loadedResources)) {
$whereOptions['id:NOT IN'] = $modx->loadedResources;
}
$criteria->where($whereOptions);
$resources = $modx->getCollection('modResource', $criteria);
$output = '';
foreach ($resources as $resource) {
$fields = $resource->toArray();
$fields['tv.tvPersonalPicture'] = $resource->getTVValue('tvPersonalPicture');
$fields['tv.tvJobTitle'] = $resource->getTVValue('tvJobTitle');
$output .= $modx->parseChunk('cnkTeamListItem', $fields);
$modx->loadedResources[] = $fields['id'];
}
return $output;
cnkTeamListItem チャンク
<div>
<img src="[[+tv.tvPersonalPicture]]" alt="[[+pagetitle]]" />
<h2>[[+pagetitle]]<br /><span>[[+tv.tvJobTitle]]</span></h2>
</div>