Add APP_NAME constant
Improved issue display Add component::prepend Add switches to form html Updated form html to Bootstrap 5. Updated navigation html to Bootstrap 5.
This commit is contained in:
@ -46,12 +46,14 @@ class Components {
|
|||||||
self::$components[ $name ] = $value;
|
self::$components[ $name ] = $value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function unset( $name ) {
|
public static function unset( $name ) {
|
||||||
if ( isset( self::$components[ $name ] ) ) {
|
if ( isset( self::$components[ $name ] ) ) {
|
||||||
unset( self::$components[ $name ] );
|
unset( self::$components[ $name ] );
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function append( $name, $value ) {
|
public static function append( $name, $value ) {
|
||||||
if ( ! isset( self::$components[ $name ] ) ) {
|
if ( ! isset( self::$components[ $name ] ) ) {
|
||||||
return self::set( $name, $value );
|
return self::set( $name, $value );
|
||||||
@ -60,4 +62,13 @@ class Components {
|
|||||||
self::$components[ $name ] = $curr . $value;
|
self::$components[ $name ] = $curr . $value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function prepend( $name, $value ) {
|
||||||
|
if ( ! isset( self::$components[ $name ] ) ) {
|
||||||
|
return self::set( $name, $value );
|
||||||
|
}
|
||||||
|
$curr = self::$components[ $name ];
|
||||||
|
self::$components[ $name ] = $value . $curr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
namespace TheTempusProject\Houdini\Classes;
|
namespace TheTempusProject\Houdini\Classes;
|
||||||
|
|
||||||
|
use TheTempusProject\Canary\Bin\Canary as Debug;
|
||||||
use DateTimeZone;
|
use DateTimeZone;
|
||||||
|
|
||||||
class Forms {
|
class Forms {
|
||||||
@ -66,6 +67,9 @@ class Forms {
|
|||||||
case 'checkbox':
|
case 'checkbox':
|
||||||
$fieldHtml = self::getCheckboxHtml( $fieldname, $defaultValue );
|
$fieldHtml = self::getCheckboxHtml( $fieldname, $defaultValue );
|
||||||
break;
|
break;
|
||||||
|
case 'switch':
|
||||||
|
$fieldHtml = self::getSwitchHtml( $fieldname, $defaultValue );
|
||||||
|
break;
|
||||||
case 'timezone':
|
case 'timezone':
|
||||||
$fieldHtml = self::getTimezoneHtml( $defaultValue );
|
$fieldHtml = self::getTimezoneHtml( $defaultValue );
|
||||||
break;
|
break;
|
||||||
@ -76,19 +80,18 @@ class Forms {
|
|||||||
Debug::error( "unknown field type: $type" );
|
Debug::error( "unknown field type: $type" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$out .= '<div class="form-group">';
|
|
||||||
$out .= '<label for="' . $fieldname . '" class="col-lg-3 control-label">' . $fieldTitle . '</label>';
|
$out .= '<div class="mb-3">';
|
||||||
$out .= '<div class="col-lg-3">';
|
$out .= '<label for="' . $fieldname . '" class="form-label">' . $fieldTitle . '</label>';
|
||||||
$out .= $fieldHtml;
|
$out .= $fieldHtml;
|
||||||
$out .= '</div>';
|
|
||||||
// @todo need to remove this or make it more generic (can't depend on bedrock anymore)
|
// @todo need to remove this or make it more generic (can't depend on bedrock anymore)
|
||||||
if ( 'file' === $type ) {
|
if ( 'file' === $type ) {
|
||||||
$out .= '<div class="col-lg-3 avatar-125" align="center">';
|
$out .= '<div class="col-lg-3 avatar-125" align="center">';
|
||||||
$out .= '<img alt="User Avatar" src="' . $defaultValue . '" class="img-circle img-responsive">';
|
$out .= '<img alt="User Avatar" src="{ROOT_URL}' . $defaultValue . '" class="img-circle img-fluid p-2">';
|
||||||
$out .= '</div>';
|
$out .= '</div>';
|
||||||
}
|
}
|
||||||
$out .= '</div>';
|
$out .= '</div>';
|
||||||
return $out;
|
return Template::parse( $out );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getTimezoneHtml( $default ) {
|
public static function getTimezoneHtml( $default ) {
|
||||||
@ -117,7 +120,8 @@ class Forms {
|
|||||||
} else {
|
} else {
|
||||||
$checked = '';
|
$checked = '';
|
||||||
}
|
}
|
||||||
return '<input type="checkbox" class="form-control" name="' . $name . '" id="' . $name . '" value="true"' . $checked . '>';
|
return '<div class="form-check"><input class="form-check-input" type="checkbox" value="true" name="' . $name . '" id="' . $name . '"' . $checked . '>
|
||||||
|
<label class="form-check-label" for="' . $name . '">' . ucfirst($name) . '</label></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getTextHtml( $name, $default = '' ) {
|
public static function getTextHtml( $name, $default = '' ) {
|
||||||
@ -133,7 +137,8 @@ class Forms {
|
|||||||
|
|
||||||
public static function getSelectHtml( $name, $options, $default = null ) {
|
public static function getSelectHtml( $name, $options, $default = null ) {
|
||||||
$out = '<select name="' . $name . '" id="' . $name . '" class="form-control">';
|
$out = '<select name="' . $name . '" id="' . $name . '" class="form-control">';
|
||||||
if ( !is_string( $options ) ) {
|
|
||||||
|
if ( is_iterable( $options ) ) {
|
||||||
$out .= self::getOptionsHtml( $options, $default );
|
$out .= self::getOptionsHtml( $options, $default );
|
||||||
} else {
|
} else {
|
||||||
$out .= $options;
|
$out .= $options;
|
||||||
@ -190,4 +195,17 @@ class Forms {
|
|||||||
</fieldset>';
|
</fieldset>';
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getSwitchHtml( $name, $default = null ) {
|
||||||
|
$checked = '';
|
||||||
|
|
||||||
|
if ( ! empty( $default ) ) {
|
||||||
|
$checked = ' checked="checked"';
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = '<div class="mb-3 form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" name="' . $name . '" id="' . $name . '" value="true"' . $checked . '>
|
||||||
|
</div>';
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,9 @@ class Issues {
|
|||||||
$child = [ $child ];
|
$child = [ $child ];
|
||||||
}
|
}
|
||||||
foreach ( $child as $children ) {
|
foreach ( $child as $children ) {
|
||||||
|
if ( ! is_string( $children ) ) {
|
||||||
|
$children = var_export( $children, true );
|
||||||
|
}
|
||||||
$out .= '<li>' . $children . '</li>';
|
$out .= '<li>' . $children . '</li>';
|
||||||
}
|
}
|
||||||
$out .= '</ul>';
|
$out .= '</ul>';
|
||||||
|
@ -57,17 +57,36 @@ class Navigation extends Template {
|
|||||||
self::$menus_array[ $menuName ][] = self::normalizeLinkArray( $link );
|
self::$menus_array[ $menuName ][] = self::normalizeLinkArray( $link );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getMenuLinks( $menuName ) {
|
||||||
|
if ( !isset( self::$menus_array[ $menuName ] ) ) {
|
||||||
|
Debug::debug( 'menu link mot found, creating new:' . $menuName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$out = [];
|
||||||
|
foreach ( self::$menus_array[ $menuName ] as $key => $item) {
|
||||||
|
$filter = $item['filter'];
|
||||||
|
|
||||||
|
if ( ! empty( $filter ) ) {
|
||||||
|
$input = '{' . strtoupper($item['filter']) . '}testing{/' . strtoupper($item['filter']) . '}';
|
||||||
|
$output = Filters::apply( $input );
|
||||||
|
// 20 years later and a zero 'location' still gets me....
|
||||||
|
if ( ! stripos( $output, 'esting' ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$out[] = (object) $item;
|
||||||
|
}
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
public static function getListItem( $link, $class = '' ) {
|
public static function getListItem( $link, $class = '' ) {
|
||||||
$link = self::normalizeLinkArray( $link );
|
$link = self::normalizeLinkArray( $link );
|
||||||
if ( empty( $link ) ) {
|
if ( empty( $link ) ) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
if ( ! empty( $class ) ) {
|
|
||||||
$class = ' class="' . $class . '"';
|
|
||||||
}
|
|
||||||
// this is a good idea but it breaks active page select because the regex is not equipped to deal with the inclusion of a 'class' field in the list items field
|
// this is a good idea but it breaks active page select because the regex is not equipped to deal with the inclusion of a 'class' field in the list items field
|
||||||
// $list_item_class = ''; # the class for individual list items
|
// $list_item_class = ''; # the class for individual list items
|
||||||
$data = '<li'.$class.'><a href="' . $link['url'] . '">' . $link['text'] . '</a></li>';
|
$data = '<li class="'.$class.' nav-item"><a href="' . $link['url'] . '" class="nav-link">' . $link['text'] . '</a></li>';
|
||||||
if ( !empty( $link['filter'] ) ) {
|
if ( !empty( $link['filter'] ) ) {
|
||||||
$data = '{' . strtoupper($link['filter']) . '}'.$data.'{/' . strtoupper($link['filter']) . '}';
|
$data = '{' . strtoupper($link['filter']) . '}'.$data.'{/' . strtoupper($link['filter']) . '}';
|
||||||
$data = Filters::apply( $data );
|
$data = Filters::apply( $data );
|
||||||
@ -88,8 +107,8 @@ class Navigation extends Template {
|
|||||||
foreach ( $link['url'] as $key => $sub_link ) {
|
foreach ( $link['url'] as $key => $sub_link ) {
|
||||||
$sub_list .= self::getListItem( $sub_link, 'submenu' );
|
$sub_list .= self::getListItem( $sub_link, 'submenu' );
|
||||||
}
|
}
|
||||||
$list .= '<li>
|
$list .= '<li class="nav-item">
|
||||||
<a href="javascript:;" data-toggle="collapse" data-target="#menu-collapse-' . self::$collapse_count . '">
|
<a href="javascript:;" class="nav-link" data-toggle="collapse" data-target="#menu-collapse-' . self::$collapse_count . '">
|
||||||
' . $link['text'] . '<i class="fa fa-fw fa-caret-down"></i>
|
' . $link['text'] . '<i class="fa fa-fw fa-caret-down"></i>
|
||||||
</a>
|
</a>
|
||||||
<ul id="menu-collapse-' . self::$collapse_count . '" class="collapse">' . $sub_list . '</ul>
|
<ul id="menu-collapse-' . self::$collapse_count . '" class="collapse">' . $sub_list . '</ul>
|
||||||
@ -120,7 +139,6 @@ class Navigation extends Template {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( !empty( $previousCrumb ) ) {
|
if ( !empty( $previousCrumb ) ) {
|
||||||
$allCrumbs .= ' <b>></b> ';
|
|
||||||
$previousCrumb = trim( $previousCrumb ) . '/' . $crumb;
|
$previousCrumb = trim( $previousCrumb ) . '/' . $crumb;
|
||||||
} else {
|
} else {
|
||||||
$previousCrumb = $crumb;
|
$previousCrumb = $crumb;
|
||||||
@ -132,25 +150,27 @@ class Navigation extends Template {
|
|||||||
'view' === substr( $crumb, 0, 4 ) ||
|
'view' === substr( $crumb, 0, 4 ) ||
|
||||||
$url === Routes::getRequestUrl() ||
|
$url === Routes::getRequestUrl() ||
|
||||||
'edit' === substr( $crumb, 0, 4 ) ) {
|
'edit' === substr( $crumb, 0, 4 ) ) {
|
||||||
$allCrumbs .= '<b>' . ucfirst( $crumb ) . '</b>';
|
$allCrumbs .= '<li class="breadcrumb-item active" aria-current="page">' . ucfirst( $crumb ) . '</li>';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
$allCrumbs .= '<li class="breadcrumb-item"><a href="' . $url . '" class="text-decoration-none atb-green">' . ucfirst( $crumb ) . '</a></li>';
|
||||||
$allCrumbs .= '<a href="' . $url . '">' . ucfirst( $crumb ) . '</a>';
|
|
||||||
}
|
}
|
||||||
Components::set( $breadcrumb_component, $allCrumbs );
|
$nav = '';
|
||||||
|
$nav .= '<nav aria-label="breadcrumb">';
|
||||||
|
$nav .= ' <ol class="breadcrumb">';
|
||||||
|
$nav .= ' ' . $allCrumbs;
|
||||||
|
$nav .= ' </ol>';
|
||||||
|
$nav .= '</nav>';
|
||||||
|
Components::set( $breadcrumb_component, $nav );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function parses either given html or the current page content and sets
|
* This function parses either given html or the current page content and sets
|
||||||
* the current active page to selected within an html list.
|
* the current active page to selected within an html list.
|
||||||
*
|
*
|
||||||
* @param string $menu - The name of the view you wish to add. can be any arbitrary value if $view is
|
* @param string $menu - The name of the view you wish to add. can be any arbitrary value if $view is provided.
|
||||||
* provided.
|
* @param string $selectString - The string/url you are searching for, default model/controller is used if none is provided.
|
||||||
* @param string $selectString - The string/url you are searching for, default model/controller is used if none is
|
|
||||||
* provided.
|
|
||||||
* @param string $view - The html you want parsed, view is generated from menu name if $view is left blank
|
* @param string $view - The html you want parsed, view is generated from menu name if $view is left blank
|
||||||
*
|
|
||||||
* @return string|bool - returns bool if the menu was added to the page content or
|
* @return string|bool - returns bool if the menu was added to the page content or
|
||||||
* returns the parsed view if one was provided with the
|
* returns the parsed view if one was provided with the
|
||||||
* function call.
|
* function call.
|
||||||
|
@ -36,7 +36,7 @@ class Template {
|
|||||||
*/
|
*/
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
Debug::group( 'Template Constructor', 1 );
|
Debug::group( 'Template Constructor', 1 );
|
||||||
Components::set( 'SITENAME', 'Houdini Site' );
|
Components::set( 'SITENAME', APP_NAME );
|
||||||
Components::set( 'ROOT_URL', Routes::getRoot() );
|
Components::set( 'ROOT_URL', Routes::getRoot() );
|
||||||
Components::set( 'ROOT_ADDRESS', Routes::getAddress() );
|
Components::set( 'ROOT_ADDRESS', Routes::getAddress() );
|
||||||
Components::set( 'TITLE', '' );
|
Components::set( 'TITLE', '' );
|
||||||
@ -49,25 +49,25 @@ class Template {
|
|||||||
Filters::add( 'issues', '#{ISSUES}(.*?){/ISSUES}#is', ( Issues::hasIssues() ? '$1' : '' ), true );
|
Filters::add( 'issues', '#{ISSUES}(.*?){/ISSUES}#is', ( Issues::hasIssues() ? '$1' : '' ), true );
|
||||||
$notices = implode( '<br>', Issues::getNoticeMessages() );
|
$notices = implode( '<br>', Issues::getNoticeMessages() );
|
||||||
if ( !empty( $notices ) ) {
|
if ( !empty( $notices ) ) {
|
||||||
$notices = '<div class="alert alert-warning" role="alert">' . $notices . '</div>';
|
$notices = '<div class="alert alert-warning w-100" role="alert">' . $notices . '</div>';
|
||||||
}
|
}
|
||||||
Components::set( 'NOTICE', $notices );
|
Components::set( 'NOTICE', $notices );
|
||||||
|
|
||||||
$successes = implode( '<br>', Issues::getSuccessMessages() );
|
$successes = implode( '<br>', Issues::getSuccessMessages() );
|
||||||
if ( !empty( $successes ) ) {
|
if ( !empty( $successes ) ) {
|
||||||
$successes = '<div class="alert alert-success" role="alert">' . $successes . '</div>';
|
$successes = '<div class="alert alert-success w-100" role="alert">' . $successes . '</div>';
|
||||||
}
|
}
|
||||||
Components::set( 'SUCCESS', $successes );
|
Components::set( 'SUCCESS', $successes );
|
||||||
|
|
||||||
$errors = implode( '<br>', Issues::getErrorMessages() );
|
$errors = implode( '<br>', Issues::getErrorMessages() );
|
||||||
if ( !empty( $errors ) ) {
|
if ( !empty( $errors ) ) {
|
||||||
$errors = '<div class="alert alert-danger" role="alert">' . $errors . '</div>';
|
$errors = '<div class="alert alert-danger w-100" role="alert">' . $errors . '</div>';
|
||||||
}
|
}
|
||||||
Components::set( 'ERROR', $errors );
|
Components::set( 'ERROR', $errors );
|
||||||
|
|
||||||
$infos = implode( '<br>', Issues::getInfoMessages() );
|
$infos = implode( '<br>', Issues::getInfoMessages() );
|
||||||
if ( !empty( $infos ) ) {
|
if ( !empty( $infos ) ) {
|
||||||
$infos = '<div class="alert alert-info" role="alert">' . $infos . '</div>';
|
$infos = '<div class="alert alert-info w-100" role="alert">' . $infos . '</div>';
|
||||||
}
|
}
|
||||||
Components::set( 'INFO', $infos );
|
Components::set( 'INFO', $infos );
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,9 @@ if ( ! defined( 'HOUDINI_ROOT_DIRECTORY' ) ) {
|
|||||||
if ( ! defined( 'HOUDINI_CONFIG_DIRECTORY' ) ) {
|
if ( ! defined( 'HOUDINI_CONFIG_DIRECTORY' ) ) {
|
||||||
define( 'HOUDINI_CONFIG_DIRECTORY', HOUDINI_ROOT_DIRECTORY . 'config' . DIRECTORY_SEPARATOR );
|
define( 'HOUDINI_CONFIG_DIRECTORY', HOUDINI_ROOT_DIRECTORY . 'config' . DIRECTORY_SEPARATOR );
|
||||||
}
|
}
|
||||||
|
if (!defined('APP_NAME')) {
|
||||||
|
define('APP_NAME', 'Houdini Site');
|
||||||
|
}
|
||||||
// # Tell the app all constants have been loaded.
|
// # Tell the app all constants have been loaded.
|
||||||
if ( ! defined('HOUDINI_CONSTANTS_LOADED' ) ) {
|
if ( ! defined('HOUDINI_CONSTANTS_LOADED' ) ) {
|
||||||
define( 'HOUDINI_CONSTANTS_LOADED', true );
|
define( 'HOUDINI_CONSTANTS_LOADED', true );
|
||||||
|
Reference in New Issue
Block a user