============================================ Content type dojo ============================================ The initial dojo node content type which, as of CCK 5.x-1.2, can be imported via administer > content types > import (./admin/content/types/import). ============================================ $content[type] = array ( 'name' => 'Dojo', 'type' => 'dojo', 'description' => 'dojo', 'title_label' => 'Title', 'body_label' => 'Body', 'min_word_count' => '0', 'help' => '', 'node_options' => array ( 'status' => true, 'promote' => true, 'sticky' => false, 'revision' => false, ), 'comment' => '2', 'upload' => 1, 'old_type' => 'dojo', 'orig_type' => '', 'module' => 'node', 'custom' => '1', 'modified' => '1', 'locked' => '0', ); $content[fields] = array ( 0 => array ( 'widget_type' => 'options_select', 'label' => 'Belt Color', 'weight' => '0', 'description' => '', 'group' => false, 'required' => '0', 'multiple' => '0', 'text_processing' => '0', 'max_length' => '', 'allowed_values' => 'white yellow orange green brown black', 'allowed_values_php' => '', 'field_name' => 'field_belt_color', 'field_type' => 'text', 'module' => 'text, optionwidgets', ), ); ============================================ Views ============================================ dojoclass v.1: The initial import code for the "Dojo" view. ============================================ Can be imported via administer > views > import (./admin/build/views/import). $view = new stdClass(); $view->name = 'dojo'; $view->description = 'Dojo example view'; $view->access = array ( ); $view->view_args_php = ''; $view->page = TRUE; $view->page_title = 'Dojo Class'; $view->page_header = ''; $view->page_header_format = '1'; $view->page_footer = ''; $view->page_footer_format = '1'; $view->page_empty = ''; $view->page_empty_format = '1'; $view->page_type = 'table'; $view->url = 'dojoclass'; $view->use_pager = TRUE; $view->nodes_per_page = '25'; $view->sort = array ( ); $view->argument = array ( ); $view->field = array ( array ( 'tablename' => 'node', 'field' => 'title', 'label' => 'Name', 'handler' => 'views_handler_field_nodelink', 'sortable' => '1', 'defaultsort' => 'ASC', 'options' => 'link', ), array ( 'tablename' => 'node', 'field' => 'created', 'label' => 'Joined', 'handler' => 'views_handler_field_date_small', 'sortable' => '1', ), array ( 'tablename' => 'node_data_field_belt_color', 'field' => 'field_belt_color_value', 'label' => 'Belt Level', 'sortable' => '1', 'options' => 'plain', ), array ( 'tablename' => 'node', 'field' => 'edit', 'label' => '', ), ); $view->filter = array ( array ( 'tablename' => 'node', 'field' => 'status', 'operator' => '=', 'options' => '', 'value' => '1', ), array ( 'tablename' => 'node', 'field' => 'type', 'operator' => 'OR', 'options' => '', 'value' => array ( 0 => 'dojo', ), ), array ( 'tablename' => 'node_data_field_belt_color', 'field' => 'field_belt_color_value_default', 'operator' => 'OR', 'options' => '', 'value' => array ( ), ), ); $view->exposed_filter = array ( array ( 'tablename' => 'node_data_field_belt_color', 'field' => 'field_belt_color_value_default', 'label' => '', 'optional' => '1', 'is_default' => '0', 'operator' => '1', 'single' => '1', ), ); $view->requires = array(node, node_data_field_belt_color); $views[$view->name] = $view; =========================================== =========================================== dojoclass v.2: The second version of the exported "Dojo" view. =========================================== $view = new stdClass(); $view->name = 'dojo'; $view->description = 'Dojo example view'; $view->access = array ( ); $view->view_args_php = ''; $view->page = TRUE; $view->page_title = 'Dojo Class'; $view->page_header = ''; $view->page_header_format = '1'; $view->page_footer = ''; $view->page_footer_format = '1'; $view->page_empty = 'Sorry, no results found.'; $view->page_empty_format = '1'; $view->page_type = 'table'; $view->url = 'dojoclass'; $view->use_pager = TRUE; $view->nodes_per_page = '25'; $view->sort = array ( ); $view->argument = array ( array ( 'type' => 'taxletter', 'argdefault' => '2', 'title' => '', 'options' => '', 'wildcard' => '', 'wildcard_substitution' => '', ), ); $view->field = array ( array ( 'tablename' => 'node', 'field' => 'title', 'label' => 'Name', 'handler' => 'views_handler_field_nodelink', 'sortable' => '1', 'defaultsort' => 'ASC', 'options' => 'link', ), array ( 'tablename' => 'node', 'field' => 'created', 'label' => 'Joined', 'handler' => 'views_handler_field_date_small', 'sortable' => '1', ), array ( 'tablename' => 'node_data_field_belt_color', 'field' => 'field_belt_color_value', 'label' => 'Belt Level', 'sortable' => '1', 'options' => 'plain', ), array ( 'tablename' => 'node_data_field_battles_won', 'field' => 'field_battles_won_value', 'label' => 'Wins', 'options' => 'default', ), array ( 'tablename' => 'node_data_field_battles_lost', 'field' => 'field_battles_lost_value', 'label' => 'Losses', 'options' => 'default', ), array ( 'tablename' => 'node', 'field' => 'edit', 'label' => '', ), array ( 'tablename' => 'term_node_1', 'field' => 'name', 'label' => '', 'options' => 'link', ), ); $view->filter = array ( array ( 'tablename' => 'node', 'field' => 'status', 'operator' => '=', 'options' => '', 'value' => '1', ), array ( 'tablename' => 'node', 'field' => 'type', 'operator' => 'OR', 'options' => '', 'value' => array ( 0 => 'dojo', ), ), array ( 'tablename' => 'node_data_field_belt_color', 'field' => 'field_belt_color_value_default', 'operator' => 'OR', 'options' => '', 'value' => array ( ), ), ); $view->exposed_filter = array ( array ( 'tablename' => 'node_data_field_belt_color', 'field' => 'field_belt_color_value_default', 'label' => 'Belt Level', 'optional' => '1', 'is_default' => '0', 'operator' => '1', 'single' => '1', ), ); $view->requires = array(node, node_data_field_belt_color, node_data_field_battles_won, node_data_field_battles_lost, term_node_1); $views[$view->name] = $view; =========================================== ============================================= ./current theme directory/node-battle.tpl.php v.1 ============================================= type); ?>

theme('username', $node), '!date' => format_date($node->created))); ?>
field_contestant_1[0]['nid']); $contestant2 = node_load($node->field_contestant_2[0]['nid']); echo $node->content['body']['#value']; echo '

'.$contestant1->title.'

'; echo '

Won: '.$contestant1->field_battles_won[0]['value'].' Lost: '.$contestant1->field_battles_lost[0]['value'].'

'; echo '

'.$contestant2->title.'

'; echo '

Won: '.$contestant2->field_battles_won[0]['value'].' Lost: '.$contestant2->field_battles_lost[0]['value'].'

'; ?>
============================================= ============================================= CCK export of Dojo Battle content type ============================================= $content[type] = array ( 'name' => 'Dojo Battle', 'type' => 'battle', 'description' => 'Where we battle!', 'title_label' => 'Title', 'body_label' => 'Body', 'min_word_count' => '0', 'help' => '', 'node_options' => array ( 'status' => true, 'promote' => false, 'sticky' => false, 'revision' => false, ), 'comment' => '2', 'upload' => '1', 'old_type' => 'battle', 'orig_type' => '', 'module' => 'node', 'custom' => '1', 'modified' => '1', 'locked' => '0', ); $content[fields] = array ( 0 => array ( 'widget_type' => 'nodereference_select', 'label' => 'Contestant #1', 'weight' => '0', 'description' => '', 'group' => false, 'required' => '1', 'multiple' => '0', 'referenceable_types' => array ( 'dojo' => true, 0 => 1, 'battle' => false, 'project_issue' => false, 'page' => false, 'story' => false, 'project_project' => false, 'project_release' => false, ), 'advanced_view' => '--', 'field_name' => 'field_contestant_1', 'field_type' => 'nodereference', 'module' => 'nodereference', ), 1 => array ( 'widget_type' => 'nodereference_select', 'label' => 'Contestant #2', 'weight' => '0', 'description' => '', 'group' => false, 'required' => '1', 'multiple' => '0', 'referenceable_types' => array ( 'dojo' => true, 0 => 1, 'battle' => false, 'project_issue' => false, 'page' => false, 'story' => false, 'project_project' => false, 'project_release' => false, ), 'advanced_view' => '--', 'field_name' => 'field_contestant_2', 'field_type' => 'nodereference', 'module' => 'nodereference', ), ); ============================================= ============================================= ./current theme directory/node-battle.tpl.php v.2 ============================================= type); ?>

