Effiziente Stapelverarbeitung mit Drupal und CCK

In einem früheren Beitrag habe ich erklärt, warum wir den größten Teil der Bilder auf dieser Seite von PNG zu JPG und wie wir verwendet ImageMagick zu Charge zu konvertieren entschieden.

Was ich nicht in zu erhalten ist, wie wir Drupal, unser CMS, aktualisiert, um auf all diese neu konvertierte Dateien verweisen. Manuelles Hochladen und Aktualisieren fast 200 neue Bilder über ein Web-Formular ist zeitraubend und langweilig. Die Suche nach einer nicht arbeitsintensiv Lösung kann auch zeitaufwendig sein … aber so viel interessanter!

Sobald Sie wissen, wie, es ist nicht wirklich schwer.

Hier ein einfaches Beispiel:

<?php

error_reporting(E_ALL);
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$results = db_query('select nid from node where type="appliance"');
while ($result = db_fetch_object($results)) {
  $node = node_load($result->nid);

  # useful if you don't know $node like the back of your hand
  print "<pre>";
  print htmlspecialchars(print_r($node, TRUE), ENT_QUOTES);
  print "</pre>";

  # somewhat useless example edit
  $name = strtolower($node->field_name[0]['value']);
  $node->field_name[0]['value'] = $name;
  node_save($node);
}

?>

Speichern Sie diese als temporäre PHP-Skript in Ihrem Web-Root, in Ihrem Browser um die Position und walla! Sie müssen nur in Kleinbuchstaben den Wert des CCK Feld für alle Geräte-Knoten.

Für Ihre eigene Bearbeitungen, die Sie sollten natürlich ersetzen Sie den Wert übergeben db_query (). Sie können Ansichten zum Erstellen dieser SQL-Abfrage.

Nutzung Views als SQL Query Builder ist besonders hilfreich bei komplexeren Anfragen.

Aber warten Sie es gibt einen Haken!

Es stellt sich heraus CCK-Datei-Felder sind ein besonderer Fall und Sie können nicht bearbeitet werden mit einem einfachen node_save (). Das liegt daran, $ node enthält einen Verweis auf das Feld Bereich Objekt, nicht das Objekt selbst zurück.

Dies verlangsamt mich ein bisschen, aber schließlich habe ich herausgefunden, wie man drupal_write_record verwenden, um die Datei-Tabelle zu aktualisieren:

<?php

error_reporting(E_ALL);
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

function f(&$s) {
    $s = str_replace("png", "jpg", $s);
}

drupal_flush_all_caches();

$results = db_query('select nid from node where type="appliance"');
while ($result = db_fetch_object($results)) {
  $node = node_load($result->nid);

  $file = $node->field_icon[0];

  f($file['filename']);
  f($file['filepath']);
  f($file['filemime']);

  $realpath = "/path/to/webroot/" . $file[filepath];
  $stat = stat($realpath);
  if(!$stat)
    continue;

  $file['filesize'] = $stat[7];

  print "<pre>";

  print htmlspecialchars(print_r($file, TRUE), ENT_QUOTES);
  drupal_write_record('files', $file, 'fid');

  print "</pre>";
}

drupal_flush_all_caches();

?>