id: 79 name: createSubscription description: 'Snippet to create new Subscription from $POST of Digistore24' category: knit properties: 'a:0:{}' ----- /** * createSubscription snippet for knit extra * * Copyright 2021 by Iris Hammer iris.hammer@justknit.de * Created on 10-04-2021 * * knit is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * knit is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * knit; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * @package knit */ /** * Description * ----------- * Snippet to create new Subscription from $POST of Digistore24 * * Variables * --------- * @var $modx modX * @var $scriptProperties array * * @package knit **/ /** * Mit desem Snippet muss die Eintragung eines neuen Users erfolgen, wenn der Aufruf von Digistor24 per $POST erfolgt. * */ /** * Nicht * * $fields = array( 'pagetitle' => 'Test Page', 'alias' => 'test-page', 'menutitle' => 'Testing',); * $resource = $modx->newObject('modDocument', $fields); * // save it to the database * $resource->save(); * return '
Resource created
'; * * sondern mit $this->runProcessor(); ???? * Nein das brauch ich nicht. * Bei mir werden die User nur hier erzeugt. * Zumindest vorerst. */ /** Only make User Stuff if $_Post data come from Digistore24 * * */ $subscription = $modx->getService('subscription','KnitSubscription',$modx->getOption('knit.core_path',null,$modx->getOption('core_path').'components/knit/').'model/knit/',$scriptProperties); if (!($subscription instanceof KnitSubscription)) { $message = '[JustKnit] Could not load KnitSubscription class'; $modx->log(modX::LOG_LEVEL_ERROR,$message); $errorMsg = array('status' => 'error','message' => $message); return json_encode($errorMsg); } if (!empty($_POST)) { $arr = $modx->sanitize($_POST); if (isset($scriptProperties['typk']) && isset($arr['sha_sign'])) { $rcvSig = $arr['sha_sign']; $expSig = $subscription->dgSignature($scriptProperties['typk'], $_POST); $shaValid = $rcvSig == $expSig; if (!$shaValid) { $modx->log(modX::LOG_LEVEL_ERROR,'[JustKnit] invalid sha signature '.$expSig); return $subscription->returnJsonError('invalid sha signature '.$expSig); } } /** TODO Hier muss jetzt der username und der ganze Kram rein. D. h. ich brauche eine Funktion, die den Username ausgibt. * Die wird von hier aus der Klasse aufgerufen und verwendet die 'private functions' um den neuen user anzulegen, * ihn der Gruppe zuzuwweisen und das Passwort zu generieren. Das muss dann vllt in einem Array übergeben werden. * Die Gruppen ergeben sich aus den &products $scriptProperties. Mit denen muss dann über die ProduktId die richtige Gruppe * zugewiesen werden. * Außerdem müssen die ganzen Daten, die ich kriege noch in der JustKnitSubscribtion Tabelle gespeichert werden. * */ $subscriberData = array_merge($_POST,$scriptProperties); $modx->log(modX::LOG_LEVEL_ERROR,'[JustKnit] $_POST '.print_r($subscriberData, 1)); $userData = $subscription->subscribeUser($subscriberData); // Hier muss noch rein, wenn der User wieder aktiviert wurde und die Zugangsdaten schon vorhanden waren. if (is_array($userData)) { // if (!str_contains($userData, 'error')) { if ($userData['newUser']) { $headline = 'Hallo '.$userData['address_first_name'].', das sind deine Zugangsdaten.'; $key = 'Benutzername:'.$userData['email'].'|Passwort:'.$userData['password']; } else { $headline = 'Hallo '.$userData['address_first_name'].', du kannst dich wieder mit deiner Email und deinem Passwort anmelden.'; $key = 'Dein Username ist '.$userData['email']; } $serverData = array( 'fullname' => $userData['address_first_name'].' '.$userData['address_last_name'], 'order_id' => $userData['order_id'], 'product_name' => $userData['product_name'], 'AboEnde' => strftime('%c',$userData['blockedafter']), ); $responseData = array( 'status' => 'success', 'key' => $key, 'data' => $serverData, 'headline' => $headline, // optional - if ommited, the headline is 'Your license data' (in the user's language) // 'show_on' => array( 'receipt_page', 'invoice', 'order_confirmation_email' ), // optional - determines where to show these data in DigiStore? Defaults to: all three places // 'hidden_data_keys' => array( 'hidden_key' ), // optional - array key(s) of $license_key_data. Hide parts of $license_data from the user. You may use this to add a hidden hash value to $license_key_data. ); $response = json_encode($responseData); } else { return $userData; } } else { $modx->log(modX::LOG_LEVEL_ERROR,'[JustKnit] $_POST is empty '); return $subscription->returnJsonError('$_POST is empty'); } /* $knit = $modx->getService('knit','Knit',$modx->getOption('knit.core_path',null,$modx->getOption('core_path').'components/knit/').'model/knit/',$scriptProperties); if (!($knit instanceof Knit)) return ''; loadclass(): $modx->loadClass('KnitPatternPublish', $modelPath, true, true); public function loadClass($fqn, $path= '', $ignorePkg= false, $transient= false) $ignorePkgsagt , loadClass() ob das Paket ignoriert werden soll. Wenn es ist false, sucht MODX nach einem klassenbezogenen Paket, aber der Aufruf ist erfolgreich, unabhängig davon, ob es eines findet oder nicht by setting it to true so MODX will know to skip the package search $transient teilt addPackage mit, ob die Klasse vorübergehend ist oder nicht Wenn es false ist, teilt dies MODX mit, dass das Paket nicht vorübergehend ist, was bedeutet, dass es in der Datenbank gespeichert wird. Wenn die Klasse kein Datenbankobjekt darstellt, findet MODX keins. Der Aufruf schlägt fehl und die Klassendatei wird nicht geladen. Wenn die Klasse kein Datenbankobjekt darstellt, sollte das letzte Argument immer auf true gesetzt werden. Wenn es sich um ein Datenbankobjekt handelt und Ihr Code mit der Datenbank interagiert, sollte es auf false gesetzt werden. getService() $knit = $modx->getService('knit','Knit',$modx->getOption('knit.core_path',null,$modx->getOption('core_path').'components/knit/').'model/knit/',$scriptProperties); public function &getService($name, $class= '', $path= '', $params= array ()) getService()lädt die Klassendatei (durch Aufrufen von loadClass()), fügt die Klasse aber auch dem $modx-Objekt sp hinzu, mit dem Sie seine Methoden aufrufen können $modx‑>className->methodName() getService()gibt bei einem Fehler null zurück and as long as you include the path, you don't need to run either addPackage() or loadClass() before calling it $name ist der alias $class der tatsächliche Name der Klasse z. B. $modx->getService('lexicon', 'modLexicon') dann kann mit $message = $modx->lexicon('file_not_found') auf den alias zugegriffen werden. Wenn es sich um einen integrierten MODX-Dienst handelt muss kein Pfad angegeben werden $params kann ein assoziatives Array von Optionen enthalten, die im $scriptProperties Array innerhalb der Serviceklasse verfügbar sind $c = $modx->newQuery('JustKnitSubscriberMeta'); $c->sortby($sort,$dir); $subscribers = $modx->getCollection('JustKnitSubscriberMeta',$c); $output = ''; //$output = count($subscribers); foreach ($subscribers as $subscriber) { $subscriberArray = $subscriber->toArray(); $output .= $knit->getChunk($tpl,$subscriberArray); } //$output = count($subscribers); */ //$scriptProperties['name'] = $modx->getOption('name', $scriptProperties, $_POST['name']); //$test = array_merge($_POST,$scriptProperties,$arr); //LIZENZDATEN ist ein Datensatz mit beliebigen Key-Value-Paaren, z. B.: array(name => 'Max Mustermann', order_id => 'A1B2C3D4 usw.) // TODO: Hier muss jetzt noch rein, was an Digistore24 übergeben werden muss. $output = $response ; return $output;