3

It has to point to the PROD URL of the custom page application, but resets to DEV URL of the same custom page. If they change it, that resets back to DEV. We have changed it 3 times and within few minutes during the process of using that application to upload with some Content, the URL got changed back to the DEV URL.

where does Custom page information stored in SDL Tridion? Like it has some information under info tab Created by , Created time, Modified by & Modified time. In one of the forums link we have seen below comment: Custom pages are stored in CustomPages.xml from below path %TRIDION_HOME%web\WebUI\Editors\CME\Preferences\ But we don't have specified file in CME server mentioned Path.

It would be great if you suggest any resolution.

  • I think this is now stored in the database, but wouldn't be able to tell you where. – Nuno Linhares Sep 25 at 7:21
  • 1
    Hi @NunoLinhares, thanks for your swift response, entries Stored in the Database is from Sites 9 on-words, But at present the Customer is using SDL Web 8.6 version. – Sree G Sep 25 at 7:57
  • When you state "that application to upload with some Content" - what content is "that application" updating - and how? I'm wondering if your application is using something such as the Content Porter API and is inadvertently bringing in the content the pertains to the Custom Page URL? – Dylan .. Mark Saunders Sep 26 at 12:43
  • Hi @Sarang Deshmukh, Could you please help on Mark Comment. – Sree G Sep 26 at 12:46
  • Hi, excel is provided as an input and the application create components present in the excel rows and create a page, add it to the page. Application is just using a normal core service to create the components and pages based on the configuration and inputs taken from user. – Sarang Deshmukh Oct 1 at 15:05
6

it does get stored on DB from SDL 8.6. you can find the details [APP_DATA] table CM Database.

You can use the following code to read the value using core service:

var client = CMSession.GetInstance().CoreServiceClient;
var appData = client.ReadApplicationData(null, APPDATA_CUSTOMPAGES_ID);
if (appData != null)
{
    var ada = new ApplicationDataAdapter(appData);
    var appDataXml = ada.GetAs<XmlElement>();
    return appDataXml.OuterXml;
} 
  • Hi Anand, what is APPDATA_CUSTOMPAGES_ID exactly? Is that a constant you defined yourself? If so, what should the value be? – Quirijn Sep 25 at 9:04
  • Yes , it's the ID to get the data_content, if you see on ID field on APP_DATA Table. – Anand NS Sep 25 at 9:11
  • Hi @AnandNS, All the Custom Pages will be resided in Single entry in the Database?. We have found only one record with below details in APP_DATA Table. ID:XXXX, APP_ID: CustomPages, SUBJECT_TYPE:0, SUBJECT_REFERENCE_ID:NULL, SUBJECT_PUBLICATION_ID:NULL, SUBJECT_VERSION:NULL, DATA_TYPE: CustomPages, tridion.com/ContentManager/5.0 DATA_CONTENT: Encrypted Format Content (Binary Data). We haven't found much information in the table. Any Comments. – Sree G Sep 25 at 11:48
  • @Sree you need to use core service code provided to read the Encrypted Format Content by passing the ID field , for example , if you have many custom pages you will find the details the output. – Anand NS Sep 25 at 14:04
  • There is indeed a single entry and it's an XML fragment. Use the ApplicationDataAdapter to read it if you need to. There is no reason why it should be resetting, unless your upload of data includes APP_DATA. – Peter Kjaer Sep 25 at 14:12
1

Indeed. Anand already answered how to see the custom pages details using Coreservice API.

As @Anand/Peter already mentioned in his comment to clarify how to get the custom page XML using API, because in database it's store as Encoded XML Fragment.

It looks like you are still looking at the database level to see that data not using Coreservice API.

SDL highly recommends that you use the APIs to read. Accessing the database directly carries a high risk. The risk is that you corrupt the database or incur data loss. Only Engineering knows database design and business logic about the database data how it's stored.

Anyway, let me give you two examples one with full Coreservice example another one with database read.

Coreservice Example:

using System;
using System.ServiceModel;
using System.Xml;
using Tridion.ContentManager.CoreService.Client;

namespace SDL.FindAndReadCustomPagesURL
{
    class Program
    {
        private const string ServiceUrl = "{0}webservices/CoreService201603.svc/basicHttp";
        private const int MaxMessageSize = 10485760;
        static void Main(string[] args)
        {

            try
            {
                    var client = GetClient("localhost:7086");

                    client.ChannelFactory.Credentials.Windows.ClientCredential = new System.Net.NetworkCredential("username", "password");

                    var appData = client.ReadApplicationData(null, "CustomPages");
                    if (appData != null)
                    {
                        var ada = new ApplicationDataAdapter(appData);

                        XmlElement appDataXml = ada.GetAs<XmlElement>();
                        Console.WriteLine(appDataXml.OuterXml);
                    }  
            }
            catch (Exception ex)
            {
                Console.Write($"Failed to process {0}", ex.Message);
            }
        }

        static CoreServiceClient GetClient(string hostname)
        {
            var basicHttpBinding = new BasicHttpBinding
            {
                MaxReceivedMessageSize = MaxMessageSize,
                ReaderQuotas = new XmlDictionaryReaderQuotas
                {
                    MaxStringContentLength = MaxMessageSize,
                    MaxArrayLength = MaxMessageSize
                },
                Security = new BasicHttpSecurity
                {
                    Mode = BasicHttpSecurityMode.TransportCredentialOnly,
                    Transport = new HttpTransportSecurity
                    {
                        ClientCredentialType = HttpClientCredentialType.Windows
                    }
                }
            };

            hostname = string.Format("{0}{1}{2}", hostname.StartsWith("http") ? "" : "http://", hostname, hostname.EndsWith("/") ? "" : "/");

            var remoteAddress = new EndpointAddress(string.Format(ServiceUrl, hostname));
            return new CoreServiceClient(basicHttpBinding, remoteAddress);
        }
    }
}

Database Level Read:

Use Tridion_cm
SELECT [APP_ID],CONVERT(varchar(max),CONVERT(varbinary(max),[DATA_CONTENT])) as XMLDATA  
  FROM [Tridion_cm].[dbo].[APP_DATA] WHERE APP_ID='CustomPages'

I hope it's helps

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.