theme('username', $node), '!date' => format_date($node->created))); ?>
field_contestant_1[0]['nid']); $contestant2 = node_load($node->field_contestant_2[0]['nid']); echo $node->content['body']['#value']; echo '

'.$contestant1->title.'

'; echo '

Won: '.$contestant1->field_battles_won[0]['value'].' Lost: '.$contestant1->field_battles_lost[0]['value'].'

'; echo '

'.$contestant2->title.'

'; echo '

Won: '.$contestant2->field_battles_won[0]['value'].' Lost: '.$contestant2->field_battles_lost[0]['value'].'

'; ?>
taxonomy as $tid => $term) { // replace the hard-coded 7 with the vid of vocab Battle Type if ($term->vid == 7) { $battle_type = ''.$term->name.''; } else { $taxonomy_links[] = l($term->name, 'taxonomy/'.$tid); } } $taxonomy_links = implode(' | ', $taxonomy_links); } echo '
'.$battle_type.'
'; echo '
'.$taxonomy_links.'
'; ?>
============================================= ============================================= dojo.module (v.1 for this lesson) ============================================= type == 'dojo') { drupal_set_message('DOJO NODE SUBMITTED!'); } break; case 'search result': if ($node->uid == 1) { // use the uid of your puppy-hater here $output = 'THIS USER HATES PUPPIES!'; return $output; } break; case 'validate': // what we want is for this to check the perms if the revision bit is not set. if ($node->revision != 1 && user_access('post dojo without revision') == FALSE) { form_set_error('revision', t('Hey man, you have to make a revision')); } break; case 'update index': If($node->type == 'dojo') { return 'dojotastic'; } break; case 'view': If($node->type == 'dojo') { $node->content['body']['#value'] .= '

This was added in nodeapi for dojo nodes onle!

'; } break; } } /** * Imlementation of hook_form_alter * * This will add a validation callback and turn an input format into * radio buttons. */ function dojo_form_alter($form_id, &$form) { if ($form_id == 'dojo_node_form') { // print_r($form); $form['#theme'] = 'dojo'; $form['#validate']['dojo_validate'] = array(); // $form['field_belt_color']['key']['#type'] = 'radios'; $tree = taxonomy_get_tree(1); // print_r($tree); $belts = array(); foreach($tree as $term) { // $belts[$term->tid] = $term->name; } // $form['field_belt_color']['key']['#options'] = $belts; unset($form['options']['revision']); $form['revision'] = array( '#type' => 'checkbox', '#title' => 'Create new revision', '#default_value' => 1, '#prefix' => '
', '#suffix' => '
', '#weight' => -100, ); } if ($form_id == 'search_form') { // restrict search terms w/custom validation callback $form['#validate']['dojo_search_validate'] = array(); } if ($form_id == 'battle_node_form') { // substitute vid for Battle Type on your system // on Josh's it was 2 unset($form['taxonomy'][7]['#options'][0]); $form['taxonomy'][7]['#required'] = TRUE; } } function theme_dojo($form) { // print_r($form); $output .= drupal_render($form); return $output; } function dojo_validate($form_id, $form_values, $form) { if($form_values['title'] == 'Foo') { form_set_error('title', t('Foo is not allowed!')); } } function dojo_search_validate($form_id, $form_values, $form) { // if the user doesn't have access, stop them from searching for the dojo if(user_access('post dojo without revision') == FALSE && strstr($form_values['keys'], 'dojo')) { form_set_error('keys', t('Yoy cannot search for the Dojo!')); } } /** * I'm writing this funtion because I need to understand db_rewrite_sql */ function dojo_query() { $sql = 'SELECT * from {node} WHERE nid = %d'; $sql = db_rewrite_sql($sql); print_r($sql); $result = db_query($sql, 2); $node = db_fetch_object($result); print_r($node); } ============================================= ============================================= dojo.module (v.2 for this lesson) ============================================= 'admin/settings/dojo', 'title' => t('Dojo Settings'), 'description' => t('Staring a granular taxonomy requirement system'), 'callback' => 'drupal_get_form', 'callback arguments' => array('dojo_settings'), 'access' => user_access('administer site configuration'), 'type' => MENU_NORMAL_ITEM, // optional ); return $items; } function dojo_settings() { $types = node_get_types(); // print_r($types); $vocabs = taxonomy_get_vocabularies(); // print_r($vocabs); $header = array(t('Vocabulary')); foreach($vocabs as $vid => $vocab) { // make a row $row = array(); $row[] = $vocab->name; foreach($types as $type => $data) { $row[] = '[x]'; $header[] = $type; } $rows[] = $row; } $form = array(); $form['table'] = array( '#type' => 'markup', '#value' => theme('table', $header, $rows), ); return $form; } function dojo_perm() { return array('post dojo without revision'); } /** * Implementation of hook_nodeapi * * For dojo lesson and great justice! */ function dojo_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { switch ($op) { case 'submit': If($node->type == 'dojo') { drupal_set_message('DOJO NODE SUBMITTED!'); } break; case 'search result': if ($node->uid == 1) { // use the uid of your puppy-hater here $output = 'THIS USER HATES PUPPIES!'; return $output; } break; case 'validate': // what we want is for this to check the perms if the revision bit is not set. if ($node->revision != 1 && user_access('post dojo without revision') == FALSE) { form_set_error('revision', t('Hey man, you have to make a revision')); } break; case 'update index': If($node->type == 'dojo') { return 'dojotastic'; } break; case 'view': If($node->type == 'dojo') { $node->content['body']['#value'] .= '

This was added in nodeapi for dojo nodes onle!

'; } break; } } /** * Imlementation of hook_form_alter * * This will add a validation callback and turn an input format into * radio buttons. */ function dojo_form_alter($form_id, &$form) { if ($form_id == 'dojo_node_form') { // print_r($form); $form['#theme'] = 'dojo'; $form['#validate']['dojo_validate'] = array(); // $form['field_belt_color']['key']['#type'] = 'radios'; $tree = taxonomy_get_tree(1); // print_r($tree); $belts = array(); foreach($tree as $term) { // $belts[$term->tid] = $term->name; } // $form['field_belt_color']['key']['#options'] = $belts; unset($form['options']['revision']); $form['revision'] = array( '#type' => 'checkbox', '#title' => 'Create new revision', '#default_value' => 1, '#prefix' => '
', '#suffix' => '
', '#weight' => -100, ); } if ($form_id == 'search_form') { // restrict search terms w/custom validation callback $form['#validate']['dojo_search_validate'] = array(); } if ($form_id == 'battle_node_form') { // substitute vid of vocabulary Battle Type on your system // on Josh's system it was 2 unset($form['taxonomy'][7]['#options'][0]); $form['taxonomy'][7]['#required'] = TRUE; } } function theme_dojo($form) { // print_r($form); $output .= drupal_render($form); return $output; } function dojo_validate($form_id, $form_values, $form) { if($form_values['title'] == 'Foo') { form_set_error('title', t('Foo is not allowed!')); } } function dojo_search_validate($form_id, $form_values, $form) { // if the user doesn't have access, stop them from searching for the dojo if(user_access('post dojo without revision') == FALSE && strstr($form_values['keys'], 'dojo')) { form_set_error('keys', t('Yoy cannot search for the Dojo!')); } } /** * I'm writing this funtion because I need to understand db_rewrite_sql */ function dojo_query() { $sql = 'SELECT * from {node} WHERE nid = %d'; $sql = db_rewrite_sql($sql); print_r($sql); $result = db_query($sql, 2); $node = db_fetch_object($result); print_r($node); } ============================================= fin =============================================