Firmen in OXID CE

Hallo Leute,

ich bin relativ neu in den OXID eShop eingestiegen und darf mich gleich bei der CE als Entwickler ranwagen. Hier muss ich eine Art “Shop in Shop” Konstruktion erstellen.
Es soll möglich sein, bestimmten Firmen bestimmte Artikel anzubieten, die jedoch kein anderer Anwender kaufen können darf. Ich muss also Firmen als Gruppen etablieren, jedoch müssen die Firmen ein paar Angaben mehr bekommen können als die normalen Gruppen. Zum Beispiel eine allgemeine Versand- und Rechnungsadresse, welche die individuellen Adressen der etablierten Mitarbeiter überschreibt.

Nun. Soweit so gut. Ich habe also die Tabelle in der Datenbank (Name der Datenbank: oxorganisations) mit allen entsprechenden Feldern angelegt und (der Einfachheit halber) sämtliche Dateien der Benutzerverwaltung kopiert. Mit Ausnahme der “oxusers.php” und “oxuserexception.php”. Diese habe ich dann umbenannt, so bekam ich folgende Dateien hinzu:

/core

  • oxorganisationslist.php
    /admin
  • organisations.xml
  • organisations_address.php
  • organisations_extend.php
  • organisations_list.php
  • organisations_main.php
  • organisations_overview.php
  • organisations_payment.php
  • organisations_remark.php
    /out/admin/tpl
  • organisations.tpl
  • organisations_adress.tpl
  • organisations_article.tpl
  • organisations_extend.tpl
  • organisations_list.tpl
  • organisations_main.tpl
  • organisations_overview.tpl
  • organisations_payment.tpl
  • organisations_remark.tpl
    /out/admin/tpl/popups
  • organisations_main.tpl

Hinzu kamen dann noch folgende Dateien, welche ich selber erstellte:
/core

  • oxorganisations.php
  • oxorganisationexeption.php

Ich weiß, dass ich anstatt /core meine Daten auch in das Verzeichnis /modules hätte packen können. Aber das kann ich im Zweifelsfall ja immer noch ändern.
Anschließend habe ich dann, wie in einem Hilfebeitrag, welchen ich nun leider nicht mehr finde, meine neue Seite in der Navigation definiert. Das klappt auch problemlos.

Nun kommt jedoch mein Problem: Wenn ich meinen neuen Menüpunkt anklicke, dann sollte eigentlich ein ähnliches Bild kommen, wie das bei “Benutzer”. Allerdings wird bei mir nur der untere Teil der Seite, also die Eingabefelder, geladen - nicht jedoch die Übersichtsliste. Dies ist ein Problem, welches ich sogar nach mehrstündiger Suche immer noch nicht gelöst bekommen habe.

Ich hänge noch meinen Quellcode der Datei oxorganisations.php an. Weiteren Quellcode kann ich gerne Anhängen, wenn dies gefordert wird, aber der Beitrag wird sonst unnötig in die Länge gezogen.

class oxOrganisations extends oxBase {
		/**
		 * Core database table name. $sCoreTbl could be only original data table name and not view name.
		 * @var string
		 */
		protected $_sCoreTbl   = 'oxorganisations';
	
		/**
		 * Name of current class
		 * @var string
		 */
		protected $_sClassName = 'oxorganisations';
		
		/**
		 * Class constructor, initiates parent constructor (parent::oxBase()).
		 */
		public function __construct()
		{
			parent::__construct();
			$this->init($this->_sCoreTbl);
		}
		
		/**
		 * Inserts new or updates existing organisation
		 *
		 * @return: bool
		 */
		
