Customer Relationship Management (CRM) ist ein System, das Kundeninteraktionen und -daten während des gesamten Kundenlebenszyklus zwischen dem Kunden und dem Unternehmen über verschiedene Kanäle hinweg verwaltet. In diesem Tutorial erstellen wir ein benutzerdefiniertes CRM in PHP, das ein Vertriebsteam nutzen kann, um Kunden während des gesamten Verkaufszyklus zu verfolgen.
Wir erstellen ein einfaches CRM-System für Verkäufer, damit diese
- Zugriff auf ihre Aufgaben haben
- Ihre Leads einsehen können
- Neue Aufgaben für jeden Lead erstellen können
- Neue Verkaufschancen anlegen können
- Einen Verkauf verlieren können
Vertriebsmanager können
- Alle Kunden verwalten
- Das Vertriebsteam verwalten
- Aktuelle Vertriebsaktivitäten einsehen
Bausteine eines CRM
Hier ist eine Liste der wesentlichen Komponenten des CRM
- Leads: Erste Kontakte
- Accounts: Informationen über die Unternehmen, mit denen Sie Geschäfte machen
- Kontakt: Informationen über die Personen, die Sie kennen und mit denen Sie arbeiten. Normalerweise hat ein Account viele Kontakte
- Opportunities: Qualifizierte Leads
- Aktivitäten: Aufgaben, Besprechungen, Anrufe, E-Mails und alle anderen Aktivitäten, die Ihnen die Interaktion mit Kunden ermöglichen
- Sales: Ihr Vertriebsteam
- Dashboard: CRM-Dashboards sind viel mehr als nur hübsche Optik. Sie sollten wichtige Informationen auf einen Blick liefern und Links für detailliertere Einblicke bieten.
- Login: Verkäufer und Manager haben unterschiedliche Rollen im System. Manager haben Zugriff auf Berichte und Informationen zur Vertriebspipeline.

Systemanforderungen
- PHP 5.3+,
- MySQL oder MariaDB
- phpGrid
CRM-Datenbank erstellen
Wir beginnen mit der Erstellung unserer benutzerdefinierten CRM-Datenbank. Die Haupttabellen, die wir verwenden werden, sind
- contact – enthält grundlegende Kundendaten
- notes – enthält Informationen, die von Vertriebsmitarbeitern beim Kontakt gesammelt wurden.
- users – Informationen über Vertriebsmitarbeiter

Die Tabelle contact enthält grundlegende Kundeninformationen wie Namen, Firmenadressen, Projektinformationen usw.
Die Tabelle notes wird verwendet, um alle Vertriebsaktivitätsinformationen wie Besprechungen und Anrufe zu speichern.
Die Tabelle users speichert Anmeldeinformationen über Benutzer des Systems, wie Benutzernamen und Passwörter. Benutzer können auch Rollen haben, entweder Sales oder Manager.
Alle anderen Tabellen sind einfache Lookup-Tabellen, die mit den oben genannten drei Hauptrelationenbanktabellen verknüpft werden.
- contact_status – enthält Kontaktstatus wie Lead und Opportunity, die jeweils eine andere Phase in einem typischen Verkaufszyklus anzeigen
- task_status – der Aufgabenstatus kann entweder Pending oder Completed sein
- user_status – ein Vertriebsmitarbeiter kann Active oder Inactive sein
- todo_type – eine Art von Aufgabe, entweder Task oder Meeting
- todo_desc – Beschreibung einer Aufgabe wie Follow Up Email, Phone Call, Conference usw.
- roles – ein Benutzer kann entweder Sales Rep oder Manager sein
Vollständiges Datenbankschema-Diagramm
Ein Datenbankschema ist die Struktur, die die logische Ansicht (Tabellen, Ansichten, Primär- und Fremdschlüssel) der gesamten Datenbank darstellt. Ein Datenbankschema umfasst Entitäten und die Beziehungen zwischen ihnen.
Es ist eine gute Praxis, für jede Tabelle in einer relationalen Datenbank einen Primärschlüssel zu haben. Ein Primärschlüssel ist ein eindeutiger Identifikator für jeden Datensatz. Es kann die Sozialversicherungsnummer (SSN), die Fahrzeugidentifikationsnummer (VIN) oder einfach eine automatisch inkrementierende Zahl sein (eine eindeutige Nummer, die generiert wird, wenn ein neuer Datensatz in eine Tabelle eingefügt wird).
Unten sehen Sie das Datenbankdiagramm unseres einfachen CRM. Das Schlüsselsymbol in jeder Tabelle stellt den Primärschlüssel der Tabelle dar. Die Lupe zeigt den Fremdschlüssel an, der eine andere Tabelle in der Datenbank verknüpft. Manchmal nennen wir sie die „Lookup“-Tabelle.

