      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:

    <?php

    namespace WPGMZA;

    require_once(__DIR__ . '/class.custom-fields.php');
    require_once(__DIR__ . '/class.custom-marker-fields.php');

    class CustomFieldsPage
    {
        public function __construct()
        {
            global $wpgmza;

            if(!CustomFields::installed())
                CustomFields::install();

            $wpgmza->loadScripts();

            $this->fontAwesomeIconPicker = new FontAwesomeIconPicker();

            wp_enqueue_script('wpgmza-custom-fields-page', plugin_dir_url(WPGMZA_PRO_FILE) . 'js/custom-fields-page.js');
        }

        /**
         * Called when POSTing custom field data through WP admin post hook
         * @return void
         */
        public static function POST()
        {
            global $wpdb;
            global $WPGMZA_TABLE_NAME_CUSTOM_FIELDS;

            $numFields = count($_POST['ids']);

            // Remove fields which aren't in POST from the DB
            $qstr = "DELETE FROM $WPGMZA_TABLE_NAME_CUSTOM_FIELDS";
            if($numFields > 0)
                $qstr .= " WHERE id NOT IN (" . implode(',', array_map('intval', $_POST['ids'])) . ")";
            $wpdb->query($qstr);

            // Iterate over fields in POST
            for($i = 0; $i < $numFields; $i++)
            {
                $id             = $_POST['ids'][$i];
                $name           = $_POST['names'][$i];
                $icon           = $_POST['icons'][$i];
                $attributes     = stripslashes($_POST['attributes'][$i]);
                $widget_type    = $_POST['widget_types'][$i];

                if(!json_decode($attributes))
                    throw new \Exception('Invalid attribute JSON');

                if($id == -1 || empty($id))
                {
                    $qstr = "INSERT INTO $WPGMZA_TABLE_NAME_CUSTOM_FIELDS (name, icon, attributes, widget_type) VALUES (%s, %s, %s, %s)";
                    $params = array($name, $icon, $attributes, $widget_type);
                }
                else
                {
                    $qstr = "UPDATE $WPGMZA_TABLE_NAME_CUSTOM_FIELDS SET name=%s, icon=%s, attributes=%s, widget_type=%s WHERE id=%s";
                    $params = array($name, $icon, $attributes, $widget_type, $id);
                }

                $stmt = $wpdb->prepare($qstr, $params);
                $wpdb->query($stmt);
            }

            wp_redirect( admin_url('admin.php') . '?page=wp-google-maps-menu-custom-fields' );
            exit;
        }

        /**
         * Echos attribute table HTML for the given field
         * @return void
         */
        protected function attributeTableHTML($field)
        {
            $attributes = json_decode($field->attributes);

            ?>
            <input name="attributes[]" type="hidden"/>
            <table class="attributes">
                <tbody>
                    <?php
                    foreach($attributes as $key => $value)
                    {
                    ?>
                        <tr>
                            <td>
                                <input
                                    placeholder="<?php _e('Name', 'wp-google-maps'); ?>"
                                    class="attribute-name"
                                    value="<?php echo $key; ?>"
                                    />
                            </td>
                            <td>
                                <input
                                    placeholder="<?php _e('Value', 'wp-google-maps'); ?>"
                                    class="attribute-value"
                                    value="<?php echo $value; ?>"
                                    />
                            </td>
                        </tr>
                    <?php
                    }
                    ?>
                </tbody>
            </table>
            <?php
        }

        /**
         * Echos the custom field page table
         * @return void
         */
        protected function tableBodyHTML()
        {
            global $wpdb;
            global $WPGMZA_TABLE_NAME_CUSTOM_FIELDS;

            $fields = $wpdb->get_results("SELECT * FROM $WPGMZA_TABLE_NAME_CUSTOM_FIELDS");

            foreach($fields as $obj)
            {
                ?>
                <tr>
                    <td>
                        <input name="ids[]" value="<?php echo $obj->id; ?>"/>
                    </td>
                    <td>
                        <input name="names[]" value="<?php echo addslashes($obj->name); ?>"/>
                    </td>
                    <td>
                        <input class="wpgmza-fontawesome-iconpicker" name="icons[]" value="<?php echo $obj->icon; ?>"/>
                    </td>
                    <td>
                        <?php

                        $this->attributeTableHTML($obj);

                        ?>
                    </td>
                    <td>
                        <?php
                        $options = array(
                            'none'          => 'None',
                            'text'          => 'Text',
                            'dropdown'      => 'Dropdown',
                            'checkboxes'    => 'Checkboxes'
                        );
                        ?>

                        <select name="widget_types[]">
                            <?php
                            foreach($options as $value => $text)
                            {
                                ?>
                                <option value="<?php echo $value; ?>"
                                <?php
                                if($obj->widget_type == $value)
                                    echo ' selected="selected"';
                                ?>
                                    >
                                    <?php echo __($text, 'wp-google-maps'); ?>
                                </option>
                                <?php
                            }

                            // Use this filter to add options to the dropdown
                            $custom_options = apply_filters('wpgmza_custom_fields_widget_type_options', $obj);

                            if(is_string($custom_options))
                                echo $custom_options;

                            ?>
                        </select>
                    </td>
                    <td>
                        <button type='button' class='button wpgmza-delete-custom-field'><i class='fa fa-trash-o' aria-hidden='true'></i></button>
                    </td>
                </tr>
                <?php
            }
        }

        /**
         * Echos the custom fields page
         * @return void
         */
        public function html()
        {
            ?>

            <form id="wpgmza-custom-fields"
                action="<?php echo admin_url('admin-post.php'); ?>"
                method="POST">

                <input name="action" value="wpgmza_save_custom_fields" type="hidden"/>

                <h1>
                    <?php
                    _e('WP Google Maps - Custom Fields', 'wp-google-maps');
                    ?>
                </h1>

                <table class="wp-list-table widefat fixed striped pages">
                    <thead>
                        <tr>
                            <th scope="col" id="id" class ="manage-column column-id">
                                <?php
                                _e('ID', 'wp-google-maps');
                                ?>
                            </th>
                            <th scope="col" id="id" class ="manage-column column-id">
                                <?php
                                _e('Name', 'wp-google-maps');
                                ?>
                            </th>
                            <th>
                                <?php
                                _e('Icon', 'wp-google-maps');
                                ?>
                            </th>
                            <th>
                                <?php
                                _e('Attributes', 'wp-google-maps');
                                ?>
                            </th>
                            <th>
                                <?php
                                _e('Filter Type', 'wp-google-maps');
                                ?>
                            </th>
                            <th>
                                <?php
                                _e('Actions', 'wp-google-maps');
                                ?>
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                        $this->tableBodyHTML();
                        ?>

                        <tr id="wpgmza-new-custom-field">
                            <td>
                                <input
                                    name="ids[]"
                                    value="-1"
                                    readonly
                                    />
                            </td>
                            <td>
                                <input
                                    required
                                    name="names[]"
                                    />
                            </td>
                            <td>
                                <input name="icons[]" class="wpgmza-fontawesome-iconpicker"/>
                            </td>
                            <td>
                                <input name="attributes[]" type="hidden"/>
                                <table class="attributes">
                                    <tbody>
                                        <tr>
                                            <td>
                                                <input
                                                    placeholder="<?php _e('Name', 'wp-google-maps'); ?>"
                                                    class="attribute-name"
                                                    />
                                            </td>
                                            <td>
                                                <input
                                                    placeholder="<?php _e('Value', 'wp-google-maps'); ?>"
                                                    class="attribute-value"
                                                    />
                                            </td>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                            <td>
                                <select name="widget_types[]">
                                    <option value="none">
                                        <?php
                                        _e('None', 'wp-google-maps');
                                        ?>
                                    </option>
                                    <option value="text">
                                        <?php
                                        _e('Text', 'wp-google-maps');
                                        ?>
                                    </option>
                                    <option value="dropdown">
                                        <?php
                                        _e('Dropdown', 'wp-google-maps');
                                        ?>
                                    </option>
                                    <option value="checkboxes">
                                        <?php
                                        _e('Checkboxes', 'wp-google-maps');
                                        ?>
                                    </option>
                                    <?php
                                    // Use this filter to add options to the dropdown
                                    echo apply_filters('wpgmza_custom_fields_widget_type_options', '');
                                    ?>
                                </select>
                            </td>
                            <td>
                                <button type="submit" class="button button-primary wpgmza-add-custom-field">
                                    <?php
                                    _e('Add', 'wp-google-maps');
                                    ?>
                                </button>
                            </td>
                        </tr>
                    </tbody>
                </table>

                <p style="text-align: center;">
                    <input
                        type="submit"
                        class="button button-primary"
                        value="<?php _e('Save', 'wp-google-maps'); ?>"
                        />
                </p>
            </form>

            <?php
        }
    }

    // Bind post listener
    add_action('admin_post_wpgmza_save_custom_fields', array('WPGMZA\\CustomFieldsPage', 'POST'));

    // Display function for menu hook
    function show_custom_fields_page()
    {
        $page = new CustomFieldsPage();
        $page->html();
    }