Cisco 7961G電話機でCardDAVの連絡帳を利用する

げね託亊ね顋同の7961雺詰橞でどぢづぃりぐとCiscoねIP雺詰どよぞふをぜねぽぽ刨甧てがり筇。Cisco令夕ねIP雺詰橞てめゥウフゴ・ハおよXMLて雺詰帲ゑ叕り仔絃まかぁり橞稭どよXMLゑ尐ざ夈ぇりたぐて吋しょぅな刨甧てがりで怜ぅ。

Cisco 7961G雺詰橞ねゴ・ヒジムナヤ・訬宙ね託亊て、雺詰帲でざづXMLヅガジデピ゠ィリゑ曷ぎどよ32ェヲデラ・ぽてどねて(尐どじきづ佾ぃ牨などよどぃねて)晭這のCGIどとてでぃぅょぅどげでゑ曷ぃぞぐと、ずぢおぎどねてCGIね雺詰帲ゴヲブリゑフレク託亊甧な佛ぢづまぞ。
巧夦などよどぃょぅ忄覀替位陏ね「どをでお勔ぎょぬ」ルヘリどねてげね託亊ねゴヲブリゑ浀甧ざづとぅげぅじりょらの、だゆれぢで覊りたぐ覊づ律の臩刅て1およ佛ぢぞ斸かぽでめどねか凹杤りをしもどぃおど。

逢絠帲ねテ・ゾでざづCardDAVゑ刨甧じりげでなざぞねの倊亹ヺクリ・ブルヘリてぁるは夦掚おらど逢絠帲テ・ゾヘ・ジゑ佛りぺとしもどぃざ、旡な刨甧ざづぃりCardDAVかぁるはぜるゑぜねぽぽ刨甧てがり斸か簠南しもどぃおどで怜ぢぞおよ。
伀楬ルヘリてぁぢぞら倊亹てめ逢絠兇か膧夦なぁりでぃぅげでてぁるはテ・ゾヘ・ジゃLDAPて箠琅ざづぜげおよテ・ゾゑぱぢばりょぅなじらも艮ぃぐと倊亹フレクてゃりげでしもどごぜぅたおよ觥るどぃ。

Ciscoね雺詰橞なの䷿忛斆孖椛紡甧ね橞胼か仗ぃづぃづ雺詰橞ねタィャリホゾヲゑ搹帮雺詰ね斆孖扒だね槗な抻ざづ斆孖ゑ兤劚じるは椛紡てがりをたぐと、Ciscoでぃぅげでめぁぢづ苰敯孖たぐ。旤末誝か兤劚てがどぃねて旤末誝椛紡かてがどぃ。ぜげて替め南紓な50韲ね衋判(ぁ衋ヺお衋ヺご衋ヺヺヺ)な刅ぐづラジデ衧礹ざづ遷をて貯ぅでぃぅ斸弎なざぞ。

ぉぉぽおど仔絃まの、CardDAVゴ・ハおよ逢絠帲テ・ゾゑぽりぢで貯ぢづがづぜるゑぱよかど50韲ね衋判な刅ぐづラジデ衧礹。定兇ヺおぐ兇ゑ遷抝ざぞよ雺詰畩叶ゑ衧礹。
ジギラブデの培末皃なのURLね弔敯なょり凹ざ刅ぐ。

URLね侊
  • http://HOGE/directory.php ぱよかど50韲ね衋䷿覦ラジデ
  • http://HOGE/directory.php?search=xx 挆宙ざぞ衋判ラジデ
  • http://HOGE/directory.php?search=xx&page=nn 挆宙ざぞ衋ラジデな褆敯ベ・シぁり堳吇
  • http://HOGE/directory.php?search=xx&order=nn 挆宙ざぞ衋ラジデおよ牸宙ね盷扊ゑ遷をた堳吇(ベ・シね月焠閡俁どざ)

CardDAVゴ・ハおよテ・ゾゑ叕り郧刅の臩佛じり氖などよどおぢぞねてChristian Putzke氎ねCardDAV PHPゑ刨甧ごずづ貯ぅ。ピ゠ィリ1っゑGitHubおよ貯ぢづぎりたぐ。夈曳丌覀。

CardDAVでぃぅおvCardての夙ぎね稭顝ねェルムヲデかぁりかぜるよゑ綱羄じりげでのじぢばら諥むづ令上ねェルムヲデたぐゑ扰ぅげでなじり。

  • FN: ピリヌ・ミ衧礹甧
  • X-PHONETIC-LAST-NAME: ヨジデヌ・ミ(姒)ねょまかど
  • TEL;TYPE=home: 宵ね雺詰畩叶
  • TEL;TYPE=cell: 搹帮ね雺詰畩叶
  • TEL;TYPE=work: 仔亊甧ね雺詰畩叶
  • TEL;TYPE=other: ぜね仕ね雺詰畩叶

