NAME

Prty::JQuery::DataTable - Erzeuge eine HTML/JavaScript DataTables-Tabelle

BASE CLASS

Prty::Hash

SYNOPSIS

Quelltext siehe Abschnitt "Beispiel Synopsis".

DESCRIPTION

Hompage des DataTables-Plugin: https://datatables.net/

Die Klasse liefert den HTML- und JavaScript-Code für ein DataTable-Widget.

ATTRIBUTES

arguments => $json (Default: undef)

JSON-Code der das DataTable-Objekt in JavaScript instantiiert. Die äußeren geschweiften Klammern werden hierbei weggelassen. Die Kolumnendefinitionen (DataTables-Attribut columns:) wird intern generiert und zu diesem Code hinzugefügt.

class => $class (Default: undef)

CSS-Klasse der DataTable (des Table-Elements).

columns => \@columns (Default: [])

Referenz auf eine Liste mit Kolumnen-Spezifikationen. Eine einzelne Kolumnen-Spezifikation ist ein Hash mit den Komponenten:

{
    name=>$name,        # interner Name, insbes. f. Wert-Lookup
    title=>$title,      # Kolumnenüberschrift
    type=>$type,        # DataTables-Kolumnentyp (s. Link unten)
    align=>$align,      # 'left'|'center'|'right' (Default: 'left')
    orderable=>$bool,   # 0|1 (Default: 1)
    searchable=>$bool,  # 0|1 (Default: 1)
    visible=>$bool,     # 0|1 (Default: 1)
}

Nicht benötigte Komponenten können weggelassen werden.

Mögliche Werte für $type: 'date', 'num', 'num-fmt', 'html-num', 'html-num-fmt', 'html', 'string'. Siehe https://datatables.net/reference/option/columns.type

id => $id (Default: undef)

DOM-Id der DataTable (des Table-Elements).

instantiate => $bool (Default: 0)

Füge die Instantiierung des DataTable-Objektes (JavaScript) zum HTML-Code der Methode html() hinzu.

rowCallback => $sub (Default: s.u.)

Referenz auf eine Subroutine, die für jedes Row-Objekt die darzustellende Zeileninformation (für tr- und td-Tag) liefert (siehe Prty::Html::Table::List). Default:

rowCallback => sub {
    my ($row,$i,$columnA) = @_;

    my @arr;
    for my $col (@$columnA) {
        my $name = $col->name;
        push @arr,$name? $row->get($name): undef;
    }

    return (undef,@arr);
};
rows => \@rows (Default: [])

Liste der Row-Objekte. Für jedes Element wird die Callback-Methode (Attribut rowCallback) aufgerufen.

EXAMPLES

Beispiel Synopsis

Default-Aussehen einer DataTable:

Das Programm

my $tab = Prty::Database::Row::Object->makeTable(
    [qw/per_id per_vorname per_nachname per_geburtsdatum/],
    qw/1 Rudi Ratlos 1971-04-23/,
    qw/2 Erika Mustermann 1955-03-16/,
    qw/3 Harry Hirsch 1948-07-22/,
    qw/4 Susi Sorglos 1992-10-23/,
);

my $h = Prty::Html::Tag->new('html-5');

my $html = Prty::JQuery::DataTable->html($h,
    id=>'personTable',
    class=>'compact stripe hover cell-border',
    columns=>[
        {
            name=>'per_id',
            title=>'Id',
            align=>'right',
        },{
            name=>'per_vorname',
            title=>'Vorname',
        },{
            name=>'per_nachname',
            title=>'Nachname',
        },{
            name=>'per_geburtsdatum',
            title=>'Geburtstag',
            align=>'center',
        },
    ],
    rows=>scalar $tab->rows,
    instantiate=>1,
);

erzeugt den HTML-Code (lange Zeilen umbrochen)

<table id="personTable" class="compact stripe hover cell-border"
  cellspacing="0">
<thead>
  <tr>
    <th>Id</th>
    <th>Vorname</th>
    <th>Nachname</th>
    <th>Geburtstag</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>1</td>
    <td>Rudi</td>
    <td>Ratlos</td>
    <td>1971-04-23</td>
  </tr>
  <tr>
    <td>2</td>
    <td>Erika</td>
    <td>Mustermann</td>
    <td>1955-03-16</td>
  </tr>
  <tr>
    <td>3</td>
    <td>Harry</td>
    <td>Hirsch</td>
    <td>1948-07-22</td>
  </tr>
  <tr>
    <td>4</td>
    <td>Susi</td>
    <td>Sorglos</td>
    <td>1992-10-23</td>
  </tr>
</tbody>
</table>
<script type="text/javascript">
  jQuery('#personTable').DataTable({
    columns: [
      {
        className: 'dt-right',
      },{
        className: 'dt-left',
      },{
        className: 'dt-left',
      },{
        className: 'dt-center',
      },
    ],
  });
</script>

Mit Instantiierungs-Argumenten (HTML-Seite)

Beispiel für die Angabe von Instantiierungs-Argumenten. Dies kann bei Aufruf der Methode "instantiate() - Instantiiere Widget in JavaScript"

$dt->instantiate(q~
    fixedHeader: true,
    stateSave: true,
    dom: 't',
~),

oder durch Zuweisung an das Attribut instantiate erfolgen

instantiate=>q~
    fixedHeader: true,
    stateSave: true,
    dom: 't',
~

Die Angabe dom: 't' bewirkt hier, dass das DataTables-Plugin keine Bedienelemente erzeugt:

Das Programm

my $tab = Prty::Database::Row::Object->makeTable(
    [qw/per_id per_vorname per_nachname per_geburtsdatum/],
    qw/1 Rudi Ratlos 1971-04-23/,
    qw/2 Erika Mustermann 1955-03-16/,
    qw/3 Harry Hirsch 1948-07-22/,
    qw/4 Susi Sorglos 1992-10-23/,
);

my $h = Prty::Html::Tag->new('html-5');

my $dt = Prty::JQuery::DataTable->new(
    id=>'personTable',
    class=>'compact stripe hover cell-border',
    columns=>[
        {
            name=>'per_id',
            title=>'Id',
            align=>'right',
        },{
            name=>'per_vorname',
            title=>'Vorname',
        },{
            name=>'per_nachname',
            title=>'Nachname',
        },{
            name=>'per_geburtsdatum',
            title=>'Geburtstag',
            align=>'center',
        },
    ],
    rows=>scalar $tab->rows,
);

my $html = Prty::Html::Page->html($h,
    styleSheet=>Prty::JQuery::DataTable->stylesheetUrl,
    styleSheet=>q|
        body {
            font-family: sans-serif;
            font-size: 12px;
            color: black;
            background-color: white;
        }
    |,
    body=>$dt->html($h),
    javaScript=>[
        'https://code.jquery.com/jquery-1.10.2.js',
        Prty::JQuery::DataTable->pluginUrl,
        $dt->instantiate(q~
            fixedHeader: true,
            stateSave: true,
            dom: 't',
        ~),
    ],
);

erzeugt den HTML-Code (lange Zeilen umbrochen)

<!DOCTYPE html>

<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <link rel="stylesheet" type="text/css"
    href="https://cdn.datatables.net/t/dt/dt-1.10.11/datatables.min.css">
  <style type="text/css">
    body {
      font-family: sans-serif;
      font-size: 12px;
      color: black;
      background-color: white;
    }
  </style>
</head>
<body>
  <table id="personTable" class="compact stripe hover cell-border"
    cellspacing="0">
  <thead>
    <tr>
      <th>Id</th>
      <th>Vorname</th>
      <th>Nachname</th>
      <th>Geburtstag</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Rudi</td>
      <td>Ratlos</td>
      <td>1971-04-23</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Erika</td>
      <td>Mustermann</td>
      <td>1955-03-16</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Harry</td>
      <td>Hirsch</td>
      <td>1948-07-22</td>
    </tr>
    <tr>
      <td>4</td>
      <td>Susi</td>
      <td>Sorglos</td>
      <td>1992-10-23</td>
    </tr>
  </tbody>
  </table>
  <script type="text/javascript"
    src="https://code.jquery.com/jquery-1.10.2.js"></script>
  <script type="text/javascript"
    src="https://cdn.datatables.net/t/dt/dt-1.10.11/datatables.min.js">
  </script>
  <script type="text/javascript">
    jQuery('#personTable').DataTable({
      fixedHeader: true,
      stateSave: true,
      dom: 't',
      columns: [
        {
          className: 'dt-right',
        },{
          className: 'dt-left',
        },{
          className: 'dt-left',
        },{
          className: 'dt-center',
        },
      ],
    });
  </script>
</body>
</html>

METHODS

Plugin-Code (Klassenmethoden)

stylesheetUrl() - URL der DataTables CSS-Definitionen

Synopsis

$url = $class->stylesheetUrl;
$url = $class->stylesheetUrl($config);

Description

Liefere den CDN URL der DataTables CSS-Definitionen.

Example

Prty::JQuery::DataTable->stylesheetUrl;
=>
'https://cdn.datatables.net/t/dt/dt-1.10.11/datatables.min.css'

pluginUrl() - URL des Plugin

Synopsis

$url = $class->pluginUrl;
$url = $class->pluginUrl($config);

Description

Liefere den CDN URL des DataTables Plugin.

Example

Prty::JQuery::DataTable->pluginUrl;
=>
'https://cdn.datatables.net/t/dt/dt-1.10.11/datatables.min.js'

Konstruktor

new() - Instantiiere Objekt

Synopsis

$obj = $class->new(@keyVal);

Description

Instantiiere eine DataTable in Perl und liefere eine Referenz auf dieses Objekt zurück.

Code-Generierung

html() - Generiere HTML

Synopsis

$html = $obj->html($h);
$html = $class->html($h,@keyVal);

Description

Generiere den HTML-Code des DataTable-Objekts und liefere diesen zurück. Als Klassenmethode gerufen, wird das Objekt intern mit den Attributen @keyVal instantiiert.

instantiate() - Instantiiere Widget in JavaScript

Synopsis

$javaScript = $e->instantiate;
$javaScript = $e->instantiate($json);

Description

Liefere den JavaScript-Code, der das DataTables-Objekt in JavaScript instantiiert. Aufbau:

jQuery('#ID').DataTable({
    <JSON-Code>,
    columns: [
        <Kolumnen-Definitionen>
    ]
});

Hilfsmethoden

getColumns() - Liste der Kolumnendefinitionen

Synopsis

@columns | $columns = $e->getColumns;

Description

Liefere die Liste der Kolumnendefinitionen. Die Kolumnen werden beim Setzen des Objektattributs columns als einfache Hashes angegeben. Diese Methode liefert die Kolumnen-Definitionen als Hash-Objekte (vom Typ Prty::Hash).

VERSION

1.122

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2018 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.