install.sql
Sobald Sie die Struktur der Datenbanktabellen verstanden haben, finden Sie das Skript install.sql im db-Ordner und verwenden Sie ein MySQL-Tool wie MySQL Workbench oder Sequel Pro, um das SQL-Skript auszuführen. Es sollte eine neue relationale Datenbank namens custom_crm und ihre Datenbanktabellen erstellen.
phpGrid einrichten
Unser einfaches CRM enthält viele Datagrids. Das Datagrid ist eine Tabellenkalkulations-ähnliche Datentabelle, die Zeilen und Spalten anzeigt, die Datensätze und Felder aus der Datenbanktabelle darstellen. Das Datagrid gibt dem Endbenutzer die Möglichkeit, Datenbanktabellen auf einer Webseite zu lesen und zu schreiben.
Wir entscheiden uns für ein Datagrid-Tool von phpGrid, um das Datagrid zu erstellen. Der Grund für die Verwendung eines Tools anstelle des Erstellens von Grund auf ist, dass die Entwicklung des Datagrids normalerweise extrem mühsam und fehleranfällig ist. Die Datagrid-Bibliothek kümmert sich mit wenig Code um alle internen CRUD-Operationen (Create, Remove, Update, Delete) der Datenbank für uns, mit besseren und schnelleren Ergebnissen.
Um phpGrid zu installieren, befolgen Sie diese Schritte
- Entpacken Sie die heruntergeladene phpGrid-Datei
- Laden Sie den phpGrid-Ordner in den Ordner `phpGrid` hoch
- Schließen Sie die Installation ab, indem Sie die Datei `conf.php` konfigurieren
Bevor wir mit dem Codieren beginnen, müssen wir die Datenbankinformationen in conf.php, der phpGrid-Konfigurationsdatei, angeben. Hier ist ein Beispiel für Datenbankverbindungseinstellungen
define('PHPGRID_DB_HOSTNAME', 'localhost');
define('PHPGRID_DB_USERNAME', 'root');
define('PHPGRID_DB_PASSWORD', '');
define('PHPGRID_DB_NAME', 'custom_crm');
define('PHPGRID_DB_TYPE', 'mysql');
define('PHPGRID_DB_CHARSET','utf8');
- PHPGRID_DB_HOSTNAME – IP oder Hostname des Webservers
- PHPGRID_DB_USERNAME – Datenbank-Benutzername
- PHPGRID_DB_PASSWORD – Datenbank-Passwort
- PHPGRID_DB_NAME – Datenbankname unseres CRM
- PHPGRID_DB_TYPE – Datenbanktyp
- PHPGRID_DB_CHARSET – immer ‚utf8‘ in MySQL
Seitenvorlage

Bevor wir mit dem Erstellen unserer ersten CRM-Seite beginnen können, ist es eine gute Praxis, die Seitenelemente wiederverwendbar zu machen, wie Kopfzeile und Fußzeile.
Die Seite wird aus einer Kopfzeile, einem Menü, einem Körper und einer Fußzeile bestehen. Wir beginnen mit der Erstellung einer wiederverwendbaren Seitenvorlage.
head.php
Dies ist eine grundlegende HTML5-Vorlagenkopfzeile. Sie enthält einen Link zu einer benutzerdefinierten Stylesheet, die in einem späteren Schritt erstellt wird.
menu.php

