Wikka : StructDataAction

HomePage :: Categories :: Index :: Changes :: Comments :: Documentation :: Blog :: Login/Register
Most recent edit on 2008-07-13 17:04:45 by DomBonj [1.1.6.5 compatibility]

Additions:


Deletions:




Edited on 2008-04-13 05:35:38 by DomBonj [v1.01: added support for hCard microformat; 1.1.6.4 compatibility]

Additions:
1. New actions/structdata.php file:
<?php
#   displays the results of a selection request
# @version      1.01
# @uses         Wakka::ReturnSafeHTML()
# @uses         Wakka::HasAccess()
# @uses         Wakka::UserIsOwner()
    function SDformat_hcard_element($eltype, $elvalue)
        switch ($eltype)
            case 'family-name':
                $ret = '<span class="family-name">'. ucwords(strtolower($elvalue)) .'</span>';
           
            case 'given-name':
                $ret = '<span class="given-name">'. ucwords(strtolower($elvalue)) .'</span>';
           
            case 'additional-name':
                $ret = '<span class="additional-name">'. ucwords(strtolower($elvalue)) .'</span>';
           
            case 'url':
                $ret = '<a class="url" href="'. $elvalue. '">%s</a>';
           
            case 'org':
                $ret = '<div class="org">'. $elvalue .'</div>';
           
            case 'title':
                $ret = '<div class="title">'. $elvalue .'</div>';
           
            case 'note':
                $ret = '<div class="note">'. $elvalue .'</div>';
           
            case 'email':
                $ret = '<div class="email"><a href="mailto:'. $elvalue. '">'. $elvalue .'</a></div>';
           
            case 'adr':
                $adr_array = split(';', $elvalue);
                $ret = '<div class="adr"><span class="street-address">'. $adr_array[0] .'</span>'.
                    ((isset($adr_array[1]) && ($adr_array[1]!='')) ? '<span class="locality">'. $adr_array[1] .'</span>': '') .
                    ((isset($adr_array[2]) && ($adr_array[2]!='')) ? '<span class="postal-code">'. $adr_array[2] .'</span>': '') .
                    ((isset($adr_array[3]) && ($adr_array[3]!='')) ? '<span class="region">'. $adr_array[3] .'</span>': '') .
                    ((isset($adr_array[4]) && ($adr_array[4]!='')) ? '<span class="country-name">'. $adr_array[4] .'</span>': '') .
                    '</div>';
           
            default: // ignore silently
                $ret = '';
        $table_css = 'class="data" cellpadding="2" cellspacing="1" border="2"';
        { // custom formatting, data validation and hyperlink addition
                if ('hCard' == $printmode)
                { // hCard microformat
                    $lastname = SDformat_hcard_element('family-name', $n_array[0]);
                    $firstname = isset($n_array[1]) ? SDformat_hcard_element('given-name', $n_array[1]).'&nbsp;' : '';
                    $middlename = isset($n_array[2]) ? SDformat_hcard_element('additional-name', $n_array[2]) : '';
                    $fullname = '<span class="n"><span class="fn">'. $firstname . $lastname .'</span>'. $middlename .'</span>';
                    $hyperlink = isset($url) ? SDformat_hcard_element('url', $url) : '%s';
                    $orgname = '';
                    if (isset($org))
                        if ($org == $n)
                        { // this is an organization's card: merge name and organization
                            $fullname = str_replace('class="fn"', 'class="fn org"', $fullname);
                        else
                            $orgname = SDformat_hcard_element('org', $org);
                    $phone = isset($tel) ? '<div class="tel"><span class="value">'. $tel .'</span></div>' : '';
                    $fax = isset($fax) ? '<div class="tel"><span class="type">fax</span>&nbsp;<span class="value">'. $fax .'</span></div>' : '';
                    $address = isset($adr) ? SDformat_hcard_element('adr', $adr) : '';
                    $mystr = '<div class="vcard">'. sprintf($hyperlink, $fullname). (isset($title) ? SDformat_hcard_element('title', $title) : '').
                        $orgname . (isset($email) ? SDformat_hcard_element('email', $email) : ''). $phone . $fax.
                        $address .(isset($note) ? SDformat_hcard_element('note', $note) : '').'</div>';
                }
                { // default print mode
                    $name = (isset($n_array[1]) ? (ucwords(strtolower($n_array[1])).'&nbsp;') : ''). ucwords(strtolower($n_array[0]));
                    $tooltip = isset($tel) ? 'phone: '. $tel : '';
                    $tooltip .= (isset($fax) ? ($tooltip ? ' / fax: '. $fax : 'fax: ' .$fax) : '');
                    $mystr = "<a href='mailto:$email' title='$tooltip'>". $name .'</a>'. ($org != '' ? ' ('.$org.')' : '');
        { // type did not match any custom type : fallback to a standard type
        echo ($printmode);
                    $r1 = '<thead><tr>';
                    $r2 = '<tbody><tr>';
                            $r1 .= '<th>'. $name .'</th>';
                    $mystr .= $r1 .'</tr></thead>'. $r2 .'</tr></tbody></table>';
                    $mystr = '<table '. $table_css .'><thead><tr><th>name</th><th>value</th></tr></thead><tbody>';
                            $mystr .= '<tr><td align="right">'. $name .'</td><td>'. $value .'</td></tr>';
                    $mystr .= '</tbody></table>';
        { // display the data item
        $name = (isset($n_array[3])? $n_array[3].' ' : '').(isset($n_array[1]) ? (ucwords(strtolower($n_array[1])).' '):'').(isset($n_array[2])? $n_array[2].' ': '').ucwords(strtolower($n_array[0]));
        $str = "BEGIN:VCARD\r\nVERSION:2.1\r\nN:". $row['n'] ."\r\nFN:". $name ."\r\n";
        $str .= $row['org'] ? 'ORG:'. $row['org'] ."\r\n" : '';
        $str .= $row['title'] ? 'TITLE:'. $row['title'] ."\r\n" : '';
        $str .= $row['url'] ? 'URL:'. $row['url'] ."\r\n" : '';
        $str .= $row['tel'] ? 'TEL:'. $row['tel'] ."\r\n" : '';
        $str .= $row['fax'] ? 'TEL;FAX:'. $row['fax'] ."\r\n" : '';
        $str .= $row['email'] ? 'EMAIL;INTERNET:'. $row['email'] ."\r\n" : '';
        if (isset($row['adr']))
            $adr_array = split(';', $row['adr']);
            $str .= 'ADR:;;'. $adr_array[0] .';'. (isset($adr_array[1]) ? $adr_array[1] : '') .
                ';'. (isset($adr_array[3]) ? $adr_array[3] : '') .
                ';'. (isset($adr_array[2]) ? $adr_array[2] : '') .
                ';'. (isset($adr_array[4]) ? $adr_array[4] : '') . "\r\n";
        $str .= $row['note'] ? 'NOTE:'. $row['note'] ."\r\n" : '';
        $str .= "END:VCARD\r\n";
        { // default scope = page
    { // $rows array row format: ('_wikkapage' => <page tag>, 'type' => <dataitem type>, 'field1' => <val1>, 'field2' => <val2>, ...)
        $table_css = 'class="data" cellpadding="2" cellspacing="1" border="2"';
            case 'ItemTable': // p1 = type of dataitem, p2 = column order list, p3 = scope
                $mystr0 = '<table '. $table_css .'><thead><tr>';
                $mystr = $mystr0 .'</tr></thead><tbody>'. $mystr. '</tbody></table>';
                { // empty table: display nothing
            case 'ToDos': // p1 = this owner only; p2 = this status only
                        { // transform all dates into a common format for sorting purposes
                $mystr = '<table '. $table_css .'><thead><tr><th>owner</th><th>description</th><th>due date</th><th>page link</th></tr></thead><tbody>';
                $mystr .= '</tbody></table>';
            case 'Cards': // p1 = this org only; p2 = sort key ; p3 = format (vCard or table)
                    $mystr ='<form action="'.$thisone->Href().'/grabcode" method="post" class="grabcode">
                    $mystr = '
<table '. $table_css .'><thead><tr><th>Last name</th><th>Given name</th><th>Email</th><th>Phone</th><th>Fax</th>'. (isset($p2) ? '<th>Organization</th>' : '') .'</tr></thead><tbody>';
                    $mystr .= '
</tbody></table>';
{ // display one-line help for $req
{ // this is a request: load all relevant data in an associative array: $myrows
                { // order: type, then data
                { // order: data, then type
{ // print the result
2. [versions 1.1.6.2 & 1.1.6.3 only] Add the following lines to ##css/wikka.css##:
(php)
table.data {
border: 2px solid #CCC;
border-collapse: collapse;
border-spacing: 0;
table.data caption {
border: 1px solid #CCC;
font-size: 95%;
color: #666;
margin:5px 0;
padding:2px;
table.data thead {
background-color: #DDD;
table.data tfoot {
background-color: #DDD;
table.data th {
border: 1px solid #CCC;
padding: .1em .25em;
table.data thead th {
background-color: #DDD;
table.data tfoot th {
background-color: #DDD;
table.data tbody th {
background-color: #EEE;
table.data tbody tr:hover {
background-color: #E9E9F9;
table.data tbody tr.alt:hover {
background-color: #E9E9F9;
table.data td {
border: 1px solid #CCC;
padding: .1em .25em;
table.data td.number {
text-align: right;
table.data td.datetime {
text-align: right;
white-space: nowrap;
/*
alternate row & column color
*/
table.data tr.alt {
background-color: #EEE;
table.data th.c1 {
background-color: #CDD;
table.data th.c2 {
background-color: #DCC;
table.data th.c3 {
background-color: #DDC;
table.data th.c4 {
background-color: #CDC;
table.data th.c5 {
background-color: #CCD;
table.data th.c6 {
background-color: #DCD;
table.data td.c1 {
background-color: #EFF;
table.data td.c2 {
background-color: #FEE;
table.data td.c3 {
background-color: #FFE;
table.data td.c4 {
background-color: #EFE;
table.data td.c5 {
background-color: #EEF;
table.data td.c6 {
background-color: #FEF;
table.data tr.alt td.c1 {
background-color: #DEE;
table.data tr.alt td.c2 {
background-color: #EDD;
table.data tr.alt td.c3 {
background-color: #EED;
table.data tr.alt td.c4 {
background-color: #DED;
table.data tr.alt td.c5 {
background-color: #DDE;
table.data tr.alt td.c6 {
background-color: #EDE;
%%


Deletions:
%%(php)<?php
# displays the results of a selection request
# @version 1.00
# @uses Wakka::ReturnSafeHtml()
$table_css = 'class="wikka" cellpadding="2" cellspacing="1" border="2"';
{ custom formatting, data validation and hyperlink addition
$name = (isset($n_array[1]) ? (ucwords(strtolower($n_array[1])).' ') : ). ucwords(strtolower($n_array[0]));
$tooltip = isset($tel) ? 'phone: '. $tel : ;
$tooltip .= (isset($fax) ? ($tooltip ? ' / fax: '. $fax : 'fax: ' .$fax) : );
$mystr = "<a href='mailto:$email' title='$tooltip'>". $name .'</a>'. ($org != ? ' ('.$org.')' : );
{ type did not match any custom type : fallback to a standard type
$r1 = '<tr>';
$r2 = '<tr>';
$r1 .= '<th class="comment">'. $name .'</th>';
$mystr .= $r1 .'</tr>'. $r2 .'</tr></table>';
$mystr = '<table '. $table_css .'><tr class="comment"><th>name</th><th>value</th></tr>';
$mystr .= '<tr><td class="comment" align="right">'. $name .'</td><td>'. $value .'</td></tr>';
$mystr .= '</table>';
{ display the data item
$name = (isset($n_array[3])? $n_array[3].' ' : ).(isset($n_array[1]) ? (ucwords(strtolower($n_array[1])).' '):).(isset($n_array[2])? $n_array[2].' ': ).ucwords(strtolower($n_array[0])).(isset($n_array[4])? ', '.$n_array[4]: );
$str = 'BEGIN:VCARD\r\nVERSION:2.1\r\nN:'. $row['n'] .'\r\nFN:'. $name .'\r\n';
$str .= $row['org'] ? 'ORG:'. $row['org'] .'\r\n' : ;
$str .= $row['tel'] ? 'TEL;WORK:'. $row['tel'] .'\r\n' : ; by default, tel is shown as work phone
$str .= $row['fax'] ? 'TEL;FAX:'. $row['fax'] .'\r\n' : ;
$str .= $row['email'] ? 'EMAIL;INTERNET:'. $row['email'] .'\r\n' : ;
$str .= 'END:VCARD\r\n';
{ default scope = page
{ $rows array row format: ('_wikkapage' => <page tag>, 'type' => <dataitem type>, 'field1' => <val1>, 'field2' => <val2>, ...)
$table_css = 'class="wikka" cellpadding="2" cellspacing="1" border="2"';
case 'ItemTable': p1 = type of dataitem, p2 = column order list, p3 = scope
$mystr0 = '<table '. $table_css .'><tr class="comment">';
$mystr = $mystr0 .'</tr>'. $mystr. '</table>';
{ empty table: display nothing
$mystr=;
case 'ToDos': p1 = this owner only; p2 = this status only
{ transform all dates into a common format for sorting purposes
$mystr = '<table '. $table_css .'><tr class="comment"><th>owner</th><th>description</th><th>due date</th><th>page link</th></tr>';
$mystr .= '</table>';
case 'Cards': p1 = this org only; p2 = sort key ; p3 = format (vCard or table)
$mystr ='<form action="'.$thisone->href().'/grabcode" method="post" class="grabcode">
$mystr = '<table '. $table_css .'><tr class="comment"><th>Last name</th><th>Given name</th><th>Email</th><th>Phone</th><th>Fax</th>'. (isset($p2) ? '<th>Organization</th>' : ) .'</tr>';
$mystr .= '</table>';
{ display one-line help for $req
{ this is a request: load all relevant data in an associative array: $myrows
{ order: type, then data
{ order: data, then type
{ print the result




Edited on 2008-01-28 00:15:25 by DomBonj [Modified links pointing to docs server]

No differences.


Edited on 2007-08-15 11:54:13 by DomBonj [v1.00: bugfix: PHP5 compatibility]

Additions:
# @version 1.00
function SDis_in_scope($thisone, $row, $type, $scope=null)
$ret = ($thisone->HasAccess('read', $row['_wikkapage'])) && ($row['type']
$type);
$ret = ($thisone->UserIsOwner($row['_wikkapage'])) && ($row['type'] $type);
$ret = ($row['_wikkapage']
$thisone->GetPageTag()) && ($row['type']
$type);
function SDrun_req($thisone, $reqid, $rows, $p1=null, $p2=null, $p3=null)
if (SDis_in_scope($thisone, $row, $p1, $p3))
$mystr ='<form action="'.$thisone->href().'/grabcode" method="post" class="grabcode">


Deletions:
# @version 0.99
function SDis_in_scope($this, $row, $type, $scope=null)
$ret = ($this->HasAccess('read', $row['_wikkapage'])) && ($row['type']
$type);
$ret = ($this->UserIsOwner($row['_wikkapage'])) && ($row['type'] $type);
$ret = ($row['_wikkapage']
$this->GetPageTag()) && ($row['type']
$type);
function SDrun_req($this, $reqid, $rows, $p1=null, $p2=null, $p3=null)
if (SDis_in_scope($this, $row, $p1, $p3))
$mystr ='<form action="'.$this->href().'/grabcode" method="post" class="grabcode">




Edited on 2007-05-20 18:11:54 by DomBonj [v0.99: 1.1.6.3 compatibility, improved ItemTable request]

Additions:
%%(php)<?php

Deletions:
%%(php;;actions/structdata.php)<?php



Edited on 2007-05-20 10:16:00 by DomBonj [v0.99: 1.1.6.3 compatibility, improved ItemTable request]

Additions:
This is the development page for the Structdata action. %%(php;;actions/structdata.php)<?php
# Defines + optionally displays a structured data item or
# @version 0.99
# @uses Wakka::Href()
i18n strings
if (!defined('SD_ERROR_PARAMETER_MANDATORY')) define ('SD_ERROR_PARAMETER_MANDATORY', "The '%s' parameter is mandatory");
if (!defined('SD_ERROR_INCORRECT_DATE_FORMAT')) define ('SD_ERROR_INCORRECT_DATE_FORMAT', "Incorrect format for '%s' parameter: use 'yyyy-mm-dd'");
if (!defined('SD_ERROR_USAGE')) define ('SD_ERROR_USAGE', 'Usage: structdata type=\'<i>mytype</i>\' [print=\'<i>printmode</i>\'] data="[more parameters]"');
if (!defined('SD_HELP_TODOS')) define ('SD_HELP_TODOS', ' [p1=<i>owner</i>] [p2=<i>status</i>] ');
if (!defined('SD_HELP_ITEMTABLE')) define ('SD_HELP_ITEMTABLE', ' p1=<i>type</i> [p2=<i>column order list</i>] [p3=<i>scope</i>]');
if (!defined('SD_HELP_CARDS')) define ('SD_HELP_CARDS', ' [p1=<i>org filter</i>] [p2=<i>sort column name</i>] [p3=<i>format (vCard|table)</i>] ');
function SDerror($msg)
{
return ('<em class="error">'. $msg. '</em><br />');
function SDhandle_item($type, $params, $printmode)
{
$table_css = 'class="wikka" cellpadding="2" cellspacing="1" border="2"';
$myerr = ;
extract($params);
$mystr = ;
switch ($type)
{ custom formatting, data validation and hyperlink addition
case 'ToDo':
if (!$owner)
{
$myerr .= SDerror(sprintf(SD_ERROR_PARAMETER_MANDATORY, 'owner'));
if (!$desc)
{
$myerr .= SDerror(sprintf(SD_ERROR_PARAMETER_MANDATORY, 'desc'));
preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_open, $ymd);
if (!checkdate($ymd[2], $ymd[3], $ymd[1]))
{
$myerr .= SDerror(sprintf(SD_ERROR_INCORRECT_DATE_FORMAT, 'date_open'));
preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_due, $ymd2);
if (!checkdate($ymd2[2], $ymd2[3], $ymd2[1]))
{
$myerr .= SDerror(sprintf(SD_ERROR_INCORRECT_DATE_FORMAT, 'date_due'));
case 'Card':
if (!$n)
{
$myerr .= SDerror(sprintf(SD_ERROR_PARAMETER_MANDATORY, 'n'));
$n_array = split(';', $n);
$name = (isset($n_array[1]) ? (ucwords(strtolower($n_array[1])).' ') : ). ucwords(strtolower($n_array[0]));
$tooltip = isset($tel) ? 'phone: '. $tel : ;
$tooltip .= (isset($fax) ? ($tooltip ? ' / fax: '. $fax : 'fax: ' .$fax) : );
$mystr = "<a href='mailto:$email' title='$tooltip'>". $name .'</a>'. ($org != ? ' ('.$org.')' : );
case 'mydataitem':
<my validation and hyperlinking code>
$mystr = <my formatting>;
if (!$mystr)
{ type did not match any custom type : fallback to a standard type
switch ($printmode)
{
case 'table':
$mystr = '<table '. $table_css .'>';
$r1 = '<tr>';
$r2 = '<tr>';
foreach ($params as $name => $value)
{
if ($name != 'print')
{
$r1 .= '<th class="comment">'. $name .'</th>';
$r2 .= '<td>'. $value .'</td>';
}
}
$mystr .= $r1 .'</tr>'. $r2 .'</tr></table>';
break;
case 'list':
$mystr = '<table '. $table_css .'><tr class="comment"><th>name</th><th>value</th></tr>';
foreach ($params as $name => $value)
{
if ($name != 'print')
{
$mystr .= '<tr><td class="comment" align="right">'. $name .'</td><td>'. $value .'</td></tr>';
}
}
$mystr .= '</table>';
break;
case 'basic':
default:
$mainparam = (isset($value) ? $value : (isset($id) ? $id : (isset($name) ? $name : )));
$mystr = '<span title="structured data item: '. $type .'" class="notes">'. $type . (isset($mainparam) ? ' ['. $mainparam .']' : ) .'</span>';
break;
if ($myerr)
{
return ($myerr);
else if ($printmode != 'false')
{ display the data item
return ($mystr);
function SDbuild_vcard($row)
{
$n_array = split(';', $row['n']);
$name = (isset($n_array[3])? $n_array[3].' ' : ).(isset($n_array[1]) ? (ucwords(strtolower($n_array[1])).' '):).(isset($n_array[2])? $n_array[2].' ': ).ucwords(strtolower($n_array[0])).(isset($n_array[4])? ', '.$n_array[4]: );
$str = 'BEGIN:VCARD\r\nVERSION:2.1\r\nN:'. $row['n'] .'\r\nFN:'. $name .'\r\n';
$str .= $row['org'] ? 'ORG:'. $row['org'] .'\r\n' : ;
$str .= $row['tel'] ? 'TEL;WORK:'. $row['tel'] .'\r\n' : ; by default, tel is shown as work phone
$str .= $row['fax'] ? 'TEL;FAX:'. $row['fax'] .'\r\n' : ;
$str .= $row['email'] ? 'EMAIL;INTERNET:'. $row['email'] .'\r\n' : ;
$str .= 'END:VCARD\r\n';
return ($str);
function SDis_in_scope($this, $row, $type, $scope=null)
{
if ('all'
$scope)
{
$ret = ($this->HasAccess('read', $row['_wikkapage'])) && ($row['type'] $type);
else if ('user'
$scope)
{
$ret = ($this->UserIsOwner($row['_wikkapage'])) && ($row['type'] $type);
else
{ default scope = page
$ret = ($row['_wikkapage']
$this->GetPageTag()) && ($row['type']
$type);
return $ret;
function SDrun_req($this, $reqid, $rows, $p1=null, $p2=null, $p3=null)
{ $rows array row format: ('_wikkapage' => <page tag>, 'type' => <dataitem type>, 'field1' => <val1>, 'field2' => <val2>, ...)
$table_css = 'class="wikka" cellpadding="2" cellspacing="1" border="2"';
switch($reqid)
{
case 'ItemTable': p1 = type of dataitem, p2 = column order list, p3 = scope
$i = 0;
$keyorder = array();
if ($p2)
{
$mycols = split(',', $p2);
foreach ($mycols as $lacol)
{
$keyorder[$lacol] = $i;
}
$mystr0 = '<table '. $table_css .'><tr class="comment">';
foreach ($rows as $row)
{
if (SDis_in_scope($this, $row, $p1, $p3))
{
$tmp_tr = array();
$mystr .= '<tr>';
foreach ($row as $key => $val)
{
if (($key != '_wikkapage') && ($key != 'type') && ($key != 'print') && !isset($keyorder[$key]))
{
$keyorder[$key] = $i;
}
if (($key != '_wikkapage') && ($key != 'type') && ($key != 'print'))
{
$tmp_tr[$keyorder[$key]] = $val;
}
}
for ($j = 0; $j < $i; $j)
{
$mystr .= '<td>'. $tmp_tr[$j] .'</td>';
}
$mystr .= '</tr>';
}
build table header row
$tmp_tr = array();
foreach ($keyorder as $param => $k)
{
$tmp_tr[$k] = $param;
for ($j = 0; $j < $i; $j)
{
$mystr0 .= '<th>'. $tmp_tr[$j] .'</th>';
$mystr = $mystr0 .'</tr>'. $mystr. '</table>';
if (!$i)
{ empty table: display nothing
$mystr=;
case 'ToDos': p1 = this owner only; p2 = this status only
$mydata = array();
$i = 0;
foreach ($rows as $row)
{
if ($row['type']
'ToDo')
{
if ( (!$p1 || ($p1 $row['owner'])) && (!$p2 || ($p2
$row['status'])) )
{ transform all dates into a common format for sorting purposes
$mydata[date("Y-m-d", strtotime($row['date_open']))."_".$i] = "<tr><td>{$row['owner']}</td><td>{$row['desc']}</td>".
"<td".((strtotime($row['date_due'])<time())?" style='background-color:red; color:white; '":"").">{$row['date_due']}</td>".
"<td align='center'><a href='{$_SERVER['PHP_SELF']}?wakka={$row['_wikkapage']}'>{$row['_wikkapage']}</a></td></tr>";
}
}
krsort($mydata);
$mystr = '<table '. $table_css .'><tr class="comment"><th>owner</th><th>description</th><th>due date</th><th>page link</th></tr>';
foreach ($mydata as $key => $val)
{
$mystr .= $val;
$mystr .= '</table>';
case 'Cards': p1 = this org only; p2 = sort key ; p3 = format (vCard or table)
$mydata = array();
$i = 0;
foreach ($rows as $row)
{
if ($row['type'] 'Card')
{
if ( (!$p1 || ($p1
$row['org'])) )
{
$sortkey = strtolower((isset($p2) && $p2) ? $row[$p2] : (isset($row['n']) ? $row['n'] : $i)) .''. $i;
$n_array = split(';', $row['n']);
$mydata[$sortkey] = "<tr><td>{$n_array[0]}</td><td>{$n_array[1]}</td>".
"<td>{$row['email']}</td><td>{$row['tel']}</td><td>{$row['fax']}</td>".(isset($p2) ? "<td>{$row['org']}</td>":) .'</tr>';
$myvcards[$sortkey] = SDbuild_vcard($row);
}
}
if ($p3 'vCard')
{
$mystr = ;
$cnt = 0;
ksort ($myvcards);
foreach ($myvcards as $key => $card)
{
$mystr .= "$card\r\n";
$cnt;
}
$mystr ='<form action="'.$this->href().'/grabcode" method="post" class="grabcode">
<input type="submit" name="save" class="grabcodebutton" style="line-height:10px; float:left; vertical-align: middle; margin-right:20px; margin-top:0px; font-size: 10px; color: #000; font-weight: normal; font-family: Verdana, Arial, sans-serif; background-color: #DDD; text-decoration: none; height:18px;" value="Grab '.$cnt.($cnt>1?' vCards':' vCard').'" title="Download vCard file" />
<input type="hidden" name="code" value="'.$mystr.'" /><input type="hidden" name="filename" value="wikka_vcards" /></form>';
else
{ default (table) format
ksort($mydata);
$mystr = '<table '. $table_css .'><tr class="comment"><th>Last name</th><th>Given name</th><th>Email</th><th>Phone</th><th>Fax</th>'. (isset($p2) ? '<th>Organization</th>' : ) .'</tr>';
foreach ($mydata as $key => $val)
{
$mystr .= $val;
}
$mystr .= '</table>';
case 'myreq':
<mycode>
$mystr = <what I want to print>
return ($mystr);
function SDdo_help($reqid)
{
$helpstr = ;
switch($reqid)
{
case 'ItemTable':
$helpstr = $reqid .SD_HELP_ITEMTABLE;
case 'ToDos':
$helpstr = $reqid .SD_HELP_TODOs;
case 'Cards':
$helpstr = $reqid .SD_HELP_CARDS;
case 'myreq':
$helpstr = 'myfoobar';
return ($helpstr);
if ((!isset($type) || !$type) && (!isset($req) || !$req) && !isset($help))
$output = SDerror(SD_ERROR_USAGE);
{ display one-line help for $req
$output = SDdo_help($req);
{
this is a request: load all relevant data in an associative array: $myrows
$query = 'SELECT body, tag FROM '. $this->config['table_prefix'] .'pages WHERE ((latest = \'Y\') AND (body LIKE \'%{{structdata%\'))';
foreach ($rows as $row)
{
if (preg_match_all('/\{\{structdata(.+?)\}\}/', $row['body'], $matches))
{
foreach ($matches[1] as $mym)
{
$newrow = array('_wikkapage' => $row['tag']);
if (preg_match('/type=\"(.*?)\"[ \t]*.*?data=\"(.*?)\"/', $mym, $matches2))
{ order: type, then data
else if (preg_match('/data=\"(.*?)\"[ \t]*.*?type=\"(.*?)\"/', $mym, $matches2))
{ order: data, then type
for ($i = 0; $i < count($matches3[1]); $i)
{
we run the request
$output = SDrun_req($this, $req, $myrows, (isset($p1)?$p1:), (isset($p2)?$p2:), (isset($p3)?$p3:));
if ($data)
{
for ($i = 0; $i < count($matches[1]); $i)
{
parameter name is case-insensitive
$output = SDhandle_item($type, $params, isset($print) ? $print : );
else
{
$output = SDerror(sprintf(SD_ERROR_PARAMETER_MANDATORY, 'data'));
if ($output)
{ print the result


Deletions:
This is the development page for the structdata action. %%(php)<?php
# Defines, optionnally displays a structured data item or
# @version 0.98
# @uses Wakka::href()
if (!defined('ERROR_PARAMETER_MANDATORY')) define ('ERROR_PARAMETER_MANDATORY', "The '%s' parameter is mandatory");
if (!defined('ERROR_INCORRECT_DATE_FORMAT')) define ('ERROR_INCORRECT_DATE_FORMAT', "Incorrect format for '%s' parameter: use 'yyyy-mm-dd'");
function SDerror($msg) {
return ("<em class='error'>$msg</em><br />");
}
function SDhandleitem($type, $params, $printmode) {
$table_css = "class='wikka' cellpadding='2' cellspacing='1' border='2'";
$myerr = ;
extract($params);
$mystr=; switch ($type) { // custom formatting, data validation and hyperlink addition case 'ToDo': if (!$owner) $myerr .= SDerror(sprintf(ERROR_PARAMETER_MANDATORY, 'owner')); if (!$desc) $myerr .= SDerror(sprintf(ERROR_PARAMETER_MANDATORY, 'desc')); preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_open, $ymd); if (!checkdate($ymd[2], $ymd[3], $ymd[1])) $myerr .= SDerror(sprintf(ERROR_INCORRECT_DATE_FORMAT, 'date_open')); preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_due, $ymd2); if (!checkdate($ymd2[2], $ymd2[3], $ymd2[1])) $myerr .= SDerror(sprintf(ERROR_INCORRECT_DATE_FORMAT, 'date_due')); break; case 'Card': if (!$n) { $myerr.= SDerror(sprintf(ERROR_PARAMETER_MANDATORY, 'n')); $n_array = split(';', $n); $name = (isset($n_array[1]) ? (ucwords(strtolower($n_array[1]))." ") : ).ucwords(strtolower($n_array[0]));
$tooltip = isset($tel) ? "phone: $tel" : ; $tooltip .= (isset($fax) ? ($tooltip ? " / fax: $fax" : "fax: $fax") : );
$mystr = "<a href='mailto:$email' title='$tooltip'>".$name."</a>". ($org != ? " ($org)" : ); break; case 'mydataitem': $mystr = ; break; if (!$mystr) { // type did not match any custom type : fallback to a standard type switch ($printmode) { case 'table': $mystr = ""; $r1=""; $r2=""; foreach ($params as $name => $value) { if ($name != 'print') { $r1 .= ""; $r2 .= ""; } $mystr .= "$r1$r2
$name$value
"; case 'list': $mystr = ""; foreach ($params as $name => $value) { if ($name != 'print') { $mystr .= ""; } $mystr .= "
namevalue
$name$value
"; case 'basic': default: $mainparam = (isset($value) ? $value : (isset($id) ? $id : (isset($name) ? $name : ''))); // $mystr="StructuredData  type='{$type}'  value/id='c9c6046040'"; $mystr="{$type}".(isset($mainparam)?" [$mainparam]":
)."</span>";
}
if ($myerr) {
return ($myerr);
} else if ($printmode != 'false') {
display the data item
return ($mystr);
}
function SDbuildvcard($row) {
$n_array = split(';', $row['n']);
$name = (isset($n_array[3])? $n_array[3]." " : ).(isset($n_array[1]) ? (ucwords(strtolower($n_array[1]))." "):).(isset($n_array[2])? $n_array[2]." ": ).ucwords(strtolower($n_array[0])).(isset($n_array[4])? ", ".$n_array[4]: );
$str = "BEGIN:VCARD\r\nVERSION:2.1\r\nN:{$row['n']}\r\nFN:$name\r\n";
$str .= $row['org'] ? "ORG:{$row['org']}\r\n" : ; $str .= $row['tel'] ? "TEL;WORK:{$row['tel']}\r\n" : ; by default, tel is shown as work phone
$str .= $row['fax'] ? "TEL;FAX:{$row['fax']}\r\n" : ; $str .= $row['email'] ? "EMAIL;INTERNET:{$row['email']}\r\n" : ;
$str .= "END:VCARD\r\n";
return ($str);
}
function SDrunreq ($this, $reqid, $rows, $p1=null, $p2=null, $p3=null) {
$rows array row format: ('_wikkapage' => <page tag>, 'field1' => <val1>, 'field2' => <val2>, ...)
$table_css = "class='wikka' cellpadding='2' cellspacing='1' border='2'";
switch($reqid) {
case 'ItemTable': p1 = type of dataitem, p2 = column order list
$i = 0;
$keyorder = array();
if ($p2) {
$mycols = split(',', $p2);
foreach ($mycols as $lacol)
$keyorder[$lacol] = $i;
}
$mystr0 = "<table $table_css><tr class='comment'>";
foreach ($rows as $row) {
if (($row['_wikkapage']
$this->GetPageTag()) && ($row['type']
$p1)) {
$tmp_tr = array();
$mystr .= "<tr>";
foreach ($row as $key => $val) {
if (($key != '_wikkapage') && ($key != 'type') && ($key != 'print') && !isset($keyorder[$key])) {
$keyorder[$key] = $i;
}
if (($key != '_wikkapage') && ($key != 'type') && ($key != 'print')) {
$tmp_tr[$keyorder[$key]] = $val;
}
}
for ($j=0; $j < $i; $j) {
$mystr .= "<td>".$tmp_tr[$j]."</td>";
}
$mystr .= "</tr>";
}
}
build table header row
$tmp_tr = array();
foreach ($keyorder as $param => $k) {
$tmp_tr[$k] = $param;
}
for ($j=0; $j < $i; $j) {
$mystr0 .= "<th>".$tmp_tr[$j]."</th>";
}
$mystr = $mystr0. "</tr>". $mystr. "</table>";
if (!$i) $mystr=; empty table: display nothing
break;
case 'ToDos': p1 = this owner only; p2 = this status only
$mydata=array();
$i=0;
foreach ($rows as $row) {
if ($row['type']
'ToDo') {
if ( (!$p1 || ($p1
$row['owner'])) && (!$p2 || ($p2
}
}
}
if ($p3 'vCard') {
$mystr=; $cnt=0; ksort ($myvcards); foreach ($myvcards as $key => $card) { $mystr .= "$card\r\n"; $cnt++; } $mystr ='
'; } else { // default (table) format ksort($mydata); $mystr = "".(isset($p2) ? "":
Last nameGiven nameEmailPhoneFaxOrganization
)."</tr>";
foreach ($mydata as $key => $val) {
$mystr .= "$val";
}
$mystr .= "</table>";
}
break;
case 'myreq':
<mycode>
$mystr = <what I want to print>
break;
return ($mystr);
}
function SDdohelp ($reqid) {
$helpstr = ;
switch($reqid) {
case 'ItemTable':
$helpstr = "$reqid p1=<i>type</i> [p2=<i>column order list</i>] ";
break;
case 'ToDos':
$helpstr = "$reqid [p1=<i>owner</i>] [p2=<i>status</i>] ";
break;
case 'Cards':
$helpstr = "$reqid [p1=<i>org filter</i>] [p2=<i>sort column name</i>] [p3=<i>format (vCard|table)</i>] ";
break;
case 'myreq':
$helpstr = 'myfoobar';
break;
return ($helpstr);
}
if ((!isset($type) || !$type) && (!isset($req) || !$req) && !isset($help)) {
$output = SDerror("Usage: structdata type='<i>mytype</i>' [print='<i>printmode</i>'] data=\"[more parameters]\"");
{ display one-line help for $req
$output = SDdohelp ($req);
{
this is a request: load all relevant data in an associative array: $myrows
$query = "SELECT body, tag FROM ".$this->config['table_prefix']."pages WHERE ((latest = 'Y') AND (body LIKE '%{{structdata%'))";
foreach ($rows as $row) {
if (preg_match_all('/\{\{structdata(.+?)\}\}/', $row['body'], $matches)) {
foreach ($matches[1] as $mym) {
$newrow=array('_wikkapage' => $row['tag']);
if (preg_match('/type=\"(.*?)\"[ \t]*.*?data=\"(.*?)\"/', $mym, $matches2)) {
} else if (preg_match('/data=\"(.*?)\"[ \t]*.*?type=\"(.*?)\"/', $mym, $matches2)) {
for ($i=0; $i < count($matches3[1]); $i) {
we run the request
$output = SDrunreq ($this, $req, $myrows, (isset($p1)?$p1:), (isset($p2)?$p2:), (isset($p3)?$p3:));
if ($data) {
for ($i=0; $i<count($matches[1]); $i) {
parameter name is case-insensitive
$output = SDhandleitem ($type, $params, isset($print)?$print:);
} else {
$output = SDerror (sprintf(ERROR_PARAMETER_MANDATORY, 'data'));
if ($output) { print the result



Edited on 2006-12-16 14:02:12 by DomBonj [v0.98: i18n, vCard export, column order in ItemTable]

Additions:
# @version 0.98
# @uses Wakka::href()
if (!defined('ERROR_PARAMETER_MANDATORY')) define ('ERROR_PARAMETER_MANDATORY', "The '%s' parameter is mandatory");
if (!defined('ERROR_INCORRECT_DATE_FORMAT')) define ('ERROR_INCORRECT_DATE_FORMAT', "Incorrect format for '%s' parameter: use 'yyyy-mm-dd'");
if (!$owner) $myerr .= SDerror(sprintf(ERROR_PARAMETER_MANDATORY, 'owner'));
if (!$desc) $myerr .= SDerror(sprintf(ERROR_PARAMETER_MANDATORY, 'desc'));
$myerr .= SDerror(sprintf(ERROR_INCORRECT_DATE_FORMAT, 'date_open'));
$myerr .= SDerror(sprintf(ERROR_INCORRECT_DATE_FORMAT, 'date_due'));
$myerr.= SDerror(sprintf(ERROR_PARAMETER_MANDATORY, 'n'));
$mystr="<span title='structured data item: $type' class='notes'>{$type}".(isset($mainparam)?" [$mainparam]":).""; // display the data item function SDbuildvcard($row) { $n_array = split(';', $row['n']); $name = (isset($n_array[3])? $n_array[3]." " : ).(isset($n_array[1]) ? (ucwords(strtolower($n_array[1]))." "):).(isset($n_array[2])? $n_array[2]." ": ).ucwords(strtolower($n_array[0])).(isset($n_array[4])? ", ".$n_array[4]: ); $str = "BEGIN:VCARD\r\nVERSION:2.1\r\nN:{$row['n']}\r\nFN:$name\r\n"; $str .= $row['org'] ? "ORG:{$row['org']}\r\n" : ;
$str .= $row['tel'] ? "TEL;WORK:{$row['tel']}\r\n" : ; // by default, tel is shown as work phone $str .= $row['fax'] ? "TEL;FAX:{$row['fax']}\r\n" : ;
$str .= $row['email'] ? "EMAIL;INTERNET:{$row['email']}\r\n" : ; $str .= "END:VCARD\r\n"; return ($str); // $rows array row format: ('_wikkapage' => , 'field1' => , 'field2' => , ...) case 'ItemTable': // p1 = type of dataitem, p2 = column order list if ($p2) { $mycols = split(',', $p2); foreach ($mycols as $lacol) $keyorder[$lacol] = $i++; case 'Cards': // p1 = this org only; p2 = sort key ; p3 = format (vCard or default) $myvcards[$sortkey] = SDbuildvcard($row); if ($p3 == 'vCard') { $mystr=;
$cnt=0;
ksort ($myvcards);
foreach ($myvcards as $key => $card) {
$mystr .= "$card\r\n";
$cnt;
$mystr ='<form action="'.$this->href().'/grabcode" method="post" id="form_vCard" class="grabcode">
<input type="submit" name="save" class="grabcodebutton" style="line-height:10px; float:left; vertical-align: middle; margin-right:20px; margin-top:0px; font-size: 10px; color: #000; font-weight: normal; font-family: Verdana, Arial, sans-serif; background-color: #DDD; text-decoration: none; height:18px;" value="Grab '.$cnt.($cnt>1?' vCards':' vCard').'" title="Download vCard file" />
<input type="hidden" name="code" value="'.$mystr.'" /><input type="hidden" name="filename" value="wikka_vcards" /></form>';
} else { default (table) format
ksort($mydata);
$mystr = "<table $table_css><tr class='comment'><th>Last name</th><th>Given name</th><th>Email</th><th>Phone</th><th>Fax</th>".(isset($p2) ? "<th>Organization</th>":"")."</tr>";
foreach ($mydata as $key => $val) {
$mystr .= "$val";
$helpstr = "$reqid p1=<i>type</i> [p2=<i>column order list</i>] ";
case 'ToDos':
$helpstr = "$reqid [p1=<i>org filter</i>] [p2=<i>sort column name</i>] [p3=<i>format (vCard|table)</i>] ";
if (preg_match('/type=\"(.*?)\"[ \t]*.*?data=\"(.*?)\"/', $mym, $matches2)) {
preg_match_all('/(\w+?)\=\'(.*?)\'/', $matches2[2], $matches3);
} else if (preg_match('/data=\"(.*?)\"[ \t]*.*?type=\"(.*?)\"/', $mym, $matches2)) {
preg_match_all('/(\w+?)\=\'(.*?)\'/', $matches2[1], $matches3);
preg_match_all('/(\w*)\=\'(.*?)\'\s*?/', $data, $matches);
$output = SDerror (sprintf(ERROR_PARAMETER_MANDATORY, 'data'));


Deletions:
# @version 0.95
if (!$owner) $myerr.= SDerror("The 'owner' parameter is mandatory");
if (!$desc) $myerr.= SDerror("The 'desc' parameter is mandatory");
$myerr .= SDerror( "Incorrect format for 'date_open' parameter: use 'yyyy-mm-dd'");
$myerr .= SDerror ("Incorrect format for 'date_due' parameter: use 'yyyy-mm-dd'");
$myerr.= SDerror("The 'n' parameter is mandatory");
$mystr="<span title='structured data item' class='notes'>{$type}".(isset($mainparam)?" [$mainparam]":).""; // print (or not) the data item case 'ItemTable': // p1 = type of dataitem case 'Cards': // p1 = this org only; p2 = sort key ksort($mydata); $mystr = "".(isset($p2) ? "":
Last nameGiven nameEmailPhoneFaxOrganization
)."</tr>";
$helpstr = "$reqid p1=<i>type</i> ";
case 'ToDo':
$helpstr = "$reqid [p1=<i>org filter</i>] [p2=<i>sort column name</i>]";
row format : ('_wikkapage' => <page tag>, 'param1' => <val1>, 'param2' => <val2>, ...)
if (preg_match('/\s*type\s*=\s*\"(.*?)\"\s*.*?data\s*=\s*\"(.*?)\"/', $mym, $matches2)) {
preg_match_all('/\s*?(\w+?)\=\'(.*?)\'\s*?/', $matches2[2], $matches3);
} else if (preg_match('/\s*data\s*=\s*\"(.*?)\"\s*.*?type\s*=\s*\"(.*?)\"/', $mym, $matches2)) {
preg_match_all('/\s*?(\w+?)\=\'(.*?)\'\s*?/', $matches2[1], $matches3);
preg_match_all('/(\w+?)\=\'(.*?)\'\s*?/', $data, $matches);
$output = SDerror ("Missing 'data' parameter");




Edited on 2006-12-03 09:11:32 by DomBonj

Additions:
# Defines, optionnally displays a structured data item or # displays the results of a selection request
# @authors DomBonj
# @version 0.95
# $help, if present, displays a one-line help for request $reqid
preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_due, $ymd2);
if (!checkdate($ymd2[2], $ymd2[3], $ymd2[1]))
$mystr="<kbd class='keys'>StructuredData</kbd><span>  type='{$type}'  value/id='$mainparam'</span>";
$mystr = "<table $table_css><tr class='comment'><th>owner</th><th>description</th><th>due date</th><th>page link</th></tr>";
{
display one-line help for $req
{ this is a request: load all relevant data in an associative array: $myrows
$output = $this->ReturnSafeHTML($output);


Deletions:
# Defines and optionnally displays a structured data item # @authors Dominique Bonjour
# @version 0.93
# $help si présent affiche le mode d'emploi de $reqid
preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_due, $ymd);
$mystr = "<table $table_css><tr class='comment'><th>owner</th><th>description</th><th>due date</th><th>link</th></tr>";
{ all relevant data is loaded in an associative array: $myrows
$output = $this->ReturnSafeHTML($output);




Edited on 2006-12-03 06:45:24 by DomBonj

Additions:
return ("<em class='error'>$msg</em><br />");


Deletions:
return ("<em class='error'>$msg</em>");




Edited on 2006-12-02 19:49:45 by DomBonj

Additions:
$query = "SELECT body, tag FROM ".$this->config['table_prefix']."pages WHERE ((latest = 'Y') AND (body LIKE '%{{structdata%'))";
if (preg_match_all('/\{\{structdata(.+?)\}\}/', $row['body'], $matches)) {


Deletions:
$query = "SELECT body, tag FROM ".$this->config['table_prefix']."pages WHERE ((latest = 'Y') AND (body LIKE '%{{structdata0%'))";
if (preg_match_all('/\{\{structdata0(.+?)\}\}/', $row['body'], $matches)) {




Oldest known version of this page was edited on 2006-12-02 19:02:40 by DomBonj []
Page view:

StructData Action

See also:
works with:
NOT Included in any Wikka version
This is the development page for the structdata action.

Installation


Code

<?php
#
# Defines and optionnally displays a structured data item
#
# @package      Actions
# @name         structdata
#
# @authors      Dominique Bonjour
# @version      0.93
# @input        Parameters =  (type='mytype' data='datalist' [print=('basic'|'table'|'list'|'false')]
#               | req='reqid' [help][p1='val1'][p2='val2"][p3='val3'])
#               $datalist: list of 'pname'='pval' parameters, separated by spaces.
#                 restrictions: pval shall not include a ' followed by a space
#               $reqid : the name of a predefined request
#               $val1, $val2, $val3 : optional parameters for request $reqid
#               $help si présent affiche le mode d'emploi de $reqid
#
# @uses         Wakka::ReturnSafeHtml()
# @uses         Wakka::LoadAll()
# @uses         Wakka::GetPageTag()
#
# @notes        Add your code into the flagged areas
#

if (!function_exists('SDerror'))
{
  function SDerror($msg) {
    return ("<em class='error'>$msg</em>");
  }

  function SDhandleitem($type, $params, $printmode) {
    $table_css = "class='wikka' cellpadding='2' cellspacing='1' border='2'";
    $myerr = '';
    extract($params);
        $mystr="";
        switch ($type) {
        // custom formatting, data validation and hyperlink addition
          case 'ToDo':
            if (!$owner) $myerr.= SDerror("The 'owner' parameter is mandatory");
            if (!$desc) $myerr.= SDerror("The 'desc' parameter is mandatory");
            preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_open, $ymd);
            if (!checkdate($ymd[2], $ymd[3], $ymd[1]))
              $myerr .= SDerror( "Incorrect format for 'date_open' parameter: use 'yyyy-mm-dd'");
            preg_match('/(\d+)[\-\/](\d+)[\-\/](\d+)/', $date_due, $ymd);
            if (!checkdate($ymd[2], $ymd[3], $ymd[1]))
              $myerr .= SDerror ("Incorrect format for 'date_due' parameter: use 'yyyy-mm-dd'");
          break;

          case 'Card':
            if (!$n) {
              $myerr.= SDerror("The 'n' parameter is mandatory");
            }
            $n_array = split(';', $n);
            $name = (isset($n_array[1]) ? (ucwords(strtolower($n_array[1]))." ") : "").ucwords(strtolower($n_array[0]));
            $tooltip = isset($tel) ? "phone: $tel" : "";
            $tooltip .= (isset($fax) ? ($tooltip ? " / fax: $fax" : "fax: $fax") : "");
            $mystr = "<a href='mailto:$email' title='$tooltip'>".$name."</a>". ($org != '' ? " ($org)" : "");
          break;

/*------------------------------- begin customization area -----------------------------
          case 'mydataitem':
            <my validation and hyperlinking code>
            $mystr = <my formatting>;
          break;
--------------------------------- end customization area -----------------------------*/

        }

        if (!$mystr) {
        // type did not match any custom type : fallback to a standard type
          switch ($printmode) {
            case 'table':
              $mystr = "<table $table_css>"; $r1="<tr>"; $r2="<tr>";
              foreach ($params as $name => $value) {
                if ($name != 'print') {
                  $r1 .= "<th class='comment'>$name</th>";
                  $r2 .= "<td>$value</td>";
                }
              }
              $mystr .= "$r1</tr>$r2</tr></table>";
            break;

            case 'list':
              $mystr = "<table $table_css><tr class='comment'><th>name</th><th>value</th></tr>";
              foreach ($params as $name => $value) {
                if ($name != 'print') {
                  $mystr .= "<tr><td class='comment' align='right'>$name</td><td>$value</td></tr>";
                }
              }
              $mystr .=