我开始明白Magento Event Observers是如何工作的,并希望有人可以帮我弄清楚我需要寻找什么样的事件才能让我的潜在模块发挥作用.我有某些产品具有名为"child skus"的属性,该属性是我库存中其他产品的SKU编号数组.
例:
名称:完全令人敬畏的产品
SKU:TP-1212
儿童SKUS:GP-3232,FD-4332,VC-5332
每当有人购买TP-1212时,我也需要Magento从幕后的那些儿童skus中扣除该数量.有没有人知道是否有一个事件调度员在购买完成后会处理类似的事情?
我正在搜索一个观察者/事件,它将在保存属性时触发.
示例:当新颜色,fe black添加到属性颜色时,我想检查我的自定义表中是否已有此选项.
有谁知道这样的事件?
搜索超过一天...... :(
(这也是http://www.nicksays.co.uk/magento_events_cheat_sheet/)
谢谢和问候,
马蒂亚斯
我正在学习Magento,我开始学习活动和观察员.通过在管理产品区域中设置,将一定百分比的金额添加到产品中.它工作正常,但折扣价仅显示在产品页面上.任何人都可以建议我如何通过Magento改变价格.我的意思是改变价格应该去购物车,订购等.
下面是观察者的代码
<?php
class Xyz_Catalog_Model_Price_Observer
{
public function __construct()
{
}
/**
* Applies the special price percentage discount
* @param Varien_Event_Observer $observer
* @return Xyz_Catalog_Model_Price_Observer
*/
public function apply_discount_percent($observer)
{
$event = $observer->getEvent();
$product = $event->getProduct();
// process percentage discounts only for simple products
if ($product->getSuperProduct() && $product->getSuperProduct()->isConfigurable()) {
} else {
$percentDiscount = $product->getPercentDiscount();
if (is_numeric($percentDiscount)) {
$today = floor(time()/86400)*86400;
$from = floor(strtotime($product->getSpecialFromDate())/86400)*86400;
$to = floor(strtotime($product->getSpecialToDate())/86400)*86400;
if ($product->getSpecialFromDate() && $today < $from) {
} elseif ($product->getSpecialToDate() …
Run Code Online (Sandbox Code Playgroud) 我有一个HashMap。我想在ListView中显示键。
麻烦的是,ListView.setItems()想要一个ObservableList,而我所拥有的只是一个keySet()。
如何获得ListView来观察Map中的键,而又不做一些笨拙的事情,例如维护两个匹配的数据结构?
在决定写这个问题之前,我已经搜索过不知道有多少个Google页面,而且我知道Marius和Alan Storm已经对非常相似的问题给出了非常好的答案,但是很遗憾,我无法揭开为什么我的观察者没有开火。
这不是我第一次与观察者一起玩,而是从admin手动刷新了缓存,并手动从var / cache文件夹中删除了缓存,我尝试了不同的工作语法来调用模型(complete_model_path_with下划线,模块/模型,大写,小写) )。我有其他观察员每天都在同一安装上正常工作,我尝试以完全相同的方式进行操作,但未成功。我也尝试用单例而不是模型来呼叫。我尝试了三个作用域视图(全局,前端和adminhtml)。我一直在寻找任何直接或间接的核心覆盖,仍然有可能错过一个隐藏在其他模块中的模块,但是我几乎总是使用尊重大多数Magento标准的知名开发人员的模块。
我的代码有一部分:
app / code / local / NameSpace / Module / etc / config.xml
<global>
<models>
<module>
<class>NameSpace_Module_Model</class>
<resourceModel>module_mysql4</resourceModel>
</module>
</models>
<events>
<catalog_product_save_before>
<observers>
<module>
<type>singleton</type>
<class>NameSpace_Module_Model_Observer</class>
<method>catalogProductSaveBefore</method>
</module>
</observers>
</catalog_product_save_before>
</events>
</global>
Run Code Online (Sandbox Code Playgroud)
应用程序/代码/本地/ NameSpace /模块/模型/Observer.php
class NameSpace_Module_Model_Observer
{
public function catalogProductSaveBefore(Varien_Event_Observer $observer)
{
$product = $observer->getEvent()->getProduct();
file_put_contents("OBSERVER.TXT","FIRED");
echo "hello";
exit();
return $this;
}
}
Run Code Online (Sandbox Code Playgroud)
app / etc / modules / NameSpace_Module.xml
<?xml version="1.0"?>
<config>
<modules>
<NameSpace_Module>
<active>true</active> …
Run Code Online (Sandbox Code Playgroud) 在Laravel 5.3中,我们尝试创建一个表单,用户可以更新其配置文件详细信息,包括新密码.
但是,我们只想在提交密码时设置密码.
我们正在使用一个处理模型更新的CRUD框架,我们不想推出自己的update(Request $request)
方法.
我们知道你可以注册类似的模型观察者
User::created(function(User $user){
});
Run Code Online (Sandbox Code Playgroud)
我们希望能够实现类似的目标
User::created(function(User $user){
if( $request->has('password') ){
$user->password = bcrypt($request->input('password'));
}
});
Run Code Online (Sandbox Code Playgroud)
但是,当我们访问$ request时,它完全是空的.例如,如果我们做dd($request->all());
一个空数组,但是如果我们转出dd($_POST);
我们得到的一切.
我假设这是因为加载了订单,并且请求系统尚未加载.
有没有办法在没有$_POST
直接访问的情况下获得请求?
谢谢
func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
Run Code Online (Sandbox Code Playgroud)
此函数需要观察者成为某个对象,但需要将静态方法设置为选择器.
这个答案解释了当选择器是实例方法时如何设置选择器和观察者.
observers selector nsnotificationcenter notificationcenter swift
我有一个有更新方法的观察者:
ObserverServiceProvider.php
public function boot()
{
Relation::observe(RelationObserver::class);
}
Run Code Online (Sandbox Code Playgroud)
RelationObserver.php
public function updated(Relation $relation)
{
$this->cache->tags(Relation::class)->flush();
}
Run Code Online (Sandbox Code Playgroud)
所以当我更新控制器中的关系时:
public function update(Request $request, Relation $relation)
{
$relation->update($request->all()));
return back();
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.但现在我有了一个数据透视表.一个关系 belongsToMany
的产品.
所以现在我的控制器方法如下所示:
public function update(Request $request, Relation $relation)
{
if(empty($request->products)) {
$relation->products()->detach();
} else {
$relation->products()->sync(collect($request->products)->pluck('id'));
}
$relation->update($request->all());
return back();
}
Run Code Online (Sandbox Code Playgroud)
问题是如果我只添加或删除产品,则不再触发观察者.
如何在pivot table
更新时触发观察者?
谢谢
我的Firebase数据库中有一个"用户"节点.其中的每个用户都有一个带有uid的root用户.每个用户的一个属性是"坐标".我想观察所有用户的任何坐标的任何变化.我几乎需要这样的东西:
usersDatabaseReference.child("*").child("coordinates").observe(.value, with: { (snapshot) in
Run Code Online (Sandbox Code Playgroud)
我的结构看起来像这样:
用户
abcdefghijklmnop
坐标:"12.345,12.345"
其他道具
qrstuvwxyz
坐标:"34.567,34.567"
其他道具
所以我正在为坐标值发生变化的任何用户寻找全局通知.
我是否需要遍历userDatabaseReference中的所有子节点并为每个子节点设置观察者?然后,无论何时添加或删除用户,都要重新设置它?
你可以看到我为什么要使用通配符.我该怎么做呢?
在GoF设计模式一书中,谈到观察者模式的实现部分时,有这样的规定:
将主题映射到其观察者 主题跟踪它应通知的观察者的最简单方法是在主题中显式存储对它们的引用。然而,当主体较多而观察者较少时,这种存储可能过于昂贵。一种解决方案是通过使用关联查找(例如哈希表)来以空间换取时间来维护主体到观察者的映射。因此,没有观察者的主题不会产生存储开销。另一方面,这种方法增加了接触观察者的成本。
我不明白使用哈希表如何提高存储容量。在 Java 中,对于每个主题,我们都可以有一个观察者列表List<Observer>
。如果没有观察者附加到该主题,则列表引用将为空。如果我们使用哈希表,Map<Subject, List<Observer>
我们仍然有列表,但我们也有对主题的引用,所以这种方式的内存效率有点低。不知道是否相关,Gof书中实现的语言是Smalltalk和C++。