31 preg_match_all($regex,
$contents, $matches);
33 array_shift($matches);
34 foreach ($matches as
$row) {
58 $nodes = $xml->xpath($xPath) ?: [];
59 foreach ($nodes as $node) {
75 $nodes = $xml->xpath($xpath) ?: [];
76 foreach ($nodes as $node) {
93 $nodes = $xml->xpath($xPath) ?: [];
94 foreach ($nodes as $node) {
96 if (isset($node[
'@attributes'][$attributeName])) {
97 $result[] = $node[
'@attributes'][$attributeName];
111 $class = explode(
'::', $callbackName);
127 /config//resource_adapter | /config/*[not(name()="sections")]//class[not(ancestor::observers)] 128 | //model[not(parent::connection)] | //backend_model | //source_model | //price_model 129 | //model_token | //writer_model | //clone_model | //frontend_model | //working_model 130 | //admin_renderer | //renderer | /config/*/di/preferences/*' 132 $classes = array_merge($classes, self::getXmlAttributeValues($xml,
'//@backend_model',
'backend_model'));
133 $classes = array_merge(
135 self::getXmlNodeNames(
137 '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/* | /config/*/di/preferences/*' 141 $classes = array_map([\
Magento\Framework\
App\Utility\Classes::class,
'getCallbackClass'], $classes);
142 $classes = array_map(
'trim', $classes);
143 $classes = array_unique($classes);
144 $classes = array_filter(
163 $classes = array_merge(
165 self::getXmlNodeValues(
167 '/layout//action/attributeType | /layout//action[@method="addTab"]/content 168 | /layout//action[@method="addMergeSettingsBlockType" 169 or @method="addInformationRenderer" 170 or @method="addDatabaseBlock"]/*[2] 171 | /layout//action[@method="setMassactionBlockName"]/name 172 | /layout//action[@method="setEntityModelClass"]/code' 175 return array_unique($classes);
192 $pattern =
'/^' . preg_quote($modulePath,
'/') .
'\/(' . $subTypePattern .
'\/.+)\.php$/';
193 foreach (
Files::init()->getFiles([$modulePath],
'*.php') as $file) {
195 $partialFileName = substr($file, strlen($modulePath) + 1);
196 $partialFileName = substr($partialFileName, 0, strlen($partialFileName) - strlen(
'.php'));
197 $partialClassName = str_replace(
'/',
'\\', $partialFileName);
198 $className = str_replace(
'_',
'\\', $moduleName) .
'\\' . $partialClassName;
211 public static function getVirtualClasses()
213 if (!empty(self::$_virtualClasses)) {
218 $configDom = new \DOMDocument();
220 $xPath = new \DOMXPath($configDom);
221 $vTypes = $xPath->query(
'/config/virtualType');
223 foreach ($vTypes as $virtualType) {
224 $name = $virtualType->attributes->getNamedItem(
'name')->textContent;
225 if (!$virtualType->attributes->getNamedItem(
'type')) {
228 $type = $virtualType->attributes->getNamedItem(
'type')->textContent;
245 self::getVirtualClasses();
247 return array_key_exists(
$className, self::$_virtualClasses);
262 $resolvedName = self::$_virtualClasses[
$className];
275 '/.*\\\\[a-zA-Z0-9]{1,}(Factory|SearchResults|DataBuilder|Extension|ExtensionInterface)$/',
278 || preg_match(
'/Magento\\\\[\w]+\\\\(Test\\\\(Page|Fixture))\\\\/',
$className)
279 || preg_match(
'/.*\\\\[a-zA-Z0-9]{1,}\\\\Proxy$/',
$className)
299 # ::getModel ::getSingleton ::getResourceModel ::getResourceSingleton 300 \:\:get(?:Resource)?(?:Model | Singleton)\(\s*[\'"]([^\'"]+)[\'"]\s*[\),] 302 # addBlock createBlock getBlockSingleton 303 | (?:addBlock | createBlock | getBlockSingleton)\(\s*[\'"]([^\'"]+)[\'"]\s*[\),] 305 # various methods, first argument 306 | \->(?:initReport | setEntityModelClass 307 | setAttributeModel | setBackendModel | setFrontendModel | setSourceModel | setModel 308 )\(\s*[\'"]([^\'"]+)[\'"]\s*[\),] 310 # various methods, second argument 311 | \->add(?:ProductConfigurationHelper | OptionsRenderCfg)\(.+,\s*[\'"]([^\'"]+)[\'"]\s*[\),] 313 # models in install or setup 314 | [\'"](?:resource_model | attribute_model | entity_model | entity_attribute_collection 315 | source | backend | frontend | input_renderer | frontend_input_renderer 316 )[\'"]\s*=>\s*[\'"]([^\'"]+)[\'"] 319 | function\s_getCollectionClass\(\)\s+{\s+return\s+[\'"]([a-z\d_\/]+)[\'"] 320 | (?:_parentResourceModelName | _checkoutType | _apiType)\s*=\s*\'([a-z\d_\/]+)\' 321 | \'renderer\'\s*=>\s*\'([a-z\d_\/]+)\' 322 | protected\s+\$_(?:form|info|backendForm|iframe)BlockType\s*=\s*[\'"]([^\'"]+)[\'"] 329 $skipForInit = implode(
346 (?:parent\:\: | \->)_init\(\s*[\'"]([^\'"]+)[\'"]\s*\) 347 | (?:parent\:\: | \->)_init\(\s*[\'"]([^\'"]+)[\'"]\s*,\s*[\'"]((?!(' .
349 '))[^\'"]+)[\'"]\s*\) 364 $parts = explode(
'\\', trim(
$class,
'\\'));
365 return $parts[0] .
'_' . $parts[1];
static resolveVirtualType($className)
static collectPhpCodeClasses($contents, &$classes=[])
static getCallbackClass($callbackName)
static collectClassesInConfig(\SimpleXMLElement $xml)
static getXmlAttributeValues(\SimpleXMLElement $xml, $xPath, $attributeName)
static collectLayoutClasses(\SimpleXMLElement $xml)
$_option $_optionId $class
static isVirtual($className)
static collectModuleClasses($subTypePattern='[A-Za-z]+')
static getAllMatches($contents, $regex, &$result=[])
static isAutogenerated($className)
static getClassModuleName($class)
static getXmlNodeNames(\SimpleXMLElement $xml, $xpath)
static getXmlNodeValues(\SimpleXMLElement $xml, $xPath)
if(!isset($_GET['name'])) $name