use Bitrix\Main, Bitrix\Main\Loader; define("ADMIN_MODULE_NAME", "perfmon"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); /** @global CMain $APPLICATION */ /** @global CDatabase $DB */ /** @global CUser $USER */ Loader::includeModule('perfmon'); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/perfmon/prolog.php"); IncludeModuleLangFile(__FILE__); $RIGHT = $APPLICATION->GetGroupRight("perfmon"); if ($RIGHT == "D") $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); $arEngines = array( "MYISAM" => array("NAME" => "MyISAM"), "INNODB" => array("NAME" => "InnoDB"), ); $sTableID = "t_perfmon_all_tables"; $oSort = new CAdminSorting($sTableID, "TABLE_NAME", "asc"); $lAdmin = new CAdminList($sTableID, $oSort); if ( isset($_GET['orm']) && $_GET['orm'] === 'y' && Main\Config\Option::get('perfmon', 'enable_tablet_generator') !== 'Y' ) { Main\Config\Option::set('perfmon', 'enable_tablet_generator', 'Y', ''); } if (($arTABLES = $lAdmin->GroupAction()) && $RIGHT >= "W") { if ($_REQUEST['action_target'] == 'selected') { $rsData = CPerfomanceTableList::GetList(); while ($ar = $rsData->Fetch()) $arTABLES[] = $ar["TABLE_NAME"]; } foreach ($arEngines as $id => $ar) { if ($_REQUEST['action'] == "convert_to_".$id) { $_REQUEST["action"] = "convert"; $_REQUEST["to"] = $id; break; } } $to = mb_strtoupper($_REQUEST["to"]); foreach ($arTABLES as $table_name) { $table_name = (string)$table_name; if ($table_name === '') continue; $res = $DB->Query("show table status like '".$DB->ForSql($table_name)."'", false); $arStatus = $res->Fetch(); if (!$arStatus || $arStatus["Comment"] === "VIEW") continue; switch ($_REQUEST['action']) { case "convert": if ($to != mb_strtoupper($arStatus["Engine"])) { if ($to == "MYISAM") $res = $DB->Query("alter table ".CPerfomanceTable::escapeTable($table_name)." ENGINE = MyISAM", false); elseif ($to == "INNODB") $res = $DB->Query("alter table ".CPerfomanceTable::escapeTable($table_name)." ENGINE = InnoDB", false); else $res = true; } if (!$res) { $lAdmin->AddGroupError(GetMessage("PERFMON_TABLES_CONVERT_ERROR"), $table_name); } break; case "optimize": $DB->Query("optimize table ".CPerfomanceTable::escapeTable($table_name)."", false); break; case "orm": $tableParts = explode("_", $table_name); array_shift($tableParts); $moduleNamespace = ucfirst($tableParts[0]); $moduleName = mb_strtolower($tableParts[0]); if (count($tableParts) > 1) array_shift($tableParts); $className = \Bitrix\Main\Text\StringHelper::snake2camel(implode("_", $tableParts)); $obTable = new CPerfomanceTable; $obTable->Init($table_name); $arFields = $obTable->GetTableFields(false, true); $arUniqueIndexes = $obTable->GetUniqueIndexes(); $hasID = false; foreach ($arUniqueIndexes as $indexName => $indexColumns) { if(array_values($indexColumns) === array("ID")) $hasID = $indexName; } if ($hasID) { $arUniqueIndexes = array($hasID => $arUniqueIndexes[$hasID]); } $obSchema = new CPerfomanceSchema; $arParents = $obSchema->GetParents($table_name); $arValidators = array(); $arMessages = array(); $shortAliases = Main\Config\Option::get('perfmon', 'tablet_short_aliases') == 'Y'; $objectSettings = Main\Config\Option::get('perfmon', 'tablet_object_settings') == 'Y'; $useMapIndex = Main\Config\Option::get('perfmon', 'tablet_use_map_index') == 'Y'; $dateFunctions = array( 'curdate' => true, 'current_date' => true, 'current_time' => true, 'current_timestamp' => true, 'curtime' => true, 'localtime' => true, 'localtimestamp' => true, 'now' => true ); $descriptions = array(); $fields = array(); $fieldClassPrefix = ''; $validatorPrefix = ''; $referencePrefix = ''; $datetimePrefix = ''; $aliases = array( 'Bitrix\Main\Localization\Loc', 'Bitrix\Main\ORM\Data\DataManager' ); if (!$shortAliases) { $fieldClassPrefix = 'Fields\\'; $validatorPrefix = $fieldClassPrefix.'Validators\\'; $referencePrefix = $fieldClassPrefix.'Relations\\'; $datetimePrefix = 'Type\\'; $aliases[] = 'Bitrix\Main\ORM\Fields'; } $fieldClasses = array( 'integer' => 'IntegerField', 'float' => 'FloatField', 'boolean' => 'BooleanField', 'string' => 'StringField', 'text' => 'TextField', 'enum' => 'EnumField', 'date' => 'DateField', 'datetime' => 'DatetimeField' ); foreach ($arFields as $columnName => $columnInfo) { $type = $columnInfo["orm_type"]; if ($shortAliases) { $aliases[] = 'Bitrix\Main\ORM\Fields\\'.$fieldClasses[$type]; } $match = array(); if ( preg_match("/^(.+)_TYPE\$/", $columnName, $match) && $columnInfo["length"] == 4 && isset($arFields[$match[1]]) ) { $columnInfo["nullable"] = true; $columnInfo["orm_type"] = "enum"; $columnInfo["enum_values"] = array("'text'", "'html'"); $columnInfo["length"] = ""; } $columnInfo["default"] = (string)$columnInfo["default"]; if ($columnInfo["default"] !== '') { $columnInfo["nullable"] = true; } switch ($type) { case 'integer': case 'float': break; case 'boolean': if ($columnInfo["default"] !== '') { $columnInfo["default"] = "'".$columnInfo["default"]."'"; } $columnInfo["type"] = "bool"; $columnInfo["length"] = ""; $columnInfo["enum_values"] = array("'N'", "'Y'"); break; case 'string': case 'text': $columnInfo["type"] = $columnInfo["orm_type"]; if ($columnInfo["default"] !== '') { $columnInfo["default"] = "'".$columnInfo["default"]."'"; } break; case 'enum': if ($columnInfo["default"] !== '' && !is_numeric($columnInfo["default"])) { $columnInfo["default"] = "'".$columnInfo["default"]."'"; } break; case 'date': case 'datetime': if ($columnInfo["default"] !== '' && !is_numeric($columnInfo["default"])) { $defaultValue = mb_strtolower($columnInfo["default"]); if (mb_strlen($defaultValue) > 2) { if (substr_compare($defaultValue, '()', -2, 2, true) === 0) $defaultValue = mb_substr($defaultValue, 0, -2); } if (isset($dateFunctions[$defaultValue])) { if ($type == 'date') { if ($shortAliases) { $aliases[] = 'Bitrix\Main\Type\Date'; } else { $aliases[] = 'Bitrix\Main\Type'; } $columnInfo["default_text"] = 'current date'; $columnInfo["default"] = "function()\n" ."\t\t\t\t\t{\n" ."\t\t\t\t\t\treturn new ".$datetimePrefix."Date();\n" ."\t\t\t\t\t}"; } else { if ($shortAliases) { $aliases[] = 'Bitrix\Main\Type\DateTime'; } else { $aliases[] = 'Bitrix\Main\Type'; } $columnInfo["default_text"] = 'current datetime'; $columnInfo["default"] = "function()\n" ."\t\t\t\t\t{\n" ."\t\t\t\t\t\treturn new ".$datetimePrefix."DateTime();\n" ."\t\t\t\t\t}"; } } else { $columnInfo["default"] = "'".$columnInfo["default"]."'"; } } break; } $primary = false; foreach ($arUniqueIndexes as $arColumns) { if (in_array($columnName, $arColumns)) { $primary = true; break; } } $messageId = mb_strtoupper(implode("_", $tableParts)."_ENTITY_".$columnName."_FIELD"); $arMessages[$messageId] = ""; $descriptions[$columnName] = " * <li> ".$columnName ." ".$columnInfo["type"].($columnInfo["length"] != '' ? "(".$columnInfo["length"].")": "") .($columnInfo["orm_type"] === "enum" || $columnInfo["orm_type"] === "boolean" ? " (".implode(", ", $columnInfo["enum_values"]).")" : "" ) ." ".($columnInfo["nullable"] ? "optional": "mandatory") .($columnInfo["default"] !== '' ? " default ".(isset($columnInfo["default_text"]) ? $columnInfo["default_text"] : $columnInfo["default"] ) : "" ) ."\n"; $validateFunctionName = ''; if ($columnInfo["orm_type"] == "string" && $columnInfo["length"] > 0) { if ($shortAliases) { $aliases[] = 'Bitrix\Main\ORM\Fields\Validators\LengthValidator'; } $validateFunctionName = "validate".Main\Text\StringHelper::snake2camel($columnName); $arValidators[$validateFunctionName] = array( "length" => $columnInfo["length"], "field" => $columnName, ); } if ($objectSettings) { $offset = ($useMapIndex ? "\t\t\t\t" : "\t\t\t"); $fields[$columnName] = "\t\t\t" .($useMapIndex ? "'".$columnName."' => " : "") ."(new ".$fieldClassPrefix.$fieldClasses[$type]."('".$columnName."',\n" .($validateFunctionName !== '' ? $offset."\t[\n" .$offset."\t\t'validation' => [_"."_CLASS_"."_, '".$validateFunctionName."']\n" .$offset."\t]\n" : $offset."\t[]\n" ) .$offset."))->configureTitle(Loc::getMessage('".$messageId."'))\n" .($primary ? $offset."\t\t->configurePrimary(true)\n" : "") .($columnInfo["increment"] ? $offset."\t\t->configureAutocomplete(true)\n" : "") .(!$primary && $columnInfo["nullable"] === false ? $offset."\t\t->configureRequired(true)\n" : "") .($columnInfo["orm_type"] === "boolean" ? $offset."\t\t->configureValues(".implode(", ", $columnInfo["enum_values"]).")\n" : "" ) .($columnInfo["orm_type"] === "enum" ? $offset."\t\t->configureValues([".implode(", ", $columnInfo["enum_values"])."])\n" : "" ) .($columnInfo["default"] !== '' ? $offset."\t\t->configureDefaultValue(".$columnInfo["default"].")\n" : ""); $fields[$columnName] = mb_substr($fields[$columnName], 0, -1).",\n"; } else { $fields[$columnName] = "\t\t\t" .($useMapIndex ? "'".$columnName."' => " : "") ."new ".$fieldClassPrefix.$fieldClasses[$type]."(\n" ."\t\t\t\t'".$columnName."',\n" ."\t\t\t\t[\n" .($primary ? "\t\t\t\t\t'primary' => true,\n" : "") .($columnInfo["increment"] ? "\t\t\t\t\t'autocomplete' => true,\n" : "") .(!$primary && $columnInfo["nullable"] === false ? "\t\t\t\t\t'required' => true,\n" : "") .($columnInfo["orm_type"] === "boolean" || $columnInfo["orm_type"] === "enum" ? "\t\t\t\t\t'values' => array(".implode(", ", $columnInfo["enum_values"])."),\n" : "" ) .($columnInfo["default"] !== '' ? "\t\t\t\t\t'default' => ".$columnInfo["default"].",\n" : "") .($validateFunctionName !== '' ? "\t\t\t\t\t'validation' => [_"."_CLASS_"."_, '".$validateFunctionName."'],\n" : "") ."\t\t\t\t\t'title' => Loc::getMessage('".$messageId."')\n" ."\t\t\t\t]\n" ."\t\t\t),\n"; } } foreach ($arParents as $columnName => $parentInfo) { if ($shortAliases) { $aliases[] = 'Bitrix\Main\ORM\Fields\Relations\Reference'; } $parentTableParts = explode("_", $parentInfo["PARENT_TABLE"]); array_shift($parentTableParts); $parentModuleNamespace = ucfirst($parentTableParts[0]); $parentClassName = \Bitrix\Main\Text\StringHelper::snake2camel(implode("_", $parentTableParts)); $columnNameEx = preg_replace("/_ID\$/", "", $columnName); if (isset($descriptions[$columnNameEx])) { $columnNameEx = mb_strtoupper($parentClassName); } $descriptions[$columnNameEx] = " * <li> ".$columnName ." reference to {@link \\Bitrix\\".$parentModuleNamespace ."\\".$parentClassName."Table}" ."\n"; $fields[$columnNameEx] = "\t\t\t" .($useMapIndex ? "'".$columnNameEx."' => " : "") ."new ".$referencePrefix."Reference(\n" ."\t\t\t\t'".$columnNameEx."',\n" ."\t\t\t\t'\Bitrix\\".$parentModuleNamespace."\\".$parentClassName."',\n" ."\t\t\t\t['=this.".$columnName."' => 'ref.".$parentInfo["PARENT_COLUMN"]."'],\n" ."\t\t\t\t['join_type' => 'LEFT']\n" ."\t\t\t),\n"; } $aliases = array_unique($aliases); sort($aliases); echo "\n\nFile: /bitrix/modules/".$moduleName."/lib/".mb_strtolower($className)."table.php"; echo "
"; echo "<", "?", "php\n"; echo "namespace Bitrix\\".$moduleNamespace.";\n"; echo "\n"; echo "use ".implode(",\n\t", $aliases).";\n"; echo "\n"; echo "Loc::loadMessages(_"."_FILE_"."_);\n"; echo "\n"; echo "/"."**\n"; echo " * Class ".$className."Table\n"; echo " * \n"; echo " * Fields:\n"; echo " * <ul>\n"; echo implode('', $descriptions); echo " * </ul>\n"; echo " *\n"; echo " * @package Bitrix\\".$moduleNamespace."\n"; echo " *"."*/\n"; echo "\n"; echo "class ".$className."Table extends DataManager\n"; echo "{\n"; echo "\t/**\n"; echo "\t * Returns DB table name for entity.\n"; echo "\t *\n"; echo "\t * @return string\n"; echo "\t */\n"; echo "\tpublic static function getTableName()\n"; echo "\t{\n"; echo "\t\treturn '".$table_name."';\n"; echo "\t}\n"; echo "\n"; echo "\t/**\n"; echo "\t * Returns entity map definition.\n"; echo "\t *\n"; echo "\t * @return array\n"; echo "\t */\n"; echo "\tpublic static function getMap()\n"; echo "\t{\n"; echo "\t\treturn [\n"; echo implode('', $fields); echo "\t\t];\n"; echo "\t}\n"; foreach ($arValidators as $validateFunctionName => $validator) { echo "\n\t/**\n"; echo "\t * Returns validators for ".$validator["field"]." field.\n"; echo "\t *\n"; echo "\t * @return array\n"; echo "\t */\n"; echo "\tpublic static function ".$validateFunctionName."()\n"; echo "\t{\n"; echo "\t\treturn [\n"; echo "\t\t\tnew ".$validatorPrefix."LengthValidator(null, ".$validator["length"]."),\n"; echo "\t\t];\n"; echo "\t}\n"; } echo "}\n"; echo ""; echo "File: /bitrix/modules/".$moduleName."/lang/ru/lib/".mb_strtolower($className)."table.php"; echo "
"; echo "<", "?\n"; foreach ($arMessages as $messageId => $messageText) { echo "\$MESS[\"".$messageId."\"] = \"".EscapePHPString($messageText)."\";\n"; } echo "?", ">\n"; echo ""; break; } } } $lAdmin->BeginPrologContent(); ?>