• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Abfrage mit zend-db Select führt immer zu gleichem Ergebnis

Katja_bo

New member
Moin liebes Forum,

ich verzweifel hier grade etwas.
Ich steige grade um von ZF1 auf ZF3 und versuche grade meine ersten Schritte.
Im Moment möchte ich mir ein Datenbank gestützte Übersetzungsstrategie aufbauen.
Dazu habe ich mit eine Datenbankanbindung zu MySQl aufgebaut und per 'charkey' und zugehörige 'Language' (zuzeit nur '1' für Deutsch).
Das funktioniert auch ziemlich gut, ich bekomme die Daten zurück die ich erwartet habe. Aber: genau 1x, danach macht meine Datenbankanbindung kein refresh.
Alle Variablen werden sauber übergeben.

Da der Abruf an sich ja funk. stelle ich nur die m.E.n. relevanten Codesnipes hier rein, ich finde es nicht schön 5 Seiten Code zu posten und zu sagen lies mal durch und gib mir eine Lösung. Für Interessierte, die wissen wollen was ich da so zusammenfriggel, habe ich aber das Projekt mal als ZIP angehängt.

Ich glaube auch eher dass der Fehler im Zusammenspiel der einzelnen Komponenten zu finden ist.

Was ich mache ist folgendes:
Ich habe ein ContentDbTable Objekt.
Das stellt ein paar Methoden und den Constructor dem Objekt ContentTable zur Verfügung. Der Constructor sieht so aus:

Code:
public function __construct($adapter)
        $this->adapter= $adapter;
}

Ein ContentTable Objekt erweitert das ContentDbTable Objekt um die fetch Methode:

Code:
class ContentTable extends ContentDbTable{
  public function fetchByCharKey($charkey){
        $this->table(); 
        $this->select->where('fk_language=' . 1 . ' AND '. "charkey='" . $charkey ."'");
        $this->select->order('content ASC');
        $k=null;
        $k= $this->tabelGateway->select();
        $v=$k->current();
        if (!$v){
            $c=$charkey;
        } else {
            $c=$v->getContent();
        }
        return $c;
        
    }
}
Die aufgerufene Methode table() ist bereits ein verzweifelter Versuch den Refresh zu erzwingen - ich kann sie gezielt aufrufen / ja,sie ist überflüssig- und sieht so aus:

Code:
public function table()
    {
        $resultSetPrototype = new ResultSet();
        $resultSetPrototype->setArrayObjectPrototype(new Content());
        $this->tabelGateway= new  TableGateway('content', $this->adapter, null, $resultSetPrototype);
        $this->select=new Select;
}
Es gibt auch noch ein Wert-Model mit „exchangeArray“

Aufgebaut wird das Objekt über ein View-Helper (den ich dann einfach in die Views einstricke):

Code:
use Zend\View\Helper\AbstractHelper;
use Content\Model\ContentTable;

class Content extends AbstractHelper
{
    protected $table;
    protected $serviceLocator;
        public function __construct($container) {        
            $this->table= new ContentTable($container);
    }  
    public  function translate($chakey){
        $r=$this->table->fetchByCharKey($chakey);
        return $r;       
    }    
}
Der Viewhelper hat eine Factory:

Code:
class ContentFactory implements FactoryInterface
{
    public function __invoke(
        ContainerInterface $container,
        $requestedName,
        array $options = null
    ) {
        $content = new Content($container->get(Adapter::class));
           return $content;
    }
}
Und die Factory wird in Module.Config.php aufgerufen:

Code:
'view_helpers'=> [
        'factories'=>[
            View\Helper\Content::class => View\Helper\ContentFactory::class,
            
        ],
        'aliases'=>[
            'translate' => View\Helper\Content::class
        ]
    ],
Tja und im View rufen ich dann nur noch

Code:
$this->translate()->translate($test)
auf.
1x Funktioniert es auch.
Wenn ich dann die $test variable mit einem anderen Wert fülle erhalte ich beim Neuladen der Seite den alten Wert.

Wo kann ich da auf die Suche gehen, ein Anhaltspunkt reicht bestimmt schon. Aber ich weiß im Moment nicht mehr wo ich suchen soll.


Danke im Vorraus, Katja
 

Anhänge

Zuletzt bearbeitet von einem Moderator:

Kaiuwe

Super-Moderator
Hallo Katja,
der Aufbau ist etwas verwirrend und du musst den momentanen Stand der Anwendung mal aufräumen:

* „Content\Model\Content->getContent()“ – verwirrend
* „ContentTable“ vs. „ContentDbTable“ – eine Klasse reicht hier aus
* zend-config in „Content\Module“ unnötig
* „ApplicationStandardController“ unnötig
* „view_helpers“ falsch in „Application/config/module.config.php“ – kann komplett entfernt werden
* usw.

Wenn du etwas aufgeräumt hast, dann übergib nicht den Datenbankadapter an deine „ContentTable“-Klasse sondern das fertige „TableGateway“-Objekt. Dann kannst du folgendes verwenden:

Code:
public function fetchByCharKey(string $charkey) : ?string
{
    $select = $this->tabelGateway->getSql()->select();

    $select->where->equalTo('fk_language', '1');
    $select->where->equalTo('charkey', $charkey);
    $select->order('content ASC');

    /** @var \Zend\Db\ResultSet\ResultSet $resultSet */
    $resultSet = $this->tabelGateway->selectWith($select);

    if ($resultSet->count()) {
        /** @var \Content\Model\Content $content */
        $content = $resultSet->current();

        return $content->getContent();
    }

    return null;
}
Damit wird jedesmal eine neue „Select“-Abfrage erstellt und nicht die Vorgehende ständig nur erweitert.
 
Oben