ProcessWire - schneller CSV-Export

Aus Wikizone
Version vom 17. Juni 2025, 08:18 Uhr von Steff (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Quick & Dirty Template wenn du schnell mal Daten exportieren möchtest: <syntaxhighlight lang="php"> <?php namespace ProcessWire; /** * custom-export.php…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Quick & Dirty Template wenn du schnell mal Daten exportieren möchtest:

<?php

namespace ProcessWire;

/**
 * custom-export.php
 * Template für quick and dirty exporte
 * Um den selector leichter zu erstellen kannst du im Adminbereich unter Page->find eine Abfrage bauen.
 * $selector ist der Selector für die Abfrage
 * $fields sind die Felder die im CSV-Export ausgegeben werden (müssen Felder sein die zum Abfrageergebnis passen)
 */
$out = '';
// Selector für export von Usern bei fasch angelegter Antwort (wurde danach korrigiert)
//$selector = 'has_parent!=2, template=54|55, selected_answer*=B, pr_question=190720, checkbox=0, limit=0, sort=-modified, include=unpublished'; // hier kommt dein Selector
//$fields = ['pr_question', 'pr_user.firstname', 'pr_user.lastname', 'pr_user.email', 'selected_answer', 'checkbox'];

// User mit mindestens einer beantworteten Frage
$selector = 'template=3, parent=29, include=all, limit=100, status<9999999, template=3, parent=29, answered_questions!=0, roles=1044, sort=name';
$fields = ['name','firstname', 'lastname', 'email'];

exportCustomCSV($selector, $fields);

/**
 * exportCSV
 * @param String - the selector
 * @param Array Feldnamen die exportiert werden.
 * 
 */
function exportCustomCSV($selector,$fields) {
  /**
   * Exportiert die user_answer-Datensätze als CSV.
   */
  $filename = "pw_export_" . date("Ymd_His") . ".csv";
  header('Content-Type: text/csv; charset=utf-8');
  header('Content-Disposition: attachment; filename=' . $filename);

  $output = fopen('php://output', 'w');
  
  // CSV-Kopfzeile
  $headers = [];
  foreach($fields as $fieldName) {
    // Versuche, das Field-Objekt zu holen
    $f = wire()->fields->get($fieldName);
    if($f) {
      $headers[] = $f->label;
    } else {
      // Fallback
      $headers[] = $fieldName;
    }
  }
  $output = fopen('php://output', 'w');
  fputcsv($output, $headers);


  // DATEN
  $items = pages()->find($selector);
  foreach($items as $item) {
    bd($item);
    $row = [];
    foreach($fields as $fieldName) {
      $value = $item->$fieldName;
      // Wenn PageArray (z.B. mehrere Referenzen), join Titles
      if($value instanceof \ProcessWire\PageArray) {
        $titles = [];
        foreach($value as $p) $titles[] = $p->title;
        $row[] = implode('|', $titles);
      }
      // Wenn einzelne Page (z.B. eine Referenz), Titel ausgeben
      elseif($value instanceof \ProcessWire\Page) {
        $row[] = $value->title;
      }
      // Sonst ganz normal in String casten
      else {
        $row[] = (string) $value;
      }
    }
    fputcsv($output, $row);
  }
  
  //bd($items);
  fclose($output);
  exit;
}