1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 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: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 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: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453:
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
class Inbound_Template_Utils {
static $activate_msg = '<h1>Hello and welcome to Inbound Now dev tools</h1>
<p>Dev tools were created to help you, the developer, quickly create templates for all of inbound now plugins.</p>
<p>You need will need <strong>inbound now pro</strong> activated to use this screen.</p>';
public function __construct() {
self::init();
}
public function init() {
add_action('admin_menu', array( __CLASS__ , 'add_screen' ) );
}
static function add_screen() {
if (!function_exists('acf_get_field_groups')) {
return;
}
add_submenu_page(
'edit.php?post_type=landing-page',
__( 'Developer Tools' , 'inbound-pro' ),
__( 'Developer Tools' , 'inbound-pro' ),
'manage_options',
'template_utils',
array( __CLASS__ , 'html' )
);
}
static function get_json() {
if (!function_exists('acf_get_field_group')) {
echo self::$activate_msg;
exit;
}
$keys = (isset($_GET['generate-template-id'])) ? array(sanitize_text_field($_GET['generate-template-id'])) : array();
if( empty($keys) ) {
return false;
}
$json = array();
foreach( $keys as $key ) {
$field_group = acf_get_field_group( $key );
if( empty($field_group) ) {
continue;
}
$field_group['fields'] = acf_get_fields( $field_group );
$field_group['fields'] = acf_prepare_fields_for_export( $field_group['fields'] );
$id = acf_extract_var( $field_group, 'ID' );
$json[] = $field_group;
}
return $json;
}
static function tabs($count) {
$tabs = "";
for ($i=0; $i < $count; $i++) {
$tabs .= "\t";
}
return $tabs;
}
static function inbound_repeater_output($field, $indent = 0, $wrap = true){
$sp = $indent;
$output = "";
if($wrap) {
$output = self::tabs(1 + $sp) . "<?php"."\r\n";
}
$output .= self::tabs(1 + $sp) ."/* Start ".$field['name']." Repeater Output */" ."\r\n";
$output .= self::tabs(1 + $sp) .'if ( have_rows( "'.$field['name'].'" ) ) { ?>'. "\r\n\r\n";
$output .= self::tabs(2 + $sp) .'<?php while ( have_rows( "'.$field['name'].'" ) ) : the_row();' . "\r\n";
foreach ($field['sub_fields'] as $sub) {
$output .= self::tabs(4 + $sp) ."$".$sub['name']. " = " . "get_sub_field(\"".$sub['name']."\");"."\r\n";
}
$output .= self::tabs(2 + $sp) .'?>'."\r\n\r\n";
$output .= self::tabs(2 + $sp) .'<!-- your markup here -->'."\r\n\r\n";
$output .= self::tabs(2 + $sp) .'<?php endwhile; ?>'."\r\n\r\n";
$output .= self::tabs(1 + $sp) .'<?php } /* end if have_rows('.$field['name'].') */'."\r\n";
$output .= self::tabs(1 + $sp) ."/* End ".$field['name']." Repeater Output */" ."\r\n";
if($wrap) {
$output .= self::tabs(1 + $sp) ."?>" ."\r\n\r\n";
}
return $output;
}
static function html($args) {
if(isset($_POST) && !empty($_POST)) {
return;
}
?>
<div class="wrap acf-settings-wrap">
<h2><?php _e('Import / Export', 'acf'); ?></h2>
<div class="acf-box">
<div class="title">
<h3><?php _e('Generate Your Template Output', 'inboundnow'); ?></h3>
</div>
<div class="inner">
<script type="text/javascript">
function replaceUrlParam(url, paramName, paramValue){
var pattern = new RegExp('('+paramName+'=).*?(&|$)')
var newUrl=url
if(url.search(pattern)>=0){
newUrl = url.replace(pattern,'$1' + paramValue + '$2');
}
else{
newUrl = newUrl + (newUrl.indexOf('?')>0 ? '&' : '?') + paramName + '=' + paramValue
}
return newUrl
}
jQuery(document).ready(function($) {
jQuery("#generate_template").on('change', function () {
var val = jQuery(this).val();
var newUrl = replaceUrlParam(window.location.href, 'generate-template-id', val);
window.location.href = newUrl;
});
});
</script>
<div id="options-available">
<?php
$choices = array('none' => "Choose template");
$field_groups_ids = acf_get_field_groups();
if( !empty($field_groups_ids) ) {
foreach( $field_groups_ids as $field_group ) {
$choices[ $field_group['key'] ] = $field_group['title'];
}
}
echo "<label>Select the ACF options you wish to generate markup for</label>";
$acf_id = (isset($_GET['generate-template-id'])) ? sanitize_text_field($_GET['generate-template-id']) : false;
$template_name = (isset($_GET['template-name'])) ? sanitize_text_field($_GET['template-name']) : '';
acf_render_field(array(
'type' => 'select',
'name' => 'generate_template',
'prefix' => false,
'value' => $acf_id,
'toggle' => true,
'choices' => $choices,
));
acf_render_field(array(
'type' => 'text',
'name' => 'template_name',
'prefix' => false,
'value' => $template_name,
'placeholder' => "Template Name"
)); ?>
</div>
<p>This page is for helping developing templating super simple.</p>
<p>This is generated output from your landing page options to copy/paste into your index.php</p>
<?php
$json = self::get_json();
if( $json === false || empty($json)) {
acf_add_admin_notice( __("No field groups selected", 'acf') , 'error');
exit;
}
$field_groups = $json;
?>
<textarea style="width:100%; height:500px;" class="pre" readonly="true">
<?php echo "<?php
/**
* Template Name: __TEMPLATE_NAME__
* @package WordPress Landing Pages
* @author Inbound Template Generator
*/
/* Declare Template Key */
\$key = basename(dirname(__FILE__));
/* discover the absolute path of where this template is located. Core templates are loacted in /wp-content/plugins/landing-pages/templates/ while custom templates belong in /wp-content/uploads/landing-pages/tempaltes/ */
\$path = (preg_match(\"/uploads/\", dirname(__FILE__))) ? LANDINGPAGES_UPLOADS_PATH . \$key .'/' : LANDINGPAGES_PATH.'templates/'.\$key.'/';
\$urlpath = (preg_match(\"/uploads/\", dirname(__FILE__))) ? LANDINGPAGES_UPLOADS_URLPATH . \$key .'/' : LANDINGPAGES_URLPATH.'templates/'.\$key.'/';
/* Include ACF Field Definitions */
include_once(\$path .'config.php');
/* Define Landing Pages's custom pre-load hook for 3rd party plugin integration */
do_action('wp_head');
\$post_id = get_the_ID(); ";?>
?>
<?php
echo '<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<!-- Define page title -->
<title><?php wp_title(); ?></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- include your assets -->
<!-- <link rel="stylesheet" href="<?php echo $urlpath; ?>css/css_file_name.css"> -->
<!-- <script src="<?php echo $urlpath; ?>js/js_file_name.js"></script> -->
<!-- Load Normal WordPress wp_head() function -->
<footer>
<?php do_action("wp_footer"); ?>
<!-- Load Landing Pages\'s custom pre-load hook for 3rd party plugin integration -->
<?php do_action("lp_head"); ?>
</footer>
</head>'. "\r\n\r\n".
'<body>'. "\r\n\r\n";
if(isset($field_groups)) {
echo "<?php ". "\r\n\r\n";
foreach( $field_groups as $field_group ) {
foreach( $field_group['fields'] as $field ) {
if($field['type'] === "repeater") {
$repeater = self::inbound_repeater_output($field);
echo $repeater;
} else if($field['type'] === "flexible_content") {
echo "/* Start ".$field['name']." Flexible Content Area Output */" ."\r\n";
echo "\tif(function_exists('have_rows')) :" ."\r\n";
echo "\t\tif(have_rows('".$field['name']."')) :" ."\r\n";
echo "\t\t\t while(have_rows('".$field['name']."')) : the_row();" ."\r\n";
echo "\t\t\t\t switch(get_sub_field('acf_fc_layout')) :" ."\r\n";
foreach ($field['layouts'] as $layout) {
echo "\t\t\t\t/* start layout ".$layout['name']." */"."\r\n";
echo "\t\t\t\t case '".$layout['name']."' : " ."\r\n";
foreach ($layout['sub_fields'] as $layout_subfield) {
if($layout_subfield['type'] ==='repeater') {
$test = self::inbound_repeater_output($layout_subfield, 4, false);
echo $test;
} else {
echo "\t\t\t\t\t$".$layout_subfield['name']. " = " . "get_sub_field(\"".$layout_subfield['name']."\");"."\r\n";
}
}
echo "\t\t\t?>"."\r\n\r\n";
echo "\t\t\t<!-- your markup here -->"."\r\n\r\n";
echo "\t\t\t<?php break;". "\r\n";
}
echo "\t\t\t\tendswitch; /* end switch statement */ "."\r\n";
echo "\t\t\tendwhile; /* end while statement */"."\r\n";
echo "\t\t endif; /* end have_rows */"."\r\n";
echo "\tendif; /* end function_exists */"."\r\n";
echo "/* End ".$field['name']." Flexible Content Area Output */" ."\r\n\r\n";
} else {
if($field['name']) {
echo "\t$".$field['name']. " = " . "get_field(\"".$field['name']."\", \$post_id);"."\r\n";
}
}
}
}
echo "?>"."\r\n\r\n";
echo "<?php "."\r\n";
echo "do_action('lp_footer');"."\r\n";
echo "do_action('wp_footer');"."\r\n";
echo "?>"."\r\n";
echo "</body>"."\r\n";
echo "</html>"."\r\n";
}
?>
</textarea>
<p>This is the config.php file</p>
<?php ?>
<textarea class="pre" readonly="true"><?php
echo "if( function_exists('acf_add_local_field_group') ):" . "\r\n" . "\r\n";
foreach( $field_groups as $field_group ) {
$code = var_export($field_group, true);
$code = str_replace(" ", "\t", $code);
$code = preg_replace('/([\t\r\n]+?)array/', 'array', $code);
$code = preg_replace('/[0-9]+ => array/', 'array', $code);
echo "acf_add_local_field_group({$code});" . "\r\n" . "\r\n";
}
echo "endif;";
?></textarea>
</div>
</div>
</div>
<div class="acf-hidden">
<style type="text/css">
textarea.pre {
width: 100%;
padding: 15px;
font-size: 14px;
line-height: 1.5em;
resize: none;
}
</style>
<script type="text/javascript">
(function($){
var i = 0;
$(document).on('click', 'textarea.pre', function(){
if( i == 0 )
{
i++;
$(this).focus().select();
return false;
}
});
$(document).on('keyup', 'textarea.pre', function(){
$(this).height( 0 );
$(this).height( this.scrollHeight );
});
$(document).ready(function(){
$('textarea.pre').trigger('keyup');
});
})(jQuery);
</script>
</div>
<?php
}
}
$Inbound_Template_Utils = new Inbound_Template_Utils();