Let me rephrase this with a working bit of code:
PHP Code:
<?php
// add_thread.php
// This is a concept file in /includes/cron/
// ######################## SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
if (!is_object($vbulletin->db))
{
exit;
}
// ########################################################################
// ######################### START MAIN SCRIPT ############################
// ########################################################################
$db = $vbulletin->db; // global.php expects $db as oppose to $vbulletin->db [work-around]
require_once('././global.php');
require_once('././includes/class_dm.php');
require_once('././includes/class_dm_threadpost.php');
require_once('././includes/functions_databuild.php');
$threaddm =& datamanager_init('Thread_FirstPost', $vbulletin, ERRTYPE_ARRAY, 'threadpost');
$forumid = 2; // Main Forum as per VB default
$postusername = 'John Smith';
$postuserid = 0; // Enter as Guest
$userid = 0; // Enter as Guest
$pagetext = 'My name is John Smith and this is a test thread!';
$title = 'Test Thread by John Smith';
$allowsmilie = '1';
$visible = '1';
$open = 0;
$foruminfo = fetch_foruminfo($forumid);
$threadinfo = array();
$foruminfo = verify_id('forum', $forumid, 0, 1);
$threaddm->set('forumid', $forumid);
$threaddm->set('postuserid', $postuserid);
$threaddm->set('username', $postusername);
$threaddm->set('postusername', $postusername);
$threaddm->set('pagetext', $pagetext);
$threaddm->set('title', $title);
$threaddm->set('allowsmilie', $allowsmilie);
$threaddm->set('visible', $visible);
$threaddm->set_info('forum', $foruminfo);
$threaddm->set_info('thread', $threadinfo);
$threaddm->pre_save();
//print_r($threaddm->errors);
$topic_id = $threaddm->save();
build_forum_counters($forumid);
// Now go to Scheduled Tasks -> Add this file and run it.
// This results in:
/*
Fatal error: Field postuserid is not defined in $validfields in class vb_datamanager_thread_firstpost in /var/www/mydomain.com/public/forums/includes/class_dm.php on line 485
*/
// Now go to Plugin System -> Add New Plugin
// Hook Location threadfpdata_start
// Plugin PHP Code:
// $this->validfields['postuserid'] = array(TYPE_INT, REQ_YES);
// Run Scheduled Task again, this results in:
/*
Fatal error: Field postusername is not defined in $validfields in class vb_datamanager_thread_firstpost in /var/www/mydomain.com/public/forums/includes/class_dm.php on line 485
*/
// Now go to Plugin System -> Edit the Plugin we just create above
// Hook Location threadfpdata_start
// Add Plugin PHP Code:
// $this->validfields['postusername'] = array(TYPE_STR, REQ_YES);
// So the entire Plugin now looks like
// $this->validfields['postuserid'] = array(TYPE_INT, REQ_YES);
// $this->validfields['postusername'] = array(TYPE_STR, REQ_YES);
// Run Scheduled Task again, this results successfully adding the thread.
// BUT... Now go the the forum front-end and try and post a new thread...
// This reults in error:
/*
Fatal error: Unable to proceed with save while $errors array is not empty in class vb_datamanager_thread_firstpost in /var/www/mydomain.com/public/forums/includes/class_dm.php on line 758
*/
// Comment out or de-activate the Plugin above and the front-end works again but the Scheduled Task chokes again.
?>
FYI (if any) I fixed it.
Rather than building using a hook, which obivously clashes with standard code, I built the validfield definitions straigt into the code, just prior to executing $threaddm->save():
$threaddm->validfields['postusername'] = array(TYPE_STR, REQ_YES);
$threaddm->validfields['postuserid'] = array(TYPE_INT, REQ_YES);
[case closed]