Modul zum auflisten aller Produkte

Hi,

ich versuche mich mal ins kalte Wasser zu stoßen und zum basteln ein eigenes Modul zu erstellen. Das Modul soll nichts anderes machen, als alle Produkte aufzulisten. Ich komme irgendwie nicht so recht voran und die Tutorials helfen mir nicht so recht.

Ich bin mir nicht sicher ob die Files an den richtigen Orten liegen, alles korrekt miteinander verbunden ist und vor allem wie ich es aufrufe. Über Hilfe bin ich sehr dankbar.

Was habe ich bisher:
metadata.php


<?php
/**
 * Module information
 */
$aModule = array(
    'id'           => 'liste',
    'title'        => 'liste',
    'description'  => 'Lists all articles',
    'version'      => '0.1',
    'author'       => 'Uwe Heldt',
	'email'			=> '[email protected]',
    'extend'       => array(
       'liste' => 'liste/liste.php', 
    ),
    'templates' => array('liste.tpl' => 'liste/out/tpl/liste.tpl')
);

liste.php


<?php 
class liste extends oxUBase {

  protected $_sThisTemplate = 'out/tpl/liste.tpl';

  public function getArticleList(){
      $sQuery = "SELECT * FROM oxv_oxarticles";
      $aArticleList = oxNew('oxarticlelist');
      $aArticleList->selectString($sqQuery);
      return $aArticleList->getArray();
  }
  
  public function render(){
    return parent::render();
  }
?>

out/tpl/liste.tpl


[{oxscript add="$('a.js-external').attr('target', '_blank');"}]
[{oxscript include="js/widgets/oxarticlebox.js" priority=10 }]
[{oxscript add="$( '#content' ).oxArticleBox();"}]

[{capture append="oxidBlock_content"}]
    [{if $oView->getArticleList()|@count > 0}]
        <h1 class="pageHead">[{$oView->getTitle()}]</h1>
        <div class="listRefine clear bottomRound">
            [{include file="widget/locator/listlocator.tpl" locator=$oView->getPageNavigationLimitedTop() attributes=$oView->getAttributes() listDisplayType=true itemsPerPage=true sort=false }]
        </div>
        [{* List types: grid|line|infogrid *}]
        [{include file="widget/product/list.tpl" type=$oView->getListDisplayType() listId="productList" products=$oView->getNewestArticleList()}]
        [{include file="widget/locator/listlocator.tpl" locator=$oView->getPageNavigationLimitedBottom() place="bottom"}]
    [{/if}]
    [{insert name="oxid_tracker"}]
[{/capture}]
[{include file="layout/page.tpl" sidebar="Left"}]

Danke und Grüße,
Uwe

Und, funktioniert es denn? Ich würde mich an deiner Stelle langsam herantasten, also erstmal einen Controller und ein Template machen und aufrufen. Wenn das geht, dann Funktionalität einbauen wie echo “test”, wenn das funktioniert eine Artikelliste erstellen etc. Dann kannst du auch konkreter fragen wenn ein Schritt nicht funktioniert.

Aufruf eines controllers funktioniert mit ?cl=controllername.

	
    'extend'       => array(
       'liste' => 'liste/liste.php', 
    ),

extend dient dazu bestehende Klassen zu überschreiben (extends *_parent). Für eigene Klassen (extends oxubase) ist das files array zuständig.

return $aArticleList->getArray();

Das Objekt ist bereits iterierbar und kann daher selbst zurückgegeben werden: return $aArticleList;

Hi Frank,

danke soweit. Denke ich komm mittlerweile voran. Ich habe mir im customs ein eigenes / neues Template mit einem neuen Block erstellt. Dieses wollte ich nun im Rahmen eines Moduls anpassen / den Block überschreiben. Dazu habe ich ein Template im Modul selber angelegt. Laut Logfile bekomme ich aber immer eine EXCEPTION_SYSTEMCOMPONENT_TEMPLATENOTFOUND Exception, welche darauf schließen lässt, dass Oxid diese nicht finden kann. Ich habe aber in dem blocks Bereich der metadata alles (aus meiner Sicht) korrekt angegeben.

Sowas schonmal gesehen?

Danke und beste Große,
Uwe

Im Logfile sollte auch stehen welches Template nicht gefunden wurde, und unter Systemgesundheit kannst du sehen ob die Blocks gefunden werden.

  • Die Systemgesundheit gibt keine Hinweise auf fehlende / fehlerhafte Blöcke
  • Die Meldung im Logfile hab ich vertauscht. Die war von gestern. Das richtige Template aus dem custom Folder zieht das System
  • Rufe ich das custom Template auf, ohne aktiviertes Modul schaut das gut aus
  • Sobald ich das Modul aktiviere und das Template erneut aufrufe (jetzt müsste er den überschriebenen Block nehmen) tut sich scheinbar nicht bzw. es sieht aus als lädt das System die Standard Custom Template. Im gleichen Zuge wird das Modul deaktiviert.

Irgendeine Idee?

Hier der Auszug aus der metadata.php:

'blocks' => array(
        array(
            'template' => 'custom/liste.tpl', 
            'block'=>'liste_main',                     
            'file'=>'/out/tpl/liste.tpl'
        )
    )

/out/tpl/liste.tpl ist der Pfad in meinem Modul
custom/liste.tpl ist der Pfad in dem custom Folder im Oxid selber

Gibt’s einen Eintrag im Exception Log? Könnte auch sein dass ein anderer Fehler das Modul abschaltet, probiere mal ohne den blocks Eintrag und mit blocks Eintrag und leerem liste.tpl.
Brauchst du das custom Template eigentlich nur für das Modul? Dann würde ich eher das Modul gleich das Template direkt aus dem Modulordner laden lassen.

Das hab ich alles hin und her probiert. Im Exceptions Log steht nichts.

In der Tat brauche ich das custom template nur für das Modul, ja. Blöde Frage; wie kann ich das Custom Template denn direkt aus dem Modul laden lassen? Hatte das so in Erinnerung. Der präferierte Wer wäre tatsächlich dieses aus dem Modul laden zu lassen. Wie mach ich das denn?

Danke Dir!

Uwe

So wie du es anfangs hattest, also ohne Blocks in metadata:

'templates' => array('liste.tpl' => 'liste/out/tpl/liste.tpl')

wird das im Pfad angegebene Template als “liste.tpl” erkannt. Geladen wird das Template was der Controller in render() zurückgibt. Oxubase gibt da standardmäßig folgendes zurück:


        return $this->_sThisTemplate;

Du kannst also in deinem Controller dein Template setzen:

 
    protected $_sThisTemplate = 'liste.tpl';
'extend'       => array(
       'liste' => 'liste/liste', 
    ),

(wobei es “liste” so nicht gibt, wenn nicht irgendwo angelegt)
oder

'files'       => array(
       'liste' => 'liste/liste.php', 
    ),

[QUOTE=leofonic;175881]So wie du es anfangs hattest, also ohne Blocks in metadata:

'templates' => array('liste.tpl' => 'liste/out/tpl/liste.tpl')

wird das im Pfad angegebene Template als “liste.tpl” erkannt. Geladen wird das Template was der Controller in render() zurückgibt. Oxubase gibt da standardmäßig folgendes zurück:


        return $this->_sThisTemplate;

Du kannst also in deinem Controller dein Template setzen:

 
    protected $_sThisTemplate = 'liste.tpl';

[/QUOTE]

Ich fasse nochmal zusammen, wie ich es jetzt ganz simpel habe. Leider geht es immer noch nicht. Mit der Variante kommt nun eine EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND (Faulty component --> liste)

Alle Dateien befinden sich aktuell zur Vereinfachung im Verzeichnis modules/liste

metadata.php


<?php
$aModule = array(
    'id'           => 'liste',
    'title'        => 'liste',
    'description'  => 'Lists all articles',
    'version'      => '0.1',
    'author'       => 'Uwe Heldt',
	'email'			=> '[email protected]',
	'url'			=> '',
    'extend'       => array(
       'oxcmp_utils' => 'liste/liste.php', 
    ),
    'templates' => array('liste.tpl' => 'liste/liste.tpl')
);  

liste.php


<?php 
class liste extends liste_parent {

  protected $_sThisTemplate = 'liste.tpl';

  public function getArticleList(){
      $sSQL = "SELECT * FROM oxarticles";
      
      $oArticleList = oxNew('oxarticlelist');
      $oArticleList->selectString($sSQL);
      
      return $oArticleList;
  }
  
  public function render(){
    return parent::render();
  }
}
?>

liste.tpl


[{capture append="oxidBlock_content"}]
My Template
[{insert name="oxid_tracker" title=$template_title}]
[{/capture}]

[{include file="layout/page.tpl"}]

Ich veruche das afzurufen mit doman/index.php?cl=liste

Danach kommt eine weiße Seite, das Modul ist sofort danach deaktiviert und die besagte Exception kommt im Logifle. Ich bin bald ratlos. Whats wrong?

Danke und beste Grüße,
Uwe

Guck mal in #9. Da steht alles, was du brauchst. Tu mal File anmelden und nix extenden.

Das steht in #2 auch schon wenn du mal hinschaust.

Eigener controller muss in files array und “extends oxubase” verwenden.

Ja, aber das ist falsch

'extend'       => array(
       'liste' => 'liste/liste.php', 
    ), 

Verstehe worauf du hinaus willst. Die Endung ‘.php’ müsste im extend array weg. Da wo die Zeile eigentlich hingehört, im files array, muss es dagegen dabei stehen.

Das hat zwar gedauert mit mir, aber es geht nun mit der files Variante.

Danke nochmal!

[QUOTE=leofonic;175954]Das steht in #2 auch schon wenn du mal hinschaust.

Eigener controller muss in files array und “extends oxubase” verwenden.[/QUOTE]

Eine Frage gleich noch. Wie kann ich denn jetzt von dem tpl Template auf eine function aus dem Controller zugreifen. Dadurch das es von oxubase ableitet, scheinen die Möglichkeiten da begrenzt? Ich habe im Controller eine function getArticleList Wie rufe ich die denn direkt auf?

Danke im Voraus…

Uwe

$oView->funktion()