setUser(); $this->_formId = (array)$formId; } /** * * get user * * @return \Ppb\Db\Table\Row\User */ public function getUser() { return $this->_user; } /** * * set user * * @param \Ppb\Db\Table\Row\User $user * * @return \Ppb\Model\Elements\User */ public function setUser(UserModel $user = null) { if ($user === null) { $user = Front::getInstance()->getBootstrap()->getResource('user'); if (!$user instanceof UserModel) { $user = null; } } $this->_user = $user; return $this; } /** * * get form elements * * @return array */ public function getElements() { $settings = $this->getSettings(); $translate = $this->getTranslate(); if (($user = $this->getUser()) instanceof UserModel) { $userId = $user->getData('id'); $storeActive = $user->getData('store_active'); $isSeller = $user->isSeller(); } else { $userId = null; $storeActive = false; $isSeller = false; } $countries = $this->getLocations()->getMultiOptions(); $states = null; if ($this->getData('country') !== null) { $states = $this->getLocations()->getMultiOptions( $this->getData('country')); } $customFields = $this->getCustomFields()->getFields( array( 'type' => 'user', 'active' => 1, ))->toArray(); /* create validators */ $usernameAlpha = new Validate\Alphanumeric(); $usernameAlpha->setMessage("'%s' contains prohibited characters."); $usernameNoRecordExists = new Validate\Db\NoRecordExists(array( 'table' => new Table\Users(), 'field' => 'username', )); $usernameNoRecordExists->setMessage($translate->_("The %s '%value%' is not available.")); $emailNoRecordExists = new Validate\Db\NoRecordExists(array( 'table' => new Table\Users(), 'field' => 'email', )); $emailNoRecordExists->setMessage($translate->_("The %s '%value%' has already been registered.")); $agreeTermsValidator = new Validate\NotEmpty(); $agreeTermsValidator->setMessage('You must agree to our terms and conditions in order to complete the registration.'); $birthDateValidator = new Validate\LessThan(); $birthDateValidator->setMaxValue(date('Y-m-d', time() - ($settings['min_reg_age'] * 365 * 86400))) ->setMessage(sprintf($translate->_('You must be at least %s years old in order to be able to register.'), $settings['min_reg_age'])); $paymentGatewaysService = new PaymentGatewaysService(); $gatewayUserId = ($userId === null) ? true : $userId; $gateways = $paymentGatewaysService->getData($gatewayUserId, null, true); $gatewayFields = array(); foreach ($gateways as $gateway) { $className = '\\Ppb\\Model\\PaymentGateway\\' . $gateway['name']; if (class_exists($className)) { /** @var \Ppb\Model\PaymentGateway\AbstractPaymentGateway $gatewayModel */ $gatewayModel = new $className(); foreach ((array)$gatewayModel->getElements() as $element) { if ($userId && isset($gateway[$element['id']])) { $element['value'] = $gateway[$element['id']]; } $gatewayFields[] = $element; } } } $storesSubscriptions = new StoresSubscriptionsService(); $categoriesSelect = $this->getCategories()->getTable()->select() ->where('parent_id is null'); if ($userId) { $categoriesSelect->where('user_id is null OR user_id = ?', $userId); } else { $categoriesSelect->where('user_id is null'); } $array = array( array( 'form_id' => 'global', 'id' => 'id', 'element' => 'hidden', 'bodyCode' => " " ), array( 'form_id' => 'user', 'id' => 'business_account', 'element' => 'radio', 'label' => $this->_('Account Type'), 'multiOptions' => array( 0 => $translate->_('Personal'), 1 => $translate->_('Business'), ), 'attributes' => array( 'class' => 'field-changeable', ), ), array( 'form_id' => 'address', 'id' => 'address_id', 'element' => 'hidden', ), array( 'form_id' => 'address', 'subtitle' => $this->_('Address'), 'id' => 'name', 'element' => '\\Ppb\\Form\\Element\\FullName', 'label' => $this->_('Name'), 'required' => true, 'description' => $this->_('Enter your full name.'), 'attributes' => array( 'class' => 'form-control input-default', 'placeholder' => array( 'first' => $translate->_('First Name'), 'last' => $translate->_('Last Name'), ), ), 'fieldLabels' => array( 'first' => $translate->_('First Name'), 'last' => $translate->_('Last Name'), ), 'validators' => array( 'NoHtml', ), ), array( 'form_id' => 'address', 'id' => 'address', 'element' => 'text', 'label' => $this->_('Address'), 'required' => true, 'description' => $this->_('Enter your address.'), 'attributes' => array( 'class' => 'form-control input-medium', ), ), array( 'form_id' => 'address', 'id' => 'city', 'element' => 'text', 'label' => $this->_('City'), 'required' => true, 'description' => $this->_('Enter the city you live in.'), 'attributes' => array( 'class' => 'form-control input-medium', ), ), array( 'form_id' => 'address', 'id' => 'country', 'element' => 'select', 'label' => $this->_('Country'), 'multiOptions' => $countries, 'required' => true, 'description' => $this->_('Enter the country you live in.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'bodyCode' => " " ), array( 'form_id' => 'address', 'id' => 'state', 'element' => (count($states) > 0) ? 'select' : 'text', 'label' => $this->_('State/County'), 'multiOptions' => $states, 'required' => true, 'description' => $this->_('Enter the state/county you live in.'), 'attributes' => array( 'class' => 'form-control input-medium', ), ), array( 'form_id' => 'address', 'id' => 'zip_code', 'element' => 'text', 'label' => $this->_('Zip/Post Code'), 'required' => true, 'description' => $this->_('Enter your zip/post code.'), 'attributes' => array( 'class' => 'form-control input-medium', ), ), array( 'form_id' => 'address', 'id' => 'phone', 'element' => 'text', 'label' => $this->_('Phone'), 'description' => $this->_('Enter your phone number.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( 'Phone', ), ), array( 'form_id' => 'advanced', 'id' => 'birthdate', 'element' => ($settings['min_reg_age'] > 0) ? '\\Ppb\\Form\\Element\\DateTime' : false, 'label' => $this->_('Date of Birth'), 'description' => $this->_('Enter your birthdate.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( $birthDateValidator, ), 'customData' => array( 'formData' => array( 'format' => '"YYYY-MM-DD"', 'maxDate' => 'new Date()', 'useCurrent' => 'false', 'viewMode' => '"decades"', ), ), ), array( 'form_id' => 'user', 'subtitle' => $this->_('Additional Information'), 'id' => 'company_name', 'element' => 'text', 'label' => $this->_('Company Name'), 'description' => $this->_('Enter your company\'s name.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => ($this->getData('business_account') == 1) ? true : false, ), array( 'form_id' => 'user', 'id' => 'bank_details', 'element' => 'textarea', 'label' => $this->_('Bank Details'), 'description' => $this->_('Enter your bank account details (optional).'), 'attributes' => array( 'rows' => 6, 'class' => 'form-control', ), ), array( 'form_id' => 'user', 'id' => 'sale_invoices_content', 'element' => 'textarea', 'label' => $this->_('Sales Invoices Custom Content'), 'description' => $this->_('Enter any custom content you might want to add on your sale invoices.'), 'attributes' => array( 'rows' => 4, 'class' => 'form-control', ), 'validators' => array( 'NoHtml', ), ), array( 'form_id' => array('basic', 'admin'), 'subtitle' => $this->_('Account Details'), 'id' => 'username', 'element' => 'text', 'label' => $this->_('Username'), 'description' => $this->_('Choose a username for your account.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( $usernameAlpha, $usernameNoRecordExists, ), ), array( 'form_id' => 'admin', 'id' => 'role', 'element' => 'select', 'label' => 'Role', 'description' => $this->_('Choose a role for the account.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'multiOptions' => UsersService::getAdminRoles(), ), array( 'form_id' => array('basic', 'admin'), 'id' => 'email', 'element' => 'text', 'label' => $this->_('Email'), 'description' => $this->_('Enter your email address.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( 'Email', $emailNoRecordExists, ), ), array( 'form_id' => array('basic', 'admin'), 'id' => 'password', 'element' => 'password', 'label' => $this->_('Password'), 'description' => $this->_('Create a password for your account.'), 'suffix' => $this->_('(minimum 6 characters)'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( array('StringLength', array(6, null)), ), ), array( 'form_id' => array('basic', 'admin'), 'id' => 'password_confirm', 'element' => 'password', 'label' => $this->_('Confirm Password'), 'description' => $this->_('Type your password again to confirm.'), 'attributes' => array( 'class' => 'form-control input-medium', ), ), array( 'form_id' => array('basic'), 'id' => 'recaptcha', 'element' => ($settings['enable_recaptcha'] && $settings['recaptcha_registration']) ? '\\Ppb\\Form\\Element\\ReCaptcha' : false, 'label' => 'Captcha Code', ), array( 'form_id' => 'basic', 'id' => 'newsletter_subscription', 'element' => 'checkbox', 'multiOptions' => array( 1 => $translate->_('Subscribe To Newsletter'), ), ), array( 'form_id' => 'basic', 'id' => 'agree_terms', 'element' => ($settings['enable_registration_terms']) ? 'checkbox' : false, 'label' => $this->_('Terms and Conditions'), 'multiOptions' => array( 1 => sprintf( $translate->_('I have read and agree to the site\'s ' . 'Terms and Conditions and Privacy Policy.'), $this->getView()->url($settings['registration_terms_link']), $this->getView()->url($settings['registration_privacy_link'])), ), 'validators' => array( $agreeTermsValidator, ), ), /** * -------------- * STORE SETUP * -------------- */ array( 'form_id' => 'store_setup', 'subtitle' => $this->_('Store Subscription'), 'id' => 'store_subscription_id', 'element' => (!$storeActive || $this->getData('store_subscription_id')) ? 'radio' : 'hidden', 'label' => $this->_('Choose Subscription'), 'description' => $this->_('Choose a subscription for your store.'), 'multiOptions' => $storesSubscriptions->getMultiOptions(), 'required' => (!$storeActive || $this->getData('store_subscription_id')) ? true : false, 'attributes' => ($storeActive ? array('onchange' => 'javascript:storeSubscriptionChangeAlert();') : array()), 'bodyCode' => " ", ), array( 'form_id' => 'store_setup', 'subtitle' => $this->_('Store Settings'), 'id' => 'store_name', 'element' => 'text', 'label' => $this->_('Store Name'), 'description' => $this->_('Enter the name of your store.'), 'required' => true, 'validators' => array( 'NoHtml', array('StringLength', array(null, 255)), ), 'attributes' => array( 'class' => 'form-control input-xlarge', ), ), array( 'form_id' => 'store_setup', 'id' => 'store_description', 'element' => '\\Ppb\\Form\\Element\\Wysiwyg', 'label' => $this->_('Store Description'), 'description' => $this->_('Enter a description for your store.'), 'required' => true, 'attributes' => array( 'class' => 'form-control', ), ), array( 'form_id' => 'store_setup', 'id' => 'store_logo_path', 'element' => '\\Ppb\\Form\\Element\\MultiUpload', 'label' => $this->_('Store Logo'), 'description' => $this->_('Upload a logo for your store.'), 'required' => true, 'customData' => array( 'buttonText' => $translate->_('Select Logo'), 'acceptFileTypes' => '/(\.|\/)(gif|jpe?g|png)$/i', 'formData' => array( 'fileSizeLimit' => 2000000, 'uploadLimit' => 1, ), ), ), array( 'form_id' => 'store_setup', 'id' => 'store_category_id', 'element' => '\\Ppb\\Form\\Element\\Category', 'label' => $this->_('Store Category'), 'description' => $this->_('Select a category where your store would be best included in.'), 'attributes' => array( 'data-no-refresh' => 'true' ), 'required' => true, ), array( 'form_id' => 'store_setup', 'id' => 'store_meta_description', 'element' => 'textarea', 'label' => $this->_('Store Meta Description'), 'description' => $this->_('(Recommended) This meta description will tell search engine details about your store. ' . 'Your description should be no longer than 155 characters (including spaces).'), 'validators' => array( 'NoHtml', ), 'attributes' => array( 'rows' => '4', 'class' => 'form-control', ), ), array( 'form_id' => 'store_setup', 'id' => 'store_categories', 'subtitle' => $this->_('Custom Categories'), 'element' => '\\Ppb\\Form\\Element\\ChznSelect', 'label' => $this->_('Select Categories'), 'description' => $this->_('Choose which categories you want to use for your store, or leave empty to use the site\'s default categories.'), 'multiOptions' => $this->getCategories()->getMultiOptions($categoriesSelect), 'attributes' => array( 'style' => 'width: 350px;', 'data-placeholder' => $translate->_('Choose Categories...'), ), 'multiple' => true, ), /** * -------------- * STORE PAGES * -------------- */ array( 'form_id' => 'store_pages', 'subtitle' => 'Store Pages', 'id' => 'store_about', 'element' => '\\Ppb\\Form\\Element\\Wysiwyg', 'label' => $this->_('About Page'), 'description' => $this->_('(optional) Enter content for the store about page.'), 'attributes' => array( 'class' => 'form-control', ), ), array( 'form_id' => 'store_pages', 'id' => 'store_shipping_information', 'element' => '\\Ppb\\Form\\Element\\Wysiwyg', 'label' => $this->_('Shipping Information'), 'description' => $this->_('(optional) Enter content for the store shipping information page.'), 'attributes' => array( 'class' => 'form-control', ), ), array( 'form_id' => 'store_pages', 'id' => 'store_company_policies', 'element' => '\\Ppb\\Form\\Element\\Wysiwyg', 'label' => $this->_('Company Policies'), 'description' => $this->_('(optional) Enter content for the store company policies page.'), 'attributes' => array( 'class' => 'form-control', ), ), /** * -------------- * GLOBAL SETTINGS * -------------- */ array( 'form_id' => 'global_settings', 'id' => 'enable_public_questions', 'element' => ($settings['enable_public_questions']) ? 'checkbox' : false, 'label' => $this->_('Accept Public Questions'), 'description' => $this->_('Check the above checkbox to allow site users to post public questions on your listings.'), 'multiOptions' => array( 1 => null, ), ), array( 'form_id' => 'global_settings', 'id' => 'enable_force_payment', 'element' => ($settings['enable_force_payment']) ? 'checkbox' : false, 'label' => $this->_('Enable Force Payment'), 'multiOptions' => array( 1 => null, ), 'description' => sprintf( $translate->_('If this option is enabled, sales will automatically cancelled unless marked as paid within %s.'), $this->_secondsToTime($settings['force_payment_limit'] * 60)), ), array( 'form_id' => 'global_settings', 'id' => 'quantity_description', 'element' => ($settings['enable_products']) ? 'radio' : false, 'label' => $this->_('Products Quantity Display'), 'multiOptions' => array( 0 => $translate->_('Numbers'), 1 => $translate->_('Text (In Stock, Low Stock, Out of Stock)'), ), 'attributes' => array( 'class' => 'field-changeable', ), 'description' => $this->_('Select how to display the quantity field for products.'), ), array( 'form_id' => 'global_settings', 'id' => 'quantity_low_stock', 'element' => 'text', 'label' => $this->_('Low Stock Threshold'), 'description' => $this->_('If the quantity of an item is lower than this value, the "low stock" message will be displayed.'), 'required' => ($this->getData('quantity_description') == 1) ? true : false, 'attributes' => array( 'class' => 'form-control input-mini', ), 'validators' => array( 'Digits', array('GreaterThan', array(1, true)), ), ), array( 'form_id' => 'global_settings', 'id' => 'enable_tax', 'element' => ($settings['enable_tax_listings']) ? 'checkbox' : false, 'label' => $this->_('Enable Tax on Listings'), 'multiOptions' => array( 1 => null, ), 'description' => $this->_('Check the above checkbox if you wish to be able to apply tax for your listings.'), ), array( 'form_id' => 'global_settings', 'id' => 'tax_type', 'element' => ($settings['enable_tax_listings']) ? 'select' : false, 'label' => $this->_('Tax Type'), 'description' => $this->_('Select the tax that will be applied for your listings.'), 'multiOptions' => $this->getTaxTypes()->getMultiOptions(), 'attributes' => array( 'class' => 'form-control input-large', ), ), array( 'form_id' => 'global_settings', 'id' => 'visitors_counter', 'element' => 'checkbox', 'label' => $this->_('Visitors Counter'), 'multiOptions' => array( 1 => null, ), 'description' => $this->_('Check the above checkbox to display the "Item Viewed" box on the listings details pages'), ), array( 'form_id' => 'global_settings', 'id' => 'listing_watched_by_box', 'element' => 'checkbox', 'label' => $this->_('Display "Listing watched by" Box'), 'multiOptions' => array( 1 => null, ), 'description' => $this->_('Check the above checkbox to display the "Listing watched by" box on the listing details pages.'), ), array( 'form_id' => 'global_settings', 'id' => 'limit_bids_per_user', 'element' => ($settings['enable_auctions'] && $settings['enable_limit_bids']) ? 'text' : false, 'label' => $this->_('Limit Number of Bids / Offers per User'), 'description' => $this->_('Enter a positive value if you want to limit the number of bids (without proxy bids) and offers a user can make on an auction, ' . 'or leave empty to disable this feature.'), 'attributes' => array( 'class' => 'form-control input-mini', ), 'validators' => array( 'Digits', ), ), array( 'form_id' => 'global_settings', 'id' => 'show_make_offer_ranges', 'element' => ($settings['enable_make_offer'] && $settings['show_make_offer_ranges']) ? 'checkbox' : false, 'label' => $this->_('Show Offer Ranges'), 'multiOptions' => array( 1 => null, ), 'description' => $this->_('With this option enabled, the accepted offer ranges you set on listings that have "Make Offer" enabled will be displayed.'), ), array( 'form_id' => 'global_settings', 'id' => 'automatic_digital_downloads', 'element' => ($settings['digital_downloads_max']) ? 'radio' : false, 'label' => $this->_('Automatic Download Links Activation'), 'multiOptions' => array( 0 => $translate->_('Yes'), -1 => $translate->_('No'), ), 'description' => $this->_('Select if you wish to automatically activate download links when sales are paid for using direct payment methods.
' . 'Links can also be activated manually from the "My Sales" page.'), ), array( 'form_id' => 'global_settings', 'id' => 'vacation_mode', 'element' => 'checkbox', 'label' => $this->_('Vacation Mode'), 'multiOptions' => array( 1 => null, ), 'attributes' => array( 'class' => 'field-changeable', ), 'description' => $this->_('If the checkbox above is checked, a message will appear on all your listings which will let visitors know that you are currently on vacation.'), ), array( 'form_id' => 'global_settings', 'id' => 'vacation_mode_return_date', 'element' => '\\Ppb\\Form\\Element\\DateTime', 'label' => $this->_('Return Date'), 'description' => $this->_('(Optional) Enter a vacation return date.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'customData' => array( 'formData' => array( 'format' => '"YYYY-MM-DD"', 'minDate' => 'new Date()', 'useCurrent' => 'false', 'showClear' => 'true', ), ), ), /** * -------------- * EMAIL NOTIFICATIONS * -------------- */ array( 'form_id' => 'email_notifications', 'id' => 'disable_emails', 'element' => 'radio', 'label' => $this->_('Email Notifications'), 'description' => $this->_('Choose whether to receive email notifications from the website.
' . 'Important emails regarding account status and sale/purchase notifications would still be sent.'), 'attributes' => array( 'class' => 'field-changeable', ), 'multiOptions' => array( 0 => $translate->_('Enabled'), 1 => $translate->_('Disabled'), ), ), array( 'form_id' => 'email_notifications', 'id' => 'disable_seller_notifications', 'element' => ($isSeller) ? 'radio' : false, 'label' => $this->_('Seller Notifications'), 'description' => $this->_('These notifications include closed, relisted, no sale, ' . 'as well as approved and suspended listings notifications.'), 'multiOptions' => array( 0 => $translate->_('Enabled'), 1 => $translate->_('Disabled'), ), ), array( 'form_id' => 'email_notifications', 'id' => 'disable_offers_notifications', 'element' => ($settings['enable_make_offer']) ? 'radio' : false, 'label' => $this->_('Offers Notifications'), 'description' => $this->_('These notifications include offers module related email notifications: ' . 'new offer, counter offer, offer accepted, offer declined, offer withdrawn.'), 'multiOptions' => array( 0 => $translate->_('Enabled'), 1 => $translate->_('Disabled'), ), ), array( 'form_id' => 'email_notifications', 'id' => 'disable_messaging_notifications', 'element' => 'radio', 'label' => $this->_('Messaging Notifications'), 'description' => $this->_('These notifications include emails sent to notify users on new messages ' . 'received on the website.'), 'multiOptions' => array( 0 => $translate->_('Enabled'), 1 => $translate->_('Disabled'), ), ), /** * -------------- * FORGOT USERNAME / PASSWORD FORMS * -------------- */ array( 'form_id' => 'forgot-password', 'id' => 'username', 'element' => 'text', 'label' => $this->_('Username'), 'description' => $this->_('Enter your username.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( $usernameAlpha, ), ), array( 'form_id' => array('forgot-username', 'forgot-password'), 'id' => 'email', 'element' => 'text', 'label' => $this->_('Email'), 'description' => $this->_('Enter the email address you have used for registering your account.'), 'attributes' => array( 'class' => 'form-control input-medium', ), 'required' => true, 'validators' => array( 'Email', ), ), ); // add custom registration fields foreach ($customFields as $key => $customField) { $customFields[$key]['form_id'] = 'advanced'; $customFields[$key]['id'] = 'custom_field_' . $customField['id']; if (in_array($customField['element'], array('text', 'select', 'textarea'))) { $attributes = unserialize($customField['attributes']); $customFields[$key]['attributes'] = serialize($attributes); } } array_splice($array, 10, 0, $customFields); // add payment gateways related fields (direct payment) foreach ($gatewayFields as $key => $gatewayField) { $gatewayFields[$key]['form_id'] = 'payment-gateways'; if (empty($gatewayField)) { unset($gatewayFields[$key]); } } array_splice($array, (19 + count($customFields)), 0, $gatewayFields); return $array; } protected function _secondsToTime($seconds) { $translate = $this->getTranslate(); $output = array(); $date = new \DateTime("@$seconds"); $interval = $date->diff(new \DateTime('@0')); $days = $interval->d; $hours = $interval->h; $minutes = $interval->m; if ($days > 0) { $output[] = $days . ' ' . (($days > 1) ? $translate->_('days') : $translate->_('day')); } if ($hours > 0) { $output[] = $hours . ' ' . (($hours > 1) ? $translate->_('hours') : $translate->_('hour')); } if ($minutes > 0) { $output[] = $minutes . ' ' . (($minutes > 1) ? $translate->_('minutes') : $translate->_('minute')); } return implode(', ', $output); } }