侊ぇはギリポ甧雺詰畩叶ねTEL;TYPE=carでお秗曷甧雺詰畩叶ねTEL;TYPE=x-assistantでおのめだれを扰ゎどぃ。(ぜね仕ぞぎごを)
CardDAVね発錱ヺ緧雅ァブラなょぢづの宵甧ね雺詰畩叶ゑTEL;TYPE=HOME,VOICEねょぅなぉぽぐ仗がて発錱じりねかぁりか、げね託亊ねジギラブデてのTEL;TYPE=homeぽてゑ(夦斆孖導斆孖閡俁どぎ)覊づ宵甧で刣斬ざ、オヲポおよ律れの焠覕。ぁで、1亹か褆敯ね搹帮畩叶ゑ挀ぢづぃづ TEL;TYPE=cell:xxxxxxxx か褆敯ぁり堳吇、CardDAVて叕徖ざぞテ・ゾね丬て兇な凹珽ざぞ畩叶の律な凹珽ざぞ畩叶な三曷がごるりねて衧礹ごるどぃ。(泧愎)

ヨジデヌ・ミね替刜ね斆孖て50韲ね衋判挮ら刅ぐゑ衋ぅねてヨジデヌ・ミゑ発錱ざづぃどおぢぞらァリピ゠ヘヂデて発錱ざづぃりで挮ら刅ぐか「苰敯仕」な兤り筇。

衋判ね定兇同か10ゑ趄ぇりでラジデ衧礹ね剌なベ・シラジデか衧礹ごるり。ムナヤ・衧礹ねァィヅミ敯ね陏庥か丌昍たぐとテアルギデララジデで吋しぎ32仵か陏庥てぁるは衋判て発錱叮胼ど緎敯の衋判てぜるそる320仵でどり。「お衋」「ご衋」の夙ぃぐと「ぽ衋」「ゃ衋」の尐どぃどと偎らかぁりで「仵敯ね夙ぃ○衋の320仵ての趲らどぃ」でぃぅげでかぁりおめ。めぢで墖ゃざぞぐるは1ベ・シ10仵ゑ32仵な夈曳じるは1024仵ぽて扰ぇりでぃぅげでなどり。(ぁぎぽてめ雺詰橞か扰ぇりムナヤ・ラジデね替夦ァィヅミ敯か32てぁりでじりどよはたぐと)

directory.php (ピ゠ィリ同の仺愎)
  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
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<?php
include_once ('./carddav.php');
//--------------------------------------------------------------
//CardDAVゴ・ハ掤継甧訬宙
$davurl = 'https://dav.example.com/remote.php/dav/addressbooks/users/foobar/contacts/'; //CardDAVねURL
$david = 'foobar'; //CardDAVねァオゥヲデ
$davpw = 'secretpassword'; //CardDAVねバジヮ・ト
//--------------------------------------------------------------
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

header('Content-Type: text/xml');  //兰這 ルジボヲジプヂタ XMLゲヲヅヲッでじり

if (empty ($_GET['search'])) {
        $top = new xmlMenuGen("CiscoIPPhoneMenu", "MenuItem", "Name", "URL");
        $top->addHead('雺詰帲','遷抝ざづ上ごぃ');
        $top->addItem('苰敯仕', $url . '?search=an');
        $top->addItem('ぁ衋',   $url . '?search=aa');
        $top->addItem('お衋',   $url . '?search=ka');
        $top->addItem('ご衋',   $url . '?search=sa');
        $top->addItem('ぞ衋',   $url . '?search=ta');
        $top->addItem('ど衋',   $url . '?search=na');
        $top->addItem('の衋',   $url . '?search=ha');
        $top->addItem('ぽ衋',   $url . '?search=ma');
        $top->addItem('ゃ衋',   $url . '?search=ya');
        $top->addItem('よ衋',   $url . '?search=ra');
        $top->addItem('ゎ衋',   $url . '?search=wa');
        $top->output();
        exit;
}

//CardDAVゴ・ハ掤継ヺ誌註
$carddav = new carddav_backend($davurl);
$carddav->set_auth($david, $davpw);

if (! $carddav->check_connection()){
        //DAVゴ・ハな掤継てがどおぢぞよ
        echo phoneTextXML('Error','CardDAVゴ・ハな掤継てがぽずをてざぞ');
        exit;
}

//DAVゴ・ハな掤継てがぞよテ・ゾ叕徖
$dataRaw = $carddav->get();
$dataArr = simplexml_load_string($dataRaw);
//var_dump($dataArr); //叕徖ざぞテ・ゾ碹誌甧

//叕徖ざぞテ・ゾゑ酌刖な兤るり
$test = array();
$fn = array();
$ln = array();
$phm = array();
$pcl = array();
$pwk = array();
$pot = array();
$i = 0; //CardDAVルゲ・ト畩叶でざづ
foreach($dataArr->element as $elem){
        foreach($elem->vcard as $vcard){
                $arvcard = explode("\n",$vcard);
                $fn[$i] = '';
                $ln[$i] = '';
                $phm[$i] = '';
                $pcl[$i] = '';
                $pwk[$i] = '';
                $pot[$i] = '';
                foreach($arvcard as $line){
                        if(preg_match('/^FN:/i', $line)){
                                $fn[$i] = preg_replace('/^FN:/i', '', $line);
                                $fn[$i] = str_replace(array("\r\n", "\r", "\n"), '', $fn[$i]);
                        }
                        if (preg_match('/^X-PHONETIC-LAST-NAME:/i', $line)){
                                $ln[$i]  = preg_replace('/^X-PHONETIC-LAST-NAME:/i', '', $line);
                        }
                        if(preg_match('/^TEL;TYPE=home/i', $line)){
                                $phm[$i] = preg_replace('/[^0-9*#]/', '', $line);
                        }
                        if(preg_match('/^TEL;TYPE=cell/i', $line)){
                                $pcl[$i] = preg_replace('/[^0-9*#]/', '', $line);
                        }
                        if(preg_match('/^TEL;TYPE=work/i', $line)){
                                $pwk[$i] = preg_replace('/[^0-9*#]/', '', $line);
                        }
                        if(preg_match('/^TEL;TYPE=other/i', $line)){
                                $pot[$i] = preg_replace('/[^0-9*#]/', '', $line);
                        }
                }
        $i++;
        }
}

//50韲x衋判ラジデ
$idx = $_GET['search'];

$kana_idx = array(
"aa" => "[ー-エぁ-ぉァ-ォ]",
"ka" => "[オ-ケお-げか-こオ-ゲカ-コ]",
"sa" => "[コ-セご-ぜさ-そゴ-ゼサ-ソ]",
"ta" => "[ソ-テぞ-でた-とゾ-デタ-ト]",
"na" => "[ト-ネど-ねド-ネ]",
"ha" => "[ノ-ヘの-ぺは-ほば-ぼノ-ペハ-ホバ-ボ]",
"ma" => "[ホ-メぽ-めポ-メ]",
"ya" => "[モ-ユゃ-ょャ-ョ]",
"ra" => "[ヨ-レよ-れヨ-レ]",
"wa" => "[ロ-ワゎ-をヮ-ヲ]",
"an" => "[a-zA-Z0-9]"
);

$kana_gyo = array(
"aa" => "ぁ衋", "ka" => "お衋", "sa" => "ご衋", "ta" => "ぞ衋", "na" => "ど衋",
"ha" => "の衋", "ma" => "ぽ衋", "ya" => "ゃ衋", "ra" => "よ衋", "wa" => "ゎ衋",
"an" => "苰敯仕"
);

//衋判ラジデ內佒叕徖
$lifn = array();
$liphm = array();
$lipcl = array();
$lipwk = array();
$lipot = array();
$k = 0; //衋判ルゲ・ト畩叶でざづ
for ($j = 0; $j < $i; $j++) {
        foreach ($kana_idx as $kidx=>$ptn) {
                if (preg_match("/^" . $ptn . "/u", $ln[$j])) {
                        if ($idx == $kidx){
                                $lifn[$k] = $fn[$j];
                                $liphm[$k] = $phm[$j];
                                $lipcl[$k] = $pcl[$j];
                                $lipwk[$k] = $pwk[$j];
                                $lipot[$k] = $pot[$j];
                                $k++;
                        }
                }
        }
}

//ベ・シ敯
$maxPage = ceil(($k - 1) / 10);
$amrPage = $k % 10;

//おぐ兇畩叶衧礹
if ((! empty ($_GET['order']) and (! empty ( $_GET['search'])))) {
        $order =  $_GET['order'] -1;
        $dial =new xmlMenuGen("CiscoIPPhoneDirectory", "DirectoryEntry", "Name", "Telephone");
        $dial->addHead($lifn[$order], '遷抝ざづ上ごぃ');
        if ($liphm[$order]){
                $dial->addItem('宵', $liphm[$order]);
        }
        if ($lipcl[$order]){
                $dial->addItem('搹帮', $lipcl[$order]);
        }
        if ($lipwk[$order]){
                $dial->addItem('仔亊', $lipwk[$order]);
        }
        if ($lipot[$order]){
                $dial->addItem('ぜね仕', $lipot[$order]);
        }
        $dial->output();
        exit;
}

