初回のパッチにバグが結構ありました。修正したパッチを掲載しまてます。そちらをご利用ください
wdCalendar†
ユーザ認証なしに使える共有型カレンダー
サイト: http://www.webappers.com/2010/06/08/wdcalendar-jquery-based-google-calendar-clone/
*データベースにmySQLを使います。
機器予約とか会議室予約にわざわざ認証画面を経て入力するのは面倒。
*シングルサインオンなので関係ない方もおられますが、ユーザ不特定の共有機器から予約する場も研究室にはあり得る。
しかも入力は直感的に画面をなぞって予約範囲を決めたいもの。
それができそうなのが、このwdCalender。
オリジナルはphpで書かれており、英語環境に準拠。それだと不便なので下記修正を追加
- 表示を全て日本語
- 日付はyyyy/mm/ddフォーマット
- 先月末の部分や来月初めの予定も表示
- URL変数でテーブル名を指定して、一つのデータベースで複数のカレンダーに対応
- pdo対応(sqlite3で動けばいい)
とか念頭に。
上記URLからwdCalendar.zipというファイルがダウンロードされる。このファイルには
の2つのフォルダが入っている。このうちwdCalendarのみを使います。
まずはMySQLて動作テストをしてみる
■DB(MySQL)
1
2
3
4
5
6
7
| # yum install mysql-server php-mysql
# /etc/init.d/mysql start
# mysql
mysql> CREATE DATABASE wdcalendar;
mysql> use wdcalendar
Database changed
mysql>
|
その後、テーブルを作成します。カラム名の大文字小文字に注意勝手に変更すと正しく動かなくなる
1
2
3
4
5
6
7
8
9
10
11
12
| | CREATE TABLE `jqcalendar` (
`Id` int(11) NOT NULL auto_increment,
`Subject` varchar(1000) character set utf8 default NULL,
`Location` varchar(200) character set utf8 default NULL,
`Description` varchar(255) character set utf8 default NULL,
`StartTime` datetime default NULL,
`EndTime` datetime default NULL,
`IsAllDayEvent` smallint(6) NOT NULL,
`Color` varchar(200) character set utf8 default NULL,
`RecurringRule` varchar(500) character set utf8 default NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
|
このテーブルに対して権限を持つユーザ(cal)を作成します。パスワードは cal001 として。
1
2
3
| | GRANT select,insert,update,delete ON wdcalendar.jqcalendar TO cal@'%' identified by 'cal001';
GRANT select,insert,update,delete ON wdcalendar.jqcalendar TO cal@localhost identified by 'cal001';
FLUSH PRIVILEGES;
|
*cal@'%'の'%'でlocalhostも含まれるかと思ったのだが違うみたい。なので2つ追加します。
っで、接続確認テスト
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| # mysql -ucal -p
Enter password: *パスワード cal001 を入力
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.1.66 Source distribution
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
| wdcalendar |
+--------------------+
3 rows in set (0.07 sec)
mysql> use wdcalendar
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------+
| Tables_in_wdcalendar |
+----------------------+
| jqcalendar |
+----------------------+
1 row in set (0.45 sec)
mysql> select * from jqcalendar;
Empty set (0.06 sec)
mysql>
|
追加品†
個々個別のパッチを作成していたのだが面倒なので、patchファイルを作った。
wdCalendar.20130223.diff *バグがありました。使わないでください。
wdCalendar.20140628.diff *修正版(2014.06.28)
これらを適用して完了。具体的には
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| [root@em ~]# cd /var/www
[root@em www]# wget http://www.web-delicious.com/jquery-plugins-demo/wdCalendar.zip
[root@em www]# unzip -q wdCalendar.zip
[root@em www]# ls -l
(略)
drwxr-xr-x 5 root root 4096 10月 6 22:55 2010 highlighter
drwxr-xr-x 7 root root 4096 10月 6 23:20 2010 wdCalendar
-rw-r--r-- 1 root root 75197 6月 28 10:26 2014 wdCalendar.20140628.diff
-rw-r--r-- 1 root root 517832 6月 28 10:17 2014 wdCalendar.zip
(略)
[root@em www]#
[root@em www]# patch -p1 < wdCalendar.20140628.diff
patching file wdCalendar/css/calendar.css
patching file wdCalendar/edit.db.php
patching file wdCalendar/edit.php
patching file wdCalendar/php/datafeed.db.php
patching file wdCalendar/php/datafeed.php
patching file wdCalendar/php/dbconfig.php
patching file wdCalendar/php/functions.php
patching file wdCalendar/sample.php
patching file wdCalendar/src/Plugins/datepicker_lang_JA.js
patching file wdCalendar/src/Plugins/jquery.calendar.js
patching file wdCalendar/src/Plugins/jquery.datepicker.js
patching file wdCalendar/src/Plugins/wdCalendar_lang_JA.js
[root@em www]#
|
として。完成後httpdの設定として
1
2
3
4
5
6
7
8
9
| [root@em ~]# vi /etc/httpd/conf.d/wdCalendar.conf
Alias /wd /var/www/wdCalendar
<Directory "/var/www/wdCalendar">
DirectoryIndex sample.php
Order Deny,Allow
Deny from all
Allow from 127.0.0.1 192.168.0.0/24
</Directory>
[root@em ~]#
|
としてhttpdを再読み込みさせればいいのかと。
1
2
3
4
5
| [root@em ~]# /etc/init.d/httpd configtest
Syntax OK
[root@em ~]# /etc/init.d/httpd reload
httpd を再読み込み中:
[root@em ~]#
|
な感じで
スナップショット
テーブル毎にカレンダーを用意するには†
まず、用途のテーブルを作成します。CREATE TABLE のテーブル名のみ違います。他のフィールドなどは同じです。
# mysql
mysql> use wdcalendar
としてデータベースwdcalendarに移り、下記SQLを実施。テーブル名をakta_fplc_01に変更してます。
mysql>CREATE TABLE `akta_fplc_01` (
`Id` int(11) NOT NULL auto_increment,
`Subject` varchar(1000) character set utf8 default NULL,
`Location` varchar(200) character set utf8 default NULL,
`Description` varchar(255) character set utf8 default NULL,
`StartTime` datetime default NULL,
`EndTime` datetime default NULL,
`IsAllDayEvent` smallint(6) NOT NULL,
`Color` varchar(200) character set utf8 default NULL,
`RecurringRule` varchar(500) character set utf8 default NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
そして、このテーブルに対するアクセス権を付与
mysql> GRANT select,insert,update,delete ON wdcalendar.akta_fplc_01 TO cal@'%' identified by 'cal001';
mysql> GRANT select,insert,update,delete ON wdcalendar.akta_fplc_01 TO cal@localhost identified by 'cal001';
初めから wdcalendar.* でもよかったのかもしれないが。
その後、構築したサイトがcalendar.chaperone.jpなら
http://calendar.chaperone.jp/wdCalendar/sample.php?tbl=akta_fplc_01
とすれば、新規のカレンダーが利用できます。
*注意点:テーブル名は大文字小文字を区別します(DB依存ですけど)
ほかのDBで使ってみる†
パッチはPDOに対応させているので、他のDBでも利用できます。
sqliteを使う場合
1
2
3
4
5
6
7
8
9
10
11
| | CREATE TABLE `jqcalendar` (
`Id` INTEGER PRIMARY KEY AUTOINCREMENT,
`Subject` varchar(1000) default NULL,
`Location` varchar(200) default NULL,
`Description` varchar(255) default NULL,
`StartTime` datetime default NULL,
`EndTime` datetime default NULL,
`IsAllDayEvent` smallint(6) NOT NULL,
`Color` varchar(200) default NULL,
`RecurringRule` varchar(500) default NULL
);
|
となる。AUTOINCREMENT(sqlite)/auto_increment(mysql)な機能をサポートしていないと使えないようです。
postgresならID列をserial型にすればいいのかな(「ID serial」)
MSSQLならIDENTITYキーワードを付与(「ID int PRIMARY KEY IDENTITY」)
ORACLEだと....トリガー設置とかになるのかな....
エラー†
MysqlデータベースとWebサーバがそれぞれ別個に立っていた際、WebサーバのSELinuxが有効だと
PHP Warning: mysql_connect(): Can't connect to MySQL server on 'dbMySQL' (13) in /var/www/wdCal/php/dbconfig.php on line 5,
とapacheのエラーログに言われる。いい加減SELinuxを習得すればいいのだが、/etc/sysconfig/selinuxでDisabledにて回避した。
エラーその2†
初回導入時に下記のようなエラーが見えたら
恐らく、phpのtimezone関係かと。date.timezone ='Asia/Tokyo'を[Date]内で定義して、httpをreloadしてみる
# vi /etc/php.ini
(中略)
[Date]
date.timezone ='Asia/Tokyo'
(中略)
#
# /etc/init.d/httpd reload
エラーその3†
それでもエラーが継続しているようなら、、、phpのデータベース関係が入ってるか確認
# yum list php php-cli php-common php-mbstring php-pdo php-mysql
にてこれらがインストールされているかを確認する。
エラーその4†
データベース接続をテストしてみます。
# vi /tmp/test.php
<?php
$dsn = "mysql:host=localhost;dbname=wdcalendar";
$u = "cal"; // ユーザ
$p = "cal001"; // パスワード
$db = new PDO( $dsn, $u, $p);
?>
#
# php -f /tmp/test.php
これでエラーが出なけれないいのですが、、、
国民の祝日†
公的なお休みデータを取り込むには。perlのCPANを使って月一で作業もいいのだがiCALデータの取り込みを考えた。
アップル様がhttpで取得可能な公休データをiCALで流しているので、それを使う。利用目的が違うから駄目とかになるかな?
っで、拾ったiCALデータを構文解析してDBへ投入。同じデータを取り込まないような工夫が必要なのだが、
ここでは公休日の名称と日付で紐ずけて、あるなら削除、そして登録といったエレガントではない方法を使う。残念だが。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| #!/usr/bin/perl
# wget ical.mac.com/ical/Japanese32Holidays.ics
use strict;
use DBI;
my $dbh = DBI->connect('dbi:mysql:wdcalendar','cal','cal001');
$dbh->do("SET NAMES utf8");
my $s1 = "DELETE FROM jqcalendar WHERE SUBJECT=? and STARTTIME=? and ENDTIME=? and ISALLDAYEVENT=1";
my $s2 = "INSERT INTO jqcalendar ( SUBJECT,DESCRIPTION,STARTTIME,ENDTIME,ISALLDAYEVENT,COLOR ) values ( ?,?,?,?,1,'1' )";
my $st1 = $dbh->prepare( $s1 );
my $st2 = $dbh->prepare( $s2 );
my $f="Japanese32Holidays.ics";
open(F,$f);
while(<F>){
chomp;
if ( /^BEGIN:VEVENT/ ){
my $start=0;
my $sub="";
my $desc="";
while(<F>){
last if (/^END:VEVENT/ );
# DTSTART;VALUE
if ( /^DTSTART;VALUE=DATE:(\d+)$/ ){
$start = $1;
}elsif ( /^SUMMARY:(\S+)$/ ){
$sub = $1;
}elsif ( /^RESOURCES;LANGUAGE=EN:(.*)$/){
$desc = $1;
}
}
$st1->bind_param(1,$sub);
$st1->bind_param(2,$start);
$st1->bind_param(3,$start);
$st1->execute;
$st2->bind_param(1,$sub);
$st2->bind_param(2,$desc);
$st2->bind_param(3,$start);
$st2->bind_param(4,$start);
$st2->execute;
print $start.": ".$sub." ".$desc."\n";
}
}
|
ぁーエレガントさが足りぬ。