hodakaの居場所

XOOPSTips集 - 最新エントリー

tinyDでトップページなのにprevボタン?

カテゴリ : 
モジュール
執筆 : 
hodaka 2005/2/7 16:54
tinyDというのは大変良くできていて、通常homepage指定と表示順を正しく設定していれば標題のようなケースは起こらない。どういうわけかお悩みの方もおられるので、罠をかけて一つずつ調べていったらどうだろうか。 第一ステップ:sql文をちょっと変更。
// Page Navigation
if( ! empty( $xoopsModuleConfig['tc_display_pagenav'] ) ) {
  $whr_sub = $xoopsModuleConfig['tc_display_pagenav'] == 2 ? "submenu=1" : "1" ;
  $result = $xoopsDB->query("SELECT storyid,title,link FROM ".$xoopsDB->prefix( \
  "tinycontent{$mydirnumber}" )." WHERE $whr_sub AND visible ORDER BY \
  homepage DESC,blockid" ) ;
これでうまくいかない場合は、第二ステップ:$prev_arrayの中身がなぜ壊れるのか?を確認するため。
// Page Navigation
if( ! empty( $xoopsModuleConfig['tc_display_pagenav'] ) ) {
  $whr_sub = $xoopsModuleConfig['tc_display_pagenav'] == 2 ? "submenu=1" : "1" ;
  $result = $xoopsDB->query("SELECT storyid,title,link FROM ".$xoopsDB->prefix( \
  "tinycontent{$mydirnumber}" )." WHERE $whr_sub AND visible ORDER BY   homepage DESC,blockid" ) ;
  $prev_array = $next_array = array();
  while( $tmp_array = $xoopsDB->fetchArray( $result ) ) {
    if( $tmp_array['storyid'] == $id ) {
      $next_array = $xoopsDB->fetchArray( $result ) ;
      break ;
    }
    $prev_array = $tmp_array ;
  }
}
var_dump($prev_array);
var_dump($next_array);
redirect_header("index.php",30,"check variables");
if( ! empty( $prev_array ) ) {
通常$prev_arrayが空だけど、その場合は別の罠をかけなければいけない。 もしここにprevページの表示が表示されていたらそれがヒント。

word検索・置換ソフト Devas

カテゴリ : 
その他
執筆 : 
hodaka 2005/2/5 20:47
XOOPSをやってると、ちょっとだけ手を入れたくなる時がある。 たとえば、日本語。「コメントする」が「投稿する」では、ただでさえXOOPSのGUIが取っ付きにくいのに、腰が引けてしまう。 これを修正したい、変更したい。だけど、定義している場所が不明で、という質問がXOOPS日本フォーラムに投げられるケースが見られる。これらlanguageに関するものは、XOOPSにある程度慣れれば解消できるだろう。 しかし、スクリプトやテンプレートをちょっとハックしたいというような場合、その変数がどこで生成され、assignされ、参照されるか、あるいはその関数はどこで定義されているのか、などを調べるのは案外大変なものである。 そこでお薦めがフリーウェアDevasである。フォルダ単位で一発で検索できるうえ、場合によっては一発置換もできる。だからデュープリケータブルなモジュールでなくても、モジュール複製も簡単にできてしまう。 XOOPSを手がける人は、EUCコードが扱えるエディタはもちろん、ファイルのword検索・置換ソフトも常備すべきであろう。

MultiMenuテンプレート変更

カテゴリ : 
モジュール
執筆 : 
hodaka 2005/2/3 11:44
05.02.24追) ver.1.14からモジュールにデフォルト組み込みになったのでこの項はdepricatedです。 マルチメニューがどんどん進化している。これを元にすればパン屑モジュールも簡単に作れるかもしれないな。 それはおいといて。今回は、multiMenuで作られた各ブロックの先頭行のclassを変更する話。system/blocks/system_blocks.phpが吐き出すメニューブロックを受けて、テンプレートは先頭行(デフォルトではホーム)のclassはmenuTop、その他はmenuMainとなっている。したがって、デフォルトをベースとしたテーマに付随するcssファイルにも両方が記述されるのが普通。 これに対しmultiMenuは全部menuMainなんだ。 だからcssでborder-topまたはborder-bottomなどを使う場合、区別できない問題が発生する。 そこで先頭行のみclassをmenuTopとする場合のテンプレートハック。
<{foreach item=imenu from=$block.contents}>
<{foreach name=menuloop item=imenu from=$block.contents}>
  <{if $imenu.link != ""}>
    <a class="menuMain" href="<{$imenu.link}>" target="<{$imenu.target}>"><{$imenu.title}></a>
    <{if $smarty.foreach.menuloop.first}>
      <a class="menuTop" href="<{$imenu.link}>" target="<{$imenu.target}>">
    <{else}>
      <a class="menuMain" href="<{$imenu.link}>" target="<{$imenu.target}>">
    <{/if}>
    <{$imenu.title}></a>
最後の行の場合は$smarty.foreach.menuloop.lastとすればOK。

tinyDの各ページ一覧表を生成する

カテゴリ : 
モジュール
執筆 : 
hodaka 2005/1/26 22:44
tinyDをエッセイ用途などに使ってるとページ数が相当増えてくる。 すると見たいページを現在の「prev/next」ナビで探すのは一苦労。もちろんカテゴリー化すればサブメニューで整理できるのだが。 そんなときに全ページの一覧リストでもあると非常に親切かもしれない。 ということでチャレンジ。

...続きを読む

新メニューに「new.gif」を添付する

カテゴリ : 
モジュール
執筆 : 
hodaka 2005/1/26 19:06
XOOPSのリデザインを参考に、新着メニュー欄に画像を添付してみる。 メインメニュ用テンプレートファイルsystem_block_mainmenu.htmlをちょいと加工。
<!-- start module menu loop -->
<{foreach item=module from=$block.modules}><a class="menuMain" href="<{$xoops_url}>/modules/<{$module.directory}>/">
<{$module.name|replace:"/new":"<img src='$xoops_url/uploads/new.gif' alt='新メニューです' />"}>
<!--<{$module.name}>-->
</a>
続いてモジュール管理で新モジュール名の後ろに「/new」を追加。 正規表現を知らなくてもreplaceで大丈夫。 さらにmultiMenuの場合は$module.nameでなくて$imenu.title。
XOOPS Hackersサイトを参考にxoopsのrootディレクトリ直下にex_assign.phpを作る。

...続きを読む

パンくずを表示する

カテゴリ : 
テーマ
執筆 : 
hodaka 2004/10/25 15:45
参考)XOOPS Hackers XOOPSのソースに手をいれないで、使えるテンプレート変数を増やす方法 まずex_assign.phpに以下を追加。

