From 919770616a01c83ff9dfcee996ae428fbd78457f Mon Sep 17 00:00:00 2001
From: Eric Rasmussen <ericrasmussen1@gmail.com>
Date: Wed, 5 Dec 2012 09:20:05 -0600
Subject: [PATCH] [gh-481] Add unl-404 menu path that fetches 404 page from
 default site.

Set site_404 variable to that path in unl module update.
---
 sites/all/modules/unl/unl.install |  9 ++++++
 sites/all/modules/unl/unl.module  | 46 +++++++++++++++++++++++++++++--
 2 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/sites/all/modules/unl/unl.install b/sites/all/modules/unl/unl.install
index 0b49be96..a1774011 100644
--- a/sites/all/modules/unl/unl.install
+++ b/sites/all/modules/unl/unl.install
@@ -40,3 +40,12 @@ function unl_update_7112() {
   );
   variable_set('unl_module_whitelist', $modules);
 }
+
+/**
+ * If site does not have custom 404 set, set it to the central UNL page.
+ */
+function unl_update_7113() {
+  if (!variable_get('site_404')) {
+    variable_set('site_404', 'unl-404');
+  }
+}
diff --git a/sites/all/modules/unl/unl.module b/sites/all/modules/unl/unl.module
index ce293145..dd559792 100644
--- a/sites/all/modules/unl/unl.module
+++ b/sites/all/modules/unl/unl.module
@@ -255,6 +255,17 @@ function unl_permission() {
   );
 }
 
+/**
+ * Implements hook_preprocess_node().
+ */
+function unl_preprocess_node(&$vars) {
+  // Full page representation wanted for 404 page
+  $status = drupal_get_http_header('status');
+  if ($status == '404 Not Found') {
+    $vars['page'] = TRUE;
+  }
+}
+
 /**
  * Implements hook_preprocess_page().
  */
@@ -278,11 +289,19 @@ function unl_preprocess_page(&$vars) {
 }
 
 /**
- * Implementation of hook_menu().
+ * Implements hook_menu().
  */
 function unl_menu() {
   $items = array();
 
+  // 404 page pulled from default site.
+  $items['unl-404'] = array(
+    'title' => 'Page not found',
+    'access callback' => TRUE,
+    'page callback' => 'unl_404_page',
+    'type' => MENU_CALLBACK,
+  );
+
   // Output html snippets for regions.
    $items['sharedcode/%'] = array(
     'title' => 'sharedcode files',
@@ -377,7 +396,7 @@ function unl_menu() {
 }
 
 /**
- * Implementation of hook_menu_alter().
+ * Implements hook_menu_alter().
  */
 function unl_menu_alter(&$items) {
   // This duplicates the form at admin/appearance/settings/unl_wdn for roles that can't 'administer themes' but have 'unl theme settings' permission.
@@ -405,6 +424,29 @@ function unl_menu_alter(&$items) {
   $items['admin/modules/uninstall']['access callback'] = 'unl_user_is_administrator';
 }
 
+/**
+ * Custom page callback.
+ */
+function unl_404_page() {
+  $database = $GLOBALS['databases']['default']['default'];
+  $database['prefix'] = unl_get_shared_db_prefix();
+  Database::addConnectionInfo('default_site', 'default', $database);
+  // Switch database connection to default site.
+  db_set_active('default_site');
+
+  $default_404 = unl_shared_variable_get('site_404');
+  // @TODO: $default_404 should look like "node/182" but is there a safer way to retrieve nid?
+  $node = node_load(substr($default_404, 5));
+  drupal_set_title($node->title);
+  $build = node_view($node, 'full');
+  $build['links']['#access'] = FALSE;
+  $build['#contextual_links'] = NULL;
+
+  // Restore database connection.
+  db_set_active();
+  return drupal_render($build);
+}
+
 /**
  * Custom function that creates html snippet output at sharedcode/% paths to
  *   mimic files that once existed on static UNL templated sites.
-- 
GitLab