Special characters in sitecore item name (*) - sitecore

It is possible to create an item with *** name in sitecore.
this would allow to process any page name.
What would be if create * item, and one more (*) like a child item ?
What would be if create * item under bucket item ?

You can create an item called * in Sitecore. Lets assume that your content tree is:
-home
- item-a
- item-b
- item-c
- *
- *
- item-d
- *
If you hit url:
/ - home item is returned
/item-a - item-a item is displayed
/item-b/item-c - item-c is displayed
/item-b/something-else - /item-b/* iten is displayed
/aaa - * item is displayed
/bbb/ccc - */* item is displayed.
So if there is an item at given level with a name which matches url segment, this item will be used. In other case, Sitecore will check if there is a wildcard item (item with name *), and will continue with matching the next segment.
I've never tried with wildcard items in bucket - I don't think it make much sense there.

Marek is right in his explanation (below). I would want to add couple more concerns to think about:
How would you make it Page Editor friendly?
How would address and resolve datasources (by URL? on the fly?). You have just one page item that handles all the matching page requests for multiple datasources.
How would you get Page Not Found (proper 404 status code) support, in case you do not have a datasource?
All that should be taken into consideration before you start implementation.
I wrote an article in attempt to answer those questions. Please read at:
http://blog.martinmiles.net/post/wildcard-items-pages-with-mvc-passing-the-correct-datasources-based-on-requested-item-url
Hope that helps.

Related

Having trouble using javascript to create dynamic URL's with django for dates

Currently I have two basic routes:
urlpatterns = [
path('<int:tutor_id>/', views.tutorHomeOverviewPage, name='tutorHomeOverviewPage'),
path('<int:tutor_id>/<str:selected_date>/', views.tutorSelectedDay, name='tutorSelectedDay'),
]
These routes point to two views which just get data from the database and send it to the template.
The views work without any issues.
My issue seems to lie with the URL that is being created in my JS files.
So I have a calendar that dynamically gets list elements from a javascript for days that look like this:
14
When I am at the URL - http://127.0.0.1:8000/tutorhomepage/7/ (which matches the first URL path) and I click on one of the days (so let's say the anchor element above), it goes to the correct URL: http://127.0.0.1:8000/tutorhomepage/7/2022-10-14/
However, when I click on another day while at http://127.0.0.1:8000/tutorhomepage/7/2022-10-14/, it just adds a second date to the URL like so - http://127.0.0.1:8000/tutorhomepage/7/2022-10-14/2022-10-1
My javascript, which is creating the 'a href' links, looks like this in brief:
aLink.setAttribute('href', currentYear + '-' + (currentMonth + 1) + '-' +dayCounter)
Any idea why this is happening and a possible fix for it?

Redirect without keeping the url parameters

We have a url like this:
www.testdomain.com/en-US/Forms/Request-a-Quote.aspx?thankyouid=102&pagename=Get a Quote - LOLIFEX
And it has to be redirected to:
www.testdomain.com/contact-distributor/
No matter what I try or add, it keeps adding the
?thankyouid=102&pagename=Get a Quote - LOLIFEX
for the www.testdomain.com/contact-distributor/ so it looks like this www.testdomain.com/contact-distributor/?thankyouid=102&pagename=Get a Quote - LOLIFEX
This cause page not found, because WordPress has the parameter pagename already set. How can I remove this annoying ?thankyouid=102&pagename=Get a Quote - LOLIFEX ?
Since this is WPengine redirects (based on comments)
You can do it like this :
Source * = /en-US/Forms/Request-a-Quote.aspx?$
Destination * = /contact-distributor/?
Match args = thankyouid=102&pagename=Get a Quote - LOLIFEX
Rewrite type * = permanent
Which will make the redirect
from www.testdomain.com/en-US/Forms/Request-a-Quote.aspx?thankyouid=102&pagename=Get a Quote - LOLIFEX
to www.testdomain.com/contact-distributor/
notice the ?marks
and you can add wildcards etc.
Depending on how many rewrites you need, you could also make a global one, that just takes /en-US/Forms/Request-a-Quote.aspx/ and sends it to /contact-distributor/?
read more about WPengines regex redirects here : https://wpengine.com/support/regex/
PS - WPengine has chat support for this kind a things, which are very helpfull and fast - Just open one of those, if you still have problems.

