本篇文章主要介紹怎樣在dede中用php標籤結合sql使用,感興趣的朋友參考下,希望對大家有所協助。
{dede:php} //echo 'vvvv'; {/dede:php} {dede:php} //print_r($refObj->Fields); $sql = "select ars.*, art.typedir from dede_archives AS ars LEFT JOIN dede_arctype AS art ON ars.typeid=art.id where typeid=2 ORDER BY weight ASC "; $dsql->SetQuery($sql);//將SQL查詢語句格式化 $dsql->Execute();//執行SQL操作 //通過迴圈輸出執行查詢中的結果 while($row = $dsql->GetArray()){ $link = $refObj->Fields['indexurl'].'/'.$row['typedir'].'/'.$row['id']; $link = str_replace('{cmspath}', '', $link); $class = "ahy"; if($refObj->Fields['id'] == $row['id']) $class="ahytt"; echo '<a href="'.$link.'.html" class="'.$class.'">'; echo $row['title']; echo '</a> '; } {/dede:php}
{dede:sql}標籤的用法
sql標籤可以稱得上是個萬能標籤了,查詢資料庫將其輸出,這裡介紹一些關於這個標籤的用法:
1.用來輸出統計內容,這個是不錯的,舉個例子,我們來統計下總共發了多少的文章,思路就是輸出dede_addonarticle這個文章附加表內容總數就可以了。
{dede:sql sql="SELECT COUNT(*) AS nums FROM dede_addonarticle"} [field:name = "nums"/] {/dede:sql}
2.使用~field~來進行特殊的查詢,比如之前論壇上面很多會員需要做一個輸出當前發布文章會員的相關內容,之前用sql或者arclist標籤是沒辦法實現的,因為每篇內容是不同的,這裡我們來用5.5的sql語句來做個示範。
我們首先在文章模板中相應的位置加上下面的標籤
{dede:sql sql="SELECT * FROM dede_archives WHERE writer=~writer~"} [field:id/], DEDE模板 {/dede:sql}
這個放到article_article.htm頁面,將會檢索出當前會員發布的相關文章,這裡的~ writer~會根據當前內容的環境變數進行替換後再執行查詢。
這裡出現在SQL語句中條件查詢的~ writer~,也就是$refObj->Fields[$value]這個裡面的相關內容
模板中使用PHP
許多人希望織夢的模板標籤能夠更加靈活,加入可以運行PHP的功能,這裡在DedeCMS V5.5中就加入了一個可以執行php的特殊標籤{dede:php}{/dede:php},這個標籤可以執行PHP語句了。
我這裡舉幾個常用的例子:
1.最簡單的輸出內容:
{dede:php} $numA = 1; $numB = 2; echo $numA + $numB; {/dede:php}
在 {dede:php}裡想要輸出資訊 可以直接使用print , echo 之類的列印出來 賦值給@me 無效
這個輸出的內容是計算結果:
3
2.結合SQL查詢輸出單條內容
{dede:php} $row = $dsql->GetOne('select id,typename from dede_arctype where id=2'); print_r($row); {/dede:php}
這個輸出的內容是
Array ( [id] => 2 [typename] => 問答 )
3.擷取當前頁面的變數
比如我們這裡進入系統背景[模板]-[全域標記測試],我們在代碼中填入下面的內容:
{dede:php} print_r($refObj->Fields); {/dede:php}
在PHP中想要擷取dede某個欄位值 可以使用 $refObj->Fields 對象來擷取 列入擷取 title => $refObj->Fields['title']
如果環境變數保持預設,即“不使用環境ID”,我們會看到以下的結果:
Array ( [typeid] => 0 [phpurl] => /plus [indexurl] => / [templeturl] => /templets [memberurl] => /member [specurl] => /special [indexname] => 首頁 [templetdef] => /templets/default )
那我們再換個環境變數測試看看,這裡以我本地的欄目為測試了:
Array ( [id] => 3 [reid] => 0 [topid] => 0 [sortrank] => 1 [typename] => 產品 [typedir] => {cmspath}/product … … [indexname] => 首頁 [templetdef] => /templets/default [position] => 首頁 > 產品 > [title] => 產品 )
這樣一來就檢索出當前頁面的局部變數了,接下來我們可以來結合前面的SQL語句來實現根據不同環境ID調用內容不同欄目內容。
例如:
{dede:php} $thisid = $refObj->Fields['id']; $row = $dsql->GetOne('select id,typename from dede_arctype where id='.$thisid); print_r($row); {/dede:php}
這樣是來調用當前欄目的標題,這個標籤功能類似於{dede:field.typename/}
接下來我們通過執行查詢對sql及輸出變數進行處理:
$dsql->Execute('me',$sql); while($rs = $dsql->GetArray('me')) { //根據屬性處理查詢變數 $rs['title'] = cn_substr($rs['title'], $titlelen); //擷取底層模板 $ctp->LoadSource($innertext); foreach($ctp->CTags as $tagid=>$ctag) { if(!empty($rs[strtolower($ctag->GetName())])) { $ctp->Assign($tagid,$rs[$ctag->GetName()]); DEDE模板 } } //根據底層模板及查詢變數得到處理結果 $revalue .= $ctp->GetResult(); }
這樣我們 就將查詢出來的結果同底層模板中出現的相關變數進行替換,然後產生輸出字串,將所有的字串資訊儲存到$revalue中。
最後返回這個值 return $revalue;
整個檔案內容如下:
if(!defined('DEDEINC')) { exit("Request Error!"); } function lib_writerarc(&$ctag,&$refObj) { global $dsql,$envs; //屬性處理 $attlist="row|12,titlelen|24"; FillAttsDefault($ctag->CAttribute->Items,$attlist); extract($ctag->CAttribute->Items, EXTR_SKIP); $revalue = ''; $innertext = $ctag->GetInnerText(); $ctp = new DedeTagParse(); $ctp->SetNameSpace('field', '[', ']'); $sql = "SELECT * FROM dede_archives WHERE writer='{$refObj->Fields['writer']}' limit 0, $row"; $dsql->Execute('me',$sql); while($rs = $dsql->GetArray('me')) { //根據屬性處理查詢變數 $rs['title'] = cn_substr($rs['title'], $titlelen); //擷取底層模板 $ctp->LoadSource($innertext); foreach($ctp->CTags as $tagid=>$ctag) { if(!empty($rs[strtolower($ctag->GetName())])) { $ctp->Assign($tagid,$rs[$ctag->GetName()]); } } //根 據底層模板及查詢變數得到處理結果 $revalue .= $ctp->GetResult(); } return $revalue; } ?>
接下來我們來測試我們這個標籤,我們修改 article_article.htm模板,在裡面加入以下的標籤代碼:
{dede:writerarc row='10' titlelen='6'} [field:title/] {/dede:writerarc}
相關推薦:
dedecms5.7最新sql利用 guestbook.php注射漏洞
dedecms SESSION變數覆蓋導致SQL注入common.inc.php的解決
PHP命令注入dedecms遠程寫檔案連結執行個體分享