Advertisement
  1. Code
  2. PHP

Ajax-Daten-Grids mit CodeIgniter und jQuery zu bauen

Scroll to top
Read Time: 18 min

German (Deutsch) translation by Wilhelm Wolf (you can also view the original English article)

In dieser Lektion erstellen wir eine CodeIgniter-library, die es uns ermöglicht Daten generieren, die Netze automatisch für die Verwaltung von Datenbank-Tabelle. Ich erkläre jeden Schritt erforderlich, um diese Klasse erstellt haben; so werden Sie wahrscheinlich lernen, einige neue OOP-Techniken/Konzepte in den Prozess!

Als bonus, wir fahren weiter zu schreiben, jQuery-code, ermöglicht es einem Benutzer, die Daten zu aktualisieren raster Inhalt, ohne zu warten, für eine Aktualisierung der Seite.


 Bitte Beachten Sie,...

Dieses tutorial setzt Voraus, dass Sie ein bescheidenes Verständnis von der CodeIgniter-und jQuery-frameworks.

Was ist ein Datenblatt?

 Ein datagrid ist eine Tabelle, die zeigt den Inhalt einer Datenbank oder Tabelle zusammen mit der Sortierung steuert.

Ein datagrid ist eine Tabelle, die zeigt den Inhalt einer Datenbank oder Tabelle zusammen mit der Sortierung steuert.  In diesem tutorial werden wir die Aufgabe mit der Bereitstellung dieser Funktionalität, aber auch die Einsparung der Benutzer darauf warten, bis die Seite zu aktualisieren, jedes mal, wenn eine operation durchgeführt wird.  Dank jQuery, wird dies eine ziemlich einfache Aufgabe!

Was ist mit den Usern, die kein Javascript aktiviert haben?  Keine Sorge, wir werden das kompensieren!


Schritt 1: Erstellen einer Daten-Grid-Generator-Klasse

 Wir wollen ein tool bauen, dass wird es uns ermöglichen, erstellen Datenblätter dynamisch für jede Datenbank-Tabelle, die wir haben.  Dies bedeutet der code ist nicht gebunden an irgendeine spezifische Struktur der Tabelle, und damit unabhängig von den Daten selbst.  Alle coder (Entwickler, wer nutzt unsere Klasse) muss wissen, ist der name der Tabelle, die verwandelt sich in ein Gitter, und der Primärschlüssel für diese Tabelle. Hier ist das Vorwort der Klasse, dass wir die Entwicklung für den größten Teil von diesem tutorial:

1
<?php
2
class Datagrid{
3
  private $hide_pk_col = true;
4
	private $hide_cols = array();
5
	private $tbl_name = '';
6
	private $pk_col	= '';
7
	private $headings = array();
8
	private $tbl_fields = array();
9
}
10
?>

 Die Datagrid-Klasse könnte auch Hinzugefügt werden, um die Anwendung/Ordner "library", aber wir werden es hinzufügen, wie der Helfer für das CodeIgniter-framework.  Warum?  Weil das laden von Bibliotheken, die nicht zulässt, dass uns die Argumente an die Klasse' Konstruktor, so laden Sie es als Helfer das problem zu lösen. Dieser Punkt macht mehr Sinn für Sie, wenn wir fertig sind schreiben der Konstruktor.

Die Klasse' Konstruktor-Methode

1
public function __construct($tbl_name, $pk_col = 'id'){
2
	$this->CI =& get_instance();
3
	$this->CI->load->database();
4
	$this->tbl_fields = $this->CI->db->list_fields($tbl_name);
5
	if(!in_array($pk_col,$this->tbl_fields)){
6
		throw new Exception("Primary key column '$pk_col' not found in table '$tbl_name'");
7
	}
8
	$this->tbl_name = $tbl_name;
9
	$this->pk_col = $pk_col;
10
	$this->CI->load->library('table');
11
	
12
}

Wir haben viel schon Los; aber keine Sorge, ich werde alles erklären, für Sie im nächsten Absatz.

 Der Konstruktor benötigt zwei Argumente: das erste ist der name der Tabelle in der Datenbank, die Sie anzeigen möchten, wie ein datagrid an den Benutzer; der zweite Parameter ist der name der Spalte, die als Primärschlüssel für die Tabelle (dazu später mehr).  Innerhalb des Konstruktors Körper, instanzieren wir die CodeIgniter-Objekt, die Objekt Datenbank und die HTML-Tabelle der Klasse/Bibliothek.  All dies wird erforderlich sein, während eine Datagrid-Objekts Lebensdauer und sind bereits gebaut, in das CI-framework. Beachten Sie, dass wir auch überprüfen, ob der Primärschlüssel existiert wirklich in der gegebenen Tabelle, und, falls nicht, werfen wir eine exception, die den Fehler meldet. Nun die $this->tbl_fields member-variable verfügbar sein wird für die spätere Verwendung, so dass wir nicht haben, Holen Sie die Datenbank erneut.

 "Wir können mit dem Befehl, $CI->db->list_fields($tbl_name) zum abrufen der Namen aller Felder einer Tabelle hat. Jedoch, für eine bessere Leistung, ich empfehle das Zwischenspeichern der Ergebnisse."

 Methode für die Customizing-Tabelle, die die Überschriften

1
public function setHeadings(array $headings){
2
	$this->headings = array_merge($this->headings, $headings);
3
}

 Dies ermöglicht Ihnen, passen Sie die überschriften Ihrer Daten-raster-Tabelle - , ist, mit es, können Sie überschreiben die original-Spalten-Namen für bestimmte Felder der Tabelle.  Es nimmt ein assoziatives array wie dieses: regdate => "Datum der Registrierung".  Anstatt nur von der technischen, "Regdate" wie die überschrift der Spalte für die Art der Daten, haben wir eine lesbare Titel in seinen Platz. Der code, der verantwortlich für die Anwendung der Rubriken zeigte kurz.

 Methode zum Ignorieren/Ausblenden von Felder der Tabelle

1
public function ignoreFields(array $fields){
2
	foreach($fields as $f){
3
		if($f!=$this->pk_col)
4
			$this->hide_cols[] = $f;
5
	}
6
}

 ignoreFields erhält ein array mit den Felder ignoriert werden, wenn das abrufen von Daten aus der Datenbank.  Dies ist nützlich, wenn wir Tabellen mit vielen Feldern, aber wir wollen nur verstecken, ein paar von Ihnen.  Diese Methode ist intelligent genug, um zu verfolgen, Versuch zu ignorieren das primäre Schlüsselfeld und dann überspringen. Dies ist so, weil die primary key kann nicht ignoriert werden, aus technischen Gründen (Sie werden sehen, warum kurz).  Trotzdem, wenn Sie sich verstecken wollen, die primary key-Spalte erscheint in der Benutzeroberfläche verwenden, können Sie die hidePkCol Methode:

1
public function hidePkCol($bool){
2
	$this->hide_pk_col = (bool)$bool;
3
}

 Diese Methode erhält einen booleschen Wert, um anzugeben, wenn wir uns verstecken wollen, die Primärschlüssel-Spalte, damit es nicht zeigen, bis in das Daten-grid.  Manchmal, es ist eine hässliche Idee, um die Anzeige der pkey-Daten, die in der Regel ein numerischer code ohne Bedeutung für den Benutzer.

 Nächste Instanz-Methode:

1
private function _selectFields(){
2
	foreach($this->tbl_fields as $field){
3
		if(!in_array($field,$this->hide_cols)){
4
			$this->CI->db->select($field);
5
			// hide pk column heading?

6
			if($field==$this->pk_col && $this->hide_pk_col) continue;
7
				$headings[]= isset($this->headings[$field]) ? $this->headings[$field] : ucfirst($field);
8
		}
9
	}
10
	if(!empty($headings)){
11
		// prepend a checkbox for toggling 

12
		array_unshift($headings,"<input type='checkbox' class='check_toggler'>");
13
		$this->CI->table->set_heading($headings);
14
	}
15
	
16
}

 Hier haben wir eine helper-Methode; deshalb hat es der "private" - Modifizierer vorangestellt ist ein underline-Zeichen (code convention).  Es wird von der generate () - Methode - erklärt kurz, um die entsprechenden Felder der Tabelle ausgewählt und auch die entsprechenden Rubriken eingestellt die Tabelle (generator) Objekt.  Beachten Sie die folgende Zeile:

