You are here

commerce_pdm.module in Commerce (Product Display Manager) 7

Commerce Display Manager Module.

File

commerce_pdm.module
View source
<?php

/**
 * @file Commerce Display Manager Module.
 */

/**
 * Implements hook_permission().
 */
function commerce_pdm_permission() {
  return array(
    'access product display manager' => array(
      'title' => t('Access the product display manager.'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function commerce_pdm_menu() {
  $items = array(
    'node/%node/products' => array(
      'title' => 'Products',
      'type' => MENU_LOCAL_TASK,
      'page callback' => 'drupal_get_form',
      'page arguments' => array(
        'commerce_pdm_display_node_products_form',
        1,
      ),
      'access callback' => 'commerce_pdm_access_products_tab',
      'access arguments' => array(
        1,
      ),
    ),
    'admin/commerce/products/display_manager' => array(
      'title' => 'Display manager',
      'type' => MENU_LOCAL_TASK,
      'page callback' => 'commerce_pdm_product_display_manager_page',
      'access arguments' => array(
        'access product display manager',
      ),
      'file' => 'commerce_pdm.admin.inc',
    ),
    'commerce_pqr/autocomplete' => array(
      'title' => 'Autocomplete for existing display nodes',
      'page callback' => '_commerce_pdm_existing_displays_autocomplete',
      'access arguments' => array(
        'access content',
      ),
      'type' => MENU_CALLBACK,
    ),
    // Ajax callback path for returning info about a node.
    'commerce_pdm/get_node_info/%' => array(
      'page callback' => '_commerce_pdm_get_node_info',
      'page arguments' => array(
        2,
      ),
      // ToDo: Checkup permission.
      'access arguments' => array(
        'access content',
      ),
      'type' => MENU_CALLBACK,
    ),
  );

  // Create clone callbacks. These products based on other products in the same
  // Product Display, prepopulating the values of the base product.
  foreach (commerce_product_types() as $type => $product_type) {
    $items['admin/commerce/products/clone/' . strtr($type, array(
      '_' => '-',
    )) . '/%commerce_product'] = array(
      'title' => 'Create @name',
      'title arguments' => array(
        '@name' => $product_type['name'],
      ),
      'description' => $product_type['description'],
      'page callback' => 'commerce_pdm_product_ui_product_form_wrapper',
      'page arguments' => array(
        commerce_product_new($type),
        5,
      ),
      'access callback' => 'commerce_product_access',
      'access arguments' => array(
        'create',
        $type,
      ),
      'file' => 'commerce_pdm_product_clone.inc',
    );
  }
  return $items;
}

/**
 * Implements hook_help().
 */
function commerce_pdm_help($path, $args) {
  if ($path == 'admin/commerce/products/display_manager') {
    return t('Drag products into display nodes as desired.', array());
  }
}

/**
 * Implements hook_theme().
 */
function commerce_pdm_theme($existing, $type, $theme, $path) {
  return array(
    'commerce_pdm_display_node_products_table' => array(
      'render element' => 'form',
    ),
    'commerce_pdm_product_display_manager_table' => array(
      'render element' => 'form',
      'file' => 'commerce_pdm.admin.inc',
    ),
    'commerce_pdm_product_references_table' => array(
      'render element' => 'form_elements',
    ),
  );
}

/**
 * Checks if the node is a products display node and that user has access to it.
 */
function commerce_pdm_access_products_tab($node) {
  return user_access('access product display manager') && _commerce_pdm_get_node_reference_field_name($node) !== FALSE;
}

/**
 *
 * Return a form in the shape of a table listing all products referenced by
 *
 * this node.
 */
function commerce_pdm_display_node_products_form($form, &$form_state, $node) {
  $form = array();
  $reference_field_name = _commerce_pdm_get_node_reference_field_name($node);
  $items = field_get_items('node', $node, $reference_field_name);
  if (!empty($items)) {
    foreach ($items as $item) {
      $products_query = db_select('commerce_product', 'cp');
      $products_query
        ->fields('cp', array(
        'product_id',
        'sku',
        'title',
      ));
      $products_query
        ->condition('cp.product_id', $item['product_id']);
      $product_data = $products_query
        ->execute()
        ->fetch();
      $form[] = array(
        'sku' => array(
          '#type' => 'item',
          '#markup' => $product_data->sku,
        ),
        'title' => array(
          '#type' => 'item',
          '#markup' => $product_data->title,
        ),
        'edit' => array(
          '#type' => 'link',
          '#href' => 'admin/commerce/products/' . $product_data->product_id . '/edit',
          '#title' => t('Edit'),
        ),
      );
    }
    $form['#theme'] = 'commerce_pdm_display_node_products_table';
  }
  else {
    $form['no_products'] = array(
      '#markup' => t('This product display node is currently not referencing any products'),
    );
  }
  return $form;
}

/**
 * Creates a table out of commerce_pdm_display_node_products_form.
 */
function theme_commerce_pdm_display_node_products_table($variables) {
  $form = $variables['form'];
  $header = array(
    'SKU',
    'Title',
    'Edit',
  );
  $rows = array();
  foreach (element_children($form) as $row_key) {
    if (is_numeric($row_key)) {
      $row_data = $form[$row_key];
      $row = array();
      $row[] = drupal_render($row_data['sku']);
      $row[] = drupal_render($row_data['title']);
      $row[] = drupal_render($row_data['edit']);
      $rows[] = array(
        'data' => $row,
      );
    }
  }
  $output = theme('table', array(
    'header' => $header,
    'rows' => $rows,
    'attributes' => array(
      'id' => 'commerce_pdm_display_node_products_table',
    ),
  ));
  return $output;
}

/**
 * Implements hook_form_FORM_ID_alter().
 *
 * Adding inputs to specify a default setting to use for product referencing
 * whenever a product with this specific type is being created.
 */
function commerce_pdm_form_commerce_product_ui_product_type_form_alter(&$form, &$form_state, $form_id) {
  $product_type_machine = $form_state['product_type']['type'];

  // Need to save this for later, the source is gone at submission.
  // If the type is about to be created,
  // this value exists in the submit function.
  $form_state['#product_display_type_machine'] = $product_type_machine;
  $default_type_new = variable_get('commerce_pdm_default_new_' . $product_type_machine, '');
  $form['quick_reference'] = array(
    '#type' => 'fieldset',
    '#title' => t("Quick reference default"),
    '#weight' => $form['actions']['#weight'],
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
  );
  $options = _commerce_pdm_get_product_display_types(TRUE);
  if (!empty($options)) {
    $form['quick_reference']['commerce_pdm_product_display_type'] = array(
      '#type' => 'select',
      '#title' => t("Type"),
      '#description' => t("Choose the default product display type."),
      '#default_value' => $default_type_new,
      '#options' => $options,
    );
  }
  else {
    $form['quick_reference']['commerce_pdm_product_display_type'] = array(
      '#markup' => t('The store does not yet contain any product display nodes.'),
    );
  }
  $form['actions']['submit']['#submit'][] = 'commerce_pdm_form_commerce_product_ui_product_type_form_submit';
}

/**
 * Submit callback for commerce_product_ui_product_type_form().
 *
 * @see commerce_pdm_form_commerce_product_ui_product_type_form_alter()
 * Save default values for this product type.
 */
function commerce_pdm_form_commerce_product_ui_product_type_form_submit($form, &$form_state) {
  $form_values = $form_state['values'];

  // Get the product type machine name from the storage if existing
  // See alter function for more information.
  $product_type = !empty($form_state['#product_display_type_machine']) ? $form_state['#product_display_type_machine'] : $form_values['product_type']['type'];
  variable_set('commerce_pdm_default_new_' . $product_type, $form_values['commerce_pdm_product_display_type']);
}

/**
 * Implements hook_form_FORM_ID_alter().
 *
 * Adding inputs to let the user add the created product as a
 * reference to a Product Display Node.
 */
function commerce_pdm_form_commerce_product_ui_product_form_alter(&$form, &$form_state, $form_id) {
  $display_type_options = _commerce_pdm_get_product_display_types(TRUE);
  $product_type_machine = $form_state['commerce_product']->type;
  if (empty($display_type_options)) {
    $form['quick_reference'] = array(
      '#type' => 'fieldset',
      '#title' => t('Referenced by'),
      '#weight' => $form['actions']['#weight'],
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
    );
    $form['quick_reference']['info'] = array(
      '#markup' => t('The store does not yet contain any product display nodes to add this product to.'),
    );
  }
  else {

    // Store the value for the after_build function.
    // $form['#commerce_pdm_reference_product_type'] = $product_type_machine.
    $form['quick_reference'] = array(
      '#type' => 'fieldset',
      '#title' => t('Referenced by'),
      '#description' => t('Changes made here are only temporary, the product must be saved for these changes to take effect.'),
      '#weight' => $form['actions']['#weight'],
      '#theme' => 'commerce_pdm_product_references_table',
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
      '#tree' => TRUE,
    );
    if (!isset($form_state['commerce_product']->is_new)) {

      // Editing an existing product.
      $referenced_from = _commerce_pdm_get_nodes_referencing($form_state['commerce_product']->product_id);
      $existing_references = array();
      if (!empty($referenced_from)) {
        foreach ($referenced_from as $reference) {
          $existing_references[] = $reference;
        }
        $form_state['#existing_references'] = $existing_references;
      }
      foreach ($existing_references as $key => $existing_reference) {
        $form['quick_reference'][$key] = _commerce_pdm_get_product_reference_form_inputs($existing_reference);
      }
    }
    elseif (isset($_GET['pdid'])) {
      $pdid = $_GET['pdid'];
      $form_state['#existing_references'] = array(
        $pdid,
      );
      $form['quick_reference'][0] = _commerce_pdm_get_product_reference_form_inputs($pdid);
      $form['quick_reference'][0]['attach']['#default_value'] = 1;
    }

    // Add an empty row to use as template in JavaScript.
    $form['quick_reference']['commerce_pdm_product_reference_row_template'] = _commerce_pdm_get_product_reference_form_inputs();
    $form['quick_reference']['add_new_reference']['links'] = array(
      'create_new' => array(
        '#type' => 'link',
        '#title' => t('New display node'),
        '#href' => '',
        '#attributes' => array(
          'rel' => array(
            'create_new',
          ),
        ),
      ),
      'existing' => array(
        '#type' => 'link',
        '#title' => t('Existing display node'),
        '#href' => '',
        '#attributes' => array(
          'rel' => array(
            'use_existing',
          ),
        ),
      ),
    );
    $default_type_new = variable_get('commerce_pdm_default_new_' . $product_type_machine, NULL);
    $form['quick_reference']['add_new_reference']['actions'] = array(
      'commerce_pdm_product_display_type' => array(
        '#type' => 'select',
        '#title' => t("Type:"),
        '#options' => $display_type_options,
        '#default_value' => $default_type_new ? $default_type_new : '',
        '#prefix' => '<div class="commerce-pdm-product-form-reference-add-actions add-action hidden"><div class="actions"><div class="add-new">',
      ),
      'commerce_pdm_product_display_title' => array(
        '#type' => 'textfield',
        '#title' => t("Title of new display node:"),
        '#suffix' => '</div>',
      ),
      'commerce_pdm_product_display_existing' => array(
        '#type' => 'textfield',
        '#title' => t("Display node ID:"),
        '#autocomplete_path' => 'commerce_pqr/autocomplete',
        '#default_value' => '',
        '#prefix' => '<div class="existing add-action">',
      ),
      'commerce_pdm_product_display_add' => array(
        '#type' => 'link',
        '#title' => t('Add'),
        '#href' => '',
        '#attributes' => array(
          'class' => array(
            'add',
          ),
        ),
        '#prefix' => '</div>',
      ),
      'commerce_pdm_product_display_cancel' => array(
        '#type' => 'link',
        '#title' => t('Cancel'),
        '#href' => '',
        '#attributes' => array(
          'class' => array(
            'cancel',
          ),
        ),
        '#suffix' => '</div></div>',
      ),
    );

    // Add JavaScript used by form.
    $form['#after_build'] = array(
      '_commerce_pdm_product_form_reference_attach',
    );

    // $form['#validate'][] = 'commerce_pdm_product_form_reference_validate'.
    $form['actions']['submit']['#submit'][] = 'commerce_pdm_product_form_reference_submit';
  }
}

/**
 * Validate callback for commerce_product_ui_product_form().
 *
 * @see commerce_pdm_form_commerce_product_ui_product_form_alter()
 */
function commerce_pdm_product_form_reference_validate(&$form, &$form_state) {
}

/**
 * Submit callback for commerce_product_ui_product_form().
 *
 * @see commerce_pdm_form_commerce_product_ui_product_form_alter()
 * Add a reference to the created product to either
 * a new node or an existing one.
 */
function commerce_pdm_product_form_reference_submit(&$form, &$form_state) {
  $product_id = $form_state['build_info']['args'][0]->product_id;
  foreach ($form_state['input']['quick_reference'] as $element) {
    if (isset($element['title']) && !empty($element['title'])) {
      if ($element['attach'] xor $element['deleted']) {
        if ($element['new_type'] != FALSE) {
          $node = _commerce_pdm_create_display_node($element['new_type'], $element['title']);
        }
        else {
          $node = node_load($element['nid']);
        }
        $reference_field_name = _commerce_pdm_get_node_reference_field_name($node);
        $field_language = field_language('node', $node, $reference_field_name);
        if ($element['deleted'] == TRUE) {
          foreach ($node->{$reference_field_name}[$field_language] as $field_value_key => $field_value) {
            if ($field_value['product_id'] == $product_id) {
              array_splice($node->{$reference_field_name}[$field_language], $field_value_key, 1);
              break;
            }
          }
        }
        else {
          if (!isset($node->{$reference_field_name}[$field_language])) {
            $node->{$reference_field_name}[$field_language] = array();
          }
          $node->{$reference_field_name}[$field_language][] = array(
            'product_id' => $product_id,
          );
        }
        node_save($node);
      }
    }
  }
}

/**
 * Delete related variables from the database.
 */
function commerce_pdm_commerce_product_type_delete($type, $skipreset) {
  variable_del('commerce_pdm_default_new_' . $type['type']);
}

/**
 * Product references table.
 */
function theme_commerce_pdm_product_references_table($variables) {
  $form_elements = $variables['form_elements'];
  $header = array(
    t('Title'),
    t('Node ID'),
    t('Delete reference'),
  );
  $rows = array();
  foreach (element_children($form_elements) as $row_key) {
    if ($row_key !== 'add_new_reference') {
      $row = array();
      $row[] = drupal_render($form_elements[$row_key]['title']);
      $row[] = drupal_render($form_elements[$row_key]['nid']);
      $row[] = drupal_render($form_elements[$row_key]['attach']) . drupal_render($form_elements[$row_key]['delete']) . drupal_render($form_elements[$row_key]['undo_delete']) . drupal_render($form_elements[$row_key]['deleted']) . drupal_render($form_elements[$row_key]['new_type']);
      $row_classes = $row_key === 'commerce_pdm_product_reference_row_template' ? array(
        'hidden reference-row-template',
      ) : array();
      $rows[] = array(
        'data' => $row,
        'class' => $row_classes,
      );
    }
  }
  $add_reference = t('Add a reference to:');
  $row = array();
  $row[] = '<div class="commerce-pdm-product-form-reference-add-links">';
  $row[0] .= $add_reference . '&nbsp;&nbsp;';
  $row[0] .= drupal_render($form_elements['add_new_reference']['links']['create_new']);
  $row[0] .= '&nbsp;&nbsp;&#124;&nbsp;&nbsp;';
  $row[0] .= drupal_render($form_elements['add_new_reference']['links']['existing']);
  $row[0] .= '</div>';
  $row[0] .= drupal_render($form_elements['add_new_reference']['actions']);
  $row[0] .= '<div class="commerce-pdm-product-form-reference-error-message" style="display:none;"></div>';
  $row[0] = array(
    'data' => $row[0],
    'colspan' => 3,
  );
  $rows[] = array(
    'data' => $row,
    'class' => array(
      'add-new',
    ),
  );
  $output = theme('table', array(
    'header' => $header,
    'rows' => $rows,
    'attributes' => array(
      'id' => 'commerce_pdm_product_referenced_by',
    ),
  ));
  return $output;
}

/**
 * Reference form inputs.
 */
function _commerce_pdm_get_product_reference_form_inputs($existing_reference = '') {
  if ($existing_reference != '') {
    $node_obj = db_query('SELECT n.title FROM {node} n WHERE nid = :nid', array(
      ':nid' => $existing_reference,
    ))
      ->fetchObject();
    $node_title = $node_obj->title;
  }
  else {
    $node_title = '';
  }
  $inputs = array(
    // If this is a new reference that will be attached to a reference field.
    'attach' => array(
      '#type' => 'hidden',
      '#default_value' => 0,
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-attach',
        ),
      ),
    ),
    // The title of the node or the node to be created.
    'title' => array(
      '#type' => 'textfield',
      '#value' => $node_title,
      '#default_value' => $node_title,
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-title',
        ),
        'readonly' => 'readonly',
      ),
    ),
    // The node ID of the node, this will be set to New if
    // the node is to be created.
    'nid' => array(
      '#type' => 'textfield',
      '#value' => $existing_reference,
      '#default_value' => $existing_reference,
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-nid',
        ),
        // Just for the JavaScript check.
        'val' => $existing_reference,
        'readonly' => 'readonly',
      ),
    ),
    // The delete link.
    'delete' => array(
      '#type' => 'link',
      '#title' => t('Delete'),
      '#href' => '',
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-delete',
        ),
      ),
    ),
    // The undo delete link.
    'undo_delete' => array(
      '#type' => 'link',
      '#title' => t('Undo delete'),
      '#href' => '',
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-undo-delete',
          'hidden',
        ),
      ),
    ),
    // If the reference to this product should be removed from the node.
    'deleted' => array(
      '#type' => 'hidden',
      '#default_value' => 0,
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-deleted',
        ),
      ),
    ),
    // The node type to create the new node of.
    'new_type' => array(
      '#type' => 'hidden',
      '#default_value' => 0,
      '#attributes' => array(
        'class' => array(
          'commerce-pdm-reference-new-type',
        ),
      ),
    ),
  );
  return $inputs;
}

