Delegate contact input validation to rcube_addressbook instance; accept already localized texts in rcube_output::show_message()

release-0.6
thomascube 14 years ago
parent 361ce60948
commit 07b95dc49b

@ -84,6 +84,7 @@ function get_sequence_name($sequence)
* It's a global wrapper for rcmail::gettext()
*
* @param mixed Named parameters array or label name
* @param string Domain to search in (e.g. plugin name)
* @return string Localized text
* @see rcmail::gettext()
*/
@ -93,6 +94,18 @@ function rcube_label($p, $domain=null)
}
/**
* Global wrapper of rcmail::text_exists()
* to check whether a text label is defined
*
* @see rcmail::text_exists()
*/
function rcube_label_exists($name, $domain=null)
{
return rcmail::get_instance()->text_exists($name, $domain);
}
/**
* Overwrite action variable
*

@ -925,6 +925,22 @@ class rcmail
}
/**
* Check if the given text lable exists
*
* @param string Label name
* @return boolean True if text exists (either in the current language or in en_US)
*/
public function text_exists($name, $domain=null)
{
// load localization files if not done yet
if (empty($this->texts))
$this->load_language();
// check for text with domain first
return ($domain && isset($this->texts[$domain.'.'.$name])) || isset($this->texts[$name]);
}
/**
* Load a localization package
*

@ -168,6 +168,35 @@ abstract class rcube_addressbook
$this->page_size = (int)$size;
}
/**
* Check the given data before saving.
* If input not valid, the message to display can be fetched using get_error()
*
* @param array Assoziative array with data to save
* @return boolean True if input is valid, False if not.
*/
public function validate($save_data)
{
if (empty($save_data['name'])) {
$this->set_error('warning', 'nonamewarning');
return false;
}
// check validity of email addresses
foreach ($this->get_col_values('email', $save_data, true) as $email) {
if (strlen($email)) {
if (!check_email(rcube_idn_to_ascii($email))) {
$this->set_error('warning', rcube_label(array('name' => 'emailformaterror', 'vars' => array('email' => $email))));
return false;
}
}
}
return true;
}
/**
* Create a new contact record
*

@ -395,6 +395,28 @@ class rcube_contacts extends rcube_addressbook
}
/**
* Check the given data before saving.
* If input not valid, the message to display can be fetched using get_error()
*
* @param array Assoziative array with data to save
* @return boolean True if input is valid, False if not.
*/
public function validate($save_data)
{
// check for name input
$valid = parent::validate($save_data);
// require at least one e-mail address (syntax check is done later in save.inc)
if ($valid && !array_filter($this->get_col_values('email', $save_data, true))) {
$this->set_error('warning', 'noemailwarning');
$valid = false;
}
return $valid;
}
/**
* Create a new contact record
*

@ -170,11 +170,8 @@ class rcube_json_output
{
if ($override || !$this->message) {
$this->message = $message;
$this->command(
'display_message',
rcube_label(array('name' => $message, 'vars' => $vars)),
$type
);
$msgtext = rcube_label_exists($message) ? rcube_label(array('name' => $message, 'vars' => $vars)) : $message;
$this->command('display_message', $msgtext, $type);
}
}

@ -255,10 +255,8 @@ class rcube_template extends rcube_html_page
{
if ($override || !$this->message) {
$this->message = $message;
$this->command(
'display_message',
rcube_label(array('name' => $message, 'vars' => $vars)),
$type);
$msgtext = rcube_label_exists($message) ? rcube_label(array('name' => $message, 'vars' => $vars)) : $message;
$this->command('display_message', $msgtext, $type);
}
}

@ -331,7 +331,7 @@ function rcube_webmail()
this.selectedIndex = 0;
});
$("input[type='text']").first().focus();
$("input[type='text']:visible").first().focus();
}
else if (this.gui_objects.qsearchbox) {
this.enable_command('search', 'reset-search', 'moveto', true);
@ -646,7 +646,7 @@ function rcube_webmail()
input_name.focus();
break;
}
else if (input_email.length && !rcube_check_email(input_email.val())) {
else if (this.task == 'settings' && input_email.length && !rcube_check_email(input_email.val())) {
alert(this.get_label('noemailwarning'));
input_email.focus();
break;
@ -3977,7 +3977,7 @@ function rcube_webmail()
elem.focus(function(){ ref.focus_textfield(this); })
.blur(function(){ ref.blur_textfield(this); })
.each(function(){ this._placeholder = ref.env.coltypes[col].label; ref.blur_textfield(this); });
.each(function(){ this._placeholder = this.title = ref.env.coltypes[col].label; ref.blur_textfield(this); });
};
this.insert_edit_field = function(col, section, menu)

@ -128,27 +128,18 @@ foreach ($GLOBALS['CONTACT_COLTYPES'] as $col => $colprop) {
}
}
if (empty($a_record['name']))
$a_record['name'] = join(' ', array_filter(array($a_record['prefix'], $a_record['firstname'], $a_record['middlename'], $a_record['surname'], $a_record['suffix'],)));
// Basic input checks (TODO: delegate to $CONTACTS instance)
if (empty($a_record['name'])/* || empty($a_record['email'])*/) {
$OUTPUT->show_message('formincomplete', 'warning');
rcmail_overwrite_action($return_action);
return;
if (empty($a_record['name'])) {
// TODO: let a dedicated function or a plugin compose the full name
$a_record['name'] = join(' ', array_filter(array($a_record['prefix'], $a_record['firstname'], $a_record['middlename'], $a_record['surname'], $a_record['suffix'],)));
}
// Validity checks
foreach ($CONTACTS->get_col_values('email', $a_record, true) as $email) {
if (strlen($email)) {
$_email = rcube_idn_to_ascii($email);
if (!check_email($_email)) {
$OUTPUT->show_message('emailformaterror', 'warning', array('email' => $email));
rcmail_overwrite_action($return_action);
return;
}
}
// do input checks (delegated to $CONTACTS instance)
if (!$CONTACTS->validate($a_record)) {
$err = (array)$CONTACTS->get_error() + array('message' => 'formincomplete', 'type' => 'warning');
$OUTPUT->show_message($err['message'], $err['type']);
rcmail_overwrite_action($return_action);
return;
}
// get raw photo data if changed

Loading…
Cancel
Save