------------------------------------------------------------ revno: 923 committer: Roger Martin <[email protected]> branch nick: aikiframework timestamp: Mon 2011-10-31 09:22:52 +0100 message: aiki tools first alpha added added: src/assets/apps/tools/ src/assets/apps/tools/aiki_tools.php
-- lp:aikiframework https://code.launchpad.net/~aikiframework-devel/aikiframework/trunk Your team Aiki Framework Developers is subscribed to branch lp:aikiframework. To unsubscribe from this branch go to https://code.launchpad.net/~aikiframework-devel/aikiframework/trunk/+edit-subscription
=== added directory 'src/assets/apps/tools' === added file 'src/assets/apps/tools/aiki_tools.php' --- src/assets/apps/tools/aiki_tools.php 1970-01-01 00:00:00 +0000 +++ src/assets/apps/tools/aiki_tools.php 2011-10-31 08:22:52 +0000 @@ -0,0 +1,1000 @@ +<?php + +/** + * Aiki Framework (PHP) + * + * LICENSE + * + * This source file is subject to the AGPL-3.0 license that is bundled + * with this package in the file LICENSE. + * + * @author Roger Martin + * @copyright (c) 2008-2011 Aiki Lab Pte Ltd + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html + * @link http://www.aikiframework.org + * @category Aiki + * @package utility apps + * @filesource + */ + +define ("VERSION", "0.01 alpha"); + + /* + * PURPOSE + * A tools for recovery, dignostic or mantain aiki site, that works + * even if aiki site is crashed. + * + * It's not other admin interface. + * + * + */ + + +$start= microtime(true); +session_start(); + +// try connection +$aikiDB = false; +if ( isset($_SESSION["connection"]) ){ + if ( !@mysql_connect( $_SESSION["db_host"], $_SESSION["db_user"], $_SESSION["db_pass"]) ){ + unset($_SESSION["connection"]); + } elseif ( @mysql_select_db( $_SESSION["db_name"]) ){ + $aikiDB = true; + } +} + +// set action to do +$action = @$_POST["_action"] or $action=@$_GET["_action"] or $action=""; +$action = strtolower($action); +if ( !$aikiDB && $action!="connect" ) { + $action="no-action"; +} + +// take decision using $action +switch ( $action ) { + case "no-action": + $content= ask_connection_data(); + break; + + case "connect": + if ( !isset($_SESSION["time"]) || time()-$_SESSION["time"] < 10 ) { + message("Please, wait 10 sec. before click on connect button","warning"); + $content= ask_connection_data(); + } elseif ( @mysql_connect( $_POST["db_host"], $_POST["db_user"], $_POST["db_pass"]) ){ + $_SESSION['db_host']= $_POST["db_host"]; + $_SESSION['db_user']= $_POST["db_user"]; + $_SESSION['db_pass']= $_POST["db_pass"]; + $_SESSION["connection"]=true; + $message ="Conected {$_POST['db_user']}@{$_POST['db_host']}"; + + if ( @mysql_select_db( $_POST["db_name"])){ + $_SESSION["db_name"]= $_POST["db_name"]; + $aikiDB= true; + message ( $message . "<br>Open {$_POST['db_name']}" ); + } else { + $content = ask_connection_data() ; + message ( $message . "<br><strong>No database selected</strong>", "warning"); + } + + } else { + $content = ask_connection_data(); + message ("Error: can't connect","error"); + } + break; + + case "search widget": + $widget= str_replace("'","",$_GET["search"]); + $SQL= "SELECT * FROM aiki_widgets WHERE " . ( (integer) $widget>0 ? "id='$widget'" : "widget_name='$widget'" ); + $content= show_mysql($SQL); + break; + + case "search content": + $widget_content= str_replace("'","",$_GET["search"]); + $link="'NO_FILTER_HTML:','<a href=\"?_action=query&SQL=SELECT * FROM aiki_widgets WHERE id=',id,'\">',id,'</a>'"; + $SQL= "SELECT concat($link,'\n',widget_name, '\n', widget_site) as id_data,". + "widget,display_urls FROM aiki_widgets WHERE widget like '%$widget_content%' "; + $content= show_mysql($SQL); + break; + + case "search url": + $widget= str_replace("'","",$_GET["search"]); + $SQL= "SELECT * FROM aiki_widgets WHERE display_urls like '%|$widget|%' OR display_urls='$widget' or display_urls like '%|$widget' or display_urls like '$widget|%'"; + $content= show_mysql($SQL); + break; + + case "edit": + if ( isset($_GET["table"]) && isset($_GET["id"])) { + $table = clean($_GET["table"]) ; + $id = clean($_GET["id"]); + $content = form_record ( $table, $id ); + } else { + message( "Table name or id value not found","error"); + } + break; + + case "frame-phpinfo": + phpinfo(); + die(); + + case "phpinfo": + $content = ""; // phpinfo is executed in html layout + break; + + case "save record": + if ( !isset($_POST["_table"]) || !isset($_POST["_table_id"])) { + message("Error saving: missing table of id field value","error"); + } elseif ( sql_save_record( $_POST["_table"], $_POST["_table_id"]) ){ + message("Record saved"); + } else { + message("Error saving:<br><em>". mysql_error()."</em>","error") ; + } + break; + + case "clone record": + if ( !isset($_POST["_table"]) || !isset($_POST["_table_id"])) { + message("Error cloning: missing table of id field value","error"); + } elseif ( sql_clone_record( $_POST["_table"], $_POST["_table_id"]) ){ + message("Record cloned"); + } else { + message( "Error cloning:" . mysql_error(), "error"); + } + break; + + case "save as new": + case "add record": + if ( !isset($_POST["_table"]) ) { + message("Error adding: missing table","error"); + } elseif ( sql_add_record( $_POST["_table"])){ + message("Record added"); + } else { + message("Error adding:" . mysql_error()); + } + break; + + case "logout": + unset($_SESSION['db_host']); + unset($_SESSION['db_user']); + unset($_SESSION['db_pass']); + unset($_SESSION['db_name']); + unset($_SESSION['connection']); + header("location:aiki_tools.php"); + break; + + case "show tables": + $content = show_tables(); + break; + + case "show widgets": + $content = show_widgets(); + break; + + case "query": + $content= ask_for_query(); + break; + + case "send query": + $SQL = $_GET["SQL"]; + $content= ask_for_query() . + show_mysql($SQL); + break; + + case "": + $content="(no action)"; + break; + + default: + $content="invalid action .$action"; + } + + + +/* + * EMBED LIBRARY + * + **********************************************************/ + + +/** + * show a form with host,user,password, and database + * @return string html form. + */ + +function ask_connection_data(){ + $file = basename(__FILE__); + + $_SESSION["time"] = time(); + + $db_host = isset($_POST["db_host"]) ? $_POST['db_host']: "localhost"; + $db_user = isset($_POST["db_user"]) ? $_POST['db_user']: ""; + $db_pass = isset($_POST["db_pass"]) ? $_POST['db_pass']: ""; + $db_name = isset($_POST["db_name"]) ? $_POST['db_name']: ""; + + if ( isset($_SESSION["connection"]) ) { + + $rs= mysql_query("SHOW DATABASES"); + $select_db=""; + while ($row= mysql_fetch_row($rs)) { + if ( $row[0] != "information_schema" ){ + $select_db .= "<option value='{$row[0]}'>{$row[0]}</option>\n"; + } + } + + if ( $select_db=="") { + $select_db = "No database avalaible"; + } else { + $select_db = + "<select name='db_name'>\n". + $select_db. + "</select>\n"; + } + } else { + $select_db= "<input type='text' name='db_name' size='30' value='$db_name'>" ; + } + + $form = <<<EOF +<form id="f_conection" class="pretty" method="POST" action="$file" > + <label>Host: </label><input type="text" name="db_host" size="30" value="$db_host" > + <label>User: </label><input type="text" name="db_user" size="30" value="$db_user" > + <label>Password:</label><input type="password" name="db_pass" size="30" value="$db_pass" > + <label>Database:</label>$select_db + <input type="submit" value="Connect" name="_action" class='button unique-button'> +</form> +EOF; + return $form; +} + +/** + * ask for a query (using a textarea) + * + * @return string HTML + */ + +function ask_for_query(){ + + $file = basename(__FILE__); + $SQL = isset($_GET["SQL"]) ? $_GET["SQL"] : "" ; + + $form= " +<div id='database'> + <h3>Write a SQL query</h3> + <form method='get' action='$file'> + <textarea name='SQL' rows='6' cols='60'>$SQL</textarea> + <input type='submit' value='Send Query' name='_action' class='button unique-button'> + </form> +</div>"; + + return $form; +} + + +/** + * set/get a little message. + * With no parameters, function work like get, returning last stored + * message. With a paramertes, set (store) the message. + * Message will be sorrounded by a div class=message messaget-type. + + * @param string [optional] message + * @param string $type literal warning, ok (default), error. + * @return string actual message + */ + +function message( $text=NULL, $type="ok"){ + static $message=""; + if ( !is_null($text) ) { + $message = "<div class='message message-$type'>$text</div>\n"; + } + return $message; +} + + +/** + * list all tables, and details of a given table by $_GET[table] + * + * @return string HTML of list, actual table + */ + +function show_tables(){ + + $rs= mysql_query("SHOW TABLES"); + $list = "<ul class='tables'>\n"; + + $table = isset($_GET['table'] ) ? clean($_GET['table']) : "" ; + + while ($row= mysql_fetch_row($rs)) { + $active = ( $row[0]==$table ? " class='active'": "" ); + $list .= "<li$active>". + "<span class='table-name'>{$row[0]}</span>". + "<a href='?_action=send+query&SQL=SELECT * FROM $row[0]'>data</a> ". + "<a href='?_action=show+tables&table=$row[0]'>structure</a>". + "</li>\n"; + } + $list .= "</ul>"; + + $structure = ( $table ? "<h3>$table</h3>\n". show_mysql ("SHOW COLUMNS FROM $table", false) : ""); + + $content = "<div class='col-container two-cols col-tables'>\n<div class='col-list'>$list</div>\n<div class='structure col-data'>$structure</div>"; + + return $content; +} + + +/** + * list all widet in list, and details of a given widget by $_GET[widget] + * + * @return string HTML + */ + +function show_widgets(){ + + $rs= mysql_query("SELECT * FROM aiki_widgets ORDER BY id"); + $widget = isset($_GET['widget'] ) ? clean($_GET['widget']) : "" ; + $list = "<ul class='tables'>\n"; + + while ($row= mysql_fetch_assoc($rs)) { + $active = ( $row['id']==$widget ? " class='active'": "" ); + $list .= "<li$active>". + "<span class='table-name'>{$row['id']}: {$row['widget_name']}</span>". + "<a href='?_action=show+widgets&widget={$row['id']}'>brief</a> ". + "</li>\n"; + } + $list .= "</ul>"; + + $brief = ( $widget ? show_widget($widget) : ""); + + $content = "<div class='col-container two-cols col-tables'>\n<div class='col-list'>$list</div>\n<div class='widget-data col-data'>$brief</div>"; + + return $content; +} + + +/** + * show a unique widget in details + * show_widgets (note s) use this function. + * @param $id integer . Id of widget to show + * @return string HTML + */ + +function show_widget( $id){ + $id= (int) $id; + + $content = + "<div id='widget_link'> + <a href=?_action=edit&table=aiki_widgets&id=$id class='button'>EDIT</a> <a href='#page_data'>Id</a><a href='#page_display'>Display</a><a href='#page_permissions'>Permission</a></div>". + "<form method='post'>\n". + "<input type='hidden' name='table' value='widget'>\n". + "<input type='hidden' name='table_id' value='$id'>\n". + "</form>". + "<h3>Widget Data</h3>\n". + "<div id='widget_wrapper'>". + "<div id='widget_pages'>"; + + $content .= + "<div id='page_data' class='widget_page'>\n". + "<h4>Identification data</h4>\n". + sql_show_record( + "SELECT id,widget_name, if(is_father,'yes','no') as father, father_widget,widget_site,". + " if(is_active,'Yes','No') as active". + " FROM aiki_widgets". + " WHERE id=$id LIMIT 1", "widget") . + "</div>"; + + $content .= + "<div id='page_display' class='widget_page'>\n". + "<h4>Display</h4>". + sql_show_record( + "SELECT display_urls, kill_urls, widget, css, if_no_results". + " FROM aiki_widgets". + " WHERE id=$id LIMIT 1","widget"). + "</div>"; + + $content .= + "<div id='page_permissions' class='widget_page'>\n". + "<h4>Permissions</h4>". + sql_show_record( + "SELECT authorized_select, if_authorized, if( is_admin,'yes', 'no') as admin, permissions". + " FROM aiki_widgets". + " WHERE id=$id LIMIT 1","widget"). + "</div>" ; + + $content .= "</div>" . // close wrappers. + "</div>"; + + return $content; +} + +/** + * show search bar that containts shortcut, and search utilities. + * + * @return string HTML + */ + +function show_search_bar(){ + +$file = basename(__FILE__); +$widget = isset($_GET["search"] ) ? $_GET["search"] : "" ; +$search = " +<div id='search-area'> + <a href='?_action=show+tables'>Show tables</a> <a href='?_action=show+widgets'>Show widgets</a> + <a href='?_action=phpinfo'>phpinfo</a> + <form method='get' action='$file' > + <input name='search' value='$widget' /> + <input type='submit' value='Search widget' name='_action' class='shortcut'/> + <input type='submit' value='Search content' name='_action' class='shortcut'/> + <input type='submit' value='Search url' name='_action' class='shortcut'/> + </form> + +</div>"; +return $search; +} + + +/** + * execute a SQL query and show the result + * + * @param string $SQL the query + * @param boolean $showRecordsFound when true (Default) show nÂș of records found. + * @return string HTML + */ + +function show_mysql($SQL, $showRecordsFound=true){ + $file = basename(__FILE__); + + // try to insert primary key in result. + $primaryKey= false; + if ( ( $table = sql_extract_table($SQL)) && ( $primaryKey= sql_get_primary_key($table) ) ){ + if ( !preg_match ("/^SELECT\s+\*\s+FROM/i", $SQL) ) { + $SQL = "SELECT $primaryKey as PRYMARI_KEI6," . substr($SQL,6); // PRYMARI is intencioned + $primaryKey = "PRYMARI_KEI6"; + } + } + + // execute query + $result = mysql_query($SQL); + if ( mysql_errno() ) { + message("BAD QUERY. MYSQL ERROR ". mysql_errno() ."<br><em>" . mysql_error()."</em>","error") ; + return " :-("; + } + + $rows = mysql_num_rows($result); + if ( $showRecordsFound ) { + if ( $rows==0) { + message ( "No records found", "warning"); + } else { + message ( "Found: $rows record" . ( $rows>1?"s" : "") ); + } + } + + + if ( $rows < 3 ) { + //show records one field per row. + $contenido .="<table class='record'>"; + while ( $row= mysql_fetch_assoc($result) ){ + $contenido .="<table class='record'>"; + if ( $primaryKey ) { + $contenido.= "<tr ><th class='action'><a href='$file?_action=edit&table=$table&id={$row[$primaryKey]}'>Edit</a></th></tr>"; + } + foreach ($row as $field=> $value ){ + if ( $field<>"PRYMARI_KEI6") { + $contenido.= "<tr><th>$field</th><td>" . filter($value) ."</td></tr>\n"; + } + } + $contenido .="</table>\n"; + } + } else { + // show records as table (one record per row) + $count=0; + $contenido .= "<table><tr>"; + while ( $row= mysql_fetch_assoc($result) ){ + if ( !$count ){ + foreach ($row as $key=>$value ){ + if ( $key<>"PRYMARI_KEI6") { + $contenido.= "<th>$key</th>"; + } + } + $contenido .="</tr>\n"; + } + $contenido .="<tr class='". ( $count%2 ? "even": "odd") . "'>\n"; + foreach ($row as $key=>$value ){ + if ( $key<>"PRYMARI_KEI6") { + $contenido.= "<td>" . filter($value) ."</td>"; + } + } + $contenido .="</tr>\n"; + $count++; + if ( $count > 100 ){ + break; + } + + } + $contenido .= "</table>"; + } + + return $contenido; +} + + + +/** + * clean '" from a given string + * + * @param string $string to clean + * @return string cleaned + */ + +function clean($string){ + return strtr( $string, array ( + "'" => "", + '"' => "")); + +} + +/** + * Filter a string, replacing \n by br and html <> by identities. + * + * @param string $string to clean + * @return string cleaned + */ + +function filter($s){ +if ( strpos($s,"NO_FILTER_HTML:") ===0) { + return str_replace("\n", "<br>", substr($s,15)); +} +return strtr( $s, array ( + ">" => ">", + "<" => "<", + "\n"=>"<br>")); +} + + +/** + * extract table from a SQL SELECT + * + * @param string $SQL Select query + * @return string table + */ + +function sql_extract_table ($SQL){ + if ( preg_match("/^SELECT .* FROM\s+([^ ]+)/i",$SQL, $resul)) { + return $resul[1]; + } + return false; +} + + +/** + * get the primary key of a given table + * + * @param string $table to exam + * @return string field or false + */ + +function sql_get_primary_key($table){ + $rs = mysql_query("SHOW COLUMNS FROM $table"); + while ( $field = mysql_fetch_array($rs) ){ + if ( $field["Key"] == "PRI" ) { + return $field["Field"]; + } + } + return false; +} + + +/** + * add a record to a given table, reading field values from $_POST + * + * @param string $table + * @return boolean if added true, elser false + */ + +function sql_add_record ( $table ){ + + // cleaning + $table= mysql_real_escape_string($table); + + foreach ($_POST as $key=>$value){ + if ( substr($key,0,1)!="_") { + $fields[]=$key; + $values[]=addslashes($value); + } + } + + $sql = sprintf( "INSERT INTO $table (%s) VALUES ('%s') ", + implode("," , $fields), + implode("','", $values) ); + return mysql_query($sql); +} + + +/** + * save record to a given table and id, reading field values from $_POST + * + * @param string $table + * @param string $id value + * @return boolean if saved true, elser false + */ + +function sql_save_record ( $table, $id ){ + + // cleaning + $table= mysql_real_escape_string($table); + $id = mysql_real_escape_string($id); + + foreach ($_POST as $key=>$value){ + if ( substr($key,0,1)!="_") { + $pairs[] = "$key= '". addslashes($value). "'"; + } + } + + $primaryKey = sql_get_primary_key($table); + if ( $primaryKey ) { + $sql = sprintf( + "UPDATE $table SET %s WHERE $primaryKey='$id' ", + implode("," , $pairs)); + return mysql_query($sql); + } + return false; + } + + +/** + * clone a record for given table and id + * + * @param string $table + * @param string $id value + * @return boolean if saved true, elser false + */ + +function sql_clone_record ( $table, $id ) { + + // cleaning + $table= mysql_real_escape_string($table); + $id= mysql_real_escape_string($id); + + // get field list + $rsStructure = mysql_query("SHOW COLUMNS FROM $table"); + $fields= array(); + $primaryKey =""; + while ( $field = mysql_fetch_array($rsStructure) ){ + + if ( $field["Key"] == "PRI" ){ + $primaryKey = $field[0]; + } + $fields[] = $field["Key"] == "PRI" || $field["Key"] == "UNI" ? "NULL": $field[0]; + } + mysql_free_result ( $rsStructure ); + + // clonar el registro mediante una SQL + if ( $primaryKey && count($fields)>0 ) { + $SQL = sprintf( "INSERT INTO $table ( SELECT %s FROM $table WHERE %s='%s' )", + implode(",",$fields), + $primaryKey, + $id ); + mysql_query ($SQL); + return mysql_affected_rows(); + } + return false; +} + + +/** + * show the record of the first row of a given SQL SELECT query. + * + * @param string $SQL + * @param string $class + * @return string html code + */ + +function sql_show_record($SQL, $class=""){ + $rs= mysql_query($SQL); + if ( $record = mysql_fetch_assoc($rs) ){ + $table = "<table class='record" . ($class? " $class" : "" ) ."'>"; + foreach ($record as $field => $value ){ + $table .= "<tr><th>$field</th><td>". htmlspecialchars($value) ."</td></tr>\n"; + } + $table .= "</table>"; + return $table; + } + message("no record $SQL","warning"); + return ""; +} + + +/** + * show a html form to edit a record of a table + * + * @param string $table + * @param string $id value + * @return string html code + */ + + +function form_record($table, $id=NULL) { + + // obtain structure and primary key + $keyField = sql_get_primary_key($table); + if ( !$keyField ) { + return false; + } + + $fields= array(); + $rs = mysql_query("SHOW COLUMNS FROM $table"); + while ( $field = mysql_fetch_array($rs) ){ + $fields[ $field["Field"] ]= $field; + } + mysql_free_result($rs); + + // obtain data + if ( is_null($id) ){ + // record; + $record = array(); + foreach ($fields as $fieldname=>$field) { + if ( $field["Default"] !="NULL" && + strpos($field["Default"], "ON ") !==0 ){ + $record [ $fieldname ] = $field["Default"]; + } + } + } else { + $rs= mysql_query("SELECT * FROM $table WHERE $keyField='$id'"); + if ( ! $record= mysql_fetch_array($rs) ) { + return "<div class='message error'>Record not found</div>"; + } + } + + if ( is_null($id) ){ + $buttons= "<input type='submit' name='_action' class='button' value='Add record'>"; + } else { + $buttons= "<input type='submit' name='_action' class='button' value='Save record'>". + "<input type='submit' name='_action' class='button' value='Save as new'>". + "<input type='submit' name='_action' class='button' value='Clone record'>"; + } + + return + "<form action='". basename(__FILE__) . "' method='post' class='record edit'>". + $buttons. + "<input type='hidden' name='_table' value='$table'>\n". + ( !is_null($id) ? "<input type='hidden' name='_table_id' value='$id'>": "") ."\n". + form_fields_record($fields,$record). + $buttons. + "</form>"; +} + + +/** + * helper for form_record, that return input/textarea for each field + * + * @param string $table + * @param string $id value + * @return string html code + */ + +function form_fields_record( $fields, $record ){ + $ret=""; + foreach ($fields as $fieldname => $field ){ + $ret .= "<p><label for='$fieldname'>$fieldname</label>"; + $value = isset($record[$fieldname]) ? $record[$fieldname] : "" ; + + switch ( $field["Type"] ) { + case "text": + case "tinytext"; + case "mediumtext": + case "longtext": + $ret .= "<textarea id='$fieldname' name='$fieldname' rows='5' cols='60'>$value</textarea>"; + break; + default : + $ret .= "<input type='text' id='$fieldname' name='$fieldname' value='$value' >"; + break; + } + $ret .= "</p>\n"; + } + return $ret; +} + + +/** + * ECHO W3C border-radius css, with -moz and -webkit variants + * + * @param string $borders + * @return string css code + */ + +function border_radius($borders){ + echo "border-radius:$borders;-moz-border-radius:$borders;-webkit-border-radius:$borders;"; +} + + +/*********************************************************** + * + * EMBEDDED CSS + * + **********************************************************/ +?> +<!DOCTYPE html> +<html> +<head> +<title>Aiki Tools</title> +<style type="text/css"> + +* { margin:0; padding:0;} + +body, table, textarea, form, input, select { +font-family: sans-serif; +font-size:13px; +line-height:16px;} + +body { +background-color:#333; } + +h1{ font-size: 30px; line-height:40px; padding:4px 0px; color:#555;text-transform:uppercase;} +h1 em { display:block; font-size:15px; line-height:18px; font-style:normal; color: orange; text-transform:lowercase} +h2{ font-size: 20px; line-height:24px; padding:4px 0px; color:orange} + +h3{ font-size: 13px; font-weight:bold ; text-transform: uppercase;} +h4{ font-size: 13px; font-weight:normal; text-transform: uppercase; +padding: 6x 0 7px 0;} + +a { text-decoration:none; color: #569} +a:hover { color: #333} + +#page { <?php border_radius('15px');?> +background-color:#fff;min-height:100%;padding: 1% 2% 9px 2%;position: relative;margin: 11px 6%;} + +#header { padding-right:45%; min-height: 80px;} + +#connection-data { <?php border_radius('0px 0px 0px 6px');?> +position: absolute; top: 0px; right: 0; +padding: 2px 4px 6px 24px; +background-color: #333; +color: #fff; font-weight:bold; +text-align:right;} +#connection-data a { color: orange} +#connection-data a:hover { color: #777} +#connection-data a:before {content: "\2192";padding-right: 0.25em} + +#search-area { position: absolute;top: 33px;width: 55%;right: 2%;text-align:right;} +#search-area input[type='submit']{background-color: #fff; border:none;color: #569;} +#search-area input[type='submit']:hover {color:#333; cursor:pointer} +#search-area a + a { margin-left: 1em;} +#search-area a:before {content: "\2192";padding-right: 0.25em} + +#top {width:100%;background-color:#f0f0f0;height:31px;border-bottom:1px solid #333;} +#top li { display: block; float:left; width:110px; padding:10px 4px 4px 4px; height: 18px; +margin-bottom:16px;border-right: 1px solid #333} +#top li:hover { background-color: #999} +#top a { color: #333; font-weight: bold;} + +#f_conection {width: 400px; margin: 15px auto;} + +#menu {overflow: auto;} + +#database {padding:0;margin: 9px 4% 9px 0;} + +#aditional-info { padding-top:9px;color: #777; text-align:right} + +form.pretty label { display:block; color:#666; margin:12px 0px 4px 0px; clear:both} +form.pretty input.shortcut { float: left;} + +input.button { margin-right: 4px} +input.unique-button { display: block; margin: 8px 0px} + +ul.tables, +table { border-collapse: collapse; color: #333; font-size:12px; margin:12px 0px;} +table theader tr { border-bottom: 1px solid #000 } + +ul.tables li { +display: block; +border-bottom: 1px dotted #999 } +ul.tables li:hover { border-bottom-color: orange; color: orange } +ul.tables li.active { background-color:#f6f6f6;} +ul.tables li a { float: right; margin-right: 1em} +ul.tables li a:hover { color: orange } + +table tr { border-bottom: 1px dotted #999 } +table th, +table td { vertical-align:top; padding: 1px 2px; } + +table th+th, +table td+td{ border-left: 1px dotted #999 } + +table tr.odd { background-color:#f0f0f0;} + +table.record td { width:80%} +table.record th { text-align: right; } +table.record th.action { text-align: left; } +table.record th.action a { background: #f0f0ff; padding: 5px 10px 2px 10px;} +table.record th.action a:hover { background: #ddd} + +table.record+table.record{margin-top:2em} + +table.widget th { border-right: 1px solid #AAA;padding-right:4px} + +#results {width:100%; overflow:auto} + +div.col-tables { background-color: #f6f6f6 } +div.col-list { background-color: #fff} +div.col-container { overflow:auto;} +div.col-container > div { float:left; } +div.col-container > div + div { margin-left: 4%;} +div.two-cols > div { width:55%} +#page div.col-list { width:35%;} +div.col-data h3 { margin: 16px 0 15px 0px; border-bottom:1px solid #333;} +div.col-data table { width: 100%} + +div.message { margin: 1em 0; padding: 0.5em 8px; background-color: #f0f0f0; width:50%; +<?php border_radius("8px");?>} +div.message-error { color: #900; font-weight:bold; } +div.message-error em { color: #333; font-weight:normal; font-style:normal; } +div.message-warning { color: orange; font-weight:bold; } + +form.record label, form.record textarea, form.record input, form.record select { +font-size:14px;} + +form.record p { margin: 2px 0px; border-top:1px dotted #999; } +form.record label { float:left; clear:left;width:20%;color: #333; padding:2px 1em 0 0;text-align:right; } +form.record textarea:focus{ height: 30em} + +#widget_link { margin:8px 0px;overflow: auto; clear:both} +#widget_link a { margin-right:1em; } +#widget_link a:before {content: "\2192";padding-right: 0.25em} + +#widget_link a.button { background-color: #ddd; padding:1px 1.5em 1px 0.5em} + +</style> +</head> +<?php +/*********************************************************** + * + * EMBEDDED HTML BODY + * + *********************************************************/ + ?> +<body> + +<div id="page"> + + <div id="header"> + <h1><img src="http://www.aikiframework.org/assets/images/bannerlogo.png" alt="aiki framework"><em> recovery tool for aiki framework</em></h1> + <?php if ( $aikiDB ) { ?> + <div id="connection-data"> + <?php echo "<strong>Server:</strong> ",$_SESSION['db_host']," <strong>Database:</strong> ", $_SESSION['db_name'];?> + | <a href="?_action=logout">Logout</a> + </div> + <?php + echo show_search_bar(); + } + ?> + </div> + + + <div id="menu"> + <?php + + if ( $aikiDB ) {?> + <div id="top"> + <ul> + <li><a href="?_action=show+widgets">Widgets</a></li> + <li><a href="?_action=show+tables">Tables</a></li> + <li><a href="?_action=query">SQL</a></li> + </ul> + </div> + <?php + show_search_bar(); + } // from if !$aikiDB + ?> + </div> + + <?php echo message(); ?> + + <div id="results"> + <?php + if ( $action == "phpinfo") { + echo "<iframe src='?_action=frame-phpinfo' width='100%' height='600px'></iframe>"; + } else { + echo $content; + }?> + </div> + + <div id="aditional-info">Version <?php echo VERSION; printf(" | Generated in %.2f mseg", 1000*(microtime(true)-$start)); ?></div> +</div> + +</body> +</html>
_______________________________________________ Mailing list: https://launchpad.net/~aikiframework-devel Post to : [email protected] Unsubscribe : https://launchpad.net/~aikiframework-devel More help : https://help.launchpad.net/ListHelp

