Problem bei Modulerstellung mit $oxcmp_user

Guten Tag,
Dank der Hilfe hier im Forum bin ich meinem Anliegen schon ein großes Stück näher gekommen, leider komme ich momentan nicht weiter.
Mein Ziel ist es, ein Modul zu schreiben mit dem es mir möglich ist bei bestimmten Artikeln als Admin einen Haken bei meiner neu angelegten “Verstecken”-Checkbox zu setzen, wodurch diese Artikel für eine Bestimmte Benutzergruppe “Testgruppe” versteckt, also nicht angezeigt werden sollen.

Ich benutze OXID CE 4.6.1_45706

Was ich bisher getan habe:

  1. Ich habe in der DB ein neues Feld “TESTHIDE” angelegt.
  2. Ich habe die article_main.tpl entsprechend angepasst, so das unter der “Akiv” Checkbox im Admin->Artikel Bereich nun auch meine neue Checkbox erscheint.
  3. Ich habe eine Übersetzung für diese Checkbox im deutschen und englischen lang.php File eingetragen.
  4. Dann habe ich einen neuen Modulordner “test_hide” angelegt.
  5. In diesem befindet sich eine modifizierte Version der Datei oxarticle.php welche ich test_oxarticle.php genannt habe.
  6. Ich habe das Modul per oxarticle => test_hide/test_oxarticle geladen.

Soweit so gut.
Hier erstmal der Code meiner test_oxarticle.php:

class test_oxarticle extends test_oxarticle_parent
{ 
    public function getActiveCheckQuery( $blForceCoreTable = null )
    {
        $sTable = $this->getViewName( $blForceCoreTable );

        if($oxcmp_user && $oxcmp_user->inGroup('0810672640493985c161475b0b487087'))
        {
            if(oxactive == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }
        }
        else 
        {
            $sQ = " $sTable.oxactive = 1 ";
        } 


        if ( $this->getConfig()->getConfigParam( 'blUseTimeCheck' ) ) {
            $sDate = date( 'Y-m-d H:i:s', oxUtilsDate::getInstance()->getTime() );
            $sQ = "( $sQ or ( $sTable.oxactivefrom < '$sDate' and $sTable.oxactiveto > '$sDate' ) ) ";
        }

        return $sQ;
    }
}

Ziel hierbei war es, dass geprüft wird ob der Benutzer eingeloggt und in besagter Testgruppe ist. Wenn dies der Fall ist und ein Haken in der “Aktiv”-Checkbox (oxactive) gesetzt ist, soll anhand der “Verstecken”-Checkbox (testhide) entschieden werden welcher Artikel geladen wird.
Sollte entweder kein Haken bei “Aktiv” gesetzt oder der Benutzer nicht eingeloggt/in der Testgruppe sein, so soll anhand der “Aktiv”-Checkbox entschieden werden welche Artikel geladen werden.

Ich bin mir sicher, dass es da elegantere Wege gibt, aber das macht erstmal nichts.

Das Problem ist nur, dass die Abfrage über $oxcmp_user nicht funktioniert.

Ich habe Testweise auch einmal

[{if $oxcmp_user && $oxcmp_user->inGroup('0810672640493985c161475b0b487087')}]
ist in gruppe
[{else}]
ist nicht in gruppe
[{/if}]

in die header.tpl eingebunden. Dort funktioniert das ganze einwandfrei.

Hat jemand eine Idee wie ich das ganze lösen könnte? Muss ich hier doch irgendwie mit Smarty arbeiten? Oder geht es auch so (bzw. so ähnlich) wie von mir ursprünglich gedacht, nur mit der test_oxarticle.php?

Für Hilfestellungen, Denkanstöße etc wäre ich sehr dankbar :slight_smile:

die Klasse oxConfig hat eine Funktion getUser(), die dir den aktiven User liefert.

hier ist übrigens die Klassen- und Funktionendokumentation
http://docu.oxid-esales.com/CE/sourcecodedocumentation/4.6.2.46646/

Danke erstmal wieder für die schnelle Antwort!
Entweder verstehe ich dich gerade falsch, oder du hast mich falsch verstanden - oder beides :slight_smile:
Du sagst getUser() liefert mir den derzeit aktiven Benutzer. Das (denke ich) bringt mir nur leider nichts. Ich möchte ja prüfen, ob 1) überhaupt ein Benutzer eingeloggt ist und 2) ob sich dieser Benutzer in der Gruppe “Testgruppe” befindet.
Und anhand dieser Überprüfung möchte ich dann entscheiden ob die Artikel in Abhängigkeit zur “Aktiv”-Checkbox oder eben in Abhängigkeit zur “Verstecken”-Checkbox geladen werden.

Vermutlich liegt das Verständnisproblem aber auf meiner Seite, daher würde ich mich über eine etwas genauere Erläuterung sehr freuen.

probiere doch mal aus, was bei bei getUser() rauskommt, wenn du gerade nicht angemeldet bist.

Tut mir leid, aber ich scheine gerade wirklich auf dem Schlauch zu stehen.
Wo genau und wie soll ich deiner Meinung nach getUser() einbinden?

da wo oxcmp_user nicht funktioniert

if(getUser() && $oxcmp_user->inGroup('0810672640493985c161475b0b487087'))
        {
            if(oxactive == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }
        }
        else 
        {
            $sQ = " $sTable.oxactive = 1 ";
        } 

so?

Das ruft bei mir diesen Error hervor:
[B]Fatal error[/B]: Call to undefined function getUser() in [B]C:\xampp\htdocs\oxid\modules est_hide est_oxarticle.php[/B] on line [B]48

[/B]Irgendwie bin ich gerade ein wenig verwirrt.

edit:

Ich scheine es dann doch rausbekommen zu haben:


public function getActiveCheckQuery( $blForceCoreTable = null )
    {
        $sTable = $this->getViewName( $blForceCoreTable );

        // check if article is still active
        $oUser = $this->getUser();
        if($oUser && $oUser->inGroup('0810672640493985c161475b0b487087'))
        {
            if(oxactive == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 0 ";   
            }
        }
        else 
        {
            $sQ = " $sTable.oxactive = 1 ";
        } 

war es in etwa so gemeint?

Es scheint als würde das nun alles genauso funktionieren wie es soll :slight_smile:
Vielen Dank dafür schoneinmal, vanilla thunder!
Nur ein letzter Fehler verbleibt: die If-Abfrage


if(oxactive == 1)
{
        $sQ = " $sTable.testhide = 0";
}

scheint nicht so funktionieren wie ich will.
Ich war der Meinung, ich würde mit dieser If-Abfrage abfragen “Wenn im Feld “Aktiv” ein Haken gesett ist, dann…”

Sieht jemand den Fehler oder hat sogar eine Lösung parat?

Vergessen :wink:

wo befindet sich denn dieses Feld?

Mit Feld “Aktiv” meine ich die Checkbox “Aktiv” im Adminbereich -> Artikel durch die man einen Artikel aktiv oder eben inaktiv stellen kann.

@rubbercut Das “Na, 2x “else”” versteh ich nicht so recht.

Der Code sieht ja momentan im ganzen so aus:


class test_oxarticle extends test_oxarticle_parent
{ 
    public function getActiveCheckQuery( $blForceCoreTable = null )
    {
        $sTable = $this->getViewName( $blForceCoreTable );

        // check if article is still active
        $oUser = $this->getUser();
        if($oUser && $oUser->inGroup('0810672640493985c161475b0b487087'))
        {
            if($sTable.oxactive == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }
        }
        else 
        {
            $sQ = " $sTable.oxactive = 1 ";
        } 

            

        

        // enabled time range check ?
        if ( $this->getConfig()->getConfigParam( 'blUseTimeCheck' ) ) {
            $sDate = date( 'Y-m-d H:i:s', oxUtilsDate::getInstance()->getTime() );
            $sQ = "( $sQ or ( $sTable.oxactivefrom < '$sDate' and $sTable.oxactiveto > '$sDate' ) ) ";
        }

        return $sQ;
    }
}

Mit der zweiten if-Abfrage will ich prüfen, ob der Haken bei “Aktiv” gesetzt ist. Wenn ich $sQ = " $sTable.testhide = 0"; einfach ohne diese Überprüfung verwenden würde, dann würden Artikel bei denen weder ein Haken bei Aktiv noch ein Haken bei Verstecken gesetzt ist trotzdem angezeigt, da sich das Anzeigen dann eben nur in Abhängigkeit der Verstecken Checkbox geschieht.

Da ich momentan den Wald vor lauter Bäumen nicht zu sehen scheine, wäre eine etwas genauere Ausführung toll :slight_smile:

War ein Fehler, wie ich bereits geschrieben habe. Hatte den QT nur überflogen.

Auf die Gefahr hin die Frage falsch verstanden zu haben:
Die beiden Checkboxen befinden sich im Adminbereich unter Artikelverwalten -> Artikel -> Stamm.
Angelegt sind die Checkboxen in der article_main.tpl


                    <tr>
                      <td class="edittext" width="120">
                        [{ oxmultilang ident="ARTICLE_MAIN_ACTIVE" }]
                      </td>
                      <td class="edittext">
                        <input type="hidden" name="editval[oxarticles__oxactive]" value="0">
                        <input class="edittext" type="checkbox" name="editval[oxarticles__oxactive]" value='1' [{if $edit->oxarticles__oxactive->value == 1}]checked[{/if}] [{ $readonly }]>
                        [{ oxinputhelp ident="HELP_ARTICLE_MAIN_ACTIVE" }]
                      </td>
                    </tr>
                    
                    
                    
                    
                    
                    
                    <tr>
                      <td class="edittext" width="120">
                        [{ oxmultilang ident="ARTICLE_MAIN_HIDE" }]
                      </td>
                      <td class="edittext">
                        <input type="hidden" name="editval[oxarticles__testhide]" value="0">
                        <input class="edittext" type="checkbox" name="editval[oxarticles__testhide]" value='1' [{if $edit->oxarticles__testhide->value == 1}]checked[{/if}] [{ $readonly }]>
                        [{ oxinputhelp ident="HELP_ARTICLE_MAIN_HIDE" }]
                      </td>
                    </tr>

in der Datenbank sind beide unter oxarticles unter den Namen TESTHIDE und OXACTIVE.

Ich hoffe irgendwo habe ich jetzt deine Frage “wo befindet sich denn dieses Feld” beantwortet.

Sehr seltsam…

mit

if($sTable.oxactive == 0)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }

springt es IMMER in den Else Fall, unabhängig davon ob bei dem Artikel ein Haken bei “Aktiv” gesetzt ist oder nicht.

bei

if($sTable.oxactive == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }

springt es IMMER in den if-Fall, auch vollkommen unabhängig von der Aktiv-Checkbox.

Versteht das jemand?

Wie viel Programmiererfahrung hast du mit PHP und oop PHP?
Weisst du, was MVC ist und was Objekte generell sind?
Sagen dir Begriffe “debug” oder “Fehlersuche” etwas?
Sind dir die Funktionen var_dump() oder print_r() schon mal begegnet und weißt du, wie man sie einsetzt?

Wenn die Antworten nicht “ein bisschen + ja + ja +ja” sind, sehe ich recht wenig Sinn mit der Modulentwicklung weiterzumachen, da dir einfach die Grundlagen fehlen.

Vielen Dank für den Rat :slight_smile:
Meine Programmierkenntnisse beschränken sich tatsächlich auf ein Minimum. Habe erst vor einem Jahr damit angefangen und bis jetzt auch nur in C# programmiert. Momentan leiste ich mein Praktikum im Rahmen meiner schulischen Ausbildung (Höhere Berufsfachschule Bereich IT) ab. Und meine momentane Aufgabe ist es, eben jenes Modul zu entwickeln. Ich bin in den letzten Tagen (hauptsächlich dank deiner Hilfe) ein beachtliches Stück voran gekommen (finde ich zumindest :slight_smile: ). Denn wenn ich es richtig sehe, so scheitert das Modul momentan nur an dieser If-Abfrage. Natürlich könnte ich den Code auch so abändern:


        $oUser = $this->getUser();
        if($oUser && $oUser->inGroup('0810672640493985c161475b0b487087'))
        {

                $sQ = " $sTable.testhide = 0";
        }
        else 
        {
            $sQ = " $sTable.oxactive = 1 ";
        } 

Das würde den Kern der Aufgabenstellung ja erfüllen (Für die "Benutzergruppe “Testgruppe” alle Artikel bei denen ein Haken bei “Verstecken” gesetzt ist nicht anzeigen).
Nur eben würden dann für diese Benutzergruppe prinzipiell alle Artikel angezeigt bei denen kein Haken bei “Verstecken” gesetzt ist, selbst die, bei denen auch keinen Haken bei “Aktiv” gesetzt ist - was natürlich nicht so ganz dem entspricht was das Modul bewirken soll.

Das

if($sTable.oxactive ...)

liefert dir nicht den Inhalt des Datenbankfelds oxactive zurück, ist klar ne? :rolleyes:

[QUOTE=rogu;94438]

if($sTable.oxactive == 0)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }

springt es IMMER in den Else Fall, unabhängig davon ob bei dem Artikel ein Haken bei “Aktiv” gesetzt ist oder nicht.

bei

if($sTable.oxactive == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }

springt es IMMER in den if-Fall, auch vollkommen unabhängig von der Aktiv-Checkbox.

Versteht das jemand?[/QUOTE]

Das hatte ich schon beinahe vermutet :slight_smile: (Sonst würde es ja klappen).
Die Frage ist nur… [B]was[/B] liefert mir denn den inhalt des Datenbankfeldes zurück?

[QUOTE=rogu;94456]Das hatte ich schon beinahe vermutet :slight_smile: (Sonst würde es ja klappen).[/QUOTE]

Vermutet, aber auch verstanden warum das nicht funktioniert?

[QUOTE=rogu;94456]Die Frage ist nur… [B]was[/B] liefert mir denn den inhalt des Datenbankfeldes zurück?[/QUOTE]

$this->oxarticles__oxactive->value

Ansonsten kommst du weiter wenn du den Rat von vanilla beherzigst, dumpVar / debug sind dein Freund…

Hmm, scheint als würde das ganze dann wohl für mich doch noch eine ganze Weile dauern.
Muss mich noch eine Menge mit dem ganuen auseinandersetzen um es auch im vollen Umfang zu verstehen.

Hab es eben mal mit deinem Code getestet:


$Aktiv = $this->oxarticles__oxactive->value;
        $oUser = $this->getUser();
        if($oUser && $oUser->inGroup('0810672640493985c161475b0b487087'))
        {
            if($Aktiv == 1)
            {
                $sQ = " $sTable.testhide = 0";
            }
            else               
            {
                $sQ = " $sTable.oxactive = 1 ";   
            }
        }
        else 
        {
            $sQ = " $sTable.oxactive = 1 ";
        } 

allerdings hat das immernoch nichts geändert.

Ist mir ehrlich gesagt ein Rätsel wieso es so nicht klappt und vorallem wie es denn klappen könnte.

Aber was solls, so hab ich immerhin was zu tun :slight_smile: