'admin/store/settings/repeater', 'title' => t('Repeater settings'), 'access' => user_access('administer catalog repeater'), 'callback' => 'uc_repeater_settings_overview', 'type' => MENU_NORMAL_ITEM, ); $items[] = array('path' => 'admin/store/settings/repeater/overview', 'title' => t('Overview'), 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); $items[] = array('path' => 'admin/store/settings/repeater/edit', 'title' => t('Edit'), 'callback' => 'drupal_get_form', 'callback arguments' => array('uc_repeater_admin_settings'), 'type' => MENU_LOCAL_TASK, ); } else { $items[] = array('path' => 'repeater/import', 'access' => TRUE, 'callback' => 'uc_repeater_import', 'type' => MENU_CALLBACK, ); } return $items; } function uc_repeater_perm() { return array('administer catalog repeater'); } function uc_repeater_form_alter($form_id, &$form) { $node = $form['#node']; if (is_object($node) && $form_id == $node->type .'_node_form' && in_array($node->type, module_invoke_all('product_types'))) { $form['uc_repeater_export'] = array('#type' => 'checkbox', '#title' => t('Export to other sites'), '#default_value' => 0, ); } } function uc_repeater_nodeapi(&$node, $op, $arg3 = null, $arg4 = null) { if (in_array($node->type, module_invoke_all('product_types'))) { switch ($op) { case 'insert': case 'update': if ($node->uc_repeater_export) { // Reset cached nodes to send the new node content. node_load(0, null, true); uc_repeater_export($node->nid); } break; } } } function uc_repeater_settings_overview() { $slaves = variable_get('uc_repeater_slaves', array()); $masters = variable_get('uc_repeater_masters', array()); $sections = array( array( 'edit' => 'admin/store/settings/repeater/edit', 'title' => t('Slave sites'), 'items' => (count($slaves) ? $slaves : array(t('None'))), ), array( 'edit' => 'admin/store/settings/repeater/edit', 'title' => t('Master sites'), 'items' => (count($masters) ? $masters : array(t('None'))), ), ); return theme('uc_settings_overview', $sections); } function uc_repeater_admin_settings() { $form = array( '#description' => t('In each field enter the host name and path to the Drupal installation of the sites that interact with this site. Do not include a trailing slash. E.g.: www.othersite.com
copy.yoursite.net/store
etc.'), ); $form['uc_repeater_slaves'] = array('#type' => 'textarea', '#title' => t('Slave sites'), '#default_value' => implode("\n", variable_get('uc_repeater_slaves', array())), '#description' => t('These sites will receive catalog changes from this site. They must recognize this site as a master (see below).'), ); $form['uc_repeater_masters'] = array('#type' => 'textarea', '#title' => t('Master sites'), '#default_value' => implode("\n", variable_get('uc_repeater_masters', array())), '#description' => t('These sites send catalog changes to this site.'), ); $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration') ); $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults') ); if (!empty($_POST) && form_get_errors()) { drupal_set_message(t('The settings have not been saved because of the errors.'), 'error'); } return $form; } function uc_repeater_admin_settings_submit($form_id, $form_values) { if ($form_values['op'] == t('Reset to defaults')) { variable_del('uc_repeater_slaves'); variable_del('uc_repeater_masters'); drupal_set_message(t('The configuration options have been reset to their default values.')); } else { foreach (array('uc_repeater_slaves', 'uc_repeater_masters') as $var) { $values = array_filter(explode("\n", trim($form_values[$var]))); foreach ($values as $key => $input) { $url = explode(' ', trim($input), 2); if ($url[0]) { $site = parse_url($url[0]); $values[$key] = $site['host'] . (isset($site['port']) ? ':'. $site['port'] : '') . $site['path']; } } variable_set($var, $values); } drupal_set_message(t('The configuration options have been saved.')); } } /** * Pushes new products to other sites. */ function uc_repeater_export($nids = array()) { if (count($nids)) { if (count($nids) == 1) { // Most awesome use of casting ever: wrap in an array if not an array. $nids = (array)$nids; } //drupal_set_message('
'. print_r($nids, true) .'
'); $xml = uc_importer_export($nids); //drupal_set_message('
'. htmlentities($xml) .'
'); if ($xml) { $responses = array(); foreach (variable_get('uc_repeater_slaves', array()) as $site) { $responses[$site] = drupal_http_request('http://'. $site .'/repeater/import/'. md5($_SERVER['SERVER_NAME'] . substr(base_path(), 0, -1)) .'/'. md5($xml), array('Content-Type' => 'text/xml'), 'POST', $xml); //watchdog('uc_repeater', htmlentities($xml) ."
$site:
". print_r($responses[$site], true) ."
", WATCHDOG_NOTICE); } } } } function uc_repeater_import($site_hash = null, $xml_hash = null) { $valid_site = false; foreach (variable_get('uc_repeater_masters', array()) as $site) { if (md5($site) == $site_hash) { $valid_site = true; } } if ($valid_site) { $xml = file_get_contents('php://input'); } else { die("Yeah, that's not a good way to get me to do things."); } if (!$xml) { die('Needs must have POST data. And as a hint, it should be XML.'); } else if (md5($xml) != $xml_hash) { die("You really don't know how this site works, do you?"); } /* $dom = new DOMDocument(); $dom->loadXML($xml); if (!$dom->schemaValidate('http://www.ubercart.org/files/store.xsd')) { die("Did not validate against the schema.
". htmlentities($xml) .'
'); } */ uc_importer_import($xml); die("Maybe a successful import. :P"); }