Weiß jemand ob es möglich ist ein Zahlungsmodul zu kopieren um daraus eine neue Zahlunsgmethode zu machen? Konkret würde ich das Modul invoice kopieren um es geringfügig anzupassen. Weiß jemand wo ich das im Dateibaum finde?
Das ist ganz ähnlich wie beim Klonen von Versandmodulen: includes/modules/payment/invoice.php Bei Sprachdateien und Icon muss man schauen, in welche Verzeichnisse die Klone gelegt werden müssen und ob die Texte als Konstanten definiert oder Variablen hinterlegt werden müssen. Die Originale sind jedenfalls diese: lang/english/original_sections/modules/payment/invoice.lang.inc.php lang/german/original_sections/modules/payment/invoice.lang.inc.php images/icons/payment/invoice.png
@Dominik Späte Hmm, habe ich alles gemacht und funktioniert auch soweit seit einigen Monaten. Nun muss ich aber zum ersten Mail seitdem Bestelldaten manuell bearbeiten und zwar "Versandarten, Zahlungsweisen und Summen" und bekomme diesen Fehler (Siehe Bild). Offenbar fehlt eine Konstante für mein neu angelegtes Zahlungsmodul, wo kann ich das machen?
Hi Michael Gibt's einen Log-Eintrag mit näheren Angaben? So kann ich Dir nur sagen, dass beim Original-Modul die Konstante in diesen Dateien definiert wird: lang/english/original_sections/modules/payment/sepa.lang.inc.php lang/german/original_sections/modules/payment/sepa.lang.inc.php Darauf zugegriffen wird augenscheinlich nur in der includes/modules/payment/sepa.php Und da wird in aktuellen Versionen geprüft, ob die Konstante definiert ist: Code: $this->title = defined('MODULE_PAYMENT_SEPA_TEXT_TITLE') ? MODULE_PAYMENT_SEPA_TEXT_TITLE : '';
Hallo Dominik, Log EIntrag gibt es: Code: 2024-11-30 17:42:12 CRITICAL: Undefined constant "MODULE_PAYMENT_SEPA2_TEXT_TITLE" context: session ID: session-674b40640de9c6.90521439 exception: class: Error message: Undefined constant "MODULE_PAYMENT_SEPA2_TEXT_TITLE" code: 0 file: /var/www/vhosts/dogs-in-the-city.de/shop.tst/admin/orders_edit_other.php:133 extra: request: method: GET uri: /admin/orders_edit.php?edit_action=other&oID=38543 software: Apache address: 178.20.102.107 userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0 time: 229 remoteAddress: b683423ecc5975a0e30123ec05844066 query: edit_action: other oID: 38543 session: tpl: DitC_Malibu language: german languages_id: 2 language_charset: utf-8 language_code: de currency: EUR customers_status: ... customer_id: 10000 payment: shipping: cartID: sendto: billto: Vielleicht noch ein Hinweis zu meiner Vorgehensweise: Ich habe die "includes/modules/payment/sepa.php" kopiert nach "includes/modules/payment/sepa2.php" und dort alles angepasst (hoffentlich) Code: <?php /* -------------------------------------------------------------- sepa2.php 2020-02-04 Gambio GmbH http://www.gambio.de Copyright (c) 2018 Gambio GmbH Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] -------------------------------------------------------------- based on: (c) 2000-2001 The Exchange Project (earlier name of osCommerce) (c) 2002-2003 osCommerce(cod.php,v 1.28 2003/02/14); www.oscommerce.com (c) 2003 nextcommerce (sepa2.php,v 1.6 2003/08/24); www.nextcommerce.org (c) 2005 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: sepa2.php 1122 2005-07-26 10:16:27Z mz $ ) Released under the GNU General Public License ---------------------------------------------------------------------------------------*/ $languageTextManager = MainFactory::create_object('LanguageTextManager', [], true); $languageTextManager->init_from_lang_file('sepa2', $_SESSION['languages_id']); class sepa2_ORIGIN { public $code, $title, $description, $enabled; /** * @var string */ public $min_order; /** * @var string */ public $sort_order; /** * @var string */ public $info; public $order_status; public function __construct() { global $order; $this->code = 'sepa2'; $this->title = defined('MODULE_PAYMENT_SEPA2_TEXT_TITLE') ? MODULE_PAYMENT_SEPA2_TEXT_TITLE : ''; $this->description = defined('MODULE_PAYMENT_SEPA2_TEXT_DESCRIPTION') ? MODULE_PAYMENT_SEPA2_TEXT_DESCRIPTION : ''; $this->min_order = defined('MODULE_PAYMENT_SEPA2_MIN_ORDER') ? MODULE_PAYMENT_SEPA2_MIN_ORDER : '0'; $this->sort_order = defined('MODULE_PAYMENT_SEPA2_SORT_ORDER') ? MODULE_PAYMENT_SEPA2_SORT_ORDER : '0'; $this->enabled = defined('MODULE_PAYMENT_' . strtoupper($this->code) . '_STATUS') && filter_var(constant('MODULE_PAYMENT_' . strtoupper($this->code) . '_STATUS'), FILTER_VALIDATE_BOOLEAN); $this->info = defined('MODULE_PAYMENT_SEPA2_TEXT_INFO') ? MODULE_PAYMENT_SEPA2_TEXT_INFO : ''; if (defined('MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID') && (int)MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID > 0) { $this->order_status = MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID; } if (is_object($order)) { $this->update_status(); } } public function update_status() { global $order; $check_order_query = xtc_db_query("select count(*) as count from " . TABLE_ORDERS . " where customers_id = '" . (int)$_SESSION['customer_id'] . "'"); $order_check = xtc_db_fetch_array($check_order_query); if ($order_check['count'] < MODULE_PAYMENT_SEPA2_MIN_ORDER) { $check_flag = false; $this->enabled = false; } else { $check_flag = true; if (($this->enabled == true) && ((int)MODULE_PAYMENT_SEPA2_ZONE > 0)) { $check_flag = false; $check_query = xtc_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SEPA2_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id"); while ($check = xtc_db_fetch_array($check_query)) { if ($check['zone_id'] < 1) { $check_flag = true; break; } elseif ($check['zone_id'] == $order->delivery['zone_id']) { $check_flag = true; break; } } } if ($check_flag == false) { $this->enabled = false; } } } public function javascript_validation() { return false; } public function selection() { $selection = [ 'id' => $this->code, 'module' => $this->title, 'description' => $this->info, ]; return $selection; } public function pre_confirmation_check() { return false; } public function confirmation() { return false; } public function process_button() { return false; } public function before_process() { return false; } public function after_process() { if ($this->order_status) { $insertId = new IdType((int)$GLOBALS['insert_id']); /** @var OrderWriteServiceInterface $orderWriteService */ $orderWriteService = StaticGXCoreLoader::getService('OrderWrite'); $orderWriteService->updateOrderStatus($insertId, new IntType((int)$this->order_status), new StringType(''), new BoolType(false)); } } public function get_error() { return false; } public function check() { if (!isset ($this->_check)) { $check_query = xtc_db_query("select `value` from `gx_configurations` where `key` = 'configuration/MODULE_PAYMENT_SEPA2_STATUS'"); $this->_check = xtc_db_num_rows($check_query); } return $this->_check; } public function install() { xtc_db_query("insert into `gx_configurations` ( `key`, `value`, `sort_order`, `type`, `last_modified`) values ('configuration/MODULE_PAYMENT_SEPA2_STATUS', 'True', '1', 'switcher', now())"); xtc_db_query("insert into `gx_configurations` ( `key`, `value`, `sort_order`, `last_modified`) values ('configuration/MODULE_PAYMENT_SEPA2_ALLOWED', '', '0', now())"); xtc_db_query("insert into `gx_configurations` ( `key`, `value`, `sort_order`, `type`, `last_modified`) values ('configuration/MODULE_PAYMENT_SEPA2_ZONE', '0', '2', 'geo-zone', now())"); xtc_db_query("insert into `gx_configurations` ( `key`, `value`, `sort_order`, `last_modified`) values ('configuration/MODULE_PAYMENT_SEPA2_SORT_ORDER', '0', '0', now())"); xtc_db_query("insert into `gx_configurations` ( `key`, `value`, `sort_order`, `last_modified`) values ('configuration/MODULE_PAYMENT_SEPA2_MIN_ORDER', '0', '0', now())"); xtc_db_query("insert into `gx_configurations` ( `key`, `value`, `sort_order`, `type`, `last_modified`) values ('configuration/MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID', '0', '0', 'order-status', now())"); } public function remove() { xtc_db_query("delete from `gx_configurations` where `key` in ('" . implode("', '", $this->keys()) . "')"); } public function keys() { return [ 'configuration/MODULE_PAYMENT_SEPA2_STATUS', 'configuration/MODULE_PAYMENT_SEPA2_ALLOWED', 'configuration/MODULE_PAYMENT_SEPA2_ZONE', 'configuration/MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID', 'configuration/MODULE_PAYMENT_SEPA2_MIN_ORDER', 'configuration/MODULE_PAYMENT_SEPA2_SORT_ORDER' ]; } } MainFactory::load_origin_class('sepa2'); Danzu dann die "lang/german/original_sections/modules/payment/sepa.lang.inc.php" ebenfalls kopiert nach lang/german/original_sections/modules/payment/sepa2.lang.inc.php" und auch alles angepasst (hoffentlich, das Gleiche für english) Code: <?php /* -------------------------------------------------------------- sepa.lang.inc.php 2015-03-26 gm Gambio GmbH http://www.gambio.de Copyright (c) 2015 Gambio GmbH Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] -------------------------------------------------------------- */ $t_language_text_section_content_array = array ( 'JS_BANK_BIC' => '* Bitte geben Sie die BIC Ihrer Bank ein!\n\n', 'JS_BANK_IBAN' => '* Bitte geben Sie Ihre IBAN ein!\n\n', 'JS_BANK_NAME' => '* Bitte geben Sie den Namen Ihrer Bank ein!\n\n', 'JS_BANK_OWNER' => '* Bitte geben Sie den Namen des Kontobesitzers ein!\n\n', 'MODULE_PAYMENT_SEPA2_ALLOWED_DESC' => 'Gib <b>einzeln</b> die Zonen an, welche für dieses Modul erlaubt sein sollen. (z.B. AT,DE (wenn leer, werden alle Zonen erlaubt))', 'MODULE_PAYMENT_SEPA2_ALLOWED_TITLE' => 'Erlaubte Zonen', 'MODULE_PAYMENT_SEPA2_COMMUNICATE_SEPARATELY_DESC' => 'Möchtest du die Mandat-Referenz separat mitteilen?', 'MODULE_PAYMENT_SEPA2_COMMUNICATE_SEPARATELY_TITLE' => 'Mandat-Referenz separat mitteilen', 'MODULE_PAYMENT_SEPA2_CREDITOR_ID_DESC' => 'Gib hier deine Gläubiger-ID ein.', 'MODULE_PAYMENT_SEPA2_CREDITOR_ID_TITLE' => 'Gläubiger-ID', 'MODULE_PAYMENT_SEPA2_DATABASE_BLZ_DESC' => 'Möchtest du die Datenbanksuche für die BLZ verwenden?', 'MODULE_PAYMENT_SEPA2_DATABASE_BLZ_TITLE' => 'Datenbanksuche für die BLZ verwenden?', 'MODULE_PAYMENT_SEPA2_DATACHECK_DESC' => 'Sollen die eingegebenen Bankdaten überprüft werden?', 'MODULE_PAYMENT_SEPA2_DATACHECK_TITLE' => 'Bankdaten prüfen?', 'MODULE_PAYMENT_SEPA2_FAX_CONFIRMATION_DESC' => 'Möchtest du die Fax-Bestätigung erlauben?', 'MODULE_PAYMENT_SEPA2_FAX_CONFIRMATION_TITLE' => 'Fax Bestätigung erlauben', 'MODULE_PAYMENT_SEPA2_MIN_ORDER_DESC' => 'Die Mindestanzahl an Bestellungen die ein Kunden haben muss damit die Option zur Verfügung steht.', 'MODULE_PAYMENT_SEPA2_MIN_ORDER_TITLE' => 'Notwendige Bestellungen', 'MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID_DESC' => 'Bestellungen, welche mit diesem Modul gemacht werden, auf diesen Status setzen', 'MODULE_PAYMENT_SEPA2_ORDER_STATUS_ID_TITLE' => 'Bestellstatus festlegen', 'MODULE_PAYMENT_SEPA2_SEND_MANDATE_DESC' => 'Möchtest du das Mandat-Formular mit der Bestellbestätigung senden?', 'MODULE_PAYMENT_SEPA2_SEND_MANDATE_TITLE' => 'Mandat-Formular senden?', 'MODULE_PAYMENT_SEPA2_SORT_ORDER_DESC' => 'Reihenfolge der Anzeige. Kleinste Ziffer wird zuerst angezeigt.', 'MODULE_PAYMENT_SEPA2_SORT_ORDER_TITLE' => 'Anzeigereihenfolge', 'MODULE_PAYMENT_SEPA2_STATUS_DESC' => 'Möchten Sepa Zahlungen erlauben?', 'MODULE_PAYMENT_SEPA2_STATUS_TITLE' => 'Sepa Zahlungen erlauben', 'MODULE_PAYMENT_SEPA2_TEXT_BANK' => 'SEPA', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_BIC' => 'BIC:', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR' => 'FEHLER: ', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_1' => 'IBAN und BLZ stimmen nicht überein, bitte korrigieren Sie Ihre Angabe.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_10' => 'Sie haben keinen Kontoinhaber angegeben.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_11' => 'Sie haben keine IBAN angegeben.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_12' => 'Die angegebene IBAN enthält keine Prüfziffer. Bitte kontrollieren Sie Ihre Eingabe nochmals.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_13' => 'Sie haben keine korrekte IBAN eingegeben.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_14' => 'Sie haben keine BIC angegeben.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_15' => 'Sie haben keine korrekte BIC eingegeben.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_16' => 'Sie haben keinen Banknamen angegeben.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_2' => 'Diese IBAN ist nicht prüfbar, bitte kontrollieren zur Sicherheit Sie Ihre Eingabe nochmals.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_3' => 'Diese IBAN ist nicht prüfbar, bitte kontrollieren zur Sicherheit Sie Ihre Eingabe nochmals.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_4' => 'Diese IBAN ist nicht prüfbar, bitte kontrollieren zur Sicherheit Sie Ihre Eingabe nochmals.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_ERROR_5' => 'Die aus der IBAN resultierende BLZ existiert nicht, bitte kontrollieren zur Sicherheit Sie Ihre Eingabe nochmals.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_FAX' => 'Kontodaten werden mit dem SEPA-Lastschriftmandat gesendet.', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_IBAN' => 'IBAN:', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_INFO' => '', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_NAME' => 'Bank:', 'MODULE_PAYMENT_SEPA2_TEXT_BANK_OWNER' => 'Kontoinhaber:', 'MODULE_PAYMENT_SEPA2_TEXT_DESCRIPTION' => 'SEPA', 'MODULE_PAYMENT_SEPA2_TEXT_EXISTING_MANDATE_HINT' => 'Hinweis:<br />Sie haben SEPA-Lastschrift als Zahlungsweise ausgewählt. Da bereits ein SEPA-Lastschriftmandat für Ihr angegebenes Konto vorliegt,<br />können wir die Lastschrift ohne zusätzliche Authentifizierung durchführen und die Ware im Anschluss versenden.<br />Sollten Sie weitere Fragen zu SEPA-Zahlungen haben, wenden Sie sich bitte an Ihr Kreditinstitut.', 'MODULE_PAYMENT_SEPA2_TEXT_INFO' => '', 'MODULE_PAYMENT_SEPA2_TEXT_NEW_MANDATE_HINT' => 'Hinweis:<br />Sie haben SEPA-Lastschrift als Zahlungsweise ausgewählt. Mit dieser Bestellbestätigung erhalten Sie ein SEPA-Lastschriftmandat,<br />welches unterschrieben an uns zurückgeschickt werden muss.<br />Erst nachdem das Mandat eingereicht wurde, kann die Lastschrift unsererseits erfolgen und die Ware versendet werden.<br />Sollten Sie weitere Fragen zu SEPA-Zahlungen haben, wenden Sie sich bitte an Ihr Kreditinstitut.', 'MODULE_PAYMENT_SEPA2_TEXT_NOTE' => 'Hinweis:', 'MODULE_PAYMENT_SEPA2_TEXT_NOTE2' => 'Wenn Sie aus Sicherheitsbedenken keine Bankdaten über das Internet<br />übertragen wollen, können Sie uns die Bankdaten mit dem SEPA-Lastschriftmandat zusenden.', 'MODULE_PAYMENT_SEPA2_TEXT_TITLE' => 'SEPA-Lastschriftverfahren', 'MODULE_PAYMENT_SEPA2_ZONE_DESC' => 'Wenn eine Zone ausgewählt ist, gilt die Zahlungsmethode nur für diese Zone.', 'MODULE_PAYMENT_SEPA2_ZONE_TITLE' => 'Zahlungszone', 'MODULE_PAYMENT_TYPE_PERMISSION' => 'sepa' ); Liegen die ggf. im falschen Verzeichnis?
Sind auch bei 4.8.0.3 und die sepa.php ist anders als Deine. Beispiel-Code ab Zeile 107: Code: public function selection() { global $order; $t_sepa_owner = ($order->billing['firstname'] ?? null) . ' ' . ($order->billing['lastname'] ?? null); if (trim($_SESSION['sepa_owner'] ?? '') != '') { $t_sepa_owner = $_SESSION['sepa_owner']; } $t_sepa_iban = ''; if (trim($_SESSION['sepa_iban'] ?? '') != '') { $t_sepa_iban = $_SESSION['sepa_iban']; } $t_sepa_bic = ''; if (trim($_SESSION['sepa_bic'] ?? '') != '') { $t_sepa_bic = $_SESSION['sepa_bic']; } $t_sepa_bankname = ''; if (trim($_SESSION['sepa_bankname'] ?? '') != '') { $t_sepa_bankname = $_SESSION['sepa_bankname']; } $selection = [ 'id' => $this->code, 'module' => $this->title, 'description' => $this->info, 'fields' => [ [ 'title' => MODULE_PAYMENT_SEPA_TEXT_BANK_OWNER, 'field' => xtc_draw_input_field('sepa_owner', htmlentities_wrapper($t_sepa_owner), 'style="width:200px"') ], [ 'title' => MODULE_PAYMENT_SEPA_TEXT_BANK_IBAN, 'field' => xtc_draw_input_field('sepa_iban', htmlentities_wrapper($t_sepa_iban), 'maxlength="32" style="width:200px" id="sepa_iban"') . xtc_draw_hidden_field('recheckok', htmlentities_wrapper($_GET['recheckok'] ?? null)) . $this->getIbanCheckJavaScriptCode() ], ] ]; $selection['fields'][] = [ 'title' => MODULE_PAYMENT_SEPA_TEXT_BANK_BIC, 'field' => xtc_draw_input_field('sepa_bic', htmlentities_wrapper($t_sepa_bic), 'maxlength="11" style="width:200px"') ]; $selection['fields'][] = [ 'title' => MODULE_PAYMENT_SEPA_TEXT_BANK_NAME, 'field' => xtc_draw_input_field('sepa_bankname', htmlentities_wrapper($t_sepa_bankname), 'maxlength="32" style="width:200px"') ]; if (MODULE_PAYMENT_SEPA_FAX_CONFIRMATION == 'true') { $selection['fields'][] = [ 'title' => MODULE_PAYMENT_SEPA_TEXT_NOTE, 'field' => '<div>' . MODULE_PAYMENT_SEPA_TEXT_NOTE2 . '</div>' ]; $selection['fields'][] = [ 'title' => MODULE_PAYMENT_SEPA_TEXT_BANK_FAX, 'field' => xtc_draw_checkbox_field('sepa_fax', 'on') ]; } $selection['logo_url'] = $this->getLogoUrl(); return $selection; } Eventuell hat es was damit zu tun?!
@marmoles Stimmt! Komisch. Werde ich checken. Danke! Nachtrag: Ist tatsächlich unterschiedlich gewesen. Keine Ahnung wie das zustande gekommen ist. Habe das jetzt aus dem sepa.php erneut kopiert und alles auf sepa2 angepasst. Dann das Zahlugnsmodul deinstalliert, Caches geleert, neu installiert. Leider immer noch derselbe Fehler in den Bestellbearbeitung. EDIT: Habe mir jetzt anders beholfen und eine andere Zahlungsweise entsprechend angepasst.