Sử dụng các biến trong Khối tĩnh CMS với {{lệ thuộc}}


7

Tôi đã sử dụng chức năng mẫu {{lệ thuộc}} trước khi sử dụng các mẫu email và tôi tự hỏi liệu điều này có khả thi trong Khối tĩnh CMS không, ví dụ:

<a href="{{store url='customer/account'}}">Login/Account</a>

Có thể được cập nhật thành:

<a href="{{store url='customer/account'}}">
  {{depend loggedIn}}Account{{/depend}}
  {{depend loggedOut}}Login{{/depend}}
</a>

Điều này có thể hữu ích để cho phép khách hàng tùy chọn cập nhật những thứ này trong Khối CMS trong khi vẫn giữ chức năng phụ thuộc.

Rõ ràng sự phụ thuộc này phụ thuộc vào các biến có sẵn cho chính khối mà mẫu email đạt được bằng cách sử dụng sau (có thể được áp dụng cho khối / mô hình cms bằng cách viết lại):

public function setTemplateParams(array $templateParams)
{
    return $this->setData('template_params', $templateParams);
}

Điều tôi không chắc chắn là làm thế nào ngôn ngữ tạo khuôn mẫu được sử dụng trong khối truy cập thông tin này, thêm {{depend}}thẻ vào một khối chỉ đơn giản là đầu ra dưới dạng văn bản thuần túy. Tôi giả sử có một bước biên dịch được áp dụng trước khi html được hiển thị, nhưng một bước đi đúng hướng về cách tiến hành sẽ giúp ích rất nhiều.

Câu trả lời:


4

Đây không phải là một câu trả lời cho câu hỏi, nhưng nó có thể là một giải pháp cho vấn đề.
Tôi không nghĩ rằng đó là một ý tưởng tốt để làm tất cả các loại viết lại. Bạn có thể đạt được điều tương tự bằng cách tạo một khối và một mẫu và sử dụng khối đó trong khối tĩnh của bạn.

Tạo khối [Namespace]/[Module]/Block/Link.phpvới nội dung này:

<?php 
class [Namespace]_[Module]_Block_Link extends Mage_Core_Block_Template
{

    public function getAccountUrl()
    {
        if (Mage::getSingleton('customer/session')->isLoggedIn()) {
            return $this->getUrl('customer/account');
        } 
        return $this->getUrl('customer/account/login');
    }
    public function getLabel()
    {
        if (Mage::getSingleton('customer/session')->isLoggedIn()) {
            return Mage::helper('customer')->__('Account');
        } 
        return Mage::helper('customer')->__('Login');
    }
}

sau đó tạo mẫu app/design/frontend/base/default/template/[namespace]_[module]/link.phtml

<a href="<?php echo $this->getAccountUrl()?>"><?php echo $this->getLabel()?></a>

Bây giờ thêm điều này trong khối cms của bạn

{{block type="[block_alias]/link" template="[namespace]_[module]/link.phtml"}}

Tôi phải đồng ý, đây là The Right Way ™
Fabian Schmengler

hoàn toàn đúng !!
Rajeev K Tomy

Vấn đề duy nhất The Right Way™là điều này chỉ phục vụ cho trường hợp cụ thể này (của liên kết đăng nhập) và sẽ yêu cầu tôi viết các kết hợp khối / mẫu khác cho bất kỳ trường hợp nào khác có thể yêu cầu chức năng {{phụ thuộc}}.
Gọi

Vì vậy, sau khi suy nghĩ kỹ, tôi nghĩ đây là giải pháp hợp lý nhất (xem nhận xét của tôi về câu trả lời từ @fschmengler bên dưới vì một số lý do) - Tôi nghĩ rằng tôi sẽ cập nhật getLabel()chức năng để tôi có thể chuyển thông tin nhãn qua cms bằng cách sử dụng {{ [...] logged_out_label="Login to your account"}}và truy cập chúng với $this->getBlockParams()việc cho phép một trình soạn thảo ghi đè lên nhãn từ bên trong khối tĩnh cms - tôi cảm thấy đó là một sự thỏa hiệp tốt.
Gọi

Vâng. Điều này nghe có vẻ như một cách tiếp cận tốt.
Marius

4

Các chỉ thị bộ lọc được xử lý trong Mage_Cms_Model_Template_Filterđó kế thừa từ đó Mage_Core_Model_Email_Template_Filter, vì vậy bạn cũng có tất cả các chức năng từ các mẫu email trong các khối và trang CMS.

Nhưng bạn đã đúng rằng tất cả phụ thuộc vào biến nào có sẵn. Và thật không may, các trang CMS không gán bất kỳ biến nào cho bộ lọc, như bạn có thể thấy trong Mage_Cms_Block_Block::_toHtml():

$processor = $helper->getBlockTemplateProcessor();
$html = $processor->filter($block->getContent());

Giữa những dòng đó, $processor->setVariables($block->getData())sẽ hữu ích.

Cách bật biến mẫu trong CMS

Viết lại Mage_Cms_Block_BlockMage_Cms_Block_Pagenhư mô tả ở trên.

Sau đó, bạn có thể đặt bất kỳ biến bổ sung nào $block->setData()bằng cách viết lại khác, nhưng tôi sẽ đề nghị sử dụng trình quan sát thay vì linh hoạt hơn. Quan sát sự kiện cms_page_rendercho các trang CMS hoặccore_block_abstract_prepare_layout_after cho các khối tĩnh để thêm các biến động như "log_in" cho tất cả các khối / trang.

Tại sao bạn không nhìn thấy gì?

Lý do mà bạn thấy {{depend}}là văn bản thuần túy có lẽ là không có biến mẫu nào được đặt. Nếu bạn nhìn vào cách dependDirectivethực hiện, bạn sẽ thấy rằng nếu không có biến mẫu, thì lệnh được trả về không thay đổi ( $constructionlà một kết quả khớp được trả về bởi preg_match_all$construction[0]toàn bộ mô hình con):

public function dependDirective($construction)
{
    if (count($this->_templateVars)==0) {
        // If template preprocessing
        return $construction[0];
    }

    if($this->_getVariable($construction[1], '')=='') {
        return '';
    } else {
        return $construction[2];
    }
}

Bạn có nên thực sự làm điều đó?

Chắc là không. Vui lòng tham khảo câu trả lời của Marius để biết giải pháp cho vấn đề của bạn vì Magento dự định.

Trong cả hai trường hợp, hãy chú ý đến hiệu ứng của bộ đệm khối. Bạn có thể cần thêm các thẻ bộ đệm bổ sung vào khối để phân biệt nội dung động.


Cảm ơn các chi tiết @fschmengler - nghĩ thêm về vấn đề thực hiện giải pháp này có nghĩa là vấn đề sau đó chuyển sang cài đặt các biến và nếu đó là một ý tưởng tốt (trên toàn cầu hoặc theo cách khác) để bắt đầu gắn các biến vào khối hệ thống. Tôi nghĩ về tổng thể những nhược điểm lớn hơn những lợi ích, danh tiếng đã viết cho tôi một lời giải thích chi tiết và sau đó nói với tôi rằng đừng sử dụng nó! > _ <
Gọi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.