独自のバナーツイストを作る

以下を可能にする機能を作成します。



1.すべてのバナーを1か所に保存する

2.バナーを表示するページを設定します

3.配送制限を遵守する

4.バナーの宛先アドレス(URL)を指定します



0.9.6.3で正確に動作します(上記のバージョンでは問題を前兆しません)。MODxの知識に応じて、統合に約30分かかります。



MODxを使用するための初期スキルと用語の理解が必要です:スニペット、このCMFのコンテキストでのTV。





すべての実質的な質問に回答させていただきます。



始めましょう:

すべての統合をいくつかのステップに分割します。



1. バナースニペットを作成する



<?php

if (!function_exists( 'setTemplateVar' )) {

function setTemplateVar($ value , $docID, $tplVarName) {

global $modx;



//-- get tmplvar id

$tplName = $modx->getFullTableName( 'site_tmplvars' );

$tplRS = $modx->db-> select ( 'id' , $tplName, 'name="' . $tplVarName . '"' );

$tplRow = $modx->db->getRow($tplRS);



$tblName = $modx->getFullTableName( 'site_tmplvar_contentvalues' );



$selectQuery = $modx->db-> select ( '*' , $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow[ 'id' ]);



$updFields = array (

'value' => $ value

);

$insFields = array (

'tmplvarid' => $tplRow[ 'id' ],

'contentid' => $docID,

'value' => $ value

);



if ($modx->db->getRecordCount($selectQuery) < 1) {

$modx->db->insert($insFields, $tblName);

} else {

$modx->db->update($updFields, $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow[ 'id' ]);

}

}

}



/**/



$vault = 234; //ID



$children= $modx->getActiveChildren($vault, 'menuindex' , 'ASC' );

if (!$children === false ) {



$allBanners = $modx->getDocumentChildrenTVarOutput($vault, array( 'pages' , 'fileBanner' , 'counter' , 'linkToURL' ));



foreach ($allBanners as $idBannerPage=>$banner)

{

$pages = explode( ',' ,$banner[ 'pages' ]);

if ((in_array($modx->documentIdentifier,$pages) || in_array( '-1' ,$pages)) && ($banner[ 'counter' ]>0 || $banner[ 'counter' ] == '-1' ))

{

$path_info = pathinfo(MODX_BASE_PATH.$banner[ 'fileBanner' ]);

switch ($path_info[ 'extension' ]){

case 'swf' :

echo '

<div id="productsSecondaryPromo"></div>

<script type="text/javascript">

// <![CDATA[

var so = new SWFObject("/'
.$banner[ 'fileBanner' ]. '?clickTag=' .$banner[ 'linkToURL' ]. '", "company_right", "214", "308", "7", "#FFFFFF");

so.write("productsSecondaryPromo");

// ]]>

</script>'
; break ;

default : echo '<a href="' .$banner[ 'linkToURL' ]. '"><img src="' .$modx->getConfig( 'base_url' ).$banner[ 'fileBanner' ]. '" alt="" border="0"></a>' ;



}

if ($banner[ 'counter' ] !== '-1' && ( int )$banner[ 'counter' ]>0){ setTemplateVar($banner[ 'counter' ]-1, $idBannerPage, 'counter' );}

}

unset($banner);

}

}

?>




* This source code was highlighted with Source Code Highlighter .








2.次のTVパラメーターを作成します(以下で言及しなかったすべて-デフォルトで残します)。



counterの [入力タイプ]ドロップダウンリストで、[ 数値]を選択します。 デフォルト値は-1です。 テンプレートを選択します。 保存します。



fileBannerの[入力タイプ]ドロップダウンリストで、[ ファイル]を選択します 。 テンプレートを選択します。 保存します。



linkToURLの[入力タイプ]ドロップダウンリストで、 URLを選択します 。 テンプレートを選択します。 保存します。



ページ 、[入力タイプ]ドロップダウンリストで、[ リストボックス(複数選択)]を選択します 。 「可能な値」フィールドに次のように書きます: @SELECT pagetitle、CONCAT(id、 '、')FROM site_content WHERE id NOT IN(2,3,4,5,6,7,8,9,10,11,234)ORDER BY menuindex

デフォルト値は-1です。 テンプレートを選択します。 保存します。



3.バナーリポジトリの作成



次に、ドキュメントツリーに移動し、「BANNERS」という名前の新しいドキュメントを作成し、チェックボックスを「コンテナ(子ドキュメントを含む)」に設定します。 スニペットコードで$ vault変数を見つけて、作成したドキュメント(コンテナ)のIDを割り当てます。



私の場合、これはID 234です

画像



次に、子ドキュメントを追加します-これがバナーの本質です。ドキュメントの下部に、先ほど作成した新しいフィールドが表示されるはずです。



画像



* [インプレッション数...]フィールドで-1から自然数に変更された場合、バナーはこの数に相当するものとして表示されます。 残りのフィールドについては、すべてが明確であると思います。

* MODxコンテキストメニューからドキュメントからアクティビティを削除すると、バナーの表示も停止します

*ページを選択しない場合、バナーはサイトのすべてのページに表示されます

*バナーの読み込みを忘れないでください:)



4.次に、 [[Banner]]スニペットを、バナーを表示する場所に挿入します。



PS:このソリューションは非常にスケーラブルであり、改良することができます。



All Articles