Assign var in Blocktemplate

Hey, ich nochmal:

Ich habe gerade gesehen, dass in der template-datei für e-mails ([B]order_cust.tpl[/B]) in den ersten paar Zeilen bereits einige Variablen gefüllt werden:


[{assign var="shop"      value=$oEmailView->getShop() }]
[{assign var="oViewConf" value=$oEmailView->getViewConfig() }]
[{assign var="oConf"     value=$oViewConf->getConfig() }]
[{assign var="currency"  value=$oEmailView->getCurrency() }]
[{assign var="user"      value=$oEmailView->getUser() }]
[{assign var="oDelSet"   value=$order->getDelSet() }]
[{assign var="basket"    value=$order->getBasket() }]
[{assign var="payment"   value=$order->getPayment() }]
[{assign var="sOrderId"   value=$order->getId() }]
[{assign var="oOrderFileList"   value=$oEmailView->getOrderFileList($sOrderId) }]

Jetzt ergänze ich einen Block und würde gerne Werte vom Backend (Einstellungsmaske) ergänzen, aber möglichst ohne diesen Teil zu überschreiben. Wenn also möglich, dann lediglich in dem überschriebenen Block.

Muss ich dafür noch eben diese Variablen an die tpl-Datei anhängen? Vermutlich wird es ja nicht sowas geben wie MyExt->MyField

// update:

Versuche es gerade mit der render-methode im Ordner views der extension. Vllt. wenn ich in der Metadata eine Klasse extende, da eine render-methode definiere und die besagten vars als template-variable mit rendere.

// update 2:

Hmm… das klappt leider noch nicht so ganz:


    public function render() {
        $this->getParent()->addTplParam('oMyVar', $this);

        return parent::render();
    }

public function getProperty($property) {
        $myConfig = $this->getConfig();
        $sShopId = $myConfig->getShopId();
        $sModuleId = oxConfig::OXMODULE_MODULE_PREFIX . 'myext';

        return $myConfig->getShopConfVar($property, $sShopId, $sModuleId);
    }

rendere ich das in die falsche view?

// update 3

Wenn ich mir das ganze var_dumpe (also in der klasse, die ich selbst angelegt habe, kriege ich die richtigen werte ausgegeben). Aber wenn ich versuche im template das Objekt zu var_dumpen, gibts null aus

Niemand ne Idee? Vielleicht nen Ansatz für das Debugging, damit ich den Fehler lokalisieren kann?

Versuche es gerade mit der render-methode im Ordner views der extension. Vllt. wenn ich in der Metadata eine Klasse extende, da eine render-methode definiere und die besagten vars als template-variable mit rendere.
:confused::confused::confused:
Versuch doch mal genau zu beschreiben was du machen willst und wie du es versucht hast. Also mit konkreten Dateinamen, Blocknamen, dazugehörigen Einträgen in metadata, und so weiter.

@ frank:

also, in meiner Metadata habe ich folgende Zeile:


'extend' => array(
        'oxcmp_shop' => 'tronet/tropaycode/application/components/tropaycode_oxcmp_shop',
    ),

Meine überschreibende Datei sieht so aus:
Pastebin der tropaycode_oxcmp_shop.php

Was ich vorhabe ist, im E-Mail-Template an einem bestimmten Block die Konfigurationseinstellungen bzw. die Werte der Konfig-Maske auszugeben.

Wieder metadata:


    'settings' => array(
        array('group' => 'main', 'name' => 'sTroPaycodeConfigKey', 'type' => 'str', 'position' => 1, 'value' => ''),
        array('group' => 'main', 'name' => 'sTroPaycodeTextBefore', 'type' => 'str', 'position' => 2, 'value' => 'Nachfolgendem Paycode folgen'),
        array('group' => 'main', 'name' => 'sTroPaycodeTextAfter', 'type' => 'str', 'position' => 3, 'value' => 'Kurz, schnell, einfach'),
    ),

Mich interessieren die Felder TextAfter und TextBefore.

wenn ich mir jetzt im template das Objekt debuge


[{$oTroPaycodeOxcmpShop|var_dump}]

ist es jedoch NULL.

Rufe ich in der Klasse das ganze auf, kriege ich die richtigen Werte. Also scheint irgendwas beim assign nicht richtig zu sein, nehme ich an.


// Hiermit kriege ich es auf der Startseite ausgegeben
$this->getParent()->addTplParam('myVarName', $this);

Jetzt hab ich es aber nur auf der Startseite im Kontext verfügbar, nicht im eigentlichen E-Mail Block :confused:
Da krieg ich die Meldung das es ein non-object wäre.

Warum extendest du oxcmp_shop? Das wird in der E-Mail nicht geladen denke ich. Du könntest doch oxemail erweitern. Dann müsste das so gehen:

[{assign var="meinWert" value=$oEmailView->getProperty('sTroPaycodeTextAfter')}]

$oEmailView ist eine Instanz von oxemail.
“getProperty” würde ich die Methode eher nicht nennen, häng lieber ein Prefix dran.

Habe jetzt in der Metadata folgendes verändert:


'extend' => array(
        'oxemail' => 'tronet/tropaycode/application/components/tropaycode_email',
    ),


Dementsprechend die Klassennamen der überschreibendenen Klassen geändert, Modul deaktiviert und reaktiviert, tmp geleert und neu versucht - leider immernoch non-object.
Ich habe es allerdings minimal anders, was aber theoretisch dennoch klappen sollte:


<div>
    <strong>[{oxmultilang ident="TRO_PAYCODE_PAY_VIA_PAYCODE" }]</strong>
    <p>
        [{$oTroPaycodeEmail->getProperty('sTroPaycodeTextBefore')}]
        <br />
        <br />
        <strong>Paycode</strong>
        <br />
        <br />
        [{$oTroPaycodeEmail->getProperty('sTroPaycodeTextAfter')}]
        <br />
    </p>
</div>

Die Fehlermeldung ist:

Fatal error: Call to a member function getProperty() on a non-object in /var/www/tronet0111/data/www/dfu.dev12.tro.net/tmp/smarty/df622e0fae1de023ce36400343c89528^%%D3^D37^D37E7128%%order_cust.tpl.php on line 857

Wo ist denn [B]$oTroPaycodeEmail[/B] ?

Ich dachte, dass würde mittels dem Part hier klappen:


class tropaycode_email extends tropaycode_email_parent {

    public function render() {
        $this->getParent()->addTplParam('oTroPaycodeEmail', $this);
        return parent::render();
    }

}

Wenn du oxemail extendest brauchst du deine Template-Variable “oTroPaycodeEmail” doch gar nicht. oxemail weist sich selbst bereits der Template-Variable “oEmailView” zu:


    protected function _getSmarty()
    {
        if ( $this->_oSmarty === null ) {
            $this->_oSmarty = oxRegistry::get("oxUtilsView")->getSmarty();
        }

        //setting default view
        $this->_oSmarty->assign( "oEmailView", $this );

        return $this->_oSmarty;
    }

Das heißt du kannst im Template mit $oEmailView direkt alle public Methoden aus oxemail verwenden.

(oxemail hat auch gar keine “render” Methode)

Aaaaah! Nun hats klick gemacht.
Wollte mir gerade die oxemail ansehen, aber leider verschlüsselt :smiley:
Klappt perfekt wie du beschrieben hast, leofonic.

Vielen Dank!


[{assign var="after" value=$oEmailView->getProperty('sTroPaycodeTextAfter')}]
[{assign var="before" value=$oEmailView->getProperty('sTroPaycodeTextBefore')}]

und dann simpel mit “Hallo [{$before}]” … Dankeschön! :slight_smile: