come creare un blocco statico multilingue


23

Devo creare un blocco statico multilingue. Finora ho creato un blocco statico con ID 'delivery_returns'.

Lo sto chiamando in catalog \ product \ view.phtml in questo modo:

$deliveryBlock = Mage::getModel('cms/block')->load('delivery_returns');
echo $deliveryBlock->getTitle();
echo $deliveryBlock->getContent();

Capisco che per tradurre questo blocco:

  1. Dovrei semplicemente crearne un altro.
  2. Scegli la lingua desiderata dal campo store_view
  3. e mantenere l'identificatore del blocco statico uguale all'originale.

Questo metodo funziona con 'footer_links' e anche con un altro blocco statico che ho creato, chiamato 'header_links', ma apparentemente non funziona con il blocco 'delivery_returns'. La modifica della lingua del negozio non carica il blocco 'delivery_returns' tradotto corrispondente

Cosa mi sto perdendo? C'è un modo migliore per raggiungere questo obiettivo?

Risposte:


25
  1. Crea un blocco statico per ogni lingua, tutti con lo stesso identificatore.
  2. Rendering del blocco con il cms/blockblocco. Aggiungerà automaticamente l'ID negozio per caricare la versione corretta del blocco.

Ecco un modo semplice per caricare e rendere il blocco direttamente nel file modello:

<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('delivery_returns')->toHtml() ?>

In alternativa, dichiarare il blocco in un file di layout e renderlo con <?php echo $this->getChildHtml('delivery_returns') ?>:

<block type="cms/block" name="product.delivery_returns" as="delivery_returns">
    <action method="setBlockId"><block_id>delivery_returns</block_id></action>
</block>

1
Non lo sapevo. Eccezionale.
Filwinkle,

Ricorda che ciò presenta alcuni problemi relativi alla memorizzazione nella cache dei blocchi. Non sono ancora sicuro di come risolvere oltre a disattivare la cache magento per questo blocco specifico ... :(
Joris Kroos,

Maggiori informazioni sui problemi di chache magento con blocchi con più viste del negozio vedi community.magento.com/t5/Version-Upgrades/…
Joris Kroos,

8

La risposta seguente parla dell'impostazione dell'ID negozio prima di caricare il modello, ma, come notato da @benmarks nel commento qui sotto, questo non è necessario, come accade nel _toHtml del blocco ().

Come con molti altri modelli di maghi, prova a impostare l'ID negozio desiderato prima di caricare il modello:

$deliveryBlock = Mage::getModel('cms/block')
                     ->setStoreId(Mage::app()->getStore()->getId())
                     ->load('delivery_returns');

echo $deliveryBlock->getTitle();

/**
 * You shouldn't print the content directly (although I'm assuming it's for debugging purposes only).
 * Use the code below, so as the possible content directives (the "{{ }}" thingies) would be interpreted.
 * Check out Mage_Cms_Block_Block::_toHtml().
 */
echo Mage::helper('cms')->getBlockTemplateProcessor()
                        ->filter($deliveryBlock->getContent());

2
Non necessario - lo cms/blockfa durante il rendering; vedi Mage_Cms_Block_Block::_toHtml()(link)
benmarks

Hai ragione. Strano, non l'ho notato. Indico anche l'OP proprio quel metodo di cui stai parlando.
nevvermind,

In realtà, quando ottiene il blocco , Mage imposta l'ID del negozio. Considerando che ho istanziato direttamente il modello e che non aveva l'ID negozio impostato. Vedere Mage_Cms_Block_Block::_toHtml().
nevvermind,

Non sono sicuro di cosa intendi: non vedo nulla in Mage_Core_Model_Blockcui impostare l'ID del negozio.
benmarks

Non è il blocco di cui sto parlando, ma Mage_Cms_Block_Block .
nevvermind,

4

L'ho realizzato in uno dei seguenti modi:

  1. Basta usare un nome di blocco statico diverso, copiare e tradurre e fare riferimento ad esso nel tema separatamente.
  2. Puoi usare `{{translate text =" text per tradurre "}} in qualsiasi pagina di blocco statico cms implementando la seguente soluzione alternativa:

    • copia app / codice / core / Mage / Core / Model / Email / Template / Filter.php in app / code / local / Mage / Core / Model / Email / Template / Filter.php e modifica quanto segue:

-

public function translateDirective($construction)
{
    $params = $this->_getIncludeParameters($construction[2]);
    $text = $params['text'];
    return Mage::helper('page')->__($text);
} 

Ulteriori informazioni / fonte:

http://jagdeepbanga.com/blog/magento_how_add_translation_ability_into_cms_page_or_static_block.html


Sì, ho visto quelle soluzioni. Ma entrambi sono soluzioni alternative. Con il metodo 1 devo quindi duplicare product \ view.phtml per ogni storeview. Il metodo 2 richiede la modifica del file .csv. Pertanto, entrambi NON sono adatti a client non sviluppatori con cui lavorare. Non c'è un modo corretto per farlo? Con il mio metodo, il client può creare e modificare il contenuto di blocchi statici e funziona con header_link e footer_links. Non capisco perché non lavorare con delivery_returns: S
ruuter

Vorrei che ci fosse un modo "più semplice": l'unico altro modo per gestirlo sarebbe quello di estrarre il contenuto tramite Ajax e caricarlo da una fonte esterna.
Filwinkle,

FWIW - Ho avuto una grande fortuna con la soluzione 2; Uso entrambi su base regolare.
Filwinkle,

Ho pensato ad Ajax, ma questo rende ancora più difficile per il cliente cambiare contenuto. Immagino che sceglierò il tuo metodo 1. e creerò diversi file view.phtml per ogni lingua. Se non ci sarà presto una soluzione migliore, segnerò la tua risposta come accettata. Grazie comunque!
ruuter,

1

Puoi scaricare un modulo che ho creato sulla base di questa risposta da qui: https://github.com/miguelbalparda/MB_Translate/ Rende disponibile il traduttore in linea di Magento nelle pagine CMS / Block.


Le risposte a collegamento singolo non sono le migliori. Spiega cosa fa l'estensione. So cosa fa e lo consiglio, ma lo chiarisco un po 'per tutti.
Marius

Certo, rende disponibile il traduttore in linea di Magento nelle pagine CMS / Block.
mbalparda,

Aggiungi la tua risposta.
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.