From 5a500b1236b91fe0368742ec7bf61d8983d2baa1 Mon Sep 17 00:00:00 2001
From: njimedia <software@njimedia.com>
Date: Wed, 23 Mar 2011 12:25:49 -0400
Subject: [PATCH] Issue #1102968 by MikeNGarrett: Limit display of templates by content type.

---
 custom_node_template.module |   87 ++++++++++++++++++++++++++++++------------
 1 files changed, 62 insertions(+), 25 deletions(-)

diff --git a/custom_node_template.module b/custom_node_template.module
index 137c9e7..675a18c 100755
--- a/custom_node_template.module
+++ b/custom_node_template.module
@@ -1,4 +1,5 @@
 <?php
+// $Id: custom_node_template.module,v 1.1.2.12 2010/07/28 20:38:54 WebNewCastle Exp $
 
 /**
  * Custom Node Template allows one to specify different node templates to be used on a node by node basis or by content type.  
@@ -31,13 +32,14 @@ function custom_node_template_perm() {
 function custom_node_template_nodeapi(&$node, $op) {
 
   switch ($op) {
+  	// inserted into database
     case 'insert':
 
       if (isset($node->nodetemplate)) {
         db_query("INSERT INTO {custom_node_template} (nid, nodetemplate) VALUES ('%d', '%s')", $node->nid, $node->nodetemplate);
       }
       break;
-
+	// database is being updated
     case 'update':
 
       $nodetemplate = db_result(db_query("SELECT nodetemplate FROM {custom_node_template} WHERE nid = '%d'", $node->nid));
@@ -53,13 +55,14 @@ function custom_node_template_nodeapi(&$node, $op) {
         db_query("DELETE FROM {custom_node_template} WHERE nid = '%d'", $node->nid);
       }
       break;
-
+	// delete from database
     case 'delete':
 
       db_query("DELETE FROM {custom_node_template} WHERE nid = '%d'", $node->nid);
       break;
 
     case 'load':
+    // node is being prepared to be added/edited
     case 'prepare':
 
       $nodetemplate = db_result(db_query("SELECT nodetemplate FROM {custom_node_template} WHERE nid = '%d'", $node->nid));
@@ -83,7 +86,7 @@ function custom_node_template_nodeapi(&$node, $op) {
  * Implementation of hook_node_type().
  */
 function custom_node_template_node_type($op, $info) {
-
+// Delete nodetemplate variable on content-type delete
   switch ($op) {
     case 'delete':
       variable_del('nodetemplate_'. $info->type);
@@ -93,17 +96,18 @@ function custom_node_template_node_type($op, $info) {
 
 /**
  * Implementation of hook_form_alter().
+ * This adds the node template options to the node/edit and node/add pages
  */
 function custom_node_template_form_alter(&$form, $form_state, $form_id) {
-  drupal_add_css(drupal_get_path('module', 'custom_node_template') .'/custom_node_template.css');
   if ($form['#node']->type .'_node_form' == $form_id) {
+    drupal_add_css(drupal_get_path('module', 'custom_node_template') .'/custom_node_template.css');
     $form['nodetemplate'] = array(
       '#type' => 'fieldset',
       '#title' => t('Node template settings'),
       '#collapsible' => TRUE,
-      '#collapsed' => TRUE,
+      '#collapsed' => FALSE,
       '#access' => user_access('administer custom node templates'),
-      '#group' => t('Node template settings') 
+      '#group' => t('Custom template settings') 
     );
     $form['#pre_render'][] = 'vertical_tabs_form_pre_render';
     $nodetemplate = $form['#node']->nodetemplate;
@@ -114,7 +118,8 @@ function custom_node_template_form_alter(&$form, $form_state, $form_id) {
       '#title' => t('Node template'),
       '#description' => t('Select the node template to be used for displaying this node.  If "default" is selected, then your node will be displayed per existing rules (node template suggestions) for your theme.  All applicable node templates (node-XXX.tpl.php files) are listed here.  Your main node.tpl.php file is listed as "Main Node Template". See Online Help (/admin/help) for more information on this setting.'),
       '#default_value' => $nodetemplate,
-      '#options' => _custom_node_templates(),
+      // This is where the options are defined
+      '#options' => _custom_node_templates($form),
       '#access' => user_access('administer custom node templates')
     );
     $form['nodetemplate']['#item'] = $nodetemplate;
@@ -123,16 +128,17 @@ function custom_node_template_form_alter(&$form, $form_state, $form_id) {
 
 /**
  * Implementation of hook_form_FORM_ID_alter().
+ * Sets the default node template per content type
  */
 function custom_node_template_form_node_type_form_alter(&$form, &$from_state) {
+  if (isset($form['identity']['type'])) {
   drupal_add_css(drupal_get_path('module', 'custom_node_template') .'/custom_node_template.css');
 
-  if (isset($form['identity']['type'])) {
     $form['nodetemplate'] = array(
       '#type' => 'fieldset',
       '#title' => t('Node template settings'),
       '#collapsible' => TRUE,
-      '#collapsed' => TRUE,
+      '#collapsed' => FALSE,
       '#group' => t('Node template settings')
     );
     $form['#pre_render'][] = 'vertical_tabs_form_pre_render';
@@ -143,7 +149,8 @@ function custom_node_template_form_node_type_form_alter(&$form, &$from_state) {
       '#title' => t('Node template'),
       '#description' => t('Select the default node template to be used when adding NEW nodes of this content type.  Changing this setting will not change the display of nodes you created previously.  If "default" is selected, then your node will be displayed per existing rules (node template suggestions) for your theme.  All applicable node templates (node-XXX.tpl.php files) are listed here.  Your main node.tpl.php file is listed as "Main Node Template". See Online Help (/admin/help) for more information on this setting.'),
       '#default_value' => $nodetemplate,
-      '#options' => _custom_node_templates()
+      // Options are set here
+      '#options' => _custom_node_templates($form)
     );
     $form['nodetemplate']['#item'] = $nodetemplate;
   }
@@ -151,36 +158,66 @@ function custom_node_template_form_node_type_form_alter(&$form, &$from_state) {
 
 /**
 * Implementation of hook_content_extra_fields().
+* Creates a custom field on the content-type page.
 */
 function custom_node_template_content_extra_fields($type_name) {
     $extra['custom_node_template'] = array(
       'label' => t('Node template settings'),
-      'description' => t('Custom note template settings fieldset.'),
+      'description' => t('Custom node template settings fieldset.'),
       'weight' => 3,
     );
 	return $extra;
 }
 
-
-function _custom_node_templates() {
+/*
+ *   Finds and lists available templates
+ *   Used in content-type creation, node creation and node edit
+ */
+function _custom_node_templates($form) {
 
   $theme = variable_get('theme_default', 'garland');
   $theme_path = drupal_get_path('theme', $theme) .'/';
-    $options = array('default' => '<img class="custom_node_template" src="'.base_path() .drupal_get_path('module', 'custom_node_template').'/images/default.png" title="'.$displayname.'" /> '.t('default'));
+  $options = array('default' => '<img class="custom_node_template" src="'.base_path() .drupal_get_path('module', 'custom_node_template').'/images/default.png" title="'.$displayname.'" /> '.t('default'));
 
   $handler = opendir($theme_path);
+  // Search for content type name in node template files
+  $dirarray = scandir($theme_path);
+  foreach($dirarray as $key => $filename) {
+	$temp = str_replace(array("node-",".tpl.php"), "", $filename);
+	$dirarray[$key] = str_replace(array(" ", "_","-"), "_", $temp);
+  }
+	// Check to see whether files with content type exist
+	// This is included so we don't break old implementations
+	$findtype = array_search($form['#node_type']->type, $dirarray);
   while ($file = readdir($handler)) {
-    if ($file != '.' && $file != '..' && substr($file, 0, 4) == 'node' && substr($file, -8, 8) == '.tpl.php' && substr($file, -13, 5) != '-edit') {
-        $name = drupal_substr($file, 0, -8);
-        $displayname = substr_replace($name, '', 0, 5);
-        $displayname = str_replace('-', ' ', $displayname);
-        $displayname = str_replace('_', ' ', $displayname);
-        if (empty($displayname)) { $displayname = t('Main Node Template');}
-        $options[$name] = $displayname;
-        if (file_exists(drupal_get_path('module', 'custom_node_template')."/images/$name.png")) { $options[$name] = '<img class="custom_node_template" src="'.base_path() .drupal_get_path('module', 'custom_node_template').'/images/'.$name.'.png" title="'.$displayname.'" /> '.$displayname; }
-        if (file_exists("$theme_path/$name.png")) { $options[$name] = '<img class="custom_node_template" src="'.base_path() .$theme_path.'/'.$name.'.png" title="'.$displayname.'" /> '.$displayname; }
-
-    }
+  	if($findtype !== false) {
+	  	$tempname = str_replace(array("_","-"), " ", substr($file, 5, -8));
+		$type = str_replace(array("_","-"), " ", $form['#node_type']->type);
+
+	    if ($file != '.' && $file != '..' && substr($file, 0, 4) == 'node' && substr($file, -8, 8) == '.tpl.php' && substr($file, -13, 5) != '-edit' && strpos($tempname, $type) !== false) {
+	        $name = drupal_substr($file, 0, -8);
+	        $displayname = substr_replace($name, '', 0, 5);
+	        $displayname = str_replace('-', ' ', $displayname);
+	        $displayname = str_replace('_', ' ', $displayname);
+	        if (empty($displayname)) { $displayname = t('Main Node Template');}
+	        $options[$name] = $displayname;
+	        if (file_exists(drupal_get_path('module', 'custom_node_template')."/images/$name.png")) { $options[$name] = '<img class="custom_node_template" src="'.base_path() .drupal_get_path('module', 'custom_node_template').'/images/'.$name.'.png" title="'.$displayname.'" /> '.$displayname; }
+	        if (file_exists("$theme_path/$name.png")) { $options[$name] = '<img class="custom_node_template" src="'.base_path() .$theme_path.'/'.$name.'.png" title="'.$displayname.'" /> '.$displayname; }
+	
+	    }
+    } else {
+	    if ($file != '.' && $file != '..' && substr($file, 0, 4) == 'node' && substr($file, -8, 8) == '.tpl.php' && substr($file, -13, 5) != '-edit') {
+	        $name = drupal_substr($file, 0, -8);
+	        $displayname = substr_replace($name, '', 0, 5);
+	        $displayname = str_replace('-', ' ', $displayname);
+	        $displayname = str_replace('_', ' ', $displayname);
+	        if (empty($displayname)) { $displayname = t('Main Node Template');}
+	        $options[$name] = $displayname;
+	        if (file_exists(drupal_get_path('module', 'custom_node_template')."/images/$name.png")) { $options[$name] = '<img class="custom_node_template" src="'.base_path() .drupal_get_path('module', 'custom_node_template').'/images/'.$name.'.png" title="'.$displayname.'" /> '.$displayname; }
+	        if (file_exists("$theme_path/$name.png")) { $options[$name] = '<img class="custom_node_template" src="'.base_path() .$theme_path.'/'.$name.'.png" title="'.$displayname.'" /> '.$displayname; }
+	
+	    }
+     }
   }
   closedir($handler);
 
-- 
1.7.4.1

