├── .gitattributes ├── .gitignore ├── .gitmodules ├── COPYING.LGPL ├── COPYING.MIT ├── COPYRIGHT ├── README.md ├── WebFramework.code-workspace ├── netbeans └── Scavix WebFramework │ └── nbproject │ ├── project.properties │ └── project.xml ├── tools ├── README.md ├── WdfTracer │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Form2.Designer.cs │ ├── Form2.cs │ ├── Form2.resx │ ├── IconExtractor.cs │ ├── IconLib.dll │ ├── LogView.Designer.cs │ ├── LogView.cs │ ├── LogView.resx │ ├── NaturalStringComparer.cs │ ├── Newtonsoft.Json.dll │ ├── Program.cs │ ├── ProgressOverlay.Designer.cs │ ├── ProgressOverlay.cs │ ├── ProgressOverlay.resx │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── Resources │ │ ├── camera_test.png │ │ ├── error_do_not.png │ │ ├── netbeans.png │ │ ├── netbeans_gray.png │ │ ├── symbol_error.png │ │ ├── symbol_error_gray.png │ │ ├── ultraedit.png │ │ └── ultraedit_gray.png │ ├── SourceViewer.cs │ ├── WdfTracer.csproj │ ├── WdfTracer.sln │ ├── app.config │ ├── bug_buddy.ico │ └── textline.patterns └── build │ ├── README.md │ ├── build.php │ └── php.ini └── web ├── .vscode └── tasks.json ├── documentor ├── .htaccess ├── config.php ├── controller │ ├── docmain.class.php │ ├── preview.class.php │ └── preview.tpl.php ├── index.php ├── res │ ├── docmain.css │ ├── marked.js │ └── preview.css └── templates │ └── intro.tpl.php ├── logs └── .htaccess ├── sample_blog ├── .htaccess ├── README.md ├── config.php ├── controller │ └── blog.class.php ├── index.php ├── res │ └── blog.less └── templates │ ├── newpostform.tpl.php │ └── post.tpl.php ├── sample_charts ├── .htaccess ├── README.md ├── config.php ├── controller │ └── chartroulette.class.php └── index.php └── sample_shop ├── .htaccess ├── README.md ├── config.php ├── controller ├── admin.class.php ├── basket.class.php ├── products.class.php ├── shopbase.class.php └── shopbase.tpl.php ├── images ├── product1.png ├── product2.png └── product3.png ├── index.php ├── model ├── samplecustomer.class.php ├── sampleshoporder.class.php └── sampleshoporderitem.class.php ├── res └── shopbase.css └── templates ├── admin_product_add.tpl.php ├── checkout_form.tpl.php ├── product_basket.tpl.php ├── product_details.tpl.php └── product_overview.tpl.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## WebFramework 3 | ################# 4 | 5 | /tools/PhpTracer/bin/Debug 6 | /tools/PhpTracer/obj 7 | /tools/PhpTracer/bin/Release/PhpTracer.pdb 8 | /tools/PhpTracer/bin/Release/PhpTracer.vshost.exe.manifest 9 | /tools/PhpTracer/bin/Release/PhpTracer.vshost.exe.config 10 | /tools/PhpTracer/bin/Release/PhpTracer.vshost.exe 11 | /tools/*.zip 12 | /tools/*.phar 13 | /web/documentor/controller/_quick.ref 14 | /web/app/sample.db 15 | /web/testing 16 | /web/logs/*.* 17 | /netbeans/Scavix WDF Tools/nbproject/private/ 18 | /netbeans/Scavix WebFramework/nbproject/private/ 19 | 20 | ################# 21 | ## Eclipse 22 | ################# 23 | 24 | *.pydevproject 25 | .project 26 | .metadata 27 | bin/ 28 | tmp/ 29 | *.tmp 30 | *.bak 31 | *.swp 32 | *~.nib 33 | local.properties 34 | .classpath 35 | .settings/ 36 | .loadpath 37 | 38 | # External tool builders 39 | .externalToolBuilders/ 40 | 41 | # Locally stored "Eclipse launch configurations" 42 | *.launch 43 | 44 | # CDT-specific 45 | .cproject 46 | 47 | # PDT-specific 48 | .buildpath 49 | 50 | 51 | ################# 52 | ## Visual Studio 53 | ################# 54 | 55 | ## Ignore Visual Studio temporary files, build results, and 56 | ## files generated by popular Visual Studio add-ons. 57 | 58 | # User-specific files 59 | *.suo 60 | *.user 61 | *.sln.docstates 62 | 63 | # Build results 64 | [Dd]ebug/ 65 | [Rr]elease/ 66 | *_i.c 67 | *_p.c 68 | *.ilk 69 | *.meta 70 | *.obj 71 | *.pch 72 | *.pdb 73 | *.pgc 74 | *.pgd 75 | *.rsp 76 | *.sbr 77 | *.tlb 78 | *.tli 79 | *.tlh 80 | *.tmp 81 | *.vspscc 82 | .builds 83 | *.dotCover 84 | 85 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 86 | #packages/ 87 | 88 | # Visual C++ cache files 89 | ipch/ 90 | *.aps 91 | *.ncb 92 | *.opensdf 93 | *.sdf 94 | 95 | # Visual Studio profiler 96 | *.psess 97 | *.vsp 98 | 99 | # ReSharper is a .NET coding add-in 100 | _ReSharper* 101 | 102 | # Installshield output folder 103 | [Ee]xpress 104 | 105 | # DocProject is a documentation generator add-in 106 | DocProject/buildhelp/ 107 | DocProject/Help/*.HxT 108 | DocProject/Help/*.HxC 109 | DocProject/Help/*.hhc 110 | DocProject/Help/*.hhk 111 | DocProject/Help/*.hhp 112 | DocProject/Help/Html2 113 | DocProject/Help/html 114 | 115 | # Click-Once directory 116 | publish 117 | 118 | # Others 119 | [Bb]in 120 | [Oo]bj 121 | sql 122 | TestResults 123 | *.Cache 124 | ClientBin 125 | stylecop.* 126 | ~$* 127 | *.dbmdl 128 | Generated_Code #added for RIA/Silverlight projects 129 | 130 | # Backup & report files from converting an old project file to a newer 131 | # Visual Studio version. Backup files are not needed, because we have git ;-) 132 | _UpgradeReport_Files/ 133 | Backup*/ 134 | UpgradeLog*.XML 135 | 136 | 137 | 138 | ############ 139 | ## Windows 140 | ############ 141 | 142 | # Windows image file caches 143 | Thumbs.db 144 | 145 | # Folder config file 146 | Desktop.ini 147 | 148 | 149 | ############# 150 | ## Python 151 | ############# 152 | 153 | *.py[co] 154 | 155 | # Packages 156 | *.egg 157 | *.egg-info 158 | dist 159 | eggs 160 | parts 161 | bin 162 | var 163 | sdist 164 | develop-eggs 165 | .installed.cfg 166 | 167 | # Installer logs 168 | pip-log.txt 169 | 170 | # Unit test / coverage reports 171 | .coverage 172 | .tox 173 | 174 | #Translations 175 | *.mo 176 | 177 | #Mr Developer 178 | .mr.developer.cfg 179 | 180 | # Mac crap 181 | .DS_Store 182 | /web/documentor/controller/out 183 | /web/documentor/controller/quick.ref 184 | /web/documentor/controller/wdf_docs.zip 185 | /web/documentor/doc.db 186 | /web/logs/*.trace 187 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "web/system"] 2 | path = web/system 3 | url = https://github.com/ScavixSoftware/scavix-wdf.git 4 | -------------------------------------------------------------------------------- /COPYING.LGPL: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /COPYING.MIT: -------------------------------------------------------------------------------- 1 | Copyright 2013 jQuery Foundation and other contributors 2 | http://jquery.com/ 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /COPYRIGHT: -------------------------------------------------------------------------------- 1 | Scavix Web Development Framework 2 | Copyright (c) 2013 Scavix Software Ltd. & Co. KG 3 | 4 | Some of the code is published under the terms of the GNU Lesser General Public 5 | License version 3. 6 | 7 | Some of the code is published under the terms of the GNU Lesser General Public License version 2.1. 8 | 9 | Some of the code in this project is released under the terms 10 | of the MIT license. 11 | 12 | Other parties hold the copyright for some of the code. See the source code for details. 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Scavix Software Web Development Framework 2 | ========================================= 3 | 4 | The Scavix Software Web Development Framework has been build to assist developers in creating rich web applications. 5 | It's the foundation of all functionalities we need in our daily work so that we don't need to reinvent the wheel for each new customer project. It provides you with everything you need from the database access layer to the UI development so that you can focus on the business logic of the application without loosing yourself in the thousands of baby-steps that need to be implemented for every project. 6 | To give you a quick start, here's a nice article over at codeproject describing how to use this framework: 7 | [Ultra-Rapid PHP Application Development](http://www.codeproject.com/Articles/553018/Ultra-Rapid-PHP-Application-Development) 8 | 9 | Folders 10 | ------- 11 | `/netbeans/` Contains a NetBeans project for the contents of the /web/ folder 12 | `/tools/` Currently only contains PhpTracer which is a tool to monitor logfiles, written in C# 13 | `/web/documentor/` An app, we use this to create the [API reference documentation](https://github.com/ScavixSoftware/WebFramework/wiki) 14 | `/web/sample_blog/` A sample blog application using the WebFramework 15 | `/web/sample_shop/` A sample shop application using the WebFramework 16 | `/web/sample_chart/` A sample on how to show charts in your application based on the WebFramework 17 | `/web/system/` The framework code (as submodule) 18 | 19 | Installation 20 | ------------ 21 | Just clone the scavix-wdf code from https://github.com/ScavixSoftware/scavix-wdf or directly add it as submodule to your git repo. 22 | 23 | Resources 24 | --------- 25 | [API reference documentation](https://github.com/ScavixSoftware/WebFramework/wiki) 26 | Basic usage: [Ultra-Rapid PHP Application Development](http://www.codeproject.com/Articles/553018/Ultra-Rapid-PHP-Application-Development) 27 | A real world sample: [Easily implementing your own online shop](http://www.codeproject.com/Articles/586703/Easily-implementing-your-own-online-shop) 28 | Upgrading projects to PHP namespaces: [An easy solution](http://www.codeproject.com/Articles/643091/Upgrading-projects-to-PHP-namespaces-An-easy-solut) 29 | -------------------------------------------------------------------------------- /WebFramework.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "web" 5 | } 6 | ], 7 | "settings": { 8 | "php.stubs": [ 9 | "*", 10 | "posix" 11 | ] 12 | } 13 | } -------------------------------------------------------------------------------- /netbeans/Scavix WebFramework/nbproject/project.properties: -------------------------------------------------------------------------------- 1 | include.path=${php.global.include.path} 2 | php.version=PHP_70 3 | source.encoding=UTF-8 4 | src.dir=../../web 5 | tags.asp=false 6 | tags.short=true 7 | web.root=. 8 | -------------------------------------------------------------------------------- /netbeans/Scavix WebFramework/nbproject/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.netbeans.modules.php.project 4 | 5 | 6 | Scavix WebFramework 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tools/README.md: -------------------------------------------------------------------------------- 1 | WdfTracer 2 | ========= 3 | WdfTracer is a tool we use to read and monitor logfiles generated with the WebFramework. 4 | It's main purpose is to read the files produced by the TraceLogger class which contain much more information 5 | than normal logfiles. 6 | Of course WdfTracer can be used to monitor any kind of textfile for changes, but many of it's features will not 7 | be useful then. 8 | 9 | 10 | You may download the source and adjust for your needs or just [grap the binaries](https://github.com/ScavixSoftware/WebFramework/raw/master/tools/WdfTracer_1.0.0.11.zip). 11 | Just unpack to a folder of your choice and run the executable. 12 | You may find some more information over in our [codeproject article](http://www.codeproject.com/Articles/553018/Ultra-Rapid-PHP-Application-Development). 13 | 14 | DateTime formats 15 | ================ 16 | WdfTracer supports different date/time formats. If not by default, you can add your own by appending it to textline.patterns. 17 | Each line in there is a regular expression and WdfTracer will try to match them one after the other until one matches. -------------------------------------------------------------------------------- /tools/WdfTracer/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) 2007-2012 PamConsult GmbH 5 | * Copyright (c) since 2013 Scavix Software Ltd. & Co. KG 6 | * 7 | * This library is free software; you can redistribute it 8 | * and/or modify it under the terms of the GNU Lesser General 9 | * Public License as published by the Free Software Foundation; 10 | * either version 3 of the License, or (at your option) any 11 | * later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 | * Lesser General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Lesser General Public 19 | * License along with this library. If not, see 20 | * 21 | * @author PamConsult GmbH http://www.pamconsult.com 22 | * @copyright 2007-2012 PamConsult GmbH 23 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 24 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 25 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 26 | */ 27 | namespace WdfTracer 28 | { 29 | partial class Form1 30 | { 31 | /// 32 | /// Required designer variable. 33 | /// 34 | private System.ComponentModel.IContainer components = null; 35 | 36 | /// 37 | /// Clean up any resources being used. 38 | /// 39 | /// true if managed resources should be disposed; otherwise, false. 40 | protected override void Dispose(bool disposing) 41 | { 42 | if (disposing && (components != null)) 43 | { 44 | components.Dispose(); 45 | } 46 | base.Dispose(disposing); 47 | } 48 | 49 | #region Windows Form Designer generated code 50 | 51 | /// 52 | /// Required method for Designer support - do not modify 53 | /// the contents of this method with the code editor. 54 | /// 55 | private void InitializeComponent() 56 | { 57 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 58 | this.tcFileViews = new System.Windows.Forms.TabControl(); 59 | this.tabPage1 = new System.Windows.Forms.TabPage(); 60 | this.dlgOpenFile = new System.Windows.Forms.OpenFileDialog(); 61 | this.toolStrip1 = new System.Windows.Forms.ToolStrip(); 62 | this.btnOpen = new System.Windows.Forms.ToolStripSplitButton(); 63 | this.asdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 64 | this.btnClose = new System.Windows.Forms.ToolStripButton(); 65 | this.statusStrip1 = new System.Windows.Forms.StatusStrip(); 66 | this.labExceptions = new System.Windows.Forms.ToolStripStatusLabel(); 67 | this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); 68 | this.btnSelectedViewer = new System.Windows.Forms.ToolStripDropDownButton(); 69 | this.itemUltraEdit = new System.Windows.Forms.ToolStripMenuItem(); 70 | this.itemNetbeans = new System.Windows.Forms.ToolStripMenuItem(); 71 | this.tcFileViews.SuspendLayout(); 72 | this.toolStrip1.SuspendLayout(); 73 | this.statusStrip1.SuspendLayout(); 74 | this.SuspendLayout(); 75 | // 76 | // tcFileViews 77 | // 78 | this.tcFileViews.Appearance = System.Windows.Forms.TabAppearance.FlatButtons; 79 | this.tcFileViews.Controls.Add(this.tabPage1); 80 | this.tcFileViews.Dock = System.Windows.Forms.DockStyle.Fill; 81 | this.tcFileViews.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; 82 | this.tcFileViews.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 83 | this.tcFileViews.ItemSize = new System.Drawing.Size(150, 21); 84 | this.tcFileViews.Location = new System.Drawing.Point(0, 25); 85 | this.tcFileViews.Name = "tcFileViews"; 86 | this.tcFileViews.Padding = new System.Drawing.Point(16, 3); 87 | this.tcFileViews.SelectedIndex = 0; 88 | this.tcFileViews.ShowToolTips = true; 89 | this.tcFileViews.Size = new System.Drawing.Size(894, 486); 90 | this.tcFileViews.TabIndex = 1; 91 | this.tcFileViews.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tcFileViews_DrawItem); 92 | this.tcFileViews.Selected += new System.Windows.Forms.TabControlEventHandler(this.tcFileViews_Selected); 93 | this.tcFileViews.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tabPage1_MouseUp); 94 | // 95 | // tabPage1 96 | // 97 | this.tabPage1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 98 | this.tabPage1.Location = new System.Drawing.Point(4, 25); 99 | this.tabPage1.Name = "tabPage1"; 100 | this.tabPage1.Padding = new System.Windows.Forms.Padding(3); 101 | this.tabPage1.Size = new System.Drawing.Size(886, 457); 102 | this.tabPage1.TabIndex = 0; 103 | this.tabPage1.Text = "tabPage1"; 104 | this.tabPage1.UseVisualStyleBackColor = true; 105 | // 106 | // dlgOpenFile 107 | // 108 | this.dlgOpenFile.FileName = "openFileDialog1"; 109 | this.dlgOpenFile.Multiselect = true; 110 | // 111 | // toolStrip1 112 | // 113 | this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 114 | this.btnOpen, 115 | this.btnClose}); 116 | this.toolStrip1.Location = new System.Drawing.Point(0, 0); 117 | this.toolStrip1.Name = "toolStrip1"; 118 | this.toolStrip1.Size = new System.Drawing.Size(894, 25); 119 | this.toolStrip1.TabIndex = 3; 120 | this.toolStrip1.Text = "toolStrip1"; 121 | // 122 | // btnOpen 123 | // 124 | this.btnOpen.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 125 | this.asdToolStripMenuItem}); 126 | this.btnOpen.Image = ((System.Drawing.Image)(resources.GetObject("btnOpen.Image"))); 127 | this.btnOpen.ImageTransparentColor = System.Drawing.Color.Magenta; 128 | this.btnOpen.Name = "btnOpen"; 129 | this.btnOpen.Size = new System.Drawing.Size(77, 22); 130 | this.btnOpen.Text = "Open..."; 131 | this.btnOpen.ButtonClick += new System.EventHandler(this.btnOpen_Click); 132 | // 133 | // asdToolStripMenuItem 134 | // 135 | this.asdToolStripMenuItem.Name = "asdToolStripMenuItem"; 136 | this.asdToolStripMenuItem.Size = new System.Drawing.Size(92, 22); 137 | this.asdToolStripMenuItem.Text = "asd"; 138 | // 139 | // btnClose 140 | // 141 | this.btnClose.Image = ((System.Drawing.Image)(resources.GetObject("btnClose.Image"))); 142 | this.btnClose.ImageTransparentColor = System.Drawing.Color.Magenta; 143 | this.btnClose.Name = "btnClose"; 144 | this.btnClose.Size = new System.Drawing.Size(56, 22); 145 | this.btnClose.Text = "Close"; 146 | this.btnClose.Click += new System.EventHandler(this.btnClose_Click); 147 | // 148 | // statusStrip1 149 | // 150 | this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 151 | this.labExceptions, 152 | this.toolStripStatusLabel1, 153 | this.btnSelectedViewer}); 154 | this.statusStrip1.Location = new System.Drawing.Point(0, 511); 155 | this.statusStrip1.Name = "statusStrip1"; 156 | this.statusStrip1.ShowItemToolTips = true; 157 | this.statusStrip1.Size = new System.Drawing.Size(894, 22); 158 | this.statusStrip1.TabIndex = 4; 159 | this.statusStrip1.Text = "statusStrip1"; 160 | // 161 | // labExceptions 162 | // 163 | this.labExceptions.Image = global::WdfTracer.Properties.Resources.success; 164 | this.labExceptions.Name = "labExceptions"; 165 | this.labExceptions.Size = new System.Drawing.Size(88, 17); 166 | this.labExceptions.Text = "0 Exceptions"; 167 | this.labExceptions.ToolTipText = "Click to open Logfile"; 168 | this.labExceptions.Click += new System.EventHandler(this.labExceptions_Click); 169 | // 170 | // toolStripStatusLabel1 171 | // 172 | this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; 173 | this.toolStripStatusLabel1.Size = new System.Drawing.Size(636, 17); 174 | this.toolStripStatusLabel1.Spring = true; 175 | // 176 | // btnSelectedViewer 177 | // 178 | this.btnSelectedViewer.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 179 | this.itemUltraEdit, 180 | this.itemNetbeans}); 181 | this.btnSelectedViewer.Image = global::WdfTracer.Properties.Resources.none; 182 | this.btnSelectedViewer.ImageTransparentColor = System.Drawing.Color.Magenta; 183 | this.btnSelectedViewer.Name = "btnSelectedViewer"; 184 | this.btnSelectedViewer.Size = new System.Drawing.Size(124, 20); 185 | this.btnSelectedViewer.Text = "No viewer found"; 186 | this.btnSelectedViewer.Click += new System.EventHandler(this.btnSelectedViewer_Click); 187 | // 188 | // itemUltraEdit 189 | // 190 | this.itemUltraEdit.Name = "itemUltraEdit"; 191 | this.itemUltraEdit.Size = new System.Drawing.Size(152, 22); 192 | this.itemUltraEdit.Tag = "ultraedit"; 193 | this.itemUltraEdit.Text = "UltraEdit"; 194 | // 195 | // itemNetbeans 196 | // 197 | this.itemNetbeans.Name = "itemNetbeans"; 198 | this.itemNetbeans.Size = new System.Drawing.Size(152, 22); 199 | this.itemNetbeans.Tag = "netbeans"; 200 | this.itemNetbeans.Text = "NetBeans"; 201 | // 202 | // Form1 203 | // 204 | this.AllowDrop = true; 205 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 206 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 207 | this.ClientSize = new System.Drawing.Size(894, 533); 208 | this.Controls.Add(this.tcFileViews); 209 | this.Controls.Add(this.statusStrip1); 210 | this.Controls.Add(this.toolStrip1); 211 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 212 | this.Name = "Form1"; 213 | this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; 214 | this.Text = "WdfTracer"; 215 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); 216 | this.Load += new System.EventHandler(this.Form1_Load); 217 | this.LocationChanged += new System.EventHandler(this.Form1_LocationChanged); 218 | this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop); 219 | this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter); 220 | this.Resize += new System.EventHandler(this.Form1_Resize); 221 | this.tcFileViews.ResumeLayout(false); 222 | this.toolStrip1.ResumeLayout(false); 223 | this.toolStrip1.PerformLayout(); 224 | this.statusStrip1.ResumeLayout(false); 225 | this.statusStrip1.PerformLayout(); 226 | this.ResumeLayout(false); 227 | this.PerformLayout(); 228 | 229 | } 230 | 231 | #endregion 232 | 233 | private System.Windows.Forms.TabControl tcFileViews; 234 | private System.Windows.Forms.OpenFileDialog dlgOpenFile; 235 | private System.Windows.Forms.TabPage tabPage1; 236 | private System.Windows.Forms.ToolStrip toolStrip1; 237 | private System.Windows.Forms.ToolStripSplitButton btnOpen; 238 | private System.Windows.Forms.ToolStripMenuItem asdToolStripMenuItem; 239 | private System.Windows.Forms.ToolStripButton btnClose; 240 | private System.Windows.Forms.StatusStrip statusStrip1; 241 | private System.Windows.Forms.ToolStripStatusLabel labExceptions; 242 | private System.Windows.Forms.ToolStripDropDownButton btnSelectedViewer; 243 | private System.Windows.Forms.ToolStripMenuItem itemUltraEdit; 244 | private System.Windows.Forms.ToolStripMenuItem itemNetbeans; 245 | private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; 246 | 247 | } 248 | } 249 | 250 | -------------------------------------------------------------------------------- /tools/WdfTracer/Form2.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Windows.Forms; 10 | 11 | namespace WdfTracer 12 | { 13 | public partial class Form2 : Form 14 | { 15 | List ItemsList; 16 | List DeleteItems = new List(); 17 | 18 | public Form2() 19 | { 20 | InitializeComponent(); 21 | ItemsList = Program.Viewer; 22 | listrefresh(); 23 | } 24 | 25 | private void listrefresh() 26 | { 27 | listView1.Items.Clear(); 28 | listView1_SelectedIndexChanged(null,null); 29 | foreach (SourceViewer s in ItemsList) 30 | { 31 | ListViewItem item = listView1.Items.Add(s.Name); 32 | item.Tag = s; 33 | if (s.Image != null) 34 | { 35 | imageList1.Images.Add(s.Image); 36 | item.ImageIndex = imageList1.Images.Count - 1; 37 | } 38 | 39 | } 40 | txtCheck(); 41 | } 42 | 43 | private void btnOk_Click(object sender, EventArgs e) 44 | { 45 | foreach (ListViewItem item in listView1.Items) 46 | { 47 | SourceViewer s = item.Tag as SourceViewer; 48 | s.Nummer = item.Index; 49 | s.Save(Program.ViewerSettings); 50 | } 51 | foreach (SourceViewer s in DeleteItems) 52 | { 53 | s.Delete(Program.ViewerSettings); 54 | s.DeleteIcon(); 55 | } 56 | this.DialogResult = DialogResult.OK; 57 | } 58 | 59 | private void btnCancel_Click(object sender, EventArgs e) 60 | { 61 | this.DialogResult = DialogResult.Cancel; 62 | } 63 | 64 | private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e) 65 | { 66 | 67 | } 68 | 69 | private void btnItemAdd_Click(object sender, EventArgs e) 70 | { 71 | SourceViewer source = new SourceViewer(); 72 | OpenFileDialog openFileDialog1 = new OpenFileDialog(); 73 | openFileDialog1.Filter = ".exe files (*.exe)|*.exe|.com files (*.com)|*.com"; 74 | if (openFileDialog1.ShowDialog() == DialogResult.OK) 75 | { 76 | List buf = new List(); 77 | foreach (ListViewItem temp in listView1.Items) 78 | buf.Add(temp.Tag as SourceViewer); 79 | buf.AddRange(DeleteItems); 80 | 81 | string alias = source.Alias = Path.GetFileNameWithoutExtension(openFileDialog1.FileName); 82 | bool exists = true; 83 | int z = 1; 84 | while (exists) 85 | { 86 | exists = false; 87 | foreach (SourceViewer s in buf) 88 | { 89 | if (alias == s.Alias) 90 | { 91 | alias = source.Alias + "_" + z; 92 | z++; 93 | exists = true; 94 | break; 95 | } 96 | } 97 | } 98 | source.Alias = alias; 99 | source.Name = Path.GetFileNameWithoutExtension(openFileDialog1.FileName); 100 | source.ExeSearchName = Path.GetFileName(openFileDialog1.FileName); 101 | source.Executable = openFileDialog1.FileName; 102 | ListViewItem item = listView1.Items.Add(source.Name); 103 | item.Tag = source; 104 | imageList1.Images.Add(source.Image); 105 | item.ImageIndex = imageList1.Images.Count - 1; 106 | ItemsList.Add(source); 107 | int m = listView1.Items.Count; 108 | m --; 109 | this.listView1.Items[m].Selected = true; 110 | } 111 | } 112 | 113 | private void txtbxName_TextChanged(object sender, EventArgs e) 114 | { 115 | txtCheck(); 116 | } 117 | 118 | private void txtbxPath_TextChanged(object sender, EventArgs e) 119 | { 120 | txtCheck(); 121 | } 122 | 123 | private void txtbxArgument_TextChanged(object sender, EventArgs e) 124 | { 125 | txtCheck(); 126 | } 127 | 128 | private void listView1_SelectedIndexChanged(object sender, EventArgs e) 129 | { 130 | if (listView1.SelectedItems.Count < 1) 131 | { 132 | txtbxName.Text = ""; 133 | txtbxPath.Text = ""; 134 | txtbxArgument.Text = ""; 135 | groupBox1.Enabled = false; 136 | btnPath.Enabled = false; 137 | btnItemDelete.Enabled = false; 138 | btnItemUp.Enabled = false; 139 | btnItemDown.Enabled = false; 140 | return; 141 | } 142 | else 143 | { 144 | groupBox1.Enabled = true; 145 | btnPath.Enabled = true; 146 | btnItemDelete.Enabled = true; 147 | btnItemUp.Enabled = true; 148 | btnItemDown.Enabled = true; 149 | SourceViewer s = listView1.SelectedItems[0].Tag as SourceViewer; 150 | txtbxName.Text = s.Name; 151 | txtbxPath.Text = s.Executable; 152 | txtbxArgument.Text = s.ArgumentPattern; 153 | } 154 | } 155 | 156 | private void btnPath_Click(object sender, EventArgs e) 157 | { 158 | ListViewItem item = listView1.SelectedItems[0]; 159 | SourceViewer source = item.Tag as SourceViewer; 160 | OpenFileDialog openFileDialog1 = new OpenFileDialog(); 161 | openFileDialog1.Filter = ".exe files (*.exe)|*.exe|.com files (*.com)|*.com"; 162 | if (source.Executable != "") { openFileDialog1.InitialDirectory = Path.GetDirectoryName(source.Executable); } 163 | if (openFileDialog1.ShowDialog() == DialogResult.OK) 164 | { 165 | txtbxPath.Text = openFileDialog1.FileName; 166 | } 167 | } 168 | 169 | private void btnItemDelete_Click(object sender, EventArgs e) 170 | { 171 | SourceViewer s = listView1.SelectedItems[0].Tag as SourceViewer; 172 | DeleteItems.Add(s); 173 | ItemsList.Remove(s); 174 | listView1.Items.Remove(listView1.SelectedItems[0]); 175 | } 176 | 177 | private void btnItemUp_Click(object sender, EventArgs e) 178 | { 179 | ListViewItem item = listView1.SelectedItems[0]; 180 | if (item.Index < 1) 181 | return; 182 | 183 | ListViewItem other = listView1.Items[item.Index - 1]; 184 | listView1.Items.Remove(item); 185 | listView1.Items.Insert(other.Index, item); 186 | } 187 | 188 | private void btnItemDown_Click(object sender, EventArgs e) 189 | { 190 | ListViewItem item = listView1.SelectedItems[0]; 191 | int i = listView1.Items.Count - 2; 192 | if (item.Index > i) 193 | return; 194 | 195 | ListViewItem other = listView1.Items[item.Index + 1]; 196 | listView1.Items.Remove(other); 197 | listView1.Items.Insert(item.Index, other); 198 | } 199 | 200 | private void btnRename_Click(object sender, EventArgs e) 201 | { 202 | ListViewItem item = listView1.SelectedItems[0]; 203 | SourceViewer source = item.Tag as SourceViewer; 204 | source.DeleteIcon(); 205 | source.Name = txtbxName.Text; 206 | source.ArgumentPattern = txtbxArgument.Text; 207 | if (File.Exists(txtbxPath.Text)) 208 | { 209 | source.Executable = txtbxPath.Text; 210 | source.ExeSearchName = Path.GetFileName(txtbxPath.Text); 211 | source.Executable = txtbxPath.Text; 212 | txtCheck(); 213 | } 214 | listrefresh(); 215 | } 216 | 217 | private void btnDiscard_Click(object sender, EventArgs e) 218 | { 219 | SourceViewer s = listView1.SelectedItems[0].Tag as SourceViewer; 220 | txtbxName.Text = s.Name; 221 | txtbxPath.Text = s.Executable; 222 | txtbxArgument.Text = s.ArgumentPattern; 223 | txtCheck(); 224 | } 225 | 226 | private void txtCheck() 227 | { 228 | if (listView1.SelectedItems.Count < 1) 229 | return; 230 | SourceViewer s = listView1.SelectedItems[0].Tag as SourceViewer; 231 | if (txtbxPath.Text != s.Executable || txtbxName.Text != s.Name || txtbxArgument.Text != s.ArgumentPattern) 232 | { 233 | 234 | panel1.Enabled = false; 235 | btnOk.Enabled = false; 236 | btnCancel.Enabled = false; 237 | btnRename.Enabled = true; 238 | btnDiscard.Enabled = true; 239 | } 240 | else 241 | { 242 | panel1.Enabled = true; 243 | btnOk.Enabled = true; 244 | btnCancel.Enabled = true; 245 | btnRename.Enabled = false; 246 | btnDiscard.Enabled = false; 247 | } 248 | 249 | if (Path.GetExtension(txtbxPath.Text) != ".exe" && Path.GetExtension(txtbxPath.Text) != ".com" || File.Exists(txtbxPath.Text) == false && txtbxPath.Text != "") 250 | { 251 | 252 | btnRename.Enabled = false; 253 | txtbxPath.BackColor = Color.Red; 254 | } 255 | else 256 | { 257 | txtbxPath.BackColor = SystemColors.Window; 258 | } 259 | } 260 | 261 | 262 | } 263 | } 264 | -------------------------------------------------------------------------------- /tools/WdfTracer/Form2.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 176, 17 125 | 126 | 127 | 286, 17 128 | 129 | -------------------------------------------------------------------------------- /tools/WdfTracer/IconLib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/IconLib.dll -------------------------------------------------------------------------------- /tools/WdfTracer/LogView.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 125 | AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w 126 | LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 127 | ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACS 128 | BwAAAk1TRnQBSQFMAwEBAAFgAQABYAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA 129 | AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA 130 | AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA 131 | AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm 132 | AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ 133 | AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm 134 | AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz 135 | AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm 136 | AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm 137 | AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA 138 | ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm 139 | AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm 140 | ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm 141 | AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA 142 | AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ 143 | AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz 144 | AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ 145 | AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA 146 | AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM 147 | AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm 148 | ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ 149 | AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ 150 | ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM 151 | ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm 152 | AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM 153 | AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA 154 | AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA 155 | ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 156 | Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8DAAESAfRAAAHvQAABEgH0 157 | QAAB70AAARIB9EAAAe9AAAESAfRAAAHvPwAB7z0AARIB9D0AAe89AAESAfQ9AAHvPQABEgH0PQAB7z0A 158 | ARIB9DwAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAHPAf8GAAHHAf8GAAHB 159 | Af8GAAHAAf8GAAHAAT8GAAHAAR8GAAHAAQcGAAHAAQMGAAHAAQMGAAHAAQcGAAHAAR8GAAHAAT8GAAHA 160 | Af8GAAHBAf8GAAHHAf8GAAHPAf8GAAs= 161 | 162 | 163 | 164 | 127, 17 165 | 166 | 167 | 314, 17 168 | 169 | -------------------------------------------------------------------------------- /tools/WdfTracer/NaturalStringComparer.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) 2007-2012 PamConsult GmbH 5 | * Copyright (c) since 2013 Scavix Software Ltd. & Co. KG 6 | * 7 | * This library is free software; you can redistribute it 8 | * and/or modify it under the terms of the GNU Lesser General 9 | * Public License as published by the Free Software Foundation; 10 | * either version 3 of the License, or (at your option) any 11 | * later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 | * Lesser General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Lesser General Public 19 | * License along with this library. If not, see 20 | * 21 | * @author PamConsult GmbH http://www.pamconsult.com 22 | * @copyright 2007-2012 PamConsult GmbH 23 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 24 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 25 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 26 | */ 27 | using System; 28 | using System.Collections.Generic; 29 | using System.Linq; 30 | using System.Text; 31 | using System.Security; 32 | using System.Runtime.InteropServices; 33 | 34 | namespace WdfTracer 35 | { 36 | [SuppressUnmanagedCodeSecurity] 37 | internal static class SafeNativeMethods 38 | { 39 | [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 40 | public static extern int StrCmpLogicalW(string psz1, string psz2); 41 | } 42 | 43 | public sealed class NaturalStringComparer : IComparer 44 | { 45 | public int Compare(string a, string b) 46 | { 47 | return SafeNativeMethods.StrCmpLogicalW(a, b); 48 | } 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /tools/WdfTracer/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /tools/WdfTracer/ProgressOverlay.Designer.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) 2007-2012 PamConsult GmbH 5 | * Copyright (c) since 2013 Scavix Software Ltd. & Co. KG 6 | * 7 | * This library is free software; you can redistribute it 8 | * and/or modify it under the terms of the GNU Lesser General 9 | * Public License as published by the Free Software Foundation; 10 | * either version 3 of the License, or (at your option) any 11 | * later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 | * Lesser General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Lesser General Public 19 | * License along with this library. If not, see 20 | * 21 | * @author PamConsult GmbH http://www.pamconsult.com 22 | * @copyright 2007-2012 PamConsult GmbH 23 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 24 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 25 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 26 | */ 27 | namespace WdfTracer 28 | { 29 | partial class ProgressOverlay 30 | { 31 | /// 32 | /// Required designer variable. 33 | /// 34 | private System.ComponentModel.IContainer components = null; 35 | 36 | /// 37 | /// Clean up any resources being used. 38 | /// 39 | /// true if managed resources should be disposed; otherwise, false. 40 | protected override void Dispose(bool disposing) 41 | { 42 | if (disposing && (components != null)) 43 | { 44 | components.Dispose(); 45 | } 46 | base.Dispose(disposing); 47 | } 48 | 49 | #region Component Designer generated code 50 | 51 | /// 52 | /// Required method for Designer support - do not modify 53 | /// the contents of this method with the code editor. 54 | /// 55 | private void InitializeComponent() 56 | { 57 | this.panProgress = new System.Windows.Forms.Panel(); 58 | this.progBar = new System.Windows.Forms.ProgressBar(); 59 | this.labTitle = new System.Windows.Forms.Label(); 60 | this.button1 = new System.Windows.Forms.Button(); 61 | this.panProgress.SuspendLayout(); 62 | this.SuspendLayout(); 63 | // 64 | // panProgress 65 | // 66 | this.panProgress.Controls.Add(this.button1); 67 | this.panProgress.Controls.Add(this.progBar); 68 | this.panProgress.Controls.Add(this.labTitle); 69 | this.panProgress.Location = new System.Drawing.Point(3, 3); 70 | this.panProgress.Name = "panProgress"; 71 | this.panProgress.Size = new System.Drawing.Size(454, 68); 72 | this.panProgress.TabIndex = 6; 73 | // 74 | // progBar 75 | // 76 | this.progBar.Location = new System.Drawing.Point(16, 29); 77 | this.progBar.Name = "progBar"; 78 | this.progBar.Size = new System.Drawing.Size(341, 23); 79 | this.progBar.TabIndex = 1; 80 | // 81 | // labTitle 82 | // 83 | this.labTitle.AutoSize = true; 84 | this.labTitle.BackColor = System.Drawing.Color.Transparent; 85 | this.labTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 86 | this.labTitle.Location = new System.Drawing.Point(13, 9); 87 | this.labTitle.Name = "labTitle"; 88 | this.labTitle.Size = new System.Drawing.Size(101, 16); 89 | this.labTitle.TabIndex = 0; 90 | this.labTitle.Text = "Loading file..."; 91 | // 92 | // button1 93 | // 94 | this.button1.Location = new System.Drawing.Point(363, 29); 95 | this.button1.Name = "button1"; 96 | this.button1.Size = new System.Drawing.Size(75, 23); 97 | this.button1.TabIndex = 2; 98 | this.button1.Text = "Cancel"; 99 | this.button1.UseVisualStyleBackColor = true; 100 | this.button1.Click += new System.EventHandler(this.button1_Click); 101 | // 102 | // ProgressOverlay 103 | // 104 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 105 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 106 | this.BackColor = System.Drawing.Color.Transparent; 107 | this.Controls.Add(this.panProgress); 108 | this.Name = "ProgressOverlay"; 109 | this.Size = new System.Drawing.Size(507, 167); 110 | this.Resize += new System.EventHandler(this.ProgressOverlay_Resize); 111 | this.panProgress.ResumeLayout(false); 112 | this.panProgress.PerformLayout(); 113 | this.ResumeLayout(false); 114 | 115 | } 116 | 117 | #endregion 118 | 119 | private System.Windows.Forms.Panel panProgress; 120 | private System.Windows.Forms.ProgressBar progBar; 121 | private System.Windows.Forms.Label labTitle; 122 | private System.Windows.Forms.Button button1; 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /tools/WdfTracer/ProgressOverlay.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) 2007-2012 PamConsult GmbH 5 | * Copyright (c) since 2013 Scavix Software Ltd. & Co. KG 6 | * 7 | * This library is free software; you can redistribute it 8 | * and/or modify it under the terms of the GNU Lesser General 9 | * Public License as published by the Free Software Foundation; 10 | * either version 3 of the License, or (at your option) any 11 | * later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 | * Lesser General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Lesser General Public 19 | * License along with this library. If not, see 20 | * 21 | * @author PamConsult GmbH http://www.pamconsult.com 22 | * @copyright 2007-2012 PamConsult GmbH 23 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 24 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 25 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 26 | */ 27 | using System; 28 | using System.Collections.Generic; 29 | using System.ComponentModel; 30 | using System.Drawing; 31 | using System.Data; 32 | using System.Linq; 33 | using System.Text; 34 | using System.Windows.Forms; 35 | 36 | namespace WdfTracer 37 | { 38 | public delegate void ProgressDelegate(long min, long max, long position); 39 | public delegate void CancelledDelegate(ProgressOverlay sender); 40 | 41 | public partial class ProgressOverlay : UserControl 42 | { 43 | public event CancelledDelegate OnCancelled; 44 | 45 | public ProgressOverlay() 46 | { 47 | InitializeComponent(); 48 | SetStyle(ControlStyles.SupportsTransparentBackColor, true); 49 | BackColor = Color.Transparent;// Color.FromArgb(100, Color.Black); 50 | Dock = DockStyle.Fill; 51 | } 52 | 53 | public void SetProgress(long min, long max, long position) 54 | { 55 | if (InvokeRequired) 56 | { 57 | Invoke(new ProgressDelegate(SetProgress), new object[] { min, max, position }); 58 | return; 59 | } 60 | progBar.Minimum = (int)min; 61 | progBar.Maximum = (int)max; 62 | progBar.Value = (int)position; 63 | 64 | if (position == max) 65 | Hide(); 66 | else 67 | { 68 | Show(); 69 | ProgressOverlay_Resize(null, null); 70 | BringToFront(); 71 | } 72 | } 73 | 74 | private void ProgressOverlay_Resize(object sender, EventArgs e) 75 | { 76 | if (Visible) 77 | { 78 | panProgress.Left = (Width / 2) - (panProgress.Width / 2); 79 | panProgress.Top = (Height / 2) - (panProgress.Height / 2); 80 | } 81 | } 82 | 83 | private void button1_Click(object sender, EventArgs e) 84 | { 85 | if (OnCancelled != null) 86 | OnCancelled(this); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /tools/WdfTracer/ProgressOverlay.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /tools/WdfTracer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("WdfTracer")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Scavix Software GmbH & Co. KG")] 12 | [assembly: AssemblyProduct("WdfTracer")] 13 | [assembly: AssemblyCopyright("Copyright © Scavix Software GmbH & Co. KG 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("a6b0be62-3ed8-4cbb-919c-1d1aa4a479e6")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.12")] 36 | [assembly: AssemblyFileVersion("1.0.0.12")] 37 | -------------------------------------------------------------------------------- /tools/WdfTracer/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WdfTracer.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WdfTracer.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap error { 67 | get { 68 | object obj = ResourceManager.GetObject("error", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap error_gray { 77 | get { 78 | object obj = ResourceManager.GetObject("error_gray", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 85 | /// 86 | internal static System.Drawing.Bitmap none { 87 | get { 88 | object obj = ResourceManager.GetObject("none", resourceCulture); 89 | return ((System.Drawing.Bitmap)(obj)); 90 | } 91 | } 92 | 93 | /// 94 | /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. 95 | /// 96 | internal static System.Drawing.Bitmap success { 97 | get { 98 | object obj = ResourceManager.GetObject("success", resourceCulture); 99 | return ((System.Drawing.Bitmap)(obj)); 100 | } 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /tools/WdfTracer/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\symbol_error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\Resources\symbol_error_gray.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | 128 | ..\Resources\error_do_not.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 129 | 130 | 131 | ..\Resources\camera_test.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 132 | 133 | -------------------------------------------------------------------------------- /tools/WdfTracer/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WdfTracer.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tools/WdfTracer/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/camera_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/camera_test.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/error_do_not.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/error_do_not.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/netbeans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/netbeans.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/netbeans_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/netbeans_gray.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/symbol_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/symbol_error.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/symbol_error_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/symbol_error_gray.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/ultraedit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/ultraedit.png -------------------------------------------------------------------------------- /tools/WdfTracer/Resources/ultraedit_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/Resources/ultraedit_gray.png -------------------------------------------------------------------------------- /tools/WdfTracer/SourceViewer.cs: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) 2007-2012 PamConsult GmbH 5 | * Copyright (c) since 2013 Scavix Software Ltd. & Co. KG 6 | * 7 | * This library is free software; you can redistribute it 8 | * and/or modify it under the terms of the GNU Lesser General 9 | * Public License as published by the Free Software Foundation; 10 | * either version 3 of the License, or (at your option) any 11 | * later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 | * Lesser General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Lesser General Public 19 | * License along with this library. If not, see 20 | * 21 | * @author PamConsult GmbH http://www.pamconsult.com 22 | * @copyright 2007-2012 PamConsult GmbH 23 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 24 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 25 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 26 | */ 27 | using System; 28 | using System.Collections.Generic; 29 | using System.Linq; 30 | using System.Text; 31 | using System.Drawing; 32 | using Microsoft.Win32; 33 | using System.IO; 34 | using System.Windows.Forms; 35 | using System.Diagnostics; 36 | using System.Runtime.InteropServices; 37 | using System.Threading; 38 | using System.Drawing.IconLib; 39 | 40 | namespace WdfTracer 41 | { 42 | internal class SourceViewer 43 | { 44 | private string argPat = "{file}"; 45 | 46 | public string Alias { get; set; } 47 | public string Name { get; set; } 48 | public string ArgumentPattern { get { return argPat; } set { argPat = value; } } 49 | public string ExeSearchName { get; set; } 50 | public string Executable { get; set; } 51 | public int IdleBeforeLineMark { get; set; } 52 | public bool SeemsNotInstalled = false; 53 | public int Nummer { get; set; } 54 | public Image Image 55 | { 56 | get 57 | { 58 | if (IsReady()) 59 | { 60 | try 61 | { 62 | string iconfile = Path.Combine(Application.UserAppDataPath, Alias + ".ico"); 63 | if (!File.Exists(iconfile)) 64 | { 65 | FileStream icon = File.Create(iconfile); 66 | MultiIcon mIcon = new MultiIcon(); 67 | mIcon.Load(Executable); 68 | foreach (SingleIcon si in mIcon) 69 | { 70 | si.Icon.Save(icon); 71 | } 72 | icon.Flush(); 73 | icon.Close(); 74 | } 75 | Icon i = new Icon(iconfile); 76 | return i.ToBitmap(); 77 | } catch (Exception e) 78 | { 79 | return null; 80 | } 81 | } 82 | return null; 83 | } 84 | } 85 | internal int[] Bubble(int[] a) 86 | { 87 | int swap = 0; 88 | for (int runs = 0; runs < a.Length; runs++) 89 | { 90 | for (int sort = 0; sort < a.Length - 1; sort++) 91 | { 92 | if (a[sort] > a[sort + 1]) 93 | { 94 | swap = a[sort + 1]; 95 | a[sort + 1] = a[sort]; 96 | a[sort] = swap; 97 | } 98 | } 99 | } 100 | return a; 101 | } 102 | internal void DeleteIcon() 103 | { 104 | string iconfile = Path.Combine(Application.UserAppDataPath, Alias + ".ico"); 105 | File.Delete(Path.GetFullPath(iconfile)); 106 | } 107 | internal void Save(RegistryKey settings) 108 | { 109 | RegistryKey key = settings.CreateSubKey(Alias); 110 | key.SetValue("Name", (Name == null) ? "": Name, RegistryValueKind.String); 111 | key.SetValue("ExeSearchName", (ExeSearchName == null) ? "": ExeSearchName, RegistryValueKind.String); 112 | key.SetValue("Executable", (Executable == null) ? "" : Executable, RegistryValueKind.String); 113 | key.SetValue("ArgumentPattern", (ArgumentPattern == null) ? "" : ArgumentPattern, RegistryValueKind.String); 114 | key.SetValue("Nummer", Nummer, RegistryValueKind.DWord); 115 | if (IdleBeforeLineMark == 0) 116 | IdleBeforeLineMark = 500; 117 | key.SetValue("IdleBeforeLineMark", IdleBeforeLineMark, RegistryValueKind.DWord); 118 | } 119 | 120 | internal void Delete(RegistryKey settings) 121 | { 122 | if (settings.GetSubKeyNames().Contains(Alias)) 123 | settings.DeleteSubKey(Alias); 124 | } 125 | 126 | internal bool IsReady() 127 | { 128 | return Executable != null && File.Exists(Executable); 129 | } 130 | 131 | [DllImport("user32.dll")] 132 | private static extern bool SetForegroundWindow(IntPtr hWnd); 133 | 134 | internal bool Run(string file, int line) 135 | { 136 | if (!IsReady()) 137 | { 138 | Program.Log(Name + " executable not yet found."); 139 | return false; 140 | } 141 | string args = ArgumentPattern.Replace("{file}", file).Replace("{line}", line.ToString()); 142 | Process p = Process.Start(Executable,args); 143 | if (IdleBeforeLineMark > 0) 144 | { 145 | SetForegroundWindow(p.MainWindowHandle); 146 | Thread.Sleep(IdleBeforeLineMark); 147 | SendKeys.Send("+{DOWN}"); 148 | } 149 | return true; 150 | } 151 | 152 | public override bool Equals(object obj) 153 | { 154 | if (obj is SourceViewer && (obj as SourceViewer).Alias == Alias) 155 | return true; 156 | return false; 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /tools/WdfTracer/WdfTracer.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | x86 6 | 8.0.30703 7 | 2.0 8 | {E472D2A4-89C9-40A5-8920-30BEBE97B5A2} 9 | WinExe 10 | Properties 11 | WdfTracer 12 | WdfTracer 13 | v4.6.1 14 | 15 | 16 | 512 17 | false 18 | publish\ 19 | true 20 | Disk 21 | false 22 | Foreground 23 | 7 24 | Days 25 | false 26 | false 27 | true 28 | 0 29 | 1.0.0.%2a 30 | false 31 | true 32 | 33 | 34 | x86 35 | true 36 | full 37 | false 38 | bin\Debug\ 39 | DEBUG;TRACE 40 | prompt 41 | 4 42 | false 43 | 44 | 45 | x86 46 | pdbonly 47 | true 48 | bin\Release\ 49 | TRACE 50 | prompt 51 | 4 52 | false 53 | 54 | 55 | bug_buddy.ico 56 | 57 | 58 | 59 | .\IconLib.dll 60 | 61 | 62 | 63 | .\Newtonsoft.Json.dll 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | Form 79 | 80 | 81 | Form1.cs 82 | 83 | 84 | Form 85 | 86 | 87 | Form2.cs 88 | 89 | 90 | 91 | UserControl 92 | 93 | 94 | LogView.cs 95 | 96 | 97 | 98 | 99 | UserControl 100 | 101 | 102 | ProgressOverlay.cs 103 | 104 | 105 | 106 | 107 | Form1.cs 108 | 109 | 110 | Form2.cs 111 | 112 | 113 | LogView.cs 114 | 115 | 116 | ProgressOverlay.cs 117 | 118 | 119 | ResXFileCodeGenerator 120 | Resources.Designer.cs 121 | Designer 122 | 123 | 124 | True 125 | Resources.resx 126 | True 127 | 128 | 129 | 130 | SettingsSingleFileGenerator 131 | Settings.Designer.cs 132 | 133 | 134 | True 135 | Settings.settings 136 | True 137 | 138 | 139 | PreserveNewest 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | False 156 | Microsoft .NET Framework 4 %28x86 and x64%29 157 | true 158 | 159 | 160 | False 161 | .NET Framework 3.5 SP1 Client Profile 162 | false 163 | 164 | 165 | False 166 | .NET Framework 3.5 SP1 167 | false 168 | 169 | 170 | False 171 | Windows Installer 4.5 172 | true 173 | 174 | 175 | 176 | 183 | -------------------------------------------------------------------------------- /tools/WdfTracer/WdfTracer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Express 2012 for Windows Desktop 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WdfTracer", "WdfTracer.csproj", "{E472D2A4-89C9-40A5-8920-30BEBE97B5A2}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x86 = Debug|x86 9 | Release|x86 = Release|x86 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {E472D2A4-89C9-40A5-8920-30BEBE97B5A2}.Debug|x86.ActiveCfg = Debug|x86 13 | {E472D2A4-89C9-40A5-8920-30BEBE97B5A2}.Debug|x86.Build.0 = Debug|x86 14 | {E472D2A4-89C9-40A5-8920-30BEBE97B5A2}.Release|x86.ActiveCfg = Release|x86 15 | {E472D2A4-89C9-40A5-8920-30BEBE97B5A2}.Release|x86.Build.0 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /tools/WdfTracer/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tools/WdfTracer/bug_buddy.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/tools/WdfTracer/bug_buddy.ico -------------------------------------------------------------------------------- /tools/WdfTracer/textline.patterns: -------------------------------------------------------------------------------- 1 | \[(?\d{4})-(?\d{2})-(?\d{2})\x20(?\d{2}):(?\d{2}):(?\d{2})[^\]]*\]\x20\[(?[^\]]*)\]\x20\((?[^\)]*)\)\t(?.*) 2 | ^\[[a-z\s-:,]*(?\d{2})-(?[a-z]{3})-(?\d{4})\x20(?\d{2}):(?\d{2}):(?\d{2})[^\]]*\]\s(?.*) 3 | ^\[(?[^\]]+)\]\s(?.*) 4 | ^\[\d+\]\[(?[^\]]+)\]\((?[^\)]*)\)\s(?.*) 5 | -------------------------------------------------------------------------------- /tools/build/README.md: -------------------------------------------------------------------------------- 1 | Build process 2 | ============= 3 | 4 | The Scavix Software Web Development Framework can be packed as PHAR. 5 | Usage is simple, just replace the plain include with one referencing the PHAR: 6 | ```php 7 | // old/normal style 8 | require_once("/path/to/scavix-wdf/system.php"); 9 | 10 | // new/PHAR style 11 | require('phar:///path/to/scavix-wdf.phar/system.php'); 12 | ``` 13 | 14 | This is done from within Visual Studio Code by pressing STRG+Shift+B (aka run the build task). 15 | 16 | Output will be placeed into the `tools` folder. -------------------------------------------------------------------------------- /tools/build/build.php: -------------------------------------------------------------------------------- 1 | current()->getPathname(),'.git') === false; 29 | } 30 | } 31 | 32 | @unlink("$dstPath/$pharname"); 33 | $phar = new Phar("$dstPath/$pharname",0, "scavix-wdf.phar"); 34 | 35 | $objects = new RecursiveDirectoryIterator($srcRoot,FilesystemIterator::SKIP_DOTS); 36 | $objects = new StripFilesFilter($objects); 37 | $objects = new RecursiveIteratorIterator($objects); 38 | $phar->buildFromIterator($objects,$srcRoot); 39 | $phar->addFromString('VERSION',"$version\n$creation\n$branch"); 40 | //$phar->addFile(__DIR__.'/stub-cli.php', 'stub-cli.php'); 41 | $phar->setStub("#!/usr/bin/env php" .PHP_EOL.$phar->createDefaultStub('cli.php','')); 42 | -------------------------------------------------------------------------------- /tools/build/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | engine = On 3 | short_open_tag = Off 4 | asp_tags = Off 5 | precision = 14 6 | output_buffering = 4096 7 | zlib.output_compression = Off 8 | implicit_flush = Off 9 | unserialize_callback_func = 10 | serialize_precision = 17 11 | disable_functions = 12 | disable_classes = 13 | zend.enable_gc = On 14 | expose_php = On 15 | max_execution_time = 30 16 | max_input_time = 60 17 | memory_limit = 1G 18 | error_reporting = E_ALL 19 | display_errors = On 20 | display_startup_errors = On 21 | log_errors = On 22 | log_errors_max_len = 1024 23 | ignore_repeated_errors = Off 24 | ignore_repeated_source = Off 25 | report_memleaks = On 26 | html_errors = On 27 | variables_order = "GPCS" 28 | request_order = "GP" 29 | register_argc_argv = Off 30 | auto_globals_jit = On 31 | post_max_size = 8M 32 | auto_prepend_file = 33 | auto_append_file = 34 | default_mimetype = "text/html" 35 | doc_root = 36 | user_dir = 37 | enable_dl = Off 38 | file_uploads = On 39 | upload_max_filesize = 2M 40 | max_file_uploads = 20 41 | allow_url_fopen = On 42 | allow_url_include = Off 43 | default_socket_timeout = 60 44 | [CLI Server] 45 | cli_server.color = On 46 | [Date] 47 | [filter] 48 | [iconv] 49 | [intl] 50 | [sqlite] 51 | [sqlite3] 52 | [Pcre] 53 | [Pdo] 54 | [Pdo_mysql] 55 | pdo_mysql.cache_size = 2000 56 | pdo_mysql.default_socket= 57 | [Phar] 58 | phar.readonly = 0 59 | [mail function] 60 | SMTP = localhost 61 | smtp_port = 25 62 | mail.add_x_header = On 63 | [SQL] 64 | sql.safe_mode = Off 65 | [ODBC] 66 | odbc.allow_persistent = On 67 | odbc.check_persistent = On 68 | odbc.max_persistent = -1 69 | odbc.max_links = -1 70 | odbc.defaultlrl = 4096 71 | odbc.defaultbinmode = 1 72 | [Interbase] 73 | ibase.allow_persistent = 1 74 | ibase.max_persistent = -1 75 | ibase.max_links = -1 76 | ibase.timestampformat = "%Y-%m-%d %H:%M:%S" 77 | ibase.dateformat = "%Y-%m-%d" 78 | ibase.timeformat = "%H:%M:%S" 79 | [MySQL] 80 | mysql.allow_local_infile = On 81 | mysql.allow_persistent = On 82 | mysql.cache_size = 2000 83 | mysql.max_persistent = -1 84 | mysql.max_links = -1 85 | mysql.default_port = 86 | mysql.default_socket = 87 | mysql.default_host = 88 | mysql.default_user = 89 | mysql.default_password = 90 | mysql.connect_timeout = 60 91 | mysql.trace_mode = Off 92 | [MySQLi] 93 | mysqli.max_persistent = -1 94 | mysqli.allow_persistent = On 95 | mysqli.max_links = -1 96 | mysqli.cache_size = 2000 97 | mysqli.default_port = 3306 98 | mysqli.default_socket = 99 | mysqli.default_host = 100 | mysqli.default_user = 101 | mysqli.default_pw = 102 | mysqli.reconnect = Off 103 | [mysqlnd] 104 | mysqlnd.collect_statistics = On 105 | mysqlnd.collect_memory_statistics = On 106 | [OCI8] 107 | [PostgreSQL] 108 | pgsql.allow_persistent = On 109 | pgsql.auto_reset_persistent = Off 110 | pgsql.max_persistent = -1 111 | pgsql.max_links = -1 112 | pgsql.ignore_notice = 0 113 | pgsql.log_notice = 0 114 | [Sybase-CT] 115 | sybct.allow_persistent = On 116 | sybct.max_persistent = -1 117 | sybct.max_links = -1 118 | sybct.min_server_severity = 10 119 | sybct.min_client_severity = 10 120 | [bcmath] 121 | bcmath.scale = 0 122 | [browscap] 123 | [Session] 124 | session.save_handler = files 125 | session.use_strict_mode = 0 126 | session.use_cookies = 1 127 | session.use_only_cookies = 1 128 | session.name = PHPSESSID 129 | session.auto_start = 0 130 | session.cookie_lifetime = 0 131 | session.cookie_path = / 132 | session.cookie_domain = 133 | session.cookie_httponly = 134 | session.serialize_handler = php 135 | session.gc_probability = 1 136 | session.gc_divisor = 1000 137 | session.gc_maxlifetime = 1440 138 | session.bug_compat_42 = On 139 | session.bug_compat_warn = On 140 | session.referer_check = 141 | session.cache_limiter = nocache 142 | session.cache_expire = 180 143 | session.use_trans_sid = 0 144 | session.hash_function = 0 145 | session.hash_bits_per_character = 5 146 | url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" 147 | [MSSQL] 148 | mssql.allow_persistent = On 149 | mssql.max_persistent = -1 150 | mssql.max_links = -1 151 | mssql.min_error_severity = 10 152 | mssql.min_message_severity = 10 153 | mssql.compatibility_mode = Off 154 | mssql.secure_connection = Off 155 | [Assertion] 156 | [COM] 157 | [mbstring] 158 | [gd] 159 | [exif] 160 | [Tidy] 161 | tidy.clean_output = Off 162 | [soap] 163 | soap.wsdl_cache_enabled=1 164 | soap.wsdl_cache_dir="/tmp" 165 | soap.wsdl_cache_ttl=86400 166 | soap.wsdl_cache_limit = 5 167 | [sysvshm] 168 | [ldap] 169 | ldap.max_links = -1 170 | [mcrypt] 171 | [dba] 172 | [opcache] 173 | [curl] 174 | -------------------------------------------------------------------------------- /web/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Build PHAR", 8 | "type": "shell", 9 | "group": "build", 10 | "command": "php -c ${workspaceFolder}/../tools/build/php.ini ${workspaceFolder}/../tools/build/build.php", 11 | "presentation": { 12 | "reveal": "silent", 13 | "close": true 14 | } 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /web/documentor/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine On 3 | 4 | # redirect NoCache files to the real ones 5 | SetEnv WDF_FEATURES_NOCACHE on 6 | RewriteRule (.*)/nc([0-9]+)/(.*) $1/$3?_nc=$2 [L,QSA] 7 | 8 | # redirect inexistant requests to index.php 9 | SetEnv WDF_FEATURES_REWRITE on 10 | RewriteCond %{REQUEST_FILENAME} !-f 11 | RewriteCond %{REQUEST_FILENAME} !-d 12 | RewriteCond %{REQUEST_URI} !index.php 13 | RewriteRule (.*) index.php?wdf_route=$1 [L,QSA] 14 | -------------------------------------------------------------------------------- /web/documentor/config.php: -------------------------------------------------------------------------------- 1 | array 19 | ( 20 | 'class' => 'TraceLogger', 21 | 'path' => __DIR__.'/../logs/', 22 | 'filename_pattern' => 'doc_wdf.trace', 23 | 'log_severity' => true, 24 | 'max_trace_depth' => 2, 25 | 'max_filesize' => 10*1024*1024, 26 | 'keep_for_days' => 4, 27 | ), 28 | ); 29 | 30 | // Resources config 31 | $CONFIG['resources'][] = array 32 | ( 33 | 'ext' => 'js|css|png|jpg|jpeg|gif|htc|ico', 34 | 'path' => realpath(__DIR__.'/res/'), 35 | 'url' => 'res/', 36 | 'append_nc' => true, 37 | ); 38 | // If you put WDF into a separate folder next to the app (like here), that folder must be externaly accessible. 39 | // So maybe you'll have to set up a subdomain for it and set that to 'resources_system_url_root'. 40 | // For now we just rely on the built in router that will output the resource contents via readfile(). 41 | $CONFIG['resources_system_url_root'] = false; 42 | //$CONFIG['resources_system_url_root'] = 'http://wdf.domain.com/'; // <- sample 43 | 44 | // some essentials 45 | $CONFIG['system']['modules'] = array('curlwrapper'); 46 | date_default_timezone_set("Europe/Berlin"); 47 | 48 | $CONFIG['system']['admin']['enabled'] = true; 49 | $CONFIG['system']['admin']['username'] = 'admin'; 50 | $CONFIG['system']['admin']['password'] = 'admin'; 51 | -------------------------------------------------------------------------------- /web/documentor/controller/preview.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | use ScavixWDF\Base\HtmlPage; 27 | 28 | /** 29 | * @attribute[Resource('marked.js')] 30 | */ 31 | class Preview extends HtmlPage 32 | { 33 | function Init() 34 | { 35 | $this->Linked(false); 36 | } 37 | 38 | /** 39 | * @attribute[RequestParam('f','string')] 40 | */ 41 | function Linked($f) 42 | { 43 | if( $f ) 44 | $md = file_get_contents(__DIR__."/out/$f.md"); 45 | else 46 | $md = "# Scavix WDF Home 47 | - [Alphabetical function listing](functions) 48 | - [Alphabetical class listing](classes) 49 | - [Inheritance tree](inheritance) 50 | - [Interfaces](interfaces) 51 | - [Folder tree](foldertree) 52 | - [Namespace tree](namespacetree)"; 53 | 54 | $q = buildQuery('Preview','Linked'); 55 | $q .= strpos($q,"?")===false?"?":"&"; 56 | $s = "$('.markdown-body').html(marked(".json_encode($md)."));"; 57 | $s .= "$('.markdown-body a[id]').each(function(){ $(this).attr('id','wiki-'+$(this).attr('id')); });"; 58 | $s .= "$('.markdown-body a[href]').each(function(){ if( $(this).attr('href').match(/^http/)) return; $(this).attr('href','{$q}f='+$(this).attr('href')); });"; 59 | $s .= "$('.markdown-body a[id='+location.hash.substr(1)+']').get(0).scrollIntoView();"; 60 | 61 | $this->addDocReady("$s"); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /web/documentor/controller/preview.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 | Back 28 |     29 | Close preview 30 |
31 |
32 | Functions 33 |    34 | Classes 35 |    36 | Inheritance 37 |    38 | Interfaces 39 |    40 | Folder tree 41 |    42 | Namespace tree 43 |
44 |
45 | 46 |
-------------------------------------------------------------------------------- /web/documentor/index.php: -------------------------------------------------------------------------------- 1 | 19 | * 20 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 21 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 22 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | */ 24 | 25 | * 26 | { 27 | font-family: 'Courier New',Courier,monospace; 28 | } 29 | 30 | .summary 31 | { 32 | border: 2px solid red; 33 | padding: 25px; 34 | font-size: 16px; 35 | } 36 | 37 | .file 38 | { 39 | font-size: 16px; 40 | } 41 | 42 | .status 43 | { 44 | font-size: 14px; 45 | padding-left: 15px; 46 | } 47 | 48 | .warn 49 | { 50 | color: darkgray; 51 | font-size: 12px; 52 | padding-left: 30px; 53 | } -------------------------------------------------------------------------------- /web/documentor/res/preview.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) since 2012 Scavix Software Ltd. & Co. KG 5 | * 6 | * This library is free software; you can redistribute it 7 | * and/or modify it under the terms of the GNU Lesser General 8 | * Public License as published by the Free Software Foundation; 9 | * either version 3 of the License, or (at your option) any 10 | * later version. 11 | * 12 | * This library is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | * Lesser General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Lesser General Public 18 | * License along with this library. If not, see 19 | * 20 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 21 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 22 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | */ 24 | 25 | 26 | body, input, select, textarea, button { 27 | font: 13px/1.4 Helvetica,arial,freesans,clean,sans-serif; 28 | } 29 | body { 30 | background-color: #cccccc; 31 | color: #333333; 32 | } 33 | a { 34 | color: #4183C4; 35 | text-decoration: none; 36 | } 37 | 38 | /* markdown related */ 39 | 40 | .markdown-body { 41 | background-color: #FFFFFF; 42 | margin: 0 auto; 43 | width: 920px; 44 | } 45 | 46 | /* markdown as in github */ 47 | 48 | .markdown-body { 49 | font-size: 14px; 50 | line-height: 1.6; 51 | overflow: hidden; 52 | } 53 | .markdown-body > *:first-child { 54 | margin-top: 0 !important; 55 | } 56 | .markdown-body > *:last-child { 57 | margin-bottom: 0 !important; 58 | } 59 | .markdown-body a.absent { 60 | color: #CC0000; 61 | } 62 | .markdown-body a.anchor { 63 | bottom: 0; 64 | cursor: pointer; 65 | display: block; 66 | left: 0; 67 | margin-left: -30px; 68 | padding-left: 30px; 69 | position: absolute; 70 | top: 0; 71 | } 72 | .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { 73 | cursor: text; 74 | font-weight: bold; 75 | margin: 20px 0 10px; 76 | padding: 0; 77 | position: relative; 78 | } 79 | .markdown-body h1 .mini-icon-link, .markdown-body h2 .mini-icon-link, .markdown-body h3 .mini-icon-link, .markdown-body h4 .mini-icon-link, .markdown-body h5 .mini-icon-link, .markdown-body h6 .mini-icon-link { 80 | color: #000000; 81 | display: none; 82 | } 83 | .markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor { 84 | line-height: 1; 85 | margin-left: -22px; 86 | padding-left: 0; 87 | text-decoration: none; 88 | top: 15%; 89 | } 90 | .markdown-body h1:hover a.anchor .mini-icon-link, .markdown-body h2:hover a.anchor .mini-icon-link, .markdown-body h3:hover a.anchor .mini-icon-link, .markdown-body h4:hover a.anchor .mini-icon-link, .markdown-body h5:hover a.anchor .mini-icon-link, .markdown-body h6:hover a.anchor .mini-icon-link { 91 | display: inline-block; 92 | } 93 | .markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code { 94 | font-size: inherit; 95 | } 96 | .markdown-body h1 { 97 | color: #000000; 98 | font-size: 28px; 99 | } 100 | .markdown-body h2 { 101 | border-bottom: 1px solid #CCCCCC; 102 | color: #000000; 103 | font-size: 24px; 104 | } 105 | .markdown-body h3 { 106 | font-size: 18px; 107 | } 108 | .markdown-body h4 { 109 | font-size: 16px; 110 | } 111 | .markdown-body h5 { 112 | font-size: 14px; 113 | } 114 | .markdown-body h6 { 115 | color: #777777; 116 | font-size: 14px; 117 | } 118 | .markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { 119 | margin: 15px 0; 120 | } 121 | .markdown-body hr { 122 | background: url("https://a248.e.akamai.net/assets.github.com/assets/primer/markdown/dirty-shade-6ead57f83b0f117a80ba77232aff0673bfd71263.png") repeat-x scroll 0 0 transparent; 123 | border: 0 none; 124 | color: #CCCCCC; 125 | height: 4px; 126 | padding: 0; 127 | } 128 | .markdown-body > h2:first-child, .markdown-body > h1:first-child, .markdown-body > h1:first-child + h2, .markdown-body > h3:first-child, .markdown-body > h4:first-child, .markdown-body > h5:first-child, .markdown-body > h6:first-child { 129 | margin-top: 0; 130 | padding-top: 0; 131 | } 132 | .markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 { 133 | margin-top: 0; 134 | padding-top: 0; 135 | } 136 | .markdown-body h1 + p, .markdown-body h2 + p, .markdown-body h3 + p, .markdown-body h4 + p, .markdown-body h5 + p, .markdown-body h6 + p { 137 | margin-top: 0; 138 | } 139 | .markdown-body li p.first { 140 | display: inline-block; 141 | } 142 | .markdown-body ul, .markdown-body ol { 143 | padding-left: 30px; 144 | } 145 | .markdown-body ul.no-list, .markdown-body ol.no-list { 146 | list-style-type: none; 147 | padding: 0; 148 | } 149 | .markdown-body ul li > *:first-child, .markdown-body ul li ul:first-of-type, .markdown-body ol li > *:first-child, .markdown-body ol li ul:first-of-type { 150 | margin-top: 0; 151 | } 152 | .markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul { 153 | margin-bottom: 0; 154 | } 155 | .markdown-body dl { 156 | padding: 0; 157 | } 158 | .markdown-body dl dt { 159 | font-size: 14px; 160 | font-style: italic; 161 | font-weight: bold; 162 | margin: 15px 0 5px; 163 | padding: 0; 164 | } 165 | .markdown-body dl dt:first-child { 166 | padding: 0; 167 | } 168 | .markdown-body dl dt > *:first-child { 169 | margin-top: 0; 170 | } 171 | .markdown-body dl dt > *:last-child { 172 | margin-bottom: 0; 173 | } 174 | .markdown-body dl dd { 175 | margin: 0 0 15px; 176 | padding: 0 15px; 177 | } 178 | .markdown-body dl dd > *:first-child { 179 | margin-top: 0; 180 | } 181 | .markdown-body dl dd > *:last-child { 182 | margin-bottom: 0; 183 | } 184 | .markdown-body blockquote { 185 | border-left: 4px solid #DDDDDD; 186 | color: #777777; 187 | padding: 0 15px; 188 | } 189 | .markdown-body blockquote > *:first-child { 190 | margin-top: 0; 191 | } 192 | .markdown-body blockquote > *:last-child { 193 | margin-bottom: 0; 194 | } 195 | .markdown-body table th { 196 | font-weight: bold; 197 | } 198 | .markdown-body table th, .markdown-body table td { 199 | border: 1px solid #CCCCCC; 200 | padding: 6px 13px; 201 | } 202 | .markdown-body table tr { 203 | background-color: #FFFFFF; 204 | border-top: 1px solid #CCCCCC; 205 | } 206 | .markdown-body table tr:nth-child(2n) { 207 | background-color: #F8F8F8; 208 | } 209 | .markdown-body img { 210 | -moz-box-sizing: border-box; 211 | max-width: 100%; 212 | } 213 | .markdown-body span.frame { 214 | display: block; 215 | overflow: hidden; 216 | } 217 | .markdown-body span.frame > span { 218 | border: 1px solid #DDDDDD; 219 | display: block; 220 | float: left; 221 | margin: 13px 0 0; 222 | overflow: hidden; 223 | padding: 7px; 224 | width: auto; 225 | } 226 | .markdown-body span.frame span img { 227 | display: block; 228 | float: left; 229 | } 230 | .markdown-body span.frame span span { 231 | clear: both; 232 | color: #333333; 233 | display: block; 234 | padding: 5px 0 0; 235 | } 236 | .markdown-body span.align-center { 237 | clear: both; 238 | display: block; 239 | overflow: hidden; 240 | } 241 | .markdown-body span.align-center > span { 242 | display: block; 243 | margin: 13px auto 0; 244 | overflow: hidden; 245 | text-align: center; 246 | } 247 | .markdown-body span.align-center span img { 248 | margin: 0 auto; 249 | text-align: center; 250 | } 251 | .markdown-body span.align-right { 252 | clear: both; 253 | display: block; 254 | overflow: hidden; 255 | } 256 | .markdown-body span.align-right > span { 257 | display: block; 258 | margin: 13px 0 0; 259 | overflow: hidden; 260 | text-align: right; 261 | } 262 | .markdown-body span.align-right span img { 263 | margin: 0; 264 | text-align: right; 265 | } 266 | .markdown-body span.float-left { 267 | display: block; 268 | float: left; 269 | margin-right: 13px; 270 | overflow: hidden; 271 | } 272 | .markdown-body span.float-left span { 273 | margin: 13px 0 0; 274 | } 275 | .markdown-body span.float-right { 276 | display: block; 277 | float: right; 278 | margin-left: 13px; 279 | overflow: hidden; 280 | } 281 | .markdown-body span.float-right > span { 282 | display: block; 283 | margin: 13px auto 0; 284 | overflow: hidden; 285 | text-align: right; 286 | } 287 | .markdown-body code, .markdown-body tt { 288 | background-color: #F8F8F8; 289 | border: 1px solid #EAEAEA; 290 | border-radius: 3px 3px 3px 3px; 291 | margin: 0 2px; 292 | padding: 0 5px; 293 | } 294 | .markdown-body code { 295 | white-space: nowrap; 296 | } 297 | .markdown-body pre > code { 298 | background: none repeat scroll 0 0 transparent; 299 | border: medium none; 300 | margin: 0; 301 | padding: 0; 302 | white-space: pre; 303 | } 304 | .markdown-body .highlight pre, .markdown-body pre { 305 | background-color: #F8F8F8; 306 | border: 1px solid #CCCCCC; 307 | border-radius: 3px 3px 3px 3px; 308 | font-size: 13px; 309 | line-height: 19px; 310 | overflow: auto; 311 | padding: 6px 10px; 312 | } 313 | .markdown-body pre code, .markdown-body pre tt { 314 | background-color: transparent; 315 | border: medium none; 316 | margin: 0; 317 | padding: 0; 318 | } 319 | -------------------------------------------------------------------------------- /web/documentor/templates/intro.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |

WebFramework Documentor

27 |

28 | This is a tool to create documentation from DocComments in the WebFramework sourcecode. 29 | We use it to automate and speed up things - and it will constantly remind us of missing documentation. 30 | It will create a bunch of cross-linked markdown files that we push to the WebFramework.wiki repository 31 | thus using the standard GitHub mechanism for our documentation. 32 |

33 |
-------------------------------------------------------------------------------- /web/logs/.htaccess: -------------------------------------------------------------------------------- 1 | Deny from all 2 | -------------------------------------------------------------------------------- /web/sample_blog/.htaccess: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------------------- 2 | # Scavix Web Development Framework 3 | # 4 | # Copyright (c) since 2012 Scavix Software Ltd. & Co. KG 5 | # 6 | # This library is free software; you can redistribute it 7 | # and/or modify it under the terms of the GNU Lesser General 8 | # Public License as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any 10 | # later version. 11 | # 12 | # This library is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | # Lesser General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Lesser General Public 18 | # License along with this library. If not, see 19 | # 20 | # @author Scavix Software Ltd. & Co. KG http://www.scavix.com 21 | # @copyright since 2012 Scavix Software Ltd. & Co. KG 22 | # @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | # ---------------------------------------------------------------------------------------- 24 | 25 | RewriteEngine On 26 | 27 | # redirect NoCache files to the real ones 28 | SetEnv WDF_FEATURES_NOCACHE on 29 | RewriteRule (.*)/nc([0-9]+)/(.*) $1/$3?_nc=$2 [L,QSA] 30 | 31 | # redirect inexistant requests to index.php 32 | SetEnv WDF_FEATURES_REWRITE on 33 | RewriteCond %{REQUEST_FILENAME} !-f 34 | RewriteCond %{REQUEST_FILENAME} !-d 35 | RewriteCond %{REQUEST_URI} !index.php 36 | RewriteRule (.*) index.php?wdf_route=$1 [L,QSA] 37 | -------------------------------------------------------------------------------- /web/sample_blog/README.md: -------------------------------------------------------------------------------- 1 | Blog sample 2 | =========== 3 | 4 | This is the sample code used in the article describing the WebFramework basics: 5 | [Ultra-Rapid PHP Application Development](http://www.codeproject.com/Articles/553018/Ultra-Rapid-PHP-Application-Development) 6 | -------------------------------------------------------------------------------- /web/sample_blog/config.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | // Pages are PHP classes extending HtmlPage 27 | $CONFIG['system']['default_page'] = "Blog"; 28 | // Events are mapped to PHP class methods 29 | $CONFIG['system']['default_event'] = "Index"; 30 | 31 | // Application specific classpath 32 | classpath_add(__DIR__.'/controller'); 33 | classpath_add(__DIR__.'/templates'); 34 | 35 | // Database connection, a DSN passed to the PDO constructor 36 | $CONFIG['model']['system']['connection_string'] = "sqlite:../blog.db"; 37 | $CONFIG['model']['system']['default'] = true; 38 | 39 | // Logger Config 40 | ini_set("error_log", __DIR__.'/../logs/blog_php_error.log'); 41 | $CONFIG['system']['logging'] = array 42 | ( 43 | 'human_readable' => array 44 | ( 45 | 'path' => __DIR__.'/../logs/', 46 | 'filename_pattern' => 'blog_wdf.log', 47 | 'log_severity' => true, 48 | 'max_filesize' => 10*1024*1024, 49 | 'keep_for_days' => 5, 50 | 'max_trace_depth' => 16, 51 | ), 52 | 'full_trace' => array 53 | ( 54 | 'class' => 'TraceLogger', 55 | 'path' => __DIR__.'/../logs/', 56 | 'filename_pattern' => 'blog_wdf.trace', 57 | 'log_severity' => true, 58 | 'max_trace_depth' => 10, 59 | 'max_filesize' => 10*1024*1024, 60 | 'keep_for_days' => 4, 61 | ), 62 | ); 63 | 64 | // Resources config 65 | $CONFIG['resources'][] = array 66 | ( 67 | 'ext' => 'js|css|less|png|jpg|jpeg|gif|htc|ico', 68 | 'path' => realpath(__DIR__.'/res/'), 69 | 'url' => 'res/', 70 | 'append_nc' => true, 71 | ); 72 | // If you put WDF into a separate folder next to the app (like here), that folder must be externaly accessible. 73 | // So maybe you'll have to set up a subdomain for it and set that to 'resources_system_url_root'. 74 | // For now we just rely on the built in router that will output the resource contents via readfile(). 75 | $CONFIG['resources_system_url_root'] = false; 76 | //$CONFIG['resources_system_url_root'] = 'http://wdf.domain.com/'; // <- sample 77 | 78 | // some essentials 79 | $CONFIG['system']['modules'] = array(); 80 | date_default_timezone_set("Europe/Berlin"); 81 | -------------------------------------------------------------------------------- /web/sample_blog/controller/blog.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | use ScavixWDF\Base\HtmlPage; 27 | use ScavixWDF\Base\Template; 28 | use ScavixWDF\Controls\Anchor; 29 | 30 | class Blog extends HtmlPage 31 | { 32 | function __construct() 33 | { 34 | parent::__construct(); 35 | $ds = model_datasource('system'); 36 | $ds->ExecuteSql("CREATE TABLE IF NOT EXISTS blog(id INTEGER,title VARCHAR(50),body TEXT,PRIMARY KEY(id))"); 37 | 38 | $this->content(new Anchor( buildQuery('blog','newpost'), 'New post' )); 39 | } 40 | 41 | function Index() 42 | { 43 | $ds = model_datasource('system'); 44 | foreach( $ds->Query('blog')->orderBy('id','desc') as $post ) 45 | { 46 | $tpl = Template::Make('post') 47 | ->set('title',$post->title) 48 | ->set('body',$post->body); 49 | $this->content($tpl); 50 | } 51 | } 52 | 53 | function NewPost() 54 | { 55 | log_debug("New Post"); 56 | $this->content( Template::Make('newpostform') ); 57 | } 58 | 59 | /** 60 | * @attribute[RequestParam('title','string')] 61 | * @attribute[RequestParam('body','string')] 62 | */ 63 | function AddPost($title,$body) 64 | { 65 | log_debug("Add Post"); 66 | $ds = model_datasource('system'); 67 | $ds->ExecuteSql("INSERT INTO blog(title,body)VALUES(?,?)",array($title,$body)); 68 | redirect('blog','index'); 69 | } 70 | } -------------------------------------------------------------------------------- /web/sample_blog/index.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | require_once(__DIR__."/../system/system.php"); 26 | 27 | switchToDev(); 28 | system_init('blog'); 29 | 30 | if( isset($_GET['clear']) ) 31 | { 32 | cache_clear(); 33 | $_SESSION = array(); 34 | } 35 | 36 | system_execute(); 37 | -------------------------------------------------------------------------------- /web/sample_blog/res/blog.less: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) since 2024 Scavix Software GmbH & Co. KG 5 | * 6 | * This library is free software; you can redistribute it 7 | * and/or modify it under the terms of the GNU Lesser General 8 | * Public License as published by the Free Software Foundation; 9 | * either version 3 of the License, or (at your option) any 10 | * later version. 11 | * 12 | * This library is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | * Lesser General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Lesser General Public 18 | * License along with this library. If not, see 19 | * 20 | * @author Scavix Software GmbH & Co. KG https://www.scavix.com 21 | * @copyright since 2024 Scavix Software GmbH & Co. KG 22 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | */ 24 | body 25 | { 26 | padding: 1em 25%; 27 | 28 | h1 29 | { 30 | color: red; 31 | } 32 | 33 | p 34 | { 35 | color: black; 36 | border-bottom: 1px dotted black; 37 | padding: 0 1em 1em 1em; 38 | } 39 | 40 | form 41 | { 42 | display: flex; 43 | flex-direction: column; 44 | 45 | > div 46 | { 47 | display: flex; 48 | 49 | span 50 | { 51 | flex: 1; 52 | min-width: 150px; 53 | } 54 | input, textarea 55 | { 56 | flex: 5; 57 | } 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /web/sample_blog/templates/newpostform.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 |
Title:
28 |
Text:
29 |
30 |
-------------------------------------------------------------------------------- /web/sample_blog/templates/post.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |

27 |

-------------------------------------------------------------------------------- /web/sample_charts/.htaccess: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------------------- 2 | # Scavix Web Development Framework 3 | # 4 | # Copyright (c) since 2012 Scavix Software Ltd. & Co. KG 5 | # 6 | # This library is free software; you can redistribute it 7 | # and/or modify it under the terms of the GNU Lesser General 8 | # Public License as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any 10 | # later version. 11 | # 12 | # This library is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | # Lesser General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Lesser General Public 18 | # License along with this library. If not, see 19 | # 20 | # @author Scavix Software Ltd. & Co. KG http://www.scavix.com 21 | # @copyright since 2012 Scavix Software Ltd. & Co. KG 22 | # @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | # ---------------------------------------------------------------------------------------- 24 | 25 | RewriteEngine On 26 | 27 | # redirect NoCache files to the real ones 28 | SetEnv WDF_FEATURES_NOCACHE on 29 | RewriteRule (.*)/nc([0-9]+)/(.*) $1/$3?_nc=$2 [L,QSA] 30 | 31 | # redirect inexistant requests to index.php 32 | SetEnv WDF_FEATURES_REWRITE on 33 | RewriteCond %{REQUEST_FILENAME} !-f 34 | RewriteCond %{REQUEST_FILENAME} !-d 35 | RewriteCond %{REQUEST_URI} !index.php 36 | RewriteRule (.*) index.php?wdf_route=$1 [L,QSA] 37 | -------------------------------------------------------------------------------- /web/sample_charts/README.md: -------------------------------------------------------------------------------- 1 | Chart sample 2 | ============ 3 | 4 | This is a sample on how to use the charts provided by the WebFramework in your web application. 5 | -------------------------------------------------------------------------------- /web/sample_charts/config.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | // Pages are PHP classes extending HtmlPage 27 | $CONFIG['system']['default_page'] = "ChartRoulette"; 28 | // Events are mapped to PHP class methods 29 | $CONFIG['system']['default_event'] = "Index"; 30 | 31 | // Application specific classpath 32 | classpath_add(__DIR__.'/controller'); 33 | 34 | // Database connection, a DSN passed to the PDO constructor 35 | $CONFIG['model']['system']['connection_string'] = "sqlite:../chartroulette.db"; 36 | $CONFIG['model']['system']['default'] = true; 37 | $GLOBALS['CREATE_DATA'] = !file_exists("../chartroulette.db"); 38 | 39 | 40 | // Logger Config 41 | ini_set("error_log", __DIR__.'/../logs/chartroulette_php_error.log'); 42 | $CONFIG['system']['logging'] = array 43 | ( 44 | 'human_readable' => array 45 | ( 46 | 'path' => __DIR__.'/../logs/', 47 | 'filename_pattern' => 'chartroulette_wdf.log', 48 | 'log_severity' => true, 49 | 'max_filesize' => 10*1024*1024, 50 | 'keep_for_days' => 5, 51 | 'max_trace_depth' => 16, 52 | ), 53 | 'full_trace' => array 54 | ( 55 | 'class' => 'TraceLogger', 56 | 'path' => __DIR__.'/../logs/', 57 | 'filename_pattern' => 'chartroulette_wdf.trace', 58 | 'log_severity' => true, 59 | 'max_trace_depth' => 10, 60 | 'max_filesize' => 10*1024*1024, 61 | 'keep_for_days' => 4, 62 | ), 63 | ); 64 | 65 | // Resources config 66 | $CONFIG['resources'][] = array 67 | ( 68 | 'ext' => 'js|css|png|jpg|jpeg|gif|htc|ico', 69 | 'path' => realpath(__DIR__.'/res/'), 70 | 'url' => 'res/', 71 | 'append_nc' => true, 72 | ); 73 | // If you put WDF into a separate folder next to the app (like here), that folder must be externaly accessible. 74 | // So maybe you'll have to set up a subdomain for it and set that to 'resources_system_url_root'. 75 | // For now we just rely on the built in router that will output the resource contents via readfile(). 76 | $CONFIG['resources_system_url_root'] = false; 77 | //$CONFIG['resources_system_url_root'] = 'http://chartroulette.if.it.is.free.com/'; // <- sample 78 | 79 | // some essentials 80 | $CONFIG['system']['modules'] = array(); 81 | date_default_timezone_set("Europe/Berlin"); 82 | -------------------------------------------------------------------------------- /web/sample_charts/controller/chartroulette.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | use ScavixWDF\Base\HtmlPage; 27 | use ScavixWDF\Controls\ChartJS3; 28 | use ScavixWDF\Google\GoogleVisualization; 29 | use ScavixWDF\Google\gvBarChart; 30 | //use ScavixWDF\Google\gvComboChart; 31 | use ScavixWDF\Google\gvGeoChart; 32 | use ScavixWDF\Google\gvPieChart; 33 | use ScavixWDF\JQueryUI\uiTabs; 34 | use ScavixWDF\Localization\Localization; 35 | use ScavixWDF\Model\DataSource; 36 | 37 | class ChartRoulette extends HtmlPage 38 | { 39 | function __construct() 40 | { 41 | parent::__construct(); 42 | if( $GLOBALS['CREATE_DATA'] ) 43 | { 44 | $ds = model_datasource('system'); 45 | 46 | $fn = array('John','Jane','Thomas','Marc','Jamie','Bob','Marie'); 47 | $ln = array('Doe','Murphy','Anderson','Smith'); 48 | $country_codes = array('DE','US','RU','FR','IT','SE'); 49 | $ds->ExecuteSql("CREATE TABLE participants(name VARCHAR(50), country VARCHAR(5),age INTEGER,game_count INTEGER,PRIMARY KEY(name))"); 50 | foreach( $fn as $f ) 51 | { 52 | foreach( $ln as $l ) 53 | { 54 | $cc = $country_codes[rand(0, count($country_codes)-1)]; 55 | $ds->ExecuteSql("INSERT INTO participants(name,country,age,game_count)VALUES(?,?,?,?)",array("$f $l",$cc,rand(18,70),rand(0,100))); 56 | } 57 | } 58 | 59 | $nums = array(); 60 | $ds->ExecuteSql("CREATE TABLE numbers(number INTEGER,hit_count INTEGER,PRIMARY KEY(number))"); 61 | for($i=0; $i<=36; $i++) 62 | { 63 | $nums[$i] = 0; 64 | $ds->ExecuteSql("INSERT INTO numbers(number,hit_count)VALUES(?,?)",array($i,0)); 65 | } 66 | for($i=0; $i<9999; $i++) 67 | { 68 | $rnd = rand(0,36); 69 | $nums[$rnd]++; 70 | } 71 | foreach( $nums as $i=>$c ) 72 | $ds->ExecuteSql("UPDATE numbers SET hit_count=? WHERE number=?",array($c,$i)); 73 | } 74 | GoogleVisualization::$DefaultDatasource = model_datasource('system'); 75 | } 76 | 77 | /** 78 | * @attribute[RequestParam('type','string',false)] 79 | * @attribute[RequestParam('data','string',false)] 80 | */ 81 | function Index($type,$data) 82 | { 83 | $tabs = new uiTabs(); 84 | $tabs->AddTab("Participants by game count", $this->ParticipantsGames()); 85 | $tabs->AddTab("Participants by age", $this->ParticipantsAge()); 86 | $tabs->AddTab("Participants countries", $this->ParticipantsCountries()); 87 | 88 | $this->content($tabs); 89 | } 90 | 91 | function ParticipantsAge() 92 | { 93 | $data = DataSource::Get()->ExecuteSql("SELECT age, count(*) as cnt FROM participants GROUP BY age ORDER BY cnt DESC") 94 | ->Enumerate('cnt', false, 'age'); 95 | $labels = array_map(function ($a) { return "$a years";},array_keys($data)); 96 | $data = array_combine($labels, array_values($data)); 97 | return ChartJS3::Pie("Participants by age", 400) 98 | ->setSeries(['age'=>"Age",'cnt'=>"Count"]) 99 | ->setPieData($data); 100 | } 101 | 102 | function ParticipantsGames() 103 | { 104 | $data = DataSource::Get()->ExecuteSql("SELECT name, game_count FROM participants ORDER BY game_count DESC") 105 | ->Enumerate('game_count', false, 'name'); 106 | return ChartJS3::Bar("Participants by game count", 400) 107 | ->setPieData($data) 108 | ->legend('display',false) 109 | ->opt('indexAxis','y'); 110 | } 111 | 112 | function ParticipantsCountries() 113 | { 114 | $chart = new gvGeoChart(); 115 | $chart->setTitle("Participants countries") 116 | ->setDataHeader("Country","Participants") 117 | ->setSize(800, 400) 118 | ->opt('is3D',true); 119 | $country_names = Localization::get_country_names(); 120 | foreach( DataSource::Get()->ExecuteSql("SELECT country, count(*) as cnt FROM participants GROUP BY country ORDER BY cnt DESC") as $row ) 121 | $chart->addDataRow($country_names[$row['country']],intval($row['cnt'])); 122 | 123 | return $chart; 124 | } 125 | } -------------------------------------------------------------------------------- /web/sample_charts/index.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | require_once(__DIR__."/../system/system.php"); 26 | 27 | switchToDev(); 28 | system_init('chartroulette'); 29 | 30 | if( isset($_GET['clear']) ) 31 | { 32 | cache_clear(); 33 | $_SESSION = array(); 34 | } 35 | 36 | system_execute(); 37 | -------------------------------------------------------------------------------- /web/sample_shop/.htaccess: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------------------- 2 | # Scavix Web Development Framework 3 | # 4 | # Copyright (c) since 2012 Scavix Software Ltd. & Co. KG 5 | # 6 | # This library is free software; you can redistribute it 7 | # and/or modify it under the terms of the GNU Lesser General 8 | # Public License as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any 10 | # later version. 11 | # 12 | # This library is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | # Lesser General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Lesser General Public 18 | # License along with this library. If not, see 19 | # 20 | # @author Scavix Software Ltd. & Co. KG http://www.scavix.com 21 | # @copyright since 2012 Scavix Software Ltd. & Co. KG 22 | # @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | # ---------------------------------------------------------------------------------------- 24 | 25 | 26 | RewriteEngine On 27 | 28 | # redirect NoCache files to the real ones 29 | SetEnv WDF_FEATURES_NOCACHE on 30 | RewriteRule (.*)/nc([0-9]+)/(.*) $1/$3?_nc=$2 [L,QSA] 31 | 32 | # redirect inexistant requests to index.php 33 | SetEnv WDF_FEATURES_REWRITE on 34 | RewriteCond %{REQUEST_FILENAME} !-f 35 | RewriteCond %{REQUEST_FILENAME} !-d 36 | RewriteCond %{REQUEST_URI} !index.php 37 | RewriteRule (.*) index.php?wdf_route=$1 [L,QSA] 38 | -------------------------------------------------------------------------------- /web/sample_shop/README.md: -------------------------------------------------------------------------------- 1 | Shop sample 2 | =========== 3 | 4 | This is the sample code used in the article describing how to use the WebFramework to 5 | [Easily implementing your own online shop](http://www.codeproject.com/Articles/586703/Easily-implementing-your-own-online-shop) 6 | -------------------------------------------------------------------------------- /web/sample_shop/config.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | // Pages are PHP classes extending HtmlPage 27 | $CONFIG['system']['default_page'] = "Products"; 28 | // Events are mapped to PHP class methods 29 | $CONFIG['system']['default_event'] = "Index"; 30 | 31 | // Application specific classpath 32 | classpath_add(__DIR__.'/controller'); 33 | classpath_add(__DIR__.'/templates'); 34 | classpath_add(__DIR__.'/model'); 35 | 36 | // Database connection, a DSN passed to the PDO constructor 37 | $CONFIG['model']['system']['connection_string'] = "sqlite:../shop.db"; 38 | $CONFIG['model']['system']['default'] = true; 39 | 40 | // Logger Config 41 | ini_set("error_log", __DIR__.'/../logs/shop_php_error.log'); 42 | $CONFIG['system']['logging'] = array 43 | ( 44 | 'human_readable' => array 45 | ( 46 | 'path' => __DIR__.'/../logs/', 47 | 'filename_pattern' => 'shop_wdf.log', 48 | 'log_severity' => true, 49 | 'max_filesize' => 10*1024*1024, 50 | 'keep_for_days' => 5, 51 | 'max_trace_depth' => 16, 52 | ), 53 | 'full_trace' => array 54 | ( 55 | 'class' => 'TraceLogger', 56 | 'path' => __DIR__.'/../logs/', 57 | 'filename_pattern' => 'shop_wdf.trace', 58 | 'log_severity' => true, 59 | 'max_trace_depth' => 10, 60 | 'max_filesize' => 10*1024*1024, 61 | 'keep_for_days' => 4, 62 | ), 63 | ); 64 | 65 | // Resources config 66 | $CONFIG['resources'][] = array 67 | ( 68 | 'ext' => 'js|css|png|jpg|jpeg|gif|htc|ico', 69 | 'path' => realpath(__DIR__.'/res/'), 70 | 'url' => 'res/', 71 | 'append_nc' => true, 72 | ); 73 | 74 | // this is products image folder. 75 | // setting it up as resource folder allows us to simply use resFile() to reference a products image. 76 | $CONFIG['resources'][] = array 77 | ( 78 | 'ext' => 'png|jpg|jpeg|gif', 79 | 'path' => realpath(__DIR__.'/images/'), 80 | 'url' => 'images/', 81 | 'append_nc' => true, 82 | ); 83 | 84 | // some essentials 85 | $CONFIG['system']['modules'] = array('payment'); 86 | date_default_timezone_set("Europe/Berlin"); 87 | 88 | // configure payment module with your IShopOrder class 89 | $CONFIG["payment"]["order_model"] = 'SampleShopOrder'; 90 | // set up Gate2Shop if you want to use it 91 | $CONFIG["payment"]["gate2shop"]["merchant_id"] = ''; 92 | $CONFIG["payment"]["gate2shop"]["merchant_site_id"] = ''; 93 | $CONFIG["payment"]["gate2shop"]["secret_key"] = ''; 94 | // set up PayPal if you want to use it 95 | $CONFIG["payment"]["paypal"]["paypal_id"] = ''; 96 | $CONFIG["payment"]["paypal"]["notify_handler"] = array('Basket','Notification'); 97 | 98 | // Credentials for the Admin controller. Hardcoding them is okay for now, but they should obviously be stored in DB later. 99 | // Note: never store passwords, but salted password hashes! 100 | $CONFIG["admin"]["username"] = 'admin'; 101 | $CONFIG["admin"]["password"] = 'admin'; -------------------------------------------------------------------------------- /web/sample_shop/controller/admin.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Base\AjaxAction; 26 | use ScavixWDF\Base\AjaxResponse; 27 | use ScavixWDF\Base\Template; 28 | use ScavixWDF\Controls\Form\Form; 29 | use ScavixWDF\JQueryUI\Dialog\uiDialog; 30 | use ScavixWDF\JQueryUI\uiButton; 31 | use ScavixWDF\JQueryUI\uiDatabaseTable; 32 | use ScavixWDF\JQueryUI\uiMessage; 33 | 34 | class Admin extends ShopBase 35 | { 36 | /** 37 | * Checks if aa admin has logged in and redirects to login if not. 38 | */ 39 | private function _login() 40 | { 41 | // check only the fact that somebody logged in 42 | if( avail($_SESSION,'logged_in') ) 43 | return true; 44 | 45 | // redirect to login. this terminates the script execution. 46 | redirect('Admin','Login'); 47 | } 48 | 49 | /** 50 | * @attribute[RequestParam('username','string',false)] 51 | * @attribute[RequestParam('password','string',false)] 52 | */ 53 | function Login($username,$password) 54 | { 55 | // if credentials are given, try to log in 56 | if( $username && $password ) 57 | { 58 | // see config.php for credentials 59 | if( $username==cfg_get('admin','username') && $password==cfg_get('admin','password') ) 60 | { 61 | $_SESSION['logged_in'] = true; // check only the fact that somebody logged in 62 | redirect('Admin'); 63 | } 64 | $this->content(uiMessage::Error("Unknown username/passsword")); 65 | } 66 | // putting it together as control here. other ways would be to create a new class 67 | // derived from Control or a Template (anonymous or with an own class) 68 | $form = $this->content(new Form()); 69 | $form->content("Username:"); 70 | $form->AddText('username', ''); 71 | $form->content("
Password:"); 72 | $form->AddPassword('password', ''); 73 | $form->AddSubmit("Login"); 74 | } 75 | 76 | function Index() 77 | { 78 | $this->_login(); // require admin to be logged in 79 | 80 | // add products table and a button to create a new product 81 | $this->content("

Products

"); 82 | $this->content(new uiDatabaseTable(model_datasource('system'),false,'products')) 83 | ->AddPager(10) 84 | ->AddRowAction('trash', 'Delete', $this, 'DelProduct'); 85 | $this->content(uiButton::Textual('Add product'))->onclick = AjaxAction::Post('Admin', 'AddProduct'); 86 | 87 | // add orders table 88 | $this->content("

Orders

"); 89 | $this->content(new uiDatabaseTable(model_datasource('system'),false,'orders')) 90 | ->AddPager(10) 91 | ->OrderBy = 'id DESC'; 92 | 93 | // add customers table 94 | $this->content("

Customers

"); 95 | $this->content(new uiDatabaseTable(model_datasource('system'),false,'customers')) 96 | ->AddPager(10) 97 | ->OrderBy = 'id DESC'; 98 | } 99 | 100 | /** 101 | * @attribute[RequestParam('title','string',false)] 102 | * @attribute[RequestParam('tagline','string',false)] 103 | * @attribute[RequestParam('body','text',false)] 104 | * @attribute[RequestParam('price','double',false)] 105 | */ 106 | function AddProduct($title,$tagline,$body,$price) 107 | { 108 | $this->_login(); // require admin to be logged in 109 | 110 | // This is a quite simple condition: You MUST provide each of the variables 111 | if( $title && $tagline && $body && $price ) 112 | { 113 | // store the uploaded image if present 114 | if( isset($_FILES['image']) && $_FILES['image']['name'] ) 115 | { 116 | $i = 1; $image = __DIR__.'/../images/'.$_FILES['image']['name']; 117 | while( file_exists($image) ) 118 | $image = __DIR__.'/../images/'.($i++).'_'.$_FILES['image']['name']; 119 | move_uploaded_file($_FILES['image']['tmp_name'], $image); 120 | $image = basename($image); 121 | } 122 | else 123 | $image = ''; 124 | 125 | // store the new product into the database 126 | $ds = model_datasource('system'); 127 | $ds->ExecuteSql("INSERT INTO products(title,tagline,body,image,price)VALUES(?,?,?,?,?)", 128 | array($title,$tagline,$body,$image,$price)); 129 | 130 | redirect('Admin'); 131 | } 132 | // create a dialog and put a template on it. 133 | $dlg = new uiDialog('Add product',array('width'=>600,'height'=>450)); 134 | $dlg->content( Template::Make('admin_product_add') ); 135 | $dlg->AddButton('Add product', "$('#frm_add_product').submit()"); // frm_add_product is defined in the template 136 | $dlg->AddCloseButton("Cancel"); 137 | return $dlg; 138 | } 139 | 140 | /** 141 | * @attribute[RequestParam('table','string',false)] 142 | * @attribute[RequestParam('action','string',false)] 143 | * @attribute[RequestParam('model','array',false)] 144 | * @attribute[RequestParam('row','string',false)] 145 | */ 146 | function DelProduct($table,$action,$model,$row) 147 | { 148 | $this->_login(); // require admin to be logged in 149 | 150 | // we use the ajax confirm features of the framework which require some translated string, so we set them up here 151 | // normally we would start the sysadmin and create some, but for this sample we ignore that. 152 | default_string('TITLE_DELPRODUCT','Delete Product'); 153 | default_string('TXT_DELPRODUCT','Do you really want to remove this product? This cannot be undone!'); 154 | if( !AjaxAction::IsConfirmed('DELPRODUCT') ) 155 | return AjaxAction::Confirm('DELPRODUCT', 'Admin', 'DelProduct', array('model'=>$model)); 156 | 157 | // load and delete the product dataset 158 | $ds = model_datasource('system'); 159 | $prod = $ds->Query('products')->eq('id',$model['id'])->current(); 160 | $prod->Delete(); 161 | 162 | // delete the image too if present 163 | if( $prod->image ) 164 | { 165 | $image = __DIR__.'/../images/'.$prod->image; 166 | if( file_exists($image) ) 167 | unlink($image); 168 | } 169 | return AjaxResponse::Redirect('Admin'); 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /web/sample_shop/controller/basket.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Base\Template; 26 | use ScavixWDF\JQueryUI\uiButton; 27 | use ScavixWDF\JQueryUI\uiMessage; 28 | 29 | class Basket extends ShopBase 30 | { 31 | /** 32 | * Lists all items in the basket. 33 | * @attribute[RequestParam('error','string',false)] 34 | */ 35 | function Index($error) 36 | { 37 | // display any given error message 38 | if( $error ) 39 | $this->content(uiMessage::Error($error)); 40 | 41 | // prepare basket variable 42 | if( !isset($_SESSION['basket']) ) 43 | $_SESSION['basket'] = array(); 44 | 45 | if( count($_SESSION['basket']) == 0 ) 46 | $this->content(uiMessage::Hint('Basket is empty')); 47 | else 48 | { 49 | // list all items in the basket ... 50 | $ds = model_datasource('system'); 51 | $price_total = 0; 52 | foreach( $_SESSION['basket'] as $id=>$amount ) 53 | { 54 | $prod = $ds->Query('products')->eq('id',$id)->current(); 55 | 56 | //... each using a template 57 | $this->content( Template::Make('product_basket') ) 58 | ->set('title',$prod->title) 59 | ->set('amount',$amount) 60 | ->set('price',$prod->price) 61 | ->set('image',resFile($prod->image)) // see config.php where we set up products images folder as resource folder 62 | ->set('add',buildQuery('Basket','Add',array('id'=>$prod->id))) 63 | ->set('remove',buildQuery('Basket','Remove',array('id'=>$prod->id))) 64 | ; 65 | $price_total += $amount * $prod->price; 66 | } 67 | // display total price and the button to go on 68 | $this->content("
Total price: $price_total
"); 69 | $this->content( uiButton::Textual("Buy now") )->onclick = "location.href = '".buildQuery('Basket','BuyNow')."'"; 70 | } 71 | } 72 | 73 | /** 74 | * Adds a product to the basket. 75 | * @attribute[RequestParam('id','int')] 76 | */ 77 | function Add($id) 78 | { 79 | // check if the product exists 80 | $ds = model_datasource('system'); 81 | $prod = $ds->Query('products')->eq('id',$id)->current(); 82 | if( !$prod ) 83 | redirect('Basket','Index',array('error'=>'Product not found')); 84 | 85 | // increase the counter for this product 86 | if( !isset($_SESSION['basket'][$id]) ) 87 | $_SESSION['basket'][$id] = 0; 88 | $_SESSION['basket'][$id]++; 89 | redirect('Basket','Index'); 90 | } 91 | 92 | /** 93 | * Removes an item from the basket. 94 | * @attribute[RequestParam('id','int')] 95 | */ 96 | function Remove($id) 97 | { 98 | // check if the product exists 99 | $ds = model_datasource('system'); 100 | $prod = $ds->Query('products')->eq('id',$id)->current(); 101 | if( !$prod ) 102 | redirect('Basket','Index',array('error'=>'Product not found')); 103 | 104 | // decrease the counter for this product 105 | if( isset($_SESSION['basket'][$id]) ) 106 | $_SESSION['basket'][$id]--; 107 | // and unset if no more items left 108 | if( $_SESSION['basket'][$id] == 0 ) 109 | unset($_SESSION['basket'][$id]); 110 | redirect('Basket','Index'); 111 | } 112 | 113 | /** 114 | * Entrypoint for the checkout process. 115 | * 116 | * Requests customers address details and asks for payment processor. 117 | */ 118 | function BuyNow() 119 | { 120 | // displays the chechout form, which has all inputs for address on it 121 | $this->content( Template::Make('checkout_form') ); 122 | } 123 | 124 | /** 125 | * Persists current basket to the database and starts checkout process. 126 | * @attribute[RequestParam('fname','string')] 127 | * @attribute[RequestParam('lname','string')] 128 | * @attribute[RequestParam('street','string')] 129 | * @attribute[RequestParam('zip','string')] 130 | * @attribute[RequestParam('city','string')] 131 | * @attribute[RequestParam('email','string')] 132 | * @attribute[RequestParam('provider','string')] 133 | */ 134 | function StartCheckout($fname,$lname,$street,$zip,$city,$email,$provider) 135 | { 136 | log_debug("StartCheckout($fname,$lname,$street,$zip,$city,$email,$provider)"); 137 | 138 | if( !$fname || !$lname || !$street || !$zip || !$city || !$email ) 139 | redirect('Basket','Index',array('error'=>'Missing some data')); 140 | 141 | // create a new customer. note that we do not check for existance or stuff. 142 | // this should be part of a real shop system! 143 | $cust = new SampleCustomer(); 144 | $cust->fname = $fname; 145 | $cust->lname = $lname; 146 | $cust->street = $street; 147 | $cust->zip = $zip; 148 | $cust->city = $city; 149 | $cust->email = $email; 150 | $cust->price_total = 0; 151 | $cust->Save(); 152 | 153 | // create a new order and assign the customer (from above) 154 | $order = new SampleShopOrder(); 155 | $order->customer_id = $cust->id; 156 | $order->created = 'now()'; 157 | $order->Save(); 158 | 159 | // now loop thru the basket-items and add them to the order... 160 | $ds = model_datasource('system'); 161 | foreach( $_SESSION['basket'] as $id=>$amount ) 162 | { 163 | //... by creating a dataset for each item 164 | $prod = $ds->Query('products')->eq('id',$id)->current(); 165 | $item = new SampleShopOrderItem(); 166 | $item->order_id = $order->id; 167 | $item->price = $prod->price; 168 | $item->amount = $amount; 169 | $item->title = $prod->title; 170 | $item->tagline = $prod->tagline; 171 | $item->body = $prod->body; 172 | $item->Save(); 173 | 174 | $order->price_total += $amount * $prod->price; 175 | } 176 | // save the order again to persist the total amount 177 | $order->Save(); 178 | $_SESSION['basket'] = array(); 179 | 180 | // finally start the checkout process using the given payment provider 181 | log_debug("Handing control over to payment provider '$provider'"); 182 | $p = new $provider(); 183 | $p->StartCheckout($order,buildQuery('Basket','PostPayment')); 184 | } 185 | 186 | /** 187 | * This is the return URL for the payment provider. 188 | * Will be called when payment raches a final state, so control is handed over to our 189 | * app again from the payment processor. 190 | */ 191 | function PostPayment() 192 | { 193 | // we just display the $_REQUEST data for now. in fact this is the point where some processing 194 | // should take place: send email to the team, that prepares the items for shipping, send email(s) to customer,... 195 | log_debug("PostPayment",$_REQUEST); 196 | $this->content("

Payment processed

"); 197 | $this->content("Provider returned this data:
".render_var($_REQUEST)."
"); 198 | } 199 | 200 | /** 201 | * This is a special handler method for PayPal. 202 | * It will be called asynchronously from PayPal backend so user will never see results of it. 203 | * Just here to update the database when payments are ready or refunded or whatever. 204 | * See https://www.paypal.com/ipn for details but in fact WebFramework will handle this for you. 205 | * Just needs this entry point for the callback. 206 | * @attribute[RequestParam('provider','string')] 207 | */ 208 | function Notification($provider) 209 | { 210 | log_debug("Notification",$_REQUEST); 211 | $provider = new $provider(); 212 | if( $provider->HandleIPN($_REQUEST) ) 213 | die("OK"); 214 | die("ERR"); 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /web/sample_shop/controller/products.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Base\Template; 26 | use ScavixWDF\JQueryUI\uiMessage; 27 | 28 | class Products extends ShopBase 29 | { 30 | /** 31 | * Lists all products. 32 | * @attribute[RequestParam('error','string',false)] 33 | */ 34 | function Index($error) 35 | { 36 | // display error message if given 37 | if( $error ) 38 | $this->content(uiMessage::Error($error)); 39 | 40 | // loop thru the products... 41 | $ds = model_datasource('system'); 42 | foreach( $ds->Query('products')->orderBy('title') as $prod ) 43 | { 44 | //... and use a template to represent each 45 | $this->content( Template::Make('product_overview') ) 46 | ->set('title',$prod->title) 47 | ->set('tagline',$prod->tagline) 48 | ->set('image',resFile($prod->image)) // see config.php where we set up products images folder as resource folder 49 | ->set('link',buildQuery('Products','Details',array('id'=>$prod->id))) 50 | ; 51 | } 52 | } 53 | 54 | /** 55 | * Shows product details 56 | * @attribute[RequestParam('id','int')] 57 | */ 58 | function Details($id) 59 | { 60 | // check if product really exists 61 | $ds = model_datasource('system'); 62 | $prod = $ds->Query('products')->eq('id',$id)->current(); 63 | if( !$prod ) 64 | redirect('Products','Index',array('error'=>'Product not found')); 65 | 66 | // create a template with product details 67 | $this->content( Template::Make('product_details') ) 68 | ->set('title',$prod->title) 69 | ->set('description',$prod->body) 70 | ->set('image',resFile($prod->image)) // see config.php where we set up products images folder as resource folder 71 | ->set('link',buildQuery('Basket','Add',array('id'=>$prod->id))) 72 | ; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /web/sample_shop/controller/shopbase.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Base\HtmlPage; 26 | 27 | /** 28 | * For now we only use this to have a central derived template for all subclasses. 29 | */ 30 | class ShopBase extends HtmlPage 31 | { 32 | 33 | } 34 | -------------------------------------------------------------------------------- /web/sample_shop/controller/shopbase.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 | 32 |
33 | 34 |
35 |
36 | -------------------------------------------------------------------------------- /web/sample_shop/images/product1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/web/sample_shop/images/product1.png -------------------------------------------------------------------------------- /web/sample_shop/images/product2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/web/sample_shop/images/product2.png -------------------------------------------------------------------------------- /web/sample_shop/images/product3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScavixSoftware/WebFramework/bc8a7c6a2b16ed8ba8fd39bb54e005cd7e6ea91b/web/sample_shop/images/product3.png -------------------------------------------------------------------------------- /web/sample_shop/index.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | 26 | require_once(__DIR__."/../system/system.php"); 27 | 28 | switchToDev(); 29 | system_init('shop'); 30 | 31 | if( isset($_GET['clear']) ) 32 | { 33 | cache_clear(); 34 | $_SESSION = array(); 35 | } 36 | 37 | /** 38 | * Creates a all tables and some sample data. 39 | */ 40 | function ensure_db() 41 | { 42 | $flds = array(); 43 | foreach( array('email','fname','lname','street','zip','city') as $fld ) 44 | $flds[] = "$fld VARCHAR(255)"; 45 | $flds = implode(",", $flds); 46 | 47 | $ds = model_datasource('system'); 48 | $ds->ExecuteSql("CREATE TABLE IF NOT EXISTS products(id INTEGER,title VARCHAR(50),tagline VARCHAR(100),body TEXT,image VARCHAR(50),price DOUBLE,PRIMARY KEY(id))"); 49 | $ds->ExecuteSql("CREATE TABLE IF NOT EXISTS orders(id INTEGER,customer_id INTEGER,status INTEGER,created DATETIME,updated DATETIME,completed DATETIME,deleted DATETIME,price_total DOUBLE,PRIMARY KEY(id))"); 50 | $ds->ExecuteSql("CREATE TABLE IF NOT EXISTS items(id INTEGER,order_id INTEGER,title VARCHAR(50),tagline VARCHAR(100),body TEXT,price DOUBLE,amount DOUBLE,PRIMARY KEY(id))"); 51 | $ds->ExecuteSql("CREATE TABLE IF NOT EXISTS customers(id INTEGER,$flds,PRIMARY KEY(id))"); 52 | 53 | if( $ds->ExecuteScalar("SELECT count(*) FROM products") == 0 ) 54 | { 55 | $ds->ExecuteSql("INSERT INTO products(title,tagline,body,image,price)VALUES(?,?,?,?,?)", 56 | array('Product 1','This is short desc for product 1','Here we go with an real description that can be long and will only be displayed on products details page','product1.png',11.99)); 57 | $ds->ExecuteSql("INSERT INTO products(title,tagline,body,image,price)VALUES(?,?,?,?,?)", 58 | array('Product 2','Product 2 has a tagline too','But we will go with a short description','product2.png',9.85)); 59 | $ds->ExecuteSql("INSERT INTO products(title,tagline,body,image,price)VALUES(?,?,?,?,?)", 60 | array('Product 3','Product 3 tagline: we need that for listings','No desc here too as this is demo data','product3.png',1.99)); 61 | } 62 | } 63 | // Not nice to call that every time, but we will go for it in our sample. 64 | ensure_db(); 65 | 66 | system_execute(); 67 | -------------------------------------------------------------------------------- /web/sample_shop/model/samplecustomer.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Model\Model; 26 | 27 | /** 28 | * Represents a customer in the database. 29 | * 30 | * Just a placeholder class to be able to query the DB nicely. 31 | */ 32 | class SampleCustomer extends Model 33 | { 34 | /** 35 | * Returns the table name. 36 | * See https://github.com/ScavixSoftware/WebFramework/wiki/classes_essentials_model_model.class#gettablename 37 | */ 38 | public function GetTableName() { return 'customers'; } 39 | } -------------------------------------------------------------------------------- /web/sample_shop/model/sampleshoporder.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Model\Model; 26 | use ScavixWDF\Payment\IShopOrder; 27 | use ScavixWDF\Payment\ShopOrderAddress; 28 | 29 | /** 30 | * Represents an order in the database. 31 | * 32 | * In fact nothing more than implementations for the inherited Model 33 | * and the implemented IShopOrder interface. 34 | * See https://github.com/ScavixSoftware/WebFramework/wiki/classes_modules_payment#wiki-1c67f96d00c3c22f1ab9002cd0e3acbb 35 | * More logic would go into the Set* methods to handle different order states. 36 | * For our sample we just set the states in the DB. 37 | */ 38 | class SampleShopOrder extends Model implements IShopOrder 39 | { 40 | const UNKNOWN = 0; 41 | const PENDING = 10; 42 | const PAID = 20; 43 | const FAILED = 30; 44 | const REFUNDED = 40; 45 | 46 | /** 47 | * Returns the table name. 48 | * See https://github.com/ScavixSoftware/WebFramework/wiki/classes_essentials_model_model.class#gettablename 49 | */ 50 | public function GetTableName() { return 'orders'; } 51 | 52 | /** 53 | * Gets the orders address. 54 | * @return ShopOrderAddress The order address 55 | */ 56 | public function GetAddress() 57 | { 58 | $res = new ShopOrderAddress(); 59 | $res->Firstname = $this->fname; 60 | $res->Lastname = $this->lname; 61 | $res->Address1 = $this->street; 62 | $res->Zip = $this->zip; 63 | $res->City = $this->city; 64 | $res->Email = $this->email; 65 | return $res; 66 | } 67 | 68 | /** 69 | * Gets the currency code. 70 | * @return string A valid currency code 71 | */ 72 | public function GetCurrency() { return 'EUR'; } 73 | 74 | /** 75 | * Gets the invoice ID. 76 | * @return mixed Invoice identifier 77 | */ 78 | public function GetInvoiceId() { return "I".$this->id; } 79 | 80 | /** 81 | * Gets the order culture code. 82 | * 83 | * See 84 | * @return string Valid culture code 85 | */ 86 | public function GetLocale() { return 'en-US'; } 87 | 88 | /** 89 | * Return the total price incl. VAT (if VAT applies for the given country). 90 | * @param float $price The price without VAT. 91 | * @return float Price including VAT (if VAT applies for the country). 92 | */ 93 | public function GetTotalPrice($price = false) 94 | { 95 | if( $price !== false ) 96 | return $price * ( (1+$this->GetVatPercent()) / 100 ); 97 | return $this->price_total * ( (1+$this->GetVatPercent()) / 100 ); 98 | } 99 | 100 | /** 101 | * Return the total VAT (if VAT applies for the given country). 102 | * @return float VAT in order currency 103 | */ 104 | public function GetTotalVat() { return $this->price_total * ($this->GetVatPercent()/100); } 105 | 106 | /** 107 | * Return the total VAT percent (if VAT applies for the given country). 108 | * @return float VAT percent 109 | */ 110 | public function GetVatPercent() { return 19; } 111 | 112 | /** 113 | * Returns all items. 114 | * 115 | * @return array A list of objects 116 | */ 117 | public function ListItems() { return SampleShopOrderItem::Make()->eq('order_id',$this->id)->orderBy('id'); } 118 | 119 | /** 120 | * Sets the currency 121 | * @param string $currency_code A valid currency code 122 | * @return void 123 | */ 124 | public function SetCurrency($currency_code) { /* we stay with EUR */ } 125 | 126 | /** 127 | * Creates an instance from an order id. 128 | * @return IShopOrder The new/loaded order 129 | */ 130 | public static function FromOrderId($order_id) 131 | { 132 | return SampleShopOrder::Make()->eq('id',$order_id)->current(); 133 | } 134 | 135 | /** 136 | * Called when the order has failed. 137 | * 138 | * This is a callback from the payment processor. Will be called when there was an error in the payment process. 139 | * This can be synchronous (when cutsomer aborts in then initial payment ui) or asynchronous when something goes wrong 140 | * later in the payment processors processes. 141 | * @param int $payment_provider_type Provider type identifier (::PROCESSOR_PAYPAL, ::PROCESSOR_GATE2SHOP, ...) 142 | * @param mixed $transaction_id Transaction identifier (from the payment provider) 143 | * @param string $statusmsg An optional status message 144 | * @return void 145 | */ 146 | public function SetFailed($payment_provider_type, $transaction_id, $statusmsg = false) 147 | { 148 | $this->status = self::FAILED; 149 | $this->updated = $this->deleted = 'now()'; 150 | $this->Save(); 151 | } 152 | 153 | /** 154 | * Called when the order has been paid. 155 | * 156 | * This is a callback from the payment processor. Will be called when the customer has paid the order. 157 | * @param int $payment_provider_type Provider type identifier (::PROCESSOR_PAYPAL, ::PROCESSOR_GATE2SHOP, ...) 158 | * @param mixed $transaction_id Transaction identifier (from the payment provider) 159 | * @param string $statusmsg An optional status message 160 | * @return void 161 | */ 162 | public function SetPaid($payment_provider_type, $transaction_id, $statusmsg = false) 163 | { 164 | $this->status = self::PAID; 165 | $this->updated = $this->completed = 'now()'; 166 | $this->Save(); 167 | } 168 | 169 | /** 170 | * Called when the order has reached pending state. 171 | * 172 | * This is a callback from the payment processor. Will be called when the customer has paid the order but the 173 | * payment has not yet been finished/approved by the provider. 174 | * @param int $payment_provider_type Provider type identifier (::PROCESSOR_PAYPAL, ::PROCESSOR_GATE2SHOP, ...) 175 | * @param mixed $transaction_id Transaction identifier (from the payment provider) 176 | * @param string $statusmsg An optional status message 177 | * @return void 178 | */ 179 | public function SetPending($payment_provider_type, $transaction_id, $statusmsg = false) 180 | { 181 | $this->status = self::PENDING; 182 | $this->updated = 'now()'; 183 | $this->Save(); 184 | } 185 | 186 | /** 187 | * Called when the order has been refunded. 188 | * 189 | * This is a callback from the payment processor. Will be called when the payment was refunded for any reason. 190 | * This can be reasons from the provider and/or from the customer (when he cancels the payment later). 191 | * @param int $payment_provider_type Provider type identifier (::PROCESSOR_PAYPAL, ::PROCESSOR_GATE2SHOP, ...) 192 | * @param mixed $transaction_id Transaction identifier (from the payment provider) 193 | * @param string $statusmsg An optional status message 194 | * @return void 195 | */ 196 | public function SetRefunded($payment_provider_type, $transaction_id, $statusmsg = false) 197 | { 198 | $this->status = self::REFUNDED; 199 | $this->updated = $this->deleted = 'now()'; 200 | $this->Save(); 201 | } 202 | 203 | /** 204 | * Checks if VAT needs to be paid. 205 | * @return boolean true or false 206 | */ 207 | public function DoAddVat() { return true; /* Let's assume normal VAT customers for now */ } 208 | } -------------------------------------------------------------------------------- /web/sample_shop/model/sampleshoporderitem.class.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | use ScavixWDF\Model\Model; 26 | use ScavixWDF\Payment\IShopOrderItem; 27 | 28 | /** 29 | * Represents an order item in the database. 30 | * 31 | * In fact nothing more than implementations for the inherited Model 32 | * and the implemented IShopOrderItem interface. 33 | * See https://github.com/ScavixSoftware/WebFramework/wiki/classes_modules_payment#wiki-97745ff2e14aebb2225c7647a8a059bc 34 | */ 35 | class SampleShopOrderItem extends Model implements IShopOrderItem 36 | { 37 | /** 38 | * Returns the table name. 39 | * See https://github.com/ScavixSoftware/WebFramework/wiki/classes_essentials_model_model.class#gettablename 40 | */ 41 | public function GetTableName() { return 'items'; } 42 | 43 | /** 44 | * Gets the price per item converted into the requested currency. 45 | * @param string $currency Currency code 46 | * @return float The price per item converted into $currency 47 | */ 48 | public function GetAmount($currency) { return $this->price; } 49 | 50 | /** 51 | * Gets the discount. 52 | * @return float The discount 53 | */ 54 | public function GetDiscount() { return 0; } 55 | 56 | /** 57 | * Gets the handling cost. 58 | * @return float Cost for handling 59 | */ 60 | public function GetHandling() { return 0; } 61 | 62 | /** 63 | * Gets the items name. 64 | * @return string The item name 65 | */ 66 | public function GetName() { return $this->title; } 67 | 68 | /** 69 | * Gets the quantity. 70 | * @return float The quantity 71 | */ 72 | public function GetQuantity() { return $this->amount; } 73 | 74 | /** 75 | * Gets the shipping cost. 76 | * @return float Cost for shipping 77 | */ 78 | public function GetShipping() { return 0; } 79 | } -------------------------------------------------------------------------------- /web/sample_shop/res/shopbase.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Scavix Web Development Framework 3 | * 4 | * Copyright (c) since 2012 Scavix Software Ltd. & Co. KG 5 | * 6 | * This library is free software; you can redistribute it 7 | * and/or modify it under the terms of the GNU Lesser General 8 | * Public License as published by the Free Software Foundation; 9 | * either version 3 of the License, or (at your option) any 10 | * later version. 11 | * 12 | * This library is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | * Lesser General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Lesser General Public 18 | * License along with this library. If not, see 19 | * 20 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 21 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 22 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 23 | */ 24 | 25 | #page { font: 14px normal Verdana,Arial,serif; } 26 | #page > div { width: 960px; margin: auto; } 27 | #navigation { padding-bottom: 10px; border-bottom: 1px solid gray; } 28 | #navigation a 29 | { 30 | font-size: 18px; 31 | font-weight: bold; 32 | margin-right: 15px; 33 | } 34 | 35 | .product_overview 36 | { 37 | clear: both; 38 | margin-top: 25px; 39 | border-bottom: 1px solid gray; 40 | height: 75px; 41 | } 42 | 43 | .product_overview img 44 | { 45 | width: 50px; 46 | float: left; 47 | margin-right: 10px; 48 | } 49 | 50 | .product_overview div 51 | { 52 | white-space: nowrap; 53 | overflow: hidden; 54 | } 55 | 56 | .product_overview .title { font-weight: bold; } 57 | .product_overview a { float: right; } 58 | 59 | .product_basket 60 | { 61 | clear: both; 62 | } 63 | 64 | .product_basket img 65 | { 66 | width: 30px; 67 | float: left; 68 | margin-right: 10px; 69 | } 70 | 71 | .basket_total 72 | { 73 | clear: both; 74 | text-align: right; 75 | font-size: 14px; 76 | font-weight: bold; 77 | } -------------------------------------------------------------------------------- /web/sample_shop/templates/admin_product_add.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
Title
Tagline
Description
Image
Price
49 |
-------------------------------------------------------------------------------- /web/sample_shop/templates/checkout_form.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 |

Address:

28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 50 | 51 | 52 |
Firstname
Lastname
Street and number
ZIP and City 44 | 45 | 46 |
E-Mail address
53 |

Payment provider:

54 |
55 |
56 |
57 | 58 |
-------------------------------------------------------------------------------- /web/sample_shop/templates/product_basket.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 | 28 | 29 | Amount: 30 | Price: 31 | Total: 32 | add one more 33 | remove one 34 |
-------------------------------------------------------------------------------- /web/sample_shop/templates/product_details.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 | 28 |
29 |
30 | Add to basket 31 | back to listing 32 |
-------------------------------------------------------------------------------- /web/sample_shop/templates/product_overview.tpl.php: -------------------------------------------------------------------------------- 1 | 20 | * 21 | * @author Scavix Software Ltd. & Co. KG http://www.scavix.com 22 | * @copyright since 2012 Scavix Software Ltd. & Co. KG 23 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 24 | */ 25 | ?> 26 |
27 | 28 |
29 |
30 | Details... 31 |
--------------------------------------------------------------------------------