/**
 * Helper function to see witch node types are valid product display node types.
 *
 * @param mixed $json_format
 *   If every element in the returned array should be keyed by display
 *   nodes bundle name. This is for the product_display_type select box in
 *   the form.
 *
 * @return array
 *   An array of elements containing machine_name => human name.
 */
function _commerce_pdm_get_product_display_types($json_format) {
  $fields = array();
  $product_reference_fields = _commerce_pdm_get_product_reference_fields();

  // Only create output if product reference fields where found.
  if (!empty($product_reference_fields)) {
    $select_node_bundles = db_select('field_config_instance', 'fci');
    $select_node_bundles
      ->join('node_type', 'nt', 'nt.type = fci.bundle');
    $select_node_bundles
      ->fields('fci', array(
      'bundle',
    ))
      ->fields('nt', array(
      'name',
    ));
    $conditions = db_or();
    foreach ($product_reference_fields as $field_name) {
      $conditions
        ->condition('fci.field_name', $field_name);
    }
    $select_node_bundles
      ->condition($conditions);
    $select_node_bundles_result = $select_node_bundles
      ->execute();
    foreach ($select_node_bundles_result as $bundle) {
      $fields[$bundle->bundle] = $bundle->name;
    }
  }
  $output = array();
  foreach ($fields as $bundle => $bundle_name) {
    if ($json_format) {
      $output[$bundle] = $bundle_name;
    }
    else {
      $output[] = array(
        'machine_name' => $bundle,
        'name' => $bundle_name,
      );
    }
  }
  return $output;
}

