Note: Requires content.module.'); } } /** * Implementation of hook_field_info(). */ function weburl_field_info() { return array( 'weburl' => array('label' => 'Web URL'), ); } /** * Implementation of hook_field(). */ function weburl_field($op, &$node, $field, &$node_field, $teaser, $page) { switch ($op) { case 'load': switch($field['type']) { case 'weburl': $result = db_query("SELECT field_weburl FROM {node_field_weburl_data} WHERE vid = %d AND field_name = '%s' ORDER BY delta", $node->vid, $field['field_name']); if ($field['multiple']) { $values = array(); while ($value = db_fetch_object($result)) { $values[] = array('value' => $value->field_weburl); } $additions = array($field['field_name'] => $values); } else { $value = db_fetch_object($result); $additions = array($field['field_name'] => array('value' => $value->field_weburl)); } break; } return $additions; case 'view': $output = ''; if ($field['multiple']) { foreach ($node_field as $delta => $item) { $node_field[$delta]['view'] = weburl_field_view($field, $item['value'], $item, $node); } } else { $node_field['view'] = weburl_field_view($field, $node_field['value'], $node_field, $node); } $node->$field['field_name'] = $node_field; if ($field['multiple']) { $output = ''; foreach ($node_field as $delta => $item) { $output .= '
'. $item['view'] .'
'; } return $output; } else { return '
'. $node_field['view'] .'
'; } case 'insert': switch($field['type']) { case 'weburl': if ($field['multiple']) { foreach ($node_field as $delta => $item) { db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, delta, field_weburl) VALUES (%d, %d, '%s', %d, '%s')", $node->nid, $node->vid, $field['field_name'], $delta, $item['value']); } } else { db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, field_weburl) VALUES (%d, %d, '%s', '%s')", $node->nid, $node->vid, $field['field_name'], $node_field['value']); } break; } return; case 'update': // Delete and insert, rather than update, in case a field was added. switch($field['type']) { case 'weburl': db_query("DELETE FROM {node_field_weburl_data} WHERE vid = %d AND field_name = '%s'", $node->vid, $field['field_name']); if ($field['multiple']) { foreach ($node_field as $delta => $item) { db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, delta, field_weburl) VALUES (%d, %d, '%s', %d, '%s')", $node->nid, $node->vid, $field['field_name'], $delta, $item['value']); } } else { db_query("INSERT INTO {node_field_weburl_data} (nid, vid, field_name, field_weburl) VALUES (%d, %d, '%s', '%s')", $node->nid, $node->vid, $field['field_name'], $node_field['value']); } break; } return; case 'delete': // Delete using nid rather than vid to purge all revisions. switch($field['type']) { case 'weburl': db_query("DELETE FROM {node_field_weburl_data} WHERE nid = %d AND field_name = '%s'", $node->nid, $field['field_name']); break; } return; } } /** * Implementation of hook_widget_info(). */ function weburl_widget_info() { return array( 'weburl' => array( 'label' => 'Text Field with URL validation', 'field types' => array('weburl'), ), ); } /** * Implementation of hook_widget(). */ function weburl_widget($op, &$node, $field, &$node_field) { switch ($op) { case 'form': $form = array(); $form[$field['field_name']] = array('#tree' => TRUE); if ($field['multiple']) { foreach (range(0, 2) as $delta) { $form[$field['field_name']][$delta]['value'] = array( '#type' => 'textfield', '#title' => t($field['widget']['label']), '#default_value' => $node_field[$delta]['value'], '#required' => ($delta == 0) ? $field['required'] : FALSE, ); } } else { $form[$field['field_name']]['value'] = array( '#type' => 'textfield', '#title' => t($field['widget']['label']), '#default_value' => $node_field['value'], '#required' => $field['required'], ); } return $form; case 'validate': if ($field['multiple']) { foreach($node_field as $delta => $value) { if ($node_field[$delta]['value']) { if (!weburl_validate_weburl($value['value'])) { form_set_error($field['field_name'] .']['. $delta. '][value', t('Not a valid Web URL.')); } } } } else { if ($node_field['value']) { if (!weburl_validate_weburl($node_field['value'])) { form_set_error($field['field_name'] .'][value', t('Not a valid Web URL.')); } } } return; case 'submit': return; } } /** * Implementation of hook_field_view() which performs any translation necessary. */ function weburl_field_view($field, $value, $addlfields = array(), $node = NULL) { return check_plain($value); } /** * Implementation of hook_views_tables(). */ function weburl_views_tables() { $tables = array(); $fields = content_fields(); foreach ($fields as $field) { if ($field['type'] == 'weburl') { $tables['node_field_weburl_data_'. $field['field_name']] = array( 'name' => 'node_field_weburl_data', 'join' => array( 'left' => array( 'table' => 'node', 'field' => 'vid', ), 'right' => array( 'field' => 'vid', ), 'extra' => array('field_name' => $field['field_name']), ), 'fields' => array( 'field_weburl' => array( 'name' => 'Web URL: '. $field['field_name'], 'sortable' => TRUE, ), ), 'sorts' => array( 'field_weburl' => array('name' => 'Web URL: '. $field['field_name']), ), 'filters' => array( 'field_weburl' => array( 'name' => 'Web URL: '. $field['field_name'], 'operator' => array( '=' => 'is', 'contains' => 'contains', 'begins' => 'begins with', 'ends' => 'ends wth', 'LIKE' => 'matches pattern', ), 'operator-handler' => '_text_filter_operator', ), ), ); } } return $tables; } function weburl_validate_weburl($text) { if (!preg_match( // The protocols: http:// '/^((https|http|ftp|news):\/\/)?'. // domains '(([a-z]([a-z0-9\-_]*\.)+)(aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|[a-z]{2})(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.\/%=&]*)?)?)'. // OR ip addresses '|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'. // port number '(:([0-9]{1,4}))'. // forward slash 0 or 1 times '((\/)|(\/(.*)))?'. // end of the expression, case insensitive '$/i', $text, $m)) { return false; } else { $url = new stdClass(); $url->protocol = $m[2]; $url->hostname = strtolower($m[5]).strtolower($m[6]); $url->ip = $m[11]; $url->port = $m[13]; return $url; } }