maki-o memo

制作に関する私的なメモです

選択されているタグ : smarty , php

phpでカレンダーを作りました

カレンダーを作ったので、メモ。

まず、表示したい月を決めます。
たとえば、現在の月を表示したいなら、

$nowts = time();

という、現在のタイムスタンプを格納する変数をつくる。
これを起点日とします。
今日以前は表示したくないカレンダーを作りたかったので、
この変数を基準に必要なパラメータを出していきます。

  • $stweek = date("w",$nowts);//起点日の曜日番号
  • $stday = date("j",$nowts);//起点日
  • $edday = date("t",$nowts);//起点日の月の最終日

まず、$nowts の月の残り日数を計算します。

$nokori = $edday-($stday-1);

起点日から-1をしないと引きすぎてしまいます。
ここに、$stweekを足します。
カレンダーは週単位で計算しないといけないので、起点日の週の既に終わった日も プラスしてあげないといけません。
なので、

$nokori += $stweek;

これをさらに、週の日数である、7で割り、切り上げます。
そうすると、計算すべき週数が出ます。

$nokori = ceil($nokori/7);

これで、必要なパラメータが揃いました。
これを処理して、smartyのテンプレートで表示したいので、加工しやすいように 配列を作ります。


さくらでのSmarty設置

さくらでのSmarty設置ですが、 まず、公式サイト(http://www.smarty.net/)から、Smarty本体をDL。

解凍します。

解凍したものの中に、libsフォルダがあるので、それをさくらのサーバーにアップする。 さくらのサーバーの公開ディレクトリまでのパス構造は、 /home/アカウント名/www になっているが、公開ディレクトリより上層のディレクトリにも設置可能な為、 /home/アカウント名/ に、上記libsフォルダをアップロード。

templatesディレクトリ&templates_cディレクトリも、公開ディレクトリより上層へ設置したかった為、 MySmarty.class.phpを作成。内容は↓

<?php

define ("ROOT_DIR" ,$_SERVER['DOCUMENT_ROOT']."/..");

require_once("Smarty.class.php");

class MySmarty extends Smarty {
function MySmarty () {
$this->template_dir = ROOT_DIR."/templates";
$this->compile_dir = ROOT_DIR."/templates_c";

$this->left_delimiter = "<{";
$this->right_delimiter = "}>";

$this->Smarty();
}
}

?>

デリミタも、<{}>に変更してます。 libs内へアップロード。

phpでの呼び出し時は、

require_once ("../libs/MySmarty.class.php" );

で、いけました。


smartyでの多次元配列の扱い

検証モデル:

$rec = array (
array (&quot;id&quot; =&gt; &quot;01&quot; , &quot;name&quot; =&gt; &quot;久保田&quot; , &quot;list&quot; =&gt; &quot;php,mysql,css&quot;) ,
array (&quot;id&quot; =&gt; &quot;02&quot;, &quot;name&quot; =&gt; &quot;山本&quot; , &quot;list&quot; =&gt; &quot;mt,css,design&quot;) ,
array (&quot;id&quot; =&gt; &quot;03&quot; , &quot;name&quot; =&gt; &quot;立松&quot; , &quot;list&quot; =&gt; &quot;mt,css,dance&quot;)
);

というデータがあったとします。 まず、これの、listの値をコンマで分けて配列に格納したい場合、

foreach ( $rec as $key =&gt; $value ) {
$rec[ $key ][ &quot;list&quot; ] = explode (&quot;,&quot; , $value[&quot;list&quot; ]);
}

という式で、listの中にさらに配列ができます。 ポイントは、$valueで配列を指定しているところです。 この場合、$valueには、arrayという値が入っているはずです。

このデータをテンプレートで出力する場合、まず、

$smarty->assign ( "rec" , $rec );

でアサインし、 テンプレート側では、

{foreach item=value key=key from=$rec name=rec}
&lt;p&gt; {$value.id} &lt;/p&gt;
&lt;p&gt; {$value.name} &lt;/p&gt;
{foreach item=seplist from=$value.list name=seplist}
{if $smarty.foreach.seplist.first}
&lt;ul&gt;
    &lt;li&gt; {$seplist} &lt;/li&gt;
{/if}
    &lt;li&gt; {$seplist} &lt;/li&gt;
{if $smarty.foreach.seplist.last}
    &lt;li&gt;  {$seplist} &lt;/li&gt; 
&lt;/ul&gt;
{/if}
{/foreach}
{/foreach}

と、記述します。 id、nameは、$valueに続けて.でキーをつなげてやれば出力されますが、 listには更に配列が格納されているので、foreachを入れ子にし、 出力を定義させてやる必要があります。


プロフィール

フロントエンドエンジニア

Tomokazu Makita

名古屋でフリーランスでWeb制作してます。 フロントエンドのことを主にやってます。
a-blog cmsを使用したサイト制作が得意です。
お仕事のご相談随時受付中。

雪山大すき。冬は雪山の合間に仕事します。
財布はいつも吹雪です。

エントリーリスト

タグ