'field_color',
// Fill these ...
'' => '',
'' => '',
'' => '',
);
// SECOND: CCK content_taxonomy fields that are configured to have MULTIPLE VALUES
$vid_to_field_multivalue = array(
// Example: you have a Vocabulary "Country" with vid = 2, and want to import that into fieldname field_country
// '2' => 'field_country',
// Fill these ...
'' => '',
'' => '',
'' => '',
);
/***********************************
** END OF EDIT ME
** you (hopefully) don't need to change anything below this line.
***********************************
*/
if (intval($_GET["commit"]) != 1) {
echo "
";
echo "Caution: This might take a while!";
exit;
}
header("Content-Type: text/plain");
header("Content-Disposition: attachment; filename=fix.sql");
$connection = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Couldn't connect!");
mysql_select_db($mysql_database) or die("Couldn't do mysql_select_db()");
/**
* Create SQL to import single-valued CCK fields
*/
$values_to_set = array();
$vids = array();
foreach ($vid_to_field_singlevalue as $vocabulary => $fieldname) {
// Get all terms assigned to nodes, ordered by node
$result = mysql_query("SELECT TN.nid, TN.tid FROM ".$db_prefix."term_node TN, ".$db_prefix."term_data TD where TN.tid = TD.tid AND TD.vid = $vocabulary $where ORDER BY TN.nid $limit") or die("Could not query: " . mysql_error());
$prev_nid = 0;
while( $data = mysql_fetch_object($result)) {
// If nid is different than last, get its current vid and store it in $vids[]
if ($data->nid != $prev_nid) {
$vids[$data->nid] = get_vid_from_nid($data->nid);
}
// Store the values to set for this nid
$values_to_set[$data->nid][] = "{$fieldname}_value=" . $data->tid;
$prev_nid = $data->nid;
}
}
ksort($values_to_set);
// Print all updates per node
foreach ($values_to_set as $nid => $values) {
if ($vids[$nid]) {
$string = implode(", ", $values); // e.g. "field_22_value = 22, field_21_value = 429, [...]"
$sql = sprintf("UPDATE ".$db_prefix."content_type_$content_type SET $string WHERE nid=%d AND vid=%d;", $nid, $vids[$nid]);
echo $sql ."\n";
}
}
echo "\n\n";
/**
* Create SQL to import multiple-valued CCK fields
*/
foreach ($vid_to_field_multivalue as $vocabulary => $fieldname) {
echo "## Multi value: vid=$vocabulary => fieldname=$fieldname\n";
// Get all terms assigned to nodes, ordered by node
$result = mysql_query("SELECT TN.nid, TN.tid FROM ".$db_prefix."term_node TN, ".$db_prefix."term_data TD where TN.tid = TD.tid AND TD.vid = $vocabulary $where ORDER BY TN.nid $limit");
$prev_nid = 0;
$tids = array();
while( $data = mysql_fetch_object($result)) {
// If nid is different than last, get its last vid
if ($data->nid != $prev_nid) {
foreach ($tids as $delta => $tid) {
$sql = sprintf("INSERT INTO ".$db_prefix."content_{$fieldname} (vid, delta, nid, {$fieldname}_value) VALUES (%d, %d, %d, %d)",
$vid, $delta, $prev_nid, $tid);
$sql .= " ON DUPLICATE KEY ";
$sql .= sprintf("UPDATE {$fieldname}_value = %d",$tid);
if ($vid) {
echo $sql .";\n";
}
}
$vid = get_vid_from_nid($data->nid);
$tids = array();
}
$tids[] = $data->tid;
$prev_nid = $data->nid;
}
foreach ($tids as $delta => $tid) {
$sql = sprintf("INSERT INTO ".$db_prefix."content_{$fieldname} (vid, delta, nid, {$fieldname}_value) VALUES (%d, %d, %d, %d)",
$vid, $delta, $prev_nid, $tid);
$sql .= " ON DUPLICATE KEY ";
$sql .= sprintf("UPDATE {$fieldname}_value = %d;",$tid);
echo $sql ."\n";
}
echo "\n\n";
}
// Local functions...
function get_vid_from_nid($nid) {
global $db_prefix;
static $vids = array();
if (isset($vids[$nid])) return $vids[$nid];
$result = mysql_query("SELECT vid FROM ". $db_prefix ."node WHERE nid=". $nid) or die("Could not get vid for nid = $nid");
if ($data = mysql_fetch_object($result)) {
$vids[$nid] = $data->vid;
return $data->vid;
}
else {$vids[$nid] = false;
return false;
}
}