Wie kann man Updatessicher neue Menüpunkte an Admin-Menü einfügen? folgende Arbeiten habe ich schon gemacht: 1: Ein neues Modul in Ordner admin angelegt. 2: Die Datei:- lang/german/sections/-samples/admin_menu.lang.inc.php angepasst und in Ordner ../sections gespeichert PHP: <?php/* -------------------------------------------------------------- admin_menu.lang.inc.php 2014-08-05 gm Gambio GmbH http://www.gambio.de Copyright (c) 2014 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( // BOF CP 'BOX_HEADING_CP' => 'CP Module', 'BOX_PRODUCTS_EDIT' => 'Artikel Preise Ändern', // EOF CP 'BOX_HEADING_FAVS' => 'FAVS', 'BOX_HEADING_LAYOUT_DESIGN' => 'Layout / Design', 'BOX_HEADING_GAMBIO_SEO' => 'Gambio SEO', 'BOX_HEADING_CUSTOMERS' => 'Kunden', 'BOX_HEADING_PRODUCTS' => 'Artikel', 'BOX_HEADING_MODULES' => 'Module', 'BOX_HEADING_STATISTICS' => 'Statistiken', 'BOX_HEADING_TOOLS' => 'Toolbox', 'BOX_HEADING_GV_ADMIN' => 'Gutscheine', 'BOX_HEADING_ZONE' => 'Land/Steuer', 'BOX_HEADING_CONFIGURATION' => 'Konfiguration', 'BOX_GM_STYLE_EDIT' => 'Template-Einstellungen', 'BOX_GM_LOGO' => 'Logo Manager', 'BOX_GM_LIGHTBOX' => 'Lightbox Konfiguration', 'BOX_GM_SLIDER' => 'Teaser-Slider', 'BOX_GM_SEO_BOOST' => 'Gambio SEO Boost', 'BOX_GM_ANALYTICS' => 'Tracking-Codes', 'BOX_GM_META' => 'Meta-Angaben', 'BOX_ROBOTS' => 'Robots Datei', 'BOX_GM_SITEMAP' => 'Sitemap Generator', 'BOX_GM_BOOKMARKS' => 'Social Bookmarking', 'BOX_ORDERS' => 'Bestellungen', 'BOX_CUSTOMERS' => 'Kunden', 'BOX_GM_MODULE_EXPORT' => 'Kundenexport', 'BOX_CUSTOMERS_STATUS' => 'Kundengruppen', 'BOX_GM_INVOICING' => 'Rechnungsexport', 'BOX_CATEGORIES' => 'Artikel / Kategorien', 'BOX_GM_FEATURE_CONTROL' => 'Artikel-Filter', 'BOX_PRODUCTS_ATTRIBUTES' => 'Artikelattribute', 'BOX_REVIEWS' => 'Kundenrezensionen', 'BOX_QUANTITYUNITS' => 'Mengeneinheiten', 'BOX_PROPERTIES' => 'Artikeleigenschaften', 'BOX_GM_PRODUCT_EXPORT' => 'Artikelexport', 'BOX_ATTRIBUTES_MANAGER' => 'Attributverwaltung', 'BOX_IMPORT' => 'CSV Import / Export', 'BOX_PRODUCTS_EXPECTED' => 'Erwartete Artikel', 'BOX_GM_GPRINT' => 'GX-Customizer', 'BOX_MANUFACTURERS' => 'Hersteller', 'BOX_SPECIALS' => 'Sonderangebote', 'BOX_ECONDA' => 'ECONDA Shop Monitor', 'BOX_GM_GUESTBOOK' => 'G&auml;stebuch', 'BOX_GM_JANOLAW' => 'janolaw AGB Hosting', 'BOX_MODULE_EXPORT' => 'Modul-Center', 'BOX_GM_SCROLLER' => 'News-Scroller', 'BOX_PAYPAL' => 'PayPal', 'BOX_GM_TRUSTED_SHOP_ID' => 'Trusted Shops G&uuml;tesiegel', 'BOX_SHIPPING' => 'Versandarten', 'BOX_YATEGO' => 'Yatego', 'BOX_YOOCHOOSE' => 'YOOCHOOSE Empfehlungen', 'BOX_PAYMENT' => 'Zahlungsweisen', 'BOX_ORDER_TOTAL' => 'Zusammenfassung', 'BOX_GM_COUNTER' => 'Besucherstatistik', 'BOX_PRODUCTS_VIEWED' => 'Besuchte Artikel', 'BOX_CAMPAIGNS_REPORT' => 'Kampagnen Report', 'BOX_STATS_CUSTOMERS' => 'Kunden-Bestellstatistik', 'BOX_SALES_REPORT' => 'Umsatzstatistik', 'BOX_PRODUCTS_PURCHASED' => 'Verkaufte Artikel', 'BOX_BANNER_MANAGER' => 'Banner Manager', 'BOX_CONTENT' => 'Content Manager', 'BOX_GM_BACKUP_FILES_ZIP' => 'Dateien sichern', 'BOX_BACKUP' => 'Datenbanksicherung', 'BOX_TOOLS_BLACKLIST' => 'Kreditkarten sperren', 'BOX_SHOW_LOGS' => 'Logs anzeigen', 'BOX_MODULE_NEWSLETTER' => 'Newsletter', 'BOX_GM_OPENSEARCH' => 'OpenSearch Plugin', 'BOX_CLEAR_CACHE' => 'Cache leeren', 'BOX_SERVER_INFO' => 'Server Info', 'BOX_GM_OFFLINE' => 'Shop online/offline', 'BOX_GM_SQL' => 'SQL', 'BOX_GM_LANG_EDIT' => 'Texte anpassen', 'BOX_WHOS_ONLINE' => 'Wer ist online?', 'BOX_GV_ADMIN_MAIL' => 'Gutschein E-Mail', 'BOX_GV_ADMIN_QUEUE' => 'Gutschein Queue', 'BOX_GV_ADMIN_SENT' => 'Gutscheine versandt', 'BOX_COUPON_ADMIN' => 'Rabatt Kupons', 'BOX_ZONES' => 'Bundesl&auml;nder', 'BOX_COUNTRIES' => 'L&auml;nder', 'BOX_LANGUAGES' => 'Sprachen', 'BOX_TAX_CLASSES' => 'Steuerklassen', 'BOX_TAX_RATES' => 'Steuers&auml;tze', 'BOX_GEO_ZONES' => 'Steuerzonen', 'BOX_CURRENCIES' => 'W&auml;hrungen', 'BOX_GM_MISCELLANEOUS' => 'Allgemeines', 'BOX_CONFIGURATION_8' => 'Artikel&uuml;bersicht-Optionen', 'BOX_ORDERS_STATUS' => 'Bestellstatus', 'BOX_CONFIGURATION_4' => 'Bild-Optionen', 'BOX_CONFIGURATION_11' => 'Cache-Optionen', 'BOX_ORDERS_XSELL_GROUP' => 'Cross-Marketing Gruppen', 'BOX_CONFIGURATION_13' => 'Download-Optionen', 'BOX_CONFIGURATION_12' => 'E-Mail-Optionen', 'BOX_GM_EMAILS' => 'E-Mail Vorlagen', 'BOX_CAMPAIGNS' => 'Kampagnen', 'BOX_CONFIGURATION_5' => 'Kunden-Details', 'BOX_CONFIGURATION_9' => 'Lagerverwaltungs-Optionen', 'BOX_SHIPPING_STATUS' => 'Lieferstatus', 'BOX_CONFIGURATION_10' => 'Logging-Optionen', 'BOX_CONFIGURATION_3' => 'Maximum Werte', 'BOX_CONFIGURATION_1' => 'Mein Shop', 'BOX_CONFIGURATION_2' => 'Minimum Werte', 'BOX_GM_ID_STARTS' => 'Nummernkreise', 'BOX_GM_PDF' => 'Rechnung/Lieferschein', 'BOX_CONFIGURATION_19' => 'Schnittstellen', 'BOX_CONFIGURATION_15' => 'Sessions', 'BOX_GM_SECURITY' => 'Sicherheitscenter', 'BOX_CONFIGURATION_16' => 'Suchmaschinen', 'BOX_CONFIGURATION_22' => 'Such-Optionen', 'BOX_CONFIGURATION_18' => 'USt-IdNr.', 'BOX_PRODUCTS_VPE' => 'Verpackungseinheiten', 'BOX_CONFIGURATION_7' => 'Versand-Optionen', 'BOX_CONFIGURATION_17' => 'Zusatzmodule', 'BOX_CONFIGURATION_14' => 'GZip Kompression', 'BOX_CONFIGURATION_753' => 'Shop-Key' ); 3: Eine xml Datei in user_classes/conf/admin_menu/ mit dem Namen "menu_cp erstellt und gespeichert. Code: <?xml version="1.0"?> {load_language_text section="admin_menu" use_fallback=$smarty.const.SHOW_UNTRANSLATED_MENUITEMS} <admin_menu> <menugroup id="BOX_HEADING_CP" sort="150" background="artkatalog.png" title="CP-Tools"> <menuitem sort="140" link="FILENAME_PRODUCTS_EDIT" titel="{$txt.BOX_PRODUCTS_EDIT}" /> </menugroup> </admin_menu> 4: Eine Datei in Ordner user_classes/overloads/AdminApplicationTopExtenderComponent erstellt und gespeichert. PHP: <?phpclass CP_AdminApplicationTopExtender extends CP_AdminApplicationTopExtender_parent{ function proceed() { parent::proceed(); define('FILENAME_PRODUCTS_EDIT', 'products_edit.php'); }}?> 5: In DB unter die Tabelle "admin_access" eine neue Spalte mit dem Dateiname eingefügt und den Wert auf 1 gesetzt. 6: Cache und templates_c geleert. Meine Menüpunkt wird trotzdem in Adminbereich nicht angezeigt! Nun wenn ich in user_classes/overloads/ ein Ordner Namens AdminMenuSource anlege und dadrin eine Datei mit dem Namen CP_AdminMenuSource.inc.php mit folgenden Codes speichere dann funktioniert alles! Aber da steht: Was mache ich dann FALSCH?!
Hallo Cyros in der Shopversion 2.0 ist es user_classes/ conf/ AdminMenu und ab Version 2.1 ist es user_classes/ conf/ admin_menu
Alle beide Varianten habe ich versucht. Es will einfach nicht Ich habe alle beide Versionen GX_2.0 und GX_2.1 getestet. Ohne Überladung von AdminMenuSource funktioniert das Ganze nicht? Hat es bis jetzt jemand nur mit der XML-Erweiterung geschaft?
ja, z.B. für die IT-Recht-Kanzlei. Inhalt: Code: <?xml version="1.0"?> <!-- menu_itrecht.xml 2014 gm Gambio GmbH http://www.gambio.de Copyright (c) 2014 Gambio GmbH Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] --> <admin_menu> <menugroup id="BOX_HEADING_MODULES"> <menuitem sort="35" link="itrecht_config.php" title="IT-Recht Kanzlei Rechtstexte" /> </menugroup> </admin_menu> sowohl in 2.0.als auch in 2.1
Der Modulcache muss geleert werden, bevor Änderungen am Menü sichtbar werden. War das vielleicht nur das Problem?
Habs mal unter die Lupe genommen. Du hast einen Tippfehler. Es muss title statt titel heißen. Code: title="{$txt.BOX_PRODUCTS_EDIT}" Dann wirds auch sofort angezeigt.
also jetzt habe ich das geändert Code: <?xml version="1.0"?> <!-- {load_language_text section="admin_menu" use_fallback=$smarty.const.SHOW_UNTRANSLATED_MENUITEMS} --> <admin_menu> <menugroup id="BOX_HEADING_CP"> <menuitem sort="140" link="products_edit.php" title="Artikelpreise ändern" /> </menugroup> </admin_menu> die Datei products_edit.php in Ordner admin hochgeladen, In der DB-Tabelle "admin_access" die Spalte "products_edit" eigefügt. Name = products_edit; TYP = (int)1; Null = nein; Standard = wie definiert 1. Beide Caches geleert. Es geht leider trotzdem nicht. Kann es sein dass meine alle 3 Test-Installationen Incomplett sind oder mache ich sonst irgendwo einen fehler?
Also nachdem der Tippfehler beseitigt wurde, hats in meiner Testumgebung sofort geklappt. Lösch mal im cache-Ordner die Datei(en), die mit AdminMenuSource_ beginnt bzw. beginnen.
Vielen Dank Barbara und Moritz, jetzt auf einmal geht es. Es hat mit der Rechte in der DB zu tun gehabt. Und bestimmt auch mit dem Fehler "TITLE" statt "TITLE". Nochmals Dankeschön und ein erfolgreiches neues Jahr mit viele schöne Momente.
übrigens Moritz, jetzt das wir dabei sind, wäre eine erweiterung wie folgt sicher genug? PHP: <?phprequire_once ('includes/application_top.php');/*$coo_lang_file_master->init_from_lang_file('lang/' . basename($_SESSION['language']). '/admin/gm_gmotion.php');$coo_lang_file_master->init_from_lang_file('lang/' . basename($_SESSION['language']). '/admin/gm_product_images.php');include_once(DIR_FS_ADMIN . 'gm/classes/GMProductUpload.php');include_once(DIR_FS_ADMIN . 'gm/classes/GMUpload.php');include_once(DIR_FS_ADMIN . 'gm/classes/GMAltText.php');// EOF GM_MODrequire_once ('includes/classes/categories.php');*/require_once (DIR_FS_INC.'xtc_get_tax_rate.inc.php');/*require_once (DIR_FS_INC.'xtc_get_products_mo_images.inc.php');require_once (DIR_WS_CLASSES.'currencies.php');*//*$currencies = new currencies();$catfunc = new categories();*/// end of pre-checks and actions, HTML output follows/*if($_GET['action'] != 'new_category' && $_GET['action'] != 'edit_category' && $_GET['action'] != 'new_product' && $_GET['action'] != 'edit_crossselling'){echo '<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">';}else{echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';}*//*xtc_db_close();if($_SESSION['customers_status']['customers_status_id'] !== '0'){ die('Zugriff verweigert');}echo '<html>';echo '<head>';echo '<link rel="stylesheet" type="text/css" href="ChangeProductsInfo.css" />';echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';echo '<title>Produkte in Datenbak ändern</title>';*/?><html <?php echo HTML_PARAMS; ?>> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $_SESSION['language_charset']; ?>"> <?php if(preg_match('/MSIE [\d]{2}\./i', $_SERVER['HTTP_USER_AGENT'])) { ?> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" /> <?php } ?> <title><?php echo "Produkt-Info-Ändern" ?></title> <link rel="stylesheet" type="text/css" href="includes/stylesheet.css"> <link rel="stylesheet" type="text/css" href="gm/css/lightbox.css"> <link rel="stylesheet" type="text/css" href="gm/css/buttons.css"> <link rel="stylesheet" type="text/css" href="gm/css/feature_set.css"> <link rel="stylesheet" type="text/css" href="gm/css/scrollpane.css"> <link rel="stylesheet" type="text/css" href="gm/css/article_tabs.css"> <!--<script type="text/javascript" src="includes/general.js"></script> <script type="text/javascript" src="includes/javascript/categories.js"></script>--> <?php $coo_js_options_control = MainFactory::create_object('JSOptionsControl', array(false)); $t_js_options_array = $coo_js_options_control->get_options_array($_GET); ?> <?php /* BOF CP Admin_Menu_Erweiterung products_edit.php*/ ?> <script type="text/javascript"> var js_options = <?php echo json_encode($t_js_options_array) ?>; </script> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">function send(ak,id){ if(ak==1) document.f.ak.value = "up"; document.f.id.value = id; document.f.submit();}</script> <?php /* EOF CP Admin_Menu_Erweiterung products_edit.php*/ ?> </head><body style="margin: 0; background-color: #FFFFFF"> <div id="spiffycalendar" class="text"></div> <!-- header //--> <?php require(DIR_WS_INCLUDES . 'header.php'); ?> <!-- header_eof //--> <!-- body //--> <table style="border:none; width:100%;" cellspacing="2" cellpadding="2"> <tr> <td class="columnLeft2" width="<?php echo BOX_WIDTH; ?>" valign="top"> <!-- left_navigation //--> <?php require(DIR_WS_INCLUDES . 'column_left.php'); ?> <!-- left_navigation_eof //--> </td> <!-- body_text //--> <td class="boxCenter" valign="top"> <?php /* BOF CP Admin_Menu_Erweiterung products_edit.php*/ ?> <?php // Aktion ausführenif(isset($_POST["ak"])){ // Datensätze ändern if($_POST["ak"]=="up") { $id = (int)$_POST["id"]; // sicherstellen, dass id eine Zahl ist, um SQL-Injection zu verhindern // mysql_real_escape ersetzt ' durch \', um SQL-Injection zu verhindern $sqlab = "UPDATE products p, products_description pd set " . " p.products_model = '" . mysql_real_escape_string($_POST["p_mod"][$id]) . "', " . " p.products_price = '" . mysql_real_escape_string($_POST["p_p"][$id]) . "', " . " pd.products_meta_title = '" . mysql_real_escape_string($_POST["p_mt"][$id]) . "', " . " pd.products_name = '" . mysql_real_escape_string($_POST["p_n"][$id]) . "', " . " pd.products_keywords = '" . mysql_real_escape_string($_POST["p_kw"][$id]) . "'" . " WHERE p.products_id = $id" . " and pd.products_id = p.products_id"; mysql_query($sqlab); }}// Formularbeginnecho '<form name="f" action="products_edit.php" method="post">';echo '<input name="ak" type="hidden" />';echo '<input name="id" type="hidden" />';//Tabellenbeginnecho "\n\n" . '<table border="1px">' . '<tr bgcolor="#585858" style="color:#fff">' . '<td style="color:#cccccc">Kategorie</td>' . '<td>Art-Nr.</td>' . '<td>Prod-Name</td>' . '<td style="color:#cccccc">Price-Brutto</td>' . '<td>Price-Netto</td>' . '<td>Prod-Meta-Titel</td>' . '<td>Prod-Keywords</td>' . '<td>Aktion</td>' . '</tr>';//Anzeigen$products_query = 'SELECT p.products_model, pd.products_name, p.products_price, p.products_tax_class_id, pd.products_meta_title, pd.products_keywords, cd.categories_name, p.products_id as products_id, pd.products_id as products_id, p2c.categories_id as categories_id, cd.categories_id as categories_id FROM (products as p INNER JOIN products_description as pd ON pd.products_id = p.products_id) inner join products_to_categories as p2c on p2c.products_id = pd.products_id inner join categories_description as cd ON cd.categories_id = p2c.categories_id WHERE pd.language_id=2 AND cd.language_id=2 order by pd.products_name asc';$res = mysql_query($products_query)or die ('MySQL-Error: ' . mysql_error());//Alle vorhandene Datensätzewhile ($dsatz = mysql_fetch_array($res)){ if ($dsatz['products_tax_class_id'] == ''){ $price_brutto = round($dsatz['products_price'], 2);}else if ($dsatz['products_tax_class_id'] == '1') { $price_brutto = round($dsatz['products_price'] * ((100 + 19)/100), 2); } else { $price_brutto = round($dsatz['products_price'] * ((100 + 7)/100), 2); } $id = $dsatz['products_id']; // htmlspecialchars ersetzt " durch " , um XSS zu verhindern echo "\n\n" . '<tr>' . '<td><input name="cat-name[' . $id . ']" value="' . htmlspecialchars($dsatz['categories_name']) . '" size="16" readonly style="color:#FF0000" title="' . htmlspecialchars($dsatz['categories_name']) . '" /></td>' . '<td><input name="p_mod[' . $id . ']" value="' . htmlspecialchars($dsatz['products_model']) . '" size="8" style="text-align:right" /></td>' . '<td><input name="p_n[' . $id . ']" value="' . htmlspecialchars($dsatz['products_name']) . '" size="25" /></td>' . '<td><input name="p_p_b[' . $id . ']" value="' . $price_brutto . '" size="10" style="color:#FF0000; text-align:right" /></td>' . '<td><input name="p_p[' . $id . ']" value="' . htmlspecialchars($dsatz['products_price']) . '" size="9" style="text-align:right" /></td>' . '<td><input name="p_mt[' . $id . ']" value="' . htmlspecialchars($dsatz['products_meta_title']) . '" size="20" title="' . htmlspecialchars($dsatz['products_meta_title']) . '" /></td>' . '<td><input name="p_kw[' . $id . ']" value="' . htmlspecialchars($dsatz['products_keywords']) . '" size="30" title="' . htmlspecialchars($dsatz['products_keywords']) . '" /></td>' . '<td><a href="javascript:send(1,' . $id . ');" style="color:#006633">speichern</a>' . '</tr>';}echo '</table>';echo '</form>'; ?> <?php /* EOF CP Admin_Menu_Erweiterung products_edit.php*/ ?> <!-- close tables from above modules //--> </td> <!-- body_text_eof //--> </tr> </table> <!-- body_eof //--><!-- footer //--><?php require(DIR_WS_INCLUDES . 'footer.php'); ?> <!-- footer_eof //--> </body></html><?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
Die XML-Schreibweise ist z. B. für ein ä &auml; wenn ich mich recht entsinne. Code sieht auf den ersten schnellen Blick sicherheitstechnisch gut aus. Aber dafür lege ich nicht meine Hand ins Feuer .