danielebarchiesi@0: 'Table for storing additional properties for webform nodes.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: 'confirmation' => array( danielebarchiesi@0: 'description' => 'The confirmation message or URL displayed to the user after submitting a form.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: 'confirmation_format' => array( danielebarchiesi@0: 'description' => 'The {filter_format}.format of the confirmation message.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 255, danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: ), danielebarchiesi@0: 'redirect_url' => array( danielebarchiesi@0: 'description' => 'The URL a user is redirected to after submitting a form.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 255, danielebarchiesi@0: 'default' => '', danielebarchiesi@0: ), danielebarchiesi@0: 'status' => array( danielebarchiesi@0: 'description' => 'Boolean value of a webform for open (1) or closed (0).', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 1, danielebarchiesi@0: ), danielebarchiesi@0: 'block' => array( danielebarchiesi@0: 'description' => 'Boolean value for whether this form be available as a block.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'teaser' => array( danielebarchiesi@0: 'description' => 'Boolean value for whether the entire form should be displayed on the teaser.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'allow_draft' => array( danielebarchiesi@0: 'description' => 'Boolean value for whether submissions to this form be saved as a draft.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'auto_save' => array( danielebarchiesi@0: 'description' => 'Boolean value for whether submissions to this form should be auto-saved between pages.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'submit_notice' => array( danielebarchiesi@0: 'description' => 'Boolean value for whether to show or hide the previous submissions notification.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 1, danielebarchiesi@0: ), danielebarchiesi@0: 'submit_text' => array( danielebarchiesi@0: 'description' => 'The title of the submit button on the form.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 255, danielebarchiesi@0: ), danielebarchiesi@0: 'submit_limit' => array( danielebarchiesi@0: 'description' => 'The number of submissions a single user is allowed to submit within an interval. -1 is unlimited.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => -1, danielebarchiesi@0: ), danielebarchiesi@0: 'submit_interval' => array( danielebarchiesi@0: 'description' => 'The amount of time in seconds that must pass before a user can submit another submission within the set limit.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => -1, danielebarchiesi@0: ), danielebarchiesi@0: 'total_submit_limit' => array( danielebarchiesi@0: 'description' => 'The total number of submissions allowed within an interval. -1 is unlimited.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => -1, danielebarchiesi@0: ), danielebarchiesi@0: 'total_submit_interval' => array( danielebarchiesi@0: 'description' => 'The amount of time in seconds that must pass before another submission can be submitted within the set limit.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => -1, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $schema['webform_component'] = array( danielebarchiesi@0: 'description' => 'Stores information about components for webform nodes.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'cid' => array( danielebarchiesi@0: 'description' => 'The identifier for this component within this node, starts at 0 for each node.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'small', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'pid' => array( danielebarchiesi@0: 'description' => 'If this component has a parent fieldset, the cid of that component.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'small', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'form_key' => array( danielebarchiesi@0: 'description' => 'When the form is displayed and processed, this key can be used to reference the results.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 128, danielebarchiesi@0: ), danielebarchiesi@0: 'name' => array( danielebarchiesi@0: 'description' => 'The label for this component.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 255, danielebarchiesi@0: ), danielebarchiesi@0: 'type' => array( danielebarchiesi@0: 'description' => 'The field type of this component (textfield, select, hidden, etc.).', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 16, danielebarchiesi@0: ), danielebarchiesi@0: 'value' => array( danielebarchiesi@0: 'description' => 'The default value of the component when displayed to the end-user.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: 'extra' => array( danielebarchiesi@0: 'description' => 'Additional information unique to the display or processing of this component.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: 'mandatory' => array( danielebarchiesi@0: 'description' => 'Boolean flag for if this component is required.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'weight' => array( danielebarchiesi@0: 'description' => 'Determines the position of this component in the form.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'small', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid', 'cid'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $schema['webform_emails'] = array( danielebarchiesi@0: 'description' => 'Holds information regarding e-mails that should be sent upon submitting a webform', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'eid' => array( danielebarchiesi@0: 'description' => 'The e-mail identifier for this row\'s settings.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'size' => 'small', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'email' => array( danielebarchiesi@0: 'description' => 'The e-mail address that will be sent to upon submission. This may be an e-mail address, the special key "default" or a numeric value. If a numeric value is used, the value of a component will be substituted on submission.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: ), danielebarchiesi@0: 'subject' => array( danielebarchiesi@0: 'description' => 'The e-mail subject that will be used. This may be a string, the special key "default" or a numeric value. If a numeric value is used, the value of a component will be substituted on submission.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => '255', danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: ), danielebarchiesi@0: 'from_name' => array( danielebarchiesi@0: 'description' => 'The e-mail "from" name that will be used. This may be a string, the special key "default" or a numeric value. If a numeric value is used, the value of a component will be substituted on submission.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => '255', danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: ), danielebarchiesi@0: 'from_address' => array( danielebarchiesi@0: 'description' => 'The e-mail "from" e-mail address that will be used. This may be a string, the special key "default" or a numeric value. If a numeric value is used, the value of a component will be substituted on submission.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => '255', danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: ), danielebarchiesi@0: 'template' => array( danielebarchiesi@0: 'description' => 'A template that will be used for the sent e-mail. This may be a string or the special key "default", which will use the template provided by the theming layer.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: ), danielebarchiesi@0: 'excluded_components' => array( danielebarchiesi@0: 'description' => 'A list of components that will not be included in the %email_values token. A list of CIDs separated by commas.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: 'html' => array( danielebarchiesi@0: 'description' => 'Determines if the e-mail will be sent in an HTML format. Requires Mime Mail module.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'attachments' => array( danielebarchiesi@0: 'description' => 'Determines if the e-mail will include file attachments. Requires Mime Mail module.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid', 'eid'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $schema['webform_roles'] = array( danielebarchiesi@0: 'description' => 'Holds access information regarding which roles are allowed to submit which webform nodes. Does not prevent access to the webform node entirely, use the {node_access} table for that purpose.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'rid' => array( danielebarchiesi@0: 'description' => 'The role identifier.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid', 'rid'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $schema['webform_submissions'] = array( danielebarchiesi@0: 'description' => 'Holds general information about submissions outside of field values.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'sid' => array( danielebarchiesi@0: 'description' => 'The unique identifier for this submission.', danielebarchiesi@0: 'type' => 'serial', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'uid' => array( danielebarchiesi@0: 'description' => 'The id of the user that completed this submission.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'is_draft' => array( danielebarchiesi@0: 'description' => 'Is this a draft of the submission?', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'tiny', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'submitted' => array( danielebarchiesi@0: 'description' => 'Timestamp of when the form was submitted.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'remote_addr' => array( danielebarchiesi@0: 'description' => 'The IP address of the user that submitted the form.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 128, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('sid'), danielebarchiesi@0: 'unique keys' => array( danielebarchiesi@0: 'sid_nid' => array('sid', 'nid'), danielebarchiesi@0: ), danielebarchiesi@0: 'indexes' => array( danielebarchiesi@0: 'nid_uid_sid' => array('nid', 'uid', 'sid'), danielebarchiesi@0: 'nid_sid' => array('nid', 'sid'), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $schema['webform_submitted_data'] = array( danielebarchiesi@0: 'description' => 'Stores all submitted field data for webform submissions.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'sid' => array( danielebarchiesi@0: 'description' => 'The unique identifier for this submission.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'cid' => array( danielebarchiesi@0: 'description' => 'The identifier for this component within this node, starts at 0 for each node.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'size' => 'small', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'no' => array( danielebarchiesi@0: 'description' => 'Usually this value is 0, but if a field has multiple values (such as a time or date), it may require multiple rows in the database.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 128, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => '0', danielebarchiesi@0: ), danielebarchiesi@0: 'data' => array( danielebarchiesi@0: 'description' => 'The submitted value of this field, may be serialized for some components.', danielebarchiesi@0: 'type' => 'text', danielebarchiesi@0: 'size' => 'medium', danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid', 'sid', 'cid', 'no'), danielebarchiesi@0: 'indexes' => array( danielebarchiesi@0: 'nid' => array('nid'), danielebarchiesi@0: 'sid_nid' => array('sid', 'nid'), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $schema['webform_last_download'] = array( danielebarchiesi@0: 'description' => 'Stores last submission number per user download.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'uid' => array( danielebarchiesi@0: 'description' => 'The user identifier.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'sid' => array( danielebarchiesi@0: 'description' => 'The last downloaded submission number.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'requested' => array( danielebarchiesi@0: 'description' => 'Timestamp of last download request.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid', 'uid'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $schema; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_install(). danielebarchiesi@0: */ danielebarchiesi@0: function webform_install() { danielebarchiesi@0: module_load_include('inc', 'node', 'content_types'); danielebarchiesi@0: db_update('system') danielebarchiesi@0: ->condition('name', 'webform') danielebarchiesi@0: ->condition('type', 'module') danielebarchiesi@0: ->fields(array('weight' => -1)) danielebarchiesi@0: ->execute(); danielebarchiesi@0: danielebarchiesi@0: // Optionally create the default webform type. danielebarchiesi@0: if (variable_get('webform_install_create_content_type', TRUE)) { danielebarchiesi@0: $webform_type = array( danielebarchiesi@0: 'type' => 'webform', danielebarchiesi@0: 'name' => st('Webform'), danielebarchiesi@0: 'base' => 'node_content', danielebarchiesi@0: 'description' => st('Create a new form or questionnaire accessible to users. Submission results and statistics are recorded and accessible to privileged users.'), danielebarchiesi@0: 'custom' => TRUE, danielebarchiesi@0: 'modified' => TRUE, danielebarchiesi@0: 'locked' => FALSE, danielebarchiesi@0: ); danielebarchiesi@0: $webform_type = node_type_set_defaults($webform_type); danielebarchiesi@0: node_type_save($webform_type); danielebarchiesi@0: node_add_body_field($webform_type); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Implements hook_uninstall(). danielebarchiesi@0: */ danielebarchiesi@0: function webform_uninstall() { danielebarchiesi@0: // Unset webform variables. danielebarchiesi@0: variable_del('webform_node_types'); danielebarchiesi@0: variable_del('webform_node_types_primary'); danielebarchiesi@0: variable_del('webform_use_cookies'); danielebarchiesi@0: variable_del('webform_default_from_address'); danielebarchiesi@0: variable_del('webform_default_from_name'); danielebarchiesi@0: variable_del('webform_default_subject'); danielebarchiesi@0: variable_del('webform_default_format'); danielebarchiesi@0: variable_del('webform_format_override'); danielebarchiesi@0: variable_del('webform_csv_delimiter'); danielebarchiesi@0: variable_del('webform_allowed_tags'); danielebarchiesi@0: variable_del('webform_blocks'); danielebarchiesi@0: danielebarchiesi@0: $component_list = array(); danielebarchiesi@0: $path = drupal_get_path('module', 'webform') . '/components'; danielebarchiesi@0: $files = file_scan_directory($path, '/^.*\.inc$/'); danielebarchiesi@0: foreach ($files as $filename => $file) { danielebarchiesi@0: variable_del('webform_enable_' . $file->name, 1); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Delete uploaded files. danielebarchiesi@0: $filepath = file_build_uri('webform'); danielebarchiesi@0: file_unmanaged_delete_recursive($filepath); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Set the minimum upgrade version. danielebarchiesi@0: * danielebarchiesi@0: * Currently you cannot upgrade from 2.x in Drupal 6 to 3.x in Drupal 7. However danielebarchiesi@0: * there are no database changes between the 3.x versions, so no update is danielebarchiesi@0: * needed at all to move from 3.x in Drupal 6 to Drupal 7. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_last_removed() { danielebarchiesi@0: return 6313; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Allow the confirmation format column to have a NULL value. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7301() { danielebarchiesi@0: // These changes are modeled after user_update_7010(). danielebarchiesi@0: db_change_field('webform', 'confirmation_format', 'confirmation_format', array( danielebarchiesi@0: 'description' => 'The {filter_format}.format of the confirmation message.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: )); danielebarchiesi@0: db_update('webform') danielebarchiesi@0: ->fields(array('confirmation_format' => NULL)) danielebarchiesi@0: ->condition('confirmation', '') danielebarchiesi@0: ->condition('confirmation_format', 0) danielebarchiesi@0: ->execute(); danielebarchiesi@0: $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol(); danielebarchiesi@0: $default_format = variable_get('filter_default_format', 1); danielebarchiesi@0: danielebarchiesi@0: // Since Webform may be updated separately from Drupal core, not all format danielebarchiesi@0: // names may be numbers when running this update. danielebarchiesi@0: $numeric_formats = array(); danielebarchiesi@0: foreach ($existing_formats as $format_name) { danielebarchiesi@0: if (is_numeric($format_name)) { danielebarchiesi@0: $numeric_formats[] = (int) $format_name; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $query = db_update('webform') danielebarchiesi@0: ->fields(array('confirmation_format' => $default_format)) danielebarchiesi@0: ->isNotNull('confirmation_format'); danielebarchiesi@0: danielebarchiesi@0: if (!empty($numeric_formats)) { danielebarchiesi@0: $query->condition('confirmation_format', $numeric_formats, 'NOT IN'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $query->execute(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add columns for e-mail HTML and attachment settings. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7302() { danielebarchiesi@0: if (!db_field_exists('webform_emails', 'html')) { danielebarchiesi@0: db_add_field('webform_emails', 'html', array('type' => 'int', 'size' => 'tiny', 'unsigned' => TRUE, 'default' => 0, 'not null' => TRUE)); danielebarchiesi@0: db_add_field('webform_emails', 'attachments', array('type' => 'int', 'size' => 'tiny', 'unsigned' => TRUE, 'default' => 0, 'not null' => TRUE)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Set the default for the "submit_notice" column to 1. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7303() { danielebarchiesi@0: db_change_field('webform', 'submit_notice', 'submit_notice', array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 1)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add field for block feature and redirection setting. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7304() { danielebarchiesi@0: if (!db_field_exists('webform', 'block')) { danielebarchiesi@0: db_add_field('webform', 'block', array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0)); danielebarchiesi@0: db_change_field('webform', 'redirect_url', 'redirect_url', array('type' => 'varchar', 'length' => 255, 'default' => '')); danielebarchiesi@0: db_update('webform') danielebarchiesi@0: ->fields(array('redirect_url' => 'confirmation')) danielebarchiesi@0: ->condition('redirect_url', '') danielebarchiesi@0: ->execute(); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Set additional_validate and additional_submit columns to allow NULL. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7305() { danielebarchiesi@0: if (db_field_exists('webform', 'additional_validate')) { danielebarchiesi@0: db_change_field('webform', 'additional_validate', 'additional_validate', array('type' => 'text', 'not null' => FALSE)); danielebarchiesi@0: db_change_field('webform', 'additional_submit', 'additional_submit', array('type' => 'text', 'not null' => FALSE)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add column for webform status (open or closed). danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7306() { danielebarchiesi@0: if (!db_field_exists('webform', 'status')) { danielebarchiesi@0: db_add_field('webform', 'status', array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 1)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Update the confirmation_format column for default text format changes. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7307() { danielebarchiesi@0: // Update removed and moved to webform_update_7301(). danielebarchiesi@0: // See http://drupal.org/node/976102. danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Update the confirmation_format column to allow it to store strings. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7308() { danielebarchiesi@0: db_change_field('webform', 'confirmation_format', 'confirmation_format', array( danielebarchiesi@0: 'description' => 'The {filter_format}.format of the confirmation message.', danielebarchiesi@0: 'type' => 'varchar', danielebarchiesi@0: 'length' => 255, danielebarchiesi@0: 'not null' => FALSE, danielebarchiesi@0: )); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add the ability to auto-save as draft between pages. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7309() { danielebarchiesi@0: if (!db_field_exists('webform', 'auto_save')) { danielebarchiesi@0: db_add_field('webform', 'auto_save', array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Remove orphaned and unnecessary rows in the webform table. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7310() { danielebarchiesi@0: $result = db_query("SELECT nid FROM {webform} WHERE danielebarchiesi@0: nid NOT IN danielebarchiesi@0: (SELECT DISTINCT(w1.nid) FROM {webform} w1 INNER JOIN {webform_component} wc ON w1.nid = wc.nid) danielebarchiesi@0: AND nid NOT IN danielebarchiesi@0: (SELECT w2.nid FROM {webform} w2 INNER JOIN {node} n ON w2.nid = n.nid WHERE n.type = 'webform')" danielebarchiesi@0: ); danielebarchiesi@0: $empty_nids = array(); danielebarchiesi@0: foreach ($result as $row) { danielebarchiesi@0: $empty_nids[] = $row->nid; danielebarchiesi@0: } danielebarchiesi@0: if (!empty($empty_nids)) { danielebarchiesi@0: db_delete('webform')->condition('nid', $empty_nids, 'IN')->execute(); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add an index for nid_uid_sid to webform_submissions. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7311() { danielebarchiesi@0: if (!db_index_exists('webform_submissions', 'nid_uid_sid')) { danielebarchiesi@0: db_add_index('webform_submissions', 'nid_uid_sid', array('nid', 'uid', 'sid')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Remove unused Webform variables. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7312() { danielebarchiesi@0: variable_del('node_types'); danielebarchiesi@0: variable_del('components'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Convert the Date component start and end year options to start and end date. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7313() { danielebarchiesi@0: $result = db_select('webform_component', 'wc', array('fetch' => PDO::FETCH_ASSOC)) danielebarchiesi@0: ->fields('wc') danielebarchiesi@0: ->condition('type', 'date') danielebarchiesi@0: ->execute(); danielebarchiesi@0: foreach ($result as $component) { danielebarchiesi@0: $component['extra'] = unserialize($component['extra']); danielebarchiesi@0: if (!isset($component['extra']['start_date']) && !isset($component['end_date'])) { danielebarchiesi@0: foreach (array('year_start' => 'start_date', 'year_end' => 'end_date') as $key => $replacement) { danielebarchiesi@0: $value = isset($component['extra'][$key]) ? trim($component['extra'][$key]) : ''; danielebarchiesi@0: // Relative years. danielebarchiesi@0: if (preg_match('/[-+][ ]*[0-9]+/', $value)) { danielebarchiesi@0: $component['extra'][$replacement] = ($value == 1) ? ($value . ' year') : ($value . ' years'); danielebarchiesi@0: } danielebarchiesi@0: // Absolute years. danielebarchiesi@0: elseif (is_numeric($value)) { danielebarchiesi@0: $component['extra'][$replacement] = 'Dec 31 ' . $value; danielebarchiesi@0: } danielebarchiesi@0: unset($component['extra'][$key]); danielebarchiesi@0: } danielebarchiesi@0: $component['extra'] = serialize($component['extra']); danielebarchiesi@0: drupal_write_record('webform_component', $component, array('nid', 'cid')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add webform_last_download table to store last downloaded sid per user. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7314() { danielebarchiesi@0: // Safety check to prevent recreating the webform_last_download table. danielebarchiesi@0: if (db_table_exists('webform_last_download')) { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $schema['webform_last_download'] = array( danielebarchiesi@0: 'description' => 'Stores last submission number per user download.', danielebarchiesi@0: 'fields' => array( danielebarchiesi@0: 'nid' => array( danielebarchiesi@0: 'description' => 'The node identifier of a webform.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'uid' => array( danielebarchiesi@0: 'description' => 'The user identifier.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: 'sid' => array( danielebarchiesi@0: 'description' => 'The last downloaded submission number.', danielebarchiesi@0: 'type' => 'int', danielebarchiesi@0: 'unsigned' => TRUE, danielebarchiesi@0: 'not null' => TRUE, danielebarchiesi@0: 'default' => 0, danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: 'primary key' => array('nid', 'uid'), danielebarchiesi@0: ); danielebarchiesi@0: db_create_table('webform_last_download', $schema['webform_last_download']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add column for timestamp of last requested CSV download. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7315() { danielebarchiesi@0: if (!db_field_exists('webform_last_download', 'requested')) { danielebarchiesi@0: db_add_field('webform_last_download', 'requested', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0,)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add additional columns for total submission limit. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7316() { danielebarchiesi@0: if (!db_field_exists('webform', 'total_submit_limit')) { danielebarchiesi@0: db_add_field('webform', 'total_submit_limit', array('type' => 'int', 'not null' => TRUE, 'default' => -1)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (!db_field_exists('webform', 'total_submit_interval')) { danielebarchiesi@0: db_add_field('webform', 'total_submit_interval', array('type' => 'int', 'not null' => TRUE, 'default' => -1)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add an index for 'nid_sid' to webform_submissions. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7317() { danielebarchiesi@0: // Even though we already have an index 'nid_uid_sid', adding the index for danielebarchiesi@0: // 'nid_sid' saves us a tablesort on the node/x/webform-results page. danielebarchiesi@0: if (!db_index_exists('webform_submissions', 'nid_sid')) { danielebarchiesi@0: db_add_index('webform_submissions', 'nid_sid', array('nid', 'sid')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Upgrade file components to support the new AJAX-upload element. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7318() { danielebarchiesi@0: $result = db_select('webform_component', 'wc', array('fetch' => PDO::FETCH_ASSOC)) danielebarchiesi@0: ->fields('wc') danielebarchiesi@0: ->condition('type', 'file') danielebarchiesi@0: ->execute(); danielebarchiesi@0: foreach ($result as $component) { danielebarchiesi@0: $component['extra'] = unserialize($component['extra']); danielebarchiesi@0: if (!isset($component['extra']['directory'])) { danielebarchiesi@0: $component['extra']['directory'] = $component['extra']['savelocation']; danielebarchiesi@0: $component['extra']['scheme'] = file_default_scheme(); danielebarchiesi@0: $component['extra']['filtering']['size'] = $component['extra']['filtering']['size'] . ' KB'; danielebarchiesi@0: unset($component['extra']['savelocation']); danielebarchiesi@0: $component['extra'] = serialize($component['extra']); danielebarchiesi@0: drupal_write_record('webform_component', $component, array('nid', 'cid')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return t('File components updated to support AJAX uploading.'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Add file usage entries for all files uploaded through Webform. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7319(&$sandbox) { danielebarchiesi@0: if (!isset($sandbox['progress'])) { danielebarchiesi@0: // Initialize batch update information. danielebarchiesi@0: $sandbox['progress'] = 0; danielebarchiesi@0: $sandbox['last_fid_processed'] = -1; danielebarchiesi@0: $sandbox['max'] = db_select('file_managed') danielebarchiesi@0: ->condition('uri', '%' . db_like('://webform/') . '%', 'LIKE') danielebarchiesi@0: ->countQuery() danielebarchiesi@0: ->execute() danielebarchiesi@0: ->fetchField(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Process all files attached to a given revision during the same batch. danielebarchiesi@0: $limit = variable_get('webform_update_batch_size', 100); danielebarchiesi@0: $files = db_select('file_managed', 'f') danielebarchiesi@0: ->fields('f') danielebarchiesi@0: ->condition('uri', '%' . db_like('://webform/') . '%', 'LIKE') danielebarchiesi@0: ->condition('fid', $sandbox['last_fid_processed'], '>') danielebarchiesi@0: ->orderBy('fid', 'ASC') danielebarchiesi@0: ->range(0, $limit) danielebarchiesi@0: ->execute() danielebarchiesi@0: ->fetchAllAssoc('fid', PDO::FETCH_ASSOC); danielebarchiesi@0: danielebarchiesi@0: // Determine each submission with which a file is associated. danielebarchiesi@0: if (!empty($files)) { danielebarchiesi@0: foreach ($files as $fid => $file) { danielebarchiesi@0: $file = (object) $file; danielebarchiesi@0: $sids = db_query('SELECT wsd.sid FROM {webform_component} wc INNER JOIN {webform_submitted_data} wsd ON wc.nid = wsd.nid AND wc.type = :file WHERE data = :fid', array(':file' => 'file', ':fid' => $file->fid))->fetchAllAssoc('sid', PDO::FETCH_ASSOC); danielebarchiesi@0: foreach ($sids as $sid => $row) { danielebarchiesi@0: // We use a db_merge() instead of file_usage_add() to prevent problems danielebarchiesi@0: // in the event this update was run twice. No file provided by Webform danielebarchiesi@0: // should ever be in use more than once at this point. danielebarchiesi@0: db_merge('file_usage') danielebarchiesi@0: ->key(array( danielebarchiesi@0: 'fid' => $file->fid, danielebarchiesi@0: 'type' => 'submission', danielebarchiesi@0: 'module' => 'webform', danielebarchiesi@0: 'id' => $sid, danielebarchiesi@0: )) danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'count' => 1, danielebarchiesi@0: )) danielebarchiesi@0: ->execute(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Update our progress information for the batch update. danielebarchiesi@0: $sandbox['progress']++; danielebarchiesi@0: $sandbox['last_fid_processed'] = $file->fid; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If less than limit was processed, the update process is finished. danielebarchiesi@0: if (count($files) < $limit || $sandbox['progress'] == $sandbox['max']) { danielebarchiesi@0: $finished = TRUE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If there's no max value then there's nothing to update and we're finished. danielebarchiesi@0: if (empty($sandbox['max']) || isset($finished)) { danielebarchiesi@0: return t('Webform file entries created in the file_usage table.'); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // Indicate our current progress to the batch update system. danielebarchiesi@0: $sandbox['#finished'] = $sandbox['progress'] / $sandbox['max']; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Mark files uploaded through Webform that report active usage permanent. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7320() { danielebarchiesi@0: db_query("UPDATE {file_managed} SET status = 1 WHERE fid IN (SELECT fid FROM {file_usage} WHERE module = :module_name)", array(':module_name' => 'webform')); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Remove files left over from deleted submissions. Such files are now deleted danielebarchiesi@0: * automatically. danielebarchiesi@0: */ danielebarchiesi@0: function webform_update_7321() { danielebarchiesi@0: module_load_include('inc', 'webform', 'components/file'); danielebarchiesi@0: $fids = db_query("SELECT fid FROM {file_usage} WHERE module = 'webform' AND type = 'submission' AND NOT id IN(SELECT sid FROM {webform_submissions})")->fetchCol(); danielebarchiesi@0: foreach ($fids as $fid) { danielebarchiesi@0: _webform_delete_file(NULL, array($fid)); danielebarchiesi@0: } danielebarchiesi@0: }