1
$headings[]= isset($this->headings[$field]) ? $this->headings[$field] : ucfirst($field);

 Dies ist, wo wir die benutzerdefinierte Kopfzeilen oder greifen auf die Standard diejenigen, wenn keins angegeben ist. Wenn die pk-Spalte soll ausgeblendet werden, dann ist es die überschrift, werden übersprungen.  Beachten Sie auch die folgende Zeile:

1
array_unshift($headings,"<input type='checkbox' class='dg_check_toggler'>");

Der obige Befehl weist das Programm voranstellen eines "Master" - Kästchen, wie die erste überschrift der Tabelle.  Das Markierungsfeld unterscheidet sich von anderen Checkboxen im Netz, die es einem Benutzer ermöglicht, aktivieren bzw. deaktivieren Sie alle Checkboxen in nur einem Arbeitsgang.  Dieses Umschalten wird die Funktionalität implementiert werden, die in wenigen Augenblicken mit einem einfachen jQuery-code-snippet.

Methode zum Generieren/Rendern des Datagrid

Jetzt kommt die Sache, dass macht die eigentliche Arbeit für uns:

1
public function generate(){
2
	$this->_selectFields();
3
	$rows = $this->CI->db
4
			->from($this->tbl_name)
5
			->get()
6
			->result_array();
7
	foreach($rows as &$row){
8
		$id = $row[$this->pk_col];
9
		
10
		// prepend a checkbox to enable selection of items/rows

11
		array_unshift($row, "<input class='dg_check_item' type='checkbox' name='dg_item[]' value='$id' />");
12
		
13
		// hide pk column cell?

14
		if($this->hide_pk_col){
15
			unset($row[$this->pk_col]);
16
		}
17
	}
18
	
19
	return $this->CI->table->generate($rows);
20
}

 Die Methode generieren, wie der name schon sagt, ist zuständig für die Generierung der Daten raster selbst.  Rufen Sie diese Methode nur, wenn Sie so konfiguriert haben, dass das Objekt nach Ihren Bedürfnissen.  Das erste, was es tut, ist Anruf die $this->_selectFields () - Methode, um die Aktionen auszuführen, die wir bereits erwähnt. Jetzt hat es zum abrufen aller Zeilen aus der Datenbank und dann die Schleife durch Sie, hinzufügen von Checkboxen am Anfang jeder Zeile:

1
// prepend a checkbox to enable selection of items/rows

2
array_unshift($row, "<input class='dg_check_item' type='checkbox' name='dg_item[]' value='$id' />");

Innerhalb der foreach-Schleife in der Methode erstellen, wenn die $this->hide_pk_col flag auf true gesetzt ist, dann müssen wir entfernt den Eintrag primary key in der $row-array, damit es nicht zu zeigen, wie eine Spalte, wenn der $this->CI->Tabelle-Objekt verarbeitet alle Zeilen und erstellt den endgültigen html-output.  An diesem Punkt, es ist okay, entfernen Sie den Primärschlüssel, wenn notwendig, da wir Sie nicht mehr benötigen diese Informationen. Ein

 Aber was macht der Benutzer mit der ausgewählten/checked Zeilen?  Für diese Antwort habe ich bereit ein paar weitere Methoden. Die erste ermöglicht es uns, zu schaffen "action buttons", ohne zu wissen, alle technischen details darüber, wie das grid-system arbeitet intern:

Methode für das Hinzufügen von Schaltflächen zu einem Daten-Grid-Form

1
public static function createButton($action_name, $label){
2
	return "<input type='submit' class='$action_name' name='dg_action[$action_name]' value='$label' />";
3
}

 Übergeben Sie einfach den Namen der Aktion als erstes argument und ein zweites argument geben Sie die Beschriftung für die generierte Schaltfläche.  Ein class-Attribut wird automatisch generiert, Taste, so können wir spielen, um mit es sich leichter, wenn wir es in unserem JavaScript. Aber, wie wir wissen, wenn eine bestimmte Aktion aus-Taste wurde gedrückt, indem der Benutzer? Die Antwort finden Sie in der nächsten Methode:

1
public static function getPostAction(){
2
// get name of submitted action (if any)

3
	if(isset($_POST['dg_action'])){
4
		return key($_POST['dg_action']);
5
	}
6
}

 Yep! Eine weitere statische Methode, die uns hilft, wenn wir den Umgang mit Formularen.  Wenn alle Daten raster vorgelegt worden ist, diese Methode den Namen der Aktion ("operation"), verbunden mit dem submit-Ereignis.  Außerdem noch ein praktisches Werkzeug für die Verarbeitung unserer datagrid-Formen ist...

1
public static function getPostItems(){
2
	if(!empty($_POST['dg_item'])){
3
		return $_POST['dg_item'];
4
	}
5
	return array();
6
}

 ... das gibt ein array mit den ausgewählten ids, so können Sie verfolgen, welche Zeilen ausgewählt wurden, auf das Netz und führen Sie anschließend eine Aktion mit Ihnen.  Als ein Beispiel von, was getan werden kann mit einer Auswahl von Datensatz-ids, die ich vorbereitet habe eine andere Methode - es wird eine Instanz-Methode, und nicht eine statische, denn Sie macht die Nutzung der Instanz des Objekts Ressourcen, um seine Wirtschaft:

1
public function deletePostSelection(){
2
// remove selected items from the db

3
	if(!empty($_POST['dg_item']))
4
		return $this->CI->db
5
			->from($this->tbl_name)
6
			->where_in($this->pk_col,$_POST['dg_item'])
7
			->delete();
8
}

 Wenn mindestens eine checkbox aktiviert wurde, die deletePostSelection () - Methode erzeugen und ausführen einer SQL-Anweisung wie folgt aus (angenommen $tbl_name='meine_tabelle' und $pk_col='id'):

1
DELETE FROM my_table WHERE id IN (1,5,7,3,etc...)

 ..., die effektiv entfernt die ausgewählten Zeilen aus der Persistenzschicht. Es könnte sein, mehr Operationen, die Sie hinzufügen können, um eine Daten-grid, aber das hängt von den Besonderheiten Ihres Projektes.  Als Tipp, man könnte diese Klasse erweitern, um, sagen wir, InboxDatagrid, so, jenseits der deletePostSelection Methode, es könnte auch zusätzliche Operationen, wie moveSelectedMessagesTo($Ort), etc...

Putting alles zusammen

 Nun, wenn Sie haben, folgte diesem tutorial Schritt für Schritt, Sie sollten am Ende mit etwas, das ähnlich der folgenden:

1
class Datagrid{
2
	
3
	private $hide_pk_col = true;
4
	private $hide_cols = array();
5
	private $tbl_name = '';
6
	private $pk_col	= '';
7
	private $headings = array();
8
	private $tbl_fields = array();
9
	
10
	function __construct($tbl_name, $pk_col = 'id'){
11
		$this->CI =& get_instance();
12
		$this->CI->load->database();
13
		$this->tbl_fields = $this->CI->db->list_fields($tbl_name);
14
		if(!in_array($pk_col,$this->tbl_fields)){
15
			throw new Exception("Primary key column '$pk_col' not found in table '$tbl_name'");
16
		}
17
		$this->tbl_name = $tbl_name;
18
		$this->pk_col = $pk_col;
19
		$this->CI->load->library('table');
20
		
21
	}
22
	
23
	public function setHeadings(array $headings){
24
		$this->headings = array_merge($this->headings, $headings);
25
	}
26
	
27
	public function hidePkCol($bool){
28
		$this->hide_pk_col = (bool)$bool;
29
	}
30
	
31
	public function ignoreFields(array $fields){
32
		foreach($fields as $f){
33
			if($f!=$this->pk_col)
34
				$this->hide_cols[] = $f;
35
		}
36
	}
37
	
38
	private function _selectFields(){
39
		foreach($this->tbl_fields as $field){
40
			if(!in_array($field,$this->hide_cols)){
41
				$this->CI->db->select($field);
42
				// hide pk column heading?

43
				if($field==$this->pk_col && $this->hide_pk_col) continue;
44
				$headings[]= isset($this->headings[$field]) ? $this->headings[$field] : ucfirst($field);
45
			}
46
		}
47
		if(!empty($headings)){
48
			// prepend a checkbox for toggling 

49
			array_unshift($headings,"<input type='checkbox' class='dg_check_toggler'>");
50
			$this->CI->table->set_heading($headings);
51
		}
52
		
53
	}
54
	
55
	public function generate(){
56
		$this->_selectFields();
57
		$rows = $this->CI->db
58
				->from($this->tbl_name)
59
				->get()
60
				->result_array();
61
		foreach($rows as &$row){
62
			$id = $row[$this->pk_col];
63
			
64
			// prepend a checkbox to enable selection of items

65
			array_unshift($row, "<input class='dg_check_item' type='checkbox' name='dg_item[]' value='$id' />");
66
			
67
			// hide pk column?

68
			if($this->hide_pk_col){
69
				unset($row[$this->pk_col]);
70
			}
71
		}
72
		
73
		return $this->CI->table->generate($rows);
74
	}
75
	
76
	public static function createButton($action_name, $label){
77
		return "<input type='submit' class='$action_name' name='dg_action[$action_name]' value='$label' />";
78
	}
79
	
80
	public static function getPostAction(){
81
	// get name of submitted action (if any)

82
		if(isset($_POST['dg_action'])){
83
			return key($_POST['dg_action']);
84
		}
85
	}
86
	
87
	public static function getPostItems(){
88
		if(!empty($_POST['dg_item'])){
89
			return $_POST['dg_item'];
90
		}
91
		return array();
92
	}
93
	
94
	public function deletePostSelection(){
95
	// remove selected items from the db

96
		if(!empty($_POST['dg_item']))
97
			return $this->CI->db
98
				->from($this->tbl_name)
99
				->where_in($this->pk_col,$_POST['dg_item'])
100
				->delete();
101
	}
102
103
}

 Hinweis: vergessen Sie nicht, speichern Sie diese Datei als datagrid_helper.php und setzen Sie es in "application/helpers/"


Schritt 2: Testen der Datagrid-Helper-Klasse mit CodeIgniter Controller

 Wir werden nun das erstellen einer einfachen test-controller und laden Sie die Datagrid-Klasse als Helfer in seinem Konstruktor.  Aber vorher sollten wir definieren eine dummy-Datenbank-Tabelle und füllen es mit einigen Beispieldaten.

 Führen Sie die folgende SQL erstellen die Datenbank und der Benutzer-Tabelle:

1
CREATE DATABASE `dg_test`;
2
CREATE TABLE `users` (
3
  `id` int(11) NOT NULL AUTO_INCREMENT,
4
  `username` varchar(80) NOT NULL,
5
  `password` varchar(32) NOT NULL,
6
  `email` varchar(255) NOT NULL,
7
  UNIQUE KEY `id` (`id`)
8
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

Als Nächstes fügen Sie einige Benutzer hinzu:

1
INSERT INTO `users` (`id`, `username`, `password`, `email`) VALUES
2
(1, 'david', '12345', 'david@domain.com'),
3
(2, 'maria', '464y3y', 'maria@domain.com'),
4
(3, 'alejandro', 'a42352fawet', 'alejandro@domain.com'),
5
(4, 'emma', 'f22a3455b2', 'emma@domain.com');

 Jetzt speichern Sie den folgenden code als "test.php," und fügen Sie Sie der "application/controllers" - Ordner:

1
<?php
2
class Test extends CI_Controller{
3
4
	function __construct(){
5
		parent::__construct();
6
		$this->load->helper(array('datagrid','url'));
7
		$this->Datagrid = new Datagrid('users','id');
8
	}
9
	
10
	function index(){
11
		$this->load->helper('form');
12
		$this->load->library('session');
13
14
		$this->Datagrid->hidePkCol(true);
15
		$this->Datagrid->setHeadings(array('email'=>'E-mail'));
16
		$this->Datagrid->ignoreFields(array('password'));
17
		
18
		if($error = $this->session->flashdata('form_error')){
19
			echo "<font color=red>$error</font>";
20
		}
21
		echo form_open('test/proc');
22
		echo $this->Datagrid->generate();
23
		echo Datagrid::createButton('delete','Delete');
24
		echo form_close();
25
	}
26
	
27
	function proc($request_type = ''){
28
		$this->load->helper('url');
29
		if($action = Datagrid::getPostAction()){
30
			$error = "";
31
			switch($action){
32
				case 'delete' :
33
					if(!$this->Datagrid->deletePostSelection()){
34
						$error = 'Items could not be deleted';
35
					}
36
				break;
37
			}
38
			if($request_type!='ajax'){
39
				$this->load->library('session');
40
				$this->session->set_flashdata('form_error',$error);
41
				redirect('test/index');
42
			} else {
43
				echo json_encode(array('error' => $error));
44
			}
45
		} else {
46
			die("Bad Request");
47
		}
48
	}
49
50
}
51
?>

 Eine Instanz dieser Klasse erstellt und übergeben eine Referenz auf die $this->Datagrid-Mitglied.  Beachten Sie, dass wir das abrufen von Daten aus einer Tabelle namens "users", deren Primärschlüssel ist die Spalte "id"; klicken Sie dann auf die index-Methode wir nehmen die folgenden Schritte aus: konfigurieren Sie die Datagrid-Objekt, machen Sie Sie in einem Formular mit einem löschen-button Hinzugefügt, um es und sehen, ob alles wie erwartet funktioniert:

Frage: Was passiert, wenn das Formular gesendet wird?

 Antwort: Das "Test::proc ()" - Methode kümmert sich um die Bearbeitung der form und die Wahl der richtigen operation gegen die ids, die ausgewählt wurden, die von der form den Absender.  Es kümmert sich auch um die AJAX-Anfragen, so wird es echo ein JSON-Objekt an den client zurück.  Diese AJAX-aware-Funktion in handliches kommen, wenn jQuery kommt in Aktion, die ist jetzt!

 "Es ist immer eine gute Idee, um das erstellen von web-Anwendungen, die kompensiert wird, wenn JavaScript/AJAX nicht verfügbar ist.  Dieser Weg, einige Benutzer eine reichere und schnellere Erfahrung, während diejenigen, die ohne aktiviertes JavaScript wird immer noch in der Lage sein, um die Anwendung zu verwenden in der Regel."


Schritt 3: Implementieren von Ajax (jQuery ist die Rettung!)

 Wenn der Benutzer auf die Schaltfläche klickt (oder eine beliebige andere Aktion-button), wir möchten Sie vielleicht, um zu verhindern, dass die Seite Neuladen und das generieren sich alles wieder ein; dadurch könnte der Benutzer unserer Anwendung einschlafen!  Zur Umgehung dieses Problems wird nicht eine schwierige Aufgabe, wenn man sich auf die jQuery-Bibliothek.  Da dies nicht ein "Einsteiger" tutorial, ich werde nicht gehen durch alle Einzelheiten, wie man die Bibliothek, wie es auf der Seite, etc. Sie erwartet, dass Sie diese Schritte auf Ihrem eigenen.

 Erstellen Sie einen Ordner namens "js", fügen Sie die jQuery-Bibliothek, und erstellen Sie eine view-Datei mit dem Namen users.php.  Öffnen Sie diese neue Datei, und fügen Sie hinzu:

1
<html>
2
<head>
3
	<title>Users Management</title>
4
	<script src="<?php echo base_url(); ?>js/jquery-1.6.3.min.js"></script>
5
	<script src="<?php echo base_url(); ?>js/datagrid.js"></script>
6
</head>
7
<body>
8
<?php

9
		$this->Datagrid->hidePkCol(true);

10
		if($error = $this->session->flashdata('form_error')){

11
			echo "<font color=red>$error</font>";

12
		}

13
		echo form_open('test/proc',array('class'=>'dg_form'));

14
		echo $this->Datagrid->generate();

15
		echo Datagrid::createButton('delete','Delete');

16
		echo form_close();

17
?>
18
</body>
19
</html>

Wussten Sie, dass wir umgezogen haben den code Weg von Test::der index und die in der neuen view-Skript?  Das heißt, wir müssen ändern Sie den Test::index () - Methode entsprechend:

1
function index(){
2
	$this->load->helper('form');
3
	$this->load->library('session');
4
	$this->load->view('users');
5
}

Das ist besser.  Wenn Sie wollen, fügen Sie einige styling an das Netz, können Sie die folgenden CSS (oder ein besseres layout auf Ihrem eigenen):

1
	.dg_form table{
2
		border:1px solid silver;
3
	}
4
	
5
	.dg_form th{
6
		background-color:gray;
7
		font-family:"Courier New", Courier, mono;
8
		font-size:12px;
9
	}
10
	
11
	.dg_form td{
12
		background-color:gainsboro;
13
		font-size:12px;
14
	}
15
	
16
	.dg_form input[type=submit]{
17
		margin-top:2px;
18
	}

Nun, erstellen Sie bitte ein "datagrid.js"  Datei, legte es auf die "js" - Verzeichnis, und starten Sie mit diesem code:

1
$(function(){
2
	// cool stuff here...
3
})

Innerhalb dieser Zeit werden wir code schreiben, der beauftragt werden, mit der Kontrolle bestimmter Ereignisse übermitteln, sobald die Seite vollständig geladen wurde.  Das erste, was wir tun müssen, ist zu verfolgen, wenn ein Benutzer klickt auf eine Schaltfläche "senden" auf das Datenblatt-Formular, und senden die Daten werden auf dem server verarbeitet.

1
 	$('.dg_form :submit').click(function(e){
2
		e.preventDefault();
3
		var $form = $(this).parents('form');
4
		var action_name = $(this).attr('class').replace("dg_action_","");
5
		var action_control = $('<input type="hidden" name="dg_action['+action_name+']" value=1 />');
6
		
7
		$form.append(action_control);
8
		
9
		var post_data = $form.serialize();
10
		action_control.remove();
11
		
12
		var script = $form.attr('action')+'/ajax';
13
		$.post(script, post_data, function(resp){
14
			if(resp.error){
15
				alert(resp.error);
16
			} else {
17
				switch(action_name){
18
					case 'delete' :
19
						// remove deleted rows from the grid
20
						$form.find('.dg_check_item:checked').parents('tr').remove();
21
					break;
22
					case 'anotherAction' :
23
						// do something else...
24
					break;
25
				}
26
			}
27
		}, 'json')
28
	})

 Alternativ könnten wir begonnen haben, mit so etwas wie: $('.dg_form').submit(function(e){...}).  Aber da ich möchte, um zu verfolgen, welche Taste gedrückt wurde, und extrahieren Sie die Namen der gewählten Aktion basiert auf Sie, ich bevorzuge die Bindung eines Ereignis-handler auf den submit-button selbst und gehe dann meinen Weg in der Hierarchie der Knoten, um die form zu finden, die der gedrückten Taste gehört:

1
// finds the form

2
var $form = $(this).parents('form');
3
// extracts the name of the action

4
var action_name = $(this).attr('class').replace("dg_action_","");

 Als Nächstes fügen wir ein hidden-input-element in das Formular ein element, um anzugeben, welche Aktion gesendet wird:

1
// create the hidden input

2
var action_control = $('<input type="hidden" name="dg_action['+action_name+']" value=1 />');
3
// add to the form

4
$form.append(action_control);

 Dies ist notwendig, da die Funktion nicht prüfen, die Schaltfläche Absenden, um eine gültige Eingabe. So müssen wir das hack, die beim serialisieren der Formulardaten.

1
action_control.remove();

 "Vergessen Sie nicht: die Funktion ignoriert die senden-Schaltfläche, indem es Sie als nur ein weiteres Stück von markup-Müll!"

Senden von Formulardaten an den Server

 Weiter gehen wir zu Holen Sie sich die action-Attribut im form-element und fügen Sie die Zeichenfolge "/ajax", die url, also die Methode wird wissen, dass dies in der Tat ein AJAX-request. Danach verwenden wir jQuery.post-Funktion zum senden der Daten, die verarbeitet werden, indem der entsprechende controller, server-Seite, und dann fangt die Antwort-Veranstaltung mit einer registrierten callback - /Schließung:

1
...
2
	var script = $form.attr('action')+'/ajax';
3
	$.post(script, post_data, function(resp){
4
		if(resp.error){
5
			alert(resp.error);
6
		} else {
7
			switch(action_name){
8
				case 'delete' :
9
					// remove deleted rows from the grid
10
					$form.find('.dg_check_item:checked').parents('tr').remove();
11
				break;
12
				case 'anotherAction' :
13
					// do something else...
14
				break;
15
			}
16
		}
17
	},'json')

Beachten Sie, dass wir Fragen, die Antwort kodiert werden als "json", da wir auf der Durchreise sind, die string als viertes argument des $.post-Funktion.  Die Inhalte der Rückruf, Umgang mit der server-Antwort sollte ziemlich einfach zu begreifen; es bestimmt, ob ein Fehler aufgetreten ist, und, wenn ja, alarmiert.  Ansonsten wird es zeigen, dass die Aktion wurde erfolgreich verarbeitet (in diesem Fall, wenn es sich um eine " Aktion, wir löschen die Zeilen, die Bezug auf die ids, die der Benutzer ausgewählt hat).


Schritt 4: Überprüfen, ob Alle oder Nichts!

 Das einzige, was jetzt noch fehlt, ist der toggle-Funktionalität, die ich früher versprochen.  Wir müssen registrieren einer callback-Funktion, wenn die "Master" - Kästchen mit einem class-Attribut auf "dg_check_toggler" - geklickt wird. Fügen Sie den folgenden code-snippet nach dem vorhergehenden:

1
	$('.dg_check_toggler').click(function(){
2
		var checkboxes = $(this).parents('table').find('.dg_check_item');
3
		if($(this).is(':checked')){
4
			checkboxes.attr('checked','true');
5
		} else {
6
			checkboxes.removeAttr('checked');
7
		}
8
	})

Wenn die "toggler" checkbox angeklickt ist, wenn geht es um einen Zustand "geprüft", dann werden alle Zeilen aus der zugehörigen Daten-grid wird gleichzeitig geprüft werden; ansonsten wird alles deaktiviert.


 Abschließende Gedanken

 Wir haben nicht erreicht die Spitze des Eisbergs, wenn es um die Daten-grids für komplexe content-management-Systeme.  Andere Merkmale, die beweisen könnte, nützlich zu sein, sind:

  •  Sortierung der Daten raster von Spaltennamen
  • Paginierung links für das surfen im Daten-grid
  • Bearbeiten/Ändern von links für die Aktualisierung einer einzelnen Zeile die Daten
  •  Suche Mechanismus um Ergebnisse zu filtern

Vielen Dank für das Lesen. Wenn Sie möchten, eine follow-up-tutorial, lasst mich in den Kommentaren wissen!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.