Was mich eigentlich seit Anbeginn meiner Arbeit mit xxCommerce/Gambio vor einigen Jahren geärgert hat, habe ich jetzt geändert: das unglaublich unübersichtliche Admin-Menü (column_left.php)! Und in Vorbereitung auf die hoffentlich bald verfügbare Möglichkeit der Klassenüberladung habe ich das als Klasse implementiert.... (Dann wird man nämlich Menüeinträge (und ganze Menüblöcke!) hinzufügen können, ohne die neue Menüklasse oder vorhandene Sprachdateien ändern zu müssen...) Das Menü wird jetzt von dieser Klassenmethode generiert (wer sich die "column_left.php" mal angesehen hat, weiß, um wieviel übersichtlicher das ist...). Code: function create_menu() { $admin_access_query = xtc_db_query("select * from " . TABLE_ADMIN_ACCESS . " where customers_id = '" . $_SESSION['customer_id'] . "'"); $this->admin_access = xtc_db_fetch_array($admin_access_query); $this->start_menu_block('favs.png','FAVS'); echo ('<div id="gm_box_favorites"> </div>'); $this->end_menu_block('favs'); $this->start_menu_block('gambio.png','BOX_HEADING_LAYOUT_DESIGN'); $this->menu_entry('gm_style_edit','BOX_GM_STYLE_EDIT',FILENAME_GM_STYLE_EDIT); $this->menu_entry('gm_logo','BOX_GM_LOGO',FILENAME_GM_LOGO); $this->menu_entry('gm_lightbox','BOX_GM_LIGHTBOX',FILENAME_GM_LIGHTBOX); $this->menu_entry('gm_slider','BOX_GM_SLIDER',FILENAME_GM_SLIDER); $this->menu_entry('gm_trusted_info','BOX_GM_TRUSTED_INFO',FILENAME_GM_TRUSTED_INFO); $this->end_menu_block('gambio'); $this->start_menu_block('gambio.png','BOX_HEADING_GAMBIO_SEO'); $this->menu_entry('gm_seo_boost','BOX_GM_SEO_BOOST',FILENAME_GM_SEO_BOOST); $this->menu_entry('gm_analytics','BOX_GM_ANALYTICS',FILENAME_GM_ANALYTICS); $this->menu_entry('gm_meta','BOX_GM_META',FILENAME_GM_META); $this->menu_entry('robots_download','BOX_ROBOTS',FILENAME_ROBOTS_DOWNLOAD); $this->menu_entry('gm_analytics','BOX_GM_SITEMAP',FILENAME_GM_SITEMAP); $this->menu_entry('gm_bookmarks','BOX_GM_BOOKMARKS',FILENAME_GM_BOOKMARKS); $this->end_menu_block('seo'); $this->start_menu_block('kunden.png','BOX_HEADING_CUSTOMERS'); $this->menu_entry('orders','BOX_ORDERS',FILENAME_ORDERS); $this->menu_entry('customers','BOX_CUSTOMERS',FILENAME_CUSTOMERS); $this->menu_entry('gm_module_export','BOX_GM_MODULE_EXPORT',FILENAME_GM_MODULE_EXPORT); $this->menu_entry('customers_status','BOX_CUSTOMERS_STATUS',FILENAME_CUSTOMERS_STATUS); $this->end_menu_block('customers'); $this->start_menu_block('artkatalog.png','BOX_HEADING_PRODUCTS'); $this->menu_entry('categories','BOX_CATEGORIES',FILENAME_CATEGORIES); $this->menu_entry('gm_feature_control','BOX_GM_FEATURE_CONTROL',FILENAME_GM_FEATURE_CONTROL); $this->menu_entry('products_attributes','BOX_PRODUCTS_ATTRIBUTES',FILENAME_PRODUCTS_ATTRIBUTES); $this->menu_entry('reviews','BOX_REVIEWS',FILENAME_REVIEWS); $this->menu_entry('quantity_units','BOX_QUANTITYUNITS',FILENAME_QUANTITYUNITS); $this->menu_entry('properties','BOX_PROPERTIES',FILENAME_PROPERTIES); $this->menu_entry('gm_product_export','BOX_PRODUCTS_EXPECTED',FILENAME_GM_PRODUCT_EXPORT); $this->menu_entry('new_attributes','BOX_ATTRIBUTES_MANAGER',FILENAME_NEW_ATTRIBUTES); $this->menu_entry('csv_backend','BOX_IMPORT','csv_backend.php'); $this->menu_entry('products_expected','BOX_PRODUCTS_EXPECTED',FILENAME_PRODUCTS_EXPECTED); $this->menu_entry('gm_gmotion','BOX_GM_GMOTION',FILENAME_GM_GMOTION); $this->menu_entry('gm_gprint','BOX_GM_GPRINT',FILENAME_GM_GPRINT); $this->menu_entry('manufacturers','BOX_MANUFACTURERS',FILENAME_MANUFACTURERS); $this->menu_entry('specials','BOX_SPECIALS',FILENAME_SPECIALS); $this->end_menu_block('articles'); $this->start_menu_block('module.png','BOX_HEADING_MODULES'); $this->menu_entry('econda','BOX_ECONDA','econda.php'); $this->menu_entry('gm_guestbook','BOX_GM_GUESTBOOK',FILENAME_GM_GUESTBOOK); $this->menu_entry('gm_janolaw','BOX_GM_JANOLAW',FILENAME_GM_JANOLAW); $this->menu_entry('module_export','BOX_MODULE_EXPORT',FILENAME_MODULE_EXPORT); $this->menu_entry('gm_scroller','BOX_GM_SCROLLER',FILENAME_GM_SCROLLER); $this->menu_entry('paypal','BOX_PAYPAL','paypal.php'); $this->menu_entry('gm_trusted_shop_id','BOX_GM_TRUSTED_SHOP_ID',FILENAME_GM_TRUSTED_SHOP_ID); $this->menu_entry('gm_trusted_shops_widget','BOX_GM_TRUSTED_SHOPS_WIDGET',FILENAME_GM_TRUSTED_SHOPS_WIDGET); $this->menu_entry('modules','BOX_SHIPPING',FILENAME_MODULES.'?set=shipping'); $this->menu_entry('yatego','BOX_YATEGO','yatego.php'); $this->menu_entry('modules','BOX_YOOCHOOSE','yoochoose.php'); $this->menu_entry('modules','BOX_PAYMENT',FILENAME_MODULES.'?set=payment'); $this->menu_entry('modules','BOX_ORDER_TOTAL',FILENAME_MODULES.'?set=ordertotal'); $this->end_menu_block('modules'); $this->start_menu_block('statistik.png','BOX_HEADING_STATISTICS'); $this->menu_entry('gm_counter','BOX_GM_COUNTER',FILENAME_GM_COUNTER); $this->menu_entry('stats_products_viewed','BOX_PRODUCTS_VIEWED',FILENAME_STATS_PRODUCTS_VIEWED); $this->menu_entry('stats_campaigns','BOX_CAMPAIGNS_REPORT',FILENAME_CAMPAIGNS_REPORT); $this->menu_entry('stats_customers','BOX_STATS_CUSTOMERS',FILENAME_STATS_CUSTOMERS); $this->menu_entry('stats_sales_report','BOX_SALES_REPORT',FILENAME_SALES_REPORT); $this->menu_entry('stats_products_purchased','BOX_PRODUCTS_PURCHASED',FILENAME_STATS_PRODUCTS_PURCHASED); $this->end_menu_block('statistics'); $this->start_menu_block('module.png','BOX_HEADING_XTBOOSTER'); $this->menu_entry('xtbooster','BOX_XTBOOSTER_LISTAUCTIONS',FILENAME_XTBOOSTER."?xtb_module=list"); $this->menu_entry('xtbooster','BOX_XTBOOSTER_ADDAUCTIONS',FILENAME_XTBOOSTER."?xtb_module=add"); $this->menu_entry('gm_ebay','BOX_GM_EBAY',FILENAME_GM_EBAY); $this->menu_entry('xtbooster','BOX_XTBOOSTER_CONFIG',FILENAME_XTBOOSTER."?xtb_module=conf"); $this->end_menu_block('xtbooster'); $this->start_menu_block('hilfsprogr1.png','BOX_HEADING_TOOLS'); $this->menu_entry('banner_manager','BOX_BANNER_MANAGER',FILENAME_BANNER_MANAGER); $this->menu_entry('content_manager','BOX_CONTENT',FILENAME_CONTENT_MANAGER); $this->menu_entry('gm_backup_files_zip','BOX_GM_BACKUP_FILES_ZIP',FILENAME_GM_BACKUP_FILES_ZIP); $this->menu_entry('backup','BOX_BACKUP',FILENAME_BACKUP); $this->menu_entry('blacklist','BOX_TOOLS_BLACKLIST',FILENAME_BLACKLIST); $this->menu_entry('show_logs','BOX_SHOW_LOGS',FILENAME_SHOW_LOGS); $this->menu_entry('module_newsletter','BOX_MODULE_NEWSLETTER',FILENAME_MODULE_NEWSLETTER); $this->menu_entry('gm_opensearch','BOX_GM_OPENSEARCH',FILENAME_GM_OPENSEARCH); $this->menu_entry('server_info','BOX_SERVER_INFO',FILENAME_SERVER_INFO); $this->menu_entry('gm_offline','BOX_GM_OFFLINE',FILENAME_GM_OFFLINE); $this->menu_entry('gm_sql','BOX_GM_SQL',FILENAME_GM_SQL); $this->menu_entry('gm_lang_edit','BOX_GM_LANG_EDIT',FILENAME_GM_LANG_EDIT); $this->menu_entry('whos_online','BOX_WHOS_ONLINE',FILENAME_WHOS_ONLINE); $this->end_menu_block('tools'); if (ACTIVATE_GIFT_SYSTEM=='true') { $this->start_menu_block('hilfsprogr2.png','BOX_HEADING_GV_ADMIN'); $this->menu_entry('gv_mail','BOX_GV_ADMIN_MAIL',FILENAME_GV_MAIL); $this->menu_entry('gv_queue','BOX_GV_ADMIN_QUEUE',FILENAME_GV_QUEUE); $this->menu_entry('gv_sent','BOX_GV_ADMIN_SENT',FILENAME_GV_SENT); $this->menu_entry('coupon_admin','BOX_COUPON_ADMIN',FILENAME_COUPON_ADMIN); $this->end_menu_block('gift'); } $this->start_menu_block('land.png','BOX_HEADING_ZONE'); $this->menu_entry('zones','BOX_ZONES',FILENAME_ZONES); $this->menu_entry('countries','BOX_COUNTRIES',FILENAME_COUNTRIES); $this->menu_entry('languages','BOX_LANGUAGES',FILENAME_LANGUAGES); $this->menu_entry('tax_classes','BOX_TAX_CLASSES',FILENAME_TAX_CLASSES); $this->menu_entry('tax_rates','BOX_TAX_RATES',FILENAME_TAX_RATES); $this->menu_entry('geo_zones','BOX_GEO_ZONES',FILENAME_GEO_ZONES); $this->menu_entry('currencies','BOX_CURRENCIES',FILENAME_CURRENCIES); $this->end_menu_block('countries'); $this->start_menu_block('meinshop.png','BOX_HEADING_CONFIGURATION'); $this->menu_entry('gm_miscellaneous','BOX_GM_MISCELLANEOUS',FILENAME_GM_MISCELLANEOUS); $this->menu_entry('configuration','BOX_CONFIGURATION_8',FILENAME_CONFIGURATION.'?gID=8'); $this->menu_entry('orders_status','BOX_ORDERS_STATUS',FILENAME_ORDERS_STATUS); $this->menu_entry('configuration','BOX_CONFIGURATION_4',FILENAME_CONFIGURATION.'?gID=4'); $this->menu_entry('configuration','BOX_CONFIGURATION_11',FILENAME_CONFIGURATION.'?gID=11'); $this->menu_entry('cross_sell_groups','BOX_ORDERS_XSELL_GROUP',FILENAME_XSELL_GROUPS); $this->menu_entry('configuration','BOX_CONFIGURATION_13',FILENAME_CONFIGURATION.'?gID=13'); $this->menu_entry('configuration','BOX_CONFIGURATION_12',FILENAME_CONFIGURATION.'?gID=12'); $this->menu_entry('gm_emails','BOX_GM_EMAILS',FILENAME_GM_EMAILS); $this->menu_entry('configuration','BOX_CONFIGURATION_14',FILENAME_CONFIGURATION.'?gID=14'); $this->menu_entry('campaigns','BOX_CAMPAIGNS',FILENAME_CAMPAIGNS); $this->menu_entry('configuration','BOX_CONFIGURATION_5',FILENAME_CONFIGURATION.'?gID=5'); $this->menu_entry('configuration','BOX_CONFIGURATION_9',FILENAME_CONFIGURATION.'?gID=9'); $this->menu_entry('shipping_status','BOX_SHIPPING_STATUS',FILENAME_SHIPPING_STATUS,ACTIVATE_SHIPPING_STATUS=='true'); $this->menu_entry('configuration','BOX_CONFIGURATION_10',FILENAME_CONFIGURATION.'?gID=10'); $this->menu_entry('configuration','BOX_CONFIGURATION_3',FILENAME_CONFIGURATION.'?gID=3'); $this->menu_entry('configuration','BOX_CONFIGURATION_1',FILENAME_CONFIGURATION.'?gID=1'); $this->menu_entry('configuration','BOX_CONFIGURATION_2',FILENAME_CONFIGURATION.'?gID=2'); $this->menu_entry('gm_id_starts','BOX_GM_ID_STARTS',FILENAME_GM_ID_STARTS); $this->menu_entry('gm_pdf','BOX_GM_PDF',FILENAME_GM_PDF,gm_pdf_is_installed()); $this->menu_entry('configuration','BOX_CONFIGURATION_19',FILENAME_CONFIGURATION.'?gID=19'); $this->menu_entry('configuration','BOX_CONFIGURATION_15',FILENAME_CONFIGURATION.'?gID=15'); $this->menu_entry('gm_security','BOX_GM_SECURITY',FILENAME_GM_SECURITY); $this->menu_entry('gm_statusbar','BOX_GM_STATUSBAR',FILENAME_GM_STATUSBAR); $this->menu_entry('configuration','BOX_CONFIGURATION_16',FILENAME_CONFIGURATION.'?gID=16'); $this->menu_entry('configuration','BOX_CONFIGURATION_20',FILENAME_CONFIGURATION.'?gID=22'); $this->menu_entry('configuration','BOX_CONFIGURATION_18',FILENAME_CONFIGURATION.'?gID=18'); $this->menu_entry('products_vpe','BOX_PRODUCTS_VPE',FILENAME_PRODUCTS_VPE); $this->menu_entry('configuration','BOX_CONFIGURATION_7',FILENAME_CONFIGURATION.'?gID=7'); $this->menu_entry('configuration','BOX_CONFIGURATION_17',FILENAME_CONFIGURATION.'?gID=17'); $this->end_menu_block('shop'); } Die "end_menu_block($menu_block)"-Methode schließt zum einen den Menüblock ab, und sie bietet die Möglichkeit, vor dem Ende des Menüblocks weitere Menü-Einträge einzubauen.... (Man könnte sogar einen komplett neuen Menüblock an den aktuellen Menüblock anhängen!!) Code: function end_menu_block($menu_block) { switch ($menu_block) { case 'favs': { break; } case 'seo': { break; } case 'customers': { break; } case 'articles': { if (SHOW_LIVESHOPPING===true) { $this->menu_entry('liveshopping',BOX_LIVE_SHOPPING,FILENAME_LIVESHOPPING); } break; } case 'modules': { break; } case 'statistics': { break; } case 'xtbooster': { break; } case 'tools': { break; } case 'gift': { break; } case 'countries': { break; } case 'shop': { break; } } $html.=' </ul> '; echo $html; } So richtig schön wird das Ganze, wenn es die Möglichkeit gibt, Klassen zu überladen..... Dann kann man eigene Menüeinträge und -blöcke einbauen, ohne den vorhandenen Code zu ändern! Eine Klasse, die z.B. eine eigene Sprach-Datei lädt, und nach dem "articles"-Menü den neuen Menüblock "powertemplate" einbaut, würde nach dem von mir vorgeschlagenen Konzept wie folgt aussehen: Code: class pt_admin_menu extends pt_admin_menu_parent { function admin_menu() { //Include your own language file for additional menu entries. No need to change existing files! (Secure for updates!) $file=DIR_FS_CATALOG.'lang/'.$_SESSION['language'].'/admin/my_admin_menu.php'; if (is_file($file)) { include($file); } parent::admin_menu(); //Execute parents' method } * function end_menu_block($menu_block) { parent::end_menu_block($menu_block); switch ($menu_block) { case 'articles': { //Close articles menu block $this->start_menu_block('powertemplate.png','BOX_HEADING_POWERTEMPLATE'); $this->menu_entry('pt_function1','BOX_PT_FUNCTION1','pt_function1.php'); //More entries.... break; } } $html.=' </ul> '; echo $html; } Und da eine Klasse mehrfach auch vererbt werden kann, können auch mehrere Entwickler (updatesicher) Änderungen am Admin-Menü vornehmen, ohne sich gegenseitig zu stören. Es wäre toll, wenn die Gambio GmbH das in ihren Core-Code aufnehmen würde...
Wie schon gesagt ist im Moment eigentlich nur die bessere Übersicht der Lohn. Richtig cool wird das erst, wenn das Überladen von Klassen funktioniert (was es schon seit ca. 4 Monaten tun könnte.....) Dann kann man ein weiteres der großen Probleme lösen: die updatesichere Erweiterung des Admin-Menüs, auch durch mehrere Entwickler...
Da müsste sich Gambio reinhängen, das wäre viel zu viel Aufwand, das bei jedem Update wieder abzugleichen. Da es Sinn hat, wäre die Implementation seitens Gambio nötig. Die müssten das dann auch testen und sicher sein bevor es rausgeht. Ist sicher keine Sache von 'nem Nachmittag.
Ich habe ein vollständig durchentwickeltes Konzept (das seit vielen Jahren im OXID-Shop verwendet wird), das auch der Gambio GmbH vorliegt. Ich weiß nicht, warum man sich da so ziert, diese immens wichtige Funktionalität zu integrieren. Mittlerweile habe ich das weiter verbessert, so dass auch alle vorhandenen Klassen damit verwendet werden können.... Ich hatte ja hier schon mal geposted (http://www.gambio-forum.de/threads/834-Plugin-F%C3%A4higkeit-von-GX2-Ein-%C3%9Cberblick-und-Ausblick?p=4451&viewfull=1#post4451): in einer Woche kann das funktionieren, da es erst mal nicht um inhaltliche, sondern rein formale Änderungen geht. Um die inhaltlichen Änderungen der Klassen kann man sich später immer noch kümmern.
[Spaßmodus]Ich glaube Daniel und Nonito machen da nen GX3 draus oder üben gerade das Fingerhandschuh über den Fäustling ziehen.[/Spaßmodus]
!!! Das ist natürlich nicht so gemeint, das die Gambios Däumchen drehen würden sondern nur eine Anspielung auf den lustigen Kommentar von dakler im oben erwähnten Thread.
Hallo zusammen, das dynamische Anpassen des Adminmenüs ist bei uns schon lange Zeit Thema. Das Konzept von Avenger ist echt gut. Wir haben vor einiger Zeit schon an etwas ähnlichem gearbeitet. Bei der Umsetzung ist uns allerdings aufgefallen, dass wir es den Entwicklern mit einem XML-basierten Konzept allerdings noch einfacher machen können. Neue Menüpunkte lassen sich z.B. durch Ablegen zusätzlicher XML-Dateien im Verzeichnis admin/conf/menu/ hinzufügen: Code: <?xml version="1.0"?> <menugroup id="LAYOUT_DESIGN"> <menuitem value="gm_style_edit.php">{$txt.style_edit}</menuitem> <menuitem value="gm_lightbox.php">{$txt.lightbox}</menuitem> </menugroup> Oder eine neue Gruppe durch eine XML-Datei mit Code: <?xml version="1.0"?> <menu> <group value="LAYOUT_DESIGN">{$txt.layout_design}</group> </menu> Die Menütexte können mit dem Textphrasensystem sprachabhängig hinterlegt werden, das wir in diesem Thread schon mal kurz angerissen haben: http://www.gambio-forum.de/threads/...xtphrasen-hinzufügen?p=173&viewfull=1#post173 Wenn es keine zu großen Updateprobleme damit gibt, erscheint das mit dem kommenden Service Pack. Viele Grüße Nonito
Auch eine Möglichkeit... Allerdings sehe ich dabei noch das Problem bei der Anlage von Texten, wenn unabhängig voneinander mehrere Entwickler das Menü modifizieren (Installation mehrerer Module), da das Textphrasensystem nur eine Textphrasendatei zulässt....
Mit dem Textphrasensystem lassen sich auch mehrere Sprachdateien hinzufügen... habe dazu eben noch schnell was in den Thread geschrieben http://www.gambio-forum.de/threads/48-Template-Entwicklung-Textphrasen-hinzuf%FCgen?p=7670#post7670