diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ff08398 --- /dev/null +++ b/LICENSE @@ -0,0 +1,319 @@ +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 , USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software +is covered by the GNU Lesser General Public License instead.) You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for this service if you +wish), that you receive source code or can get it if you want it, that you +can change the software or use pieces of it in new free programs; and that +you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of +the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And you +must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If +the software is modified by someone else and passed on, we want its recipients +to know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms +of this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or translated +into another language. (Hereinafter, translation is included without limitation +in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running the Program +is not restricted, and the output from the Program is covered only if its +contents constitute a work based on the Program (independent of having been +made by running the Program). Whether that is true depends on what the Program +does. + +1. You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and appropriately +publish on each copy an appropriate copyright notice and disclaimer of warranty; +keep intact all the notices that refer to this License and to the absence +of any warranty; and give any other recipients of the Program a copy of this +License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all +of these conditions: + +a) You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or +in part contains or is derived from the Program or any part thereof, to be +licensed as a whole at no charge to all third parties under the terms of this +License. + +c) If the modified program normally reads commands interactively when run, +you must cause it, when started running for such interactive use in the most +ordinary way, to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or else, saying that +you provide a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this License. +(Exception: if the Program itself is interactive but does not normally print +such an announcement, your work based on the Program is not required to print +an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Program, the distribution of the whole must be +on the terms of this License, whose permissions for other licensees extend +to the entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise +the right to control the distribution of derivative or collective works based +on the Program. + +In addition, mere aggregation of another work not based on the Program with +the Program (or with a work based on the Program) on a volume of a storage +or distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under Section +2) in object code or executable form under the terms of Sections 1 and 2 above +provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, +which must be distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give +any third party, for a charge no more than your cost of physically performing +source distribution, a complete machine-readable copy of the corresponding +source code, to be distributed under the terms of Sections 1 and 2 above on +a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute +corresponding source code. (This alternative is allowed only for noncommercial +distribution and only if you received the program in object code or executable +form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code distributed +need not include anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component itself +accompanies the executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with +the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except +as expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses terminated +so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the Program +(or any work based on the Program), you indicate your acceptance of this License +to do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor +to copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of +the rights granted herein. You are not responsible for enforcing compliance +by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement +or for any other reason (not limited to patent issues), conditions are imposed +on you (whether by court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the conditions of +this License. If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, then as +a consequence you may not distribute the Program at all. For example, if a +patent license would not permit royalty-free redistribution of the Program +by all those who receive copies directly or indirectly through you, then the +only way you could satisfy both it and this License would be to refrain entirely +from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents +or other property right claims or to contest validity of any such claims; +this section has the sole purpose of protecting the integrity of the free +software distribution system, which is implemented by public license practices. +Many people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose +that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit geographical +distribution limitation excluding those countries, so that distribution is +permitted only in or among countries not thus excluded. In such case, this +License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Program does not specify a version number of this License, you may choose +any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing and reuse +of software generally. + + NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE +OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE +OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA +OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES +OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH +HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 51 Franklin +Street, Fifth Floor, Boston, MA 02110-1301 , USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when +it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author Gnomovision comes +with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, +and you are welcome to redistribute it under certain conditions; type `show +c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than `show w' and `show c'; they could even be mouse-clicks +or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' +(which makes passes at compilers) written by James Hacker. + +< signature of Ty Coon > , 1 April 1989 Ty Coon, President of Vice This General +Public License does not permit incorporating your program into proprietary +programs. If your program is a subroutine library, you may consider it more +useful to permit linking proprietary applications with the library. If this +is what you want to do, use the GNU Lesser General Public License instead +of this License. diff --git a/README.md b/README.md index 1998c77..2a20285 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,18 @@ -# snippets +# Модуль - Сниппеты PHP +###### Позволяет хранить и выполнять произвольный php-код. -Модуль - Сниппеты PHP Только для AVE.CMS ALT \ No newline at end of file +## Примеры кода +```php + +``` + +## Changelog: + +05.07.2020 - Дата создания + + +--- +Copyright © 2007-2020 [Ave-Cms.Ru](https://ave-cms.ru) \ No newline at end of file diff --git a/admin/main.tpl b/admin/main.tpl new file mode 100644 index 0000000..bc20c9a --- /dev/null +++ b/admin/main.tpl @@ -0,0 +1,104 @@ + + +
+
{#CONSOLE_MODULE_NAME#}
+
+ +
+
+ {#CONSOLE_EDIT_TIP#} +
+
+ + + +
+ +
+
+
+ {#CONSOLE_MODULE_NAME#} +
+
+ + + + + + + + + + + + + + + + +
+ {#CONSOLE_SETTINGS#} +
+ {#CONSOLE_SAVED_FRAGMENTS#} + + + + {#CONSOLE_REPORT_EXECUTION#} + + +
+ + + + + + + + + + + + +
+ {#CONSOLE_MODULE_NAME#} +
+ +
+ + + +
+
+ + + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" textarea_id='code_text' ctrls='ModuleSnippets.saveFragment();' height='300'} \ No newline at end of file diff --git a/class/snippets.php b/class/snippets.php new file mode 100644 index 0000000..cafbf2e --- /dev/null +++ b/class/snippets.php @@ -0,0 +1,455 @@ +get_config_vars('CONSOLE_SAVE_NO_NAME')); + + $fragment_code = (isset($_POST['fragment_code']) + ? base64_encode($_POST['fragment_code']) + : ''); + + $fragmentdata = [ + 'fragment_id' => $key, + 'fragment_time' => time(), + 'fragment_ip' => $_SERVER['REMOTE_ADDR'], + 'fragment_user_id' => (isset($_SESSION['user_id']) ? $_SESSION['user_id'] : '0'), + 'fragment_name' => $fragment_name, + 'fragment_code' => $fragment_code + ]; + + return $fragmentdata; + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::show + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function show () + { + global $AVE_Template; + + $fragmentdata = []; + + if (file_exists(self::$fragmentdir . self::$fragmentfile)) + include self::$fragmentdir . self::$fragmentfile; + + $fragmentdata = msort($fragmentdata, 'fragment_name'); + + $AVE_Template->assign('fragments', $fragmentdata); + $AVE_Template->assign('content', $AVE_Template->fetch(self::$tpl_dir . 'main.tpl')); + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::execute + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function fragmentExecute () + { + global $AVE_DB, $AVE_Template; + + error_reporting(E_ALL); + ini_set('display_errors', 1); + + $profiler = false; + + if (isset($_POST['fragment_profiling']) && $_POST['fragment_profiling'] == 1) { + + static $list, $time, $count; + $profiler = true; + } + + $code = stripslashes($_POST['fragment_code']); + + ob_start(); + + Debug::startMemory('Eval'); + Debug::startTime('Eval'); + + $result = eval(' ?>' . $code . 'Query("SHOW PROFILES"); + + $list = "" + . "\n\t\n\t"; + + while ($row = $result_profiler->FetchRow()) { + $time += $row->Duration; + + $row->Query = preg_replace('/\t+/', '', $row->Query); + + $list .= "\n\t\n\t\t\n\t\t\n\t\t\n\t"; + } + + $list .= "\n
" + . $row->Query_ID + . "" + . number_format($row->Duration * 1, 6, ',', '') + . "" + . $row->Query + . "
"; + $time = number_format($time * 1, 6, ',', ''); + $count = $result_profiler->NumRows(); + + $AVE_DB->Query("SET PROFILING = 0"); + + $out .= '
  • '; + $out .= "\nВремя выполнения: " . $totalTime; + $out .= "\n
    Использовано памяти: " . $memoryUsage; + $out .= "\n
    Количество запросов: " . $count . ' шт. за ' . $time . ' сек.'; + $out .= '
'; + $out .= "\n
" . $list; + } + else + { + $out .= '
  • '; + $out .= "\nВремя выполнения: " . $totalTime; + $out .= "\n
    Использовано памяти: " . $memoryUsage; + $out .= '
'; + } + + echo $out; + exit; + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::fragmentInsert + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function fragmentInsert () + { + global $AVE_Template; + + $fragment_code = ''; + + $fragmentdata = []; + + $fragment_key = (isset($_POST['fragment_key']) && is_numeric($_POST['fragment_key']) OR $_POST['fragment_key'] != '') + ? (int) $_POST['fragment_key'] + : null; + + if (file_exists(self::$fragmentdir . self::$fragmentfile)) + include self::$fragmentdir . self::$fragmentfile; + + if (isset($fragmentdata[$fragment_key])) + $fragment_code = stripslashes(base64_decode($fragmentdata[$fragment_key]['fragment_code'])); + + if (isAjax()) + { + $success = $fragment_code + ? true + : false; + + $return = [ + 'success' => $success, + 'fragment_code' => $fragment_code, + 'fragment_key' => $fragment_key, + 'message' => $success ? $AVE_Template->get_config_vars('CONSOLE_DOWNLOAD_SAVED') : $AVE_Template->get_config_vars('CONSOLE_DOWNLOAD_FALSE'), + 'header' => $success ? $AVE_Template->get_config_vars('CONSOLE_SUCCESS') : $AVE_Template->get_config_vars('CONSOLE_ERROR'), + 'theme' => $success ? 'accept' : 'error' + ]; + + self::_json($return, true); + } else { + header('Location:index.php?do=modules&action=modedit&mod=snippets&moduleaction=1&cp=' . SESSION); + exit; + } + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::fragmentNew + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function fragmentNew () + { + global $AVE_Template; + + $fragmentdata = []; + + $fragmentfile = self::$fragmentdir . self::$fragmentfile; + + if (file_exists(self::$fragmentdir . self::$fragmentfile)) + include self::$fragmentdir . self::$fragmentfile; + + if (empty($fragmentdata)) + $_key = 0; + else + $_key = array_pop(array_keys($fragmentdata)) + 1; + + $fragmentdata[] = self::_fragment($_key); + + $fragmentdata = array_slice($fragmentdata, -1 * self::$limit); + + end($fragmentdata); + + $fragment_key = key($fragmentdata); + + $save_data = ''; + + file_put_contents($fragmentfile, $save_data); + + $fragmentdata = msort($fragmentdata, 'fragment_name'); + + $fragments = []; + + foreach ($fragmentdata AS $k => $v) + { + if ($v['fragment_id'] == $_key) + $_fragment_key = $v['fragment_id']; + + $fragments[$k] = [ + 'fragment_key' => $v['fragment_id'], + 'fragment_name' => $v['fragment_name'] + ]; + } + + unset ($fragmentdata, $save_data); + + if (isAjax()) { + $return = [ + 'success' => true, + 'key' => $_fragment_key, + 'fragments' => $fragments, + 'message' => $AVE_Template->get_config_vars('CONSOLE_SAVED'), + 'header' => $AVE_Template->get_config_vars('CONSOLE_SUCCESS'), + 'theme' => 'accept' + ]; + + self::_json($return, true); + } else { + header('Location:index.php?do=modules&action=modedit&mod=snippets&moduleaction=1&cp=' . SESSION); + exit; + } + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::fragmentSave + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function fragmentSave () + { + global $AVE_Template; + + $fragment_key = (int)$_POST['fragment_key']; + + $fragmentdata = []; + + $fragmentfile = self::$fragmentdir . self::$fragmentfile; + + if (file_exists(self::$fragmentdir . self::$fragmentfile)) + include self::$fragmentdir . self::$fragmentfile; + + $fragmentdata[$fragment_key]['fragment_code'] = base64_encode($_POST['fragment_code']); + $fragmentdata[$fragment_key]['fragment_changed'] = time(); + + $fragmentdata = array_slice ($fragmentdata, -1 * self::$limit); + + $save_data = ''; + + file_put_contents ($fragmentfile, $save_data); + + unset ($fragmentdata, $save_data); + + if (isAjax()) + { + $return = [ + 'success' => true, + 'key' => $fragment_key, + 'message' => $AVE_Template->get_config_vars('CONSOLE_SAVED'), + 'header' => $AVE_Template->get_config_vars('CONSOLE_SUCCESS'), + 'theme' => 'accept' + ]; + + self::_json($return, true); + } + else + { + header('Location:index.php?do=modules&action=modedit&mod=snippets&moduleaction=1&cp=' . SESSION); + exit; + } + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::fragmentDelete + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function fragmentDelete () + { + global $AVE_Template; + + $fragment_key = (int) $_POST['fragment_key']; + + $fragmentdata = []; + + $fragmentfile = self::$fragmentdir . self::$fragmentfile; + + if (file_exists(self::$fragmentdir . self::$fragmentfile)) + include self::$fragmentdir . self::$fragmentfile; + + foreach ($fragmentdata AS $k => $v) + { + if ($fragment_key == $v['fragment_id']) + unset ($fragmentdata[$k]); + } + + $fragmentdata = array_slice($fragmentdata, -1 * self::$limit); + + foreach ($fragmentdata AS $k => $v) + { + $v['fragment_id'] = $k; + $fragmentdata[$k] = $v; + } + + $save_data = ''; + + file_put_contents ($fragmentfile, $save_data); + + $fragmentdata = msort($fragmentdata, 'fragment_name'); + + $fragments = []; + + foreach ($fragmentdata AS $k => $v) + $fragments[] = [ + 'fragment_key' => $v['fragment_id'], + 'fragment_name' => $v['fragment_name'] + ]; + + unset ($fragmentdata, $save_data); + + if (isAjax()) { + $return = [ + 'success' => true, + 'fragments' => $fragments, + 'message' => $AVE_Template->get_config_vars('CONSOLE_DEL_SAVED'), + 'header' => $AVE_Template->get_config_vars('CONSOLE_SUCCESS'), + 'theme' => 'accept' + ]; + + self::_json($return, true); + } else { + header('Location:index.php?do=modules&action=modedit&mod=snippets&moduleaction=1&cp=' . SESSION); + exit; + } + } + + + /* + |----------------------------------------------------------------------------------------------------------------------- + | self::fragmentsShow + |----------------------------------------------------------------------------------------------------------------------- + | + */ + public static function fragmentsShow () + { + //ToDo + } + } +?> \ No newline at end of file diff --git a/data/fragment.php b/data/fragment.php new file mode 100644 index 0000000..a4d3fbd --- /dev/null +++ b/data/fragment.php @@ -0,0 +1,13 @@ + + array ( + 'fragment_id' => 0, + 'fragment_time' => 1596529593, + 'fragment_ip' => '::1', + 'fragment_user_id' => 1, + 'fragment_name' => 'Данные документа', + 'fragment_code' => 'PD9waHAKCURlYnVnOjpfZWNobyhnZXRfZG9jdW1lbnQoMSkpOwo/Pg==', + ), +) +?> \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..11b1a2d --- /dev/null +++ b/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/info.php b/info.php new file mode 100644 index 0000000..7cddca8 --- /dev/null +++ b/info.php @@ -0,0 +1,20 @@ + 'snippets', + 'ModuleVersion' => '1.0', + 'ModuleAutor' => 'AVE.cms', + 'ModuleCopyright' => '© 2007-' . date('Y') . ' AVE.cms', + 'ModuleStatus' => 1, + 'ModuleIsFunction' => 0, + 'ModuleTemplate' => 0, + 'ModuleAdminEdit' => 1, + 'ModuleFunction' => 'mod_snippets', + 'ModuleTag' => null, + 'ModuleTagLink' => null, + 'ModuleAveTag' => null, + 'ModulePHPTag' => null + ]; +?> \ No newline at end of file diff --git a/js/snippets.js b/js/snippets.js new file mode 100644 index 0000000..a969cce --- /dev/null +++ b/js/snippets.js @@ -0,0 +1,381 @@ +var ModuleSnippets = { + + initialized: false, + + init: function () { + + if (this.initialized) + return; + + this.initialized = true; + + this.build(); // Main functions + this.events(); // Events functions + }, + + + // Main functions + build: function () { + this.executeBtn(); + this.saveBtn(); + this.clearBtn(); + this.deleteBtn(); + this.nameSelection(); + }, + + + // Events functions + events: function () { + this.MouseTrap(); + }, + + + // + MouseTrap: function () { + + Mousetrap.bind(['ctrl+enter', 'command+enter'], function (event) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + + ModuleSnippets.executeRun(); + + return false; + }); + + Mousetrap.bind(['ctrl+s', 'command+s'], function (event) { + + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + + ModuleSnippets.saveFragment(); + + return false; + }); + }, + + + // + saveFragment: function () { + + let key_fragment = $('#fragmentKey').val(); + + if (key_fragment.length == '') { + jPrompt(new_text, '', new_title, function (name) { + if (name) { + ModuleSnippets.saveNew(name); + } + }); + } + else { + ModuleSnippets.saveExist(key_fragment); + } + }, + + + // + saveNew: function (name) { + + let code = $("#code_text").val(); + + $.ajax({ + type: "POST", + url: "index.php?do=modules&action=modedit&mod=snippets&moduleaction=new&cp=" + session, + data: { + "fragment_name": name, + "fragment_code": code + }, + dataType: "json", + beforeSend: function () { + $.alerts._overlay('show'); + }, + success: function (data) { + $.alerts._overlay('hide'); + + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + + ModuleSnippets.changeSelect(data['fragments'], data['key']); + $('#fragmentKey').val(data['key']); + ModuleSnippets.showHideDeleteBtn(); + } + }); + }, + + + // + saveExist: function (key) { + let code = $("#code_text").val(); + + $.ajax({ + type: "POST", + url: "index.php?do=modules&action=modedit&mod=snippets&moduleaction=save&cp=" + session, + data: { + "fragment_key": key, + "fragment_code": code + }, + dataType: "json", + beforeSend: function () { + $.alerts._overlay('show'); + }, + success: function (data) { + $.alerts._overlay('hide'); + + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + } + }); + }, + + + // + executeRun: function () { + let code = $("#code_text").val(); + let profiling = $("#profilingCheck").is(':checked') ? 1 : 0; + + var Dialog = $('').appendTo('body'); + var dialogWidth = $(window).width() * 0.9; + var dialogHeight = $(window).height() * 0.8; + + $.ajax({ + type: "POST", + url: "index.php?do=modules&action=modedit&mod=snippets&moduleaction=execute&cp=" + session, + data: { + 'fragment_code': code, + 'fragment_profiling': profiling + }, + beforeSend: function () { + $.alerts._overlay('show'); + }, + success: function (data) { + $.alerts._overlay('hide'); + + Dialog.html(data); + } + }); + + Dialog.dialog({ + autoOpen: false, + modal: true, + dialogClass: 'fixed-dialog', + close: function (event, ui) { + $(this).dialog('destroy').remove(); + } + }); + + Dialog.dialog("option", "title", result_dialog); + Dialog.dialog("option", "width", dialogWidth); + Dialog.dialog("option", "height", dialogHeight); + Dialog.dialog("open"); + }, + + + // + executeBtn: function () { + $('.Execute').on('click', function (event) { + event.preventDefault(); + + ModuleSnippets.executeRun(); + + }); + }, + + + // + saveBtn: function () { + $('.SaveFragment').on('click', function (event) { + event.preventDefault(); + + ModuleSnippets.saveFragment(); + }); + }, + + + // + clearBtn: function () { + $('.Clear').on('click', function (event) { + event.preventDefault(); + $.alerts._overlay('show'); + $('#fragmentKey').val(''); + $('#fargmentNames option').prop('selected', false); + $('#fargmentNames option:first').prop('selected', true); + $("#code_text").text(ModuleSnippets.insertCodeMirror('')); + $('#fargmentNames').trigger('refresh'); + $('a.Delete').addClass('hidden'); + $.alerts._overlay('hide'); + }); + }, + + + // + deleteBtn: function () { + $('.Delete').on('click', function (event) { + jConfirm( + del_confirm, + del_title, + function (succes) { + if (succes) { + $.alerts._overlay('show'); + ModuleSnippets.deleteFragment(); + } + } + ); + }); + }, + + + // + deleteFragment: function () { + + let key_fragment = $('#fragmentKey').val(); + + if (key_fragment != '') { + $.ajax({ + type: "POST", + url: "index.php?do=modules&action=modedit&mod=snippets&moduleaction=delete&cp=" + session, + data: { + 'fragment_key': key_fragment + }, + dataType: "json", + beforeSend: function () { + $.alerts._overlay('show'); + }, + success: function(data) { + $.alerts._overlay('hide'); + + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + + $('#fragmentKey').val(''); + + $("#code_text").text(ModuleSnippets.insertCodeMirror('')); + ModuleSnippets.showHideDeleteBtn(); + ModuleSnippets.changeSelect(data['fragments']); + } + }); + } + }, + + + // + nameSelection: function () { + $('#fargmentNames').on('change', function (event) { + event.preventDefault(); + + let selected = $($(this), 'option:selected').val(); + + if (selected === '') + { + $('#fragmentKey').val(''); + + ModuleSnippets.showHideDeleteBtn(); + + return false; + } + + $.ajax({ + type: "POST", + url: "index.php?do=modules&action=modedit&mod=snippets&moduleaction=insert&cp=" + session, + data: { + 'fragment_key': selected + }, + dataType: "json", + beforeSend: function () { + $.alerts._overlay('show'); + }, + success: function (data) { + $.alerts._overlay('hide'); + + if (data.fragment_key == null) + { + $('#fragmentKey').val(''); + + ModuleSnippets.showHideDeleteBtn(); + + return false; + } + + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + + if (data['success']) + { + $("#code_text").text(ModuleSnippets.insertCodeMirror(data['fragment_code'])); + $('#fragmentKey').val(data['fragment_key']); + } + // ToDo ELSE + + ModuleSnippets.showHideDeleteBtn(); + } + }); + + return false; + }); + }, + + + // + insertCodeMirror: function (data) { + var cm = $('.CodeMirror')[0].CodeMirror; + var doc = cm.getDoc(); + var cursor = doc.getCursor(); + var line = doc.getLine(cursor.line); + var pos = { + line: cursor.line, + ch: line.length - 1 + }; + + doc.setValue(''); + + doc.replaceRange(data, pos); + }, + + + // + showHideDeleteBtn: function () { + let key_fragment = $('#fragmentKey').val(); + + (key_fragment == '') + ? $('a.Delete').addClass('hidden') + : $('a.Delete').removeClass('hidden'); + + return false; + }, + + + // + changeSelect: function (data, key) { + let select = $('#fargmentNames'); + + select.html(''); + + select.append('') + + $.each(data, function () { + select.append('') + }); + + if (key !== undefined) + select.children('option[value=' + key + ']').prop('selected', true); + + $('select').trigger('refresh'); + } +}; + +jQuery(function ($) { + "use strict"; + ModuleSnippets.init(); +}); \ No newline at end of file diff --git a/lang/ru.txt b/lang/ru.txt new file mode 100644 index 0000000..79138a4 --- /dev/null +++ b/lang/ru.txt @@ -0,0 +1,34 @@ +[name] +MODULE_NAME = "Сниппеты PHP" +MODULE_DESCRIPTION = "Позволяет хранить и выполнять произвольный php-код." + +[admin] +CONSOLE_MODULE_NAME = "Сниппеты PHP" +CONSOLE_EDIT_TIP = "Позволяет хранить и выполнять произвольный php-код." +CONSOLE_BUTTON_ENTER = "Выполнить" +CONSOLE_BUTTON_SAVE = "Сохранить" +CONSOLE_BUTTON_DOWNLOAD = "Загрузить" +CONSOLE_BUTTON_CLEAR = "Очистить" +CONSOLE_BUTTON_CLOSE = "Закрыть" +CONSOLE_PERFORMED = "Результат" +CONSOLE_SETTINGS = "Настройки" +CONSOLE_REPORT_EXECUTION = "Отчет выполнения" +CONSOLE_SUCCESS = "Выполнено" +CONSOLE_ERROR = "Ошибка" +CONSOLE_CLEAR = "Консоль очищена" +CONSOLE_SELECT_FRAGMENT = "-- Выберите сниппет --" +CONSOLE_DOWNLOAD_FRAGMENT = "Загрузить" +CONSOLE_DELETE_FRAGMENT = "Удалить" +CONSOLE_CLOSE_FRAGMENT = "Закрыть" +CONSOLE_SAVED = "Сниппет успешно добавлен" +CONSOLE_DEL_SAVED = "Сниппет успешно удален" +CONSOLE_DOWNLOAD_SAVED = "Сниппет успешно загружен в консоль" +CONSOLE_DOWNLOAD_FALSE = "Сниппет не был загружен в консоль" +CONSOLE_EDIT = "Редактировать сниппет" +CONSOLE_DELETE = "Удалить сниппет" +CONSOLE_DELETE_CONFIRM = "Вы уверенны, что хотите удалить сниппет" +CONSOLE_NEW_TITLE = "Создание нового сниппета" +CONSOLE_NEW_TEXT = "Пожалуйста, укажите наименование сниппета" +CONSOLE_DATA_TITLE = "Сниппеты кода" +CONSOLE_HELP = "Сочетание клавиш
   Сохранить (CTRL+S)
   Загрузить (CTRL+D)
   Очистить (CTRL+С)" +CONSOLE_SAVED_FRAGMENTS = "Сохраненные сниппеты" \ No newline at end of file diff --git a/module.php b/module.php new file mode 100644 index 0000000..9ddc8f6 --- /dev/null +++ b/module.php @@ -0,0 +1,69 @@ +config_load($lang_file, 'admin'); + + //-- Actions + switch ($_REQUEST['moduleaction']) + { + case '1': + Snippets::show(); + break; + + case 'execute': + Snippets::fragmentExecute(); + break; + + case 'insert': + Snippets::fragmentInsert(); + break; + + case 'new': + Snippets::fragmentNew(); + break; + + case 'save': + Snippets::fragmentSave(); + break; + + case 'delete': + Snippets::fragmentDelete(); + break; + + case 'fragments': + Snippets::fragmentsShow(); + break; + } + } + +?> diff --git a/sql.php b/sql.php new file mode 100644 index 0000000..82bb6fa --- /dev/null +++ b/sql.php @@ -0,0 +1,19 @@ + \ No newline at end of file