global $xoopsRequestUri;
if ( is_object($xoopsModule) ) {
  $this->assign('ex_moduledir', $xoopsModule->getVar('dirname'));
  $this->assign('ex_modulename', $xoopsModule->getVar('name'));
  if( count($xoopsModule->subLink()) > 0 ) {
    $replacedUri = preg_replace("/\/modules\/".$xoopsModule->getVar('dirname')."\/(.*)$/i", "$1", $xoopsRequestUri);
    foreach( $xoopsModule->subLink() as $sublink ) {
      if( $sublink['url'] == $replacedUri ) {
        $this->assign('ex_sublinkname', $sublink['name']);
      }
    }
  }
}
これでテーマにカレントのモジュール名、サブメニュー名が渡される。 テーマでは:

<{include_php file="$xoops_rootpath/ex_assign.php"}>
<div id="breadcrumb">&raquo;&nbsp;
<{if $ex_modulename}><a href="/">HOME</a>&nbsp;&raquo;&nbsp;
  <{if $ex_sublinkname}><a href="/modules/<{$ex_moduledir}>/"><{$ex_modulename}></a>&nbsp;&raquo;&nbsp;<{$ex_sublinkname}>
  <{else}><{$ex_modulename}>
  <{/if}>
<{else}>HOME
<{/if}>
</div>
として好きな場所に配置。 (»の部分は&raquo;(小文字)と読み替えて)

簡単dropdownメニュー

