Magento 1.9.2.0 masalah tampilan blok statis


77

Saya memiliki situs web dengan beberapa blok statis yang berfungsi di 1.9.1.0, tetapi dengan 1.9.2.0 blok statis mulai ditampilkan secara sporadis, karena terkadang menampilkan blok yang salah daripada blok yang benar. Terkadang mereka ditampilkan sesuai keinginan. Adakah yang tahu cara mengatasi masalah ini yang mungkin terkait dengan masalah ini ?


Ini kedengarannya tidak bisa direproduksi dan gila. Jika Anda memiliki penjelasan yang lebih baik, kami mungkin dapat membantu Anda, tetapi saya tidak melihat jalan, maaf.
Fabian Blechschmidt

2
Saya dapat mengkonfirmasi ini. Menemukannya di satu toko. Kunci cache identik antara 2 blok
Sander Mangel


9
Menurut Piotr, ini sekarang adalah bug yang dikonfirmasi dan sedang diperiksa oleh tim inti Magento.
patokan

1
Bug ini masih tampak pada 1.9.2.4. Menambahkan skenario / detail pada komentar pelacak bug .
zigojacko

Jawaban:


61

Saya punya masalah dengan EE 1.14.2 ini dan sepertinya masalah yang sama muncul di CE 1.9.2. Saya mendokumentasikan masalah dan solusi saya pada pertanyaan SE ini .

Pada dasarnya karena kode berikut ditambahkan ke konstruktor Mage_Cms_Block_Block:

$this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
$this->setCacheLifetime(false);

Blok statis CMS sekarang di-cache. Masalah muncul dari bagaimana info kunci cache dihasilkan. Itu kembali ke Mage_Core_Block_Abstractperilaku menggunakan nama blok dalam tata letak. Jika blok belum ditambahkan dengan tata letak, misalnya pada halaman cms, nama ini tidak ada. Ini dapat menghasilkan blok statis berbagi kunci cache yang sama dan terlibat dalam cache.

