15年的時候,我寫過一篇文章《略談 vqmod for opencart 插件製做過程》,也不知道被哪些人抄襲過去了。不過無所謂了。文章梳理的思路仍是在我這裏。今天對這篇文章進行進一步補充。php
file標籤
若是有多個相似文件,咱們寫不少個嗎?其實能夠沒必要要,利用path和逗號解決這個問題。html
- <!-- 修改最新產品模塊 -->
- <file name="catalog/view/theme/*/template/module/latest.tpl">
- <!-- 規則 -->
- </file>
- <!-- 修改熱賣產品模塊 -->
- <file name="catalog/view/theme/*/template/module/bestseller.tpl">
- <!-- 規則 -->
- </file>
- <!-- 改成 -->
- <file path="catalog/view/theme/*/template/module/" name="latest.tpl,bestseller.tpl">
- <!-- 規則 -->
- </file>
其中,上面的 * 表明任何文件,若是有多個模板能夠這麼解決。sql
operation標籤
若是一個地方,搜索不到,致使整個XML不起做用怎麼辦呢?能夠定義跳過,不過不要總使用這樣的,好比你TPL搜索到了代碼,可是C層或者M層搜索不到,那樣會致使頁面報錯。因此C層和M層不建議使用跳過,而V層能夠。緩存
- <file name="catalog/view/theme/*/template/product/product.tpl">
- <operation error="skip">
- <!-- 規則 -->
- </operation>
- </file>
固然了,若是你要寫個註釋,好比這個功能幹嗎的。你能夠這樣寫:編輯器
- <file name="catalog/view/theme/*/template/product/product.tpl">
- <operation error="skip" info="添加xx功能">
- <!-- 規則 -->
- </operation>
- </file>
regex
若是你想用正則搜索怎麼辦呢?有時候普通搜索很難定位,其實vqmod也是支持的啦。ide
- <file name="catalog/view/theme/*/template/product/product.tpl">
- <operation error="skip" info="添加xx功能">
- <search position="replace" regex="true"><![CDATA[~<div(.*?)class="(.*?)image(.*?)"(.*?)>~]]></search>
- <!-- 規則 -->
- </operation>
- </file>
正則方面之後會寫一期文章,若是你不熟悉,能夠用別的替代方法,好比上面提到的文章裏提到的index,也能夠用下面這個。測試
offset
這個是用於搜索到的第幾行,用於position的參數是after或者before的時候。能夠是正數或者負數。若是是after,搜索到的行,往下數一行而後添加代碼,就是1。若是你是before,而後往上數兩行再添加代碼在上面,就是2。this
下面搜索這段代碼添加做爲例子。spa
- <div class="col-sm-12">
- <label class="control-label"><?php echo $entry_rating; ?></label>
- <?php echo $entry_bad; ?>
- <input type="radio" name="rating" value="1" />
-
- <input type="radio" name="rating" value="2" />
-
- <input type="radio" name="rating" value="3" />
-
- <input type="radio" name="rating" value="4" />
-
- <input type="radio" name="rating" value="5" />
- <?php echo $entry_good; ?></div>
- </div>
用XML對這段代碼進行添加代碼。以下四個示例:插件
- <file name="catalog/view/theme/*/template/product/product.tpl" keep="true">
- <operation error="skip">
- <search position="after" offset="1"><![CDATA[<input type="radio" name="rating" value="1" />]]></search>
- <add><![CDATA[<b>測試1</b>]]></add>
- </operation>
- <operation error="skip">
- <search position="after" offset="-1"><![CDATA[<input type="radio" name="rating" value="2" />]]></search>
- <add><![CDATA[<b>測試2</b>]]></add>
- </operation>
- <operation error="skip">
- <search position="before" offset="1"><![CDATA[<input type="radio" name="rating" value="3" />]]></search>
- <add><![CDATA[<b>測試4</b>]]></add>
- </operation>
- <operation error="skip">
- <search position="before" offset="-1"><![CDATA[<input type="radio" name="rating" value="4" />]]></search>
- <add><![CDATA[<b>測試4</b>]]></add>
- </operation>
- </file>
你會獲得下面的緩存代碼:
你們從上面的圖片中不難發現,before的時候offset是負數1的時候和直接用after,不用offset沒區別,after的時候offset是負數1的時候和直接用before不用offset的也沒區別,負數值大的時候,offset是-5,position是after等同於offset=4,position是before。因此其實offset有負數功能,可是也沒太大意義。
iafter和ibefore
相比於after和before,前面加個i的區別就是,在搜索到的代碼後面或者前面添加。下面給個例子:
【別問我爲啥顏色不同,我有幾個編輯器。】
當sql這裏要添加代碼的時候,好比 telephone = '" . $this->db->escape($data['telephone']) . "',
代碼:
- <operation info="添加手機號">
- <search position="iafter"><![CDATA[city = '" . $this->db->escape($data['city']) . "',]]></search>
- <add><![CDATA[ telephone = '" . $this->db->escape($data['telephone']) . "',]]></add>
- </operation>
這樣的話,就會在搜索到的代碼後面,加入add裏指定的代碼。值得注意的是,平時使用其餘的position時,add定義的你怎麼換行都沒問題,若是是iafter、ibefore和replace的時候,代碼的開頭最好緊挨着<add><![CDATA[ 寫,爲啥這樣呢,由於這樣SQL又是一整行,並且有時候不適合換行。也可能對後面別人開發的插件代碼干擾。之後講講vqmod的兼容問題。
ibefore這裏不舉例子了,同理的。搜索的前面加,和搜索的後面加的效果。
輸出:
- //iafter 的話
- city = '" . $this->db->escape($data['city']) . "', telephone = '" . $this->db->escape($data['telephone']) . "',
- //ibefore的話
- telephone = '" . $this->db->escape($data['telephone']) . "',city = '" . $this->db->escape($data['city']) . "',
PS:最近太忙了,更新頻率天然降低不少了。之後多抽空更新。歡迎關注咱們公衆號「SDT技術網」。