/**
 * function to return all product reference fields in the drupal installation.
 */
function _commerce_pdm_get_product_reference_fields() {
  $product_reference_fields = array();
  foreach (field_info_fields() as $field) {

    // Do not include the commerce_product field, why?
    if ($field['type'] == 'commerce_product_reference' && $field['field_name'] != 'commerce_product') {
      $product_reference_fields[] = $field['field_name'];
    }
  }
  return $product_reference_fields;
}

/**
 * Get the NID's of a nodes referencing to a product.
 *
 * If no node is referencing to it, return an empty array.
 */
function _commerce_pdm_get_nodes_referencing($product_id) {
  $product_fields = _commerce_pdm_get_product_reference_fields();
  $entities = array();
  foreach ($product_fields as $field) {
    $result = db_query('SELECT entity_id FROM {field_data_' . $field . '} df WHERE df.' . $field . '_product_id = :pid', array(
      ':pid' => $product_id,
    ));
    foreach ($result as $reference) {
      $entities[] = $reference->entity_id;
    }
  }
  return $entities;
}

/**
 * Helper function to get the name of the product reference field in a node.
 */
function _commerce_pdm_get_node_reference_field_name($node) {
  $field_name_out = FALSE;
  foreach (_commerce_pdm_get_product_reference_fields() as $field_name) {
    if (isset($node->{$field_name})) {
      $field_name_out = $field_name;
      break;
    }
  }
  return $field_name_out;
}

/**
 * Menu callback; Retrieve a JSON object containing autocomplete suggestions.
 *
 * Return titles of existing product display nodes.
 */
function _commerce_pdm_existing_displays_autocomplete($typed) {
  $output = array();
  $product_display_types = _commerce_pdm_get_product_display_types(FALSE);
  if (!empty($product_display_types)) {
    $query_conditions = db_or();
    foreach ($product_display_types as $display_type) {
      $query_conditions
        ->condition('n.type', $display_type['machine_name']);
    }
    $query = db_select('node', 'n')
      ->fields('n', array(
      'nid',
      'title',
      'type',
    ))
      ->condition($query_conditions)
      ->condition('n.title', '%' . $typed . '%', 'LIKE')
      ->addTag('node_access');
    $query_result = $query
      ->execute();
    foreach ($query_result as $result) {
      $output[$result->nid] = $result->title . ' (' . $result->type . ')';
    }
  }
  drupal_json_output($output);
}

/**
 * Ajax callback function returning information about a node.
 *
 * @param $nid
 *   The node ID of whitch I should return information about.
 *
 * @return drupal_json_output
 *   Return the results through drupal_json_output().
 */
function _commerce_pdm_get_node_info($nid) {
  $result = array();
  if ($node = node_load($nid)) {
    $field_name = _commerce_pdm_get_node_reference_field_name($node);
    if (!_commerce_pdm_get_number_reference_values_allowed($node, count($node->{$field_name}[LANGUAGE_NONE]) + 1)) {
      $result['success'] = FALSE;
      $result['message'] = 'node_full';
    }
    else {
      $result['success'] = TRUE;
      $result['data']['title'] = $node->title;
      $result['data']['nid'] = $node->nid;
    }
  }
  else {
    $result['success'] = FALSE;
    $result['message'] = 'not_found';
  }
  return drupal_json_output($result);
}