Beachten Sie die Verwendung von $_GET['currentPage']. Jede Seite setzt einen Wert, der den Namen der aktuellen Seite in der oberen Menüleiste hervorhebt.
Fügen Sie den folgenden Code in style.css für die Menügestaltung ein. Er verwandelt die obige unsortierte Liste in ein Menü.
#menu ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #1590C2;
}
#menu ul li {
float: left;
}
#menu ul li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
#menu ul li a:hover,
#menu .active {
background-color: #ddd;
color: black;
}
footer.php
Schließende Tags für die Elemente, die wir in der Kopfzeile geöffnet haben
Unsere vollständige wiederverwendbare Seitenvorlage
Dies ist die vollständige Seitenvorlage. Der Hauptinhalt wird nach Section Title eingefügt.
Mein benutzerdefiniertes CRM
Abschnittstitel
Hauptseiten des CRM
Sind Sie noch dabei? Gut! Wir können nun endlich die erste Seite in unserem CRM entwickeln.
Unser CRM für Vertriebsmitarbeiter hat vier Seiten
- Aufgaben
- Leads
- Opportunities
- Kunden/Gewonnen
Jede Seite steht für eine andere Phase in einem typischen Verkaufszyklus.
Design-Mockup
Hier ist unser CRM-Design-Mockup für die Vertriebsmitarbeiter.

Aufgaben
Wenn sich ein Vertriebsmitarbeiter anmeldet, ist die erste Seite, die er sieht, eine Liste der aktuellen Aufgaben.
Wie Sie sich vielleicht erinnern, speichert unsere notes-Tabelle alle Informationen zu Vertriebsaktivitäten. Wir können ein Datagrid erstellen und es mithilfe von phpGrid aus der Notes-Tabelle befüllen.
Der Hauptinhalt der Tasks-Seite ist ein Datagrid. Die folgenden beiden Zeilen geben uns eine Liste der Aufgaben des aktuellen Vertriebsmitarbeiters.
display();
?>
- Die erste Zeile erstellt ein phpGrid-Objekt, indem sie die SELECT-SQL-Anweisung, ihren Primärschlüssel –
ID– und dann den Namen der Datenbanktabelle –notes– übergibt. - Die zweite und letzte Zeile ruft die Funktion display() auf, um das Datagrid auf dem Bildschirm darzustellen. Schauen Sie sich die Basis-Datagrid-Demo für weitere Details an.
Leads
Die Leads-Seite enthält eine Liste der aktuellen Leads, für die der Vertriebsmitarbeiter verantwortlich ist. Jeder Lead kann eine oder mehrere Notizen haben. Wir verwenden dafür die Subgrid-Funktion von phpGrid.
Wir müssen auch set_query_filter() verwenden, um nur die Leads mit Status = 1 und nur für den aktuellen Vertriebsmitarbeiter anzuzeigen.
Kontaktstatus-Tabelle

set_query_filter(" Status = 1 && sales_rep = 1 ");
// the detail grid displays notes about a lead
$sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
$sdg->set_query_filter(" Sales_Rep = 1 ");
$sdg->enable_edit();
$dg->set_subgrid($sdg, 'Contact', 'id');
$dg -> display();
?>
Möglichkeiten
Ein Lead wird zu einer Opportunity, sobald er qualifiziert ist. Die Opportunities-Seite ist ähnlich wie die Leads-Seite. Der einzige Unterschied ist der gefilterte Statuscode in set_query_filter, der Status = 2 lautet.
set_query_filter(" Status = 2 && sales_rep = 1 ");
$sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
$sdg->set_query_filter(" Sales_Rep = 1 ");
$sdg->enable_edit();
$dg->set_subgrid($sdg, 'Contact', 'id');
$dg -> display();
?>
Kunden/Gewonnen
Kunden/Gewonnen hat den Status = 3. Ähnlich wie bei Leads und Opportunities können Kunden/Gewonnen auch Notizen haben.
set_query_filter(" Status = 3 && sales_rep = 1 ");
$sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
$sdg->set_query_filter(" Sales_Rep = 1 ");
$sdg->enable_edit();
$dg->set_subgrid($sdg, 'Contact', 'id');
$dg -> display();
?>
Das ist alles, was es für Vertriebsmitarbeiter in unserem einfachen CRM zu tun gibt.
Manager-Dashboard
Der Vertriebsmanager hat Zugriff auf alle Datensätze in der Vertriebspipeline sowie die Möglichkeit, das Vertriebsteam und Kundendaten zu verwalten.
Hier sind die Design-Mockups

