Created
July 13, 2012 21:22
-
-
Save LeonardoCA/3107582 to your computer and use it in GitHub Desktop.
AjaxPanelsCompilerExtension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* This file is part of the AjaxPanels Nette Addon | |
* | |
* Copyright (c) 2012 Leonard Odlozilik | |
* | |
* For the full copyright and license information, please view | |
* the file license.txt that was distributed with this source code. | |
*/ | |
namespace Lxo\Ajax; | |
use Nette; | |
/** | |
* AjaxPanels - refreshes content of any debug panel | |
* | |
* @author Vojtěch Dobeš | |
* @author Leonard Odlozilik | |
*/ | |
class AjaxPanels extends Nette\Object | |
{ | |
public function __construct() | |
{ | |
} | |
/** | |
* Adds barDump for Ajax Requests | |
* | |
* @param \Nette\Application\Application $sender | |
* @param \Nette\Application\IResponse $response | |
* @return void | |
*/ | |
public function barDump(Nette\Application\Application $sender, Nette\Application\IResponse $response) | |
{ | |
$presenter = $sender->getPresenter(); | |
if ($presenter->isAjax() && Nette\Diagnostics\Debugger::isEnabled() && Nette\Diagnostics\Debugger::$bar) { | |
$panels = Nette\Reflection\ClassType::from(Nette\Diagnostics\Debugger::$bar) | |
->getProperty('panels'); | |
$panels->setAccessible(TRUE); | |
$panels = $panels->getValue(Nette\Diagnostics\Debugger::$bar); | |
$presenter->payload->netteDumps = $panels['Nette\Diagnostics\DefaultBarPanel-4']->data; | |
//Nette\Diagnostics\Debugger::barDump($panels); | |
if (array_key_exists('DibiNettePanel', $panels)) { | |
$presenter->payload->dibiPanel = $panels['DibiNettePanel']->getPanel(); | |
} | |
} | |
} | |
/** | |
* @param \Nette\Application\Application $sender | |
* @return void | |
*/ | |
/* | |
public function registerLogFileComponent(Nette\Application\Application $sender) | |
{ | |
$presenter = $sender->getPresenter(); | |
//$presenter->addComponent(new Lxo\Ajax\ComponentExceptionLogFile); | |
} | |
*/ | |
/* | |
public function createComponentExceptionLogFile() { | |
return new Lxo\Ajax\ComponentExceptionLogFile; | |
} | |
*/ | |
/* | |
public static function handleGetExceptionLogFile() { | |
if (Nette\Diagnostics\Debugger::isEnabled() && Nette\Diagnostics\Debugger::$bar) { | |
echo file_exists($filename = $this->getParam('file')) ? file_get_contents($filename) : '"'.$this->getParam('file').'" not found.'; | |
$this->terminate(); | |
} | |
} | |
*/ | |
public static function sendExceptionLogFile(Nette\Application\Application $sender, \Exception $e) { | |
if (Nette\Diagnostics\Debugger::isEnabled() && Nette\Diagnostics\Debugger::$bar && ($presenter = $sender->getPresenter()) && (preg_match('/exceptionLogFile/', $e->getMessage()))) { | |
echo file_exists($filename = $presenter->getParam('file')) ? file_get_contents($filename) : '"'.$presenter->getParam('file').'" not found.'; | |
Nette\Diagnostics\Debugger::$bar = FALSE; | |
die(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* This file is part of AjaxPanels Extension for Nette | |
* | |
* @author LeonardoCA | |
* | |
*/ | |
namespace Lxo\Ajax; | |
use Nette, | |
Nette\DI\ContainerBuilder, | |
Nette\Utils\Validators; | |
class AjaxPanelsCompilerExtension extends Nette\Config\CompilerExtension | |
{ | |
public function loadConfiguration() { | |
$builder = $this->getContainerBuilder(); | |
if ($builder->hasDefinition('application')) { | |
$ajaxPanels = $builder->addDefinition($this->prefix('ajaxpanels')) | |
->setClass('LXO\Ajax\AjaxPanels'); | |
$builder->getDefinition('application') | |
->addSetup('$service->onResponse[] = ?;', array(array($ajaxPanels, 'barDump'))) | |
// nasty workaround because I was not able to addComponent to presenter using compiler extension | |
// file is sent while Presenter can not create component 'exceptionLogFile' | |
->addSetup('$service->onError[] = ?;', array(array($ajaxPanels, 'sendExceptionLogFile'))); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* This file is part of the AjaxPanels Nette Addon | |
* | |
* Copyright (c) 2012 Leonard Odlozilik | |
* | |
* For the full copyright and license information, please view | |
* the file license.txt that was distributed with this source code. | |
*/ | |
namespace Lxo\Ajax; | |
use Nette; | |
/** | |
* Component sending log file to browser | |
* | |
* @author Leonard Odlozilik | |
*/ | |
class ComponentExceptionLogFile extends Nette\Application\UI\PresenterComponent | |
{ | |
public function handleGetExceptionLogFile() { | |
if (Nette\Diagnostics\Debugger::isEnabled() && Nette\Diagnostics\Debugger::$bar) { | |
Nette\Diagnostics\Debugger::$bar = FALSE; | |
$presenter = $this->getPresenter(TRUE); | |
echo file_exists($filename = $presenter->getParam('file')) ? file_get_contents($filename) : '"'.$this->getParam('file').'" not found.'; | |
$presenter->terminate(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function($, undefined) { | |
/** | |
* Shows barDumps from Ajax request | |
*/ | |
$.nette.ext('diagnostics.dumps', { | |
success: function (payload) { | |
if (!payload.netteDumps || payload.netteDumps.length == 0) return; | |
var $panel = this.getPanel(), $helper = $('<div>'); | |
$(this.getTitle(++this.counter)).appendTo($panel); | |
$.each(payload.netteDumps, function (i, item) { | |
if (item.title) $('<h2>', { | |
text: item.title | |
}).appendTo($helper); | |
var $table = $('<table>').appendTo($helper), i = 0; | |
$.each(item.dump, function (key, dump) { | |
var $caption = $('<th>') | |
$table.append($('<tr>', { | |
'class': i++ % 2 ? 'nette-alt' : '', | |
html: '<th>' + key + '</th><td>' + dump + '</td>' | |
})); | |
}); | |
}); | |
$helper.children().appendTo($panel); | |
this.notify(); | |
} | |
}, { | |
counter: 0, | |
getTitle: function (count) { | |
return '<h2>Ajax request #' + count + '</h2>'; | |
}, | |
getTab: function () { | |
if (!this.tab) this.tab = $('[rel=Nette-Diagnostics-DefaultBarPanel-4]'); | |
return this.tab; | |
}, | |
getPanel: function () { | |
if (!this.panel) this.panel = $('#nette-debug-panel-Nette-Diagnostics-DefaultBarPanel-4 .nette-DumpPanel'); | |
return this.panel; | |
}, | |
notify: function () { | |
if (this.notified) return; | |
$('<strong>', { | |
text: ' [ajax!]', | |
css: { fontWeight: 'bold' } } | |
).appendTo(this.getTab()); | |
this.notified = true; | |
} | |
}); | |
})(jQuery); | |
(function($, undefined) { | |
/** | |
* Shows db queries for Ajax request in dibi panel | |
*/ | |
$.nette.ext('diagnostics.dibipanel', { | |
success: function (payload) { | |
if (!payload.dibiPanel || payload.dibiPanel.length == 0) return; | |
var $panel = this.getPanel(), $helper = $('<div>'); | |
$(this.getTitle(++this.counter)).appendTo($panel); | |
$('<div>', { | |
html: payload.dibiPanel | |
}).appendTo($helper); | |
console.log(payload.dibiPanel); | |
$helper.children().appendTo($panel); | |
this.notify(); | |
} | |
}, { | |
counter: 0, | |
getTitle: function (count) { | |
return '<h2>Ajax request #' + count + '</h2>'; | |
}, | |
getTab: function () { | |
if (!this.tab) this.tab = $('[rel=DibiNettePanel]'); | |
return this.tab; | |
}, | |
getPanel: function () { | |
if (!this.panel) this.panel = $('#nette-debug-panel-DibiNettePanel .nette-DibiProfiler'); | |
return this.panel; | |
}, | |
notify: function () { | |
if (this.notified) return; | |
$('<strong>', { | |
text: ' [ajax!]', | |
css: { fontWeight: 'bold' } } | |
).appendTo(this.getTab()); | |
this.notified = true; | |
} | |
}); | |
})(jQuery); | |
/* | |
(function($, undefined) { | |
/** | |
* Shows HTTP Error Statuses from Ajax request | |
*//* | |
$.nette.ext('error', { | |
error: function (payload) { | |
if (payload.status != 200) { | |
$('#snippet--flashMessages').html('<div class="alert alert-error"><a class="close" data-dismiss="alert">×</a>'+payload.status+' '+payload.statusText+'</div>'); | |
} | |
} | |
}); | |
})(jQuery); | |
*/ | |
(function($, undefined) { | |
/** | |
* Shows HTTP Error Statuses and some FireLogger info from Ajax request | |
*/ | |
$.nette.ext('httpStatusToFlash', { | |
start: function (xhr) { | |
//xhr.setRequestHeader("X-FireLogger", '1.2'); | |
return xhr; | |
}, | |
error: function (payload) { | |
var flashMessages = $('#snippet--flashMessages'); | |
var html = ""; | |
if (payload.status != 200) { | |
html += '<h4>'+payload.status+' '+payload.statusText+'</h4>'; | |
} | |
var headers = payload.getAllResponseHeaders(); | |
var matches = headers.match(/FireLogger[-a-z0-9]+/); | |
if (matches != null) { | |
for (var i=0;i<matches.length;i++) | |
{ | |
var firelog = jQuery.parseJSON(this.base64decode(payload.getResponseHeader(matches[i]))); | |
//console.log(firelog); | |
firelog = firelog.logs[0]; | |
html += '<p>'+firelog.template+'</p><p>'+this.editorLink(firelog.pathname,firelog.lineno)+'</p>'; | |
} | |
} | |
var fileLog = payload.getResponseHeader('X-Nette-Error-Log'); | |
if (fileLog) { | |
matches = window.location.href.match(/^[^\?#]*/g); | |
var getLogUrl = matches[0] + '?do=exceptionLogFile-GetExceptionLogFile&file='+fileLog; | |
// displays debugging info in iframe | |
html += '<iframe src="'+getLogUrl+'" width="' + (flashMessages.width() - 30) + '" height="500"></iframe>'; | |
// opens new window with debugging info | |
//window.open(getLogUrl); | |
} | |
flashMessages.html('<div class="alert alert-error"><a class="close" data-dismiss="alert">×</a>'+html+'</div>'); | |
} | |
}, { | |
editorLink: function (link,lineno) { | |
return '<b>File:</b> <a title="'+link+':'+lineno+'" href="editor://open/?file='+encodeURIComponent(link)+'&line='+lineno+'">'+link+'</a> <b>Line:</b> '+lineno; | |
}, | |
/* http://www.webtoolkit.info/javascript-base64.html */ | |
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", | |
// base64 decode | |
base64decode : function (input) { | |
var output = ""; | |
var chr1, chr2, chr3; | |
var enc1, enc2, enc3, enc4; | |
var i = 0; | |
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); | |
while (i < input.length) { | |
enc1 = this._keyStr.indexOf(input.charAt(i++)); | |
enc2 = this._keyStr.indexOf(input.charAt(i++)); | |
enc3 = this._keyStr.indexOf(input.charAt(i++)); | |
enc4 = this._keyStr.indexOf(input.charAt(i++)); | |
chr1 = (enc1 << 2) | (enc2 >> 4); | |
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | |
chr3 = ((enc3 & 3) << 6) | enc4; | |
output = output + String.fromCharCode(chr1); | |
if (enc3 != 64) { | |
output = output + String.fromCharCode(chr2); | |
} | |
if (enc4 != 64) { | |
output = output + String.fromCharCode(chr3); | |
} | |
} | |
output = this._utf8_decode(output); | |
return output; | |
}, | |
_utf8_decode : function (utftext) { | |
var string = ""; | |
var i = 0; | |
var c = c1 = c2 = 0; | |
while ( i < utftext.length ) { | |
c = utftext.charCodeAt(i); | |
if (c < 128) { | |
string += String.fromCharCode(c); | |
i++; | |
} | |
else if((c > 191) && (c < 224)) { | |
c2 = utftext.charCodeAt(i+1); | |
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); | |
i += 2; | |
} | |
else { | |
c2 = utftext.charCodeAt(i+1); | |
c3 = utftext.charCodeAt(i+2); | |
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | |
i += 3; | |
} | |
} | |
return string; | |
} | |
}); | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment