SOY CMSのブロックの機能で、
記事の並べ順をランダムにしたいという質問があった。
SOY CMSのブロック機能で自由に定義を決められるのは、
スクリプトモジュールブロックだけなので、
とりあえずスクリプトモジュールブロックでランダム表示を書いてみた。
スクリプトモジュールブロックはなんぞや?ということもあるだろうから、
スクリプトモジュールブロック関連の記事を貼っておく。
早速ファイルを作成してみる。
ファイルは
/site(サイトID)/script/soycms_random.php
にした。
作成したsoycms_random.phpに下記のコードを記述した。
<?php function soycms_random(){ $pageId = (int)$_SERVER["SOYCMS_PAGE_ID"]; //ブログページか調べる $template = ""; try{ $blog = SOY2DAOFactory::create("cms.BlogPageDAO")->getById($pageId); $uri = str_replace("/" . $_SERVER["SOYCMS_PAGE_URI"] . "/", "", $_SERVER["PATH_INFO"]); //トップページ if($uri === (string)$blog->getTopPageUri()){ $template = $blog->getTopTemplate(); //アーカイブページ }else if(strpos($uri, $blog->getCategoryPageUri()) === 0 || strpos($uri, $blog->getMonthPageUri()) === 0){ $template = $blog->getArchiveTemplate(); //記事ごとページ }else{ $template = $blog->getEntryTemplate(); } }catch(Exception $e){ try{ $template = SOY2DAOFactory::create("cms.PageDAO")->getById($pageId)->getTemplate(); }catch(Exception $e){ return array(); } } try{ $blocks = SOY2DAOFactory::create("cms.BlockDAO")->getByPageId($pageId); }catch(Exception $e){ return array(); } if(!count($blocks)) return array(); $block = null; foreach($blocks as $obj){ if($obj->getClass() == "ScriptModuleBlockComponent"){ $block = $obj; } } if(is_null($block)) return array(); //ラベルIDを取得とデータベースから記事の取得件数指定 $labelId = null; $count = null; if(preg_match('/(<[^>]*[^\/]block:id=\"' . $block->getSoyId() . '\"[^>]*>)/', $template, $tmp)){ if(preg_match('/cms:label=\"(.*?)\"/', $tmp[1], $ltmp)){ if(isset($ltmp[1]) && is_numeric($ltmp[1])) $labelId = (int)$ltmp[1]; } if(preg_match('/cms:count=\"(.*?)\"/', $tmp[1], $ctmp)){ if(isset($ctmp[1]) && is_numeric($ctmp[1])) $count = (int)$ctmp[1]; } }else{ return array(); } $entryDao = SOY2DAOFactory::create("cms.EntryDAO"); $sql = "SELECT ent.* FROM Entry ent ". "JOIN EntryLabel lab ". "ON ent.id = lab.entry_id ". "WHERE ent.openPeriodStart < " . time() . " ". "AND ent.openPeriodEnd >= " .time() . " ". "AND ent.isPublished = " . Entry::ENTRY_ACTIVE . " "; $binds = array(); //ラベルIDを指定する場合 if(isset($labelId)){ $sql .= "AND lab.label_id = :labelId "; $binds[":labelId"] = $labelId; } $sql .= "GROUP BY ent.id "; if(SOY2DAOConfig::type() == "mysql"){ $sql .= "ORDER BY Rand() "; }else{ $sql .= "ORDER BY Random() "; } if(isset($count) && $count > 0) { $sql .= "Limit " . $count; } try{ $res = $entryDao->executeQuery($sql, $binds); }catch(Exception $e){ $res = array(); } if(!count($res)) return array(); $entries = array(); foreach($res as $v){ $entries[] = $entryDao->getObject($v); } return $entries; } ?>
なんとこのコード、
ラベル名や記事の取得件数をテンプレートでのブロックの記述の際に指定することができるため、
サイトの至るところで使い回すことが可能です。
使い方は、
テンプレートのブロックの記述の際に、
<!-- block:id="test" cms:label="2" cms:count="5" --> <h3 cms:id="title">記事タイトル</h3> <div cms:id="content">記事本文</div> <!-- /block:id="test" -->
cms:labelはランダム表示したい記事のラベルID、
cms:countはランダム表示したい記事数を指定で、
指定しない場合は片っ端から記事を取得します。
テンプレート周りをもう少し手を加える必要がありますが、
一応動作するのでよろしければご利用ください。
今回のコードはフォーラムにアップロードしました。
SOY CMS フォーラム • トピックの表示 - ラベル毎の記事ランダム並び替え