Menü
Das Manager-Dashboard hat drei Menüpunkte.

Hauptinhalt
Jeder Menüpunkt repräsentiert eine Tabelle in der CRM-Datenbank. $_GET['gn'] speichert den Tabellennamen. Es generiert dynamisch das Datagrid basierend auf dem übergebenen Tabellennamen.
set_subgrid($sdg, 'sales_rep', 'id');
break;
case "notes":
$dg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
break;
case "contact":
$dg = new C_DataGrid("SELECT * FROM contact", "id", "contact");
$sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
$sdg->enable_edit();
$dg->set_subgrid($sdg, 'Contact', 'id');
break;
}
$dg->enable_edit();
$dg->display();
?>
Mein Vertriebsmitarbeiter
Da ein Vertriebsmanager schnell herausfinden muss, mit wem ein Vertriebsmitarbeiter zusammenarbeitet, haben wir ein Detailgitter $sdg hinzugefügt, das aus der Kontakt-Tabelle gefüllt und mit dem übergeordneten Gitter verknüpft ist.
$sdg = new C_DataGrid("SELECT * FROM contact", "id", "contact");
$dg->set_subgrid($sdg, 'sales_rep', 'id');
sales_rep ist der Verbindungsschlüssel in der contact-Tabelle zum id, das der Fremdschlüssel in der users-Tabelle ist. Denken Sie daran, dass die users alle Informationen unserer Vertriebsmitarbeiter speichert.
Screenshots


