SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Problem ContentType und ListSchema

Unbeantwortet Dieser Beitrag hat 11 Antworten

Ohne Rang
929 Beiträge
Thomas Östreich erstellt 23 Sept. 2010 18:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

habe folgendes Problem beim bereitstellen von ContentTypes und Lists per Schema festgestellt:

Sobald ich meine CT's und Lists über separate Features bereitstelle heißen meine CT's innerhalb der Liste "Element" klicke ich auf diesen Inhaltstyp heißt er auf einmal korrekt (z.b: QueueCT). Das kann doch nicht normal sein oder!?!

Feature1 = QueueCT = 0x0100031dc26ca875430487c8b10e35c39e95

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <!-- Übergeordneter ContentType: Element (0x01) -->
  <ContentType ID="0x0100031dc26ca875430487c8b10e35c39e95"
               Name="$Resources:Name.SM,QueueCT"
               Group="_Hidden"
               Description="$Resources:Name.SM,QueueCTDesc"
               Overwrite="TRUE"
               Inherits="FALSE"
               Version="0">
    <FieldRefs>...


Feature2 = MeineListe1

ListTemplate Schema


<List xmlns:ows="Microsoft SharePoint" 
      Title="QueueTemplate" 
      FolderCreation="FALSE" 
      EnableContentTypes="TRUE"
      Direction="$Resources:core,Direction;" 
      Url="Lists/QueueTemplate" 
      BaseType="0" 
      Type="10101"
      xmlns="http://schemas.microsoft.com/sharepoint/">
  <MetaData>
    <ContentTypes>
      <ContentTypeRef ID="0x0100031dc26ca875430487c8b10e35c39e95">
        <Folder TargetName="QueueItem" />
      </ContentTypeRef>
      <ContentTypeRef ID="0x0120" />
    </ContentTypes>
    <Fields>....
------------------------------


ListInstance


<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <ListInstance Title="$Resources:Name.SM,QueueList_Title"
                OnQuickLaunch="FALSE"
                TemplateType="10101" 
                Url="Lists/Queues"
                Description="$Resources:Name.SM,QueueList_Desc">
  </ListInstance>

Füge ich aber einen zweiten Inhaltstyp hinzu (beim bereitstellen) z.B.: 0x01 wird aufeinmal mein Name mit angezeigt.
Diese Verhalten von SP2010 finde ich äusserst suspekt, da ich im nachhinein den Inhaltstyp "0x01 Element" nicht hinzufügen kann.