/**
 * Helper function to see if the specified number of values is allowed to exist
 *
 * in the specified node's product reference field.
 */
function _commerce_pdm_get_number_reference_values_allowed($node, $num_values) {
  $node = is_object($node) ? $node : node_load($node);
  $field_name = _commerce_pdm_get_node_reference_field_name($node);
  $allowed_values = _commerce_pdm_get_num_allowed_references($node);
  if (isset($node->{$field_name}[LANGUAGE_NONE])) {
    if ($allowed_values != -1 && $num_values > $allowed_values) {
      return FALSE;
    }
  }
  return TRUE;
}

/**
 * Returns the maximum number of values the product reference field
 *
 * in the specified node can contain.
 */
function _commerce_pdm_get_num_allowed_references($node) {
  $node = is_object($node) ? $node : node_load($node);
  $field_name = _commerce_pdm_get_node_reference_field_name($node);
  $field_settings = field_info_field($field_name);
  return (int) $field_settings['cardinality'];
}

/**
 * Creates a display node and returns the result as a json object.
 *
 * @param $type
 *   The node type of whitch to create a node from.
 *
 * @param $title
 *   Set the title of the new node to this.
 *
 * @return drupal_json_output
 *   Return the results through drupal_json_output().
 */
function _commerce_pdm_create_display_node($type, $title) {
  global $user;
  $node = new stdClass();
  $node->is_new = TRUE;
  $node->type = $type;

  // Prepare the object with the bundle default settings.
  node_object_prepare($node);

  // Additional entity properties.
  $node->uid = $user->uid;
  $node->title = $title;
  $node->format = filter_fallback_format();
  node_save($node);

  // Attach fields to it.
  field_attach_load('node', array(
    $node->nid => $node,
  ));
  return $node;
}

