小编Bri*_*VPS的帖子

Magento - 扩展相同核心类的多个类

我确信我们都遇到了这样一种情况:你有一个块或模型的多个扩展,它们重写了相同的核心块/模型.我遇到的问题是: 你如何控制Magento看到这些类的顺序?

例如,假设我们有2个扩展,包含以下2个类:

A级

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)

B级

<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类时,如何控制哪个类被实例化?

php magento magento-1.5

20
推荐指数
1
解决办法
8557
查看次数

Magento XMLConnect ......它是什么以及如何使用它?

有人可以解释XMLConnect扩展是什么以及它用于什么?我知道,一般来说,它可以用来开发一个移动友好的网站,但这就是我的Google搜索.有没有人有使用此扩展的经验,可以提供一些细节和/或示例?

谢谢!

magento magento-1.5

16
推荐指数
1
解决办法
1万
查看次数

过滤"is_salable"上的产品集合

我想过滤产品系列,只显示库存商品.我认为这很容易,因为有一个名为'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'不是答案,那么我需要做的就是过滤掉没有库存的产品...所以无论做什么都可以做到这一点:)

谢谢!

magento magento-1.4

14
推荐指数
1
解决办法
3万
查看次数

Magento PayPal重复发票错误

在尝试提交说明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()引用的方法覆盖.

显然,在第一次尝试之后,某些东西正在取消所有的价值,但我不知道是什么或在哪里.如果有人有任何想法,我很乐意听到他们!

php paypal magento

11
推荐指数
1
解决办法
1万
查看次数

WPF模态进度窗口

如果这个问题得到了很多次回答,我很抱歉,但我似乎无法找到适合我的答案.我想创建一个模态窗口,在我的应用程序执行长时间运行的任务时显示各种进度消息.这些任务在一个单独的线程上运行,我可以在进程的不同阶段更新进度窗口上的文本.跨线程通信都很好地工作.问题是我不能让窗口只在其他应用程序窗口(不是计算机上的每个应用程序)之上,保持在最顶层,阻止与父窗口的交互,并仍然允许工作继续.

这是我到目前为止所尝试的:

首先,我的启动窗口是一个自定义类,它扩展了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类中使用我的方法.

所以这让我想到了这个问题.处理这个问题的正确方法是什么?

感谢您的时间和对不起的长期问题,但细节很重要:)

c# wpf dialog window modal-dialog

10
推荐指数
3
解决办法
2万
查看次数

使用CMS页面进行布局更新的正确方法是什么?

我有一个我编写的特色产品模块,它在页面上放置了一个自定义块,其中列出了与块中定义的任何属性相匹配的产品.最初我通过{{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 …

layout magento

8
推荐指数
1
解决办法
1万
查看次数

Magento - 如何创建"十进制"属性类型

我已经在网上做了一些搜索,但我还没有找到任何答案.我有一种情况,我需要一个十进制值的产品属性,它必须支持负数和正数,也必须是可排序的.出于某种原因,Magento没有"十进制"属性类型.使用十进制值的唯一类型是Price,但不支持负数.如果我使用"text"作为类型,它支持我想要的任何东西,但它没有正确排序,因为它将值视为字符串而不是浮点数.通过手动编辑eav_attribute表并将'frontend_input'从'price'更改为'text',但将'backend_type'保留为'decimal',我能够解决这个问题,正如其他人在我发现的帖子中所做的那样.这很有效......直到有人在管理面板中编辑该属性.保存属性后,Magento会注意到frontend_input是'text'并将'backend_type'更改为'varchar'.我能想到的唯一方法就是创建一个自定义属性类型,但我不知道从哪里开始,我在网上找不到任何细节.

还有其他人遇到过这个问题吗?如果是这样,你做了什么来纠正它?如果我需要创建一个自定义属性类型,你有任何提示,或者你能指点我在那里做任何教程吗?

谢谢!

magento entity-attribute-value magento-1.5

8
推荐指数
1
解决办法
6866
查看次数

Magento module system.xml复选框不会保存

在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复选框应该如何工作?

如果有帮助,这是我的文件.在这种情况下,我也添加了一个文本字段变量.如果我输入文本并点击保存,则会保存,但复选框不会:

config.xml文件:

<?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)

的system.xml:

<?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)

magento magento-1.5

7
推荐指数
2
解决办法
4926
查看次数

Magento交易错误"请指定送货方式"

我们使用模板大师的自定义结帐扩展名为"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方法之间的唯一区别在于哪些字段被认为是必需的.它不会以任何方式更改地址对象,因此后续对getShippingMethodgetShippingRateByCode的调用应与默认安装相同.

如有必要,我可以提供更多细节.我基本上试图了解可能触发该错误的内容以及如何重现它,以便我最终可以修补导致它的漏洞.

谢谢!

magento magento-1.5

7
推荐指数
1
解决办法
6961
查看次数

在自定义属性上排序

我创建了一个名为"sales_rank"的属性,我将其设置为可排序属性.但是,当我从产品列表中选择它时,它并没有按照我的预期排序.在进一步检查时,它似乎是作为文本字段而不是数字排序.这意味着它将进入101,1014,102,1035,104,11,1204等....

我该如何解决?创建属性时,没有办法告诉它它是一个数字.您可以从"输入验证"框中选择"整数",那么答案是什么?我还没有尝试过......

有什么想法吗?

谢谢!

magento magento-1.4

5
推荐指数
1
解决办法
2595
查看次数