		public function createOrganisation() {
			
			$oDB = oxDb::getDb();
			$sShopID = $this->getConfig()->getShopId();
			
			// check if there is an organisation with same email adress
			$sSelect = "SELECT oxid FROM oxorganisations WHERE oxemail = " . $oDB->quote($this->oxorganisations__oxemail->value) . " AND oxshopid = '{$sShopID}' ";
			
			$sOXID = $oDB->getOne($sSelect);
			if(isset($sOXID) && !empty($sOXID)) {
				$oEx = oxNew('oxOrganisationException');
				$oLang = oxLang::getInstance();
				$oEx->setMessage(sprintf($oLang->translateString('EXCEPTION_ORG_ORGEXISTS', $oLang->getTplLanguage()), $this->oxorganisation__oxemail->value));
				throw $oEx;
			}
			
			$this->oxorganisations__oxshopid = new oxField($sShopID, oxField::T_RAW);
			if(!($blOK == $this->save())) {
				$oEx = oxNew('oxOrganisationException');
				$oEx->setMessage('EXCEPTION_ORG_ORGCREATIONFAILED');
				throw $oEx;
			}
			
			return $blOK;
		}
		
		/**
		 * Saves (updates) user object data information in DB. Return true on success.
		 *
		 * @return bool
		 */
		public function save() {
			$myConfig = oxConfig::getInstance();
			
			$blRet = parent::save();
			
			// add created remark
			if($blRet) {
				$oRemark = oxNew('oxremark');
				$oRemark->oxremark__oxtext 	   = new oxField(oxLang::getInstance()->translateString('organisationAdded'), oxField::T_RAW);
				$oRemark->oxremark__oxtype     = new oxField('r', oxField::T_RAW);
            	$oRemark->oxremark__oxparentid = new oxField($this->getId(), oxField::T_RAW);
				$oRemark->save();
			}
	
			return $blRet;
		}
		/**
		 * Loads object (user) details from DB. Returns true on success.
		 *
		 * @param string $oxID User ID
		 *
		 * @return bool
		 */
		public function load( $oxID )
		{
	
			$blRet = parent::Load( $oxID );
	
			// convert date's to international format
			if ( isset( $this->oxorganisations__oxtime->value ) ) {
				$this->oxorganisations__oxtime->setValue(oxUtilsDate::getInstance()->formatDBDate( $this->oxorganisations__oxtime->value ));
			}
	
			return $blRet;
		}	
	}

(Ich habe den Startkommentar weg gelassen.)

Nun noch einmal abschließend meine Frage: Welche oder Variable der oxusers.php habe ich vergessen zu übernehmen, die dafür verantwortlich ist, dass das Template organisations_list.php geladen wird.

PS. Ich kenne die Sourcecode Dokumentation und habe darin sehr viel nachgeschaut. Besagte Funktion oder Variable habe ich jedoch trotzdem nicht gefunden. Mit einem Link auf die Funktion oder Variable der oxusers.php bin ich entsprechend auch zufrieden.

Ich bitte inständig um Hilfe und Bedanke mich vorab herzlich dafür!

Viele Grüße vom Praktikanten.

Kann dir leider nicht helfen. Jedoch einen Tipp kann ich dir geben. Benenne deinen Dateien, Tabellen, Felder,… nie mit ox… Dieses Präfix sollte dem Hersteller überlassen werden. Denn wenn Oxid plötzlich eine Datei gleich benennt, gibt es Probleme.

Danke für deine Antwort.
Ja. Mir ist das auch aufgefallen. Ich habe es nur bisher nicht geändert, werde dies aber wahrscheinlich noch machen. So lange gibt’s eben kein Update :smiley:

Hast du die Liste in der menu.xml angegeben?

Danke für deine Antwort.
Gerade noch einmal nachgesehen. Ja habe ich. Sieht wie folgt aus:

<MAINMENU id="mxuadmin">
  <SUBMENU id="mxorganisations" cl="admin_organisations" list="organisations_list">
    <TAB id="tbclorganisations_main" cl="organisations_main" />
    <BTN id="organisation_new" />
    <BTN id="organisation_newremark" />
    <BTN id="organisation_newaddress" />
  </SUBMENU>
  <SUBMENU id="mxusers" cl="admin_user" list="user_list">

tmp geleert? Ansonsten fällt mir auch nix ein außer debuggen, der Parameter listurl, der im Frameset verwendet wird, wird in oxadminview.php gesetzt, und dort über oxnavigationtree aus dem xml geholt.

ist das ne 4.5 als Basis?

denkt an die Views

Service -> Tools -> Views aktualisieren

Danke für eure Antworten.

@leofonic: /tmp habe ich öfters geleert. Der Parameter listurl, wie du ihn nennst, der wird ja als “cl” im Frame übergeben. Das stimmt auch alles soweit. Die Angabe in der xml-Datei, sowie die Dateinamen der entsprechenden Dateien stimmen überein.

@Hebsacker: Ja, die Basis ist ein 4.5. Views habe ich aktualisiert, /tmp geleert. Leider keine Änderungen.
Ich wundere mich jedoch, warum ich die Views aktualisieren muss. Ich habe nämlich keine. Ich habe die Tabelle oxorganisations aber keine Views dazu angelegt.

Edit: Was eventuell noch helfen könnte: Ich bekomme anstatt der Übersichtsliste die Startseite des Shop-Frontends angezeigt.

Du hast also im Backend-Frame das Frontend?
Das müsste eigentlich ein klassischer Fehler im Template sein, als Fallback lädt der Shop dann nämlich die Startseite… (ja, auch im Backend…anstatt ne anständige Fehlermeldung…)

setz mal das Debug-Level hoch, schau ins Apache- und ins Shoplog nach entsprechenden Fehlern - schau Dir die Template-Dateien für die obere Liste nochmal durch, irgendein Tag zuviel / zuwenig? Fehlendes Strichkomma?

Hallo Leute,

ich möchte darauf hinweisen, dass ich den Fehler gefunden habe, nachdem ich die Datei “EXCEPTION_LOG.txt” im Verzeichnis /log gefunden habe. Diese hat mich dann ziemlich schnell auf den Fehler hingewiesen, dies war eine nicht definierte Funktion in der Datei organisations_list.php, welche ich von der user_list.php kopiert habe.

Und zwar stand darin folgender Code:

   	/**
     * Sets SQL query parameters (such as sorting),
     * executes parent method parent::Init().
     *
     * @return null
     */
    public function init()
    {
        parent::init();

        // set mark for blacklists
        foreach ( $this->getItemList() as $sId => $oUser ) {
            if ( $oUser->inGroup( "oxidblacklist" ) || $oUser->inGroup( "oxidblocked" ) ) {
                $oUser->blacklist = "1";
            }
            $oUser->blPreventDelete = false;
            if ( !$this->_allowAdminEdit( $sId ) ) {
                $oUser->blPreventDelete = true;
            }
        }
    }

Hier gab es die Funktion inGroup() nicht, somit kam es zu einem php Fehler. Nach der Entfernung, nahezu der gesamten Funktion, und der Umbenennung des Objektes $oUser, läuft es nun (fast) ohne Probleme, aber das schaffe ich auch noch. Manchmal sieht man eben den Wald vor lauter Bäumen nicht…

Danke für eure Tatkräftige Hilfe. Wenn mir das mit den Views noch jemand erklären würde, dann wäre ich sehr glücklich :slight_smile:

@Edit: Da Hebsackers Post fast parallel zu meinem entstanden ist, danke ich dir erneut für deine Nachricht. Deine Beschreibung war ja auch mein Weg zum Fehlerfund :slight_smile:

Grüße vom Praktikanten!

Die Views sind für die Mehrsprachigkeit, jede Sprache hat einen View auf eine Tabelle so dass in den SQL-Statements die aktuelle Sprache nicht mehr berücksichtigt werden muss, sondern stattdessen mit getViewName der entsprechende View für die jeweilige Sprache benutzt wird.

[QUOTE=leofonic;59247]Die Views sind für die Mehrsprachigkeit, jede Sprache hat einen View auf eine Tabelle so dass in den SQL-Statements die aktuelle Sprache nicht mehr berücksichtigt werden muss, sondern stattdessen mit getViewName der entsprechende View für die jeweilige Sprache benutzt wird.[/QUOTE]

Ja und im Moment muss man einen Core-Hack machen um eigene Tabellen Mehrsprachig zu machen. Die Entwickler sind dran.
Tipp: Unbedingt auf der Entwicklerliste anmelden!

Wir haben aber auch ein Modul fertig, was deine Aufgabe erfüllen müsste!

Product2Customer -> Artikel und Kategorien an Benutzer und -gruppen binden.

Bei Bedarf einfach melden.

Gruß Joscha

Hallo Joscha,

Danke für dein Angebot mit dem Plugin, kommt jedoch ein wenig spät. Die Funktionalität Artikel an Firmen zu Knüpfen habe ich bereits implementiert. Kategorien brauchen nicht verknüpft werden, wird aber wahrscheinlich noch nachkommen. Ist ja nicht mehr besonders schwer wenn das ganze mit Artikeln funktioniert.
Jetzt muss noch ein bisschen mehr Funktionalität kommen, welche spezifisch mit den “Firmen” zu tun hat.
Kannst du mir trotzdem mal einen Link oder eine Beschreibung zu eurem Plugin geben? :slight_smile:

Ich habe nur noch ein Problem mit dem Kategoriebaum. Und zwar sollen “leere” Kategorieren augeblendet werden. Allerdings wird der Kategoriebaum ja ebenfalls vom Smarty gecacht. Ich möchte aber den Cache nicht global ausstellen, sondern nur für den Kategoriebaum, sodass dieser nicht mehr gecacht wird. Über Hilfe hierzu wäre ich auch glücklich.

Hallo,

[QUOTE=Praktikant;59385]
Kannst du mir trotzdem mal einen Link oder eine Beschreibung zu eurem Plugin geben?
[/QUOTE]
Würde nichts lieber tun als das, aber wir kommen einfach nicht zum aufbau unserer Seite “Module”.

[QUOTE=Praktikant;59385]
Ich habe nur noch ein Problem mit dem Kategoriebaum. Und zwar sollen “leere” Kategorieren augeblendet werden. Allerdings wird der Kategoriebaum ja ebenfalls vom Smarty gecacht. Ich möchte aber den Cache nicht global ausstellen, sondern nur für den Kategoriebaum, sodass dieser nicht mehr gecacht wird. Über Hilfe hierzu wäre ich auch glücklich.[/QUOTE]
Gibts doch im Backend in den Performanceeinstellungen schon. Ist aber auch der Performancekiller Nummer 1.

Gruß Joscha

[QUOTE=jkrug;59387]Hallo,

Würde nichts lieber tun als das, aber wir kommen einfach nicht zum aufbau unserer Seite “Module”.[/QUOTE]Schade. Hätte mich interessiert.

[QUOTE=jkrug;59387]
Gibts doch im Backend in den Performanceeinstellungen schon. Ist aber auch der Performancekiller Nummer 1.

Gruß Joscha[/QUOTE]

Du meinst diese Option, oder?

Überprüfen ob Templates neu kompiliert werden müssen. Schalten Sie diese Einstellung aus, wenn der eShop in den Live-Betrieb geht.

Die greift, soweit ich das mitbekommen habe leider nur, wenn man im Admin eine neue Kategorie oder einen neuen Artikel anlegt. Die Option ist bei mir aktiviert. Leider wird der Kategoriebaum bei einem Login oder Logout nicht aktualisiert. Durch das binden der Artikel an bestimmte Firmen ändern sich ja die gezeigten Artikel entsprechend auch dann. So kann es sein, dass eine Kategorie leer wird, wenn sich ein Benutzer abmeldet und diese dann versteckt werden soll. Hierbei müsste der Cache ausgeschaltet werden.

Dass es sich hierbei um einen Performancekiller handelt ist mir natürlich klar. Deshalb wollte ich es für die einzelnen Templates abschalten, also den Kategoriebaum und die Navigation :slight_smile:

Schnapp dir einfach ein Telefon und klingel durch. Autausch ist immer gut! :slight_smile:

Nope! Ich mein diese (6 Zeilen tiefer):

Leere Kategorien (keine Unterkategorien, keine Artikel) nicht anzeigen

Gruß

[QUOTE=jkrug;59393]Schnapp dir einfach ein Telefon und klingel durch. Autausch ist immer gut! :)[/QUOTE]Wenn ich Zeit finde, werde ich das in Angriff nehmen :slight_smile:

[QUOTE=jkrug;59393]
Nope! Ich mein diese (6 Zeilen tiefer):

Gruß[/QUOTE]

Ist auch aktiviert. Funktioniert trotzdem nicht :smiley:

Edit: Ich werde dazu nun ein neues Thema eröffnen um das hier nicht so zu mischen.