Regex google analytics - Filter homepage and directories -

I'm trying to create a new Google Analytics view filter to show frontpage, and some website using regular expression but haven't been successful.
(\/$|^\/app\/|^\/page\/|\/features)
Pages I want to show:
/
/app/test
/app/a/t
/page/john
/page/marisa
/features
User generated content that i don't want to show in the view:
/any-other-url-not-mentioned-before
Checks if the provided value is an exact match for root / or if the page path starts with either /app or /features or /page. After the starting requirement, zero or more groups in the format /letter-or-number can follow.
(^\/$|^\/app|^\/page|^\/features$)(\/\w*)*

Magento2 : Update category, URL key already exists error

I have created a new category and its not visible in navigation menu as of now.
I am adding products to it via code and its working.
Now i am editing the category to show in navigation menu, it throws error as "URL key for specified store already exists".
I tried to:
Unassigned products, throws same error.
Changed URL, left blank or changed value of URL.
Please let me know.
Clear db table url_rewrite but! for categories only. otherwise it will mess with CMS pages links.
After doing this error should be gone.
1) delete records from "url_rewrite" where entity_type is "category"
2) run php bin/magento php bin/magento indexer:reindex
1) Going your Database
2) Search the url_rewrite and "category" entity_type is Remove
3) And Finally run this command, php bin/magento indexer:reindex
I had the same problem.
Temporarily rename the category URL to something else, clear the cache and rename it to the original URL you had before.

Sitecore Web Forms for Marketers and DMS - not recording campaigns, goals and dropout info

In WFFM there is an option so that, when someone abandons the form, any data that was entered in the form itself is recorded and should be accessible via the Dropout Report.
I have a WFFM for which I have turned on Analytics and turned on the dropout feature. Unfortunately I don't see any data being recorded in the DB and the Dropout Report is visible, but empty.
I see from the javascript code included in the WFFM folder that a series of AJAX calls are supposed to save the fields on blur events -- with calls to /sitecore modules/web/Web Forms for Marketers/Tracking.aspx
I tried debugging the Javascript code, but the method supposed to post the info to /sitecore modules/web/Web Forms for Marketers/Tracking.aspx is never being called. Can you think of any reasons for this code not to work? Also, does anyone know which table this information is supposed to be recorded? Is it the fields table in the WFFM DB?
Finally, even though I have turned on analytics on this particular WFFM form and I have associated a campaign and a goal to the submission of the form, none of these is being recorded. I see that the data entered in the form is stored successfully and is displaying in the Data Report, but no info about the Campaign nor the Goal are recorded in the DB.
I even checked manually directly in the DMS DB running:
select top 10
p.DateTime, p.UrlText, cp.CampaignName
,i.Url, vi.VisitId
from pages p
inner join ItemUrls i on p.ItemId = i.ItemId
inner join Visits vi on vi.VisitId = p.VisitId
inner join GeoIps g on vi.Ip = g.Ip
left join Campaigns cp on cp.CampaignId = vi.CampaignId
order by p.DateTime desc
This one shows that the page where the form is rendered is being hit, but no campaign is associated to the visit.
Then I tried the following:
select pe.datetime, ped.Name, pg.UrlText from PageEvents pe
inner join PageEventDefinitions ped on ped.PageEventDefinitionId = pe.PageEventDefinitionId
inner join Pages pg on pg.PageId = pe.PageId
order by pe.DateTime desc
But I don't see any entry for this particular campaign nor for the goal (while I see entries for other campaigns and goals associated to non-WFFM Sitecore items)
Any advice would be greatly appreciated!
Thanks,
Francesco
EDIT
The sc.webform.js file contains this method:
_create: function () {
var self = this,
options = this.options;
if (options.tracking) {
this.element.find("input[type!='submit'], select, textarea")
.bind('focus', function (e) { self.onFocusField(e, this) })
.bind('blur change', function (e) { self.onBlurField(e, this) });
this.element.find("select")
.change(function () { $scw.webform.controls.updateAnalyticsListValue(this) });
this.element.find("input[type='checkbox'], input[type='radio']")
.click(function () { $scw.webform.controls.updateAnalyticsListValue(this) });
}
this.element.find(".scfDatePickerTextBox").each(function () { $scw.webform.controls.datePicker(this) });
},
This is supposed to be called by the form on sc.webform widget initialization. It should bind the focus and blur change events for all input fields, drop downs and text areas. Unfortunately, when I tried to put a break point inside this method, it never gets called.
SECOND EDIT
Interesting. I figured out that the whole thing should start from this line of Javascript code embedded in the page that contains the WFFM form:
<script type="text/javascript">
$scwhead.ready(function() {
$scw('#form_A8BF483419174F97A2830E12CBCF7E4F').webform({formId: "{A8BF4834-1917-4F97-A283-0E12CBCF7E4F}",pageId: "{21C24144-B964-4FBA-8388-D9B90EBBC17C}",eventCountId: "pagecolumns_0_columncontent_0_bottomrow_0_form_A8BF483419174F97A2830E12CBCF7E4F_form_A8BF483419174F97A2830E12CBCF7E4F_eventcount",tracking: true})
});
</script>
Once I put a break point here, I was finally able to trace into the _create method of the jQuery.UI widget defined in sc.webform.js. The code that calls _create is actually inside the jQuery.UI library. Kinda makes sense, right?
Finally, the code inside _create is executed, the blur events are bound to the TrackEvents method, also defined within the widget:
_trackEvents: function(events) {
$scw.ajax({
type: 'POST',
url: "/sitecore modules/web/Web Forms for Marketers/Tracking.aspx" + location.search,
data: {track: JSON.stringify(events)},
dataType: 'json'
});
What doesn't make sense is that now, even though I can finally see trackEvents being called whenever I tab from field to field in the WFFM form (why wasn't working before it's a mistery to me), I don't see any data recorded in the WFFM DB. I even tried a quick query in the DB:
select f.Timestamp, f.StorageName, fi.Value, fi.FieldName
from Form f
inner join Field fi on f.Id = fi.FormId
order by f.Timestamp desc, FieldName
Does anybody know where is Tracking.aspx supposed to save the captured field informations?
This may be silly to ask, but did you configure the data source correctly for your WFFM? I mean, obviously, you're using WFFM..but is it set to use SQL or is it using the "file" that WFFM uses by default as it's database.
like this to use SQL:
<!-- MSSQL-->
<formsDataProvider type="Sitecore.Forms.Data.DataProviders.WFMDataProvider,Sitecore.Forms.Core">
<param desc="connection string">Database=Sitecore_WebForms;Data Source=xxx;user id=xxx;password=xxx;Connect Timeout=30</param>
</formsDataProvider>
<!-- SQLite -->
<!--<formsDataProvider type="Sitecore.Forms.Data.DataProviders.SQLite.SQLiteWFMDataProvider,Sitecore.Forms.Core">
<param desc="connection string">Data Source=/data/sitecore_webforms.db;version=3;BinaryGUID=true</param>
</formsDataProvider>-->
If you don't configure that correctly, I'm wondering if somehow data is being recorded in one place but not another? Also, another question I have is to ask if this is a dev environment, are you running webforms in live mode? It just seems to me like this is a configuration issue.
We are experiencing the exact same problem on 6.5 update 6 and WFFM 2.3.3 rev. 111209. We can see the asynchronous calls to the server including the probably well formed json object containing the correct event.
Example:
track:[{"fieldId":"{E0A0BCDD-85E1-4D8D-9E76-5ABD240423C9}","type":"Field Completed","value":"test","formId":"{0F3B57C1-1B6A-43B9-A5A6-2E958C168B31}","pageId":"{025AFF68-62B9-42CE-B49F-0C36311E1976}","ticks":16}]
We don't see any of the dropouts arrive in the database, though...
Have you made sure your campaigns and goals have been deployed? If you have switched databases they may not be. To redeploy do this:
For each Goal in System -> Marketing Center -> Goals
Change the workflow state to draft
Save
Then in the review ribbon click deploy.
This will create an entry in the pageeventdefinition table and allow
you to query.
Don't forget to do the same for campaigns.