You are here

QPList.php in QueryPath 6

Same filename and directory in other branches
  1. 7.3 QueryPath/Extension/QPList.php
  2. 7.2 QueryPath/Extension/QPList.php

File

QueryPath/Extension/QPList.php
View source
<?php

class QPList implements QueryPathExtension {
  const UL = 'ul';
  const OL = 'ol';
  const DL = 'dl';
  protected $qp = NULL;
  public function __construct(QueryPath $qp) {
    $this->qp = $qp;
  }
  public function appendTable($items, $options = array()) {
    $opts = $options + array(
      'table class' => 'qptable',
    );
    $base = '<?xml version="1.0"?>
    <table>
    <tbody>
      <tr></tr>
    </tbody>
    </table>';
    $qp = qp($base, 'table')
      ->addClass($opts['table class'])
      ->find('tr');
    if ($items instanceof TableAble) {
      $headers = $items
        ->getHeaders();
      $rows = $items
        ->getRows();
    }
    elseif ($items instanceof Traversable) {
      $headers = array();
      $rows = $items;
    }
    else {
      $headers = $items['headers'];
      $rows = $items['rows'];
    }
    foreach ($headers as $header) {
      $qp
        ->append('<th>' . $header . '</th>');
    }
    $qp
      ->top()
      ->find('tr:last');
    foreach ($rows as $row) {
      $qp
        ->after('<tr/>')
        ->next();
      foreach ($row as $cell) {
        $qp
          ->append('<td>' . $cell . '</td>');
      }
    }
    $this->qp
      ->append($qp
      ->top());
    return $this->qp;
  }
  public function appendList($items, $type = self::UL, $options = array()) {
    $opts = $options + array(
      'list class' => 'qplist',
    );
    if ($type == self::DL) {
      $q = qp('<?xml version="1.0"?><dl></dl>', 'dl')
        ->addClass($opts['list class']);
      foreach ($items as $dt => $dd) {
        $q
          ->append('<dt>' . $dt . '</dt><dd>' . $dd . '</dd>');
      }
      $q
        ->appendTo($this->qp);
    }
    else {
      $q = $this
        ->listImpl($items, $type, $opts);
      $this->qp
        ->append($q
        ->find(':root'));
    }
    return $this->qp;
  }
  protected function listImpl($items, $type, $opts, $q = NULL) {
    $ele = '<' . $type . '/>';
    if (!isset($q)) {
      $q = qp()
        ->append($ele)
        ->addClass($opts['list class']);
    }
    foreach ($items as $li) {
      if ($li instanceof QueryPath) {
        $q = $this
          ->listImpl($li
          ->get(), $type, $opts, $q);
      }
      elseif (is_array($li) || $li instanceof Traversable) {
        $q
          ->append('<li><ul/></li>')
          ->find('li:last > ul');
        $q = $this
          ->listImpl($li, $type, $opts, $q);
        $q
          ->parent();
      }
      else {
        $q
          ->append('<li>' . $li . '</li>');
      }
    }
    return $q;
  }
  protected function isAssoc($array) {
    return count(array_diff_key($array, range(0, count($array) - 1))) != 0;
  }

}
QueryPathExtensionRegistry::extend('QPList');
interface TableAble {
  public function getHeaders();
  public function getRows();
  public function size();

}
class QPTableData implements TableAble, IteratorAggregate {
  protected $headers;
  protected $rows;
  protected $caption;
  protected $p = -1;
  public function setHeaders($array) {
    $this->headers = $array;
    return $this;
  }
  public function getHeaders() {
    return $this->headers;
  }
  public function setRows($array) {
    $this->rows = $array;
    return $this;
  }
  public function getRows() {
    return $this->rows;
  }
  public function size() {
    return count($this->rows);
  }
  public function getIterator() {
    return new ArrayIterator($rows);
  }

}
class QPTableTextData extends QPTableData {
  public function setHeaders($array) {
    $headers = array();
    foreach ($array as $header) {
      $headers[] = htmlentities($header);
    }
    parent::setHeaders($headers);
    return $this;
  }
  public function setRows($array) {
    $count = count($array);
    for ($i = 0; $i < $count; ++$i) {
      $cols = array();
      foreach ($data[$i] as $datum) {
        $cols[] = htmlentities($datum);
      }
      $data[$i] = $cols;
    }
    parent::setRows($array);
    return $this;
  }

}

Classes

Interfaces

Namesort descending Description
TableAble