Skip to content

PHP to Workflow Diagram is a library that enables bidirectional conversion between PHP code and visual workflow diagrams. It transforms PHP logic into low-code, visual diagrams, and converts those diagrams back into fully functional PHP code. This approach lets both programmers and non-programmers manage application logic visually or through code.

License

Unknown and 3 other licenses found

Licenses found

Unknown
LICENSE.md
Apache-2.0
LICENSE_APACHE_2.md
BSD-3-Clause
LICENSE_BSD_3C.md
LGPL-3.0
LICENSE_GNU_LGPL_3.md
Notifications You must be signed in to change notification settings

a19836/php-to-workflow-diagram

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

PHP to Workflow Diagram

Original Repos:

Overview

PHP to Workflow Diagram is a library that enables bidirectional conversion between PHP code and visual workflow diagrams.
It transforms PHP logic into low-code, visual diagrams, and converts those diagrams back into fully functional PHP code.

This approach allows non-programmers to design and maintain application logic visually, while still producing clean, structured, and executable PHP code. At the same time, developers benefit from a controlled, standardized, and predictable architecture, reducing errors and improving maintainability.

With this library, users can:

  • Design application logic visually using workflows
  • Generate PHP code automatically from diagrams
  • Convert existing PHP logic into editable visual workflows
  • Enforce standardized logic patterns and execution flows
  • Reduce complexity while maintaining full control over application behavior

This library bridges the gap between low-code tools and traditional PHP development, making it ideal for business logic modeling, workflow automation, and collaborative environments where both technical and non-technical users participate.

To better understand how diagram-to-code and code-to-diagram conversion works, please refer to this Tutorial.

To see a working example, open index.php on your server.


Requirements:

  • jquerytaskflowchart
  • jquerymystatusmessage
  • myhtmlbeautify
  • acecodeeditor
  • phpparser

Screenshots


Features

  • Convert PHP code into visual, low-code workflow diagrams
  • Generate fully functional PHP code from workflow diagrams
  • Enable bidirectional synchronization between diagrams and PHP source code
  • Allow non-programmers to build and maintain application logic visually
  • Enforce standardized and controlled execution flows
  • Reduce human error by validating logic at the workflow level
  • Support reusable workflow blocks and logic components
  • Provide clear separation between business logic and technical implementation
  • Allow developers to review, extend, and optimize generated PHP code
  • Ideal for workflow automation, business process modeling, and rule-based logic
  • Facilitate collaboration between technical and non-technical users
  • Improve maintainability by making application logic easier to understand and evolve

Usage

Short Example:

<script>
//call this function to convert the diagram into PHP code
generateCodeFromTasksFlow();

//call this function to convert the PHP code into a diagram
generateTasksFlowFromCode();
</script>

Complete Example:

Similiar to examples/index.php.

<?php
include_once __DIR__ . "/examples/init.php";

//define the file that the engine should get and set the workflow.
$path = !empty($_GET["path"]) ? $_GET["path"] : "code";
?>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link rel="icon" href="data:;base64,=" />
	
	<!-- DIAGRAM -->
	<link rel="stylesheet" href="examples/css/global.css" type="text/css" charset="utf-8" />
	<link rel="stylesheet" href="examples/css/bloxtor_global.css" type="text/css" charset="utf-8" />
	<script language="javascript" type="text/javascript" src="examples/js/global.js"></script>
	
	<!-- DIAGRAM - Add Fontawsome Icons CSS -->
	<link rel="stylesheet" href="jquerytaskflowchart/examples/logic_workflow/lib/fontawesome/css/all.min.css">

	<!-- DIAGRAM - Add Icons CSS files -->
	<link rel="stylesheet" href="examples/css/icons.css" type="text/css" charset="utf-8" />

	<!-- DIAGRAM - Colors -->
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/examples/logic_workflow/js/color.js"></script>
	
	<!-- DIAGRAM - Add jquery lib -->
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jquery/js/jquery-1.8.1.min.js"></script>
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jquery/js/jquery.center.js"></script>
	
	<!-- DIAGRAM - Add Jquery UI JS and CSS files -->
	<link rel="stylesheet" href="jquerytaskflowchart/lib/jqueryui/css/jquery-ui-1.11.4.css" type="text/css" />
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jqueryui/js/jquery-ui-1.11.4.min.js"></script>
	
	<!-- DIAGRAM - Add Jquery Tap-Hold Event JS file -->
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jquerytaphold/taphold.js"></script>

	<!-- DIAGRAM - Jquery Touch Punch to work on mobile devices with touch -->
	<script type="text/javascript" src="jquerytaskflowchart/lib/jqueryuitouchpunch/jquery.ui.touch-punch.min.js"></script>
	
	<!-- DIAGRAM - Add Fancy LighBox lib -->
	<link rel="stylesheet" href="jquerytaskflowchart/lib/jquerymyfancylightbox/css/style.css" type="text/css" charset="utf-8" media="screen, projection" />
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jquerymyfancylightbox/js/jquery.myfancybox.js"></script>

	<!-- DIAGRAM - Add LeaderLine main JS and CSS files -->
	<link rel="stylesheet" href="jquerytaskflowchart/lib/leaderline/leader-line.css" type="text/css" charset="utf-8" />
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/leaderline/leader-line.js"></script>
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/leaderline/LeaderLineFlowHandler.js"></script>

	<!-- DIAGRAM - Add TaskFlowChart main JS and CSS files -->
	<link rel="stylesheet" href="jquerytaskflowchart/css/style.css" type="text/css" charset="utf-8" />
	<link rel="stylesheet" href="jquerytaskflowchart/css/print.css" type="text/css" charset="utf-8" media="print" />
	<script type="text/javascript" src="jquerytaskflowchart/js/ExternalLibHandler.js"></script>
	<script type="text/javascript" src="jquerytaskflowchart/js/TaskFlowChart.js"></script>

	<!-- DIAGRAM - Add ContextMenu main JS and CSS files -->
	<link rel="stylesheet" href="jquerytaskflowchart/lib/jquerymycontextmenu/css/style.css" type="text/css" charset="utf-8" />
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jquerymycontextmenu/js/jquery.mycontextmenu.js"></script>

	<!-- DIAGRAM - Parse_Str -->
	<script type="text/javascript" src="jquerytaskflowchart/lib/phpjs/functions/strings/parse_str.js"></script>

	<!-- DIAGRAM - Add DropDowns main JS and CSS files -->
	<link rel="stylesheet" href="jquerytaskflowchart/lib/jquerysimpledropdowns/css/style.css" type="text/css" charset="utf-8" />
	<!--[if lte IE 7]>
		 <link rel="stylesheet" href="jquerytaskflowchart/lib/jquerysimpledropdowns/css/ie.css" type="text/css" charset="utf-8" />
	<![endif]-->
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/lib/jquerysimpledropdowns/js/jquery.dropdownPlain.js"></script>
	
	<!-- DIAGRAM - Add Menus JS file -->
	<script language="javascript" type="text/javascript" src="jquerytaskflowchart/js/menu.js"></script>
	
	<!-- DIAGRAM - Add TASKS JS and CSS files -->
	<?php echo printTasksCSSAndJS($tasks_settings, $webroot_cache_folder_path, $webroot_cache_folder_url); ?>
	
	<!-- CODE -->
	<!-- CODE - Add ACE-Editor -->
	<script type="text/javascript" src="vendor/acecodeeditor/src-min-noconflict/ace.js"></script>
	<script type="text/javascript" src="vendor/acecodeeditor/src-min-noconflict/ext-language_tools.js"></script>
	
	<!-- CODE - Message -->
	<link rel="stylesheet" href="vendor/jquerymystatusmessage/css/style.css" type="text/css" charset="utf-8" />
	<script language="javascript" type="text/javascript" src="vendor/jquerymystatusmessage/js/statusmessage.js"></script>
	
	<!-- CODE - (optional) Add Code Beautifier -->
	<script language="javascript" type="text/javascript" src="vendor/myhtmlbeautify/vendor/mycodebeautifier/js/MyCodeBeautifier.js"></script>

	<!-- CODE - (optional) Add Html/CSS/JS Beautify code -->
	<script language="javascript" type="text/javascript" src="vendor/myhtmlbeautify/vendor/jsbeautify/js/lib/beautify.js"></script>
	<script language="javascript" type="text/javascript" src="vendor/myhtmlbeautify/vendor/jsbeautify/js/lib/beautify-css.js"></script>
	
	<!-- CODE - Add MyHtmlBeautify code -->
	<script language="javascript" type="text/javascript" src="vendor/myhtmlbeautify/MyHtmlBeautify.js"></script>
	
	<!-- LOCAL -->
	<link rel="stylesheet" type="text/css" href="examples/css/bloxtor_layout.css" />
	<link rel="stylesheet" type="text/css" href="examples/css/style.css" />
	<script type="text/javascript" src="examples/js/script.js"></script>
	
	<script>
		var diagram_to_code_url = "examples/server/create_code_from_workflow_file.php?path=<?php echo $path; ?>_tmp";
		var code_to_diagram_url = "examples/server/create_workflow_file_from_code.php?path=<?php echo $path; ?>_tmp";
		var get_tasks_file_url = "examples/server/get_workflow_file.php?path=<?php echo $path; ?>";
		var set_tasks_file_url = "examples/server/set_workflow_file.php?path=<?php echo $path; ?>";
		var set_tmp_tasks_file_url = set_tasks_file_url + "_tmp";
		var get_tmp_tasks_file_url = get_tasks_file_url + "_tmp";
		var set_code_file_url = "server/set_code_file.php?path=<?php echo $path; ?>";
		var get_code_file_url = "server/get_code_file.php?path=<?php echo $path; ?>";
		
		;(function() {
			taskFlowChartObj.setTaskFlowChartObjOption("is_droppable_connection", true);
			taskFlowChartObj.setTaskFlowChartObjOption("add_default_start_task", true);
			taskFlowChartObj.setTaskFlowChartObjOption("resizable_task_properties", true);
			taskFlowChartObj.setTaskFlowChartObjOption("resizable_connection_properties", true);
			
			taskFlowChartObj.TaskFile.get_tasks_file_url = get_tasks_file_url;
			taskFlowChartObj.TaskFile.set_tasks_file_url = set_tasks_file_url;
			taskFlowChartObj.TaskFlow.default_connection_connector = "Straight";
			taskFlowChartObj.TaskFlow.default_connection_hover_color = null;
			taskFlowChartObj.TaskFlow.main_tasks_flow_obj_id = "taskflowchart > .tasks_flow";
			taskFlowChartObj.TaskFlow.main_tasks_properties_obj_id = "taskflowchart > .tasks_properties";
			taskFlowChartObj.TaskFlow.main_connections_properties_obj_id = "taskflowchart > .connections_properties";
			taskFlowChartObj.ContextMenu.main_tasks_menu_obj_id = "taskflowchart > .tasks_menu";
			taskFlowChartObj.ContextMenu.main_tasks_menu_hide_obj_id = "taskflowchart > .tasks_menu_hide";
			taskFlowChartObj.ContextMenu.main_workflow_menu_obj_id = "taskflowchart > .workflow_menu";
			
			taskFlowChartObj.Property.tasks_settings = {};
			taskFlowChartObj.Property.tasks_settings = <?php echo getTasksSettingsObj($tasks_settings); ?>;
			taskFlowChartObj.Container.tasks_containers = <?php echo getTasksContainersByTaskType($tasks_containers); ?>;
			
			taskFlowChartObj.init();
		})();
	</script>
</head>
<body>
	<div class="phptoworkflow ">
		<ul class="tabs">
			<li><a href="#code">Code</a></li>
			<li><a href="#ui">UI</a></li>
		</ul>
		
		<div id="code" class="code">
			<!-- CODE MENU -->
			<div id="code_menu" class="code_menu menu">
				<ul class="dropdown">
					<li class="" title="Save">
						<a onClick="saveCode();return false;"><i class="icon save"></i> Save</a>
					</li>
					<li class="" title="Generate Code From Diagram">
						<a onClick="generateCodeFromTasksFlow();return false;"><i class="icon generate_code_from_tasks_flow"></i> Generate Code From Diagram</a>
					</li>
				</ul>
			</div>
			<textarea></textarea>
		</div>
		
		<!-- Task Flow Chart -->
		<div id="ui" class="">
			<div id="taskflowchart" class="taskflowchart reverse resizable_task_properties resizable_connection_properties with_top_bar_menu fixed_side_properties auto_save_disabled">
			
				<!-- WORKFLOW MENU -->
				<div id="workflow_menu" class="workflow_menu menu">
					<ul class="dropdown">
						<li class="" title="Save">
							<a onClick="taskFlowChartObj.TaskFile.save();return false;"><i class="icon save"></i> Save</a>
						</li>
						<li class="" title="Generate Diagram From Code">
							<a onClick="generateTasksFlowFromCode();return false;"><i class="icon generate_tasks_flow_from_code"></i> Generate Diagram From Code</a>
						</li>
					</ul>
				</div>
				
				<!-- TASKS SIDE BAR -->
				<div class="tasks_menu scroll">
					<?php echo printTasksList($tasks_settings, $tasks_groups_by_tag, $tasks_order_by_tag); ?>
				</div>
				
				<!-- TASKS MENU HIDE -->
				<div class="tasks_menu_hide">
					<div class="button" onclick="taskFlowChartObj.ContextMenu.toggleTasksMenuPanel(this)"></div>
				</div>
				
				<!-- TASKS FLOW - CANVAS -->
				<div class="tasks_flow scroll">
					<?php echo printTasksContainers($tasks_containers); ?>
				</div>
				
				<!-- TASKS PROPERTIES -->
				<div class="tasks_properties hidden">
					<?php echo printTasksProperties($tasks_settings, $tasks_order_by_tag); ?>
				</div>
				
				<!-- CONNECTION PROPERTIES -->
				<div class="connections_properties hidden">
					<?php echo printConnectionsProperties($tasks_settings); ?>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

Extend Diagram Tasks

To create a new tasks you should follow this tutorial. But here it is a Task XML sample:

<?xml version="1.0" encoding="UTF-8"?>
<task>
	<label></label>
	<tag></tag>
	<!--files>
		<task_properties_html>WorkFlowTaskHtml.php</task_properties_html>
		<connection_properties_html>WorkFlowConnectionHtml.php</task_properties_html>
		<css>css/WorkFlowTask.css</css>
		<js>js/WorkFlowTask.js</js>
	</files-->
	<!--css></css-->
	<settings>
		<!--js_code></js_code-->
		<task_menu>
			<!--show_context_menu>0</show_context_menu>
			<show_set_label_menu>0</show_set_label_menu>
			<show_properties_menu>0</show_properties_menu>
			<show_start_task_menu>0</show_start_task_menu>
			<show_delete_menu>false</show_delete_menu-->
		</task_menu>
		<connection_menu>
			<!--show_context_menu>0</show_context_menu>
			<show_set_label_menu>0</show_set_label_menu>
			<show_properties_menu>0</show_properties_menu>
			<show_connector_types_menu>0</show_connector_types_menu>
			<show_overlay_types_menu>0</show_overlay_types_menu>
			<show_delete_menu>false</show_delete_menu-->
		</connection_menu>
		<callback>
			<on_load_task_properties></on_load_task_properties>
			<on_submit_task_properties></on_submit_task_properties>
			<on_complete_task_properties></on_complete_task_properties>
			<on_cancel_task_properties></on_cancel_task_properties>
			
			<on_load_connection_properties></on_load_connection_properties>
			<on_submit_connection_properties></on_submit_connection_properties>
			<on_complete_connection_properties></on_complete_connection_properties>
			<on_cancel_connection_properties></on_cancel_connection_properties>
			
			<on_start_task_label></on_start_task_label>
			<on_check_task_label></on_check_task_label>
			<on_submit_task_label></on_submit_task_label>
			<on_cancel_task_label></on_cancel_task_label>
			<on_complete_task_label></on_complete_task_label>
			
			<on_check_connection_label></on_check_connection_label>
			<on_submit_connection_label></on_submit_connection_label>
			<on_cancel_connection_label></on_cancel_connection_label>
			<on_complete_connection_label></on_complete_connection_label>
			
			<on_success_task_cloning></on_success_task_cloning>
			<on_success_task_append></on_success_task_append>
			<on_success_task_creation></on_success_task_creation>
			<on_check_task_deletion></on_check_task_deletion>
			<on_success_task_deletion></on_success_task_deletion>
			<on_task_drag_stop_validation></on_task_drag_stop_validation>
			<on_task_drag_stop_end></on_task_drag_stop_end>
			
			<on_success_task_between_connection></on_success_task_between_connection>
			<on_success_connection_drag></on_success_connection_drag>
			<on_success_connection_drop></on_success_connection_drop>
			<on_success_connection_deletion></on_success_connection_deletion>
			
			<on_show_task_menu></on_show_task_menu>
			<on_show_connection_menu></on_show_connection_menu>
			
			<on_click_task></on_click_task>
			<on_click_connection></on_click_connection>
		</callback>
		<center_inner_elements></center_inner_elements>
		<is_resizable_task></is_resizable_task>
		<allow_inner_tasks_outside_connections>1</allow_inner_tasks_outside_connections>
	</settings>
	<code_parser>
		<statements></statements>
		<reserved_static_method_class_names></reserved_static_method_class_names>
		<reserved_object_method_names></reserved_object_method_names>
		<reserved_function_names></reserved_function_names>
	</code_parser>
</task>

About

PHP to Workflow Diagram is a library that enables bidirectional conversion between PHP code and visual workflow diagrams. It transforms PHP logic into low-code, visual diagrams, and converts those diagrams back into fully functional PHP code. This approach lets both programmers and non-programmers manage application logic visually or through code.

Topics

Resources

License

Unknown and 3 other licenses found

Licenses found

Unknown
LICENSE.md
Apache-2.0
LICENSE_APACHE_2.md
BSD-3-Clause
LICENSE_BSD_3C.md
LGPL-3.0
LICENSE_GNU_LGPL_3.md

Stars

Watchers

Forks

Packages

No packages published