Vorgehen neue DB-Tabelle --> Anzeige im Frontend

Hallo zusammen,

ich hänge mal wieder an etwas fest.
Wenn ich beispielsweise eine neue Artikeleigenschaft in der Tabelle “oxarticles” festlege, dann kann ich das ja (dank Lazy Loading ??) sehr einfach realisieren. Im Template selbst kann ich dann mittels

$oDetailProduct->oxarticles__.....

auf das Feld zugreifen.
So weit, so gut.

Nun habe ich aber eine eigene Datenbanktabelle erstellt, und möchte diese nun angezeigt bekommen (im Frontend).

Dazu erweitere ich die Klasse “details”, habe eine Funktion, welche mir die Daten aus der Datenbank holt, und möchte nun die Daten im Template ausgeben können.

Wie wäre denn hier das generelle vorgehen? Wie kann man eigene Tabellen im OXID-Framework nutzen?

Ich danke für eure Hilfe!!!

grüße
Dennis

bei der Klasse “details” handelt es sich um die Produktseite, allerdings musst du aufpassen: ab der 4.9 werden die Produktdetilseiten als Widgets geladen und dafür ist nicht mehr details zuständig, sondern oxArticleWidget oder sowas in der Richtung.

Generell ist es so: details ist die entsprechende view Klasse und wird im Template mit $oView angesprochen.
Also wenn da sowas wie $oView->getActiveArticle() steht, dann kannst du davon ausgehen, dass die Funktion getActiveArtcile in details.php zu finden ist. Oder in der Klasse, von der details erbt.
Dann erweiterst du details.php um deine eigene Funktion “meineFunktion()” und somit kannst du in dem Template ebenso $oView->meineFunktion() arbeiten.

Aber wie gesagt, 4.9 und widget und so. Aber im Template tpl/page/details/details.tpl wird es funktionieren.

Ok,
ich versuche Folgendes hinzubekommen:

Ich möchte im Frontend (Artikeldetailseite) ein neues Tab mit Informationen, welche aus einer eigenen Tabelle der Datenbank kommen, anzeigen.

Dazu habe ich die Tabelle erstellt (sa_foodinfo).
Als Referenz benutzte ich das “OCB_TOURDATES”-Modul aus dem Oxid Kochbuch.

Demnach habe ich einen Controller erstellt:
sa_foodinfo_details.php


class sa_foodinfo_details extends sa_foodinfo_details_parent
{
    public function getFoodDetails()
    {
        $oFoodinfo  =   oxNew('sa_foodinfo_list');
        $ProductId  =   $this->getProduct()->oxarticles__oxid->value;
        $oFoodinfo  =   getDetailsForProduct($ProductId);

        return $oFoodinfo;
    }
}


Das Modell (sa_foodinfo.php)


class sa_foodinfo extends oxI18n
{
    protected $_sClassName  =   "sa_foodinfo";
    protected $s_CoreTable  =   "sa_foodinfo";
    public function __construct()
    {
        parent::__construct();
        $this->init();
    }
}

Das Modell der Liste (sa_foodinfo_list.php)


class sa_foodinfo_list extends oxList
{
    protected $sObjectInListName    =   'sa_foodinfo';
    public function getDetailsForProduct($ProductId)
    {
        $sTable     =   getViewName('sa_foodinfo');
        $sSelect    =   "SELECT * FROM $sTable ";
        $sSelect   .=   "WHERE ARTNR = '" - $ProductId ."'";
        $this->selectString($sSelect);
    }
}

Für die Anzeige im Frontend nutze ich zwei Blocks
sa_fooddata.tpl -> erstellt ein Tab mit statischem Inhalt


[{$smarty.block.parent}]
[{block name="fooddata"}]
[{capture append ="tabs"}]
    <a href="#fooddata">Gerichtskennzeichnung</a>
[{/capture}]
[{capture append="tabsContent"}]
<div id="fooddata">
    <ul>
        ...
    </ul>
</div>
[{/capture}]
[{/block}]


Der Zweite Block erweitert den Ersten mit dem Inhalt aus der Datenbank:
sa_foodinfo.tpl


[{$smarty.block.parent}]
[{block name="sa_foodinfo"}]
    [{capture append="tabs"}]<a  href="#sa_foodinfo">Lebensmittelinformationen</a>
    [{/capture}]
    [{capture append="tabsContent"}]
        <div class="sa_foodinfo" id"sa_foodinfo">
            <h1>Blubb</h1>
            [{foreach from=$oView->getFoodDetails() item='detail'}]
                [{$detail->sa_foodinfo__fett->value}]
            [{/foreach}]
            [{debug}]
        </div>
    [{/capture}]
[{/block}]

Der Vollständigkeit halber noch die metadata.php:


$aModule=array(
    ...
    'extend'=>array(
        'oxwarticledetails'         =>  'sa/sa_foodinfo/controllers/sa_foodinfo_details'
    ),


    'files' => array(
        'sa_foodinfo'           =>  'sa/sa_foodinfo/models/sa_foodinfo.php',
        'sa_foodinfo_list'      =>  'sa/sa_foodinfo/models/sa_foodinfo_list.php',
        'sa_foodinfo_details'   =>  'sa/sa_foodinfo/controllers/sa_foodinfo_details.php'

    ),

    'blocks'=> array(
        array(
            //Frontend
            'template'=>'page/details/inc/tabs.tpl',
            'block'=>'details_tabs_longdescription',
            'file'=>'views/blocks/sa_foodinfo.tpl',
        ),
        array(
            'template'=>'page/details/inc/tabs.tpl',
            'block'=>'sa_foodinfo',
            'file'=>'views/blocks/sa_fooddata.tpl',
        ),
    )
);

in der Datanbank habe ich zum testen einen Datensatz angelegt, und diesen mit einem Artikel (über die oxid des oxarticles) verknüpft.

Wenn ich nun auf eine Artikeldetailseite gehe wird auf die Index zurückgeleitet.

Im log steht:

Function 'getFoodDetails' does not exist or is not accessible! (oxwArticleDetails)

.
Version: 4.9.1

Wo hab ich da den Hänger?

Vielen Dank für eure Mühen!!!

gruß dennis

ich habs mir jetzt nicht komplett durchgelesen aber die fehlermeldung deutet darauf hin, dass die funktion an der gewünschten stelle nicht aufgerufen werden kann (evtl. das objekt an dieser stelle nicht vorhanden?)

wäre evtl. lazyloading eine möglichkeit?

oxwArticleDetails wird nicht überladen, schau mal unter Module, Tab “installierte Module” was da los ist, evtl. ist der Eintrag durchgestrichen oder mehrfach vorhanden.

Hi,

Danke für die Hilfe.
Da sieht alles gut aus.

Ist denn die prinzipielle Herangehensweise in Ordnung?

grüße
Dennis

:confused:

Hello,

nach einem “Schritt für Schritt” Debug konnte ich erkennen,
das alles bis $oFoodinfo = getDetailsForProduct($ProductId); ausgeführt wird.
Dort wird dann abgebrochen.
Aber diese Methode habe ich doch selbst geschrieben, warum wird sie nicht gefunden=?

Dann ist der Logfile-Fehlereintrag den du gepostet hast nicht aktuell. Bei dem Methodenaufruf “getDetailsForProduct” fehlt das Objekt auf dem die Methode ausgeführt wird. Das müsstest du dir aus der Liste holen, mit foreach über die Liste iterieren, da die Liste nur einen Eintrag hat ist das dein Objekt. Einfacher wäre es imho für das Model “sa_foodinfo” eine Methode zu schreiben die direkt das Objekt mit dem richtigen Eintrag anhand der Artikelnummer lädt, dann kannst du dir die Liste sparen.

hi,

sorry, ja, ich habe nun keinen Fehler mehr im Logfile, sondern im
Template (lasse ich mir mit debug zeigen)
“Fatal error: Call to undefined function getDetailsForProduct() in …”

Also irgendwie wird meine methode “getDetailsForProduct()” nicht gefunden… aber warum ?

danke für die Hilfe!

EDIT:
in der Variable “ProductId” wird auch die korrekte article_id geholt.

Hab ich doch grade erklärt warum. So schaut ein Methodenaufruf aus:
$objekt->methode();
und nicht so:
methode();

ok, das war natürlich äußerst dumm von mir. Sorry.

jetzt die letzte Hürde:

Ich habe (wenn ich [{debug}] einschalte) die Daten im Template. allerdings werden mir diese nicht auf der Seite angezeigt, und im Debug steht das mit Zusatz “raw”

->sa_foodinfo__oxid = null

oxBase Object (20)
->__oxid = oxField Object (1)

es scheint mir so, als wäre nur der raw-Wert verfügbar. Wie komm ich denn an den “Normalen”?

sorry:

den Zugriff mache ich mittels


<ul>
[{foreach from=$oView->getFoodDetails() item=detail}]
  <li>
                [{$detail->sa_foodinfo__menunr->value}]
                [{$detail->sa_foodinfo__menunr->value}]
                [{$detail->sa_foodinfo__energie->value}]
                [{$detail->sa_foodinfo__fett->value}]
                [{$detail->sa_foodinfo__fettsauren->value}]
                [{$detail->sa_foodinfo__kohlenhydrate->value}]
                [{$detail->sa_foodinfo__zucker->value}]
                [{$detail->sa_foodinfo__eiweiss->value}]
                [{$detail->sa_foodinfo__salz->value}]
                [{$detail->sa_foodinfo__artnr->value}]
</li>

</ul>
[{/foreach}]


Hello,

jemand eine Lösungsrichtung?

Wenn ich ein “eigenes” Frontend entwerfe, dann kann ich auch auf eigens erstellte Tabellen zugreifen. Aber in der Detailansicht will das nicht so recht funktionieren.

Ist die grundlegende Herangehensweise denn korrekt?

Danke für eure Mühen.

Grüße
Dennis

Ist das nicht das gleiche wie bei AnySun?

Den Fehler im Query hast Du gefunden?

Ist folgendes beabsichtigt?

'extend'=>array(
        'oxwarticledetails'         =>  '[B]sa/sa_foodinfo/controllers/sa_foodinfo_details[/B]'
    ),


    'files' => array(
        'sa_foodinfo'           =>  'sa/sa_foodinfo/models/sa_foodinfo.php',
        'sa_foodinfo_list'      =>  'sa/sa_foodinfo/models/sa_foodinfo_list.php',
        'sa_foodinfo_details'   =>  '[B]sa/sa_foodinfo/controllers/sa_foodinfo_details.php[/B]'

Hi,

sorry für die späte Rückmeldung:
ja, anisun und ich haben am selben Problem gearbeitet. Wir hatten zunächst jeweils andere Ansätze…

Ich habe für mich beschlossen, dass ich nicht mehr weiter versuche das vorhandene Frontend anzupassen, sonder entwickle gerade ein “eigenes”. Der Zugriff auf eigen-erstellte Datenbanktabellen ist hier irgendwie auch einfache :slight_smile: .

Danke für die Hilfe zu diesem Thema.

Grüße
Dennis