Solusi saya adalah mengganti Mage_Cms_Block_Blockkelas dan mengatur info kunci cache berdasarkan id blok dan penyimpanan saat ini.

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.2 and CE 1.9.2 when the _construct
 * method was added which turns on caching for cms blocks
 */
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{

    /**
     * If this block has a block id, use that as the cache key.
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        if ($this->getBlockId()) {
            return array(
                Mage_Cms_Model_Block::CACHE_TAG,
                Mage::app()->getStore()->getId(),
                $this->getBlockId(),
                (int) Mage::app()->getStore()->isCurrentlySecure()
            );
        } else {
            return parent::getCacheKeyInfo();
        }
    }
}

Jelas ini perlu ditambahkan dalam modul Anda sendiri dengan config.xmlfile dan blok override dll. Atau Anda dapat menyalin Mage_Cms_Block_Blockke kumpulan kode lokal dan menambahkan kunci cache di sana.

Anda dapat melihat baris baru ditambahkan pada 1.9.2 di sini


Bagaimana Anda membuat instance blok statis ini? Jika Anda melakukannya melalui tata letak xml, Anda bisa menambahkan nama unik ke blok Anda dan itu harus di-cache dengan baik. Dalam skenario mana Anda tidak akan memberi nama ke blok Anda (widget mungkin?)
Erfan

1
@ Erfan Masalah ini terjadi ketika menambahkan blok ke halaman CMS seperti ini {{tipe blok = "cms / blok" block_id = "block_id"}} atau ketika memuat blok statis langsung di templat
Andrew Kett

6
di sini adalah ekstensi gratis untuk masalah aneh ini. Semoga bermanfaat bagi semua orang yang menghadapi masalah ini. github.com/progammer-rkt/Rkt_SbCache
Rajeev K Tomy

@Rajeev Magento versi apa yang kompatibel? Apakah juga akan berfungsi dengan benar dengan Mage 1.6.x?
zitix

1
Saya membuat intisari untuk solusi sementara dari jawaban andrewkett. Cukup tambahkan aplikasi ini / kode / lokal / Mage / Cms / Block / Block.php ke direktori Magento Anda dan masalah akan terpecahkan. Ingatlah untuk menghapus file sebelum Anda melakukan pembaruan Magento Anda berikutnya (dengan asumsi mereka menyertakan perbaikan di pembaruan berikutnya).
Jay El-Kaake

13

Saya baru saja memutakhirkan ke 1.9.2.0 dan saya juga mengalami ini. Kategori yang diatur untuk menampilkan Blok Statis + Produk secara acak menampilkan Blok Statis yang salah. Ini tidak ada sebelum peningkatan 1.9.2.0 saya.

Perbaikan Sementara Menonaktifkan Blok Cache keluaran HTML dan blok yang ditampilkan dengan benar.


Saya menghadapi ini juga di halaman rumah dan di halaman produk
minggu

Ini bekerja untuk saat ini tetapi harus menjadi solusi pahit
minggu

Yap, inilah yang saya lakukan untuk saat ini.
Sharif

13

Di sini kita pergi dengan solusi berbasis modul lokal karena solusi di atas tidak menyediakan seluruh langkah. Kami perlu membuat modul Kustom karena Anda semua tahu bahwa Magento Boogieman akan membantu Anda! jika mengubah inti :)

Anda perlu file-file berikut: app/etc/modules/Bhupendra_Cms.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Bhupendra_Cms>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms/>
            </depends>
        </Bhupendra_Cms>
    </modules>
</config>

app/code/local/Bhupendra/Cms/etc/config.xml

<?xml version="1.0"?>
<config>
        <modules>
            <Bhupendra_Cms>
                <version>1.0.0</version>
            </Bhupendra_Cms>
        </modules>
        <global>
            <blocks>
                <cms>
                    <rewrite>
                        <block>Bhupendra_Cms_Block_Block</block>
                        <widget_block>Bhupendra_Cms_Block_Widget_Block</widget_block>
                    </rewrite>
                </cms>
            </blocks>
        </global>
</config>

app/code/local/Bhupendra/Cms/Block/Block.php

<?php
class Bhupendra_Cms_Block_Block extends Mage_Cms_Block_Block {

   public function getCacheKeyInfo()
    {

      $blockId = $this->getBlockId();
      if ($blockId) {
            $result = array(
                $blockId,
                Mage::app()->getStore()->getCode(),
            );
      } else {
           $result = parent::getCacheKeyInfo();
       }
       return $result;
   }

}

app/code/local/Bhupendra/Cms/Block/Widget/Block.php

class Bhupendra_Cms_Block_Widget_Block extends Mage_Cms_Block_Widget_Block
{
       /**
     * Storage for used widgets
     *
     * @var array
     */
    static protected $_widgetUsageMap = array();

    /**
     * Prepare block text and determine whether block output enabled or not
     * Prevent blocks recursion if needed
     *
     * @return Mage_Cms_Block_Widget_Block
     */
    protected function _beforeToHtml()
    {
        parent::_beforeToHtml();
        $blockId = $this->getData('block_id');
        $blockHash = get_class($this) . $blockId;

        if (isset(self::$_widgetUsageMap[$blockHash])) {
            return $this;
        }
        self::$_widgetUsageMap[$blockHash] = true;

        if ($blockId) {
            $block = Mage::getModel('cms/block')
                ->setStoreId(Mage::app()->getStore()->getId())
                ->load($blockId);
            if ($block->getIsActive()) {
                /* @var $helper Mage_Cms_Helper_Data */
                $helper = Mage::helper('cms');
                $processor = $helper->getBlockTemplateProcessor();
                $this->setText($processor->filter($block->getContent()));
                $this->addModelTags($block);
            }
        }

        unset(self::$_widgetUsageMap[$blockHash]);
        return $this;
    }

     /**
     * Retrieve values of properties that unambiguously identify unique content
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        $result = parent::getCacheKeyInfo();
        $blockId = $this->getBlockId();
        if ($blockId) {
            $result[] = $blockId;
       }
        return $result;
   }
}

Untuk informasi lebih lanjut, Anda dapat mengunjungi tautan berikut dan juga mengunduh darinya https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


Setup modul dan itu tidak membantu - masalah saya adalah bahwa blok CMS yang ditugaskan untuk kategori menghilang, mereka tidak muncul sama sekali.
Haim

@Haim jika Anda menggunakan 1.9.2.2 maka Anda perlu membuat masuk ke System-> izin -> blok cms dari blok tertentu
Bhupendra Jadeja

Saya menggunakan Magento ver. 1.9.2.0 - tapi sekali lagi masalah saya sedikit berbeda, saya menetapkan blok CMS untuk ditampilkan pada halaman kategori dan blok CMS tidak muncul - jika saya me-refresh cache yang ditampilkannya sampai waktu berikutnya hanya menghilang
Haim

Saya sarankan Anda untuk memperbarui versi magento saya pikir sudah sekarang.
Bhupendra Jadeja

7

Tidak ada tambalan resmi untuk ini, namun, itu diselesaikan pada CE 1.9.2.1

diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Block.php
74a75,94
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result = array(
>                 'CMS_BLOCK',
>                 $blockId,
>                 Mage::app()->getStore()->getCode(),
>             );
>         } else {
>             $result = parent::getCacheKeyInfo();
>         }
>         return $result;
>     }
diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Widget/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
>                 $this->addModelTags($block);
90a92,106
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $result = parent::getCacheKeyInfo();
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result[] = $blockId;
>         }
>         return $result;
>     }

Catatan: Telah dilaporkan bahwa masih ada masalah dengan halaman CMS pada banyak tampilan toko:

Magento CE 1.9.2.1 memperbaiki ini hanya sebagian.

Masalahnya masih berlanjut untuk Halaman CMS di beberapa tampilan toko. Berikut adalah Hotfix yang Diperbarui (Catatan ini bukan tambalan resmi): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch

Sumber: http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870



4

Saya dapat mengkonfirmasi masalah ini juga.

Untuk mereproduksi:

  1. Menggunakan CMS -> Widgets, buat widget untuk menambahkan blok statis ke sidebar kiri.

  2. Kemudian buat widget kedua untuk menambahkan blok statis kedua (blok berbeda dari dalam step 1) ke sidebar kiri.

  3. Jika cache dinonaktifkan, kedua blok statis ditampilkan dengan benar di sidebar.

  4. Tetapi jika Anda mengaktifkan cache, Anda akan melihat blok statis step 1 ditampilkan dua kali.


Hai Zitix Saya menghadapi masalah yang sama seperti Anda dapat Anda ceritakan bagaimana Anda menyelesaikan ini
Jaimin


3

Tingkatkan Magento ke 1.9.2.1

Saya melakukannya dan mengaktifkan cache untuk output Blok HTML dan tampaknya sudah diperbaiki.

Serta beberapa masalah keamanan dibahas dalam rilis baru.


3

Dalam versi terbaru Magento meningkatkannya dengan fitur keamanan baru. Anda dapat menambahkan izin di sistem-> izin ke blok statis.


2
di magento 1.9.2.0 ada masalah dalam caching blok statis, Anda berbicara tentang sesuatu yang berbeda.
minggu kerja

Bagus, saya tidak mengetahui fitur ini
amit_game

Saya suka ini. :)
zed Blackbeard

2

Saya memiliki masalah yang sama dengan toko saya. Solusi terbaik yang saya temukan sejauh ini adalah menonaktifkan caching untuk blok yang terpengaruh. Anda dapat melakukannya dengan mengatur masa pakai cache dari blok menjadi nol.

Menonaktifkan cache "Blok HTML keluaran" secara global di situs langsung bukan ide yang baik karena tidak perlu memengaruhi kinerja situs.

Menonaktifkan cache untuk satu blok di xml:

<block ... >
    ...
    <action method="unsetData"><key>cache_lifetime</key></action>
    <action method="unsetData"><key>cache_tags</key></action>
</block>

Menonaktifkan cache untuk satu blok di php:

$this->getLayout()->createBlock('cms/block')
    ->setCacheLifetime(null)
    ->setBlockId('block-id')
    ->toHtml();

Jangan setel masa cache menjadi "0" seperti yang ditunjukkan dalam artikel ini


Andreas - Saya ingin tahu apa dampak dari menggunakan teknik yang dijelaskan dalam artikel itu dan bagaimana bagaimana dua alternatif yang Anda berikan di sini menghindari konsekuensi negatif yang Anda uraikan?
Bryan 'BJ' Hoffpauir Jr.

1
pendekatan pertama tidak akan berhasil karena, magento akan menafsirkan bahwa pembaruan tata letak seperti $block->setCacheLifeTime("null");Catatan ini NULL dan "null" adalah dua hal yang berbeda (kemudian satu adalah string) dan karenanya hasil yang diharapkan tidak akan diperoleh.
Rajeev K Tomy

1
@ BJ Hoffpauir: Jika cache untuk blok cms / blok diaktifkan, cms / blok cache yang sama akan digunakan untuk semua tampilan store. Jika Anda memiliki versi bahasa Inggris (tampilan toko) dan Jerman (tampilan toko) untuk pengenal blok yang sama, baik bahasa Inggris atau Jerman akan digunakan untuk kedua tampilan toko. Menonaktifkan cache untuk blok ini menyelesaikan masalah. Jika Anda masih ingin melakukan cache blok Anda bisa melakukannya dengan meletakkan blok ke blok lain dan cache blok ini sebagai gantinya.
Andreas Riedmüller

1
@Rajeev Terima kasih, saya menemukan metode ini di beberapa posting, tapi saya yakin Anda benar. Saya mengubah metode untuk menonaktifkan cache di xml. Metode sebelumnya adalah jawaban yang diterima di sini: stackoverflow.com/questions/27684236/…
Andreas Riedmüller

2

Saya dapat memperbaiki masalah ini dengan memperbarui ekstensi yang ada di Magento Connection Manager. Setelah melihat ke dalamnya, saya mendapat kesan bahwa ada masalah dalam sistem caching Magento.

Secara default Magento memiliki beberapa paket yang terkait dengan teknologi caching. Mereka termasuk adaptor dan perpustakaan untuk Zend dan Redis.

Alih-alih mencoba mencari paket yang sesuai, saya memilih untuk memperbarui semua paket di instalasi saya.

Kemudian saya memilih tanda centang pada: Mage_All_Latest Yang merupakan Metapackage untuk rilis Magento 1.9.0.0 stabil terbaru.

Dimungkinkan untuk memperbaiki masalah ini dengan memutakhirkan hanya paket yang tepat. Saya merasa ini adalah cara yang lebih baik untuk pergi karena saya curiga bahwa metode ini juga menerapkan patch keamanan.


1

Anda harus melakukan upgrade penuh, atau backport 1.9.2.0

Perubahan cache Blok CMS dan Widget di 1.9.2.1

magento-1921 / app / code / core / Mage / Cms / Block / Block.php

diff -r magento-1920/app/code/core/Mage/Cms/Block/Block.php magento-1921/app/code/core/Mage/Cms/Block/Block.php
74a75,94
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result = array(
>                 'CMS_BLOCK',
>                 $blockId,
>                 Mage::app()->getStore()->getCode(),
>             );
>         } else {
>             $result = parent::getCacheKeyInfo();
>         }
>         return $result;
>     }

magento-1921 / app / code / core / Mage / Cms / Block / Widget / Block.php

diff -r magento-1920/app/code/core/Mage/Cms/Block/Widget/Block.php magento-1921/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
>                 $this->addModelTags($block);
89a91,105
>     }
> 
>     /**
>      * Retrieve values of properties that unambiguously identify unique content
>      *
>      * @return array
>      */
>     public function getCacheKeyInfo()
>     {
>         $result = parent::getCacheKeyInfo();
>         $blockId = $this->getBlockId();
>         if ($blockId) {
>             $result[] = $blockId;
>         }
>         return $result;

0

Saya menggunakan Magento 1.9.3.8 dan masalahnya masih ada.

Anda dapat menemukan perbaikan saya di sini :

Pada dasarnya saya menambahkan string unik berdasarkan url halaman dan blockId ke setiap info kunci cache, sehingga setiap blok akan memiliki kunci unik:

 /**
 * Generates a string based on the page url (for example category/product pages) and concatenate the block id to the url
 * Removes the caracters: /, . , &, = and , from this string
 */
private function generateUrlBasedString($blockId = null)
{
    $currentUrl = Mage::helper('core/url')->getCurrentUrl();
    $url = Mage::getSingleton('core/url')->parseUrl($currentUrl);
    $path = '_' . $url->getPath();

    $path = str_replace('/', '', $path);
    $path = str_replace('.', '', $path);
    $path = str_replace('&', '', $path);
    $path = str_replace(',', '', $path);
    $path = str_replace('=', '', $path);

    if(isset($blockId)) {
        $path .= '_' . $blockId;
    }

    return $path;
}
/**
 * Retrieve values of properties that unambiguously identify unique content
 *
 * @return array
 */
public function getCacheKeyInfo()
{
    $blockId = $this->getBlockId();
    if ($blockId) {
        $result = array(
            'CMS_BLOCK',
            $blockId,
            Mage::app()->getStore()->getCode() . $this->generateUrlBasedString($blockId),
        );
    } else {
        $result = parent::getCacheKeyInfo();
    }
    return $result;
}

Sampai Magento akan menyiapkan perbaikan untuk masalah ini, Anda dapat membuat file:

app / code / local / Mage / Cms / Block / Block.php

dan masukkan kode dari url github di atas sebagai konten.

Kode ini diuji untuk Magento 1.9.2. * Dan 1.9.3. *


-1

Ini adalah bug yang dikonfirmasi dalam versi 1.9.2, untuk sementara waktu Anda dapat menyelesaikan masalah ini hanya dengan menonaktifkan cache "Blok HTML output" dari admin -> bagian manajemen cache

Semoga ini bisa membantu


studio2f telah menyebutkan jawaban Anda, Anda dapat menggunakan @andrewkett atau mengklik "masalah ini" dalam pertanyaan utama ini akan membantu Anda juga
minggu

2
Saya akan mengatakan bahwa menonaktifkan semua caching blok untuk mengatasi masalah yang hanya memanifestasikan dirinya pada beberapa blok tertentu agak seperti memotong seluruh tangan seseorang jika Anda mengembangkan radang dingin pada jari. Memotong jari, selain juga tidak menyenangkan, setidaknya akan menjadi respons yang lebih proporsional terhadap penyakit. Jawaban Andrewkett ( magento.stackexchange.com/users/527/andrewkett ) adalah pendekatan yang lebih masuk akal: magento.stackexchange.com/questions/73685/…
Bryan 'BJ' Hoffpauir Jr.

Jangan pernah mengedit atau mengubah kelas INTI.
Ahsan Horani
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.