Es ist auch ein wenig verwirend wenn der 1. Inhaltstyp innerhalb der Listen immer Element heißt!

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Sept. 2010 08:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Warum das so ist, kann ich Dir nicht sagen, aber ich habe bei dieser Methode noch weitere Seltsamkeiten festgestellt. Seither füge ich die ContentTypes meist direkt als <ContentType...> der Liste hinzu (statt <ContentTypeRef...>.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 24 Sept. 2010 08:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist wirklich seltsam aber dadurch muss diese ja wieder doppelt kopieren, wobei ich das trennen wolte ;(

Ist es dann eigentlich noch möglich von diesen CT abzuleiten (über Feature und dann ContentTypeBinding)?

Meinst du mit Seltsamkeiten: das Forms des CT nicht angezeigt werden? (Inherits muss gelöscht oder auf false sein sowie EnableContentTypes=True und der CT 0x0120 muss vorhanden sein im ListTemplate)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Sept. 2010 09:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Thomas Östreich"]dadurch muss diese ja wieder doppelt kopieren[/quote]

Das stimmt leider.

[quote user="Thomas Östreich"]Ist es dann eigentlich noch möglich von diesen CT abzuleiten [/quote]

Du hast dann doch bereits einen abgeleiteten CT an der Liste hängen.

[quote user="Thomas Östreich"]Meinst du mit Seltsamkeiten: das Forms des CT nicht angezeigt werden? (Inherits muss gelöscht oder auf false sein sowie EnableContentTypes=True und der CT 0x0120 muss vorhanden sein im ListTemplate)[/quote]

Solche Dinge eben. Es gab auch noch anderes, aber ich weiß es nicht mehr alles so genau, weil ich eben irgendwann dazu überging, keine ContentTypeRef's zu verwenden. Das ist zwar etwas Mehraufwand, aber dann funktioniert wenigstens alles - zumindest hatte ich damit bis jetzt noch keine Probleme.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 24 Sept. 2010 09:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]Du hast dann doch bereits einen abgeleiteten CT an der Liste hängen.[/quote]

Daran hatte ich ja garnicht gedacht, 0x0100<Guid>01

Wenn ich dort sage Inherit true sollte er alle übergeordneten Felder übernehmen ohne das ich diese nochmal setzen muss (ich hoffe auch Forms und EventReceiver) gleich mal testen.

Wenn man so darüber redet fallen einen doch gleich noch weitere Lösungswege ein :-)

thx

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 24 Sept. 2010 11:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also habe jetzt den Bug gefunden warum der CT Name nicht korrekt übernommen wird: Entfernt man das Attribute Overwrite bzw setzt es auf false werden die Einstellungen von CT korrekt übernommen.

Beim implementieren des CT in der List ist die Vererbung nicht wirklich so wie sie sein sollte (war so auch schon bei  wss3).

Klicke ich auf den CT um zu der Instanz des CT zu kommen, komme ich auf 0x0100<Guid>0100<Guid>
Leider ist die Quelle "Leer" also nicht der Name des Parent CT enthalten

Klicke ich auf Parent welcher auch wieder korrekt drin steht komme ich auf 0x0100<Guid>?
Es Fehlt also der CT 0x0100<Guid>01
Nächster Parent: 0x01

Beim ContentTypeRef funktioniert es so

Instanz: 0x0100<Guid>00<Guid> (steht auch als Quelle der Parent drin)
Parent: 0x0100<Guid>
Parent 0x01

Wie implementierst du den CT im List Template:

  1. 0x0100<ParentGuid>01 - Parent CT + 01
  2. 0x0100<ParentGuid> - Parent CT

Inherits der FieldRefs, Forms, EventReceivers funktioniert nicht automatisch und muss alles kopiert werden.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Sept. 2010 12:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Thomas Östreich"]Wie implementierst du den CT im List Template[/quote]

Ich mache das immer so:
0x0100<ParentGuid><NewGuid>

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 24 Sept. 2010 15:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Ich mache das immer so:
0x0100<ParentGuid><NewGuid>

[/quote]

0x0100<ParentGuid>00<NewGuid>? (Laut MSDN 00 + Guid oder 01 - 99)

Ui dann macht SP ja noch eine Guid ran für die Instanz!
0x0100<ParentGuid>00<NewGuid>00<InstanzGuid> (Lang im Browser)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Sept. 2010 15:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein, die zwei Ziffern zwischen den Guids kann man weglassen. Sollte man IMHO auch damit die Vererbungshierarchie korrekt erkannt wird.

[quote user="Thomas Östreich"]dann macht SP ja noch eine Guid ran für die Instanz[/quote]

Nein, wenn man das als <ContentType> (statt <ContentTypeRef>) macht, dann bleibt die ID genau so.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 26 Sept. 2010 14:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Nein, wenn man das als <ContentType> (statt <ContentTypeRef>) macht, dann bleibt die ID genau so.

[/quote]

 

Leider nein das stimmt so nicht!

CT ID (<ContentType> über Site Feature 1 bereitgestellt):
0x0100feb3304d91654ab2a358c17a8c9b7e2c

CT ID (über List Schema <ContentType>, <List> Site Feature 2):
0x0100feb3304d91654ab2a358c17a8c9b7e2c33fa80adeb834b7d96bb68f4063a0b6e

CT ID (in der Instanz der Liste über Aufruf der UI, <ListInstance> über Site Feature 2):
0x0100FEB3304D91654AB2A358C17A8C9B7E2C33FA80ADEB834B7D96BB68F4063A0B6E00983E05B9C655C74EA34CEB2F9B8BD65A (Wurde beim Anlegen der Instanz erzeugt)

die 00 sollte man nicht weglassen:

You can construct a valid content type ID using one of two convention:

  • Parent content type ID + two hexadecimal values (the two hexadecimal values cannot be "00")
  • Parent content type ID + "00" + hexadecimal GUID

http://msdn.microsoft.com/en-us/library/aa543822.aspx 

The fact that list content types are often derived from site content types has implications for change management. One consequence is that customizations to list content types cannot easily be applied to other lists. For example, a user might edit a list content type, adding a new column. This change would be limited to the content type on the list. The new column would be added to the site content type from which the list content type derives, nor would any other changes carry over. Changes to a derived content type are never pushed up to the parent content type. 

http://msdn.microsoft.com/en-us/library/ms463016.aspx

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Sept. 2010 08:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Thomas Östreich"]die 00 sollte man nicht weglassen[/quote]

Nach meiner Erfahrung nur die am Anfang, also bei 0x0100. Du hattest oben welche zwischen den Guids 0x0100<ParentGuid>00<ChildGuid> und die hatte ich noch nie verwendet und auch noch keine Probleme damit.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 24 Sept. 2010 09:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn ich den CT + Fields als Site Scope Feature und das ListTemplate + ListInstance als Web Scope Feature bereitstelle funktioniert es korrekt, aber mit SP 2007 / WSS 3 funktioniertes es auch komplett über den Site Scope.

Was auch geht alles über den Scope Web bereitzustellen, aber das finde ich auch wieder blöd, weil es dann möglich wäre in einer SubSite das feature zu aktiveren was dann aber einen Fehler verursacht das die CTs und Fields schon vorhanden sind. 

Naja ich glaube ich gehe auch dahin den CT direkt in das ListTemplate bereitzustellen, werde das mal testen wo dort der Schuh drückt ;-)