2

次のスニペット コードを FormIt メール フォームに接続しています。

$tv = "taken" . (int)$hook->getValue('datetime');
$docID = $modx->resource->get('id'); //get the page id
$page = $modx->getObject('modResource', $docID);
$current = (int)$page->getTVValue($tv);
if (!$page->setTVValue($tv, $current + 1)) {
    $modx->log(xPDO::LOG_LEVEL_ERROR, 'There was a problem saving your TV...');
}
$modx->setPlaceholder('successMessage','<h2 class="success">'.$current.'</h2>');
return true;`

実行されるたびにテンプレート変数をインクリメントし、成功メッセージを出力します (ただし、現在はその機能を使用して代わりにデバッグ メッセージを出力しています)。問題は、スニペットを保存した後に TV を 1 回だけインクリメントするため、キャッシュが更新されることです。通常、キャッシュなしでスニペットを呼び出すには、! を追加します。その名前に似ていますが、それは FormIt フックでは機能しないようです。このコードを機能させるにはどうすればよいですか? 現在、ページ全体をキャッシュ不可として実行していますが、それは明らかに最適ではありません。おそらく、キャッシュされていない方法でスニペットをフックする方法はありますか? キャッシュされていないスニペット内からスニペットを呼び出しますか?

4

2 に答える 2

0

$tv オブジェクトを保存する前にこれを追加してみてください

$tv->_processed = false;

それが拡張する modElement のプロパティから派生します。

于 2013-12-27T11:47:23.077 に答える
0

私は似たようなことをしていますが、ページの読み込みをカウントするには、最後の少しが欠けているように見えます: $current->save();

<?php
$docID = $modx->resource->get('id');

$tvIdm = 32;
$tvm = $modx->getObject('modTemplateVar',$tvIdm );
$tvm->setValue($docID, $tvm->getValue($docID) + 1 );
$tvm->save();
于 2012-12-06T01:55:49.283 に答える