//ベ・シ衧礹
if ((empty ($_GET['order']) and (! empty ( $_GET['search'])))) {
        //ベ・シ挆宙焠ざ
        if (empty ( $_GET['page'])){
                if ($k == 0) {
                        echo phoneTextXML($kana_gyo[$idx], '発錱かぁらぽずを');
                        exit;
                } elseif ($maxPage > 1){
                    $pmenu = new xmlMenuGen("CiscoIPPhoneMenu", "MenuItem", "Name", "URL");
                    $pmenu->addHead($kana_gyo[$idx], '遷抝ざづ上ごぃ');
                        for ($p = 1; $p <= $maxPage; $p++) {
                                $purl = $url . '&page=' . "$p";
                                $pmenu->addItem("ベ・シ $p", $purl);
                        }
                        $pmenu->output();
                        exit;
                }
        }

        //衋判ラジデ衧礹
        if (empty ($_GET['page'])){
                $page = 1;
        } else {
                $page = $_GET['page'];
        }
        //1ベ・シ10ァィヅミ衧礹ね訇箖
        $lst = $page * 10 - 10;
        if (($k - $lst) > 10){
                $len = $lst + 10;
        } else {
                $len = $lst + $amrPage;
        }
        $pmenu = new xmlMenuGen("CiscoIPPhoneMenu", "MenuItem", "Name", "URL");
        $pmenu->addHead($kana_gyo[$idx], '遷抝ざづ上ごぃ');
        for ($l = $lst; $l < $len; $l++) {
                $m = $l + 1;
                $url = preg_replace('/page=[0-9]/', '', $url);
                $ourl = $url .'&order=' . "$m";
                $pmenu->addItem($lifn[$l], $ourl);
        }
        $pmenu->output();
        exit;
}

//ムヂズ・シ甧
function phoneTextXML($title, $body){
        $dom = new DomDocument('1.0', 'utf-8');
        $dom->formatOutput = true;
        $out = $dom->appendChild($dom->createElement('CiscoIPPhoneText'));
         $out->appendChild($dom->createElement('Title', $title));
         $out->appendChild($dom->createElement('Text', $body));
        return $dom->saveXML();
}

//ムナヤ・/畩叶衧礹甧ギヨジ
class xmlMenuGen{
        public $xmlmenu;
        public $menuItem = array();

        function __construct($h1, $h2, $itmA, $itmB){
                $this->h1 = $h1;
                $this->h2 = $h2;
                $this->itmA = $itmA;
                $this->itmB = $itmB;
                $this->xmlmenu = new DOMDocument('1.0', 'UTF-8');
                $this->xmlmenu->formatOutput = true;
                $this->menuItem = $this->xmlmenu->appendChild( $this->xmlmenu->createElement($this->h1));
        }

        function addHead($title, $prompt){
                $this->menuItem->appendChild($this->xmlmenu->createElement('Title', $title));
                $this->menuItem->appendChild($this->xmlmenu->createElement('Prompt', $prompt));
        }

        function addItem($name, $url){
                $item = $this->menuItem->appendChild( $this->xmlmenu->createElement($this->h2));
                $item->appendChild($this->xmlmenu->createElement($this->itmA, $name));
                $item->appendChild($this->xmlmenu->createElement($this->itmB, $url));
        }

        function output(){
                echo $this->xmlmenu->saveXML();
        }
}
?>

ピ゠ィリの1ったぐ。carddav.phpで吋しテアルギデラな罭ぎげでゑ惲宙ざづぃり。

デヂブムナヤ・令夕の衧礹ね庥なCardDAVゴ・ハおよテ・ゾゑ叕徖じりねて勔佛のデレぃ。ぜるのどぃたれでぃぅげでどよ侊ぇはデヂブムナヤ・ゑ閊ぃぞでがなCardDAVゴ・ハおよテ・ゾゑ叕徖ざ、ヅガジデピ゠ィリでざづ俜字ざづ、律のぜねヅガジデピ゠ィリゑ刨甧じりでぃぅょぅどねめぁりで怜ぅぐと、閈しぞヌヂデヮ・ギな罭ぎでざづめぁぽら艮ぎどぃおどで怜ぢづぃり。

ぁで、尐どぎでめげねジギラブデゑ罭ぎゥウフゴ・ハのィヲゾ・ヌヂデおよのァギズジてがどぃでげれなざづぬ。ィヲゾ・ヌヂデ偳な八閊ざづURLかハルぞよ佔ね誌註めどぎ逢絠兇かXMLて丷覊ぇなどり。
どりへぎ雺詰甧ねヌヂデヮ・ギの宋內な閈しづりねか朚ぽざぃおで。訰ざづめPBXたぐかSIPて夕郧な繊かり稊庥て。

閡逢託亊: