Kohana/PHP – Hinzufügen weiterer Informationen zu einem Datensatz, bevor er an die Ansicht übergeben wird

StackOverflow https://stackoverflow.com//questions/25016225

Frage

Szenario:Ich habe eine Ansicht, an die ich ein Kohana-Datensatzobjekt übergebe, und die Ansicht durchsucht jeden Datensatz und zeigt seine Werte im entsprechenden Format an.In der Ansicht muss ich den Benutzer mit einer Nachricht benachrichtigen.Diese Warnung wird nur aktiviert, wenn ein bestimmtes Kriterium erfüllt ist, z. B. muss die Ansicht PHP-Datediff mit dem ausführen date Überprüfen Sie die Eigenschaft jedes Datensatzes und prüfen Sie, ob es der beste Zeitpunkt ist, dem Benutzer die Warnung anzuzeigen.

Was ich denke, ist, dass ich die Berechnung nicht in der Ansicht, sondern im Controller durchführen würde.Allerdings halte ich es für eine schlechte Idee, innerhalb des Controllers eine Schleife zu haben, die jeden Datensatz durchläuft, die Berechnung durchführt und den Datensatz zusammen mit zusätzlichen, für die Ansicht spezifischen Eigenschaften in ein Wrapper-Objekt einschließt.Was ich suche, ist so etwas wie ein Rückruf im Modell, der jedes Mal aufgerufen wird, wenn ein Datensatz abgerufen wird.Dort kann ich meine Berechnungen durchführen und das Objekt zurückgeben.Ist ein solcher Ansatz mit Kohana möglich?Wenn nicht, sagen Sie mir bitte, welche Lösung diese Anforderung am besten erfüllt.

Vielen Dank für Ihre Zeit und Aufmerksamkeit.

War es hilfreich?

Lösung

Ja, Ihr Vorschlag ist in der Tat gut und ich verwende ihn ständig.

Ich gehe davon aus, dass Sie ein Modell haben, das ORM erweitert.Als Beispiel könnten Sie so etwas tun.

class Model_Example extends ORM {
    protected $_primary_key = 'id';
    protected $_table_name = 'example_table';
    // possibly relations, filters etc.

    function should_message_be_shown() {
        if( !$this->_loaded ) {
            throw new Kohana_Exception('Should only be called on loaded objects');
        }

        if( $this->date_created > ( time() - 3600 ) ) {
            return true;
        }
        return false;
    }

    function get_user_message() {
        if( !$this->_loaded ) {
            throw new Kohana_Exception('Should only be called on loaded objects');
        }

        return 'Hi ' . $this->user_name . '! This is your personal message';
    }
}

Die Methode should_message_be_shown() nutzt die Klassenvariable Model_Example::date_created.Dies setzt voraus, dass Sie eine Tabellenspalte mit dem Namen haben date_created welches einen UNIX-Zeitstempel enthält.In diesem speziellen Beispiel wird also „true“ zurückgegeben, wenn der Datensatz innerhalb der letzten Stunde erstellt wurde.

Ich habe eine Überprüfung hinzugefügt, um zu sehen, ob der Datensatz tatsächlich geladen ist, und andernfalls eine Ausnahme auszulösen.

Um das Beispiel zu vervollständigen, können Sie das Modell in Ihrem Controller abrufen und verwenden und wie folgt anzeigen:

class Controller_Example extends Controller {
    function action_index() {
        $records = ORM::factory('Example')->where('something', '=', true)->find_all();
        $this->response->body(View::factory('example')
                ->set('examples', $records));
    }
}

Und die Ansichtsdatei:

<div class="example-list">
    <?php foreach($examples as $example): ?>
        <div class="example-item">
            <h2><?php echo $example->title; ?></h2>
            <?php if($example->should_message_be_shown()): ?>
                <div class="message">
                    <?php echo $example->get_user_message(); ?>
                </div>
            <?php endif; ?>
        </div>
    <?php endforeach; ?>
</div>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top