目前,我使用的是在时事通讯/注册时触发的自定义操作.

由于我们有多个注册时事通讯的场合,如帐户注册、 checkout 注册和在客户编辑内登录后,我想知道收件人 Select 了哪种方式注册.

仅供参考:我们仍然使用6.4.x,因为我们目前无法更新,并使用此文档创建操作:https://developer.shopware.com/docs/v/6.4/guides/plugins/plugins/framework/flow/add-flow-builder-action

无论是在FlowEvent的$event中还是它的上下文中,我都找不到任何关于任何类型的推荐人的信息.有没有什么本机的Shopware方式来接收推荐人,比如‘/Account/Login’或‘/Check Out/Register’?

我已经有了一个使用$_SERVER[‘HTTP-Referer’]的解决方案,但由于这种方式并不完全安全,而且有GDPR方面的问题,所以我想找一种不同的方法.

提前谢谢!

推荐答案

您可以使用订阅者监听SalesChannelContextResolvedEvent,并将当前请求堆栈中的路径信息作为扩展添加到Context的实例中.在您的FlowAction实现中,您可以获得Context的实例以及随后添加的带有路径的扩展.

<service id="SwagBasicExample\Subscriber\SalesChannelContextResolvedSubscriber">
    <argument type="service" id="request_stack"/>
    <tag name="kernel.event_subscriber"/>
</service>
use Shopware\Core\Content\Cms\SalesChannel\Struct\TextStruct;
use Shopware\Core\Framework\Routing\Event\SalesChannelContextResolvedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;

class SalesChannelContextResolvedSubscriber implements EventSubscriberInterface
{
    private RequestStack $requestStack;
    
    public function __construct(RequestStack $requestStack) 
    {
        $this->requestStack = $requestStack;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            SalesChannelContextResolvedEvent::class => 'onSalesChannelContextResolved',
        ];
    }

    public function onSalesChannelContextCreated(SalesChannelContextResolvedEvent $event): void
    {
        $context = $event->getSalesChannelContext()->getContext();
        $request = $this->requestStack->getMainRequest();
        
        if (!$request) {
            return;
        }
        
        $context->addExtension(
            'currentRequestPath',
            new TextStruct($request->getPathInfo())
        );
    }
}

然后在您的FlowAction实施中:

public function handle(FlowEvent $event): void
{
    $currentRequestPathExtension = $event->getContext()->getExtension('currentRequestPath');
    $pathInfo = null;

    if ($currentRequestPathExtension instanceof TextStruct) {
        $pathInfo = $currentRequestPathExtension->getContent();
    }

    // ...
}

Php相关问答推荐

仅显示特定WooCommerce产品类别的额外产品字段

根据产品类型显示或隐藏WooCommerce管理产品自定义字段

如何实现对数据库表中多列的唯一约束?

从目录文件夹中获取文件并追加到 Select 下拉列表(选项)-wordpress/wc

带Redhat php curl的http_code 0

在PHP中处理Linux输入事件(/dev/input/Event*)

未收到Strava WebHook事件数据

Laravel 10中的Validator类

对表示大小的值后缀进行自定义排序(XXS、XS、S、M、L、XL、XXL)

为什么WooCommerce的动作钩子';woocommerce_checkout_update_order_review';包含旧信息?

WooCommerce中特定付款方式的变更订单预留库存时间

更改WooCommerce checkout 中的错误消息以获得不可用的送货方式

如何在 Laravel 中app文件夹之外的文件夹内创建文件路径?

Symfony:从控制器内部调用自定义命令

htaccess 重定向子域错误的 url

将图像作为 PHP post 响应发送到浏览器

尽管有use指令,PHP 类在其他文件中仍处于可见状态

password_verify 在 PHP 7.4 中有效,但在 PHP 8.2 中无效

如何将子查询结果添加到学说 2 中主查询的末尾?

如何获取最后一条消息属于 Laravel 中特定用户的对话列表