2012-10-04 22 views
4

我是Magento的新手,在探索系統時,我發現其中一個尷尬之處是將生成的(X)HTML頁面中的給定元素綁定到創建它的塊的名稱。我知道系統 - >配置 - >模板路徑提示。但是,它非常醜陋,有時會改變頁面上元素的佈局,並且不會顯示所有塊(我認爲它只包含模板塊)。Magento - 找到對應於一段HTML的代碼塊

我試過的方法是修改Mage_Core_Block_Abstract中的toHtml()方法,在內容前後添加空元素,例如。

<blockStart xmlns="http://some/url" name="the_block_name"/> 
<!-- the block's contents --> 
<blockEnd/> 

(可能有辦法做到這一點,而無需修改核心文件,但我不介意這種方法現在,因爲它只是我自己用的。任何想法表示歡迎,雖然)。

這些元素爲我提供足夠的文檔信息,以便在瀏覽器端使用jQuery的.nextUntil()函數將data-magento-blockname屬性添加到blockStart和blockEnd元素之間的元素。然後,我可以使用這些屬性在任何給定時間顯示一個工具提示,其中包含指向該指針下的內容的完整塊名稱「路徑」。

這種方法的問題是,雖然Magento生成嚴格的DOCTYPE的XHTML,但它是硬編碼將Content-Type設置爲「text/html」(請參閱​​app/code/core/Mage/Core/Model/App.php 1246行)。這意味着XML被瀏覽器解釋爲HTML「標籤湯」,導致奇怪的事情發生 - 我的許多標籤完全消失,出現在錯誤的地方或不立即關閉,因此它們包含其他內容。另外,並非文檔中的所有HTML元素都顯示在DOM中。

我已經嘗試修改App.php來將Content-Type更改爲application/xhtml + xml,並且這確實允許我的機制成功工作。然而,它有一些嚴重的缺陷:

  1. 我不得不禁用加載項,特別是商業Bug,不產生有效的XHTML。 Commerce Bug的丟失是非常糟糕的,因爲我真的想要在加載項運行時訪問其頁面和打包XML查看功能。
  2. Magento中包含的大部分JavaScript都使用document.write(),它不能與XHTML一起使用,所以我得到了javascript異常,並且可能有些功能不起作用。

有沒有人知道我的方法對這些問題的任何解決方案,或知道任何更簡單的方法將輸出中的HTML元素鏈接到產生它們的Magento塊?

+1

我一直在努力以「正確」的方式來做這個事情多年,而且還沒有拿出任何東西堅實,所以我沒有任何建議。也就是說,我討厭Commerce Bug阻止你獲得解決方案的想法,所以我最終修復了擴展中的各種XHTML驗證錯誤。如果您重新下載1.5.3版本(使用原始的電子郵件鏈接),驗證錯誤應該消失。電子郵件支持,如果你碰到任何。 http://www.pulsestorm.net/blog/2012/10/4/commerce-bug-153-maintenance-release.html –

+0

艾倫風暴,你是一個傳奇:-)謝謝你和博客文章,書和商業錯誤,所有這些都有很大的幫助。在CB工作的同時,爲了避免塊輸出不是元素集合的情況下進行一些簡單的調整,我認爲我的方法可能是可以接受的。不足以打包作爲擴展,但足以值得在一次性的magento實例上進行操作,以幫助學習該系統。如果是這樣,我可能會把博客文章放在一起。 – Tom

回答

1

更新它最終採取了一段時間,但最後我給你BlockSpy:http://omnicognate.wordpress.com/2012/11/13/blockspy-my-first-magento-extension/


更新沒有太多的時間來進行這項工作,但我有服務器現在工作的一部分。通過在core_block_abstract_to_html_after事件處理程序中添加我的blockStart/blockEnd標記,我設法在不修改任何核心文件的情況下做到這一點,並將它們置於註釋中,讓它們可以不受干擾地通過HTMLTidy。 SAX解析器位正在工作。只有javascript客戶端可以做,這應該很簡單 - 這個想法是按照CSS XRAY書籤(http://westciv.com/xray/)的樣式進行操作。

我會鏈接到一篇關於它是如何工作的文章,並在完成後更新並接受這個答案 - 當然,如果別人還沒有拿出更好的解決方案。


我想我正在接近解決這個問題。看起來這個問題真的可以歸結爲3件事:

  1. Magento並沒有真正產生可靠有效的XHTML。例如,對於使用JavaScript的CDATA部分有一些不一致。我遇到了一些無效的頁面,毫無疑問還有更多。
  2. 頁面的生成是以純文本的方式完成的。由於服務器正在操縱字符串,而不是DOM,因此在服務器端可靠地插入標記並不容易。此外,AFAIK不保證塊的toHtml()方法將始終生成整個元素的集合。例如,沒有什麼能夠阻止你(我認爲)有一個塊產生文本並將其嵌入父塊的屬性值中,或者在父塊中打開XHTML元素並將其關閉到子塊中(儘管這樣會嚴酷)。
  3. 即使服務器被勸服產生正確的有效標記,但將Content-Type切換到XHTML,完全破壞了網站上的JavaScript,並且我不準備通過並更新它來處理XHTML。

我覺得下面的辦法可以解決這些問題:

  1. 在服務器端使用PHP::Tidy強制服務器產生有效的XHTML。我已經通過在controller_front_send_response_before處理程序中運行tidy_parse_string()來嘗試嘗試此操作,並且它似乎可行。
  2. 而不是在客戶端處理Block類插入的blockStart/blockEnd標記,而是在服務器端使用SAX XML解析器在發送響應之前處理響應。我可以運行標記之間的子字符串,將每個子字符串傳遞給SAX解析器(並省去標記)。這應該允許我維護狀態並構建輸出XML字符串以響應SAX解析器生成的事件。然後,我可以在服務器端安全(如果緩慢)插入數據 - *屬性。
  3. 將文本/ HTML保留爲內容類型。這將允許JavaScript工作,並且數據 - *屬性在客戶端無論如何都會根據需要被忽略。

這有點痛苦,但它似乎應該與我所有的擴展一起工作,避免打破JavaScript並避免做出關於塊生成的輸出類型的任何假設。我只嘗試了第一步 - 一旦我在棘手的位上發現了一個問題,就會更新:-)

+0

感謝XHTML的領導,我正要嘗試改變MIME類型。 –

2

當使用模板路徑提示時,有時您需要檢查該元素,然後通過查看ChromeDevTools或Firebug(它將是具有一堆內聯樣式的父元素)來查找列出的關聯模板文件。

我經常使用grep來查找內容。只需導航到您應該看到的認爲的最高文件夾(以免不得不遍歷數千個不相關的文件夾/文件)。

所以,如果你知道一個塊名稱,並希望找到的模板文件使用該塊,你可以去/應用程序/設計/前端/基/默認/佈局,這樣做:

grep "catalog/category" -r -l . 

,你應該能夠得到一些加載該塊的文件名,然後找到它們的聲明節點並查看正在加載哪個模板文件。

echo get_class($this) 

也可能會有幫助。

+1

謝謝,但如果可能的話,這些都是我想要避免的事情。從理論上講,這樣的系統應該有可能具有將你直接從html鏈接到塊的功能,但似乎沒有任何簡單的方法來添加它。 – Tom

+0

是的,我認爲 - 這裏有理論,然後是Magento的實際應用。在你使用它一段時間後,有很多事情只是第二性質。老實說,大多數時候,即使對於非標準的東西,也不需要很長的時間就可以確定塊/模板關係。 Magento做得很好的一件事是給你足夠的信息,你需要找到事物的位置。 – pspahn

+0

我認爲你是對的。它看起來像「正確」或至少「正常」的方式來做到這一點,只是爲了學習手動鏈接的東西。 – Tom