ProcessWire - schneller CSV-Export

Aus Wikizone
Wechseln zu: Navigation, Suche

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

  1. Template mit dem Code unten anlegen
  2. Seite mit dem Template erstellen
  3. Seite aufrufen (am besten erstmal im Selector die Zahl der Ergebnisse mit limit begrenzen).
<?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;
}