none
"SPClientPeoplePicker is not defined" Sharepoint 2013 RRS feed

  • Вопрос

  • Добрый день, кастомизирую форму редактирования элемента списка, добавляю ClientPeoplePicker по статье http://ulmaskulov.blogspot.ru/2014/08/sharepoint-2013-clientpeoplepicker.html

    Добавил код на форму создания - работает без нареканий. 

    Пытаюсь адаптировать форму редактирования путем вставки в "редактор сценариев (Script Editor)" следующего кода 

    <script language="javascript" type="text/javascript" src="http://document/bills/scripts/jquery-1.11.2.min.js"></script>
    <script language="javascript" type="text/javascript" src="http://document/bills/scripts/jquery.SPServices-2014.02.min.js" xmlns:ddwrt2="urn:frontpage:internal"></script>
    <SharePoint:ScriptLink name="clienttemplates.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="clientforms.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="cui.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="autofill.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="sp.RequestExecutor.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="sp.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="sp.runtime.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <SharePoint:ScriptLink name="sp.core.js" runat="server" LoadAfterUI="true" Localizable="false" />
    <script language="javascript"  type="text/javascript">
    
    // Заполняем поля в ClientPeoplePicker
    var UserFieldPP = $().SPServices.SPFindPeoplePicker({ peoplePickerDisplayName: "Кто согласовывает"});
    
    var UserFieldPPPeopleList = UserFieldPP.currentValue.split(";");
    UserFieldPPPeopleList.pop(); 
    
    var picker = SPClientPeoplePicker.SPClientPeoplePickerDict["ctl00_ctl35_g_aa29397d_5f3f_414d_b2a5_b5c63deea1aa_UserFieldCPP_TopSpan"]
    
    for (i = 0; i < UserFieldPPPeopleList.length; i++) { 
        var name = UserFieldPPPeopleList[i];
     $("#ctl00_ctl35_g_aa29397d_5f3f_414d_b2a5_b5c63deea1aa_UserFieldCPP_TopSpan_EditorInput").val(name);
     picker.AddUnresolvedUserFromEditor(true)
    }
    
    </script>

    Получаю ошибку SPClientPeoplePicker is not defined. 

    Как избежать этой ошибки? 

    Шарик только изучаю, прошу сильно не пинать =)


    3 февраля 2015 г. 12:49

Ответы

  • Не хватало вот такой строки

    <script language="javascript" type="text/javascript" src="http://document/_layouts/15/clientpeoplepicker.js"></script>

    После её добавления всё заработало как нужно.

    Выкладываю код как работает у меня на форме редактирования:

    <script language="javascript" type="text/javascript" src="http://document/bills/scripts/jquery-1.11.2.min.js"></script>
    <script language="javascript" type="text/javascript" src="http://document/bills/scripts/jquery.SPServices-2014.02.min.js" xmlns:ddwrt2="urn:frontpage:internal"></script>
    <script language="javascript" type="text/javascript" src="http://document/_layouts/15/clientpeoplepicker.js"></script>
    <script language="javascript"  type="text/javascript">
    
    SP.SOD.executeOrDelayUntilEventNotified(function () {
    UserFieldPP = $().SPServices.SPFindPeoplePicker({
     peoplePickerDisplayName: "Кто согласовывает"
    });
    UserFieldPPPeopleList = UserFieldPP.currentValue.split(";");
    UserFieldPPPeopleList.pop(); 
    picker = SPClientPeoplePicker.SPClientPeoplePickerDict["UserFieldCPP_TopSpan"];
    
    for (i = 0; i < UserFieldPPPeopleList.length; i++) { 
        name = UserFieldPPPeopleList[i];
     $("#UserFieldCPP_TopSpan_EditorInput").val(name);
     picker.AddUnresolvedUserFromEditor(true)
    }
    }, "sp.bodyloaded");
    
    function PreSaveAction() {
    
    // Заполняем поля в PeoplePicker
    var arrUserField = [];
    $("#ctl00_ctl35_g_aa29397d_5f3f_414d_b2a5_b5c63deea1aa_UserFieldCPP_TopSpan span span span[class='ms-entity-resolved']").each(function(index, elem){
        arrUserField.push($(this).text());
    });
    var strUserField = arrUserField.join(";");
    
    $().SPServices.SPFindPeoplePicker({
     peoplePickerDisplayName: "Кто согласовывает",
     valueToSet: strUserField ,
     checkNames: true
    });
    return true;
    }
    
    </script>
    Я не в чем не ошибся?



    5 февраля 2015 г. 10:01