カテゴリ : 
テーマ
執筆 : 
hodaka 2004/10/14 16:58
以下のdropdownmenu.htmlを作成。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head><title>drop down</title>
<style type="text/css">
body {
  font-family: arial, helvetica, serif;
}
ul { /* all lists */
     padding: 0;
     margin: 0;
      list-style: none;
}
li { /* all list items */
    float: left;
    position: relative;
     width: 10em;
}
li ul { /* second-level lists */
      display: none;
      position: absolute; 
    top: 1em;
   left: 0;
}
li > ul { /* to override top and left in browsers other than IE, which will position to the top right 
of the containing li, rather than bottom left */
 top: auto;
  left: auto;
}
li:hover ul, li.over ul{ /* lists nested under hovered list items */
    display: block;
}
#content {
  clear: left;
}
</style>
<script language="JavaScript">
<!--
function SymError()
{
  return true;
}
window.onerror = SymError;
//-->
</script>

<script type="text/javascript"><!--//--><![CDATA[//><!--
startList = function() {
  if (document.all&&document.getElementById) {
        navRoot = document.getElementById("nav");
       for (i=0; i<navRoot.childNodes.length; i++) {
           node = navRoot.childNodes[i];
           if (node.nodeName=="LI") {
              node.onmouseover=function() {
                   this.className+=" over";
                }
               node.onmouseout=function() {
                    this.className=this.className.replace(" over", "");
             }
           }
       }
   }
}
window.onload=startList;
//--><!]]></script>
</head>
<body>
<ul id="nav">
  <li>フォトアルバム
    <ul>
      <li><a href="">投稿する</a></li>
      <li><a href="">自分の投稿</a></li>
      <li><a href="">高人気</a></li>
      <li><a href="">トップランク</a></li>
    </ul>
  </li>

  <li>ニュース
    <ul>
      <li><a href="">ニュース投稿</a></li>
      <li><a href="">アーカイブ</a></li>
    </ul>
  </li>

  <li>リンク集
    <ul>
      <li><a href="">登録する</a></li>
      <li><a href="">人気リンク</a></li>
      <li><a href="">高評価リンク</a></li>
    </ul>
  </li>
</ul>

<div id="content">
<hr>
dropdownメニューのサンプル。<br>
カーソルを置いてみてください。
</div>
</body>
</html>
このサンプルを応用すればヘッディングにスマートなドロップダウンメニューが作れる。 参考url:http://www.alistapart.com/articles/dropdowns/
サブメニューをもつモジュール名の頭に「+」(展開するリンク)印を付け、これをクリックするとサブメニュー一覧が展開される。一方「ー」(折り畳むリンク)印をクリックするとサブメニュー一覧表示を解消する。 前稿のカレントモジュール識別ハックを前提に。

...続きを読む

modules/system/block/system_blocks.phpに以下を追加。 まずホームがカレントかどうか。
if(empty($xoopsModule)) {
   $block['ishomecurrent'] = "current";
} else {
  $block['ishomecurrent'] = "no-current";
}
次いでカレントモジュールの識別。
if((!empty($xoopsModule)) && ($i == $xoopsModule->getVar('mid'))) {
   $block['modules'][$i]['current'] = "current";
} else {
   $block['modules'][$i]['current'] = "no-current";
}
テンプレマネでmodules/system/templates/blocks/system_mainmenu.htmlを編集。
<a class="menuTop" href="<{$xoops_url}>/"><{$block.lang_home}></a>
これを以下に変更。
<a class="menuTop" id="<{$block.ishomecurrent}>" href="<{$xoops_url}>/"><{$block.lang_home}></a>

次いで、
      <a class="menuMain" href="<{$xoops_url}>/modules/<{$module.directory}>/"><{$module.name}></a> 
を以下に変更。
      <a class="menuMain" id="<{$module.current}>" href="<{$xoops_url}>/modules/<{$module.directory}>/"><{$module.name}></a>
style.cssの編集。td#mainmenuの最後に以下を追加。
td#mainmenu a#current {
 該当モジュールがカレントのときの記述
}

ログイン


ユーザー名:


パスワード:





パスワード紛失