diff --git a/assets/css/src/admin.styl b/assets/css/src/admin.styl index 294d5a5ecc..32bed150e9 100644 --- a/assets/css/src/admin.styl +++ b/assets/css/src/admin.styl @@ -5,13 +5,15 @@ @require 'common' @require 'modal' @require 'notice' -@require 'parsley' @require 'form_editor' @require 'listing' @require 'box' @require 'breadcrumb' + @require 'form' +@require 'parsley' +@require 'form_validation' @require 'settings' -@require 'progress_bar' \ No newline at end of file +@require 'progress_bar' diff --git a/assets/css/src/form_validation.styl b/assets/css/src/form_validation.styl new file mode 100644 index 0000000000..558f2c6994 --- /dev/null +++ b/assets/css/src/form_validation.styl @@ -0,0 +1,6 @@ +.parsley-errors-list + margin-top: 8px + +.parsley-required +.parsley-custom-error-message + color: #b94a48 \ No newline at end of file diff --git a/assets/css/src/public.styl b/assets/css/src/public.styl index c5f4f00c0c..1bd2ff2e95 100644 --- a/assets/css/src/public.styl +++ b/assets/css/src/public.styl @@ -1,3 +1,4 @@ @import 'nib' @require 'parsley' +@require 'form_validation' diff --git a/assets/js/src/form_editor/form_editor.js b/assets/js/src/form_editor/form_editor.js index c645dff857..23b33818d2 100644 --- a/assets/js/src/form_editor/form_editor.js +++ b/assets/js/src/form_editor/form_editor.js @@ -231,7 +231,7 @@ var WysijaHistory = { /* MailPoet Form */ var WysijaForm = { - version: '0.6', + version: '0.7', options: { container: 'mailpoet_form_container', editor: 'mailpoet_form_editor', diff --git a/assets/js/src/public.js b/assets/js/src/public.js index 52a41bcbd2..8cdbea3d91 100644 --- a/assets/js/src/public.js +++ b/assets/js/src/public.js @@ -20,7 +20,10 @@ function( $('form.mailpoet_form').each(function() { var form = $(this); - form.parsley().on('form:submit', function(parsley) { + form.parsley({ + errorsWrapper: '
', + errorTemplate: '' + }).on('form:submit', function(parsley) { var data = form.serializeObject() || {}; diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 276273e771..fe51d7ade7 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -374,7 +374,8 @@ class Menu { ->findArray(), 'styles' => FormRenderer::getStyles($form), 'date_types' => Block\Date::getDateTypes(), - 'date_formats' => Block\Date::getDateFormats() + 'date_formats' => Block\Date::getDateFormats(), + 'month_names' => Block\Date::getMonthNames() ); echo $this->renderer->render('form/editor.html', $data); diff --git a/lib/Form/Block/Base.php b/lib/Form/Block/Base.php index 0c62a6a513..27f912b28b 100644 --- a/lib/Form/Block/Base.php +++ b/lib/Form/Block/Base.php @@ -29,7 +29,13 @@ abstract class Base { } } - $validation = ''; + if($block['type'] === 'radio') { + $rules['group'] = 'custom_field_'.$block['id']; + $rules['errors-container'] = '.mailpoet_error_'.$block['id']; + $rules['required-message'] = __('You need to select at least one option.'); + } + + $validation = array(); if(!empty($rules)) { $rules = array_unique($rules); @@ -37,10 +43,10 @@ abstract class Base { if(is_bool($value)) { $value = ($value) ? 'true' : 'false'; } - $validation .= 'data-parsley-'.$rule.'="'.$value.'"'; + $validation[] = 'data-parsley-'.$rule.'="'.$value.'"'; } } - return $validation; + return join(' ', $validation); } protected static function renderLabel($block) { @@ -86,7 +92,11 @@ abstract class Base { // return field name depending on block data protected static function getFieldName($block = array()) { - return $block['id']; + if((int)$block['id'] > 0) { + return 'cf_'.$block['id']; + } else { + return $block['id']; + } } protected static function getFieldLabel($block = array()) { @@ -98,6 +108,6 @@ abstract class Base { protected static function getFieldValue($block = array()) { return (isset($block['params']['value']) && strlen(trim($block['params']['value'])) > 0) - ? trim($block['params']['value']) : ''; + ? esc_attr(trim($block['params']['value'])) : ''; } } \ No newline at end of file diff --git a/lib/Form/Block/Radio.php b/lib/Form/Block/Radio.php index a8082bfd59..ba3b7c8d71 100644 --- a/lib/Form/Block/Radio.php +++ b/lib/Form/Block/Radio.php @@ -9,14 +9,12 @@ class Radio extends Base { $field_name = static::getFieldName($block); $field_validation = static::getInputValidation($block); - // TODO: check if it still makes sense - // create hidden default value - // $html .= ''; - $html .= ''; $html .= static::renderLabel($block); + $html .= ''; + foreach($block['params']['values'] as $option) { $html .= ''; } diff --git a/lib/Router/Subscribers.php b/lib/Router/Subscribers.php index 538115a25e..161e1d6305 100644 --- a/lib/Router/Subscribers.php +++ b/lib/Router/Subscribers.php @@ -4,6 +4,7 @@ namespace MailPoet\Router; use MailPoet\Listing; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; +use MailPoet\Models\SubscriberCustomField; use MailPoet\Models\Segment; use MailPoet\Models\Setting; use MailPoet\Models\Form; @@ -140,32 +141,37 @@ class Subscribers { ? 'unconfirmed' : 'subscribed' ); - // // set custom fields - // $meta_fields = $mailpoet->getOption('mailpoet_subscriber_meta', array()); - // if(!empty($meta_fields)) { - // // loop through data to see if any meta field has been passed - // foreach($meta_fields as $field => $field_data) { - // // check if it's a mandatory field - // $is_required = (isset($field_data['params']['required']) && (bool)$field_data['params']['required'] === true); - - // if(array_key_exists($field, $data)) { - // // check if it's a mandatory field - // if($is_required === true && empty($data[$field])) { - // // if it's missing, throw an error - // $errors[] = sprintf(__('"%s" is required'), $field_data['name']); - // } else { - // // assign field to subscriber - // $subscriber[$field] = $data[$field]; - // } - // } - // } - // } + // custom fields + $custom_fields = array(); + foreach($data as $key => $value) { + if(strpos($key, 'cf_') === 0) { + $custom_fields[substr($key, 3)] = $value; + unset($data[$key]); + } + } // insert new subscriber $subscriber = Subscriber::createOrUpdate($data); if($subscriber === false || !$subscriber->id()) { $errors = array_merge($errors, $subscriber->getValidationErrors()); + } else { + // add custom fields + if(!empty($custom_fields)) { + foreach($custom_fields as $custom_field_id => $value) { + if(is_array($value)) { + // date + $value = mktime(0, 0, 0, $value['month'], $value['day'], $value['year']); + } + $subscriber_custom_field = SubscriberCustomField::create(); + $subscriber_custom_field->hydrate(array( + 'subscriber_id' => $subscriber->id(), + 'custom_field_id' => $custom_field_id, + 'value' => $value + )); + $subscriber_custom_field->save(); + } + } } } else { $subscriber->set('status', ( diff --git a/views/form/editor.html b/views/form/editor.html index 31efdff869..15dff16b1f 100644 --- a/views/form/editor.html +++ b/views/form/editor.html @@ -118,7 +118,7 @@