public function format($data)
 {
     if (is_array($data)) {
         $data['data'] = $data['value'];
         $data['value'] = htmlspecialchars($data['value']);
     } else {
         $data = array('data' => $data, 'value' => htmlspecialchars($data));
     }
     if (!$data['data']) {
         $data['value'] = '';
         return $data;
     }
     $icon = '';
     if (isset($data['ext']) && $data['ext'] && ($f = waContactFields::get('im'))) {
         $exts = $f->getParameter('ext');
         if (isset($exts[$data['ext']])) {
             $icon = '<i class="icon16 ' . $data['ext'] . '"></i>';
         }
     }
     if (!$icon) {
         $icon = '<i class="icon16 im"></i>';
     }
     $data['value'] = $icon . $data['value'];
     return $data;
 }
 public function format($data)
 {
     $value = htmlspecialchars(trim($data['value']));
     if (!preg_match("/^(http|https):/", $value)) {
         $f = waContactFields::get('socialnetwork');
         if ($f) {
             $domain = $f->getParameter('domain');
             if (!empty($domain[$data['ext']])) {
                 $d = $domain[$data['ext']];
                 if (strpos($value, $d) === false) {
                     $value = '<a href="' . 'http://' . $d . '/' . ltrim($value, "/ ") . '" target="_blank">' . $value . '</a>';
                 }
             }
         }
     } else {
         $value = "<a href='{$value}' target='_blank'>{$value}</a>";
     }
     $icon = '';
     $ext = '';
     if (isset($data['ext']) && $data['ext'] && ($f = waContactFields::get('socialnetwork'))) {
         $exts = $f->getParameter('ext');
         if (isset($exts[$data['ext']])) {
             $ext = ' <em class="hint">' . $exts[$data['ext']] . '</em>';
             $icon = '<i class="icon16 ' . $data['ext'] . '"></i>';
         } else {
             $ext = ' <em class="hint">' . htmlspecialchars($data['ext']) . '</em>';
         }
     }
     return $icon . $value . $ext;
 }
 public function execute()
 {
     $field = waRequest::get('field', null, waRequest::TYPE_STRING_TRIM);
     if (!$field) {
         throw new waException(_w("Unknown field"));
     }
     // List of field values
     $cfvm = new waContactFieldValuesModel();
     $fields = $cfvm->getInfo($field);
     // Possible parent fields this conditional field may depend on
     $parent_fields = array();
     foreach (waContactFields::getAll('person') as $f) {
         /** @var waContactField $f */
         if (!$f instanceof waContactCompositeField && !$f->isMulti()) {
             $parent_fields[$f->getId()] = $f->getName();
         }
     }
     $field_ids = explode(':', $field);
     $f = waContactFields::get($field_ids[0]);
     if (!empty($field_ids[1]) && $f && $f instanceof waContactCompositeField) {
         $subfields = $f->getFields();
         foreach ($subfields as $sfid => $sf) {
             $pid = $f->getId() . ':' . $sfid;
             if ($pid !== $field) {
                 $parent_fields[$pid] = $f->getName() . ' — ' . $sf->getName();
             }
         }
     }
     // Selected parent field
     $parent_selected = null;
     if ($fields) {
         $parent_selected = reset($fields);
         $parent_selected = $parent_selected['field'];
     }
     // Human readable name of current field
     if (!empty($field_ids[1]) && !empty($subfields[$field_ids[1]])) {
         $title = $subfields[$field_ids[1]]->getName();
     } else {
         if ($f) {
             $title = $f->getName();
         } else {
             // Loose guess on whether this field has just been created
             $new_field = false;
             if (substr($field, 0, 2) == '__') {
                 $new_field = true;
             } else {
                 if (!empty($field_ids[1]) && substr($field_ids[1], 0, 2) == '__') {
                     $new_field = true;
                 }
             }
             if ($new_field) {
                 $title = _w('Conditional field');
             } else {
                 $title = _w(ucfirst($field));
             }
         }
     }
     $this->view->assign(array('field' => $field, 'title' => $title, 'fields' => $fields, 'parent_fields' => $parent_fields, 'parent_selected' => $parent_selected));
 }
 public function execute()
 {
     $domain = siteHelper::getDomain();
     $config = wa()->getConfig()->getAuth();
     if (!isset($config[$domain])) {
         $config[$domain] = array();
     }
     if (waRequest::post('auth_captcha') !== null) {
         if (waRequest::post('auth_captcha')) {
             $config[$domain]['signup_captcha'] = true;
         } elseif (isset($config[$domain]['signup_captcha'])) {
             unset($config[$domain]['signup_captcha']);
         }
     }
     if (waRequest::post('auth_rememberme')) {
         $config[$domain]['rememberme'] = true;
     } elseif (isset($config[$domain]['rememberme'])) {
         unset($config[$domain]['rememberme']);
     }
     // save auth adapters
     if (waRequest::post('auth_adapters') && waRequest::post('adapter_ids')) {
         $config[$domain]['adapters'] = array();
         $adapters = waRequest::post('adapters', array());
         foreach (waRequest::post('adapter_ids') as $adapter_id) {
             $config[$domain]['adapters'][$adapter_id] = $adapters[$adapter_id];
         }
     } else {
         if (isset($config[$domain]['adapters'])) {
             unset($config[$domain]['adapters']);
         }
     }
     // signup
     $fields = waRequest::post('fields');
     $params = waRequest::post('params');
     $must_have_fields = array('email', 'password');
     $default_fields = array_merge(array('firstname', 'lastname', ''), $must_have_fields);
     $config[$domain]['params'] = $params;
     if (!$config[$domain]) {
         $config[$domain]['fields'] = $default_fields;
     } else {
         $config[$domain]['fields'] = array();
     }
     foreach ($fields as $field_id => $field) {
         $config[$domain]['fields'][$field_id] = $field;
     }
     foreach ($must_have_fields as $field) {
         if (!in_array($field, array_keys($fields))) {
             $tmp = waContactFields::get($field);
             $config[$domain]['fields'][$field] = array('required' => true, 'caption' => $tmp->getName());
         } else {
             $config[$domain]['fields'][$field]['required'] = true;
         }
     }
     // save to file
     if (!$this->getConfig()->setAuth($config)) {
         $this->errors = sprintf(_w('File could not be saved due to the insufficient file write permissions for the "%s" folder.'), 'wa-config/');
     }
 }
 protected function getParts($data, $format = null)
 {
     $result = array('pic' => '', 'marker' => '', 'parts' => array());
     $countryName = '';
     //        $countryPic = '';
     //        $searchLink = '';
     if (isset($data['data']['country']) && $data['data']['country']) {
         $model = new waCountryModel();
         $countryName = $model->name($data['data']['country']);
         // Do not show pic for unknown country
         if ($countryName) {
             $result['pic'] = '<img src="' . wa_url() . 'wa-content/img/country/' . strtolower($data['data']['country']) . '.gif" class="overhanging" />';
         }
     }
     if (isset($data['data']['street']) || isset($data['data']['city']) || isset($data['data']['region']) || isset($data['data']['country']) || $countryName) {
         $searchURL = '';
         foreach (array('street', 'city', 'region') as $id) {
             if (!isset($data['data'][$id])) {
                 continue;
             }
             $searchURL .= ($searchURL ? ' ' : '') . $data['data'][$id];
         }
         if ($countryName) {
             $searchURL .= ($searchURL ? ' ' : '') . $countryName;
         }
         $searchURL = htmlspecialchars($searchURL);
         $result['marker'] = '<a href="http://mapof.it/' . $searchURL . '" class="small"><i class="icon16 marker"></i><b><i>' . _w('show on map') . '</i></b></a>';
     }
     foreach (waContactFields::get('address')->getFields() as $field) {
         /**
          * @var waContactField $field
          */
         $id = $field->getId();
         if (isset($data['data'][$id]) && trim($data['data'][$id])) {
             if ($id === 'country') {
                 $result['parts'][$id] = $countryName;
             } else {
                 $result['parts'][$id] = $field->format($data['data'][$id], $format, $data['data']);
             }
             $result['parts'][$id] = htmlspecialchars($result['parts'][$id]);
         }
     }
     $result['marker'] = '';
     // marker is disabled, but may be needed in future
     return $result;
 }
 public function format($data)
 {
     $data['value'] = htmlspecialchars(trim($data['value']));
     $value = self::formatLink($data);
     $icon = '';
     $ext = '';
     if (isset($data['ext']) && $data['ext'] && ($f = waContactFields::get('socialnetwork'))) {
         $exts = $f->getParameter('ext');
         if (isset($exts[$data['ext']])) {
             $ext = ' <em class="hint">' . $exts[$data['ext']] . '</em>';
             $icon = '<i class="icon16 ' . $data['ext'] . '"></i>';
         } else {
             $ext = ' <em class="hint">' . htmlspecialchars($data['ext']) . '</em>';
         }
     }
     return $icon . $value . $ext;
 }
 public function format($data)
 {
     if (is_array($data)) {
         $result = htmlspecialchars($data['value']);
         $result = '<a class="inline" href="mailto:' . $result . '">' . $result . '</a>';
         if (isset($data['ext']) && $data['ext']) {
             $ext = $data['ext'];
             $f = waContactFields::get('email');
             $exts = $f->getParameter('ext');
             if (isset($exts[$ext])) {
                 $ext = _ws($exts[$ext]);
             }
             $result .= ' <em class="hint">' . htmlspecialchars($ext) . '</em>';
         }
         return $result;
     }
     return htmlspecialchars($data);
 }
 public function execute()
 {
     $this->contact = wa()->getUser();
     $data = json_decode(waRequest::post('data'), true);
     if (!$data || !is_array($data)) {
         $this->response = array('errors' => array(), 'data' => array());
         return;
     }
     // Make sure only allowed fields are saved
     $allowed = array();
     foreach (waContactFields::getAll('person') as $f) {
         if ($f->getParameter('allow_self_edit')) {
             $allowed[$f->getId()] = true;
         }
     }
     $data = array_intersect_key($data, $allowed);
     $oldLocale = $this->getUser()->getLocale();
     // Validate and save contact if no errors found
     $errors = $this->contact->save($data, true);
     if ($errors) {
         $response = array();
     } else {
         // New data formatted for JS
         $response['name'] = $this->contact->get('name', 'js');
         foreach ($data as $field_id => $field_value) {
             if (!isset($errors[$field_id])) {
                 $response[$field_id] = $this->contact->get($field_id, 'js');
             }
         }
         // Top fields
         $response['top'] = array();
         foreach (array('email', 'phone', 'im') as $f) {
             if ($v = $this->contact->get($f, 'top,html')) {
                 $response['top'][] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
             }
         }
     }
     // Reload page with new language if user just changed it in own profile
     if ($oldLocale != $this->contact->getLocale()) {
         $response['reload'] = TRUE;
     }
     $this->response = array('errors' => $errors, 'data' => $response);
 }
 public function format($data)
 {
     $value = htmlspecialchars($data['value']);
     $icon = '';
     $ext = '';
     if (isset($data['ext']) && $data['ext'] && ($f = waContactFields::get('im'))) {
         $exts = $f->getParameter('ext');
         if (isset($exts[$data['ext']])) {
             $ext = ' <em class="hint">' . $exts[$data['ext']] . '</em>';
             $icon = '<i class="icon16 ' . $data['ext'] . '"></i>';
         } else {
             $ext = ' <em class="hint">' . htmlspecialchars($data['ext']) . '</em>';
         }
     }
     if (!$icon) {
         $icon = '<i class="icon16 im"></i>';
     }
     return $icon . $value . $ext;
 }
 /**
  * @param array $data
  * @param array $errors
  * @return bool|waContact
  */
 public function signup($data, &$errors = array())
 {
     // check exists contacts
     $auth = wa()->getAuth();
     $field_id = $auth->getOption('login');
     if ($field_id == 'login') {
         $field_name = _ws('Login');
     } else {
         $field = waContactFields::get($field_id);
         if ($field) {
             $field_name = $field->getName();
         } else {
             $field_name = ucfirst($field_id);
         }
     }
     $is_error = false;
     // check passwords
     if ($data['password'] !== $data['password_confirm']) {
         $errors['password'] = array();
         $errors['password_confirm'] = array(_ws('Passwords do not match'));
         $is_error = true;
     } elseif (!$data['password']) {
         $errors['password'] = array();
         $errors['password_confirm'][] = _ws('Password can not be empty.');
         $is_error = true;
     }
     if (!$data[$field_id]) {
         $errors[$field_id] = array(sprintf(_ws("%s is required"), $field_name));
         $is_error = true;
     }
     if (!$is_error) {
         $contact = $auth->getByLogin($data[$field_id]);
         if ($contact) {
             $errors[$field_id] = array(sprintf(_ws('User with the same %s is already registered'), $field_name));
             $is_error = true;
         }
     }
     $auth_config = wa()->getAuthConfig();
     // set unknown or unconfirmed status for email
     if (isset($data['email']) && $data['email']) {
         if (!empty($auth_config['params']['confirm_email'])) {
             $email_status = 'unconfirmed';
         } else {
             $email_status = 'unknown';
         }
         $data['email'] = array('value' => $data['email'], 'status' => $email_status);
     }
     // check captcha
     if (isset($auth_config['signup_captcha']) && $auth_config['signup_captcha']) {
         if (!wa()->getCaptcha()->isValid()) {
             $errors['captcha'] = _ws('Invalid captcha');
             $is_error = true;
         }
     }
     if (is_array($auth_config['fields'])) {
         foreach ($auth_config['fields'] as $fld_id => $fld) {
             if (array_key_exists('required', $fld) && !$data[$fld_id] && $fld_id !== 'password') {
                 $field = waContactFields::get($fld_id);
                 if (!empty($fld['caption'])) {
                     $field_name = $fld['caption'];
                 } else {
                     if ($field) {
                         $field_name = $field->getName();
                     } else {
                         $field_name = ucfirst($fld_id);
                     }
                 }
                 $errors[$fld_id] = array(sprintf(_ws("%s is required"), $field_name));
                 $is_error = true;
             }
         }
     }
     if ($is_error) {
         return false;
     }
     if (isset($data['birthday']) && is_array($data['birthday']['value'])) {
         foreach ($data['birthday']['value'] as $bd_id => $bd_val) {
             if (strlen($bd_val) === 0) {
                 $data['birthday']['value'][$bd_id] = null;
             }
         }
     }
     // remove password_confirm field
     unset($data['password_confirm']);
     // set advanced data
     $data['create_method'] = 'signup';
     $data['create_ip'] = waRequest::getIp();
     $data['create_user_agent'] = waRequest::getUserAgent();
     // try save contact
     $contact = new waContact();
     if (!($errors = $contact->save($data, true))) {
         if (!empty($data['email'])) {
             $this->send($contact);
         }
         /**
          * @event signup
          * @param waContact $contact
          */
         wa()->event('signup', $contact);
         // after sign up callback
         $this->afterSignup($contact);
         // try auth new contact
         try {
             if (empty($data['email']) || empty($auth_config['params']['confirm_email'])) {
                 if (wa()->getAuth()->auth($contact)) {
                     $this->logAction('signup', wa()->getEnv());
                 }
             }
         } catch (waException $e) {
             $errors = array('auth' => $e->getMessage());
         }
         return $contact;
     }
     if (isset($errors['name'])) {
         $errors['firstname'] = array();
         $errors['middlename'] = array();
         $errors['lastname'] = $errors['name'];
     }
     return false;
 }
 public function deleteAll($fields, $type = null)
 {
     if (!$fields) {
         return;
     }
     if (!is_array($fields)) {
         $fields = array($fields);
     }
     $where = array();
     foreach ($fields as $id) {
         $f = waContactFields::get($id);
         if ($f instanceof waContactCompositeField) {
             $where[] = "cd.field LIKE '" . $this->getModel()->escape($id) . ":%'";
         } else {
             $where[] = "cd.field='" . $this->getModel()->escape($id) . "'";
         }
     }
     switch ($type) {
         case 'person':
         case 'company':
             $join = "JOIN wa_contact AS c ON c.id=cd.contact_id";
             if ($type == 'company') {
                 $cwhere = "c.is_company>0 AND ";
             } else {
                 $cwhere = "c.is_company=0 AND ";
             }
             break;
         default:
             $join = '';
             $cwhere = '';
     }
     // Hope they know what they're doing :)
     $sql = "DELETE cd FROM " . $this->getModel()->getTableName() . " AS cd {$join}\n                WHERE {$cwhere}(" . implode(' OR ', $where) . ")";
     $this->getModel()->exec($sql);
 }
 public function displayPrintForm($id, waOrder $order, $params = array())
 {
     if ($id = 'delivery_list') {
         $view = wa()->getView();
         $main_contact_info = array();
         foreach (array('email', 'phone') as $f) {
             if ($v = $order->contact->get($f, 'top,html')) {
                 $main_contact_info[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
             }
         }
         $formatter = new waContactAddressSeveralLinesFormatter();
         $shipping_address = array();
         foreach (waContactFields::get('address')->getFields() as $k => $v) {
             if (isset($order->params['shipping_address.' . $k])) {
                 $shipping_address[$k] = $order->params['shipping_address.' . $k];
             }
         }
         $shipping_address_text = array();
         foreach (array('country_name', 'region_name', 'zip', 'city', 'street') as $k) {
             if (isset($order->shipping_address[$k])) {
                 $shipping_address_text[] = $order->shipping_address[$k];
             }
         }
         $shipping_address_text = implode(', ', $shipping_address_text);
         $view->assign('shipping_address_text', $shipping_address_text);
         $shipping_address = $formatter->format(array('data' => $shipping_address));
         $shipping_address = $shipping_address['value'];
         $view->assign('shipping_address', $shipping_address);
         $view->assign('main_contact_info', $main_contact_info);
         $view->assign('order', $order);
         $view->assign('params', $params);
         $view->assign('p', $this);
         return $view->fetch($this->path . '/templates/form.html');
     } else {
         throw new waException('Print form not found');
     }
 }
Beispiel #13
0
 public function execute()
 {
     $order = $this->getOrder();
     if (!$order) {
         $this->view->assign('order', $order);
         return;
     }
     $workflow = new shopWorkflow();
     $actions = $workflow->getStateById($order['state_id'])->getActions();
     $bottom_buttons = $top_buttons = $buttons = array();
     foreach ($actions as $action) {
         /**
          * @var shopWorkflowAction $action
          */
         if ($action->getOption('top') || $action->getOption('position') == 'top') {
             $top_buttons[] = $action->getButton();
         } elseif ($action->getOption('position') == 'bottom') {
             $bottom_buttons[] = $action->getButton();
         } else {
             $buttons[] = $action->getButton();
         }
     }
     $config = $this->getConfig();
     $last_action_datetime = null;
     $log_model = new shopOrderLogModel();
     $log = $log_model->getLog($order['id']);
     foreach ($log as &$l) {
         if ($l['action_id']) {
             $l['action'] = $workflow->getActionById($l['action_id']);
         }
         if ($order['state_id'] == $l['after_state_id']) {
             $last_action_datetime = $l['datetime'];
         }
     }
     $params = $order['params'];
     $tracking = '';
     if (!empty($params['shipping_id'])) {
         try {
             $plugin = shopShipping::getPlugin(null, $params['shipping_id']);
             if (!empty($params['tracking_number'])) {
                 $tracking = $plugin->tracking($params['tracking_number']);
             }
             if ($custom_fields = $plugin->customFields(new waOrder())) {
                 foreach ($custom_fields as $k => $v) {
                     if (!empty($params['shipping_params_' . $k])) {
                         $custom_fields[$k]['value'] = $params['shipping_params_' . $k];
                     } else {
                         unset($custom_fields[$k]);
                     }
                 }
                 $this->view->assign('custom_fields', $custom_fields);
             }
         } catch (waException $ex) {
             $tracking = $ex->getMessage();
         }
     }
     $this->view->assign('tracking', $tracking);
     $settings = wa('shop')->getConfig()->getCheckoutSettings();
     $form_fields = ifset($settings['contactinfo']['fields'], array());
     $formatter = new waContactAddressSeveralLinesFormatter();
     $shipping_address = shopHelper::getOrderAddress($params, 'shipping');
     $this->view->assign('shipping_address_text', shopHelper::getShippingAddressText($params));
     $shipping_address = $formatter->format(array('data' => $shipping_address));
     $shipping_address = $shipping_address['value'];
     if (isset($form_fields['address.billing'])) {
         $billing_address = shopHelper::getOrderAddress($params, 'billing');
         $billing_address = $formatter->format(array('data' => $billing_address));
         $billing_address = $billing_address['value'];
         if ($billing_address === $shipping_address) {
             $billing_address = null;
         }
     } else {
         $billing_address = null;
     }
     $customer_model = new shopCustomerModel();
     $customer = $customer_model->getById($order['contact_id']);
     $customer_contact = new waContact($order['contact_id']);
     // Customer info
     $main_contact_info = array();
     foreach (array('email', 'phone', 'im') as $f) {
         if ($v = $customer_contact->get($f, 'top,html')) {
             $main_contact_info[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
         }
     }
     $this->view->assign(array('customer' => $customer, 'customer_contact' => $customer_contact, 'main_contact_info' => $main_contact_info, 'currency' => $config->getCurrency(), 'order' => $order, 'params' => $params, 'log' => $log, 'last_action_datetime' => $last_action_datetime, 'bottom_buttons' => $bottom_buttons, 'top_buttons' => $top_buttons, 'buttons' => $buttons, 'filter_params' => $this->getParams(), 'filter_params_str' => $this->getParams(true), 'count_new' => $this->getModel()->getStateCounters('new'), 'timeout' => $config->getOption('orders_update_list'), 'printable_docs' => shopHelper::getPrintForms(array_merge($order, array('params' => $params))), 'billing_address' => $billing_address, 'shipping_address' => $shipping_address, 'shipping_id' => ifset($params['shipping_id'], '') . '.' . ifset($params['shipping_rate_id'], ''), 'offset' => $this->getModel()->getOffset($order['id'], $this->getParams(), true)));
     /**
      * Backend order profile page
      * UI hook allow extends order profile page
      * @event backend_order
      * @param array $order
      * @return array[string][string]string $return[%plugin_id%]['title_suffix'] html output
      * @return array[string][string]string $return[%plugin_id%]['action_button'] html output
      * @return array[string][string]string $return[%plugin_id%]['action_link'] html output
      * @return array[string][string]string $return[%plugin_id%]['info_section'] html output
      */
     $this->view->assign('backend_order', wa()->event('backend_order', $order, array('title_suffix', 'action_button', 'action_link', 'info_section')));
 }
Beispiel #14
0
 /**
  * Sets a value for specified contact property.
  *
  * @param string $field_id Contact property id
  * @param mixed $value Property value
  * @param bool $add Flag requiring to add specified value to existing values of a multi-field. If false,
  *     all existing values of the specified multi-field are deleted and replaced with specified value.
  */
 public function set($field_id, $value, $add = false)
 {
     if (strpos($field_id, '.') !== false) {
         $field_parts = explode('.', $field_id, 2);
         $field_id = $field_parts[0];
         $ext = $field_parts[1];
     } else {
         $ext = null;
     }
     if (strpos($field_id, ':') !== false) {
         $field_parts = explode(':', $field_id, 2);
         $field_id = $field_parts[0];
         $subfield = $field_parts[1];
     } else {
         $subfield = null;
     }
     $f = waContactFields::get($field_id, $this['is_company'] ? 'company' : 'person');
     if (!$f) {
         if ($field_id == 'password') {
             $value = self::getPasswordHash($value);
         }
         $this->data[$field_id] = $value;
     } else {
         $this->data[$field_id] = $f->set($this, $value, array('ext' => $ext, 'subfield' => $subfield), $add);
     }
 }
 protected function searchPrepare($query, $auto_title = true)
 {
     if ($auto_title || !isset($this->alias_index['data'])) {
         $this->alias_index['data'] = 0;
     }
     $query = urldecode($query);
     // `&` can be escaped in search request. Need to split by not escaped ones only.
     $escapedBS = 'ESCAPED_BACKSLASH';
     while (FALSE !== strpos($query, $escapedBS)) {
         $escapedBS .= rand(0, 9);
     }
     $escapedAmp = 'ESCAPED_AMPERSAND';
     while (FALSE !== strpos($query, $escapedAmp)) {
         $escapedAmp .= rand(0, 9);
     }
     $query = str_replace('\\&', $escapedAmp, str_replace('\\\\', $escapedBS, $query));
     $query = explode('&', $query);
     $model = $this->getModel();
     $title = array();
     foreach ($query as $part) {
         if (!($part = trim($part))) {
             continue;
         }
         $part = str_replace(array($escapedBS, $escapedAmp), array('\\\\', '\\&'), $part);
         $parts = preg_split("/(\\\$=|\\^=|\\*=|==|!=|>=|<=|=|>|<|@=)/uis", $part, 2, PREG_SPLIT_DELIM_CAPTURE);
         if ($parts) {
             if ($parts[0] == 'email') {
                 if (!isset($this->joins['email'])) {
                     $this->joins['email'] = array('table' => 'wa_contact_emails', 'alias' => 'e');
                 }
                 $title[] = waContactFields::get($parts[0])->getName() . $parts[1] . $parts[2];
                 $this->where[] = 'e.email' . $this->getExpression($parts[1], $parts[2]);
             } elseif ($model->fieldExists($parts[0])) {
                 if ($f = waContactFields::get($parts[0])) {
                     $title[] = $f->getName() . $parts[1] . $parts[2];
                 } else {
                     $title[] = $parts[0] . $parts[1] . $parts[2];
                 }
                 $this->where[] = 'c.' . $parts[0] . $this->getExpression($parts[1], $parts[2]);
             } else {
                 if ($parts[0] == 'category') {
                     if (!isset($this->joins['categories'])) {
                         $this->joins['categories'] = array('table' => 'wa_contact_categories', 'alias' => 'cc');
                     }
                     $title[] = _ws('Category') . $parts[1] . $parts[2];
                     $this->where[] = 'cc.category_id' . $this->getExpression($parts[1], $parts[2]);
                 } else {
                     $alias = "d" . $this->alias_index['data']++;
                     $field_parts = explode('.', $parts[0]);
                     $f = $field_parts[0];
                     if ($fo = waContactFields::get($f)) {
                         $title[] = $fo->getName() . $parts[1] . $parts[2];
                     }
                     $ext = isset($field_parts[1]) ? $field_parts[1] : null;
                     $on = $alias . '.contact_id = c.id AND ' . $alias . ".field = '" . $model->escape($f) . "'";
                     $on .= ' AND ' . $alias . ".value " . $this->getExpression($parts[1], $parts[2]);
                     if ($ext !== null) {
                         $on .= " AND " . $alias . ".ext = '" . $model->escape($ext) . "'";
                     }
                     $this->joins[] = array('table' => 'wa_contact_data', 'alias' => $alias, 'on' => $on);
                     $this->where_fields[] = $f;
                 }
             }
         }
     }
     if ($title) {
         $title = implode(', ', $title);
         // Strip slashes from search title.
         $bs = '\\\\';
         $title = preg_replace("~{$bs}(_|%|&|{$bs})~", '\\1', $title);
     }
     if ($auto_title) {
         $this->addTitle($title, ' ');
     }
 }
 public function execute()
 {
     $this->id = (int) waRequest::post('id');
     // Check access
     if (!$this->id) {
         if (!$this->getRights('create')) {
             throw new waRightsException('Access denied.');
         }
     } else {
         $cr = new contactsRightsModel();
         if ($cr->getRight(null, $this->id) != 'write') {
             throw new waRightsException('Access denied.');
         }
     }
     $this->type = waRequest::post('type');
     $this->contact = new waContact($this->id);
     if ($this->type == 'company') {
         $this->contact['is_company'] = 1;
     }
     $data = json_decode(waRequest::post('data'), true);
     if (!$this->id && !isset($data['create_method'])) {
         $data['create_method'] = 'add';
     }
     $oldLocale = $this->getUser()->getLocale();
     $response = array();
     if (!($errors = $this->contact->save($data, true))) {
         if ($this->id) {
             foreach ($data as $field_id => $field_value) {
                 if (!isset($errors[$field_id])) {
                     $response[$field_id] = $this->contact->get($field_id, 'js');
                 }
             }
             $response['name'] = $this->contact->get('name', 'js');
             $fields = array('email', 'phone', 'im');
             $top = array();
             foreach ($fields as $f) {
                 if ($v = $this->contact->get($f, 'top,html')) {
                     $top[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
                 }
             }
             $response['top'] = $top;
         } else {
             $response = array('id' => $this->contact->getId());
             $this->log('contact_add', 1);
         }
         // Update recently added menu item
         if (($name = $this->contact->get('name')) || $name === '0') {
             $name = trim($this->contact->get('title') . ' ' . $name);
             $history = new contactsHistoryModel();
             $history->save('/contact/' . $this->contact->getId(), $name, $this->id ? null : 'add');
             $history = $history->get();
             // to update history in user's browser
         }
     }
     // Reload page with new language if user just changed it in own profile
     if ($this->contact->getId() == $this->getUser()->getId() && $oldLocale != $this->contact->getLocale()) {
         $response['reload'] = TRUE;
     }
     $this->response = array('errors' => $errors, 'data' => $response);
     if (isset($history)) {
         $this->response['history'] = $history;
     }
 }
Beispiel #17
0
 /**
  * Returns customer's shipping address written in one string.
  *
  * @param array $order_params 'params' element of order data array returned by getOrder() method of shopOrderModel class
  * @param bool $for_map Whether full or brief address information must be returned; defaults to true
  * @return string
  */
 public static function getShippingAddressText($order_params, $for_map = true)
 {
     $address = array();
     foreach (waContactFields::get('address')->getFields() as $k => $v) {
         $address[$k] = ifset($order_params['shipping_address.' . $k]);
     }
     if ($for_map) {
         $address_f = array();
         foreach (array('country', 'region', 'zip', 'city', 'street') as $k) {
             if (!isset($address[$k])) {
                 continue;
             } elseif ($k == 'country') {
                 $address_f[$k] = waCountryModel::getInstance()->name(ifempty($address['country']));
             } elseif ($k == 'region') {
                 $address_f['region'] = '';
                 if (!empty($address['country']) && !empty($address['region'])) {
                     $model = new waRegionModel();
                     if ($region = $model->get($address['country'], $address['region'])) {
                         $address_f['region'] = $region['name'];
                     }
                 }
             } else {
                 $address_f[$k] = $address[$k];
             }
         }
         return implode(', ', $address_f);
     }
     return implode(', ', $address);
 }
 public function getAddressForm($method_id, waShipping $plugin, $config, $contact_address, $address_form)
 {
     $config_address = isset($config['contactinfo']['fields']['address.shipping']) ? $config['contactinfo']['fields']['address.shipping'] : (isset($config['contactinfo']['fields']['address']) ? $config['contactinfo']['fields']['address'] : array());
     $address_fields = $plugin->requestedAddressFields();
     $disabled_only = $address_fields === array() ? false : true;
     if ($address_fields === false || $address_fields === null) {
         return false;
     }
     foreach ($address_fields as $f) {
         if ($f !== false) {
             $disabled_only = false;
             break;
         }
     }
     $address = array();
     if ($disabled_only) {
         $allowed = $plugin->allowedAddress();
         if (count($allowed) == 1) {
             $one = true;
             if (!isset($config_address['fields'])) {
                 $address_field = waContactFields::get('address');
                 foreach ($address_field->getFields() as $f) {
                     $fields[$f->getId()] = array();
                 }
             } else {
                 $fields = $config_address['fields'];
             }
             foreach ($allowed[0] as $k => $v) {
                 if (is_array($v)) {
                     $one = false;
                     break;
                 } else {
                     $fields[$k]['hidden'] = 1;
                     $fields[$k]['value'] = $v;
                 }
             }
             foreach ($address_fields as $k => $v) {
                 if ($v === false && isset($fields[$k])) {
                     unset($fields[$k]);
                 }
             }
             if ($one) {
                 $address = $config_address;
                 $address['fields'] = $fields;
             }
         }
     } else {
         if (isset($config_address['fields'])) {
             $fields = $config_address['fields'];
             if ($address_fields) {
                 foreach ($fields as $f_id => $f) {
                     if (isset($address_fields[$f_id])) {
                         foreach ($address_fields[$f_id] as $k => $v) {
                             $fields[$f_id][$k] = $v;
                         }
                     } else {
                         unset($fields[$f_id]);
                     }
                 }
                 foreach ($address_fields as $f_id => $f) {
                     if (!isset($fields[$f_id])) {
                         $fields[$f_id] = $f;
                     }
                 }
             }
             $address_fields = $fields;
         }
         if ($address_fields) {
             $address = array('fields' => $address_fields);
         }
     }
     if (!$address_form && !empty($address['fields'])) {
         foreach ($address['fields'] as $k => $v) {
             if (empty($contact_address[$k])) {
                 $address_form = true;
             }
         }
     }
     if ($address_form) {
         if (!empty($config['shipping']['prompt_type'])) {
             if (!empty($address['fields'])) {
                 foreach ($address['fields'] as $k => $v) {
                     if (empty($v['cost'])) {
                         unset($address['fields'][$k]);
                     }
                 }
                 if (!$address['fields']) {
                     return null;
                 }
             } else {
                 $empty = true;
                 foreach ($address_fields as $f) {
                     if (!empty($f['cost'])) {
                         $empty = false;
                         break;
                     }
                 }
                 if ($empty) {
                     return null;
                 }
             }
         }
         return waContactForm::loadConfig(array('address.shipping' => $address), array('namespace' => 'customer_' . $method_id));
     } else {
         return null;
     }
 }
 private function getContactControl($name, $params = array())
 {
     $control = array();
     if ($name) {
         self::addNamespace($params, $name);
     }
     $params['namespace'] = $namespace = self::makeNamespace($params);
     $contact = wa()->getUser();
     $values = isset($params['value']) ? (array) $params['value'] : array();
     $custom_params = array('class', 'style', 'placeholder', 'id', 'readonly');
     $id = 0;
     foreach ((array) $params['options'] as $field) {
         $params['namespace'] = $namespace;
         $control[$id] = array('title' => '', 'control' => '', 'description' => '');
         $field_id = is_array($field) ? $field['value'] : $field;
         if (!isset($values[$field_id])) {
             $values[$field_id] = $contact->get($field_id);
         }
         $params['value'] = $values[$field_id];
         if (strpos($field_id, ':')) {
             list($field_id, $subfield_id) = explode(':', $field_id, 2);
         } else {
             $subfield_id = null;
         }
         if ($contact_field = waContactFields::get($field_id)) {
             if (is_array($params['value'])) {
                 $params['value'] = current($params['value']);
             }
             self::makeId($params, $field_id);
             $params['title'] = $contact_field->getName();
             $attrs = $this->addCustomParams($custom_params, $params);
             if ($subfield_id) {
                 self::makeId($params, $subfield_id);
                 $params['namespace'] = self::makeNamespace($params + array('name'));
             }
             unset($params['id']);
             if ($subfield_id) {
                 if ($contact_subfield = $contact_field->getFields($subfield_id)) {
                     $control[$id]['title'] .= ' ' . $contact_subfield->getName();
                     $params['id'] = "{$field_id}:{$subfield_id}";
                     $control[$id]['control'] = $contact_subfield->getHTML($params, $attrs);
                 } else {
                     $params['title'] .= ':' . $subfield_id;
                     $control[$id]['title'] = $this->getControlTitle($params);
                     $control[$id]['control'] .= sprintf('<span class="error">%s<span>', _w('Contact subfield not found'));
                 }
             } else {
                 $control[$id]['control'] = $contact_field->getHTML($params, $attrs);
                 $control[$id]['title'] = $this->getControlTitle($params);
             }
         } else {
             $params['title'] = $field_id;
             $control[$id]['title'] = $this->getControlTitle($params);
             $control[$id]['control'] .= sprintf('<span class="error">%s<span>', _w('Contact field not found'));
         }
         ++$id;
     }
     return $control;
 }
 public function format($data)
 {
     $parts = $this->getParts($data);
     $i = 0;
     $data['value'] = array();
     $fields = waContactFields::get('address')->getFields();
     foreach ($parts['parts'] as $part_id => $part) {
         $v = '';
         // add country flag before the first line
         if ($i === 0 && $parts['pic'] && (!isset($this->options['image']) || $this->options['image'])) {
             $v = $parts['pic'] . ' ';
         }
         $v .= $part;
         // add marker after the first line of address
         if ($i == 0 && $parts['marker']) {
             $v .= $parts['marker'];
         }
         $data['value'][] = $v;
         $i++;
     }
     $data['value'] = implode("<br>\n", $data['value']);
     return $data;
 }
 public function displayPrintForm($id, waOrder $order, $params = array())
 {
     if ($id = 'delivery_list') {
         $view = wa()->getView();
         $main_contact_info = array();
         foreach (array('email', 'phone') as $f) {
             if ($v = $order->contact->get($f, 'top,html')) {
                 $main_contact_info[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
             }
         }
         $formatter = new waContactAddressSeveralLinesFormatter();
         $shipping_address = array();
         foreach (waContactFields::get('address')->getFields() as $k => $v) {
             if (isset($order->params['shipping_address.' . $k])) {
                 $shipping_address[$k] = $order->params['shipping_address.' . $k];
             }
         }
         $shipping_address_text = array();
         foreach (array('country_name', 'region_name', 'zip', 'city', 'street') as $k) {
             if (!empty($order->shipping_address[$k])) {
                 $shipping_address_text[] = $order->shipping_address[$k];
             }
         }
         $shipping_address_text = implode(', ', $shipping_address_text);
         $map = '';
         if ($shipping_address_text) {
             $map_adapter = $this->getSettings('map');
             if (!$map_adapter) {
                 $map_adapter = 'google';
             }
             try {
                 $map = wa()->getMap($map_adapter)->getHTML($shipping_address_text, array('width' => '100%', 'height' => '350pt', 'zoom' => 16));
             } catch (waException $e) {
                 $map = '';
             }
         }
         $view->assign('map', $map);
         $shipping_address = $formatter->format(array('data' => $shipping_address));
         $shipping_address = $shipping_address['value'];
         $view->assign(compact('shipping_address_text', 'shipping_address', 'main_contact_info', 'order', 'params'));
         $view->assign('p', $this);
         return $view->fetch($this->path . '/templates/form.html');
     } else {
         throw new waException('Print form not found');
     }
 }
$field = waContactFields::get('sex', 'all');
if ($field && $field->getParameter('storage') == 'info') {
    $p = $field->getParameter('localized_names');
    if (isset($p['en_US']) && $p['en_US'] == 'Sex') {
        $p['en_US'] = 'Gender';
        $field->setParameter('localized_names', $p);
        waContactFields::updateField($field);
    }
}
// make enable main fields for person
$main_fields = array('name', 'title', 'firstname', 'middlename', 'lastname', 'jobtitle', 'company');
$sort = 0;
foreach ($main_fields as $f_id) {
    $field = waContactFields::get($f_id, 'all');
    if ($field) {
        waContactFields::updateField($field);
        waContactFields::enableField($field, 'person', $sort);
        $sort += 1;
    }
}
// make enable main fields for company
$main_fields = array('name', 'company');
$sort = 0;
foreach ($main_fields as $f_id) {
    $field = waContactFields::get($f_id, 'all');
    if ($field) {
        waContactFields::updateField($field);
        waContactFields::enableField($field, 'company', $sort);
        $sort += 1;
    }
}
Beispiel #23
0
 /**
  * Factory method to load form fields from config.
  *
  * Config must return an array: field_id => waContactField OR array of options to specify on existing field with given field_id.
  *
  * @param string|array $file path to config file, or array of config options.
  * @param array $options
  */
 public static function loadConfig($file, $options = array())
 {
     if (is_array($file)) {
         $fields_config = $file;
     } else {
         if (!is_readable($file)) {
             throw new waException('Config is not readable: ' . $file);
         }
         $fields_config = (include $file);
         if (!$fields_config || !is_array($fields_config)) {
             waLog::log('Incorrect config ' . $file);
             $fields_config = array();
         }
     }
     $fields = array();
     $values = array();
     // hidden field values known beforehand
     foreach ($fields_config as $full_field_id => $opts) {
         if ($opts instanceof waContactField) {
             $f = clone $opts;
         } else {
             if (is_array($opts)) {
                 // Allow to specify something like 'phone.home' as field_id in config file.
                 $fid = explode('.', $full_field_id, 2);
                 $fid = $fid[0];
                 $f = waContactFields::get($fid);
                 if (!$f) {
                     waLog::log('ContactField ' . $fid . ' not found.');
                     continue;
                 } else {
                     // Prepare fields parameter for composite field
                     if ($f instanceof waContactCompositeField && !empty($opts['fields'])) {
                         if (!is_array($opts['fields'])) {
                             unset($opts['fields']);
                         } else {
                             $old_subfields = $f->getFields();
                             $subfields = array();
                             foreach ($opts['fields'] as $sfid => $sfopts) {
                                 if (empty($old_subfields[$sfid])) {
                                     waLog::log('Field ' . $fid . ':' . $sfid . ' not found and is ignored in ' . (is_array($file) ? 'config' : $file));
                                     continue;
                                 }
                                 $subfields[$sfid] = self::getClone($old_subfields[$sfid], $sfopts);
                                 if ($subfields[$sfid] instanceof waContactHiddenField) {
                                     if (empty($values[$full_field_id]['data'])) {
                                         $values[$full_field_id] = array('data' => array());
                                     }
                                     $values[$full_field_id]['data'][$sfid] = $subfields[$sfid]->getParameter('value');
                                 }
                             }
                             $opts['fields'] = $subfields;
                         }
                     }
                     $f = self::getClone($f, $opts);
                     if ($f instanceof waContactHiddenField) {
                         $values[$full_field_id] = $f->getParameter('value');
                     }
                 }
             } else {
                 waLog::log('Field ' . $full_field_id . ' has incorrect format and is ignored in ' . $file);
                 continue;
             }
         }
         $fields[$full_field_id] = $f;
     }
     $form = new self($fields, $options);
     $form->setValue($values);
     return $form;
 }
Beispiel #24
0
 public function signupFields($errors = array())
 {
     $config = wa()->getAuthConfig();
     $config_fields = isset($config['fields']) ? $config['fields'] : array('firstname', 'lastname', '', 'email' => array('required' => true), 'password' => array('required' => true));
     $format_fields = array();
     foreach ($config_fields as $k => $v) {
         if (is_numeric($k)) {
             if ($v) {
                 $format_fields[$v] = array();
             } else {
                 $format_fields[] = '';
             }
         } else {
             $format_fields[$k] = $v;
         }
     }
     $fields = array();
     foreach ($format_fields as $field_id => $field) {
         if (!is_numeric($field_id)) {
             if (strpos($field_id, '.')) {
                 $field_id_parts = explode('.', $field_id);
                 $id = $field_id_parts[0];
                 $field['ext'] = $field_id_parts[1];
             } else {
                 $id = $field_id;
             }
             $f = waContactFields::get($id);
             if ($f) {
                 $fields[$field_id] = array($f, $field);
             } elseif ($field_id == 'login') {
                 $fields[$field_id] = array(new waContactStringField($field_id, _ws('Login')), $field);
             } elseif ($field_id == 'password') {
                 $fields[$field_id] = array(new waContactPasswordField($field_id, _ws('Password')), $field);
                 $field_id .= '_confirm';
                 $fields[$field_id] = array(new waContactPasswordField($field_id, _ws('Confirm password')), $field);
             }
         } else {
             $fields[] = '';
         }
     }
     return $fields;
 }
 /**
  * @param array $data
  * @param array $errors
  * @return bool|waContact
  */
 public function signup($data, &$errors = array())
 {
     // check exists contacts
     $auth = wa()->getAuth();
     $field_id = $auth->getOption('login');
     if ($field_id == 'login') {
         $field_name = _ws('Login');
     } else {
         $field = waContactFields::get($field_id);
         if ($field) {
             $field_name = $field->getName();
         } else {
             $field_name = ucfirst($field_id);
         }
     }
     $is_error = false;
     // check passwords
     if ($data['password'] !== $data['password_confirm']) {
         $errors['password'] = array();
         $errors['password_confirm'] = array(_ws('Passwords do not match'));
         $is_error = true;
     } elseif (!$data['password']) {
         $errors['password'] = array();
         $errors['password_confirm'][] = _ws('Password can not be empty.');
         $is_error = true;
     }
     if (!$data[$field_id]) {
         $errors[$field_id] = array(sprintf(_ws("%s is required"), $field_name));
         $is_error = true;
     }
     $contact = $auth->getByLogin($data[$field_id]);
     if ($contact) {
         $errors[$field_id] = array(sprintf(_ws('User with the same %s is already registered'), $field_name));
         $is_error = true;
     }
     // set unconfirmed status for email
     if (isset($data['email']) && $data['email']) {
         $data['email'] = array('value' => $data['email'], 'status' => 'unconfirmed');
     }
     // check captcha
     $auth_config = wa()->getAuthConfig();
     if (isset($auth_config['signup_captcha']) && $auth_config['signup_captcha']) {
         if (!wa()->getCaptcha()->isValid()) {
             $errors['captcha'] = _ws('Invalid captcha');
             $is_error = true;
         }
     }
     if ($is_error) {
         return false;
     }
     // remove password_confirm field
     unset($data['password_confirm']);
     // set advansed data
     $data['create_method'] = 'signup';
     $data['create_ip'] = waRequest::getIp();
     $data['create_user_agent'] = waRequest::getUserAgent();
     // try save contact
     $contact = new waContact();
     if (!($errors = $contact->save($data, true))) {
         // after sign up callback
         $this->afterSignup($contact);
         // auth new contact
         wa()->getAuth()->auth($contact);
         return $contact;
     }
     if (isset($errors['name'])) {
         $errors['firstname'] = array();
         $errors['middlename'] = array();
         $errors['lastname'] = $errors['name'];
     }
     return false;
 }
 public function findDuplicatesFor($field, $values, $excludeIds = array())
 {
     if (!$values) {
         return array();
     }
     // Check if field exists, is active and is kept in this storage
     if (!$field instanceof waContactField) {
         $field = waContactFields::get($field);
         if (!$field) {
             return array();
         }
     }
     if ($field->getParameter('storage') != 'info') {
         return array();
     }
     $field = $field->getId();
     $sql = "SELECT `{$field}` AS f, id\n                FROM wa_contact\n                WHERE `{$field}` IN (:values)" . ($excludeIds ? " AND id NOT IN (:excludeIds) " : ' ') . "GROUP BY f";
     $this->getModel();
     $r = $this->model->query($sql, array('values' => $values, 'excludeIds' => $excludeIds));
     return $r->fetchAll('f', true);
 }
Beispiel #27
0
<?php

//
// When this installation has a custom person_fields_order config,
// make sure default set of fields is allowed in personal profile to edit.
//
if (!file_exists($this->getConfigPath('person_fields_order.php', true, 'contacts'))) {
    return;
}
$person_fields_default_file = $this->getRootPath() . '/wa-system/contact/data/person_fields_default.php';
if (!is_readable($person_fields_default_file)) {
    return;
}
$person_fields_default = (include $person_fields_default_file);
if (!$person_fields_default || !is_array($person_fields_default)) {
    return;
}
foreach ($person_fields_default as $f_id => $opts) {
    if (!empty($opts['allow_self_edit'])) {
        $f = waContactFields::get($f_id, 'person');
        if ($f) {
            $f->setParameter('allow_self_edit', true);
            waContactFields::enableField($f, 'person');
        }
    }
}
 public function execute()
 {
     $id = waRequest::request('id', null, waRequest::TYPE_INT);
     $scm = new shopCustomerModel();
     $customer = $scm->getById($id);
     try {
         $contact = new waContact($id);
         $contact->getName();
     } catch (waException $e) {
         // !!! What to do when shop_customer exists, but no wa_contact found?
         throw $e;
     }
     $ccsm = new waContactCategoriesModel();
     $contact_categories = $ccsm->getContactCategories($id);
     $contacts_url = wa()->getAppUrl('contacts');
     // Info above tabs
     $top = array();
     foreach (array('email', 'phone', 'im') as $f) {
         if ($v = $contact->get($f, 'top,html')) {
             $top[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
         }
     }
     // Get photo
     $photo = $contact->get('photo');
     $config = $this->getConfig();
     $use_gravatar = $config->getGeneralSettings('use_gravatar');
     $gravatar_default = $config->getGeneralSettings('gravatar_default');
     if (!$photo && $use_gravatar) {
         $photo = shopHelper::getGravatar($contact->get('email', 'default'), 96, $gravatar_default);
     } else {
         $photo = $contact->getPhoto(96);
     }
     $contact['photo'] = $photo;
     // Customer orders
     $im = new shopOrderItemsModel();
     $orders_collection = new shopOrdersCollection('search/contact_id=' . $id);
     $total_count = $orders_collection->count();
     $orders = $orders_collection->getOrders('*,items,params', 0, $total_count);
     shopHelper::workupOrders($orders);
     foreach ($orders as &$o) {
         $o['total_formatted'] = waCurrency::format('%{s}', $o['total'], $o['currency']);
         $o['shipping_name'] = ifset($o['params']['shipping_name'], '');
         $o['payment_name'] = ifset($o['params']['payment_name'], '');
         // !!! TODO: shipping and payment icons
     }
     // Customer reviews
     $prm = new shopProductReviewsModel();
     $reviews = $prm->getList('*,is_new,product', array('escape' => false, 'where' => array('contact_id' => $id), 'limit' => false));
     // Customer affiliate transactions history
     $atm = new shopAffiliateTransactionModel();
     $affiliate_history = $atm->getByContact($id);
     $this->view->assign('top', $top);
     $this->view->assign('orders', $orders);
     $this->view->assign('reviews', $reviews);
     $this->view->assign('contact', $contact);
     $this->view->assign('customer', $customer);
     $this->view->assign('contacts_url', $contacts_url);
     $this->view->assign('affiliate_history', $affiliate_history);
     $this->view->assign('contact_categories', $contact_categories);
     $this->view->assign('def_cur_tmpl', str_replace('0', '%s', waCurrency::format('%{s}', 0, wa()->getConfig()->getCurrency())));
     $this->view->assign('point_rate', str_replace(',', '.', (double) str_replace(',', '.', wa()->getSetting('affiliate_usage_rate'))));
     $fields = waContactFields::getAll('person');
     if (isset($fields['name'])) {
         unset($fields['name']);
     }
     $this->view->assign('fields', $fields);
     $this->view->assign('orders_default_view', $config->getOption('orders_default_view'));
     /*
      * @event backend_customer
      * @return array[string]array $return[%plugin_id%] array of html output
      * @return array[string][string]string $return[%plugin_id%]['info_section'] html output
      * @return array[string][string]string $return[%plugin_id%]['name_suffix'] html output
      * @return array[string][string]string $return[%plugin_id%]['header'] html output
      * @return array[string][string]string $return[%plugin_id%]['action_link'] html output
      */
     $this->view->assign('backend_customer', wa()->event('backend_customer', $customer));
 }
 protected function searchPrepare($query, $auto_title = true)
 {
     if ($auto_title || !isset($this->alias_index['data'])) {
         $this->alias_index['data'] = 0;
     }
     //$query = urldecode($query);   // sometime this urldecode broke query, better make urldecode (if needed) outside the searchPrepare
     // `&` can be escaped in search request. Need to split by not escaped ones only.
     $escapedBS = 'ESCAPED_BACKSLASH';
     while (FALSE !== strpos($query, $escapedBS)) {
         $escapedBS .= rand(0, 9);
     }
     $escapedAmp = 'ESCAPED_AMPERSAND';
     while (FALSE !== strpos($query, $escapedAmp)) {
         $escapedAmp .= rand(0, 9);
     }
     $query = str_replace('\\&', $escapedAmp, str_replace('\\\\', $escapedBS, $query));
     $query = explode('&', $query);
     $model = $this->getModel();
     $title = array();
     foreach ($query as $part) {
         if (!($part = trim($part))) {
             continue;
         }
         $part = str_replace(array($escapedBS, $escapedAmp), array('\\', '&'), $part);
         $parts = preg_split("/(\\\$=|\\^=|\\*=|==|!=|>=|<=|=|>|<|@=)/uis", $part, 2, PREG_SPLIT_DELIM_CAPTURE);
         if ($parts) {
             if ($parts[0] === 'name' && $parts[1] === '*=') {
                 $t_a = preg_split("/\\s+/", $parts[2]);
                 $cond = array();
                 foreach ($t_a as $t) {
                     $t = trim($t);
                     if ($t) {
                         $t = $model->escape($t, 'like');
                         $cond[] = "c.name LIKE '%{$t}%'";
                     }
                 }
                 $this->addWhere(implode(" AND ", $cond));
                 $title[] = _ws('Name') . $parts[1] . $parts[2];
             } else {
                 if ($parts[0] == 'email') {
                     if (!isset($this->joins['email'])) {
                         $this->joins['email'] = array('table' => 'wa_contact_emails', 'alias' => 'e');
                     }
                     $title[] = waContactFields::get($parts[0])->getName() . $parts[1] . $parts[2];
                     $this->where[] = 'e.email' . $this->getExpression($parts[1], $parts[2]);
                 } else {
                     if ($model->fieldExists($parts[0])) {
                         if ($f = waContactFields::get($parts[0])) {
                             $title[] = $f->getName() . $parts[1] . $parts[2];
                         } else {
                             $title[] = $parts[0] . $parts[1] . $parts[2];
                         }
                         $this->where[] = 'c.' . $parts[0] . $this->getExpression($parts[1], $parts[2]);
                     } else {
                         if ($parts[0] == 'category') {
                             if (!isset($this->joins['categories'])) {
                                 $this->joins['categories'] = array('table' => 'wa_contact_categories', 'alias' => 'cc');
                             }
                             $title[] = _ws('Category') . $parts[1] . $parts[2];
                             $this->where[] = 'cc.category_id' . $this->getExpression($parts[1], $parts[2]);
                         } else {
                             $field_parts = explode('.', $parts[0]);
                             $f = $field_parts[0];
                             if ($fo = waContactFields::get($f)) {
                                 $title[] = $fo->getName() . $parts[1] . $parts[2];
                             }
                             $ext = isset($field_parts[1]) ? $field_parts[1] : null;
                             $on = ":table.contact_id = c.id AND :table.field = '" . $model->escape($f) . "'";
                             $this->where_fields[] = $f;
                             $op = $parts[1];
                             $term = $parts[2];
                             if ($f === 'address:country') {
                                 $al1 = $this->addJoin('wa_contact_data', $on);
                                 $whr = "{$al1}.value " . $this->getExpression($op, $term);
                                 if ($ext !== null) {
                                     $whr .= " AND {$al1}.ext = '" . $model->escape($ext) . "'";
                                     $whr = "({$whr})";
                                 }
                                 // search by l18n name of countries
                                 if ($op === '*=') {
                                     if (wa()->getLocale() === 'en_US') {
                                         $al2 = $this->addLeftJoin('wa_country', ":table.iso3letter = {$al1}.value");
                                         $whr .= " OR {$al2}.name " . $this->getExpression($parts[1], $parts[2]);
                                     } else {
                                         if (wa()->getLocale() !== 'en_US') {
                                             $iso3letters = array();
                                             $country_model = new waCountryModel();
                                             $countries = $country_model->all();
                                             $term = mb_strtolower($term);
                                             foreach ($countries as &$cntr) {
                                                 if (mb_strpos(mb_strtolower($cntr['name']), $term) === 0) {
                                                     $iso3letters[] = $cntr['iso3letter'];
                                                 }
                                             }
                                             unset($cntr);
                                             if ($iso3letters) {
                                                 $al2 = $this->addLeftJoin('wa_country', ":table.iso3letter = {$al1}.value");
                                                 $whr .= " OR {$al2}.iso3letter IN ('" . implode("','", $iso3letters) . "')";
                                             }
                                         }
                                     }
                                 }
                                 $this->addWhere($whr);
                             } else {
                                 if ($f === 'address:region') {
                                     if (strpos($term, ":") !== false) {
                                         // country_code : region_code - search by country code AND region code AND only in wa_region
                                         $term = explode(":", $term);
                                         $country_iso3 = $model->escape($term[0]);
                                         $code = $model->escape($term[1]);
                                         $al1 = $this->addJoin('wa_contact_data', $on);
                                         $whr = array();
                                         if ($ext !== null) {
                                             $whr[] = "{$al1}.ext = '" . $model->escape($ext) . "'";
                                         }
                                         $al2 = $this->addJoin('wa_contact_data', ":table.contact_id = c.id AND :table.field = 'address:country'");
                                         $al3 = $this->addJoin('wa_region', ":table.code = {$al1}.value AND :table.country_iso3 = {$al2}.value");
                                         $whr[] = "{$al3}.country_iso3 = '{$country_iso3}'";
                                         $whr[] = "{$al3}.code = '{$code}'";
                                         $whr = implode(" AND ", $whr);
                                     } else {
                                         $al1 = $this->addJoin('wa_contact_data', $on);
                                         $whr = "{$al1}.value" . $this->getExpression($op, $term);
                                         if ($ext !== null) {
                                             $whr .= " AND {$al1}.ext = '" . $model->escape($ext) . "'";
                                             $whr = "({$whr})";
                                         }
                                         if ($op === "*=") {
                                             // if search by like, search by wa_region.name but taking into account country
                                             $al2 = $this->addJoin('wa_contact_data', ":table.contact_id = c.id AND :table.field = 'address:country'");
                                             $al3 = $this->addLeftJoin('wa_region', ":table.code = {$al1}.value AND :table.country_iso3 = {$al2}.value");
                                             $whr .= " OR {$al3}.name " . $this->getExpression($op, $term);
                                         }
                                     }
                                     $this->addWhere($whr);
                                 } else {
                                     $on .= ' AND :table.value ' . $this->getExpression($op, $term);
                                     if ($ext !== null) {
                                         $on .= " AND :table.ext = '" . $model->escape($ext) . "'";
                                     }
                                     $this->addJoin('wa_contact_data', $on);
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     if ($title) {
         $title = implode(', ', $title);
         // Strip slashes from search title.
         $bs = '\\\\';
         $title = preg_replace("~{$bs}(_|%|&|{$bs})~", '\\1', $title);
     }
     if ($auto_title && $title) {
         $this->addTitle($title, ' ');
     }
 }
 public function execute()
 {
     $id = waRequest::request('id', 0, 'int');
     if (!$id || !wa()->getUser()->getRights('shop', 'orders')) {
         $this->redirect(wa()->getAppUrl());
     }
     // Order
     $om = new shopOrderModel();
     $order = $om->getOrder($id);
     shopHelper::workupOrders($order, true);
     $order['tax'] = (double) $order['tax'];
     $order['discount'] = (double) $order['discount'];
     // Order params
     $opm = new shopOrderParamsModel();
     $order['params'] = $opm->get($order['id']);
     // Order subtotal
     $order_subtotal = 0;
     foreach ($order['items'] as $i) {
         $order_subtotal += $i['price'] * $i['quantity'];
     }
     // Format addresses
     $settings = wa('shop')->getConfig()->getCheckoutSettings();
     $form_fields = ifset($settings['contactinfo']['fields'], array());
     $formatter = new waContactAddressSeveralLinesFormatter();
     $shipping_address = shopHelper::getOrderAddress($order['params'], 'shipping');
     $shipping_address = $formatter->format(array('data' => $shipping_address));
     $shipping_address = $shipping_address['value'];
     if (isset($form_fields['address.billing'])) {
         $billing_address = shopHelper::getOrderAddress($order['params'], 'billing');
         $billing_address = $formatter->format(array('data' => $billing_address));
         $billing_address = $billing_address['value'];
         if ($billing_address === $shipping_address) {
             $billing_address = null;
         }
     } else {
         $billing_address = null;
     }
     // Order history
     $log_model = new shopOrderLogModel();
     $log = $log_model->getLog($order['id']);
     // Customer
     $contact = $customer = self::getCustomer($order);
     $top = array();
     foreach (array('email', 'phone') as $f) {
         if ($v = $contact->get($f, 'top,html')) {
             $top[] = array('id' => $f, 'name' => waContactFields::get($f)->getName(), 'value' => is_array($v) ? implode(', ', $v) : $v);
         }
     }
     // Workflow stuff: actions and state
     $workflow = new shopWorkflow();
     $workflow_state = $workflow->getStateById($order['state_id']);
     $workflow_buttons = array();
     foreach ($workflow_state->getActions() as $a_id => $action) {
         if ($a_id === 'edit' || $a_id === 'delete') {
             continue;
         }
         $workflow_buttons[] = $action->getButton();
     }
     $this->view->assign('top', $top);
     $this->view->assign('log', $log);
     $this->view->assign('order', $order);
     $this->view->assign('uniqid', uniqid('f'));
     $this->view->assign('customer', $customer);
     $this->view->assign('workflow_state', $workflow_state);
     $this->view->assign('workflow_buttons', $workflow_buttons);
     $this->view->assign('shipping_address', $shipping_address);
     $this->view->assign('billing_address', $billing_address);
     $this->view->assign('order_subtotal', $order_subtotal);
     $this->view->assign('currency', ifempty($order['currency'], wa()->getConfig()->getCurrency()));
     wa()->getResponse()->setTitle(_w('Order') . ' ' . $order['id_str']);
     parent::execute();
 }