Все ответы

  • Для начала стоит прочитать несколько статей:

    http://gandjustas.blogspot.com/2013/07/sharepoint-script-on-demand.html

    http://gandjustas.blogspot.com/2014/07/sharepoint-script-load.html

    http://gandjustas.blogspot.com/2014/05/jquery-sharepoint-what-you-need-to-know.html


    Business Solutions Architect, SharePoint Expert, Trainer, Speaker and Author http://gandjustas.blogspot.com/ Join Russian SharePoint Community at https://www.facebook.com/groups/sharepointrussian/

    4 февраля 2015 г. 9:52
  • Скорее всего не подгрузились файлы, которые описывают объект , для начала попробуйте обернуть код в функцию и вызвать его так:

    setTimeout("fillCPPFromPP();", 1500);}	

    Попробуйте, если не получится, увеличить с 1500 до 5000. Ну или просто руками из консоли.
    Если заработает, значит вам следует крайне внимательно изучить статьи, которые указал gandjustas.
    Начать с этой. Это очень важно, так как есть особенности применения JavaScript в SharePoint.

    Примерно так можно ждать пока что-то необходимое загрузиться в браузер, потом исполниться код с использованием объектов, описанных в ожидаемых скриптах:

    SP.SOD.executeOrDelayUntilScriptLoaded( fillCPPFromPP(), 'sp.js');

    Но код выше только ждет пока что-то необходимо загрузиться, но не загружает его.
    Так что попробуйте использовать это:

    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', fillCPPFromPP);


    4 февраля 2015 г. 15:25
  • Не хватало вот такой строки

    <script language="javascript" type="text/javascript" src="http://document/_layouts/15/clientpeoplepicker.js"></script>

    После её добавления всё заработало как нужно.

    Выкладываю код как работает у меня на форме редактирования:

    <script language="javascript" type="text/javascript" src="http://document/bills/scripts/jquery-1.11.2.min.js"></script>
    <script language="javascript" type="text/javascript" src="http://document/bills/scripts/jquery.SPServices-2014.02.min.js" xmlns:ddwrt2="urn:frontpage:internal"></script>
    <script language="javascript" type="text/javascript" src="http://document/_layouts/15/clientpeoplepicker.js"></script>
    <script language="javascript"  type="text/javascript">
    
    SP.SOD.executeOrDelayUntilEventNotified(function () {
    UserFieldPP = $().SPServices.SPFindPeoplePicker({
     peoplePickerDisplayName: "Кто согласовывает"
    });
    UserFieldPPPeopleList = UserFieldPP.currentValue.split(";");
    UserFieldPPPeopleList.pop(); 
    picker = SPClientPeoplePicker.SPClientPeoplePickerDict["UserFieldCPP_TopSpan"];
    
    for (i = 0; i < UserFieldPPPeopleList.length; i++) { 
        name = UserFieldPPPeopleList[i];
     $("#UserFieldCPP_TopSpan_EditorInput").val(name);
     picker.AddUnresolvedUserFromEditor(true)
    }
    }, "sp.bodyloaded");
    
    function PreSaveAction() {
    
    // Заполняем поля в PeoplePicker
    var arrUserField = [];
    $("#ctl00_ctl35_g_aa29397d_5f3f_414d_b2a5_b5c63deea1aa_UserFieldCPP_TopSpan span span span[class='ms-entity-resolved']").each(function(index, elem){
        arrUserField.push($(this).text());
    });
    var strUserField = arrUserField.join(";");
    
    $().SPServices.SPFindPeoplePicker({
     peoplePickerDisplayName: "Кто согласовывает",
     valueToSet: strUserField ,
     checkNames: true
    });
    return true;
    }
    
    </script>
    Я не в чем не ошибся?



    5 февраля 2015 г. 10:01
  • Ты ошибся в том, что выбрал клиентский скрипт для решения этой задачи.

    Business Solutions Architect, SharePoint Expert, Trainer, Speaker and Author http://gandjustas.blogspot.com/ Join Russian SharePoint Community at https://www.facebook.com/groups/sharepointrussian/

    5 февраля 2015 г. 11:14