我确信我们都遇到了这样一种情况:你有一个块或模型的多个扩展,它们重写了相同的核心块/模型.我遇到的问题是: 你如何控制Magento看到这些类的顺序?
例如,假设我们有2个扩展,包含以下2个类:
config.xml中
<catalog>
<rewrite>
<product_view>My_ClassA_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
Run Code Online (Sandbox Code Playgroud)
我/ ClassA的/座/目录/产品/ View.php
class My_ClassA_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)
<catalog>
<rewrite>
<product_view>My_ClassB_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
Run Code Online (Sandbox Code Playgroud)
我/ ClassB的/座/目录/产品/ View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)
推荐的解决方案是改变它们中的一个,以便它们延伸的其他和它们连起来(class A extends B {},class B extends C {}等):
我/ ClassA的/座/目录/产品/ View.php
class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}
Run Code Online (Sandbox Code Playgroud)
我/ ClassB的/座/目录/产品/ View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Magento不一定会这样看.我不知道它是按字母顺序排列还是有点随机,但有时这种方法有效,有时则不然.在某些情况下,Magento优先使用ClassB和所有调用来createBlock('catalog/product_view')创建ClassB实例,完全绕过ClassA中的任何代码.
所以我的问题是:createBlock('catalog/product_view')当两个不同的扩展都重写核心catalog_product_view类时,如何控制哪个类被实例化?
有人可以解释XMLConnect扩展是什么以及它用于什么?我知道,一般来说,它可以用来开发一个移动友好的网站,但这就是我的Google搜索.有没有人有使用此扩展的经验,可以提供一些细节和/或示例?
谢谢!
我想过滤产品系列,只显示库存商品.我认为这很容易,因为有一个名为'is_salable'的属性,如果有库存则为1(真),否则为0(假).但无论我做什么,它都行不通.此外,它似乎在查询完成之前停止执行.
这是一些示例代码:
$this->_productCollection = Mage::getModel('catalog/product')->getCollection();
$this->_productCollection->addAttributeToSelect('*');
$this->_productCollection->addAttributeToFilter('my_attribute', true);
//So far, so good...filtering on 'my_attribute' works!
Mage::Log("select: " . $this->_productCollection->getSelect());
//Successfully outputs the SQL query
$this->_productCollection->addFieldToFilter('is_salable', '1');
Mage::Log("select: " . $this->_productCollection->getSelect());
//does NOT output any query...it's like it died trying
Run Code Online (Sandbox Code Playgroud)
那么我做错了什么?我尝试了'addFieldToFilter','addAttributeToFilter'以及其他各种查询,例如:addFieldToFilter('is_salable', array('eq' => true))等等...
有人知道怎么做吗?如果'is_salable'不是答案,那么我需要做的就是过滤掉没有库存的产品...所以无论做什么都可以做到这一点:)
谢谢!
在尝试提交说明PayPal网关已拒绝请求的订单时,客户偶尔会遇到错误.由于提供了重复的发票ID,交易被拒绝. 在深入研究这一点之后,我相信我已经缩小了问题范围.在最近的一些案例中,客户曾试图在4个月前下订单,并从PayPal 收到内部错误.我从与PayPal的交谈中了解到,该客户的信用卡已被标记.当他们试图下第一个订单时,PayPal拒绝了它,但仍然认为我们的Magento商店提供的"使用"的发票ID.
快进到今天......同样的客户,新的订单.Magento STILL在sales_flat_quote表中列出了9月份的旧报价.当他们登录时,它加载了客户报价(仍然有效)并尝试将其用于此订单.这导致重复发票ID错误.
我在Mage_Sales_Model_Observer类中看到有一个cleanExpiredQuotes从cron作业调用的方法.但是,这仅影响"is_active"= 0的引号.由于此引用被认为是活动的,因此它永远不会被清除.
很明显,Magento代码和PayPal之间存在脱节.但就我所知,这就是我的意思.还有其他人经历过这个吗?如果有,有什么建议吗?
我已经进一步了解这一点.我已经添加代码到结账的IndexController捕获错误,如果它是一个重复的发票错误,它会取消reserved_order_id在帖中一个调用saveOrderAction一次.这会导致报价保留新的订单ID,然后提交给PayPal.我现在遇到的问题是,当它第二次尝试使用新的发票编号时,所有总数都是0.我尝试将totals_collected_flag设置为false,以便重新收集总数,但它们在第二次总是为0通过.更具体地说,Mage_Sales_Model_Quote_Address中的总数是0,这是Mage_Sales_Model_Order最终使用的.Mage_Sales_Model_Quote中的总数是正确的,但它们会被collectTotals()引用的方法覆盖.
显然,在第一次尝试之后,某些东西正在取消所有的价值,但我不知道是什么或在哪里.如果有人有任何想法,我很乐意听到他们!
如果这个问题得到了很多次回答,我很抱歉,但我似乎无法找到适合我的答案.我想创建一个模态窗口,在我的应用程序执行长时间运行的任务时显示各种进度消息.这些任务在一个单独的线程上运行,我可以在进程的不同阶段更新进度窗口上的文本.跨线程通信都很好地工作.问题是我不能让窗口只在其他应用程序窗口(不是计算机上的每个应用程序)之上,保持在最顶层,阻止与父窗口的交互,并仍然允许工作继续.
这是我到目前为止所尝试的:
首先,我的启动窗口是一个自定义类,它扩展了Window类,并具有更新消息框的方法.我在早期创建了一个新的splash类实例,并根据需要显示/隐藏它.
在最简单的情况下,我实例化窗口并调用.Show()它:
//from inside my secondary thread
this._splash.Dispatcher.Invoke(new Action(() => this._splash.Show());
//Do things
//update splash text
//Do more things
//close the splash when done
this._splash.Dispatcher.Invoke(new Action(() => this._splash.Hide());
Run Code Online (Sandbox Code Playgroud)
这会正确显示窗口并继续运行我的代码来处理初始化任务,但它允许我单击父窗口并将其带到前面.
接下来我尝试禁用主窗口并稍后重新启用:
Application.Current.Dispatcher.Invoke(new Action(() => this.MainWindow.IsEnabled = false));
//show splash, do things, etc
Application.Current.Dispatcher.Invoke(new Action(() => this.MainWindow.IsEnabled = true));
Run Code Online (Sandbox Code Playgroud)
这会禁用窗口中的所有元素,但我仍然可以单击主窗口并将其放在启动屏幕前面,这不是我想要的.
接下来,我尝试使用启动窗口中的最顶层属性.这使得它保持在所有内容之前,并且与设置主窗口IsEnabled属性一起,我可以阻止交互,但这使得启动屏幕出现在一切,包括其他应用程序.我也不想要那个.我只是希望它成为这个应用程序中最顶层的窗口.
然后我发现了关于使用的帖子.ShowDialog()而不是.Show().我试过这个,它正确地显示了对话框并且不允许我点击父窗口,但调用.ShowDialog()使程序挂起等待你关闭对话框,然后它将继续运行代码.这显然不是我想要的.我想我可以调用ShowDialog()一个不同的线程,以便该线程可以挂起但是执行该工作的线程不会......是推荐的方法吗?
我还考虑过根本不使用窗口的可能性,而是将一个完整大小的窗口元素放在页面上的其他内容之前.这可以工作,除了我打开其他窗口,我希望能够在那些打开的时候使用启动画面.如果我使用了一个窗口元素,我将不得不在每个窗口上重新创建它,我将无法UpdateSplashText在自定义的splash类中使用我的方法.
所以这让我想到了这个问题.处理这个问题的正确方法是什么?
感谢您的时间和对不起的长期问题,但细节很重要:)
我有一个我编写的特色产品模块,它在页面上放置了一个自定义块,其中列出了与块中定义的任何属性相匹配的产品.最初我通过{{block...}}在CMS页面的"内容"部分添加一行来实现它.这很好,但我没有得到寻呼机.所以,我通过{{block...}}从Content部分删除行并将XML添加到Layout Update XML部分来解决这个问题,如下所示:
<reference name="content">
<block type="cms/block" name="product_list_top" />
<block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager"/>
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
<action method="setAttributeName"><name>my_attribute</name></action>
</block>
</reference>
Run Code Online (Sandbox Code Playgroud)
这也很有效.然后我决定,因为这个块的实例太多了,如果我将XML文件添加到我的主题的布局文件夹中并将此代码放在那里,那将会更加清晰.然后,在布局更新部分,我可以简单地改为:
<reference name="vps_featured_list">
<action method="setAttributeName"><name>other_attribute</name></action>
</reference>
Run Code Online (Sandbox Code Playgroud)
所以,我创建了一个名为的文件vps_featured.xml,并将其添加到其中:
<layout version="0.1.0">
<default>
<reference name="content">
<block type="cms/block" name="product_list_top" />
<block type="vps_featured/list" name="vps_featured_list" template="catalog/product/sale_list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager" />
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
</block>
</reference>
</default>
</layout>
Run Code Online (Sandbox Code Playgroud)
config.xml我的自定义功能模块中引用了此布局更新XML文件.我天真地认为,vps_featured.xml当我的VPS特色块在页面上时,它只会被合并到页面布局中,这只会发生在特殊CMS页面上的这几个实例中.显然事实并非如此.这打破了其他每一页,我猜是因为它覆盖了默认句柄.
所以这引出了我的问题#1: 布局xml文件何时包含在页面布局中?它们是否用于所有页面,无论是否实际使用引用它们的模块?
然后我决定尝试添加一个新的布局句柄,我可以在我的CMS页面中引用它.我修改了我的布局XML文件,因此主要部分在<vps_featured_list>标签内而不是<default>标签内.这使其他页面恢复了生机,但当然,我的CMS页面不再有效,因为那些页面上没有使用布局更新句柄.我尝试添加<update …
我已经在网上做了一些搜索,但我还没有找到任何答案.我有一种情况,我需要一个十进制值的产品属性,它必须支持负数和正数,也必须是可排序的.出于某种原因,Magento没有"十进制"属性类型.使用十进制值的唯一类型是Price,但不支持负数.如果我使用"text"作为类型,它支持我想要的任何东西,但它没有正确排序,因为它将值视为字符串而不是浮点数.通过手动编辑eav_attribute表并将'frontend_input'从'price'更改为'text',但将'backend_type'保留为'decimal',我能够解决这个问题,正如其他人在我发现的帖子中所做的那样.这很有效......直到有人在管理面板中编辑该属性.保存属性后,Magento会注意到frontend_input是'text'并将'backend_type'更改为'varchar'.我能想到的唯一方法就是创建一个自定义属性类型,但我不知道从哪里开始,我在网上找不到任何细节.
还有其他人遇到过这个问题吗?如果是这样,你做了什么来纠正它?如果我需要创建一个自定义属性类型,你有任何提示,或者你能指点我在那里做任何教程吗?
谢谢!
在Magento v1.5.0.1中,有没有人知道<frontend_type>checkbox</frontend_type>在system.xml中使用配置指令的问题?即使是最简单的只有单个配置变量且没有块/模型的哑模块,如果我选中该框并点击"保存",它会重新加载页面并取消选中该复选框,即使它表示配置已成功保存.我搜索了代码,它只在几个地方使用过.在大多数情况下,人们使用<frontend_type>select</frontend_type>有<source_model>adminhtml/system_config_source_yesno</source_model>.这有效,但为什么复选框也不起作用?或者我误解了Magento复选框应该如何工作?
如果有帮助,这是我的文件.在这种情况下,我也添加了一个文本字段变量.如果我输入文本并点击保存,则会保存,但复选框不会:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Brian_Stupid>
<version>0.1.0</version>
</Brian_Stupid>
</modules>
<adminhtml>
<acl>
<resources>
<admin>
<children>
<system>
<children>
<config>
<children>
<stupid translate="title">
<title>Stupid Crap</title>
</stupid>
</children>
</config>
</children>
</system>
</children>
</admin>
</resources>
</acl>
</adminhtml>
</config>
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0"?>
<config>
<sections>
<stupid translate="label">
<label>Stupid Test</label>
<tab>catalog</tab>
<frontend_type>text</frontend_type>
<sort_order>998</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<groups>
<debug translate="label">
<label>Debugging</label>
<frontend_type>text</frontend_type>
<sort_order>5</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<debugmode translate="label">
<label>Debug Mode Enable</label>
<comment>If enabled, does not alter …Run Code Online (Sandbox Code Playgroud) 我们使用模板大师的自定义结帐扩展名为"Firecheckout".不确定这是否相关,但我想应该提一下.偶尔我会看到一封交易失败的电子邮件,原因是"请指定送货方式".我花了很长时间试图追踪这是如何发生的,我迷失了.我已经尝试了一切我能想到的复制问题.取决于我所做的事情的组合(添加/删除购物车中的商品,添加/删除更改运送选项的优惠券代码,在移动和桌面网站之间切换等)我已经能够使其结帐页面没有没有为运输方式选择一个选项.但是,如果我尝试提交订单,我会在发货方法部分中显示"请指定送货方式"的直接红色消息(请注意电子邮件中的内容与页面上显示的错误中的内容之间的区别......缺少"a").这不会导致错误电子邮件.
搜索代码我发现错误电子邮件是在_validate方法的TM_FireCheckout_Model_Service_Quote(扩展Mage_Sales_Model_Service_Quote)类中触发的
$method= $address->getShippingMethod();
$rate = $address->getShippingRateByCode($method);
if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
Mage::throwException($helper->__('Please specify a shipping method.'));
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我猜$ method或$ rate是null还是false,但为什么/怎么可能呢?我能做些什么来确保这种情况永远不会发生?FireCheckout的_validate方法和父类的_validate方法之间的唯一区别在于哪些字段被认为是必需的.它不会以任何方式更改地址对象,因此后续对getShippingMethod和getShippingRateByCode的调用应与默认安装相同.
如有必要,我可以提供更多细节.我基本上试图了解可能触发该错误的内容以及如何重现它,以便我最终可以修补导致它的漏洞.
谢谢!
我创建了一个名为"sales_rank"的属性,我将其设置为可排序属性.但是,当我从产品列表中选择它时,它并没有按照我的预期排序.在进一步检查时,它似乎是作为文本字段而不是数字排序.这意味着它将进入101,1014,102,1035,104,11,1204等....
我该如何解决?创建属性时,没有办法告诉它它是一个数字.您可以从"输入验证"框中选择"整数",那么答案是什么?我还没有尝试过......
有什么想法吗?
谢谢!
magento ×9
magento-1.5 ×5
magento-1.4 ×2
php ×2
c# ×1
dialog ×1
layout ×1
modal-dialog ×1
paypal ×1
window ×1
wpf ×1