Artikelkonfiguration von Sprache A überschreibt Sprache B

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
bodil
Beiträge: 340
Registriert: Fr 7. Okt 2011, 04:10
Kontaktdaten:

Artikelkonfiguration von Sprache A überschreibt Sprache B

Beitrag von bodil » So 1. Mär 2015, 09:09

Hallo zusammen.
Ich arbeite an einer zweisprachigen (Deutsch/Englisch) Seite. Hierfür habe ich mehrere selbstgebaute Module im Einsatz. Die deutschen Seiten habe ich durch Synchronisation der englischen Seiten erstellt. Ändere ich jetzt in meinen Modulen in der deutschen Sprachversion einen Eintrag in der Artikelkonfiguration, erscheint diese Änderung auch in der Konfiguration des eglischsprachigen Artikels. Und umgekehrt. Ist das ein Bug? Oder ein neues Feature?
Die Daten für Variablenname und -wert stelle ich im Modulcode (Inputbereich) beispielsweise wie folgt zur Verfügung:

Code: Alles auswählen

$var3 = "CMS_VAR[3]";
$val3 = "CMS_VALUE[3]";
Hat jemand ne Idee?
Vielen Dank und schöne Grüße!
Bodil

bodil
Beiträge: 340
Registriert: Fr 7. Okt 2011, 04:10
Kontaktdaten:

Re: Artikelkonfiguration von Sprache A überschreibt Sprache

Beitrag von bodil » Mo 2. Mär 2015, 07:00

Ich habe das mal genauer untersucht:
  • • Einen Artikel auf deutsch erstellt.
    • Konfiguriert.
    • In der englischen Sprachvariante synchronisiert
    • Im englischen Artikel die Konfiguration des deutschen Artikels vorgefunden.
    • Geändert.
    • In der deutschen Version wurde dadurch die Konfiguartion auch geändert.
Das Problem ist, dass der deutsche und der englische Eintrag in der con_art_lang zu einem Artikel (idart) den selben Wert für idtplcfg haben. Es entsteht zwar auch ein neuer Eintrag in der con_container_conf, in dem die Konfigurationsdaten des Originaltitels stehen, auf den wird aber nicht zugriffen. Der Bug besteht also darin, dass beim Synchronisieren des Artikels der Eintrag in der con_art_lang nicht richtig gesetzt wird. Der Wert für idtplcfg wird vom Originaleintrag kopiert, statt ihn auf den neuen Eintrag in der con_container_conf verweisen zu lassen.
Das Problem klingt diesem hier sehr ähnlich:
http://forum.contenido.org/viewtopic.php?f=92&t=35185

Mein Workaround:
Da der Kunde absehbar keine weiteren Artikel anlegen wird, die für unterschiedliche Sprachen eine unterschiedliche Konfiguration benötigen, habe ich für die relevanten Artikel die idtplcfg-Einträge in der con_art_lang von Hand korrigiert.

Der Vollständigkeit halber hier noch ein paar Informationen zum System, auf dem das beschriebenen Problem läuft:

Installierte Versionen
CONTENIDO Version 4.9.4
Webserver-Version Apache
Installierte PHP-Version 5.4.37
Datenbankserver-Version 5.5.42-cll
PHP-Datenbankerweiterung mysqli

scrulle
Beiträge: 1
Registriert: Mi 15. Jun 2016, 13:25
Kontaktdaten:

Re: Artikelkonfiguration von Sprache A überschreibt Sprache

Beitrag von scrulle » Mi 15. Jun 2016, 13:39

Hallo allerseits.

