none
Aprendiendo el modelo de apps, primeras frustraciones RRS feed

  • Pregunta

  • Hola,

    estoy empezando a hacer mis primeros desarrollos con el modelo de apps y a las primeras de cambio me he encontrado con problema que no logro superar (me considero developer de nivel bastante bajo).

    Quiero hacer un botón que simplemente cambie el valor de un campo de un elemento en una lista. Para hacer esto, creo una app de tipo sharepoint hosted y añado una custon ribbon action. Si ejecuto por defecto la acción, me lleva a la página default que está alojada en el tenant de desarrollo (está bien dicho así?). So far so good.

    Bien, ahora quiero cambiar la forma de comportarse, no quiero que vaya a ese formulario y entonces decido cambiar el Elements.xml, en concreto la linea que hace referencia al CommandAction:

    CommandAction ="~appWebUrl/Pages/Default.aspx?{StandardTokens}&SPListItemId={SelectedItemId}&SPListId={SelectedListId}

    por algo como:

    CommandAction=javascript:MifuncionJavascript()

    y añado al final la ubicación del fichero javascript:

    <CustomAction Id=”Ribbon.Library.Actions.Scripts”
    Location =”ScriptLink”
    ScriptSrc=”/_layouts/SharePointProject1/RibbonActions.js”/>
    </Elements>

    Cuando intento realizar el deploy aparece el error:

    "Error 1 Error occurred in deployment step 'Install app for SharePoint': Se han producido errores al validar el paquete de aplicaciones.

    Después de hacer el panoli un par de horas, deduzco que me estoy pasando la filosofía del modelo de apps por el forro y lo que está pasando es que no puedo hacer referencia a un fichero javascript que no está dentro de la app.

    Tengo especial interés en aprender a utilizar el modelo de apps por la facilidad de los despliegues, pero para un developer de nivel paquete como esto es demasiado y caigo a las primeras de cambio. ¿Debo pasarme dejar de lado el modelo de apps y pasarme al modelo tradicional de soluciones penalizando mis despliegues porque no sé ni siquiera hacer esto?

    Se agradecerán simplemente enlaces de ejemplo. La verdad es que estoy viendo en muchos blogs la gente escribe como poner el botón aquí, como ocultarlo etc, en el modelo de apps, pero lo que es el propio uso real a nadie le he visto hacer algo realmente potente. ¿Estoy equivocado? 

    Muchas gracias!

    PD: estoy viendo que se puede incrustar javascript en el propio Elements.xml (http://dannyjessee.com/blog/index.php/2013/01/javascript-to-conditionally-enable-a-sharepoint-custom-ribbon-button/), no lo he probado pero no me parece un poco desordenado. Alguna propuesta mejor? :)


    miércoles, 31 de diciembre de 2014 12:37

Respuestas

  • Hola,

    para cerrar el asunto he encontrado un par de enlaces interesantes:

    http://stackoverflow.com/questions/15784326/custom-action-url-error-while-deploy-error-occurred-in-deployment-step

    En este caso esta persona tenía el mismo problema tratando de utilizar javascript en el CommandAction. Se da cuenta que según se indica en MSDN "http://msdn.microsoft.com/es-es/library/office/jj220046(v=office.15).aspx"

    • CustomAction no puede contener JavaScript:

      • Las UrlActions o CommandActions deben ser una dirección URL a la que se pueda ir. Esta dirección se puede parametrizar con tokens de acción personalizados normales además de los tokens específicos de la aplicación.

      • EnabledScript no está permitido para personalizar la cinta.

    Después de leer el post que me has remitido se me hace dificil entenderlo, pero la experiencia me indica que lo que pone ahí es correcto.

    Gracias por todo Christian! Felíz año a todos!


    • Marcado como respuesta SharePein miércoles, 31 de diciembre de 2014 18:05
    miércoles, 31 de diciembre de 2014 18:04

Todas las respuestas

  • Hola, si es bastante confuso el ejemplo de la url que pasaste.

    Usa el siguiente enlace, es más claro:

    http://sp2013.blogspot.com.ar/2013/08/sharepoint-custom-action-xml.html

    http://www.learningsharepoint.com/2011/06/13/using-javascript-js-file-in-commandaction-of-custom-ribbon-button-sharepoint-2010/

    En el JavaScript para obtener los ítems seleccionados, puedes usar el método getSelectedItems (Ejemplo: http://sp365.co.uk/2012/11/how-to-enumerate-the-selected-list-items-with-javascript/)

    Con respecto al error que mencionas, habilita el logging verbose de Visual Studio, ya que puede ser muchas cosas ese error.

    Ve a la clave de registro: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\SharePointTools y crea una clave DWORD, llamada EnableDiagnostics con valor 1. Reiniciar el Visual Studio.

    Mas info: http://msdn.microsoft.com/es-AR/library/ee471440.aspx

    Saludos.

    miércoles, 31 de diciembre de 2014 13:50
  • Hola Christian!

    gracias por responder. He seguido tus indicaciones y tengo más información, pero no me termina de funcionar.

    Este es el XML

    <?xml version="1.0" encoding="utf-8"?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
      <!--<CustomAction Location="ScriptLink" ScriptSrc="~site/Scripts/app.ribbon.js" Sequence="1"></CustomAction>-->
      <CustomAction Id="1f6177f8-9296-45b6-b557-0cc500b73017.BotonTest"
                    RegistrationType="List"
                    RegistrationId="{$ListId:Lists/Ofertas;}"
                    Location="CommandUI.Ribbon"
                    Sequence="10001"
                    Title="Invoke &apos;BotonTest&apos; action">
        <CommandUIExtension>
          <CommandUIDefinitions>
            <CommandUIDefinition Location="Ribbon.ListForm.Display.Actions.Controls._children">
              <Button Id="Ribbon.ListForm.Display.Actions.Controls._children"
                      Alt="Request BotonMenuDentroElemento"
                      Sequence="100"
                      Command="Invoke_BotonMenuDentroElementoButtonRequest"
                      LabelText="Request BotonMenuDentroElemento"
                      TemplateAlias="o1"
                      Image32by32="_layouts/15/images/placeholder32x32.png"
                      Image16by16="_layouts/15/images/placeholder16x16.png" />
            </CommandUIDefinition>
          </CommandUIDefinitions>
          <CommandUIHandlers>
            <!--<CommandUIHandler Command="Invoke_BotonTestButtonRequest" EnabledScript=""  CommandAction="javascript:setText();"></CommandUIHandler>-->
            <CommandUIHandler Command="Invoke_BotonTestButtonRequest"
                              CommandAction="~appWebUrl/Pages/Test.html?{StandardTokens}&amp;SPListItemId={SelectedItemId}&amp;SPListId={SelectedListId}"/>
          </CommandUIHandlers>
        </CommandUIExtension >
      </CustomAction>  
    </Elements>

    Tal cual esta, la app se despliega sin rechistar. Si descomento las líneas que aparecen en negrita para hacer lo que comentas, da el siguiente error:

    ------ Deploy started: Project: Test, Configuration: Debug Any CPU ------
    Active Deployment Configuration: Deploy App for SharePoint
      Skipping deployment step because a pre-deployment command is not specified.
      Skipping the uninstall step because the app for SharePoint is not installed on the server.
      Install app for SharePoint:
      Uploading the app for SharePoint...
      Installation is in progress (00:00:00)
      Installation is in progress (00:00:03)
      Installation is in progress (00:00:05)
      Installation is in progress (00:00:08)
      App failed to install, cleaning up...
      Successfully uninstalled the app for SharePoint.
      App installation encountered the following errors:
      31/12/2014 15:39:44
      
      @"Error 1
            CorrelationId: ca0b004a-a0d7-4ec9-acbb-0d7a420a8910
            ErrorDetail: Se han producido problemas con la definición web de la aplicación en el paquete.
            ErrorType: App
            ErrorTypeName: Aplicación relacionada
            ExceptionMessage: Deployment failed in host web http://win2kr2spf2013 for app Test/540f0ca5-f5e2-4ca5-8924-f9d0c7d689c4. Microsoft.SharePoint.SPException: Feature definition with Id 540f0ca5-f5e2-4ca5-8924-f9d0c7d689c5 failed validation, file '/elements610ae51d-8e41-48ff-9a75-5bdedd99c2d0.xml', line 3, character 17: The 'Location' attribute is invalid - The value 'ScriptLink' is invalid according to its datatype 'http://schemas.microsoft.com/sharepoint/:CustomActionLocations' - The Enumeration constraint failed.
       at Microsoft.SharePoint.Administration.SPSolutionPackage.FeatureXmlValidationCallback.XmlValidationCallBack(Object sender, ValidationEventArgs evtargs)
       at System.Xml.Schema.XmlSchemaValidator.CheckAttributeValue(Object value, SchemaAttDef attdef)
       at System.Xml.Schema.XmlSchemaValidator.ValidateAttribute(String lName, String ns, XmlValueGetter attributeValueGetter, String attributeStringValue, XmlSchemaInfo schemaInfo)
       at System.Xml.XsdValidatingReader.ValidateAttributes()
       at System.Xml.XsdValidatingReader.ProcessElementEvent()
       at System.Xml.XsdValidatingReader.Read()
       at System.Xml.XmlReader.MoveToContent()
       at System.Xml.XmlReader.IsStartElement()
       at Microsoft.SharePoint.Utilities.SPUtility.XsdValidateXml(XmlTextReader xmlStreamReader, String friendlyName, String pathXsdFile, String tagExpectedRootNode, Int32 desiredPathVersion, ValidationEventHandler xsdValEventHandler)
       at Microsoft.SharePoint.Utilities.SPUtility.XsdValidateXml(XmlTextReader xmlStreamReader, String friendlyName, String pathXsdFile, String tagExpectedRootNode, ValidationEventHandler xsdValEventHandler)
       at Microsoft.SharePoint.Packaging.SPTargetWebDeploymentGroup.ValidateAppPartFeatureXsd(PackagePart appPart, Guid featureGuid)
       at Microsoft.SharePoint.Packaging.SPTargetWebDeploymentGroup.ExtractElementPartToWsp(PackagePart elementPart, TemporaryDirectory wspTempDir, SHA256Managed sha, Guid productId, SPAppInstance appInstance, Guid featureId, String featureWspRelativeDirectory)
       at Microsoft.SharePoint.Packaging.SPTargetWebDeploymentGroup.ExtractFeaturePartToWsp(SPFeatureAppPart featureAppPart, TemporaryDirectory wspTempDir, SHA256Managed sha, Guid productId, SPAppInstance appInstance)
       at Microsoft.SharePoint.Packaging.SPTargetWebDeploymentGroup.ExtractFeaturePartsToWsp(List`1 featureAppParts, SPWeb web, TemporaryDirectory wspTempDir, SHA256Managed sha, Guid productId)
       at Microsoft.SharePoint.Packaging.SPTargetWebDeploymentGroup.GenerateAndActivateUserSolutionFromPackage(SPWeb web, SPAppPackage appPackage, Guid productId, String solutionName, SPSolutionLevel solutionLevel)
       at Microsoft.SharePoint.Packaging.SPTargetWebDeploymentGroup.InstallOrUpgrade(SPSite site, Nullable`1& solutionId)
            Source: ParentWeb
            SourceName: Implementación de web principal
    Error occurred in deployment step 'Install app for SharePoint': Failed to install app for SharePoint. Please see the output window for details.
    Exception Message: Failed to install app for SharePoint. Please see the output window for details.
    Exception Type Name: System.InvalidOperationException
    Exception Stack Trace:    at Microsoft.VisualStudio.SharePoint.AppInstaller.InstallApp(IDeploymentContext context, Guid appInstanceId, AppVersionedId appVersionedId)
       at Microsoft.VisualStudio.SharePoint.InstallAppForSharePoint.InstallAppPart2(IDeploymentContext context, String packagePath, Guid appInstanceId, AppVersionedId appVersionedId)
       at Microsoft.VisualStudio.SharePoint.InstallAppForSharePoint.Execute(IDeploymentContext context)
       at Microsoft.VisualStudio.SharePoint.Deployment.ConfigurationExecutor.Execute()
       at Microsoft.VisualStudio.SharePoint.Deployment.WspDeploymentHandler.Deploy()
    ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
    ========== Deploy: 0 succeeded, 1 failed, 0 skipped ==========

    El mensaje no parece muy descriptivo, al menos para mi.

    Hasta aquí puedo llegar. Gracias por tu tiempo!

    miércoles, 31 de diciembre de 2014 15:48
  • Hola,

    para cerrar el asunto he encontrado un par de enlaces interesantes:

    http://stackoverflow.com/questions/15784326/custom-action-url-error-while-deploy-error-occurred-in-deployment-step

    En este caso esta persona tenía el mismo problema tratando de utilizar javascript en el CommandAction. Se da cuenta que según se indica en MSDN "http://msdn.microsoft.com/es-es/library/office/jj220046(v=office.15).aspx"

    • CustomAction no puede contener JavaScript:

      • Las UrlActions o CommandActions deben ser una dirección URL a la que se pueda ir. Esta dirección se puede parametrizar con tokens de acción personalizados normales además de los tokens específicos de la aplicación.

      • EnabledScript no está permitido para personalizar la cinta.

    Después de leer el post que me has remitido se me hace dificil entenderlo, pero la experiencia me indica que lo que pone ahí es correcto.

    Gracias por todo Christian! Felíz año a todos!


    • Marcado como respuesta SharePein miércoles, 31 de diciembre de 2014 18:05
    miércoles, 31 de diciembre de 2014 18:04