From 4fac0d4ca344c10341a7ead981541ada804532c2 Mon Sep 17 00:00:00 2001 From: Shiki Date: Fri, 15 Nov 2013 10:50:32 +0800 Subject: [PATCH] Created an example project. Updated README to reflect the recent namespacing changes and updated installation instructions as well. Fixed a problem in `ProfileLogRoute` if there is no db connection available. --- README.md | 124 +++++---- example/.gitignore | 3 + example/Makefile | 2 + example/application/components/Controller.php | 23 ++ example/application/config/main.php | 44 ++++ .../controllers/SiteController.php | 45 ++++ example/application/runtime/.gitkeep | 0 example/application/views/layouts/column1.php | 6 + example/application/views/layouts/main.php | 55 ++++ example/application/views/site/index.php | 20 ++ example/composer.json | 9 + example/composer.lock | 184 ++++++++++++++ example/webroot/css/bg.gif | Bin 0 -> 243 bytes example/webroot/css/form.css | 164 ++++++++++++ example/webroot/css/ie.css | 36 +++ example/webroot/css/main.css | 229 +++++++++++++++++ example/webroot/css/print.css | 29 +++ example/webroot/css/screen.css | 238 ++++++++++++++++++ example/webroot/index.php | 13 + lib/SK/Yii/FirePHP/ProfileLogRoute.php | 8 +- 20 files changed, 1186 insertions(+), 46 deletions(-) create mode 100644 example/.gitignore create mode 100644 example/Makefile create mode 100644 example/application/components/Controller.php create mode 100644 example/application/config/main.php create mode 100644 example/application/controllers/SiteController.php create mode 100644 example/application/runtime/.gitkeep create mode 100644 example/application/views/layouts/column1.php create mode 100644 example/application/views/layouts/main.php create mode 100644 example/application/views/site/index.php create mode 100644 example/composer.json create mode 100644 example/composer.lock create mode 100644 example/webroot/css/bg.gif create mode 100644 example/webroot/css/form.css create mode 100644 example/webroot/css/ie.css create mode 100644 example/webroot/css/main.css create mode 100644 example/webroot/css/print.css create mode 100644 example/webroot/css/screen.css create mode 100644 example/webroot/index.php diff --git a/README.md b/README.md index 96c5e04..22a4a8a 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,80 @@ -FirePHP extension for Yii Framework -============================================ - -This extension contains 2 log route classes. The first, -[SFirePHPLogRoute](https://github.com/shiki/yii-firephp/blob/master/SFirePHPLogRoute.php) processes -standard Yii log messages. The second, -[SFirePHPProfileLogRoute](https://github.com/shiki/yii-firephp/blob/master/SFirePHPProfileLogRoute.php) -processes profile summaries. Both classes send all output to FirePHP. The classes work similarly -to [CWebLogRoute](http://www.yiiframework.com/doc/api/1.1/CWebLogRoute) -and [CProfileLogRoute](http://www.yiiframework.com/doc/api/1.1/CProfileLogRoute). +# FirePHP extension for Yii Framework + +This extension contains 2 log route classes. The first, `SK\Yii\FirePHP\LogRoute`, processes +standard Yii log messages. The second, `SK\Yii\FirePHP\ProfileLogRoute`, processes profile summaries. +Both classes send all output to [FirePHP](http://www.firephp.org/). The classes work similarly +to [`CWebLogRoute`](http://www.yiiframework.com/doc/api/1.1/CWebLogRoute) +and [`CProfileLogRoute`](http://www.yiiframework.com/doc/api/1.1/CProfileLogRoute). The only major difference is the target output. -An advantage of using this extension is that logging and profiling work even through AJAX -requests. Logging of arrays is also possible. +An advantage of using this extension is that logging and profiling work even through AJAX requests. + +![](http://shiki.me/public/github/yii-firephp/example.png) + +## Requirements + +* PHP 5.4+ +* A Yii Framework `1.1.14+` project. +* Firebug and FirePHP plugins for Firefox. See http://firephp.org. Firebug's _Console_ and + _Net_ tabs have to be enabled for this to work. +* Set `output_buffering` setting to true in `php.ini`. You might also want to increase the buffer + size to allow large log sizes. -This extension currently supports FirePHPCore 0.3.2. Support for FirePHP 1.0 is planned. +## Installation -Requirements ------------- +The only supported installation method for now is using [Composer](http://getcomposer.org/). -* A Yii Framework project -* Install Firebug and FirePHP plugins for Firefox. See http://firephp.org. -* Set output_buffering setting to true in php.ini. +1. Put this in your `composer.json` and run `composer update` to install it: -Installation ------------- + { + "repositories": [ + { "type": "vcs", "url": "https://github.com/shiki/yii-firephp.git" } + ], + "require": { + "shiki/yii-firephp": "dev-master" + } + } -1. Download and extract the contents to a folder under your extensions directory. - This can be "/protected/extensions/firephp". -2. Modify your config file to include the log route classes. -##### config file code (i.e. /protected/config/main.php) - .... + This will also automatically install the dependency `firephp/firephp-core`. - 'log' => array( - 'class' => 'CLogRouter', - 'routes' => array( +2. Make sure you have loaded the Composer autoload file (`vendor/autoload.php`) so the libraries + can be accessed in your Yii config file. See the `main.php` config file in the `example` project + on how this can be done. + +3. Modify your config file (e.g. `protected/config/main.php`) to include the log route classes. + + .... + + 'log' => array( + 'class' => 'CLogRouter', + 'routes' => array( // the default (file logger) array( - 'class' => 'CFileLogRoute', - 'levels' => 'error, warning', + 'class' => 'CFileLogRoute', + 'levels' => 'error, warning', ), // standard log route array( - 'class' => 'ext.firephp.SFirePHPLogRoute', - 'levels' => 'error, warning, info, trace', + 'class' => '\\SK\\Yii\\FirePHP\\LogRoute', + 'levels' => 'error, warning, info, trace', ), // profile log route array( - 'class' => 'ext.firephp.SFirePHPProfileLogRoute', - 'report' => 'summary' // or "callstack" + 'class' => '\\SK\\Yii\\FirePHP\\ProfileLogRoute', + 'report' => 'summary', // or "callstack" ), + ), ), - ), - .... + .... -Standard logging ------ +## Standard logging Once you've got the extension setup in the config, you can use Yii's logging methods to log messages to FirePHP. - // logging an INFO message (arrays will work and looks awesome in FirePHP) - Yii::log(array('username' => 'Shiki', 'profiles' => array('twidl', 'twitter', 'facebook')), CLogger::LEVEL_INFO); + // logging an INFO message + Yii::log('This is an info message.', CLogger::LEVEL_INFO); // logging a WARNING message Yii::log("You didn't setup a profile, are you really a person?", CLogger::LEVEL_WARNING); @@ -73,13 +86,16 @@ Once you've got the extension setup in the config, you can use Yii's logging met Yii::trace('Loading application.user.profiles.ninja', 'application.user.profiles'); // logging an ERROR - Yii::log('We have successfully determined that you are not a person', CLogger::LEVEL_ERROR, 'Any category/label will work'); + Yii::log('We have successfully determined that you are not a person', + CLogger::LEVEL_ERROR, 'Any category/label will work'); + + // If you need to log an array, you can use FirePHP's core methods + FB::warn(array('a' => 'b', 'c' => 'd'), 'an.array.warning'); See more about logging [here](http://www.yiiframework.com/doc/guide/1.1/en/topics.logging). -Profiling ------ +## Profiling Profiling works by simply using Yii's profiling methods. @@ -87,7 +103,7 @@ Profiling works by simply using Yii's profiling methods. ... // some function calls here - // more function calls + // more function calls Yii::beginProfile('nested profile'); // you can also nest profile calls @@ -98,4 +114,22 @@ Profiling works by simply using Yii's profiling methods. You can also profile SQL executions. See more about that and profiling in general [here](http://www.yiiframework.com/doc/guide/1.1/en/topics.logging#performance-profiling). --end- + +## Example + +To try all these out, there's an example project in the `example` folder. To run it: + +1. Install the required libraries using Composer. + + $ cd example + $ composer install + +2. Run with the PHP [built-in webserver](http://php.net/manual/en/features.commandline.webserver.php) + + $ cd example/webroot + $ php -S localhost:8000 + +3. Browse [http://localhost:8000](http://localhost:8000) in Firefox. Make sure first that Firebug is opened and the + Console and Net tabs are enabled. You should be able to see the FirePHP logs in Firebug's console. + If you don't, try refreshing first. + diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..deef953 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,3 @@ +vendor +webroot/assets +application/runtime diff --git a/example/Makefile b/example/Makefile new file mode 100644 index 0000000..f5ea162 --- /dev/null +++ b/example/Makefile @@ -0,0 +1,2 @@ +run: + cd webroot && php -S localhost:8000 diff --git a/example/application/components/Controller.php b/example/application/components/Controller.php new file mode 100644 index 0000000..8748d35 --- /dev/null +++ b/example/application/components/Controller.php @@ -0,0 +1,23 @@ + dirname(__FILE__).DIRECTORY_SEPARATOR.'..', + 'name' => 'Yii FirePHP Example', + + 'preload' => array('log'), + + // autoloading model and component classes + 'import' => array( + 'application.models.*', + 'application.components.*', + ), + + 'modules'=>array( + + ), + + // application components + 'components' => array( + 'log' => array( + 'class' => 'CLogRouter', + 'routes' => array( + // the default (file logger) + array( + 'class' => 'CFileLogRoute', + 'levels' => 'error, warning', + ), + // standard log route + array( + 'class' => '\\SK\\Yii\\FirePHP\\LogRoute', + 'levels' => 'error, warning, info, trace', + ), + // profile log route + array( + 'class' => '\\SK\\Yii\\FirePHP\\ProfileLogRoute', + 'report' => 'summary', // or "callstack" + ), + ), + ), + ), +); diff --git a/example/application/controllers/SiteController.php b/example/application/controllers/SiteController.php new file mode 100644 index 0000000..f047678 --- /dev/null +++ b/example/application/controllers/SiteController.php @@ -0,0 +1,45 @@ + 'b', 'c' => 'd'), 'an.array.warning'); + + // Profiling + + Yii::beginProfile('rendering'); + + for ($i = 0; $i < 30; $i++) + $this->runProfilingSampleLoop(); + + $this->render('index'); + Yii::endProfile('rendering'); + } + + private function runProfilingSampleLoop() + { + Yii::beginProfile('dummy method'); + for ($i = 0; $i < 100; $i++) { + $a = 1; + } + Yii::endProfile('dummy method'); + } +} diff --git a/example/application/runtime/.gitkeep b/example/application/runtime/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/example/application/views/layouts/column1.php b/example/application/views/layouts/column1.php new file mode 100644 index 0000000..702fd65 --- /dev/null +++ b/example/application/views/layouts/column1.php @@ -0,0 +1,6 @@ + +beginContent('//layouts/main'); ?> +
+ +
+endContent(); ?> \ No newline at end of file diff --git a/example/application/views/layouts/main.php b/example/application/views/layouts/main.php new file mode 100644 index 0000000..22e5683 --- /dev/null +++ b/example/application/views/layouts/main.php @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + <?php echo CHtml::encode($this->pageTitle); ?> + + + + +
+ + + + + breadcrumbs)):?> + widget('zii.widgets.CBreadcrumbs', array( + 'links' => $this->breadcrumbs, + )); ?> + + + + +
+ + + +
+ + + diff --git a/example/application/views/site/index.php b/example/application/views/site/index.php new file mode 100644 index 0000000..1081ea2 --- /dev/null +++ b/example/application/views/site/index.php @@ -0,0 +1,20 @@ +pageTitle=Yii::app()->name; +?> + +