Interaktive Demo
CRM-Bildschirm für Vertriebsmitarbeiter
CRM-Bildschirm für Manager
Welche App hast du zur Erstellung des Datenbankdiagramms verwendet? Ich benutze Visio und es scheint mit jeder Überarbeitung schlechter zu werden. Toller Artikel!
Danke! Das Datenbankdiagramm wurde mit DBSchema von dbschema.com erstellt. Es ist super!
… Ich weiß nicht, Mann.
PHP-Anwendungen ohne ein strukturiertes Framework wie Symfony oder Laravel oder was auch immer zu entwickeln, fühlt sich für mich einfach *falsch* an. Ich konnte es ertragen, keinen ORM zu haben, aber wir haben auf die harte Tour gelernt, dass die Vermischung von HTML und PHP-Anweisungen in derselben Datei – de facto die Verwendung von PHP als Template-Engine – leicht zu dem chaotischsten Spaghetti-Code führt.
Darüber hinaus, wenn wir Anfängern etwas beibringen, würde ich ihnen vorschlagen, PHP 7 von Anfang an zu verwenden.
Außerdem ist PSR-0 als Codierstil in der PHP-Community weit verbreitet. Ich bin kein Fan von dogmatischen CSs, aber für PHP würde ich mich daran halten.
Ich weiß Ihr Feedback zu schätzen. CRM ist keine einfache Sache, die man leicht implementieren kann. Das Tutorial ist jedoch absichtlich so einfach wie möglich für Anfänger gehalten. Es kann sicherlich mit einem Framework wie Laravel oder CodeIgniter integriert werden. Das ist nicht so schwer. Für zukünftige Tutorials, wie Teil II, ist das auf jeden Fall etwas, das erforscht werden kann.
Ich stimme zu. Es gibt kaum noch einen Anwendungsfall für PHP-Anwendungen ohne mindestens ein Framework wie Slim, geschweige denn PHP-Anwendungen ohne eine Templating-Engine wie Twig oder Blade, die sie unterstützt.
Außerdem, eine kleine Anmerkung: PSR-0 ist veraltet, PSR-4 sollte stattdessen für einen Autoloading-Standard verwendet werden. Wenn Sie die Codierstilrichtlinien meinen, verwechseln Sie wahrscheinlich PSR-0 mit PSR-1 und PSR-2 ;-)
@Sven Luijten Bitte schauen Sie hier: http://phpgrid.com/example/phpgrid-laravel-5-and-bootstrap-3-part-ii-improved-version/
Ich habe versucht, daran zu arbeiten, und bin seit Stunden keinen Schritt weitergekommen. Ich kann nicht für alle sprechen, aber als Anfänger bin ich mit phpmyadmin am vertrautesten. Sie schlagen vor, „wie MySQL Workbench oder Sequel Pro, um das SQL-Skript auszuführen“. Das funktioniert vielleicht, aber ich konnte es mit WAMP nicht zum Laufen bringen. Wenn ich versuche, das Installationsskript zu importieren, erhalte ich verschiedene Fehler. Dies ist der neueste: #1100 – Table ‘pma__column_info’ was not locked with LOCK TABLES
Stellen Sie sicher, dass Sie sich als MySQL-Administrator angemeldet haben und über die Berechtigung
LOCK TABLESverfügen.Siehe hier: phpMyAdmin Lock Table
Ich habe herausgefunden, dass Sie zuerst die Datenbank erstellen müssen.
Obwohl dies ein schönes Tutorial ist, ist phpGrid mit CRUD-Bearbeitungsunterstützung jetzt hinter phpGrid PRO gesperrt. Während ich glaube, dass Sie das Tutorial abschließen können (kommentieren Sie use phpGrid\C_DataGrid; aus, wenn Sie PHP 7 verwenden), wäre es schön, den Leuten zu zeigen, wie man es mit jqgrid für PHP macht (da phpGrid ein Wrapper für jqgrid ist).
Tolle Beobachtung. Leider wäre das kein „Anfänger“-Leitfaden. Der Zweck dieses Tutorials ist es, einfach ein CRM zu erstellen, ohne dass die Leser vor den inneren Abläufen von jqGrid zurückschrecken. Es würde sie nur überfordern und mit den kniffligen Details verlieren lassen. Das sollte nichts sein, worüber sich Entwickler zu diesem Zeitpunkt Sorgen machen müssen. Es kann in zukünftigen Tutorials besser erklärt werden.
Warnung: include_once(../phpGrid_Lite/conf.php) [function.include-once]: failed to open stream: No such file or directory in C:\wamp\www\project\phpgrid-custom-crm-master\sales\tasks.php on line 2
Warnung: include_once() [function.include]: Failed opening ‘../phpGrid_Lite/conf.php’ for inclusion (include_path=’.;C:\php\pear’) in C:\wamp\www\project\phpgrid-custom-crm-master\sales\tasks.php on line 2
Ich bekomme Fehler bei allen Menüpunkten Aufgaben, Leads, Opportunities, Kunden/Gewonnen.
Darf ich auch fragen, in welcher Zeile Sie die phpGrid-Datenbank bearbeiten?
PS. Ich bin neu hier.
Es scheint, dass die php-Datagrid-Bibliothek fehlt. Sie können die kostenlose Bibliothek hier erhalten und dann die Datei in den Ordner
phpGrid_Liteextrahieren. Stellen Sie sicher, dass Sie die Datenbankinformationen von phpGrid einrichten.Welches Werkzeug wird zur Erstellung von Design-Mockups verwendet?
Es heißt Balsamiq. URL: https://balsamiq.com/