我希望我在这里没有搞错(因为 sitecore 文档总是很糟糕!)
我想要一种存储访问者信息的方法,我对 sitecore 相当陌生,但是 contact facets seemed the ideal解决方案,几乎是从上面的链接逐字逐句实现的,直到它投入生产我对它感到非常满意。当我存储信息时,它仍然存在,我可以读取它:
public IMpmVisitorFacet GetMpmVisitorFacet()
{
return _contact.GetFacet<IMpmVisitorFacet>(_MPMVisitorConfigName);
}
并设置信息,一切看起来都很棒。我还可以看到正在设置 sitecore SC_ANALYTICS_GLOBAL_COOKIE,一切看起来都很棒。然后我做了一些更彻底的测试......
问题似乎是数据不会持久存在。如果我将一些信息放入该方面,它将停留一个小时左右(我可以关闭我的浏览器,查看其他网站,等等)并且我将能够访问它但是在“一定数量的时间”,一切都会过去。
在重新访问文档后(我有没有提到它们不是很好)我注意到一个句子中的警告,这是我以前没有看到的:
Well, I can create another web form page that only reads the employee number. That will show me that the contact facet data is being stored in memory at least. But what about permanent storage?
等等,我以为这是永久存储?!所以这个例子展示了一些代码来读取“facet”。
var contact = Tracker.Current.Contact;
var data = contact.GetFacet<IEmployeeData>("Employee Data");
data.EmployeeId = "ABC123";
.....
<p>Employee data contact facet updated.</p>
<p>Contact ID: <b><%=contact.ContactId.ToString()%></b></p>
<p>Employee #: <b><%=data.EmployeeId%></b></p>
但这方面似乎只存在很短的一段时间。然后继续:
For performance reasons Sitecore only writes contact data to xDB when the session ends.This means that if I look in MongoDB...
然后它继续在其 Shiny 的新潮 mongoDb 实现中显示数据。但是,如果我实际上无法以编程方式访问和使用该信息,那么它在 mongo 中有什么用呢!
所以这就提出了一个问题,一旦 session 被放弃,我该如何访问这些联系信息?
即用户登录我的网站 -> 我在他们的联系方面添加了一些信息 -> 他们第二天回来 -> 我想阅读我之前添加的信息
在 experience profile 中还有其他几个文档讨论了如何访问这些数据。 , 至 index into Lucene和 in the Experience platform (为什么有两种名称几乎完全相同的产品?!)但没有说明如何在网站本身的代码中访问此信息。
通过 Dmytro Shevchenko 添加到评论中:
因此将新信息写入 mongo 似乎是一个问题...有没有人对此有任何帮助或类似经验?
最佳答案
经过大量的调试、摆弄和测试,我终于明白了这一点。事实证明,我的问题不是写入 mongo,而是写入后从 mongo 读回。
sitecore 文档似乎(像往常一样)完全遗漏了这个工作的一个相当基本的部分。大约三分之一的 way down the docs it states :
public EmployeeData() { base.EnsureAttribute<string>(FIELD_EMPLOYEE_ID); }The "EnsureAttribute" method is the equivalent of declaring a value-type variable.
好吧,这是非常具有误导性的。这是什么EnsureAttribute似乎要做的是将 facet 的数据从 mongo 加载到当前类中。 如果您不为您的方面中的每个属性 执行此操作,那么它不会设置来自 mongoDb 的值!这是我的错误,我没有“确保”类中的每个属性。
所以发生的事情是,
SC_ANALYTICS_GLOBAL_COOKIE 会为您完成)所以 EnsureAttribute不会“声明一个值类型”(在我看来这是完全错误的)它将数据从 mongodb 加载到当前的 Session .
关于mongodb - session 刷新后,我仍然可以访问 Sitecore 联系人方面吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845461/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir