Drupal 7 开发内部培训资料, 分头诗人

json 采集的数据如何通过自定义模块添加到节点?

赞成!
1
否决!

刚接触猪跑不久,现在在写第一个模块,主要目的是从JSON文件里获得图片/文字组合,然后将这些组合显示在一个管理员界面,管理员点击"Create node"来发布这个组合并生成节点。
我已经用了hook_menu和他的callback function做了这个管理员界面,下一步是"Create node"的功能....现在的问题,
1. 这个添加按钮我用了onclick,结果就是我只能在js里面写node_save的function,但是我觉得这个function应该在module文件里面才对...
2. 怎么判断哪个添加按钮对应的是哪个图文组合?
在此先谢过各位大侠....
管理员界面截图:

模块代码.
.info文件: 

; $Id$
name = test
description = test module for adding nodes based on a JSON file
core = 6.x

.module文件

<?php 
/**
 * Implementation of hook_menu.
 */
function test_menu() {
  $items = array();

  $items['addnode'] = array(
    'title' => 'Addnode page',
    'page callback' => 'test_page',
    'access callback' => 'user_access',
    'access argument' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * node_save function
 */
function test_page_addnodes(){
    // Construct the new node object.
$node = new stdClass();
$node->title = "Your node title";
$node->body = "The body text of your node.";
$node->type = 'test'; // 自定义类型test
$node->field_cck1[0]['value'] = 'value'; // 自定义cck字段
$node->field_cck2[0]['value'] = 'value'; // 自定义cck字段
$node->field_cck3[0]['value'] = 'value'; // 自定义cck字段
$node->created = time();
$node->changed = $node->created;
$node->status = 1;          // Published?
$node->promote = 1;       // Display on front page?
$node->sticky = 0;          // Display top of page?
$node->format = 1;         // Filtered HTML?
$node->uid = 1;             //  Content owner uid (author)?
$node->language = 'en';
node_save ($node);
}

function test_page() {
    $json = file_get_contents("http://localhost:8888/drupal6/cache.json"); //本地json文件
    $data = json_decode($json, TRUE);
//$i = 0; // 限制foreach的输出为一个,方便测试
    foreach ($data as $item){
	test_page_addnodes();
    $output .='<div id=node><img src='.$item['src'].'><p>'.$item['title'].'</p><p>'.$item['user'].'</p><button id="btn" onclick="create_node()">Create Node</button></div>';
//    if (++$i == 1) break; // testing one node only
	}
    return $output;
}

/**
 * Implements hook_init(). 
 */
function test_init() {
	drupal_add_css(drupal_get_path('module', 'test') .'/test.css');
	drupal_add_js(drupal_get_path('module', 'test') .'/test.js');  
}


 

7 个回答

赞成!
0
否决!

你的想法没错,是要在module实现,你的hook menu需要增加一个,

<?php 
/**
 * Implementation of hook_menu.
 */
function test_menu() {
  $items = array();
 
  $items['addnode'] = array(
    'title' => 'Addnode page',
    'page callback' => 'test_page',
    'access callback' => 'user_access',
    'access argument' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  $items['addnode/%record'] = array( // %record 会自动读取record_load()
    'title' => 'Addnode page',
    'page callback' => 'test_page_addnodes',
    'page argument' => array(1), // array(1)表示获得地址的第二个参数,也就是addnode/%record中的%record,如果地址是 www.yourdomain.com/addnode/66 ,那么array(1)就是66
    'access callback' => 'user_access',
    'access argument' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function record_load($jid){
	//这里读取当前要入库的记录
$record =new stdClass();
$record -> title = "drupalla";
$record -> body = "body";
....
return $record;
}
 
/**
 * node_save function
 */
function test_page_addnodes($record){
    // Construct the new node object.
		// 这里会自动把record_load()接收过来的数据赋值给 $record,这意味着 $record 的内容就是record_load()的内容
		
$node = new stdClass();
$node->title = $record->title;
$node->body = $record->body;
$node->type = $record->type; // 自定义类型test
$node->field_cck1[0]['value'] = $record->field_cck1['value']; // 自定义<a href="/project/cck" class="alinks-link" title="模块介绍:主要用于为站点树立一个新的特定用处的内容类型的模块组。能够很便利的通过web页面来创立设定你想要使用的内容类型,及其浮现的方法。">cck</a>字段

$node->created = time();
$node->changed = time();
$node->status = 1;          // Published?
$node->promote = 1;       // Display on <a href="/project/front" class="alinks-link" title="模块介绍:用于方便的定制站点首页,可以完全脱离站点外观主题的限制生成个性化的首页。可以显示不同的首页给不同权限的用户,并可插入PHP代码完成更强大的动态显示。">front page</a>?
$node->sticky = 0;          // Display top of page?
$node->format = 1;         // Filtered HTML?
$node->uid = 1;             //  Content owner uid (author)?
$node->language = 'en';
node_save ($node);
}

然后把所有按钮的地址改为  'addnode/' . $jid

赞成!
0
否决!

刚才忘记点回复了....-_-

赞成!
0
否决!

谢谢诗人,两个问题基本都解决了哈哈哈。但是不知道为什么record_load($jid)里返回的$record数据貌似没有传到 test_page_addnodes($record)里面..Drupal也提示第一个argument不存在...

function record_load($jid){
    //这里读取当前要入库的记录
$json = file_get_contents("http://localhost:8888/cache.json");
$data = json_decode($json, TRUE);
$record = new stdClass();
$record->title = $data[$jid]['title'];
$record->body = $data[$jid]['user'];
$record->type = 'test';
$record->field_cck1[0]['value'] = $data[$jid]['src']; 
$record->field_cck2[0]['value'] = $data[$jid]['title']; 
$record->field_cck3[0]['value'] = "15.23"; 
return $record; 
}

function test_page_addnodes($record){
    echo '<pre>';
    print_r($record);
    echo '</pre>';
}

这样print_r出来的是空白....诗人能否能再帮忙看看?谢啦

赞成!
0
否决!

你在record_load 里面 增加 print_r($jid); 看看jid是否为空。

赞成!
0
否决!

试过了,是有值的,而且我也在record_load里面试了

    
    print $record->title;
    echo '<pre>';
    print_r($record);
    echo '</pre>';

这些都能拿到我要的数据,但是一出这个function就没用了....

赞成!
0
否决!

我勒个去查了半天发现是hook_menu里的access arguments,我一直写的是access argument....最后少加了一个s....
一会儿弄完整理下我发一个能用的上来..谢谢诗人帮助!

赞成!
0
否决!
<?php 
/**
 * Implementation of hook_menu.
 */
function test_menu() {
  $items = array();
  $items['addnode'] = array(
    'title' => 'Addnode page',
    'page callback' => 'test_page',
    'access callback' => 'user_access',
    'access arguments' => array('admin content'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['addnode/%record'] = array( // %record 会自动读取record_load()
    'title' => 'Addnode page',
    'page callback' => 'test_page_addnodes',
    'page arguments' => array(1), // array(1)表示获得地址的第二个参数,也就是addnode/%record中的%record,如果地址是 www.yourdomain.com/addnode/66 ,那么array(1)就是66
    'access callback' => 'user_access',
    'access arguments' => array('admin content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function record_load($jid){
    //这里读取当前要入库的记录
$json = file_get_contents("http://localhost:8888/drupal6/cache.json");
$data = json_decode($json, TRUE);
$record = new stdClass();
$record->user = $data[$jid]['user'];
$record->title = $data[$jid]['title'];
$record->type = 'test';
$record->field_cck1[0]['value'] = $data[$jid]['src']; 
$record->field_cck2[0]['value'] = $data[$jid]['title']; 
    if ($record === FALSE){
        return FALSE;
    }
    return $record;
}

function test_page_addnodes($record){
    // Construct the new node object.
$node = new stdClass();
$node->title = $record->user; 
$node->body = $record->title;
$node->type = 'test';
$node->field_cck1[0]['value'] = $record->field_cck1[0]['value']; 
$node->field_cck2[0]['value'] = $record->field_cck2[0]['value']; 
$node->created = time();
$node->changed = $node->created;
$node->status = 1;          // Published?
$node->promote = 1;       // Display on front page?
$node->sticky = 0;          // Display top of page?
$node->format = 1;         // Filtered HTML?
$node->uid = 1;             //  Content owner uid (author)?
$node->language = 'en';
node_save($node);
if (!empty($node)){ // 提示管理员存储成功,或者返回错误...然后重定向回到addnode页面
    drupal_set_message(t('Feed by user @user was saved.', array('@user' => $node->title))); 
}else {
    drupal_set_message(t('Failed to save @user.', array('@user' => $node->title)), 'error');
}
drupal_goto('/addnode');
}

function test_page() {
    $json = file_get_contents("http://localhost:8888/drupal6/cache.json");
    $data = json_decode($json, TRUE);
    $jid = 0;
    foreach ($data as $item){
    $output .='<div id=node><img src='.$item['src'].'><p>'.$item['title'].'</p><p>'.$item['user'].'</p><input type=\'button\' name=\'button\' value=\'Create Node\' onClick="window.location.href=\'addnode/'.$jid.'\'; submitbtn();"></div>';
	$jid = $jid +1; // used to fill in the hook_menu function wildcard value
    }
    return $output;
}

/**
 * Implements hook_init().
 */
function test_init() {
	drupal_add_css(drupal_get_path('module', 'test') .'/test.css');
	drupal_add_js(drupal_get_path('module', 'test') .'/test.js');  
}

 

从json取值然后添加为node已经可以实现了哈哈哈,
下一步我要想想怎么把已经添加过的feed里的按钮灰掉,避免管理员重复添加...