none
Использование копии "Local People Results" RRS feed

  • Общие обсуждения

  • Есть известный обходной путь для сортировки результатов в вэб-части результатов поиска, когда создается копия search results (в моем примере это "Local People Results") и в построителе делается нужный запрос и сортировка.

    После этого в вэбчасти просто выбираем этот новый search results, запрос пустой, все остальное по умолчанию и получаем сортированный список людей.

    Проблема в том, что отображается список не так как список при стандартном "Local People Results" (с фото и т.д.), а как просто неформатированный список (ФИО + url), т.е. display template не применяется как в первоначальном варианте. Если в вэб части явно установить тип результата "Person", то ничего не меняется - так же отображается не форматированный список (что говорит о том, что возвращается что-то в ином виде, чем в исходном варианте? - у меня подозрение, что именно тут какой-то баг). Если же явно указать display tenplate "Элемент "Люди"", то отображаются пустые блоки без информации, т.е. попытка форматирования есть, но неудачная.

    Как бы это вылечить?


    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 5:54
    Модератор

Все ответы

  • Если же явно указать display tenplate "Элемент "Люди"", то отображаются пустые блоки без информации, т.е. попытка форматирования есть, но неудачная.

    Там в js ctx.CurrentItem не содержит значения. Пока не разобрался почему, возможно элементы находятся, но поиск не возвращает нужные поля. 

    Для каждого найденного результата динамически применяется шаблон из файла: item_person.js 

    Вот кусочек кода из него:

       if(!$isNull(ctx.CurrentItem) && !$isNull(ctx.ClientControl)){
                            var id = ctx.ClientControl.get_nextUniqueId();
                            var itemId = id + Srch.U.Ids.item;
                            var hoverId = id + Srch.U.Ids.hover;
                            $setResultItem(itemId, ctx.CurrentItem);
                            var container_id = id + "_peopleContainer";
                            var hhProps = Srch.U.createXMLDocument("<root>" + ctx.CurrentItem.HitHighlightedProperties + "</root>");
                            var encodedPath = $urlHtmlEncodeString(ctx.CurrentItem.Path);
                            var has_pn = !$isEmptyString(ctx.CurrentItem.PreferredName);
                            var has_sip = !$isEmptyString(ctx.CurrentItem.SipAddress);
                            var has_email = !$isEmptyString(ctx.CurrentItem.WorkEmail);
                            var has_jt = !$isEmptyString(ctx.CurrentItem.JobTitle);
                            var has_dp = !$isEmptyString(ctx.CurrentItem.Department);
                            var has_abme = !$isEmptyString(ctx.CurrentItem.AboutMe);
                            var has_resp = !$isEmptyString(ctx.CurrentItem.Responsibilities);
                            var has_pp = !$isEmptyString(ctx.CurrentItem.PastProjects);
                            var has_ski = !$isEmptyString(ctx.CurrentItem.Skills);
                            var has_sch = !$isEmptyString(ctx.CurrentItem.Schools);
                            var has_int = !$isEmptyString(ctx.CurrentItem.Interests);
                            var has_vlm = !$isEmptyString(ctx.CurrentItem.ProfileViewsLastMonth);
                            var has_vlw = !$isEmptyString(ctx.CurrentItem.ProfileViewsLastWeek);
                            var has_query = !$isEmptyString(ctx.CurrentItem.ProfileQueriesFoundYou); 
                            var isSelfSrch = (has_vlm == true || has_vlw == true || has_query == true);
                            var delimiter = "";
                            var userPersonaId = $htmlEncode(id) + "_peopleUserPersona";
                            var uSip = ctx.CurrentItem.SipAddress;
                            var uEmail = ctx.CurrentItem.WorkEmail;
                            var uName = ctx.CurrentItem.PreferredName;
                            var uPicUrl = ctx.CurrentItem.PictureURL;

    Так вот в свойствах (например, ctx.CurrentItem.PreferredName) пустыне значения.
    Тут два варианта, либо на js почему-то не инициализировались при custom search source,
    либо c server не вернулись значения.

    p.s. на sp online такая же беда ;)




    [custom.development]



    9 апреля 2015 г. 9:51
  • Ок, дальнейшее исследование c помощью fiddler показало, что возвращаются разные результаты.

    Для Local Peaople Results
    "Rank": 5.25, "DocId": 28502914, "AboutMe": null, "AccountName": "i:0#.f|membership|xxxx@xxx.com", "BaseOfficeLocation": null, "Department": null, "HitHighlightedProperties": "https:\u002f\u002fxxxxxx-my.sharepoint.com:443\u002fPersonImmersive.aspx?accountname=i%3A0%23%2Ef%7Cmembership%7Ctest%40xxxxxx%2Ecom<preferredname hashh=\"2\"><c0>Test<\u002fc0> <c0>Test<\u002fc0><\u002fpreferredname>", "Interests": "", "JobTitle": null, "LastModifiedTime": "\/Date(1419440970000)\/", "Memberships": "", "PastProjects": "", "Path": "https:\u002f\u002fxxxxxx-my.sharepoint.com:443\u002fPersonImmersive.aspx?accountname=i%3A0%23%2Ef%7Cmembership%7Ctest%40xxxxxx%2Ecom", "PictureURL": null, "PreferredName": "Test Test", "Responsibilities": "", "Schools": "", "ServiceApplicationID": "6400c535-c4a6-4068-a075-45b297c20135", "SipAddress": null, "Skills": "", "UserProfile_GUID": "eb572795-3a53-44b9-a0b5-247b02c39c40", "WorkEmail": null, "WorkId": 28502914, "YomiDisplayName": null, "docaclmeta": null, "OriginalPath": "https:\u002f\u002fxxxxxx-my.sharepoint.com:443\u002fPersonImmersive.aspx?accountname=i%3A0%23%2Ef%7Cmembership%7Ctest%40xxxxxx%2Ecom", "ResultTypeIdList": "9;21", "PartitionId": "\/Guid(81e50e0e-ead3-4172-85d1-73658f6d15c6)\/", "UrlZone": 0, "Culture": "en-US", "ResultTypeId": 9, "EditProfileUrl": null, "ProfileViewsLastMonth": null, "ProfileViewsLastWeek": null, "ProfileQueriesFoundYou": null, "RenderTemplateId": "~sitecollection\u002f_catalogs\u002fmasterpage\u002fDisplay Templates\u002fSearch\u002fItem_Person.js", "piSearchResultId": "0_1"

    Для моего источника:

    "Rank": 0.5, "DocId": 28502914, "WorkId": 28502914, "Title": "Test Test", "Author": "", "Size": 0, "Path": "https:\u002f\u002fxxxxxx-my.sharepoint.com:443\u002fPersonImmersive.aspx?accountname=i%3A0%23%2Ef%7Cmembership%7Ctest%40xxxxxx%2Ecom", "Description": null, "Write": "\/Date(1419440970000)\/", "LastModifiedTime": "\/Date(1419440970000)\/", "CollapsingStatus": 0, "HitHighlightedSummary": "", "HitHighlightedProperties": null, "contentclass": "urn:content-class:SPSPeople", "PictureThumbnailURL": null, "ServerRedirectedURL": null, "ServerRedirectedEmbedURL": null, "ServerRedirectedPreviewURL": null, "FileExtension": "aspx", "ContentTypeId": null, "ParentLink": null, "ViewsLifeTime": null, "ViewsRecent": null, "SectionNames": "", "SectionIndexes": "", "SiteLogo": null, "SiteDescription": null, "deeplinks": null, "importance": null, "SiteName": null, "IsDocument": false, "FileType": null, "IsContainer": false, "WebTemplate": null, "SecondaryFileExtension": null, "docaclmeta": null, "SPWebUrl": null, "UniqueId": null, "ProgId": null, "LinkingUrl": null, "OriginalPath": "https:\u002f\u002fxxxxxx-my.sharepoint.com:443\u002fPersonImmersive.aspx?accountname=i%3A0%23%2Ef%7Cmembership%7Ctest%40xxxxxx%2Ecom", "ResultTypeIdList": "453", "PartitionId": "\/Guid(81e50e0e-ead3-4172-85d1-73658f6d15c6)\/", "UrlZone": 0, "Culture": "en-US", "ResultTypeId": 453, "RenderTemplateId": "~sitecollection\u002f_catalogs\u002fmasterpage\u002fDisplay Templates\u002fSearch\u002fItem_Person.js", "piSearchResultId": "0_1"
    Т.е. с сервера не приходят значения для свойств используемых в динамически генерируемом шаблоне.
    Ищем дальше )

    [custom.development]

    9 апреля 2015 г. 10:29
  • Да, это я тоже увидел: сервер возвращает разные результаты - о чем я сразу и написал.

    Непонятно как он умудряется это делать :-(


    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 11:04
    Модератор
  • Попробуйте:
    1) Открываете свойства веб-части
    2) Раскрываете "шаблоны отображения"
    3) Выбираете "Использовать один шаблон для отображения элементов", вместо типа результата.
    4) Выбираете "Элемент Люди"
    5) Сохраняйте и пробуйте )

    p.s.: у элемента люди прописаны в настройках какие поля возвращать ;)

    [custom.development]

    9 апреля 2015 г. 11:12
  • Это уже попробовано :-) В исходном вопросе описано: после этого список отображается из пустых блоков

    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 11:17
    Модератор
  • А у меня заработало (сначала тоже пустой список был). Я правда ещё кое-какие изменения делал.
    Сейчас буду вспоминать )

    [custom.development]

    9 апреля 2015 г. 11:19
  • И вас написано, что вы пробовали ставить Person (тип результата), а я о другом.

    [custom.development]


    9 апреля 2015 г. 11:28
  • Этот вариант как раз дает пустые блоки.

    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 11:29
    Модератор
  • У меня теперь и Person работает, и собственный тип результата, и через шаблон напрямую.
    Пойду выпью чай. Ещё раз проверю, что всё работает. Есть одна мысля )

    [custom.development]

    9 апреля 2015 г. 11:33
  • Вышлите чай, чтобы у меня тоже заработало.

    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 11:48
    Модератор
  • Пробуем:
    1) Открываем настройки веб-части
    2) Раскрываем "шаблоны отображения"
    3) Нажимаем на ссылку "Настроить типы результатов"
    4) На открывшейся странице создаём "Новый тип результата"

    5) Настраиваем как на картинке:

    6) После сохранения закрываем страницу, заново открываем настройки веб-части
    7) В используемых типах выбираем: WTF, либо "Принятие решения с помощью..."
    8) Сохраняем, проверяем.

    p.s.: у типов результатов есть scope (сайт, коллекция сайтов...)


    [custom.development]

    9 апреля 2015 г. 12:15
  • Не работает. Все как прежде. Стоит переключиться на свой источник как отображение ломается.

    Полагаю, что все же проблема в источнике, в том как он создан.


    Сазонов Илья http://isazonov.wordpress.com/


    9 апреля 2015 г. 12:54
    Модератор
  • Нет, проблема не в нём. 
    Протестировал на двух SP Online.
    Там такие же проблемы. Кое-что нашёл, но пока долго писать.
    Если интересно, свяжитесь со мной через почту (email в [custom.development])
    Могу по скайпу рассказать, что там. 
    В целом там беда с Display Templates. Которые начинают работать после конверсии, 
    при этом конверсия работает для центра поиска, но не работает (пока не получилось сделать) на обычных коллекциях сайтов.

    [custom.development]

    9 апреля 2015 г. 15:13
  • Я делал на коллекциях. Попробовал сделать в Центре поиска - та же проблема.

    Кроме того список шаблонов отображения в коллекции сайтов почему-то отображается со сломанной кодировкой (колллекция приехала с версии 2010 на версию 2013 - может в этом дело. Тоже вопрос как вылечить). В тоже вреся в Центре поиска отображается нормально, но все равно не работает.

    В чем заключается "конверсия", о которой вы написали?


    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 15:31
    Модератор
  • Ок, постараюсь изложить, как я сделал, чтобы заработало в SP Online в Search Center.

    1) Заходим в Search Center,  https://myportal/search/_layouts/15/DesignDisplayTemplates.aspx
    2) Нажимаем изменить Item_Person (Элемент "Люди")
    3) Ничего не трогаем в нём, но нажимаем ОК (сохранить). 
    4) Снова откроется список. Увидим "кракозябли" для Item_Person.
    5) Теперь заходим в search center, изменить веб-часть. Выбираем custom query source.
    6) И выбираем отображать шаблон, а не тип, а именно "кракозябли".
    7) Сохраняем, проверяем работает (можно сходить, попить чай, потом проверить, если сразу не заработает). 
    8) Кракозябли можно переименовать - всё будет работать. 
    Проверено на двух SP Online tenant. 
    --------------------------------------------------
    Возвращаемся сюда: https://myportal/search/_layouts/15/DesignDisplayTemplates.aspx
    Ещё раз смотрим на Item_Person, а именно на колонку статус - там будет "Преобразование выполнено успешно". Именно, после появления этого статуса, у меня начало всё работать.
    В SP есть механизм создания шаблонов, которые применяются при поиске.
    Он работает (точнее пытается), в частности, путём создания связки файлов js + html.

    В дизайнере, т.е. на странице DesignDisplayTemplates.aspx вы видим только html файлы.
    Реально же, для каждого html файла автоматически создаёт js - файл, в который помещается код из html файла. Об этом можно прочесть здесь: https://msdn.microsoft.com/en-us/library/office/jj945138.aspx.

    Я не знаю почему, но без обновлённой конверсии элемента Item_Person, при поиске не возвращаются  определённые поля (в свойствах Item_Person эти поля перечислены).

    Можно провести эксперимент, который так же позволит отображать элементы в поиске идентично стандартному поиску. 
    Для этого можно создать собственный html-шаблон. При этом на msdn нас настоятельно просят это делать определённым образом, а именно:
    1) Подключить сетевой диск к папке: https://myportal/search/_catalogs/masterpage/
    2) Перейти в папку Dispay Templates -> Search
    3) Там скопировать один из имеющихся html файлов. В нашем случае Item_Person (для "кракозябль"  он по-прежнему будет называться Item_Person.html)
    4) После этого создастся автоматически такой же файл, только js. Между ними будет установлена связь.
    5) Html файл можно переименовать. Js файл переименуется автоматически.
    6) Теперь заходим на страницу: https://myportal/search/_layouts/15/DesignDisplayTemplates.aspx
    7) Находим наш новый элемент. Видим, что у него колонка статус тоже имеет значение "Преобразование выполнено успешно". Значит всё ок.
    8) Заходим в настройки веб-части в центре поиска. Можем выбрать новый шаблон. Всё будет работать.
    Можно его назначить созданному типу результата. 
    -------------------------------------------------

    Теперь идём на нашу "рабочую" коллекцию сайтов, и тут начинается магия :)
    1) Открываем страницу:  https://myportal/_layouts/15/DesignDisplayTemplates.aspx
    2) И что мы видим? Страница отличается? У меня да. На ней предлагается залить файлы.
    3) Если залить, то ничего хорошего не будет, они не поместятся куда нужно (т.е. в папку search).
    4) Тогда открываем через сетевой диск папку: https://myportal/_catalogs/masterpage/
    5) Заходим в Dispay Templates -> Search.
    6) В моём случае там находятся только js-файлы (протестировано на 3-х коллекциях)

    7) Можно попробовать создать там html файл, но при этом js файл не создастся автоматически.

    8) Ок, можно скопировать из search center сюда два файла, но и они не дадут результат. - 
    - были только js файлы из-за того, что не развёрнута publishing инфраструктура, после включения фич, html появились, синхронизация html + js заработала. 
    -----------------------

    Либо я чего-то не знаю, либо это штуковина не работает на коллекциях сайтов, кроме как search center.  К сожалению, решение пока не нашёл. Может текст выше наведёт кого-нибудь на решение )  -

    Решение в последнем ответе.



    9 апреля 2015 г. 16:38
  • Итак, заработало:

    Шаги:
    1) Обязательно должны быть активны Publishing фичи для Site Collection & Site.
    2) После активации нужно подождать. В третий раз за чаем.
    3) После чаепития возвращаемся и наша страница /_layouts/15/DesignDisplayTemplates.aspx работает как нужно.
    4) Открываем Item_Person для изменения свойств.
    5) Можем изменить описание (если у вас русская локализация для коллекции сайтов, то после сохранения будут кракозябли). Открываем ещё раз и сохраняем с нормальным названием.
    Смотрим, что Conversion Succefull в колонке Status.
    6) Настраиваем веб-часть на шаблон person (либо делаем свой тип с шаблоном person) 
    7) Проверяем - всё работает. 
    -----------------------------------------------
    p.s. Илья, спасибо, вы сделали мой день )
    p.s.2: после изменения элемента, срабатывают event receivers, которые делают конверсию. 
    Почему-то они не вызываются (либо вызываются, но конверсия не вызывается), когда активируются publishing фичи. 


    [custom.development]



    9 апреля 2015 г. 18:02
  • Сразу после исправления имени (на "Элемент "Люди"") элемента Item_Person на странице /_layouts/15/DesignDisplayTemplates.aspx (имя было в сломанной кодировке),  вэб часть тут же обновилась и отобразила список как нужно. Подозрения на счёт имени были, но страшно было трогать. :-)

    Вывод: надо исправлять имена Display templates

    У меня на коллекции сайтов включена публикация, поэтому не могу подтвердить является ли это обязательным элементом.

    Спасибо AlexanderShelopukho за проделанную работу!

    Ещё могу добавить, что имена Display Templates сломаны скорее всего при миграции с версии 2010. Как лечить неясно - это отдельный вопрос.


    Сазонов Илья http://isazonov.wordpress.com/



    10 апреля 2015 г. 10:40
    Модератор
  • Илья, а колонка статус у вас изменилась? Т.е. в ней есть какое-нибудь сообщение? 

    p.s.: на англ. сайте, я без переименовывания делал, и работало именно после того как открывал Item_Person на редактирование, и нажимал сохранить. Там имя ломаться не будет. 


    [custom.development]


    10 апреля 2015 г. 12:00
  • Да, Статус сразу из пустого стал "Преобразование выполнено успешно"

    А у вас на английской версии коллекция сайтов мигрированная с 2010 или созданная сразу на 2013?


    Сазонов Илья http://isazonov.wordpress.com/

    10 апреля 2015 г. 12:54
    Модератор
  • Нет, у меня сразу с 2013.
    Кракозябли и все проблемы как у вас я повторил на 3-х фермах SP 2013 + двух SP Online tenant (и в них ещё разные варианты с языками).
    Протестил и англ. и русские варианты. Работало только после преобразования.

    В код пока не лез. Времени не хватило )

    [custom.development]

    10 апреля 2015 г. 13:14