Completed
Push — master ( d4bee7...20651b )
by Brian
20s queued 16s
created

WPInv_Meta_Box_Payment_Form::output()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 78
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 33
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 78
rs 9.392

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
// MUST have WordPress.
3
if ( !defined( 'WPINC' ) ) {
4
    exit( 'Do NOT access this file directly: ' . basename( __FILE__ ) );
5
}
6
7
class WPInv_Meta_Box_Payment_Form {
8
9
    /**
10
     * Output payment form details.
11
     *
12
     * @param WP_Post $post
13
     */
14
    public static function output_details( $post ) {
15
        $details = get_post_meta( $post->ID, 'payment_form_data', true );
16
17
        if ( ! is_array( $details ) ) {
18
            return;
19
        }
20
21
        echo '<div class="gdmbx2-wrap form-table"> <div class="gdmbx2-metabox gdmbx-field-list">';
22
23
        foreach ( $details as $key => $value ) {
24
            $key = sanitize_text_field( $key );
25
26
            if ( is_array( $value ) ) {
27
                $value = implode( ',', $value );
28
            }
29
30
            $value = esc_html( $value );
31
32
            echo "<div class='gdmbx-row gdmbx-type-select'>";
33
            echo "<div class='gdmbx-th'><label>$key:</label></div>";
34
            echo "<div class='gdmbx-td'>$value</div></div>";
35
        }
36
37
        echo "</div></div>";
38
39
    }
40
41
    /**
42
     * Output fields.
43
     *
44
     * @param WP_Post $post
45
     */
46
    public static function output_shortcode( $post ) {
47
48
        if ( ! is_numeric( $post ) ) {
0 ignored issues
show
introduced by
The condition is_numeric($post) is always false.
Loading history...
49
            $post = $post->ID;
50
        }
51
52
        echo "<input type='text' style='min-width: 220px;' value='[wpinv_payment_form form=$post]' disabled>";
53
54
    }
55
    /**
56
     * Output fields.
57
     *
58
     * @param WP_Post $post
59
     */
60
    public static function output ( $post ) {
61
        $success_page        = get_post_meta( $post->ID, 'wpinv_success_page', true );
62
        $success_page        = empty( $success_page ) ? wpinv_get_success_page_uri() : $success_page
63
        ?>
64
65
        <div id="wpinv-form-builder" style="display: flex; flex-flow: wrap;">
66
67
            <div class="wpinv-form-builder-left bsui" style="flex: 0 0 320px;">
68
                <ul class="wpinv-form-builder-tabs  nav nav-tabs">
69
                    <li class='nav-item' v-if="active_tab!='new_item'">
70
                        <a @click.prevent="active_tab='new_item'" class="nav-link p-3" :class="{ 'active': active_tab=='new_item' }" href="#"><?php _e( 'Add new element', 'invoicing' ); ?></a>
71
                    </li>
72
                    <li class='nav-item' v-if='false'>
73
                        <a @click.prevent="active_tab='edit_item'" class="nav-link p-3" :class="{ 'active': active_tab=='edit_item' }" href="#"><?php _e( 'Edit element', 'invoicing' ); ?></a>
74
                    </li>
75
                    <li class='nav-item' v-if='false'>
76
                        <a @click.prevent="active_tab='settings'" class="nav-link p-3" :class="{ 'active': active_tab=='settings' }" href="#"><?php _e( 'Settings', 'invoicing' ); ?></a>
77
                    </li>
78
                </ul>
79
80
                <div class="wpinv-form-builder-tab-content bsui" style="margin-top: 16px;">
81
                    <div class="wpinv-form-builder-tab-pane" v-if="active_tab=='new_item'">
82
                        <div class="wpinv-form-builder-add-field-types">
83
                            <small class='form-text text-muted'><?php _e( 'Add an element by dragging it to the payment form.', 'invoicing' ); ?></small>
84
                            <draggable class="section mt-2" style="display: flex; flex-flow: wrap; justify-content: space-between;" v-model="elements" :group="{ name: 'fields', pull: 'clone', put: false }" :sort="false" :clone="addDraggedField" tag="ul" filter=".wpinv-undraggable">
85
                                <li v-for="element in elements" style="width: 49%; background-color: #fafafa; margin-bottom: 9px; cursor: move; border: 1px solid #eeeeee;" @click.prevent="addField(element)" :class="{ 'd-none': element.defaults.premade }">
86
                                    <button class="button btn" style="width: 100%; cursor: move;">
87
                                        <span v-if="element.icon" class="dashicons dashicon-" :class="'dashicon-' + element.icon"></span>
88
                                        {{element.name}}
89
                                    </button>
90
                                </li>
91
                            </draggable>
92
93
                        </div>
94
                    </div>
95
96
                    <div class="wpinv-form-builder-tab-pane bsui" v-if="active_tab=='edit_item'" style="font-size: 16px;">
97
                        <div class="wpinv-form-builder-edit-field-wrapper">
98
                            <?php do_action( 'wpinv_payment_form_edit_element_template', 'active_form_element', $post ); ?>
99
                            <div>
100
                                <button type="button" class="button button-link button-link-delete" @click.prevent="removeField(active_form_element)" v-show="! active_form_element.premade"><?php _e( 'Delete Field', 'invoicing' ); ?></button>
101
                            </div>
102
                        </div>
103
                    </div>
104
105
                    <div class="wpinv-form-builder-tab-pane bsui" v-if="active_tab=='settings'">
106
                        <div class="wpinv-form-builder-settings-wrapper">
107
                        
108
                            <div class='form-group'>
109
                                <label for="wpi-success-page"><?php _e( 'Success Page', 'invoicing' ); ?></label>
110
                                <input  placeholder="https://" id='wpi-success-page' value="<?php echo esc_url( $success_page ); ?>" class='form-control' type='text'>
0 ignored issues
show
Bug introduced by
It seems like $success_page can also be of type false; however, parameter $url of esc_url() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

110
                                <input  placeholder="https://" id='wpi-success-page' value="<?php echo esc_url( /** @scrutinizer ignore-type */ $success_page ); ?>" class='form-control' type='text'>
Loading history...
111
                                <small class='form-text text-muted'><?php _e( 'Where should we redirect users after successfuly completing their payment?', 'invoicing' ); ?></small>
112
                            </div>
113
114
                        </div>
115
                    </div>
116
117
                </div>
118
            </div>
119
120
            <div class="wpinv-form-builder-right" style="flex: 1; padding-top: 40px;border-left: 1px solid #ddd;padding-left: 20px;min-height: 520px;margin-left: 10px;">
121
122
                <small class='form-text text-muted' v-if='form_elements.length'><?php _e( 'Click on any element to edit or delete it.', 'invoicing' ); ?></small>
123
                <p class='form-text text-muted' v-if='! form_elements.length'><?php _e( 'This form is empty. Add new elements by dragging them from the right.', 'invoicing' ); ?></p>
124
125
                <draggable class="section bsui" v-model="form_elements" @add="highlightLastDroppedField" group="fields" tag="div" style="min-height: 100%; font-size: 16px;">
126
                    <div v-for="form_element in form_elements" class="wpinv-form-builder-element-preview" :class="{ active: active_form_element==form_element &&  active_tab=='edit_item' }" @click="active_tab = 'edit_item'; active_form_element = form_element">
127
                        <?php do_action( 'wpinv_payment_form_render_element_template', 'form_element', $post ); ?>
128
                    </div>
129
                </draggable>
130
            </div>
131
132
            <textarea style="display:none;" name="wpinv_form_elements" v-model="elementString"></textarea>
133
            <textarea style="display:none;" name="wpinv_form_items" v-model="itemString"></textarea>
134
        </div>
135
        
136
        <?php wp_nonce_field( 'wpinv_save_payment_form', 'wpinv_save_payment_form' ) ;?>
137
138
        <?php
139
    }
140
141
    /**
142
     * Saves our payment forms.
143
     */
144
    public static function save( $post_id, $post ) {
145
146
        remove_action( 'save_post', 'WPInv_Meta_Box_Payment_Form::save' );
147
148
        // $post_id and $post are required.
149
        if ( empty( $post_id ) || empty( $post ) ) {
150
            return;
151
        }
152
        
153
        // Ensure that this user can edit the post.
154
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
155
            return;
156
        }
157
158
        // Dont' save meta boxes for revisions or autosaves
159
        if ( defined( 'DOING_AUTOSAVE' ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
160
            return;
161
        }
162
163
        // Do not save for ajax requests.
164
        if ( ( defined( 'DOING_AJAX') && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
165
            return;
166
        }
167
168
        // Confirm the security nonce.
169
        if ( empty( $_POST['wpinv_save_payment_form'] ) || ! wp_verify_nonce( $_POST['wpinv_save_payment_form'], 'wpinv_save_payment_form' ) ) {
170
            return;
171
        }
172
173
        // Save form items.
174
        $form_items = json_decode( wp_unslash( $_POST['wpinv_form_items'] ), true );
0 ignored issues
show
Bug introduced by
It seems like wp_unslash($_POST['wpinv_form_items']) can also be of type array; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

174
        $form_items = json_decode( /** @scrutinizer ignore-type */ wp_unslash( $_POST['wpinv_form_items'] ), true );
Loading history...
175
176
        if ( empty( $form_items ) ) {
177
            $form_items = array();
178
        }
179
180
        update_post_meta( $post_id, 'wpinv_form_items', self::maybe_save_items( $form_items ) );
181
182
        // Save form elements.
183
        $wpinv_form_elements = json_decode( wp_unslash( $_POST['wpinv_form_elements'] ), true );
184
        if ( empty( $wpinv_form_elements ) ) {
185
            $wpinv_form_elements = array();
186
        }
187
188
        update_post_meta( $post_id, 'wpinv_form_elements', $wpinv_form_elements );
189
    }
190
191
    /**
192
     * Saves unsaved form items.
193
     */
194
    public static function maybe_save_items( $items ) {
195
196
        $saved = array();
197
198
        foreach( $items as $item ) {
199
200
            if ( is_numeric( $item['id'] ) ) {
201
                $saved[] = $item;
202
                continue;
203
            }
204
205
            $data = array(
206
                'post_title'   => sanitize_text_field( $item['title'] ),
207
                'post_excerpt' => wp_kses_post( $item['description'] ),
208
                'post_status'  => 'publish',
209
                'meta'         => array(
210
                    'type'      => 'custom',
211
                    'price'     => wpinv_sanitize_amount( $item['price'] ),
212
                    'vat_rule'  => 'digital',
213
                    'vat_class' => '_standard',
214
                )
215
            );
216
            
217
            $new_item  = new WPInv_Item();
218
            $new_item->create( $data );
219
    
220
            if ( ! empty( $new_item ) ) {
221
                $item['id'] = $new_item->ID;
222
                $saved[] = $item;
223
            }
224
225
        }
226
227
        return $saved;
228
229
    }
230
231
}
232
233
add_action( 'save_post_wpi_payment_form', 'WPInv_Meta_Box_Payment_Form::save', 10, 2 );
234
235