Version Notes
Stable v1.0.0
Download this release
Release Info
Developer | Alexander Egelsky |
Extension | Config_XML_Browser |
Version | 1.0.0 |
Comparing to | |
See all releases |
Version 1.0.0
- app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/Preparesearch.php +19 -0
- app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/Report.php +47 -0
- app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/Search.php +19 -0
- app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/View.php +19 -0
- app/code/community/Bricks/Xmlbrowser/Helper/Data.php +78 -0
- app/code/community/Bricks/Xmlbrowser/Model/Config.php +300 -0
- app/code/community/Bricks/Xmlbrowser/controllers/Adminhtml/ReportController.php +93 -0
- app/code/community/Bricks/Xmlbrowser/etc/config.xml +76 -0
- app/design/adminhtml/default/default/template/report/xmlbrowser/preparesearch.phtml +74 -0
- app/design/adminhtml/default/default/template/report/xmlbrowser/report.phtml +181 -0
- app/design/adminhtml/default/default/template/report/xmlbrowser/search.phtml +45 -0
- app/design/adminhtml/default/default/template/report/xmlbrowser/view.phtml +62 -0
- app/etc/modules/Bricks_Xmlbrowser.xml +21 -0
- package.xml +46 -0
app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/Preparesearch.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
class Bricks_Xmlbrowser_Block_Adminhtml_Preparesearch extends Mage_Core_Block_Template
|
14 |
+
{
|
15 |
+
public function __construct()
|
16 |
+
{
|
17 |
+
$this->setTemplate('report/xmlbrowser/preparesearch.phtml');
|
18 |
+
}
|
19 |
+
}
|
app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/Report.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
class Bricks_Xmlbrowser_Block_Adminhtml_Report extends Mage_Core_Block_Template
|
14 |
+
{
|
15 |
+
public function __construct()
|
16 |
+
{
|
17 |
+
$this->setTemplate('report/xmlbrowser/report.phtml');
|
18 |
+
|
19 |
+
$config = Mage::getModel('xmlbrowser/config');
|
20 |
+
$outArray = $config->init();
|
21 |
+
|
22 |
+
$searchStr = '';
|
23 |
+
$params = $this->getRequest()->getParams();
|
24 |
+
if (isset($params['search_str'])) {
|
25 |
+
$searchStr = (string)$params['search_str'];
|
26 |
+
if (strlen($searchStr) > 2) {
|
27 |
+
$config->setSearchString($searchStr);
|
28 |
+
} else {
|
29 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Search string must be 3 letters or larger'));
|
30 |
+
}
|
31 |
+
}
|
32 |
+
$this->setSearchString($searchStr);
|
33 |
+
|
34 |
+
$rootArray = $config->getNodeJson($outArray, 'root');
|
35 |
+
if (isset($params['search_str']) && (strlen($searchStr) > 2)) {
|
36 |
+
if ($numFound = $config->getNumFound()) {
|
37 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Total found %s match(es)', $numFound));
|
38 |
+
} else {
|
39 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Search string not found'));
|
40 |
+
}
|
41 |
+
}
|
42 |
+
|
43 |
+
$json = Zend_Json::encode(isset($rootArray['children']) ? $rootArray['children'] : array());
|
44 |
+
|
45 |
+
$this->setTreeData($json);
|
46 |
+
}
|
47 |
+
}
|
app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/Search.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
class Bricks_Xmlbrowser_Block_Adminhtml_Search extends Mage_Core_Block_Template
|
14 |
+
{
|
15 |
+
public function __construct()
|
16 |
+
{
|
17 |
+
$this->setTemplate('report/xmlbrowser/search.phtml');
|
18 |
+
}
|
19 |
+
}
|
app/code/community/Bricks/Xmlbrowser/Block/Adminhtml/View.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
class Bricks_Xmlbrowser_Block_Adminhtml_View extends Mage_Core_Block_Template
|
14 |
+
{
|
15 |
+
public function __construct()
|
16 |
+
{
|
17 |
+
$this->setTemplate('report/xmlbrowser/view.phtml');
|
18 |
+
}
|
19 |
+
}
|
app/code/community/Bricks/Xmlbrowser/Helper/Data.php
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
class Bricks_Xmlbrowser_Helper_Data extends Mage_Core_Helper_Data
|
14 |
+
{
|
15 |
+
protected $_file_types = null;
|
16 |
+
protected $_case_sensitive = false;
|
17 |
+
|
18 |
+
public function setFileTypes($types) {
|
19 |
+
if (!$types || !is_array($types)) {
|
20 |
+
return false;
|
21 |
+
}
|
22 |
+
|
23 |
+
$this->_file_types = array_map('strtolower', $types);
|
24 |
+
return $this;
|
25 |
+
}
|
26 |
+
|
27 |
+
public function setCaseSensitive($var) {
|
28 |
+
$this->_case_sensitive = (bool)$var;
|
29 |
+
return $this;
|
30 |
+
}
|
31 |
+
|
32 |
+
public function searchFiles($dir, $str, $filesList = array()) {
|
33 |
+
$dir = rtrim($dir, '\\\/').DS;
|
34 |
+
|
35 |
+
$files = scandir($dir);
|
36 |
+
foreach ($files as $file) {
|
37 |
+
if (is_dir($dir.$file)) {
|
38 |
+
if (($file != '.') && ($file != '..')) {
|
39 |
+
$this->searchFiles($dir.$file, $str, &$filesList);
|
40 |
+
}
|
41 |
+
} else {
|
42 |
+
$needToSearch = true;
|
43 |
+
if ($this->_file_types && is_array($this->_file_types)) {
|
44 |
+
$needToSearch = in_array(strtolower(pathinfo($file, PATHINFO_EXTENSION)), $this->_file_types);
|
45 |
+
}
|
46 |
+
if ($needToSearch) {
|
47 |
+
$fileContent = file_get_contents($dir.$file);
|
48 |
+
$result = $this->_case_sensitive? strpos($fileContent, $str) : stripos($fileContent, $str);
|
49 |
+
|
50 |
+
if ($result !== FALSE) {
|
51 |
+
$filesList[] = $dir.$file;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
return $filesList;
|
58 |
+
}
|
59 |
+
|
60 |
+
public function getSearchPlaces() {
|
61 |
+
return array(
|
62 |
+
array( 'label'=>'Core code', 'path'=>Mage::getBaseDir('code').DS.'core' ),
|
63 |
+
array( 'label'=>'Local code', 'path'=>Mage::getBaseDir('code').DS.'local' ),
|
64 |
+
array( 'label'=>'Community code', 'path'=>Mage::getBaseDir('code').DS.'community' ),
|
65 |
+
array( 'label'=>'Frontend views', 'path'=>Mage::getBaseDir('design').DS.'frontend' ),
|
66 |
+
array( 'label'=>'Admin views', 'path'=>Mage::getBaseDir('design').DS.'adminhtml' )
|
67 |
+
);
|
68 |
+
}
|
69 |
+
|
70 |
+
public function getFileTypes() {
|
71 |
+
return array(
|
72 |
+
array( 'label'=>'PHP Scripts (*.php)', 'extension'=>'php'),
|
73 |
+
array( 'label'=>'View templaes (*.phtml)', 'extension'=>'phtml'),
|
74 |
+
array( 'label'=>'Config files (*.xml)', 'extension'=>'xml'),
|
75 |
+
array( 'label'=>'MySQL installers (*.sql)', 'extension'=>'sql')
|
76 |
+
);
|
77 |
+
}
|
78 |
+
}
|
app/code/community/Bricks/Xmlbrowser/Model/Config.php
ADDED
@@ -0,0 +1,300 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
// fix for PHP < 5.3
|
14 |
+
if (!function_exists('array_replace_recursive'))
|
15 |
+
{
|
16 |
+
function array_replace_recursive()
|
17 |
+
{
|
18 |
+
// Get array arguments
|
19 |
+
$arrays = func_get_args();
|
20 |
+
// Define the original array
|
21 |
+
$original = array_shift($arrays);
|
22 |
+
|
23 |
+
// Loop through arrays
|
24 |
+
foreach ($arrays as $array)
|
25 |
+
{
|
26 |
+
// Loop through array key/value pairs
|
27 |
+
foreach ($array as $key => $value)
|
28 |
+
{
|
29 |
+
// Value is an array
|
30 |
+
if (is_array($value))
|
31 |
+
{
|
32 |
+
// Traverse the array; replace or add result to original array
|
33 |
+
@$original[$key] = array_replace_recursive($original[$key], $array[$key]);
|
34 |
+
}
|
35 |
+
// Value is not an array
|
36 |
+
else
|
37 |
+
{
|
38 |
+
// Replace or add current value to original array
|
39 |
+
$original[$key] = $value;
|
40 |
+
}
|
41 |
+
}
|
42 |
+
}
|
43 |
+
|
44 |
+
// Return the joined array
|
45 |
+
return $original;
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
// This class replicates Mage_Core_Model_Config::init() actions, rebuilding config just like it
|
50 |
+
// added some Hook-up methods, since it was impossible to just extend that config class
|
51 |
+
class Bricks_Xmlbrowser_Model_Config extends Mage_Core_Model_Config
|
52 |
+
{
|
53 |
+
protected $_useCache = false;
|
54 |
+
protected $_allowCacheForInit = false;
|
55 |
+
protected $_xmlAsArray = array();
|
56 |
+
protected $_filesLoaded = array();
|
57 |
+
protected $_filesLoadedData = array();
|
58 |
+
protected $_searchString = null;
|
59 |
+
protected $_searchStringNumFound = 0;
|
60 |
+
|
61 |
+
public function setSearchString($str) {
|
62 |
+
$this->_searchString = $str;
|
63 |
+
}
|
64 |
+
|
65 |
+
// just like same stock parent method, except $this->loadFileCustom(), which adds config to total report
|
66 |
+
public function init($options=array())
|
67 |
+
{
|
68 |
+
$etcDir = $this->getOptions()->getEtcDir();
|
69 |
+
$localConfigLoaded = $this->loadFile($etcDir.DS.'local.xml');
|
70 |
+
|
71 |
+
$configFile = $etcDir.DS.'config.xml';
|
72 |
+
$this->loadFile($configFile);
|
73 |
+
$this->loadFileCustom($configFile); // add to report config
|
74 |
+
|
75 |
+
$this->_loadDeclaredModules();
|
76 |
+
// here all configs for modules are loaded
|
77 |
+
|
78 |
+
$this->loadModulesConfiguration('config.xml', $this);
|
79 |
+
$this->loadModulesConfiguration('system.xml', $this);
|
80 |
+
|
81 |
+
$mergeConfig = new Mage_Core_Model_Config_Base();
|
82 |
+
$configFile = $etcDir.DS.'local.xml';
|
83 |
+
if (is_readable($configFile)) {
|
84 |
+
$mergeConfig->loadFile($configFile);
|
85 |
+
$this->loadFileCustom($configFile); // add to report config
|
86 |
+
$this->extend($mergeConfig);
|
87 |
+
}
|
88 |
+
|
89 |
+
$this->applyExtends();
|
90 |
+
|
91 |
+
return $this->_xmlAsArray;
|
92 |
+
}
|
93 |
+
|
94 |
+
public function mergeXmlToArray($xmlObject, $fileID, $out = array())
|
95 |
+
{
|
96 |
+
foreach ($xmlObject->children() as $index => $node )
|
97 |
+
{
|
98 |
+
if (count($node->children())) {
|
99 |
+
$newData = $this->mergeXmlToArray($node, $fileID);
|
100 |
+
// some module config can have duplicate sections, like two <global> in Mage_Centinel module (Mage 1.6)
|
101 |
+
// this is fix for it
|
102 |
+
if (isset($out[$index])) {
|
103 |
+
$out[$index] = array_replace_recursive($out[$index], $newData); // will replace by last found, like it should
|
104 |
+
} else {
|
105 |
+
$out[$index] = $newData;
|
106 |
+
}
|
107 |
+
} else {
|
108 |
+
$out[$index][$fileID] = $this->parseNode($node);
|
109 |
+
}
|
110 |
+
}
|
111 |
+
|
112 |
+
return $out;
|
113 |
+
}
|
114 |
+
|
115 |
+
public function parseNode($node)
|
116 |
+
{
|
117 |
+
return (string)$node; // this may need some checks, left simple for now
|
118 |
+
}
|
119 |
+
|
120 |
+
public function loadFileCustom($filePath, $isXml = false, $fileFrom = '')
|
121 |
+
{
|
122 |
+
if (!$isXml)
|
123 |
+
{
|
124 |
+
if (!is_readable($filePath)) {
|
125 |
+
return false;
|
126 |
+
}
|
127 |
+
|
128 |
+
$string = file_get_contents($filePath);
|
129 |
+
if (!empty($string)) {
|
130 |
+
$xml = new SimpleXMLElement($string, LIBXML_NOBLANKS);
|
131 |
+
}
|
132 |
+
else {
|
133 |
+
throw new Exception('"$string" parameter for simplexml_load_string is empty');
|
134 |
+
}
|
135 |
+
}
|
136 |
+
else
|
137 |
+
{
|
138 |
+
$xml = $filePath;
|
139 |
+
$filePath = $fileFrom;
|
140 |
+
}
|
141 |
+
|
142 |
+
if ($xml instanceof SimpleXMLElement) {
|
143 |
+
if (!in_array($filePath, $this->_filesLoaded)) {
|
144 |
+
$this->_filesLoaded[] = $filePath;
|
145 |
+
}
|
146 |
+
$fileID = array_search($filePath, $this->_filesLoaded);
|
147 |
+
$this->_filesLoadedData[$fileID] = $this->mergeXmlToArray($xml, $fileID);
|
148 |
+
|
149 |
+
$this->_xmlAsArray = array_replace_recursive($this->_xmlAsArray, $this->_filesLoadedData[$fileID]);
|
150 |
+
|
151 |
+
return $this->_xmlAsArray;
|
152 |
+
}
|
153 |
+
|
154 |
+
return false;
|
155 |
+
}
|
156 |
+
|
157 |
+
protected function _loadDeclaredModules($mergeConfig = null)
|
158 |
+
{
|
159 |
+
$moduleFiles = $this->_getDeclaredModuleFiles();
|
160 |
+
if (!$moduleFiles) {
|
161 |
+
return ;
|
162 |
+
}
|
163 |
+
|
164 |
+
Varien_Profiler::start('config/load-modules-declaration');
|
165 |
+
|
166 |
+
$unsortedConfig = new Mage_Core_Model_Config_Base();
|
167 |
+
$unsortedConfig->loadString('<config/>');
|
168 |
+
$fileConfig = new Mage_Core_Model_Config_Base();
|
169 |
+
|
170 |
+
// load modules declarations
|
171 |
+
foreach ($moduleFiles as $file) {
|
172 |
+
$fileConfig->loadFile($file);
|
173 |
+
$unsortedConfig->extend($fileConfig);
|
174 |
+
}
|
175 |
+
|
176 |
+
$moduleDepends = array();
|
177 |
+
foreach ($unsortedConfig->getNode('modules')->children() as $moduleName => $moduleNode) {
|
178 |
+
$depends = array();
|
179 |
+
if ($moduleNode->depends) {
|
180 |
+
foreach ($moduleNode->depends->children() as $depend) {
|
181 |
+
$depends[$depend->getName()] = true;
|
182 |
+
}
|
183 |
+
}
|
184 |
+
$moduleDepends[$moduleName] = array(
|
185 |
+
'module' => $moduleName,
|
186 |
+
'depends' => $depends,
|
187 |
+
'active' => ('true' === (string)$moduleNode->active ? true : false),
|
188 |
+
);
|
189 |
+
}
|
190 |
+
|
191 |
+
// check and sort module dependens
|
192 |
+
$moduleDepends = $this->_sortModuleDepends($moduleDepends);
|
193 |
+
|
194 |
+
// create sorted config
|
195 |
+
$sortedConfig = new Mage_Core_Model_Config_Base();
|
196 |
+
$sortedConfig->loadString('<config><modules/></config>');
|
197 |
+
|
198 |
+
foreach ($unsortedConfig->getNode()->children() as $nodeName => $node) {
|
199 |
+
if ($nodeName != 'modules') {
|
200 |
+
$sortedConfig->getNode()->appendChild($node);
|
201 |
+
}
|
202 |
+
}
|
203 |
+
|
204 |
+
foreach ($moduleDepends as $moduleProp) {
|
205 |
+
$node = $unsortedConfig->getNode('modules/'.$moduleProp['module']);
|
206 |
+
$sortedConfig->getNode('modules')->appendChild($node);
|
207 |
+
}
|
208 |
+
|
209 |
+
$this->loadFileCustom($sortedConfig->getNode(), true, 'MAGE_MODULES_LOADING_PROCESS');
|
210 |
+
$this->extend($sortedConfig);
|
211 |
+
|
212 |
+
Varien_Profiler::stop('config/load-modules-declaration');
|
213 |
+
return $this;
|
214 |
+
}
|
215 |
+
|
216 |
+
public function loadModulesConfiguration($fileName, $mergeToObject=null, $mergeModel=null)
|
217 |
+
{
|
218 |
+
$disableLocalModules = !$this->_canUseLocalModules();
|
219 |
+
|
220 |
+
if ($mergeModel === null) {
|
221 |
+
$mergeModel = new Mage_Core_Model_Config_Base();
|
222 |
+
}
|
223 |
+
$modules = $this->getNode('modules')->children();
|
224 |
+
foreach ($modules as $modName=>$module) {
|
225 |
+
if ($module->is('active')) {
|
226 |
+
if ($disableLocalModules && ('local' === (string)$module->codePool)) {
|
227 |
+
continue;
|
228 |
+
}
|
229 |
+
$configFile = $this->getModuleDir('etc', $modName).DS.$fileName;
|
230 |
+
if ($mergeModel->loadFile($configFile)) {
|
231 |
+
$this->loadFileCustom($configFile); // add to report config
|
232 |
+
$mergeToObject->extend($mergeModel, true);
|
233 |
+
}
|
234 |
+
}
|
235 |
+
}
|
236 |
+
return $mergeToObject;
|
237 |
+
}
|
238 |
+
|
239 |
+
public static function cmp_nodes($a, $b)
|
240 |
+
{
|
241 |
+
$al = strtolower($a['text']);
|
242 |
+
$bl = strtolower($b['text']);
|
243 |
+
if ($al == $bl) {
|
244 |
+
return 0;
|
245 |
+
}
|
246 |
+
return ($al > $bl) ? +1 : -1;
|
247 |
+
}
|
248 |
+
|
249 |
+
public function getNodeJson($node, $name)
|
250 |
+
{
|
251 |
+
$item = array();
|
252 |
+
$item['text'] = $name;
|
253 |
+
|
254 |
+
$item['id'] = uniqid();
|
255 |
+
$item['store'] = 1;
|
256 |
+
|
257 |
+
if (is_array($node)) {
|
258 |
+
$children = array();
|
259 |
+
foreach ($node as $node_name => $node_item) {
|
260 |
+
$children[] = $this->getNodeJson($node_item, $node_name);
|
261 |
+
}
|
262 |
+
// sort all folders, don't touch files and modules
|
263 |
+
if (($name != 'modules') && ($first = current($children)) && isset($first['cls']) && ($first['cls'] != 'file')) {
|
264 |
+
usort($children, array(get_class($this), "cmp_nodes"));
|
265 |
+
}
|
266 |
+
|
267 |
+
$item['cls'] = 'folder';
|
268 |
+
|
269 |
+
foreach ($children as $key=>$child) {
|
270 |
+
if (isset($child['expanded'])) {
|
271 |
+
$item['expanded'] = true;
|
272 |
+
}
|
273 |
+
if (strpos($children[$key]['cls'], 'file') !== FALSE) {
|
274 |
+
$children[$key]['cls'] .= ' tree-node-crossed';
|
275 |
+
}
|
276 |
+
}
|
277 |
+
if (strpos($children[$key]['cls'], 'file') !== FALSE) {
|
278 |
+
$children[$key]['cls'] = str_replace('tree-node-crossed', 'tree-node-last', $children[$key]['cls']);
|
279 |
+
}
|
280 |
+
|
281 |
+
$item['children'] = $children;
|
282 |
+
|
283 |
+
} else {
|
284 |
+
$item['cls'] = 'file';
|
285 |
+
$item['text'] = '"'.$node.'"'.' <--- from: '.$this->_filesLoaded[$name];
|
286 |
+
}
|
287 |
+
|
288 |
+
if ($this->_searchString && (stripos($item['text'], $this->_searchString) !== FALSE)) {
|
289 |
+
$item['expanded'] = true;
|
290 |
+
$item['cls'] .= ' tree-node-matched';
|
291 |
+
$this->_searchStringNumFound++;
|
292 |
+
}
|
293 |
+
|
294 |
+
return $item;
|
295 |
+
}
|
296 |
+
|
297 |
+
public function getNumFound() {
|
298 |
+
return $this->_searchStringNumFound;
|
299 |
+
}
|
300 |
+
}
|
app/code/community/Bricks/Xmlbrowser/controllers/Adminhtml/ReportController.php
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
|
13 |
+
class Bricks_Xmlbrowser_Adminhtml_ReportController extends Mage_Adminhtml_Controller_Action
|
14 |
+
{
|
15 |
+
protected function _initAction() {
|
16 |
+
$this->loadLayout()
|
17 |
+
->_setActiveMenu('report/xmlbrowser')
|
18 |
+
->_addBreadcrumb(Mage::helper('adminhtml')->__('Xml Browser'), Mage::helper('adminhtml')->__('Xml Browser'));
|
19 |
+
return $this;
|
20 |
+
}
|
21 |
+
|
22 |
+
public function indexAction() {
|
23 |
+
$this->_initAction()
|
24 |
+
->_addContent($this->getLayout()->createBlock('xmlbrowser/adminhtml_report'))
|
25 |
+
->_initLayoutMessages('adminhtml/session')
|
26 |
+
->renderLayout();
|
27 |
+
}
|
28 |
+
|
29 |
+
public function preparesearchAction() {
|
30 |
+
$searchString = $this->getRequest()->getParam('search_str', '');
|
31 |
+
|
32 |
+
$this->_initAction()
|
33 |
+
->_addContent(
|
34 |
+
$this->getLayout()->createBlock('xmlbrowser/adminhtml_preparesearch')
|
35 |
+
->setSearchString($searchString))
|
36 |
+
->_initLayoutMessages('adminhtml/session')
|
37 |
+
->renderLayout();
|
38 |
+
}
|
39 |
+
|
40 |
+
public function searchAction() {
|
41 |
+
$helper = Mage::helper('xmlbrowser');
|
42 |
+
|
43 |
+
$searchString = $this->getRequest()->getParam('search_string', '');
|
44 |
+
$searchCaseSensitive = (bool)$this->getRequest()->getParam('search_case_sensitive', false);
|
45 |
+
$searchPlaces = $this->getRequest()->getParam('search_where', $helper->getSearchPlaces());
|
46 |
+
$searchFileTypes = $this->getRequest()->getParam('search_filetype', $helper->getFileTypes());
|
47 |
+
|
48 |
+
$files = array();
|
49 |
+
|
50 |
+
if (!$searchString || (strlen($searchString) < 3)) {
|
51 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Search string must be 3 letters or larger'));
|
52 |
+
}
|
53 |
+
else {
|
54 |
+
$helper
|
55 |
+
->setFileTypes($searchFileTypes)
|
56 |
+
->setCaseSensitive($searchCaseSensitive);
|
57 |
+
|
58 |
+
foreach ($searchPlaces as $place) {
|
59 |
+
$helper->searchFiles($place, $searchString, &$files);
|
60 |
+
}
|
61 |
+
|
62 |
+
if ($numFound = count($files)) {
|
63 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Total found %s match(es)', $numFound));
|
64 |
+
} else {
|
65 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Search string not found'));
|
66 |
+
}
|
67 |
+
}
|
68 |
+
|
69 |
+
$this->_initAction()
|
70 |
+
->_addContent(
|
71 |
+
$this->getLayout()->createBlock('xmlbrowser/adminhtml_search')
|
72 |
+
->setFiles($files)
|
73 |
+
->setSearchCaseSensitive($searchCaseSensitive)
|
74 |
+
->setSearchString($searchString))
|
75 |
+
->_initLayoutMessages('adminhtml/session')
|
76 |
+
->renderLayout();
|
77 |
+
}
|
78 |
+
|
79 |
+
public function viewAction() {
|
80 |
+
$searchString = $this->getRequest()->getParam('search_string', '');
|
81 |
+
$searchCaseSensitive = (bool)$this->getRequest()->getParam('search_case_sensitive', false);
|
82 |
+
$searchFile = $this->getRequest()->getParam('search_file', '');
|
83 |
+
|
84 |
+
$this->_initAction()
|
85 |
+
->_addContent(
|
86 |
+
$this->getLayout()->createBlock('xmlbrowser/adminhtml_view')
|
87 |
+
->setSearchFile($searchFile)
|
88 |
+
->setSearchCaseSensitive($searchCaseSensitive)
|
89 |
+
->setSearchString($searchString))
|
90 |
+
->_initLayoutMessages('adminhtml/session')
|
91 |
+
->renderLayout();
|
92 |
+
}
|
93 |
+
}
|
app/code/community/Bricks/Xmlbrowser/etc/config.xml
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Magento XML Configuration Browser
|
5 |
+
*
|
6 |
+
* @category Bricks
|
7 |
+
* @package Bricks_Xmlbrowser
|
8 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
9 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
10 |
+
*
|
11 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
12 |
+
*/
|
13 |
+
-->
|
14 |
+
<config>
|
15 |
+
<modules>
|
16 |
+
<Bricks_Xmlbrowser>
|
17 |
+
<version>1.0.0</version>
|
18 |
+
</Bricks_Xmlbrowser>
|
19 |
+
</modules>
|
20 |
+
<admin>
|
21 |
+
<routers>
|
22 |
+
<xmlbrowser>
|
23 |
+
<use>admin</use>
|
24 |
+
<args>
|
25 |
+
<module>Bricks_Xmlbrowser</module>
|
26 |
+
<frontName>xmlbrowser</frontName>
|
27 |
+
</args>
|
28 |
+
</xmlbrowser>
|
29 |
+
</routers>
|
30 |
+
</admin>
|
31 |
+
<global>
|
32 |
+
<blocks>
|
33 |
+
<xmlbrowser>
|
34 |
+
<class>Bricks_Xmlbrowser_Block</class>
|
35 |
+
</xmlbrowser>
|
36 |
+
</blocks>
|
37 |
+
<models>
|
38 |
+
<xmlbrowser>
|
39 |
+
<class>Bricks_Xmlbrowser_Model</class>
|
40 |
+
</xmlbrowser>
|
41 |
+
</models>
|
42 |
+
<helpers>
|
43 |
+
<xmlbrowser>
|
44 |
+
<class>Bricks_Xmlbrowser_Helper</class>
|
45 |
+
</xmlbrowser>
|
46 |
+
</helpers>
|
47 |
+
</global>
|
48 |
+
<adminhtml>
|
49 |
+
<menu>
|
50 |
+
<report>
|
51 |
+
<children>
|
52 |
+
<xmlbrowser module="xmlbrowser">
|
53 |
+
<title>Config XML Browser Report</title>
|
54 |
+
<sort_order>100000</sort_order>
|
55 |
+
<action>xmlbrowser/adminhtml_report</action>
|
56 |
+
</xmlbrowser>
|
57 |
+
</children>
|
58 |
+
</report>
|
59 |
+
</menu>
|
60 |
+
<acl>
|
61 |
+
<resources>
|
62 |
+
<admin>
|
63 |
+
<children>
|
64 |
+
<report>
|
65 |
+
<children>
|
66 |
+
<xmlbrowser module="xmlbrowser">
|
67 |
+
<title>Config XML Browser Report</title>
|
68 |
+
</xmlbrowser>
|
69 |
+
</children>
|
70 |
+
</report>
|
71 |
+
</children>
|
72 |
+
</admin>
|
73 |
+
</resources>
|
74 |
+
</acl>
|
75 |
+
</adminhtml>
|
76 |
+
</config>
|
app/design/adminhtml/default/default/template/report/xmlbrowser/preparesearch.phtml
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
?>
|
13 |
+
|
14 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>mage/adminhtml/form.js"></script>
|
15 |
+
|
16 |
+
<script type="text/javascript">
|
17 |
+
//<![CDATA[
|
18 |
+
|
19 |
+
Event.observe(window, 'load', function() {
|
20 |
+
window.xmlbrowserForm = new varienForm('xmlbrowser_search_form');
|
21 |
+
});
|
22 |
+
|
23 |
+
function checkAll(name, checked)
|
24 |
+
{
|
25 |
+
var checkboxes = $$('input.'+name);
|
26 |
+
checkboxes.each(function(e){ e.checked = checked });
|
27 |
+
}
|
28 |
+
|
29 |
+
//]]>
|
30 |
+
</script>
|
31 |
+
|
32 |
+
<?php $helper = Mage::helper('xmlbrowser'); ?>
|
33 |
+
<div id="xmlbrowser_search_lightbox" class="lightbox" >
|
34 |
+
<form id="xmlbrowser_search_form" name="xmlbrowser_search_form" action="<?=Mage::getUrl('*/*/search/')?>" method="post" target="_blank">
|
35 |
+
<div>
|
36 |
+
<h4><?=$this->__('Search for a substring in project code')?></h3>
|
37 |
+
</div>
|
38 |
+
<div class="input-box">
|
39 |
+
<label for="xmlbrowser_lightbox_search_string"><?=$this->__('Search string') ?></label>:
|
40 |
+
<input id="xmlbrowser_lightbox_search_string" name="search_string" type="text" class="required-entry input-text" value="<?=$this->getSearchString()?>" maxlength="255"/>
|
41 |
+
</div>
|
42 |
+
<br>
|
43 |
+
<div>
|
44 |
+
<h4><?=$this->__('Search inside')?> ( <a href="javascript:void(0);" onclick="checkAll('search_where',true);return false;"><?=$this->__('Check All')?></a>, <a href="javascript:void(0);" onclick="checkAll('search_where',false);return false;"><?=$this->__('Check None')?></a> ) </h4>
|
45 |
+
<?php $i = 0; foreach ($helper->getSearchPlaces() as $place): ?>
|
46 |
+
<input type="checkbox" class="search_where <?=(++$i == count($helper->getSearchPlaces()))? 'validate-one-required': ''?>" name="search_where[]" value="<?=$place['path']?>" checked="checked"> <?=$place['label']?><br>
|
47 |
+
<?php endforeach; ?>
|
48 |
+
<br>
|
49 |
+
</div>
|
50 |
+
<div>
|
51 |
+
<h4><?=$this->__('Search for file type')?> ( <a href="javascript:void(0);" onclick="checkAll('search_filetype',true);return false;"><?=$this->__('Check All')?></a>, <a href="javascript:void(0);" onclick="checkAll('search_filetype',false);return false;"><?=$this->__('Check None')?></a> ) </h4>
|
52 |
+
<?php $i = 0; foreach ($helper->getFileTypes() as $item): ?>
|
53 |
+
<input type="checkbox" class="search_filetype <?=(++$i == count($helper->getFileTypes()))? 'validate-one-required': ''?>" name="search_filetype[]" value="<?=$item['extension']?>" checked="checked"> <?=$item['label']?><br>
|
54 |
+
<?php endforeach; ?>
|
55 |
+
<br>
|
56 |
+
</div>
|
57 |
+
<br><br>
|
58 |
+
<div style="margin-bottom: 30px;">
|
59 |
+
<input type="checkbox" name="search_case_sensitive" value="1"> <?=$this->__('Search case sensitive')?><br>
|
60 |
+
<br>
|
61 |
+
</div>
|
62 |
+
<input name="form_key" type="hidden" value="<?= Mage::getSingleton('core/session')->getFormKey(); ?>">
|
63 |
+
<div class="button-set" >
|
64 |
+
<a class="form-button img-btn btn-submit btn-orange" href="javascript:void(0)" onclick="window.xmlbrowserForm.submit(); return false;">
|
65 |
+
<span><?=$this->__('Search')?></span>
|
66 |
+
</a>
|
67 |
+
<span style="margin-left: 10px;">(<?=$this->__('Note: this can take a while')?>)</span>
|
68 |
+
<br><br>
|
69 |
+
<a class="form-button img-btn btn-gray btn-cancel " href="#" id="close_zipcode_window" onclick="window.close(); return false;" >
|
70 |
+
<span><?=$this->__('Cancel')?></span>
|
71 |
+
</a>
|
72 |
+
</div>
|
73 |
+
</form>
|
74 |
+
</div>
|
app/design/adminhtml/default/default/template/report/xmlbrowser/report.phtml
ADDED
@@ -0,0 +1,181 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
?>
|
13 |
+
|
14 |
+
<style type="text/css">
|
15 |
+
.tree-node-matched { font-weight: bold; background-color: #6EC462; }
|
16 |
+
.tree-node-crossed { text-decoration: line-through; }
|
17 |
+
.tree-node-last { }
|
18 |
+
</style>
|
19 |
+
|
20 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>index.php?c=auto&f=,prototype/prototype.js" ></script>
|
21 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>index.php?c=auto&f=,extjs/ext-tree.js,extjs/ext-tree-checkbox.js" ></script>
|
22 |
+
|
23 |
+
<link rel="stylesheet" type="text/css" href="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>extjs/resources/css/ext-all.css" />
|
24 |
+
|
25 |
+
<script type="text/javascript">
|
26 |
+
//<![CDATA[
|
27 |
+
var tree;
|
28 |
+
|
29 |
+
// Fix ext compatibility with prototype 1.6
|
30 |
+
Ext.lib.Event.getTarget = function(e) {
|
31 |
+
var ee = e.browserEvent || e;
|
32 |
+
return ee.target ? Event.element(ee) : null;
|
33 |
+
};
|
34 |
+
|
35 |
+
Ext.tree.TreePanel.Enhanced = function(el, config)
|
36 |
+
{
|
37 |
+
Ext.tree.TreePanel.Enhanced.superclass.constructor.call(this, el, config);
|
38 |
+
};
|
39 |
+
|
40 |
+
Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, {
|
41 |
+
|
42 |
+
loadTree : function(config, firstLoad)
|
43 |
+
{
|
44 |
+
var parameters = config['parameters'];
|
45 |
+
var data = config['data'];
|
46 |
+
|
47 |
+
if ((typeof parameters['root_visible']) != 'undefined') {
|
48 |
+
this.rootVisible = parameters['root_visible']*1;
|
49 |
+
}
|
50 |
+
|
51 |
+
var root = new Ext.tree.TreeNode(parameters);
|
52 |
+
|
53 |
+
this.nodeHash = {};
|
54 |
+
this.setRootNode(root);
|
55 |
+
|
56 |
+
this.addListener('click', this.categoryClick);
|
57 |
+
|
58 |
+
this.loader.buildCategoryTree(root, data);
|
59 |
+
this.el.dom.innerHTML = '';
|
60 |
+
// render the tree
|
61 |
+
this.render();
|
62 |
+
root.expand();
|
63 |
+
},
|
64 |
+
|
65 |
+
collapseTree : function(){ this.collapseAll();},
|
66 |
+
expandTree : function(){ this.expandAll(); },
|
67 |
+
|
68 |
+
categoryClick : function(node, e)
|
69 |
+
{
|
70 |
+
$('search_str').value = node.text.replace(/<---.*/g, '').trim().replace(/^"/g, '').replace(/"$/g, '');
|
71 |
+
}
|
72 |
+
});
|
73 |
+
|
74 |
+
function reRenderTree(config, storeParam)
|
75 |
+
{
|
76 |
+
if (!config) {
|
77 |
+
var config = defaultLoadTreeParams;
|
78 |
+
}
|
79 |
+
if (tree) {
|
80 |
+
tree.purgeListeners();
|
81 |
+
tree.el.dom.innerHTML = '';
|
82 |
+
}
|
83 |
+
tree = new Ext.tree.TreePanel.Enhanced('tree-div', newTreeParams);
|
84 |
+
tree.loadTree(config, true);
|
85 |
+
}
|
86 |
+
|
87 |
+
Ext.onReady(function()
|
88 |
+
{
|
89 |
+
categoryLoader = new Ext.tree.TreeLoader({ dataUrl: '' });
|
90 |
+
|
91 |
+
categoryLoader.createNode = function(config) {
|
92 |
+
var node;
|
93 |
+
var _node = Object.clone(config);
|
94 |
+
if (config.children && !config.children.length) {
|
95 |
+
delete(config.children);
|
96 |
+
node = new Ext.tree.AsyncTreeNode(config);
|
97 |
+
} else {
|
98 |
+
node = new Ext.tree.TreeNode(config);
|
99 |
+
}
|
100 |
+
|
101 |
+
return node;
|
102 |
+
};
|
103 |
+
|
104 |
+
categoryLoader.buildCategoryTree = function(parent, config)
|
105 |
+
{
|
106 |
+
if (!config) return null;
|
107 |
+
|
108 |
+
if (parent && config && config.length){
|
109 |
+
for (var i = 0; i < config.length; i++) {
|
110 |
+
var node;
|
111 |
+
var _node = Object.clone(config[i]);
|
112 |
+
if (_node.children && !_node.children.length) {
|
113 |
+
delete(_node.children);
|
114 |
+
node = new Ext.tree.AsyncTreeNode(_node);
|
115 |
+
} else {
|
116 |
+
node = new Ext.tree.TreeNode(config[i]);
|
117 |
+
}
|
118 |
+
parent.appendChild(node);
|
119 |
+
node.loader = node.getOwnerTree().loader;
|
120 |
+
if (_node.children) {
|
121 |
+
this.buildCategoryTree(node, _node.children);
|
122 |
+
}
|
123 |
+
}
|
124 |
+
}
|
125 |
+
};
|
126 |
+
|
127 |
+
newTreeParams = {
|
128 |
+
animate : false,
|
129 |
+
loader : categoryLoader,
|
130 |
+
enableDD : false,
|
131 |
+
containerScroll : false,
|
132 |
+
rootVisible : true,
|
133 |
+
useAjax : false,
|
134 |
+
switchTreeUrl : '',
|
135 |
+
editUrl : '',
|
136 |
+
addNodeTo : false,
|
137 |
+
};
|
138 |
+
|
139 |
+
defaultLoadTreeParams = {
|
140 |
+
parameters : {
|
141 |
+
draggable : false,
|
142 |
+
allowDrop : false,
|
143 |
+
expanded : false,
|
144 |
+
text : 'config',
|
145 |
+
},
|
146 |
+
data : <?=$this->getTreeData()?>
|
147 |
+
};
|
148 |
+
|
149 |
+
reRenderTree();
|
150 |
+
});
|
151 |
+
|
152 |
+
//]]>
|
153 |
+
</script>
|
154 |
+
|
155 |
+
|
156 |
+
<div style="clear: both; ">
|
157 |
+
<div style="float: left;">
|
158 |
+
<form action="<?=Mage::getUrl('*/*/*/')?>" method="post">
|
159 |
+
<span><?=$this->__('Find inside config tree')?>: </span>
|
160 |
+
<input type="text" name="search_str" value="<?=$this->getSearchString()?>" size="50">
|
161 |
+
<input name="form_key" type="hidden" value="<?=Mage::getSingleton('core/session')->getFormKey()?>">
|
162 |
+
<button type="submit"><?=$this->__('Search')?></button>
|
163 |
+
</form>
|
164 |
+
</div>
|
165 |
+
<div style="float: right; margin-right: 200px;">
|
166 |
+
<form action="<?=Mage::getUrl('*/*/preparesearch/')?>" method="post" target="_blank">
|
167 |
+
<span><?=$this->__('Search inside project code')?>: </span>
|
168 |
+
<input type="text" id="search_str" name="search_str" size="50">
|
169 |
+
<input name="form_key" type="hidden" value="<?=Mage::getSingleton('core/session')->getFormKey()?>">
|
170 |
+
<button type="submit"><?=$this->__('Search')?></button>
|
171 |
+
</form>
|
172 |
+
</div>
|
173 |
+
</div>
|
174 |
+
<br>
|
175 |
+
<br>
|
176 |
+
<a href="javascript:void(0)" onclick="tree.collapseTree();"><?=$this->__('Collapse All')?></a>
|
177 |
+
<br>
|
178 |
+
<br>
|
179 |
+
<div class="tree-holder">
|
180 |
+
<div id="tree-div" style="width:100%; overflow:auto;"></div>
|
181 |
+
</div>
|
app/design/adminhtml/default/default/template/report/xmlbrowser/search.phtml
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
?>
|
13 |
+
|
14 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>index.php?c=auto&f=,prototype/prototype.js" ></script>
|
15 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>index.php?c=auto&f=,extjs/ext-tree.js,extjs/ext-tree-checkbox.js" ></script>
|
16 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>mage/adminhtml/form.js"></script>
|
17 |
+
|
18 |
+
<link rel="stylesheet" type="text/css" href="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>extjs/resources/css/ext-all.css" />
|
19 |
+
|
20 |
+
<script type="text/javascript">
|
21 |
+
Event.observe(window, 'load', function() {
|
22 |
+
window.xmlbrowserForm = new varienForm('xmlbrowser_search_form');
|
23 |
+
});
|
24 |
+
</script>
|
25 |
+
|
26 |
+
<?php if (count($this->getFiles())): ?>
|
27 |
+
<h2><?=$this->__('Files matching "%s" string:', $this->getSearchString())?></h2>
|
28 |
+
<form id="xmlbrowser_search_form" action="<?=Mage::getUrl('*/*/view/')?>" method="post" target="_blank">
|
29 |
+
<div>
|
30 |
+
<select class="validate-select" size="30" name="search_file">
|
31 |
+
<?php foreach ($this->getFiles() as $file): ?>
|
32 |
+
<option><?=$file?></option>
|
33 |
+
<?php endforeach; ?>
|
34 |
+
</select>
|
35 |
+
<input type="hidden" name="search_string" value="<?=$this->getSearchString()?>">
|
36 |
+
<input type="hidden" name="search_case_sensitive" value="<?=$this->getSearchCaseSensitive()?>">
|
37 |
+
<input name="form_key" type="hidden" value="<?= Mage::getSingleton('core/session')->getFormKey(); ?>">
|
38 |
+
</div>
|
39 |
+
<div class="button-set" style="text-align: center; float: left; margin-top: 20px;" >
|
40 |
+
<a class="form-button img-btn btn-submit btn-orange" href="javascript:void(0)" onclick="window.xmlbrowserForm.submit(); return false;">
|
41 |
+
<span><?=$this->__('View Selected File')?></span>
|
42 |
+
</a>
|
43 |
+
</div>
|
44 |
+
</form>
|
45 |
+
<?php endif; ?>
|
app/design/adminhtml/default/default/template/report/xmlbrowser/view.phtml
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento XML Configuration Browser
|
4 |
+
*
|
5 |
+
* @category Bricks
|
6 |
+
* @package Bricks_Xmlbrowser
|
7 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
8 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
9 |
+
*
|
10 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
11 |
+
*/
|
12 |
+
?>
|
13 |
+
|
14 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>index.php?c=auto&f=,prototype/prototype.js" ></script>
|
15 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>index.php?c=auto&f=,extjs/ext-tree.js,extjs/ext-tree-checkbox.js" ></script>
|
16 |
+
<script type="text/javascript" src="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>mage/adminhtml/form.js"></script>
|
17 |
+
|
18 |
+
<link rel="stylesheet" type="text/css" href="<?=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_JS)?>extjs/resources/css/ext-all.css" />
|
19 |
+
|
20 |
+
<script type="text/javascript">
|
21 |
+
Event.observe(window, 'load', function() {
|
22 |
+
window.xmlbrowserForm = new varienForm('xmlbrowser_search_form');
|
23 |
+
});
|
24 |
+
</script>
|
25 |
+
|
26 |
+
<style type="text/css">
|
27 |
+
.span-matched { font-weight: bold; background-color: #6EC462; }
|
28 |
+
</style>
|
29 |
+
|
30 |
+
<h2><?=$this->__('Search file: "%s"<br>for substring: "%s"', $this->getSearchFile(), $this->getSearchString())?></h2>
|
31 |
+
|
32 |
+
<?php
|
33 |
+
function printCode($source_code)
|
34 |
+
{
|
35 |
+
|
36 |
+
if (is_array($source_code))
|
37 |
+
return false;
|
38 |
+
|
39 |
+
$source_code = explode("\n", str_replace(array("\r\n", "\r"), "\n", $source_code));
|
40 |
+
$line_count = 1;
|
41 |
+
|
42 |
+
$formatted_code = '';
|
43 |
+
foreach ($source_code as $code_line)
|
44 |
+
{
|
45 |
+
$formatted_code .= '<tr><td>'.$line_count.' </td>';
|
46 |
+
$line_count++;
|
47 |
+
|
48 |
+
if (preg_match('/<\?(php)?[^[:graph:]]/', $code_line))
|
49 |
+
$formatted_code .= '<td>'. str_replace(array('<code>', '</code>'), '', highlight_string($code_line, true)).'</td></tr>';
|
50 |
+
else
|
51 |
+
$formatted_code .= '<td>'.preg_replace('/(<\?php )+/', '', str_replace(array('<code>', '</code>'), '', highlight_string('<?php '.$code_line, true))).'</td></tr>';
|
52 |
+
}
|
53 |
+
|
54 |
+
return '<table style="font: 1em Consolas, \'andale mono\', \'monotype.com\', \'lucida console\', monospace;">'.$formatted_code.'</table>';
|
55 |
+
}
|
56 |
+
?>
|
57 |
+
|
58 |
+
<?php
|
59 |
+
$code = printCode(file_get_contents($this->getSearchFile()));
|
60 |
+
$modifier = $this->getSearchCaseSensitive()? '' : 'i';
|
61 |
+
echo preg_replace('/(?<=\>)([^<]*)('.preg_quote($this->getSearchString(),'/').')([^<]*)(?=\<)/'.$modifier, '$1<span class="span-matched">$2</span>$3', $code);
|
62 |
+
?>
|
app/etc/modules/Bricks_Xmlbrowser.xml
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Magento XML Configuration Browser
|
5 |
+
*
|
6 |
+
* @category Bricks
|
7 |
+
* @package Bricks_Xmlbrowser
|
8 |
+
* @author Alexander Egelsky ( alexegelsky@gmail.com )
|
9 |
+
* @copyright If you edit or copy it - leave my credentials in it - that's all requirements for now
|
10 |
+
*
|
11 |
+
* All suggestions, bugs or typos you will find in this extension you can send to @author
|
12 |
+
*/
|
13 |
+
-->
|
14 |
+
<config>
|
15 |
+
<modules>
|
16 |
+
<Bricks_Xmlbrowser>
|
17 |
+
<active>true</active>
|
18 |
+
<codePool>community</codePool>
|
19 |
+
</Bricks_Xmlbrowser>
|
20 |
+
</modules>
|
21 |
+
</config>
|
package.xml
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>Config_XML_Browser</name>
|
4 |
+
<version>1.0.0</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license uri="http://opensource.org/licenses/osl-3.0.php">Open Software License</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>It shows ALL xml configs that were loaded to Mage:
|
10 |
+
- shows rewrites for any entity
|
11 |
+
- shows modules in the order Mage uses them
|
12 |
+
- shows all observers for all events, in one place
|
13 |
+
- search whole config or whole project code for some string
|
14 |
+
- and many more
|
15 |
+

|
16 |
+
Key benefits of using it:
|
17 |
+
- very useful for multiple rewrites, to know what is actually used after all rewrites, and shows where did each came from.
|
18 |
+
- you can see all events/models/blocks the way Mage gets it, in one place
|
19 |
+
- if you think something should be rewrited/handled, but it's not - you can look for this reason here
|
20 |
+
- custom search in project code, eliminating searching for substring in files by some third party software
|
21 |
+

|
22 |
+
This extension often saves a lot of time and many of my friends asked for it.
|
23 |
+
I wanted to use it too, but it didn't existed - so I've made it.
|
24 |
+

|
25 |
+
This is a "MUST HAVE!" extension for beginners and it is very useful for professionals too.</summary>
|
26 |
+
<description>No changes to the core needed,
|
27 |
+
no dependent modules.
|
28 |
+

|
29 |
+
Tested on Mage 1.3-1.6.
|
30 |
+

|
31 |
+
Lots of code, but small amount of Mage key code,
|
32 |
+
so it should work on future releases too.
|
33 |
+

|
34 |
+
It was a dream of many, but some were not capable to build this extension,
|
35 |
+
and some were too lazy to do it.
|
36 |
+
I just needed it more than others I guess.
|
37 |
+

|
38 |
+
I've spent a lot of time to build it, so I want to share it with community.</description>
|
39 |
+
<notes>Stable v1.0.0</notes>
|
40 |
+
<authors><author><name>Alexander Egelsky</name><user>aegelsky</user><email>alexegelsky@gmail.com</email></author></authors>
|
41 |
+
<date>2012-05-26</date>
|
42 |
+
<time>16:19:54</time>
|
43 |
+
<contents><target name="magecommunity"><dir name="Bricks"><dir name="Xmlbrowser"><dir name="Block"><dir name="Adminhtml"><file name="Preparesearch.php" hash="7bd4be0c93c86bf145f5de5f3f25b858"/><file name="Report.php" hash="d44009b79612bc73572a695d7ebb6111"/><file name="Search.php" hash="afb6926b383779ef0863c7932c3c2bbf"/><file name="View.php" hash="14bc8713ce5e51bdc57b2ba464a9c376"/></dir></dir><dir name="Helper"><file name="Data.php" hash="4e77299a8b1efaa1584ee3f6cfc18792"/></dir><dir name="Model"><file name="Config.php" hash="36d3fc95ce0301ff1e31c43eceec712e"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="ReportController.php" hash="e78929bf408e0fe41951e247d8211c39"/></dir></dir><dir name="etc"><file name="config.xml" hash="39e8e72aa9783a84414b5d0c6e1ee5f5"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="report"><dir name="xmlbrowser"><file name="preparesearch.phtml" hash="7c832c347a654a0fe658096d06a3e279"/><file name="report.phtml" hash="897d4337967c9af25699650914d24274"/><file name="search.phtml" hash="370385597d4cbbfc10bcc22c13d7cbf2"/><file name="view.phtml" hash="d58ff40a6223de39d1b6aee60e97f11d"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Bricks_Xmlbrowser.xml" hash="f59c9995c9d4b6144b4698815b316d1d"/></dir></target></contents>
|
44 |
+
<compatible/>
|
45 |
+
<dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
|
46 |
+
</package>
|