Welcome to name); ?>

+ +

Congratulations! You have successfully created your Yii application.

+ +

You may change the content of this page by modifying the following two files:

+ + +

For more details on how to further develop this application, please read +the documentation. +Feel free to ask in the forum, +should you have any questions.

diff --git a/example/composer.json b/example/composer.json new file mode 100644 index 0000000..cd5e72d --- /dev/null +++ b/example/composer.json @@ -0,0 +1,9 @@ +{ + "repositories": [ + { "type": "vcs", "url": "https://github.com/shiki/yii-firephp.git" } + ], + "require": { + "yiisoft/yii": ">= 1.1.14", + "shiki/yii-firephp": "dev-master" + } +} diff --git a/example/composer.lock b/example/composer.lock new file mode 100644 index 0000000..071b307 --- /dev/null +++ b/example/composer.lock @@ -0,0 +1,184 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "e74e5d5c88438a6690767098d6402561", + "packages": [ + { + "name": "firephp/firephp-core", + "version": "v0.4.0", + "source": { + "type": "git", + "url": "https://github.com/firephp/firephp-core.git", + "reference": "fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firephp/firephp-core/zipball/fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf", + "reference": "fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/FirePHPCore/FirePHP.class.php", + "lib/FirePHPCore/fb.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christoph Dorn", + "email": "christoph@christophdorn.com", + "homepage": "http://christophdorn.com" + } + ], + "description": "Traditional FirePHPCore library for sending PHP variables to the browser.", + "homepage": "https://github.com/firephp/firephp-core", + "time": "2013-04-23 15:28:20" + }, + { + "name": "shiki/yii-firephp", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/shiki/yii-firephp.git", + "reference": "e3fde4074a7db69cfe9ffff49bd9390019eb1855" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/shiki/yii-firephp/zipball/e3fde4074a7db69cfe9ffff49bd9390019eb1855", + "reference": "e3fde4074a7db69cfe9ffff49bd9390019eb1855", + "shasum": "" + }, + "require": { + "firephp/firephp-core": ">=0.4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "SK": "lib" + } + }, + "license": [ + "MIT" + ], + "description": "FirePHP extension for Yii Framework.", + "homepage": "https://github.com/shiki/yii-firephp", + "keywords": [ + "firebug", + "firephp", + "yii" + ], + "support": { + "source": "https://github.com/shiki/yii-firephp/tree/master", + "issues": "https://github.com/shiki/yii-firephp/issues" + }, + "time": "2013-10-01 10:28:50" + }, + { + "name": "yiisoft/yii", + "version": "1.1.14", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii.git", + "reference": "f0fee98ee84f70f1f3652f65562c9670e919cb4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii/zipball/f0fee98ee84f70f1f3652f65562c9670e919cb4e", + "reference": "f0fee98ee84f70f1f3652f65562c9670e919cb4e", + "shasum": "" + }, + "require": { + "php": ">=5.1.0" + }, + "bin": [ + "framework/yiic" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "http://www.yiiframework.com/", + "role": "Founder and project lead" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "http://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "http://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Wei Zhuo", + "email": "weizhuo@gmail.com", + "role": "Project site maintenance and development" + }, + { + "name": "Sebastián Thierer", + "email": "sebas@artfos.com", + "role": "Component development" + }, + { + "name": "Jeffrey Winesett", + "email": "jefftulsa@gmail.com", + "role": "Documentation and marketing" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "http://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" + } + ], + "description": "Yii Web Programming Framework", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "framework", + "yii" + ], + "time": "2013-08-12 00:12:08" + } + ], + "packages-dev": [ + + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": { + "shiki/yii-firephp": 20 + }, + "platform": [ + + ], + "platform-dev": [ + + ] +} diff --git a/example/webroot/css/bg.gif b/example/webroot/css/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..428398973e1a8a6a1129d9332da6714e59bedba4 GIT binary patch literal 243 zcmZ?wbhEHbWMeR5IKlt||Ns9Fn|mU0@#)m1XEK+c^_h9pch)ig*~bFs91EU%JYxQd z=mjU^7M;pmaW-ewx%@Tfi`HEz-EgsD1pFZrjzSo!1+8Tx;5Kt##K8 zpn+h6L4@K@7DfgJ83r8?2V^G$YrzAxzKG1Mj9F{fJlz+r6JFwb_s5d=LGRrUD5QAQ zNc8tDnRFnBZ{CHrl2a?9#BZ!gI2~HCzjK3xqn`Y^jOMDdVT&(5-4yZXZ_&=1Ypz<& pbz11_%i7%H?(X8^=xAqWZEay;YHDPpudkz{si~%>tgOgj4FL3OZcYFI literal 0 HcmV?d00001 diff --git a/example/webroot/css/form.css b/example/webroot/css/form.css new file mode 100644 index 0000000..7c4d096 --- /dev/null +++ b/example/webroot/css/form.css @@ -0,0 +1,164 @@ +/** + * CSS styles for forms generated by yiic. + * + * The styles can be applied to the following form structure: + * + *
+ *
+ * + * + *

hint text

+ *
+ *
+ * + * + *

hint text

+ *
+ *
+ * + * + *

hint text

+ *
+ *
+ * + * The above code will render the labels and input fields in separate lines. + * In order to render them in the same line, please use the "wide" form as follows, + * + *
+ * ...... + *
+ * + * @author Qiang Xue + * @link http://www.yiiframework.com/ + * @copyright 2008-2010 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +div.form +{ +} + +div.form input, +div.form textarea, +div.form select +{ + margin: 0.2em 0 0.5em 0; +} + +div.form fieldset +{ + border: 1px solid #DDD; + padding: 10px; + margin: 0 0 10px 0; + -moz-border-radius:7px; +} + +div.form label +{ + font-weight: bold; + font-size: 0.9em; + display: block; +} + +div.form .row +{ + margin: 5px 0; +} + +div.form .hint +{ + margin: 0; + padding: 0; + color: #999; +} + +div.form .note +{ + font-style: italic; +} + +div.form span.required +{ + color: red; +} + +div.form div.error label:first-child, +div.form label.error, +div.form span.error +{ + color: #C00; +} + +div.form div.error input, +div.form div.error textarea, +div.form div.error select, +div.form input.error, +div.form textarea.error, +div.form select.error +{ + background: #FEE; + border-color: #C00; +} + +div.form div.success input, +div.form div.success textarea, +div.form div.success select, +div.form input.success, +div.form textarea.success, +div.form select.success +{ + background: #E6EFC2; + border-color: #C6D880; +} + +div.form div.success label +{ + color: inherit; +} + +div.form .errorSummary +{ + border: 2px solid #C00; + padding: 7px 7px 12px 7px; + margin: 0 0 20px 0; + background: #FEE; + font-size: 0.9em; +} + +div.form .errorMessage +{ + color: red; + font-size: 0.9em; +} + +div.form .errorSummary p +{ + margin: 0; + padding: 5px; +} + +div.form .errorSummary ul +{ + margin: 0; + padding: 0 0 0 20px; +} + +div.wide.form label +{ + float: left; + margin-right: 10px; + position: relative; + text-align: right; + width: 100px; +} + +div.wide.form .row +{ + clear: left; +} + +div.wide.form .buttons, div.wide.form .hint, div.wide.form .errorMessage +{ + clear: left; + padding-left: 110px; +} diff --git a/example/webroot/css/ie.css b/example/webroot/css/ie.css new file mode 100644 index 0000000..f015399 --- /dev/null +++ b/example/webroot/css/ie.css @@ -0,0 +1,36 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 1.0.1 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* ie.css */ +body {text-align:center;} +.container {text-align:left;} +* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} +* html legend {margin:0px -8px 16px 0;padding:0;} +sup {vertical-align:text-top;} +sub {vertical-align:text-bottom;} +html>body p code {*white-space:normal;} +hr {margin:-8px auto 11px;} +img {-ms-interpolation-mode:bicubic;} +.clearfix, .container {display:inline-block;} +* html .clearfix, * html .container {height:1%;} +fieldset {padding-top:0;} +legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;} +textarea {overflow:auto;} +label {vertical-align:middle;position:relative;top:-0.25em;} +input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} +input.text:focus, input.title:focus {border-color:#666;} +input.text, input.title, textarea, select {margin:0.5em 0;} +input.checkbox, input.radio {position:relative;top:.25em;} +form.inline div, form.inline p {vertical-align:middle;} +form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} +button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/example/webroot/css/main.css b/example/webroot/css/main.css new file mode 100644 index 0000000..13327b8 --- /dev/null +++ b/example/webroot/css/main.css @@ -0,0 +1,229 @@ +body +{ + margin: 0; + padding: 0; + color: #555; + font: normal 10pt Arial,Helvetica,sans-serif; + background: #EFEFEF; +} + +#page +{ + margin-top: 5px; + margin-bottom: 5px; + background: white; + border: 1px solid #C9E0ED; +} + +#header +{ + margin: 0; + padding: 0; + border-top: 3px solid #C9E0ED; +} + +#content +{ + padding: 20px; +} + +#sidebar +{ + padding: 20px 20px 20px 0; +} + +#footer +{ + padding: 10px; + margin: 10px 20px; + font-size: 0.8em; + text-align: center; + border-top: 1px solid #C9E0ED; +} + +#logo +{ + padding: 10px 20px; + font-size: 200%; +} + +#mainmenu +{ + background:white url(bg.gif) repeat-x left top; +} + +#mainmenu ul +{ + padding:6px 20px 5px 20px; + margin:0px; +} + +#mainmenu ul li +{ + display: inline; +} + +#mainmenu ul li a +{ + color:#ffffff; + background-color:transparent; + font-size:12px; + font-weight:bold; + text-decoration:none; + padding:5px 8px; +} + +#mainmenu ul li a:hover, #mainmenu ul li.active a +{ + color: #6399cd; + background-color:#EFF4FA; + text-decoration:none; +} + +div.flash-error, div.flash-notice, div.flash-success +{ + padding:.8em; + margin-bottom:1em; + border:2px solid #ddd; +} + +div.flash-error +{ + background:#FBE3E4; + color:#8a1f11; + border-color:#FBC2C4; +} + +div.flash-notice +{ + background:#FFF6BF; + color:#514721; + border-color:#FFD324; +} + +div.flash-success +{ + background:#E6EFC2; + color:#264409; + border-color:#C6D880; +} + +div.flash-error a +{ + color:#8a1f11; +} + +div.flash-notice a +{ + color:#514721; +} + +div.flash-success a +{ + color:#264409; +} + +div.form .rememberMe label +{ + display: inline; +} + +div.view +{ + padding: 10px; + margin: 10px 0; + border: 1px solid #C9E0ED; +} + +div.breadcrumbs +{ + font-size: 0.9em; + padding: 5px 20px; +} + +div.breadcrumbs span +{ + font-weight: bold; +} + +div.search-form +{ + padding: 10px; + margin: 10px 0; + background: #eee; +} + +.portlet +{ + +} + +.portlet-decoration +{ + padding: 3px 8px; + background: #B7D6E7; + border-left: 5px solid #6FACCF; +} + +.portlet-title +{ + font-size: 12px; + font-weight: bold; + padding: 0; + margin: 0; + color: #298dcd; +} + +.portlet-content +{ + font-size:0.9em; + margin: 0 0 15px 0; + padding: 5px 8px; + background:#EFFDFF; +} + +.portlet-content ul +{ + list-style-image:none; + list-style-position:outside; + list-style-type:none; + margin: 0; + padding: 0; +} + +.portlet-content li +{ + padding: 2px 0 4px 0px; +} + +.operations +{ + list-style-type: none; + margin: 0; + padding: 0; +} + +.operations li +{ + padding-bottom: 2px; +} + +.operations li a +{ + font: bold 12px Arial; + color: #0066A4; + display: block; + padding: 2px 0 2px 8px; + line-height: 15px; + text-decoration: none; +} + +.operations li a:visited +{ + color: #0066A4; +} + +.operations li a:hover +{ + background: #80CFFF; +} \ No newline at end of file diff --git a/example/webroot/css/print.css b/example/webroot/css/print.css new file mode 100644 index 0000000..bd79afd --- /dev/null +++ b/example/webroot/css/print.css @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 1.0.1 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* print.css */ +body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} +.container {background:none;} +hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} +code {font:.9em "Courier New", Monaco, Courier, monospace;} +a img {border:none;} +p img.top {margin-top:0;} +blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} +.small {font-size:.9em;} +.large {font-size:1.1em;} +.quiet {color:#999;} +.hide {display:none;} +a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} +a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff --git a/example/webroot/css/screen.css b/example/webroot/css/screen.css new file mode 100644 index 0000000..7824d07 --- /dev/null +++ b/example/webroot/css/screen.css @@ -0,0 +1,238 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 1.0.1 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ +html {margin:0;padding:0;border:0;} +body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;} +article, aside, details, figcaption, figure, dialog, footer, header, hgroup, menu, nav, section {display:block;} +body {line-height:1.5;background:white;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;float:none !important;} +table, th, td {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:'';} +blockquote, q {quotes:"" "";} +a img {border:none;} +:focus {outline:0;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:2em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:1.6em;margin-bottom:0.75em;} +h3 {font-size:1.4em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +.left {float:left !important;} +p .left {margin:1.5em 1.5em 1.5em 0;padding:0;} +.right {float:right !important;} +p .right {margin:1.5em 0 1.5em 1.5em;padding:0;} +a:focus, a:hover {color:#09f;} +a {color:#06c;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong, dfn {font-weight:bold;} +em, dfn {font-style:italic;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0;} +ul, ol {margin:0 1.5em 1.5em 0;padding-left:1.5em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* grid.css */ +.container {width:950px;margin:0 auto;} +.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;} +.last {margin-right:0;} +.span-1 {width:30px;} +.span-2 {width:70px;} +.span-3 {width:110px;} +.span-4 {width:150px;} +.span-5 {width:190px;} +.span-6 {width:230px;} +.span-7 {width:270px;} +.span-8 {width:310px;} +.span-9 {width:350px;} +.span-10 {width:390px;} +.span-11 {width:430px;} +.span-12 {width:470px;} +.span-13 {width:510px;} +.span-14 {width:550px;} +.span-15 {width:590px;} +.span-16 {width:630px;} +.span-17 {width:670px;} +.span-18 {width:710px;} +.span-19 {width:750px;} +.span-20 {width:790px;} +.span-21 {width:830px;} +.span-22 {width:870px;} +.span-23 {width:910px;} +.span-24 {width:950px;margin-right:0;} +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;} +input.span-1, textarea.span-1 {width:18px;} +input.span-2, textarea.span-2 {width:58px;} +input.span-3, textarea.span-3 {width:98px;} +input.span-4, textarea.span-4 {width:138px;} +input.span-5, textarea.span-5 {width:178px;} +input.span-6, textarea.span-6 {width:218px;} +input.span-7, textarea.span-7 {width:258px;} +input.span-8, textarea.span-8 {width:298px;} +input.span-9, textarea.span-9 {width:338px;} +input.span-10, textarea.span-10 {width:378px;} +input.span-11, textarea.span-11 {width:418px;} +input.span-12, textarea.span-12 {width:458px;} +input.span-13, textarea.span-13 {width:498px;} +input.span-14, textarea.span-14 {width:538px;} +input.span-15, textarea.span-15 {width:578px;} +input.span-16, textarea.span-16 {width:618px;} +input.span-17, textarea.span-17 {width:658px;} +input.span-18, textarea.span-18 {width:698px;} +input.span-19, textarea.span-19 {width:738px;} +input.span-20, textarea.span-20 {width:778px;} +input.span-21, textarea.span-21 {width:818px;} +input.span-22, textarea.span-22 {width:858px;} +input.span-23, textarea.span-23 {width:898px;} +input.span-24, textarea.span-24 {width:938px;} +.append-1 {padding-right:40px;} +.append-2 {padding-right:80px;} +.append-3 {padding-right:120px;} +.append-4 {padding-right:160px;} +.append-5 {padding-right:200px;} +.append-6 {padding-right:240px;} +.append-7 {padding-right:280px;} +.append-8 {padding-right:320px;} +.append-9 {padding-right:360px;} +.append-10 {padding-right:400px;} +.append-11 {padding-right:440px;} +.append-12 {padding-right:480px;} +.append-13 {padding-right:520px;} +.append-14 {padding-right:560px;} +.append-15 {padding-right:600px;} +.append-16 {padding-right:640px;} +.append-17 {padding-right:680px;} +.append-18 {padding-right:720px;} +.append-19 {padding-right:760px;} +.append-20 {padding-right:800px;} +.append-21 {padding-right:840px;} +.append-22 {padding-right:880px;} +.append-23 {padding-right:920px;} +.prepend-1 {padding-left:40px;} +.prepend-2 {padding-left:80px;} +.prepend-3 {padding-left:120px;} +.prepend-4 {padding-left:160px;} +.prepend-5 {padding-left:200px;} +.prepend-6 {padding-left:240px;} +.prepend-7 {padding-left:280px;} +.prepend-8 {padding-left:320px;} +.prepend-9 {padding-left:360px;} +.prepend-10 {padding-left:400px;} +.prepend-11 {padding-left:440px;} +.prepend-12 {padding-left:480px;} +.prepend-13 {padding-left:520px;} +.prepend-14 {padding-left:560px;} +.prepend-15 {padding-left:600px;} +.prepend-16 {padding-left:640px;} +.prepend-17 {padding-left:680px;} +.prepend-18 {padding-left:720px;} +.prepend-19 {padding-left:760px;} +.prepend-20 {padding-left:800px;} +.prepend-21 {padding-left:840px;} +.prepend-22 {padding-left:880px;} +.prepend-23 {padding-left:920px;} +.border {padding-right:4px;margin-right:5px;border-right:1px solid #ddd;} +.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #ddd;} +.pull-1 {margin-left:-40px;} +.pull-2 {margin-left:-80px;} +.pull-3 {margin-left:-120px;} +.pull-4 {margin-left:-160px;} +.pull-5 {margin-left:-200px;} +.pull-6 {margin-left:-240px;} +.pull-7 {margin-left:-280px;} +.pull-8 {margin-left:-320px;} +.pull-9 {margin-left:-360px;} +.pull-10 {margin-left:-400px;} +.pull-11 {margin-left:-440px;} +.pull-12 {margin-left:-480px;} +.pull-13 {margin-left:-520px;} +.pull-14 {margin-left:-560px;} +.pull-15 {margin-left:-600px;} +.pull-16 {margin-left:-640px;} +.pull-17 {margin-left:-680px;} +.pull-18 {margin-left:-720px;} +.pull-19 {margin-left:-760px;} +.pull-20 {margin-left:-800px;} +.pull-21 {margin-left:-840px;} +.pull-22 {margin-left:-880px;} +.pull-23 {margin-left:-920px;} +.pull-24 {margin-left:-960px;} +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} +.push-1 {margin:0 -40px 1.5em 40px;} +.push-2 {margin:0 -80px 1.5em 80px;} +.push-3 {margin:0 -120px 1.5em 120px;} +.push-4 {margin:0 -160px 1.5em 160px;} +.push-5 {margin:0 -200px 1.5em 200px;} +.push-6 {margin:0 -240px 1.5em 240px;} +.push-7 {margin:0 -280px 1.5em 280px;} +.push-8 {margin:0 -320px 1.5em 320px;} +.push-9 {margin:0 -360px 1.5em 360px;} +.push-10 {margin:0 -400px 1.5em 400px;} +.push-11 {margin:0 -440px 1.5em 440px;} +.push-12 {margin:0 -480px 1.5em 480px;} +.push-13 {margin:0 -520px 1.5em 520px;} +.push-14 {margin:0 -560px 1.5em 560px;} +.push-15 {margin:0 -600px 1.5em 600px;} +.push-16 {margin:0 -640px 1.5em 640px;} +.push-17 {margin:0 -680px 1.5em 680px;} +.push-18 {margin:0 -720px 1.5em 720px;} +.push-19 {margin:0 -760px 1.5em 760px;} +.push-20 {margin:0 -800px 1.5em 800px;} +.push-21 {margin:0 -840px 1.5em 840px;} +.push-22 {margin:0 -880px 1.5em 880px;} +.push-23 {margin:0 -920px 1.5em 920px;} +.push-24 {margin:0 -960px 1.5em 960px;} +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:left;position:relative;} +div.prepend-top, .prepend-top {margin-top:1.5em;} +div.append-bottom, .append-bottom {margin-bottom:1.5em;} +.box {padding:1.5em;margin-bottom:1.5em;background:#e5eCf9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:1px;margin:0 0 17px;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} diff --git a/example/webroot/index.php b/example/webroot/index.php new file mode 100644 index 0000000..9cd37d6 --- /dev/null +++ b/example/webroot/index.php @@ -0,0 +1,13 @@ +run(); diff --git a/lib/SK/Yii/FirePHP/ProfileLogRoute.php b/lib/SK/Yii/FirePHP/ProfileLogRoute.php index 818e7f5..25ee7ce 100644 --- a/lib/SK/Yii/FirePHP/ProfileLogRoute.php +++ b/lib/SK/Yii/FirePHP/ProfileLogRoute.php @@ -95,7 +95,12 @@ private function renderCallstack($data) */ private function renderSQLStats() { - $stats = \Yii::app()->getDb()->getStats(); + try { + $stats = \Yii::app()->getDb()->getStats(); + } catch (\CDbException $e) { + // Silently abort if we could not connect to the db. + return; + } // Using a table because groups are broken as of FirePHP 0.7.4 and FireBug 1.12.2 // https://github.com/firephp/firephp-extension/issues/13 @@ -111,3 +116,4 @@ private function renderSQLStats() } } +