Dieses Problem existiert in der Release 4.9.9 immer noch! :(

Auch in dem Post viewtopic.php?f=92&t=35185 wurde das Problem bislang nicht gelöst, oder zumindest habe ich keine Lösung gefunden.
Ich habe mich dann an das Workaround von bodil (Danke für den Hinweis, das man das einfach so machen kann) orientiert und die idtplcfg von Hand korrigiert.

Vielleicht war jemand Anderes bei der Lösung oder der Suche nach der Lösung des Problems erfolgreicher, dann wäre es schön, wenn man daran teilhaben dürfte.

Liebe Grüße
scrulle

Installierte Versionen
CONTENIDO Version 4.9.9
Webserver-Version Apache
Installierte PHP-Version 5.6.22
Datenbankserver-Version 5.1.73-log
PHP-Datenbankerweiterung mysqli

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Artikelkonfiguration von Sprache A überschreibt Sprache

Beitrag von Oldperl » Do 16. Jun 2016, 13:19

Servus,

also ich kann den Bug bestätigen. Der Bug lässt sich allerdings relativ einfach beheben.
Öffne die Datei includes/functions.con.php und suche folgende Quelltext-Zeilen der Funktion conSyncArticle (Zeile 1536 ff in 4.9.9)

Code: Alles auswählen

if ($srcArtLang->get('idtplcfg') != 0) {
        $newidtplcfg = tplcfgDuplicate($srcArtLang->get('idtplcfg'));
    } else {
        $newidtplcfg = 0;
    }

    // Create an article language entry for destination language
    $artLangColl = new cApiArticleLanguageCollection();
    $fieldsToOverwrite = array(
        'idart' => $idart,
        'idlang' => $dstlang,
        'artspec' => 0,
        'online' => 0,
        'created' => date('Y-m-d H:i:s'),
        'lastmodified' => date('Y-m-d H:i:s'),
        'modifiedby' => $auth->auth['uname'],
        'published' => '',
        'publishedby' => '',
        'timemgmt' => 0,
        'datestart' => '',
        'dateend' => '',
        'status' => 0,
        'time_move_cat' => 0,
        'time_target_cat' => 0,
        'time_online_move' => 0,
        'free_use_01' => '',
        'free_use_02' => '',
        'free_use_03' => ''
    );
    $artLang = $artLangColl->copyItem($srcArtLang, $fieldsToOverwrite);
    if (!is_object($artLang)) {
        return;
    }
hier wird der Eintrag in con_art_lang kopiert, wobei im Array $fieldsToOverwrite die zu ändernden Felder des neuen Eintrages übergeben werden. Dabei wird, wie schon richtig hier im Thread bemerkt, vergessen die 'idtplcfg' der neuen Template-Konfiguration anzugeben, die kurz davor bereits kopiert wurde und in der Variablen $newidtplcfg gespeichert ist.
Folgende Änderung, die das Array entsprechend ergänzt, fixt daher diesen Bug

Code: Alles auswählen

if ($srcArtLang->get('idtplcfg') != 0) {
        $newidtplcfg = tplcfgDuplicate($srcArtLang->get('idtplcfg'));
    } else {
        $newidtplcfg = 0;
    }

    // Create an article language entry for destination language
    $artLangColl = new cApiArticleLanguageCollection();
    $fieldsToOverwrite = array(
        'idart' => $idart,
        'idlang' => $dstlang,
        'idtplcfg' => $newidtplcfg,
        'artspec' => 0,
        'online' => 0,
        'created' => date('Y-m-d H:i:s'),
        'lastmodified' => date('Y-m-d H:i:s'),
        'modifiedby' => $auth->auth['uname'],
        'published' => '',
        'publishedby' => '',
        'timemgmt' => 0,
        'datestart' => '',
        'dateend' => '',
        'status' => 0,
        'time_move_cat' => 0,
        'time_target_cat' => 0,
        'time_online_move' => 0,
        'free_use_01' => '',
        'free_use_02' => '',
        'free_use_03' => ''
    );
    $artLang = $artLangColl->copyItem($srcArtLang, $fieldsToOverwrite);
    if (!is_object($artLang)) {
        return;
    }
Generell sollte man sich aber gerade in den Bereichen Sync und Copy auch mal Gedanken machen ob man, nach Prüfung der vorhandenen DB-Tabellen, nicht für InnoDB auf Transaktionen setzen möchte und das entsprechend im DB-Treiber, hier evtl. in der genericDB, abbildet, falls diese Tabellen eingesetzt werden.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Antworten