Monday, August 28, 2017

Sharepoint Search Refine by date

&refinementfilters='MyDateField:range(2014-01-01T00:00:00.0000000Z,2014-12-31T23:59:59.0000000Z,from="ge",to="le")'

Add Promoted Links Web Part as part of the Page Layout SharePoint 2013


<WebPartPages:WebPartZone ID="WebPartZone" runat="server" FrameType="None">
  <WebPartPages:XsltListViewWebPart
     ID="XsltListViewArticlePromotedList"
      runat="server"
      ListUrl="Lists/myList"
      IsIncluded="True"
      NoDefaultStyle="TRUE"
      Title="Images used in switcher"
      PageType="PAGE_NORMALVIEW"
      Default="False"
      ViewContentTypeId="0x">

    <JSLink>~site/SiteAssets/PromotedLinks.js</JSLink>

  </WebPartPages:XsltListViewWebPart>
</WebPartPages:WebPartZone>


jQuery modal dialog inside SharePoint

opening a JQ modal in sharepoint comes with some troubles.

1st since JQ creates the modal OUTSIDE the body, initialy in order to let the modal hover over everything, it does it with some nice calculations. but with SP CSS's and HTML structure that doesn't work well, and sometimes you just don't see the modal, and sometimes you see it wierd.

in some cases the JQModal appendTo Property can do the job, but sometimes the best way is to give up jQuery's calculations and just fix the modal's position' and it can be done like that, using destroy since some calculations must be done again while position is not fixed:

$(function HP_ready() {
    $(".popup").on("click", function HPs_popupClick() {
        $(".salaryPopup", this).dialog({
            bgiframe: true,
            width: 965,
            modal: true,
            autoOpen: true,
            draggable: false,
            dialogClass: 'salaryPopupFrame',
            open: function () {
                $('.ui-dialog').css("position", "fixed");
            },
            close: function (event, ui) {
                $(this).dialog('destroy');
            }
        });
    });
});

Friday, August 25, 2017

JAVASCRIPT בסיס בעיברית


אנא הסתכלו על השגיאה הזו פה למטה, ואני מאוד מבקש מכל מי שלא יכול לאמר לי בדיוק מה השגיאה רק מהסתכלות על התמונה הזו שיקרא בעיון את המייל הזה והדוגמא שלו.


אז אם אתה אחד מאותם חברים יקרים שרוצה ללמוד, אנא פתח במקביל את הJSBIN הזה שהכנתי במיוחד, ובצד ימין אפשר ללחוץ על הכפתורים clear ואח"כ run כדי להריץ מחדש, וכן כולם מוזמנים לערוך, זה לא יצור גרסה חדשה לכולם אלא מקומית לכל אחד

רקע בסיסי – JS זה שפה שבין היתר מבוססת SCOPE, כלומר כל אובייקט ופונקציה זה SCOPE משל עצמו, שמהווה CHILD לSCOPE  שמעליו, כאשר הגלובלי, הROOT SCOPE, הוא הWINDOW.
חלק מהמנגון הזה אומר ש child scope כאשר הוא מחפש איזה פרמטר/פונקציה אם הוא לא מוצא את זה אצלו הוא יחפש אותו אצל אבא שלו, סבא שלו, סבא רבא וכו'.



אז אם נלך לדוגמא שלנו אנו רואים פרמטר בשם globalVar שמוגדר בROOT, מה שנקרא גלובלי, ולאורך כל הדרך, בכל מקום בעולם שנחפש אותו אנו תמיד נמצא אותו.

לאחר מכן יש לנו פונקציה (וכל פונקיצה היא אובייקט וכל אובייקט הוא פונקציה בJS), בשם SCOPE1, ויש לו 2 פרמטרים, scope1Var, scope4Var.
עכשיו הבדיקה הראשונה שלנו שקראת בCONSOLE בשם scope1 top, שם אנו בודקים את 2 הפרמטרים הללו, ואנו רואים ש scope1Var מחזיר תוצאה ואילו scope4Var הוא undefined, אך מחזיר תוצאה, למרות שהיא undefined.
מדוע זה?
כי JS קודם כל בעת הקמת הSCOPE הוא "מצהיר" על הפרמטרים כולם שיש בSCOPE אלא שערכים הוא מציב לאורך הדרך. לכן כל עוד לא הגענו להגדרה של scope4Var לא נקבל ערך שלו אך גם לא שגיאה שהוא לא קיים, אלא פשוט שערכו הוא UNDEFINED.
למה אני אומר מצהיר במרכאות? כי באמת מחמת שפונ' היא אובייקט למעשה אני פונה לאובייקט SCOPE1 וכו' .

נמשיך הלאה ל scope2 שם אנו ממשיכים להצהיר על scope2Var, ואנו בודקים את כל הפרמטרים שדיברנו עליהם עד כה, הגלובלי ו1,2,4.
כפי שאנו רואים כולם מחזירים תוצאות, אלא ש4 מחזיר שוב undefined. כלומר scope2 עולה ומחפש את 4 בscope1 ומוצא אותו, אלא שהוא עדיין חסר ערך.

אם נמשיך הלאה נראה שאני קורא לSCOPE2 לאחר שהכנסתי ערך ל scope4Var גם רואים ממנו תוצאה.

נשמיך הלאה ל scope3, שם אנו רואים שקריאה לפרמטר הגלובלי עובדת אבל מיד לאחר מכן אנו מקבלים שגיאה ReferenceError: scope1Var is not defined
כי scope1Var קיים בscope1 שהוא "אח" של scope3  אך לא "בן" שלו, ולכן הוא אפילו לא מוצא "הצהרה" שלו.

נמצאנו למדים שעצם ההצהרה של פרמטר איפהשהו בSCOPE הנוכחי או אחד ההורים שלו כבר מביא מצב שהפרמטר מוכר כקיים אלא שהוא חסר ערך לחלוטין, לא NULL, אלא undefined, ואילו יותר חמור מזה הוא שנהוא אינו מוגדר כלל ואז זה השגיאה לעיל.

NULL בJS צריך סיפור משל עצמו.

אז נשנן
פרמטר שלא הוצהר מעולם בSTACK של הSCOPES שלי - is not defined
פרמטר שכן הוצהר בSTACK של הSCOPES שלי – undefined
פרמטר שכן הוצהר בSTACK של הSCOPES שלי וקיבל את המילה var NULL
פרמטר שכן הוצהר בSTACK של הSCOPES שלי וקיבל ערך – לפי הערך.

כעת השגיאה לעיל בתמונה צריכה להיות מובנת ממבט ראשון – מנסים לגשת לפרמטר שמוצהר איפשהו בSTACK של הSCOPES שלי אך יותר מאוחר, כלומר בהמשך, ואילו אני מנסה לגשת אליו כעת.
נסיון לגשת ל is not defined תתן ReferenceError, נסיון לגשת ל undefined זה כבר תלוי, אפשר לבדוק מה קורה איתו, אבל אם מנסים לגשת אליו, כלומר לתוכן שלו מקבלים את השגיאה למעלה.

Tuesday, August 22, 2017

Sharepoint Edit mode catch PostBack type (save, publish, ect.)

PageStateGroupSaveAndStop: means the user clicked "Save"

PageStateGroupSave: means the user clicked "Save and keep editing"

PageStateGroupPublish: means the user clicked "Save and keep editing"

ifPage.Request.Params["__EVENTARGUMENT"] == "PageStateGroupSaveAndStop"   // שמור
  || Page.Request.Params["__EVENTARGUMENT"] == "PageStateGroupSave"       // שמור והמשך עריכה
  || Page.Request.Params["__EVENTARGUMENT"] == "PageStateGroupPublish")   // פרסם
  {






Sharepoint Error Creating a List

activating feature, while provisioning a list (or creating), this happened to us with Genesis:

The filename, directory name, or volume label syntax is incorrect. (Exception from HRESULT: 0x8007007B)

we just has a space in the url

WebRelURL = "Lists/CbsEventsRegistered ", we just removed the last space and the problems was solved.

as a conclusion, this error might indicate just a wrong character somewhere in the list or column settings in the schema.

Sharepoint Updating / Changing Lookup Fields from code

unfortunately the only way to do it correctly is to change the SchemaXml itself for most changes like ListID or ColumnID ect.

here is a Sample:

public static void FixLookup(SPFieldLookup lookupField, Guid newListGuid)
{
   Log.Application.Info("FixLookup");
   if (lookupField.LookupList != newListGuid.ToString())
   {
     Log.Application.Info("update schema");
     int startIndexOfList = lookupField.SchemaXml.IndexOf("List");
     int startIndex = lookupField.SchemaXml.IndexOf("\"", startIndexOfList) + 1;
     int endIndex = lookupField.SchemaXml.IndexOf("\"", startIndex);
     int countIndex = endIndex - startIndex;
     string oldGuid = lookupField.SchemaXml.Substring(startIndex, countIndex);
     lookupField.SchemaXml = lookupField.SchemaXml.Replace(oldGuid, newListGuid.ToString());
     lookupField.Update(true);
   }

   if (lookupField.AllowMultipleValues)
   {
     /// there is a bug either in sp or more likely in the way genesis creates the lookup that without this fix its not working
     Log.Application.Info("toggle AllowMultipleValues");
     lookupField.AllowMultipleValues = false;
     lookupField.Update(true);
     lookupField.AllowMultipleValues = true;
     lookupField.Update(true);
  }
}


Usage

FixLookup(spLookupField, spList.ID);

Sharepoint Bcs to DB no results (Hebrew)

we had a situation where we connected to a db with Hebrew content and we got empty results.

well, 1st of all we removed special characters form the columns name (a dot).

then the Hebrew content we put inside brackets "{}".

Sharepoint Search Crawl error with BotDetect

this is what you may see

The SharePoint server was moved to a different location. ( Error from SharePoint site: HttpStatusCode Redirect The request failed with the error message: --< html><head><title>Object moved</title></head><body>< h2>Object moved to <a href="/_vti_bin/sitedata.asmx?AspxAutoDetectCookieSupport=1">here</a>.</h2>< /body></html> --., CorrelationID: 6f92129d-4742-20cf-86da-6e46bae7318e; SearchID = B83C0CF2-2B3E-4047-AC33-ADD06488B452 )

we dont understand why but it only happens when the BotDetect is configured as AJAX.

the available solutions, Note that for search we usually want only to adapt the admin site:

1. do not activate the capthca on the admin.
2. change the cookieless attribute in the sessionState for the BotDetect to false, like explained here:
http://captcha.com/doc/aspnet/known-issues.html#cookielesscrawlers

more on cookieless:
https://msdn.microsoft.com/en-us/library/system.web.configuration.sessionstatesection.cookieless(v=vs.110).aspx

Sharepoint 2013 search error: The crawler could not communicate with the server

wherever you get this error message in sharepoint 2013 search:

The crawler could not communicate with the server. Check that the server is available and that the firewall access is configured correctly.

the 1st thing that means is that the crawler just failed to get the page.

but before you're running to the IIS and FW, you should just think about Permission.

and that 1st of all means that everything is Published!

Steps:
1. publish everything, incuding Master pages, Page Layouts, ect.
2. make sure the user running the search crawler has Read Permissions to that web.
3. if not the above, do check the IT stuff like communications and FW.

SOAP returns NULL response

many times its just validating the soap response ui
https://www.soapui.org/soap-and-wsdl/validating-soap-services.html

Whiteboart search and MVC tutorial screenshots

thats just for future tutoring.

they're HUGE, cause they are for download or fullscreen.



Sharepoint Powershell Force Deploy

Add-SPSolution -LiteralPath [wsp path]


Install-SPSolution [wsp filename(.wsp)] -GACDeployment -WebApplication [url (http://mysite)] -CompatibilityLevel All -Force -Verbose



Disable loopback check via Registry

specify the host names that are mapped to the loopback address and can connect to Web sites on your computer
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------

  a.  Start,  Run, regedit, and then click OK.
  b.In Registry Editor, locate and then click the following registry key:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  c.  Right-click MSV1_0, point to New, and then click Multi-String Value.
  d. Type BackConnectionHostNames, and then press ENTER.
  e.  Right-click BackConnectionHostNames, and then click Modify.
  f.In the Value data box, type the host name or the host names for the sites that are on the local computer (Ipost, IPostAdmin), and then click OK.
    Quit Registry Editor, and then restart the IISAdmin service.


you can also disable loopback check:
--------------------------------------
  a. Click Start, click Run, type regedit, and then click OK.
  b.In Registry Editor, locate and then click the following registry key:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
  c. Right-click Lsa, point to New, and then click DWORD Value.
  d.Type DisableLoopbackCheck, and then press ENTER.
  e.Right-click DisableLoopbackCheck, and then click Modify.
  f.In the Value data box, type 1, and then click OK.



---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------

for IIS8 (windows server 2012) you must do both steps.

Sharepoint Application Errors do not appear on ULS logs

make sure your sp_webapp user is in the application pool under group "performance log users" (the user running the app).

you may need to config the errors on the Central Admin again.