worked on list for server plugins and sites.
sites and plugins now show list of which plugin or site are installed.
plugins detail page now allows editing of the site_plugins record.
*/
public $fields = false;
- public $postStats = false;
- public $postSent = false;
+ public $postOldVersions = false;
/**
* Constructor
*/
public function entryPostProcessing($r, $a)
{
+ if ( $this->postOldVersions ) {
+ // Get sites that have old versions of this plugin.
+ $r['oldDevVersions'] = $this->wpdb->get_results(
+ $this->wpdb->prepare(
+ "SELECT S.name
+ FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "sites S
+ LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "site_plugins SP ON (S.id = SP.site)
+ WHERE SP.plugin = %d",
+ $r['id']
+ ),
+ ARRAY_A
+ );
+ }
return $r;
}
'use' => 'a'
),
+ // Production
+ 'production' => array(
+ 'field' => 'production',
+ 'type' => 'checkbox',
+ 'required' => false,
+ 'use' => 'a'
+ ),
+
// Name
'name' => array (
'field' => 'name',
--- /dev/null
+<?php
+/**
+ * GLM Member-DB WordPress Add-On Plugin
+ * Data Class Email Messages
+ *
+ * PHP version 5.3
+ *
+ * @category Data
+ * @package GLM Member-DB
+ * @author Chuck Scott <cscott@gaslightmedia.com>
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: dataEvents.php,v 1.0 2011/01/25 19:31:47 cscott Exp $
+ */
+
+/**
+ * GlmDataEmailMessages class
+ *
+ * PHP version 5
+ *
+ * @category Data
+ * @package GLM Member DB
+ * @author Chuck Scott <cscott@gaslightmedia.com>
+ * @license http://www.gaslightmedia.com Gaslightmedia
+ * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott
+ * Exp $
+ */
+class GlmDataSitePlugin extends GlmDataAbstract
+{
+
+ /**
+ * WordPress Database Object
+ *
+ * @var $wpdb
+ * @access public
+ */
+ public $wpdb;
+ /**
+ * Plugin Configuration Data
+ *
+ * @var $config
+ * @access public
+ */
+ public $config;
+ /**
+ * Data Table Name
+ *
+ * @var $table
+ * @access public
+ */
+ public $table;
+ /**
+ * Field definitions
+ *
+ * 'type' is type of field as defined by the application
+ * text Regular text field
+ * pointer Pointer to an entry in another table
+ * 'filters' is the filter name for a particular filter ID in PHP filter
+ * functions
+ * See PHP filter_id()
+ *
+ * 'use' is when to use the field
+ * l = List
+ * g = Get
+ * n = New
+ * i = Insert
+ * e = Edit
+ * u = Update
+ * d = Delete
+ * a = All
+ *
+ * @var $ini
+ * @access public
+ */
+ public $fields = false;
+
+ /**
+ * Constructor
+ *
+ * @param object $d database connection
+ * @param array $config Configuration array
+ * @param bool $limitedEdit Flag to say indicate limited edit requested
+ *
+ * @return void
+ * @access public
+ */
+ public function __construct($wpdb, $config, $limitedEdit = false)
+ {
+
+ // If this class is not being extended along with existing $wpdb and $config
+ if (!$this->wpdb) {
+
+ // Save WordPress Database object
+ $this->wpdb = $wpdb;
+
+ // Save plugin configuration object
+ $this->config = $config;
+
+ }
+
+ /*
+ * Table Name
+ */
+ $this->table = GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . 'site_plugins';
+
+ /*
+ * Table Data Fields
+ */
+
+ $this->fields = array (
+
+ 'id' => array (
+ 'field' => 'id',
+ 'type' => 'integer',
+ 'view_only' => true,
+ 'use' => 'a'
+ ),
+
+ // Site
+ 'site' => array (
+ 'field' => 'site',
+ 'type' => 'pointer',
+ 'p_table' => GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . 'sites',
+ 'p_field' => 'name',
+ 'p_orderby' => 'name',
+ 'required' => true,
+ 'force_list' => true,
+ 'use' => 'a'
+ ),
+
+ // Plugin
+ 'plugin' => array (
+ 'field' => 'plugin',
+ 'type' => 'pointer',
+ 'p_table' => GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . 'plugins',
+ 'p_field' => 'name',
+ 'p_orderby' => 'name',
+ 'required' => true,
+ 'force_list' => true,
+ 'use' => 'a'
+ ),
+
+ // Prod Version
+ 'prod_version' => array (
+ 'field' => 'prod_version',
+ 'type' => 'text',
+ 'required' => true,
+ 'use' => 'a'
+ ),
+
+ // Development URL
+ 'dev_version' => array (
+ 'field' => 'dev_version',
+ 'type' => 'text',
+ 'required' => true,
+ 'use' => 'a'
+ ),
+
+ );
+
+ }
+
+ /**
+ * Entry Post Processing Call-Back Method
+ *
+ * Perform post-processing for all result entries.
+ *
+ * In this case we're using it to append an array of category
+ * data to each member result and also sort by member name.
+ *
+ * @param array $r Array of field result data for a single entry
+ * @param string $a Action being performed (l, i, g, ...)
+ *
+ * @return object Class object
+ *
+ */
+ public function entryPostProcessing($r, $a)
+ {
+ return $r;
+ }
+
+
+}
'map_key' => array (
'field' => 'map_key',
'type' => 'text',
- 'required' => true,
+ 'required' => false,
'use' => 'a'
),
*/
// Load Members data abstract
-// require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH.'/data/dataEmailMessages.php';
-// require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH.'/data/dataEmailTemplates.php';
+require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH . '/data/dataPlugins.php';
+require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH . '/data/dataSites.php';
+require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH . '/data/dataSitePlugins.php';
/*
* This class performs the work for the default action of the "Members" menu
switch ( $option ) {
- case 'plugins':
- $view = 'plugins';
- // Get list of plugins.
- $plugins = [
- [
- 'id' => 1,
- 'name' => 'glm-member-db',
- ],
- [
- 'id' => 2,
- 'name' => 'glm-member-db-contacts',
- ],
- [
- 'id' => 3,
- 'name' => 'glm-member-db-events',
- ],
- ];
- $tData['plugins'] = $plugins;
- break;
+ default:
+ $Plugins = new GlmDataPlugins( $this->wpdb, $this->config );
- case 'sites':
- $view = 'sites';
- // Get list of Sites.
- $sites = [
- [
- 'id' => 1,
- 'name' => 'Baraga County',
- ],
- [
- 'id' => 2,
- 'name' => 'Uptravel',
- ],
- [
- 'id' => 3,
- 'name' => 'WMTA',
- ],
- ];
- $tData['sites'] = $sites;
- break;
+ // Get list of Plugins.
+ // For this list display sites that need an update.
+ // $Plugins->postOldVersions = true;
+ $plugins = $Plugins->getResults( array( 'order' => 'T.name' ) );
- case 'servers':
- $view = 'servers';
- $servers = [
- [
- 'id' => 1,
- 'name' => 'dev55',
- ],
- [
- 'id' => 2,
- 'name' => 'dev70',
- ],
- [
- 'id' => 3,
- 'name' => 'eleusis',
- ],
- [
- 'id' => 4,
- 'name' => 'norax',
- ],
- ];
- $tData['servers'] = $servers;
- break;
+ // echo '<pre>$plugins: ' . print_r( $plugins, true ) . '</pre>';
+ $tData['plugins'] = $plugins;
- default:
break;
}
// Load Members data abstract
require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH.'/data/dataPlugins.php';
+require_once GLM_MEMBERS_PLUGINS_PLUGIN_CLASS_PATH.'/data/dataSitePlugins.php';
/*
* This class performs the work for the default action of the "Members" menu
switch ( $option ) {
+ case 'pluginSite':
+ $SitePlugins = new GlmDataSitePlugin( $this->wpdb, $this->config );
+ $view = 'plugin-site';
+ if ( isset( $_REQUEST['plugin_id'] ) && $id = filter_var( $_REQUEST['plugin_id'], FILTER_VALIDATE_INT ) ) {
+ // Get site id
+ if ( isset( $_REQUEST['site_id'] ) && $site = filter_var( $_REQUEST['site_id'], FILTER_VALIDATE_INT ) ) {
+ $sitePluginId = $this->wpdb->get_var(
+ $this->wpdb->prepare(
+ "SELECT id
+ FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "site_plugins
+ WHERE site = %d
+ AND plugin = %d",
+ $site,
+ $id
+ )
+ );
+ $tData['sitePlugin'] = $SitePlugins->editEntry( $sitePluginId );
+ }
+ }
+ break;
+
case 'save':
if ( isset( $_REQUEST['plugin_id'] ) && $id = filter_var( $_REQUEST['plugin_id'], FILTER_VALIDATE_INT ) ) {
$plugin = $this->updateEntry( $id );
- // echo '<pre>$plugin: ' . print_r( $plugin, true ) . '</pre>';
+ }
+
+ case 'savePluginSite':
+ $SitePlugins = new GlmDataSitePlugin( $this->wpdb, $this->config );
+ if ( isset( $_REQUEST['id'] ) && $id = filter_var( $_REQUEST['id'], FILTER_VALIDATE_INT ) ) {
+ $sitePlugin = $SitePlugins->updateEntry( $id );
}
case 'view':
- $view = 'plugin-detail';
+ $view = 'plugin-detail';
+ $orderBy = 'S.name';
if ( isset( $_REQUEST['plugin_id'] ) && $id = filter_var( $_REQUEST['plugin_id'], FILTER_VALIDATE_INT ) ) {
$plugin = $this->editEntry( $id );
$tData['plugin'] = $plugin;
+ if ( isset( $_REQUEST['order'] ) && $order = filter_var( $_REQUEST['order'], FILTER_SANITIZE_STRING ) ) {
+ switch ( $order ) {
+ case 'nameA':
+ $orderBy = 'S.name ASC';
+ break;
+ case 'nameD':
+ $orderBy = 'S.name DESC';
+ break;
+ case 'prod_serverA':
+ $orderBy = 'PS.name ASC,S.name ASC';
+ break;
+ case 'prod_serverD':
+ $orderBy = 'PS.name DESC,S.name ASC';
+ break;
+ case 'prod_versionA':
+ $orderBy = 'SP.prod_version ASC,S.name ASC';
+ break;
+ case 'prod_versionD':
+ $orderBy = 'SP.prod_version DESC,S.name ASC';
+ break;
+ case 'dev_serverA':
+ $orderBy = 'DS.name ASC,S.name ASC';
+ break;
+ case 'dev_serverD':
+ $orderBy = 'DS.name DESC,S.name ASC';
+ break;
+ case 'dev_versionA':
+ $orderBy = 'SP.dev_version ASC,S.name ASC';
+ break;
+ case 'dev_versionD':
+ $orderBy = 'SP.dev_version DESC,S.name ASC';
+ break;
+ }
+ }
// Find all sites for this plugin.
$tData['sites'] = $this->wpdb->get_results(
$this->wpdb->prepare(
- "SELECT S.name as site_name,SP.prod_version,SP.dev_version,PS.name as prod_server,DS.name as dev_server
+ "SELECT S.name as site_name,S.id,SP.prod_version,SP.dev_version,PS.name as prod_server,DS.name as dev_server
FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "site_plugins SP
LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "sites S ON (S.id = SP.site)
LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "servers PS ON (PS.id = S.prod_server)
LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "servers DS ON (DS.id = S.dev_server)
WHERE SP.plugin = %d
- ORDER BY S.name",
+ ORDER BY $orderBy",
$plugin['fieldData']['id']
),
ARRAY_A
switch ( $option ) {
+ case 'save':
+ if ( isset( $_REQUEST['server_id'] ) && $id = filter_var( $_REQUEST['server_id'], FILTER_VALIDATE_INT ) ) {
+ $plugin = $this->updateEntry( $id );
+ }
+
+ case 'view':
+ $view = 'server-detail';
+ if ( isset( $_REQUEST['server_id'] ) && $id = filter_var( $_REQUEST['server_id'], FILTER_VALIDATE_INT ) ) {
+ $server = $this->editEntry( $id );
+ $tData['server'] = $server;
+ if ( $server['fieldData']['production']['value'] ) {
+ $tData['sites'] = $this->wpdb->get_results(
+ $this->wpdb->prepare(
+ "SELECT S.name as site_name,S.prod_url as url
+ FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "sites S
+ LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "servers PS ON (PS.id = S.prod_server)
+ WHERE PS.id = %d
+ ORDER BY S.name",
+ $server['fieldData']['id']
+ ),
+ ARRAY_A
+ );
+ } else {
+ $tData['sites'] = $this->wpdb->get_results(
+ $this->wpdb->prepare(
+ "SELECT S.name as site_name,S.dev_url as url
+ FROM " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "sites S
+ LEFT OUTER JOIN " . GLM_MEMBERS_PLUGINS_PLUGIN_DB_PREFIX . "servers DS ON (DS.id = S.dev_server)
+ WHERE DS.id = %d
+ ORDER BY S.name",
+ $server['fieldData']['id']
+ ),
+ ARRAY_A
+ );
+ }
+ }
+ break;
+
default:
break;
}
switch ( $option ) {
+ case 'save':
+ if ( isset( $_REQUEST['site_id'] ) && $id = filter_var( $_REQUEST['site_id'], FILTER_VALIDATE_INT ) ) {
+ $plugin = $this->updateEntry( $id );
+ }
+
+
case 'view':
$view = 'site-detail';
if ( isset( $_REQUEST['site_id'] ) && $id = filter_var( $_REQUEST['site_id'], FILTER_VALIDATE_INT ) ) {
location TINYTEXT NULL,
php_version TINYTEXT NULL,
mysql_version TINYTEXT NULL,
+ production BOOLEAN NOT NULL DEFAULT false,
PRIMARY KEY (id)
);
}
</style>
+{$baseUrl = "{$thisUrl}?page={$thisPage}&glm_action={$thisAction}&option=view&plugin_id={$plugin.fieldData.id}"}
+{$SitePluginUrl = "{$thisUrl}?page={$thisPage}&glm_action={$thisAction}plugin_id={$plugin.fieldData.id}"}
+
{if !empty($sites)}
<table class="stack hover">
<tr>
- <th class="text-left">Site Name</th>
- <th class="text-left">Prod Server</th>
- <th class="text-left">Prod Version</th>
- <th class="text-left">Dev Server</th>
- <th class="text-left">Dev Version</th>
+ <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'nameA'}nameA{else}nameD{/if}">Site Name</a></th>
+ <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'prod_serverA'}prod_serverA{else}prod_serverD{/if}">Prod Server</a></th>
+ <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'prod_versionA'}prod_versionA{else}prod_versionD{/if}">Prod Version</a></th>
+ <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'dev_serverA'}dev_serverA{else}dev_serverD{/if}">Dev Server</a></th>
+ <th class="text-left"><a href="{$baseUrl}&order={if !empty($smarty.request.order) && $smarty.request.order != 'dev_versionA'}dev_versionA{else}dev_versionD{/if}">Dev Version</a></th>
</tr>
{foreach $sites as $site}
<tr>
- <td>{$site.site_name}</td>
+ <td><a href="{$baseUrl}&option=pluginSite&site_id={$site.id}{if !empty($smarty.request.order)}&order={$smarty.request.order}{/if}">{$site.site_name}</a></td>
<td width="110">{$site.prod_server}</td>
<td width="110" class="{if !empty($site.prod_version) && version_compare( $plugin.fieldData.latest_version, $site.prod_version, '>' )}row-red{elseif !empty($site.prod_version)}row-green{/if}">{$site.prod_version}</td>
<td width="110">{$site.dev_server}</td>
--- /dev/null
+{* Plugin Site Add Edit Form *}
+
+{* Header *}
+{include file="admin/header.html"}
+<h3> {$sitePlugin.fieldData.site.name} - {$sitePlugin.fieldData.plugin.name} </h3>
+
+{* Grid Start *}
+{$ui = [
+ 'nowrap' => false,
+ 'backgroundColor' => '',
+ 'sectionColor' => ''
+]}
+{include file='ui/f6/grid-start.html'}
+
+{* Form Start *}
+{$ui = [
+ 'id' => 'id',
+ 'action' => "{$thisUrl}?page={$thisPage}",
+ 'method' => 'post',
+ 'file' => false,
+ 'validate' => true,
+ 'validateFocusMsg' => true,
+ 'leaveModifiedFormCheck' => true
+]}
+{include file='ui/f6/form-start.html'}
+
+ {* Form entry *}
+ {$data = $sitePlugin}
+
+ <input type="hidden" name="glm_action" value="plugins">
+ <input type="hidden" name="option" value="savePluginSite">
+ <input type="hidden" name="id" value="{$data.fieldData.id}">
+ <input type="hidden" name="plugin_id" value="{$data.fieldData.plugin.value}">
+ <input type="hidden" name="plugin" value="{$data.fieldData.plugin.value}">
+ <input type="hidden" name="site" value="{$data.fieldData.site.value}">
+ {if !empty($smarty.request.order)}
+ <input type="hidden" name="order" value="{$smarty.request.order}">
+ {/if}
+
+ {* Prod Version *}
+ {$ui = [
+ 'value' => $data.fieldData.prod_version,
+ 'field' => 'prod_version',
+ 'label' => 'Prod Version',
+ 'required' => $data.fieldRequired.prod_version,
+ 'errorText' => 'Prod Version is Required',
+ 'dataError' => $data.fieldFail.prod_version
+ ]}
+ {include file='ui/f6/text.html'}
+
+ {* Dev Version *}
+ {$ui = [
+ 'value' => $data.fieldData.dev_version,
+ 'field' => 'dev_version',
+ 'label' => 'Dev Version',
+ 'required' => $data.fieldRequired.dev_version,
+ 'errorText' => 'Dev Version is Required',
+ 'dataError' => $data.fieldFail.dev_version
+ ]}
+ {include file='ui/f6/text.html'}
+
+ {* Submit *}
+ {$ui = [
+ 'class' => 'primary',
+ 'label' => 'Save',
+ 'submit' => true,
+ 'id' => 'Save',
+ 'cancel' => ""
+ ]}
+ {include file='ui/f6/submit.html'}
+
+{* Form End *}
+{include file='ui/f6/form-end.html'}
+
+{* Grid End *}
+{include file='ui/f6/grid-end.html'}
+
+{* Footer *}
+{include file="../../admin/footer.html"}
--- /dev/null
+{* Server Detail View *}
+
+{* Headier *}
+{include file="admin/header.html"}
+<h3>{$server.fieldData.name|default:'New Server'}</h3>
+
+{* Grid Start *}
+{$ui = [
+ 'nowrap' => false,
+ 'backgroundColor' => '',
+ 'sectionColor' => ''
+]}
+{include file='ui/f6/grid-start.html'}
+
+{* Form Start *}
+{$ui = [
+ 'id' => 'id',
+ 'action' => "{$thisUrl}?page={$thisPage}",
+ 'method' => 'post',
+ 'file' => false,
+ 'validate' => true,
+ 'validateFocusMsg' => true,
+ 'leaveModifiedFormCheck' => true
+]}
+{include file='ui/f6/form-start.html'}
+
+ {$data = $server}
+
+ <input type="hidden" name="glm_action" value="servers">
+ <input type="hidden" name="option" value="save">
+ <input type="hidden" name="server_id" value="{$server.fieldData.id}">
+
+ {* Production *}
+ {$ui = [
+ 'value' => $data.fieldData.production.value,
+ 'field' => 'production',
+ 'label' => 'Production',
+ 'required' => $data.fieldRequired.production,
+ 'errorText' => 'Production is Required',
+ 'dataError' => $data.fieldFail.production
+ ]}
+ {include file='ui/f6/checkbox.html'}
+
+ {* Name *}
+ {$ui = [
+ 'value' => $data.fieldData.name,
+ 'field' => 'name',
+ 'label' => 'Name',
+ 'required' => $data.fieldRequired.name,
+ 'errorText' => 'Name is Required',
+ 'dataError' => $data.fieldFail.name
+ ]}
+ {include file='ui/f6/text.html'}
+
+ {* Location *}
+ {$ui = [
+ 'value' => $data.fieldData.location,
+ 'field' => 'location',
+ 'label' => 'Location',
+ 'required' => $data.fieldRequired.location,
+ 'errorText' => 'Location is Required',
+ 'dataError' => $data.fieldFail.location
+ ]}
+ {include file='ui/f6/text.html'}
+
+ {* PHP Version *}
+ {$ui = [
+ 'value' => $data.fieldData.php_version,
+ 'field' => 'php_version',
+ 'label' => 'PHP Version',
+ 'required' => $data.fieldRequired.php_version,
+ 'errorText' => 'PHP Version is Required',
+ 'dataError' => $data.fieldFail.php_version
+ ]}
+ {include file='ui/f6/text.html'}
+
+ {* Mysql Version *}
+ {$ui = [
+ 'value' => $data.fieldData.mysql_version,
+ 'field' => 'mysql_version',
+ 'label' => 'Mysql Version',
+ 'required' => $data.fieldRequired.mysql_version,
+ 'errorText' => 'Mysql Version is Required',
+ 'dataError' => $data.fieldFail.mysql_version
+ ]}
+ {include file='ui/f6/text.html'}
+
+ {* Save *}
+ {$ui = [
+ 'class' => 'primary',
+ 'label' => 'Save',
+ 'submit' => true,
+ 'id' => 'form-save',
+ 'cancel' => ""
+ ]}
+ {include file='ui/f6/submit.html'}
+
+{* Form End *}
+{include file='ui/f6/form-end.html'}
+
+<style>
+ input#location {
+ background-color: white !important;
+ color: rgb( 50, 55, 60 ) !important;
+ }
+</style>
+
+{if !empty($sites)}
+ <table class="stack hover">
+ <tr>
+ <th class="text-left">Site Name</th>
+ <th class="text-left">URL</th>
+ </tr>
+ {foreach $sites as $site}
+ <tr>
+ <td>{$site.site_name}</td>
+ <td>{$site.url}</td>
+ </tr>
+ {/foreach}
+ </table>
+{/if}
+
+{* Grid End *}
+{include file='ui/f6/grid-end.html'}
+
+<script>
+jQuery(document).ready(function($){
+ $(document).foundation();
+
+});
+</script>
+
+{* Footer *}
+{include file="../../admin/footer.html"}
{foreach $servers as $server}
<tr>
<td>{$server.id}</td>
- <td>{$server.name}</td>
+ <td><a href="{$thisUrl}?page={$thisPage}&glm_action={$thisAction}&option=view&server_id={$server.id}">{$server.name}</a></td>
<td>{$server.location}</td>
<td>{$server.php_version}</td>
<td>{$server.mysql_version}</td>
]}
{include file='ui/f6/checkbox.html'}
+ {* Save *}
+ {$ui = [
+ 'class' => 'primary',
+ 'label' => 'Save',
+ 'submit' => true,
+ 'id' => 'form-save',
+ 'cancel' => ""
+ ]}
+ {include file='ui/f6/submit.html'}
+
{* Form End *}
{include file='ui/f6/form-end.html'}