In Bezug auf den Beitrag von Michael O. Produktbeschreibung für Kunden biete ich euch hier ein Script und die entsprechende Anleitung wie man die Produkttabelle im Kundenbereich um ein Feld erweitert damit der Kunde eine benutzerdefinitierte Beschreibung hinzufügen kann um sein Produkt besser identifizieren zu können.
Das Script wird kostenlos bereitgestellt, ein weiterverkauf des Scriptes ist nicht gestattet. Veröffentlichung des Scriptes auf anderen Seiten sind nur mit einem Quellverweis mit Link gestattet. Das Script wird so wie es ist angeboten, es gibt keinen kostenlosen Support und es wird auch keine Haftung übernommen. Getestet wurde es mit WHMCS 7.4 (sollte aber auch auf 7.0-7.3 laufen) und dem Six Template, hierauf wird sich auch die Anleitung beziehen, bei einem abweichendem Template, oder WHMCS Version, müsst Ihr selbst schauen wie die Anpassungen umzusetzen sind.
Lege von jeder zu bearbeitenden Datei VORHER ein Backup an!!
Schritt 1:
Lade dir von Github die bootstrap-editable.css und die bootstrap-editable.js von x-editable herunter: x-editable/dist/bootstrap3-editable at develop · vitalets/x-editable · GitHub und lade die beiden Dateien in dein Template Verzeichnis hoch (also /templates/TEMPLATE/css/ bzw. /templates/TEMPLATE/js/
Schritt 2:
lege eine Datenbanktabelle mit dem Namen mod_product_comment und den Feldern:
- ID (integer, Auto Increment)
- PID (int)
- KID (int)
- Comment (Text)
an.
Schritt 3:
füge in deinen Sprachdateien für den Kundenbereich 2 Strings ein:
$_LANG['custom_description'] = "Beschreibung";
$_LANG['custom_description_na'] = "Nicht angegeben";
Schritt 4:
Öffne die clientareaproducts.tpl und ersetze
<tr onclick="clickableSafeRedirect(event, 'clientarea.php?action=productdetails&id={$service.id}', false)">
durch
dies entfernt den Link, sprich wenn der Kunde nun auf die Zeile klickt wird er nicht mehr sofort zu den Produktdetails weitergeleitet. Dies ist nötig da ein Klick auf den zu hinterlegenden Text sonst immer automatisch zur Produktdetailsseite führen würde. Damit der Kunde weiterhin Zugriff auf seine Produktdetails hat, musst du das Template entweder ändern das die anderen Zellen einen Link erhalten, oder du fügst einen "Details" Button ein welcher den Kunden zum Produkt führt.
füg oben in der TPL Datei den Pfad zu der js und css Datei ein.
<link href="templates/{$template}/css/bootstrap-editable.css" rel="stylesheet"/>
<script src="templates/{$template}/js/bootstrap-editable.js"></script>
dadrunter fügt Ihr folgendes ein
<script>
$.fn.editable.defaults.mode = 'inline';
$(document).ready(function() {
$('.change_comment').editable({
params: function(params) {
params.token = $(this).attr('data-token');
params.cid = $(this).attr('data-cid');
return params;
}
});
});
</script>
Alles anzeigen
fügt dann im Tabellen Kopf an der gewünschten Stelle eine weitere Spalte ein
Ersetze die WHMCS eigene Smarty Variable
durch eine neue (die Variable $services_new enthält die selben Daten wie die WHMCS eigene $services + die die für die Funktion nötig sind):
füge dann die folgende Spalte im Tabellenbody für den Kommentar in der Tabelle ein. Danach kannst du die clientareaproducts.tpl speichern und hochladen.
<td><a class="change_comment" id=update_comment data-type="text" data-pk={$service.id} data-cid={$clientsdetails.userid} data-token={$service.token} data-url="../update_comment.php" data-name="update_comment">{$service.comment}</a></td>
Schritt 5:
Damit der Kundenbereich die nötigen Daten bekommt benötigen wir eine Hookdatei. Erstelle eine php Datei mit dem unten stehenden Inhalt und lade diese nach /includes/hooks/
<?php
use Illuminate\Database\Capsule\Manager as Capsule;
##### Create a new Smarty var which contains all Data of $services and additional vars for the commentfunction
function comment_add_to_var($templateVariables){
global $smarty;
if (strpos($_SERVER['SCRIPT_NAME'], 'clientarea.php') == true){
$i=0;
$lang = $smarty->get_template_vars('LANG');
$comment_var = array();
foreach ($templateVariables as $name => $variable) {
$elements = count($variable);
$elements = $elements-1;
for ($i = 0; $i <= $elements; $i++) {
$product_comment = '';
$product_token = '';
if($name == 'services'){
$check_entry = Capsule::table('mod_product_comment')->where('PID',$variable[$i]['id'])->where('KID',$templateVariables['clientsdetails']['id'])->count();
if($check_entry != '0'){
$get_comment = Capsule::table('mod_product_comment')->where('PID',$variable[$i]['id'])->where('KID',$templateVariables['clientsdetails']['id'])->first();
$product_token = md5($variable[$i]['id'].".".$templateVariables['clientsdetails']['id']. "." .$get_comment->ID); //create a token
if($get_comment->Comment == ''){
$product_comment = $lang['custom_description_na'];
}else{
$product_comment = $get_comment->Comment;
}
}else{
$product_comment = $lang['custom_description_na'];
$product_token = $product_token = md5($variable[$i]['id'].".".$templateVariables['clientsdetails']['id']. "."."0"); //create a token
}
$variable[$i]['comment'] = $product_comment;
$variable[$i]['token'] = $product_token;
$comment_var = $variable;
}
}
}
$description = $smarty->assign(array('services_new' => $comment_var));
}
}
##### Delete database entry if the product has been deleted.
function comment_delete_product($vars){
Capsule::table('mod_product_comment')->where('PID',$vars['pid'])->delete();
}
##### Delete database entries if the customer has been deleted.
function comment_delete_client($vars){
Capsule::table('mod_product_comment')->where('KID',$vars['userid'])->delete();
}
add_hook("ClientAreaPage",1,"comment_add_to_var");
add_hook("ProductDelete",1,"comment_delete_product");
add_hook("ClientDelete",1,"comment_delete_client");
Alles anzeigen
Schritt 6:
erstelle eine PHP Datei namens update_comment.php, und füge folgenden Code ein:
<?php
require_once("init.php");
use Illuminate\Database\Capsule\Manager as Capsule;
$ref = $_SERVER['HTTP_REFERER'];
$refData = parse_url($ref);
if($refData['host'] == 'client.domain.com'){ //only allow post requests from the URL "client.domain.com"
if($_POST['name'] == 'update_comment'){
if($_POST['token'] != '' && $_POST['cid'] != '' && $_POST['pk'] != ''){
$check_entry = Capsule::table('tblhosting')->where('id',$_POST['pk'])->where('userid',$_POST['cid'])->count(); //check if submitted PID and KID match Database
if($check_entry == '1'){
$check_exist_entry = Capsule::table('mod_product_comment')->where('PID',$_POST['pk'])->where('KID',$_POST['cid'])->count();
if($check_exist_entry == '0'){
$product_token = md5($_POST['pk'].".".$_POST['cid']. "."."0"); //create a token
if($product_token == $_POST['token']){ //Check if the submitted token matches the token from the submitted KID and PID.
try {
$insertEntry = Capsule::table('mod_product_comment')
->insert(['ID' => NULL,'KID' => $_POST['cid'],'PID' => $_POST['pk'],'Comment'=> $_POST['value']]);
}catch (\Exception $e) {
logModuleCall('comment', 'error', $e);
}
}
}else{
$get_id = Capsule::table('mod_product_comment')->where('PID',$_POST['pk'])->where('KID',$_POST['cid'])->first();
$product_token = md5($_POST['pk'].".".$_POST['cid']. "." .$get_id->ID); //create a token
if($product_token == $_POST['token']){ //Check if the submitted token matches the token from the submitted KID and PID.
try {
$updatedentry = Capsule::table('mod_product_comment')
->where('PID', $_POST['pk'])
->where('KID', $_POST['cid'])
->update(['Comment' => $_POST['value']]);
}catch (\Exception $e) {
logModuleCall('comment', 'error', $e);
}
}
}
}
}
}
}
Alles anzeigen
und lade die Datei ins Hauptverzeichnis deiner WHMCS Installation hoch. Die Datei kann auch in einen Unterordner geladen werden, dann muss aber der Pfad für init.php und data-url="../update_comment.php" in der tpl Datei angepast werden.
Schritt 7:
Passe in der update_comment.php noch die Domain an, welche Daten liefern kann (Zeile 8 im Code).
Nachdem alles korrekt umgesetzt wurde hat der Kunde nun die Möglichkeit im Kundenbereich Kommentare zu seinen Produkten zu hinterlegen. Somit kann er z.B. bei Lizenzen schreiben für auf welchem Server diese eingesetzt wird. Aussehen sollte das ganze dann so (Farbe und unterstreichen kann über die bootstrap-editable.css angepasst werden):