/**
 *
 * Add JavaScript and CSS used by the product reference table in the
 *
 * Product form.
 */
function _commerce_pdm_product_form_reference_attach($form_element) {
  drupal_add_js(drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm_product_form_reference.js');
  drupal_add_css(drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm_product_form_reference.css');

  // Add translated messages for the product reference table.
  drupal_add_js(array(
    'commerce_pdm_product_form' => array(
      'already_has_reference' => t('The product is already referenced by the specified display node.'),
      'node_not_found' => t('Could not find any node with the specified node ID.'),
      'title_missing' => t('You have to enter a title for the new display node.'),
      'not_created' => t('The new display node could not be created.'),
      'node_full' => t('The display node cannot reference to more products, limit reached.'),
      'added_new' => t('Added!'),
      'added_existing' => t('Added!'),
    ),
  ), 'setting');
  return $form_element;
}

Functions

Namesort descending Description
commerce_pdm_access_products_tab Checks if the node is a products display node and that user has access to it.
commerce_pdm_commerce_product_type_delete Delete related variables from the database.
commerce_pdm_display_node_products_form Return a form in the shape of a table listing all products referenced by
commerce_pdm_form_commerce_product_ui_product_form_alter Implements hook_form_FORM_ID_alter().
commerce_pdm_form_commerce_product_ui_product_type_form_alter Implements hook_form_FORM_ID_alter().
commerce_pdm_form_commerce_product_ui_product_type_form_submit Submit callback for commerce_product_ui_product_type_form().
commerce_pdm_help Implements hook_help().
commerce_pdm_menu Implements hook_menu().
commerce_pdm_permission Implements hook_permission().
commerce_pdm_product_form_reference_submit Submit callback for commerce_product_ui_product_form().
commerce_pdm_product_form_reference_validate Validate callback for commerce_product_ui_product_form().
commerce_pdm_theme Implements hook_theme().
theme_commerce_pdm_display_node_products_table Creates a table out of commerce_pdm_display_node_products_form.
theme_commerce_pdm_product_references_table Product references table.
_commerce_pdm_create_display_node Creates a display node and returns the result as a json object.
_commerce_pdm_existing_displays_autocomplete Menu callback; Retrieve a JSON object containing autocomplete suggestions.
_commerce_pdm_get_nodes_referencing Get the NID's of a nodes referencing to a product.
_commerce_pdm_get_node_info Ajax callback function returning information about a node.
_commerce_pdm_get_node_reference_field_name Helper function to get the name of the product reference field in a node.
_commerce_pdm_get_number_reference_values_allowed Helper function to see if the specified number of values is allowed to exist
_commerce_pdm_get_num_allowed_references Returns the maximum number of values the product reference field
_commerce_pdm_get_product_display_types Helper function to see witch node types are valid product display node types.
_commerce_pdm_get_product_reference_fields function to return all product reference fields in the drupal installation.
_commerce_pdm_get_product_reference_form_inputs Reference form inputs.
_commerce_pdm_product_form_reference_attach Add JavaScript and CSS used by the product reference table in the