getFirstSliceForArticle vs Mehrsprachigkeit

Jede Art von Fehler die REDAXO betreffen.

getFirstSliceForArticle vs Mehrsprachigkeit

Beitragvon marcelfahle » 24. Sep 2005, 11:42

Aloha mal wieder!

So langsam werde ich warm mit Redaxo und bin immer noch sehr angetan. :)

Allerdings bin ich vor ein paar Tagen auf ein Problem gestoßen, wobei es
entweder sein kann, dass ich den korrekten Ablauf nicht richtig blicke, oder
es sich tatsächlich um einen Fehler im System handelt.

Here we go:

Ich möchte eine Artikelliste aus bestehenden Artikeln einer Kategorie
ausgeben. Die Artikel bestehen momentan jeweils noch aus einem einfachen
Modul.

Hier mal ein wenig Dummycode:

Code: Alles auswählen
$cat = OOCategory::getCategoryById(7);
$articles = $cat->getArticles( true);

if (is_array($articles))
{
   foreach ($articles as $article)
   {
      $slice = OOArticleSlice::getFirstSliceForArticle($article->getId());
      echo "<pre>";
      print_r($slice);
      echo "</pre>";
   }
}


So weit, so gut. Das Problem an der Geschichte allerdings ist, dass die
Methode getFirstSliceForArticle() nicht korrekt arbeitet, sobald ich mit
mehreren Sprachen unterwegs bin.
Die SQL Abfrage schnappt sich nämlich die Slices, die einer bestimmten
Artikel ID zugeordnet sind. Wenn jetzt aber mehrere Sprachen vorliegen,
unterscheiden sich die jeweiligen Artikel in diesen Sprachen nicht mehr
in ihrer ID (lediglich PID), was zur Folge hat, dass folgende IF Abfrage
in der Funktion getFirstSliceForArticle() größer als 1 ist:
Code: Alles auswählen
if ($sql->getRows() == 1) {}


Als Workaround habe ich mir die Methode getFirstSliceForArticle() wie
folgt editiert:

Code: Alles auswählen
function getFirstSliceForArticle($an_article_id) {
   $sql = new sql;
   global $REX;
   $query = <<<EOD
SELECT
   id,re_article_slice_id,value1,value2,value3,value4,value5,value6,
   value7,value8,value9,value10,file1,file2,file3,file4,file5,file6,
   file7,file8,file9,file10,link1,link2,link3,link4,link5,link6,link7,
   link8,link9,link10,php,html,article_id,modultyp_id
FROM rex_article_slice
WHERE article_id = $an_article_id AND re_article_slice_id = 0 AND clang = {$REX['CUR_CLANG']}
EOD;

USW...



Da ist jetzt quasi nur eine Erweiterung der SQL Abfrage hinzugekommen,
die auch auf die aktuelle Sprache prüft.

Falls jemand eine elegantere Lösung hat, her damit. :)
marcelfahle
 
Beiträge: 26
Registriert: 10. Sep 2005, 08:11
Wohnort: Bochum

Beitragvon marc » 6. Jul 2006, 16:00

Hallo,

genau dieses Problem ist mir auch heute über den weg gelaufen. Hatte meine einsprachige Webiste soweite fertig, mit Teaser und allem. Hab dann eine neue Sprache angelegt und zack, weg waren der Titel und die Einleitung, die ich mir über getFirstSliceForArticle geholt habe. Hab dann mal ein wenig gestet und mir ist aufgefallen, dass jeder neue Artikel, sobald er angelegt wird, auch in allen anderen Sprachen angelegt wird. Find ich eigentlich nicht ideal, aber nun denn... jedenfalls haben diese Artikel alle die gleiche id, aber eine andere clang.

Als ich diesen Thread gelesen habe, war ich natürlich begeistert, weil ich schon verzweifelte... jedoch klappt das ganze bei mir nicht so wirklich. Jetzt bin ich ratlos!

Hab in meiner class.ooarticleslice.inc.php Folgendes geändert:

Original:
Code: Alles auswählen
  function getFirstSliceForArticle($an_article_id) {
     global $REX;
     $table = '';
     $table = $REX['TABLE_PREFIX']."article_slice";
    $sql = new sql;
    $query = <<<EOD
SELECT
  id,re_article_slice_id,value1,value2,value3,value4,value5,value6,
  value7,value8,value9,value10,file1,file2,file3,file4,file5,file6,
  file7,file8,file9,file10,link1,link2,link3,link4,link5,link6,link7,
  link8,link9,link10,php,html,article_id,modultyp_id
FROM $table
WHERE article_id = $an_article_id AND re_article_slice_id = 0
EOD;
    $sql->setQuery($query);
    if ($sql->getRows() == 1) {
      return new OOArticleSlice(
              $sql->getValue("id"),$sql->getValue("re_article_slice_id"),$sql->getValue("value1"),
              $sql->getValue("value2"),$sql->getValue("value3"),$sql->getValue("value4"),
              $sql->getValue("value5"),$sql->getValue("value6"),$sql->getValue("value7"),
              $sql->getValue("value8"),$sql->getValue("value9"),$sql->getValue("value10"),
              $sql->getValue("file1"),$sql->getValue("file2"),$sql->getValue("file3"),
              $sql->getValue("file4"),$sql->getValue("file5"),$sql->getValue("file6"),
              $sql->getValue("file7"),$sql->getValue("file8"),$sql->getValue("file9"),
              $sql->getValue("file10"),$sql->getValue("link1"),$sql->getValue("link2"),
              $sql->getValue("link3"),$sql->getValue("link4"),$sql->getValue("link5"),
              $sql->getValue("link6"),$sql->getValue("link7"),$sql->getValue("link8"),
              $sql->getValue("link9"),$sql->getValue("link10"),$sql->getValue("php"),
              $sql->getValue("html"),$sql->getValue("article_id"),$sql->getValue("modultyp_id")
            );
    }
    return null;
  }


Neu (wie oben beschrieben):

Code: Alles auswählen
function getFirstSliceForArticle($an_article_id) {
   $sql = new sql;
   global $REX;
   $query = <<<EOD
SELECT
   id,re_article_slice_id,value1,value2,value3,value4,value5,value6,
   value7,value8,value9,value10,file1,file2,file3,file4,file5,file6,
   file7,file8,file9,file10,link1,link2,link3,link4,link5,link6,link7,
   link8,link9,link10,php,html,article_id,modultyp_id
FROM rex_article_slice
WHERE article_id = $an_article_id AND re_article_slice_id = 0 AND clang = {$REX['CUR_CLANG']}
EOD;
    $sql->setQuery($query);
    if ($sql->getRows() == 1) {
      return new OOArticleSlice(
              $sql->getValue("id"),$sql->getValue("re_article_slice_id"),$sql->getValue("value1"),
              $sql->getValue("value2"),$sql->getValue("value3"),$sql->getValue("value4"),
              $sql->getValue("value5"),$sql->getValue("value6"),$sql->getValue("value7"),
              $sql->getValue("value8"),$sql->getValue("value9"),$sql->getValue("value10"),
              $sql->getValue("file1"),$sql->getValue("file2"),$sql->getValue("file3"),
              $sql->getValue("file4"),$sql->getValue("file5"),$sql->getValue("file6"),
              $sql->getValue("file7"),$sql->getValue("file8"),$sql->getValue("file9"),
              $sql->getValue("file10"),$sql->getValue("link1"),$sql->getValue("link2"),
              $sql->getValue("link3"),$sql->getValue("link4"),$sql->getValue("link5"),
              $sql->getValue("link6"),$sql->getValue("link7"),$sql->getValue("link8"),
              $sql->getValue("link9"),$sql->getValue("link10"),$sql->getValue("php"),
              $sql->getValue("html"),$sql->getValue("article_id"),$sql->getValue("modultyp_id")
            );
    }
    return null;
  }


und als Resultat erhalte ich Folgendes:

Code: Alles auswählen
Fatal error: Cannot redeclare class ooarticleslice in /home/httpd/vhosts/url.de/httpdocs/ordner/redaxo/include/classes/class.article.inc.php(179) : eval()'d code on line 14


Wäre nett, wenn jemand mir hier weiterhelfen könnte. Kann ja auch sein, dass der Lösungsvorschlag oben funktioniert, ich ihn nur falsch anwende ?!?
Zuletzt geändert von marc am 4. Okt 2006, 08:23, insgesamt 1-mal geändert.
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Beitragvon marcelfahle » 6. Jul 2006, 16:12

Hmm, der Fehler sagt eigentlich was anderes. Kannst du mal die gesamte Datei posten?
marcelfahle
 
Beiträge: 26
Registriert: 10. Sep 2005, 08:11
Wohnort: Bochum

Beitragvon marcelfahle » 6. Jul 2006, 16:30

Ach so, nochwas:

Ich hab grad oben im Code gesehen, dass auf einmal geschweifte Klammern um
$REX['CUR_CLANG'] sind.
Die müssen natürlich weg (keine Ahnung, wie die dahin kommen)
marcelfahle
 
Beiträge: 26
Registriert: 10. Sep 2005, 08:11
Wohnort: Bochum

Beitragvon marc » 7. Jul 2006, 08:35

Danke schonmal für die schnelle Hilfe.

Ich denke mir ist da ein doofer Fehler unterlaufen. Hab gestern wohl im Eifer des Gefechts den Quellcode der class.ooarticleslice.inc.php in die Ausgabe meines Teasermoduls kopiert. :oops: Daher wohl auch diese komische Fehlermeldung.

Hab das jetzt mal in Ordnung gebracht und die class.ooarticleslice.inc.php so angepasst, wie oben beschrieben. Hab selbst die geschweiften Klammern entfernt um das $REX['CUR_CLANG'].

Hier der geänderte Quellcode der Datei class.ooarticleslice.inc.php beginnend bei Zeile 123:

Code: Alles auswählen
function getFirstSliceForArticle($an_article_id) {
   $sql = new sql;
   global $REX;
   $query = <<<EOD
SELECT
   id,re_article_slice_id,value1,value2,value3,value4,value5,value6,
   value7,value8,value9,value10,file1,file2,file3,file4,file5,file6,
   file7,file8,file9,file10,link1,link2,link3,link4,link5,link6,link7,
   link8,link9,link10,php,html,article_id,modultyp_id
FROM rex_article_slice
WHERE article_id = $an_article_id AND re_article_slice_id = 0 AND clang = $REX['CUR_CLANG']
EOD;
    $sql->setQuery($query);
    if ($sql->getRows() == 1) {
      return new OOArticleSlice(
              $sql->getValue("id"),$sql->getValue("re_article_slice_id"),$sql->getValue("value1"),
              $sql->getValue("value2"),$sql->getValue("value3"),$sql->getValue("value4"),
              $sql->getValue("value5"),$sql->getValue("value6"),$sql->getValue("value7"),
              $sql->getValue("value8"),$sql->getValue("value9"),$sql->getValue("value10"),
              $sql->getValue("file1"),$sql->getValue("file2"),$sql->getValue("file3"),
              $sql->getValue("file4"),$sql->getValue("file5"),$sql->getValue("file6"),
              $sql->getValue("file7"),$sql->getValue("file8"),$sql->getValue("file9"),
              $sql->getValue("file10"),$sql->getValue("link1"),$sql->getValue("link2"),
              $sql->getValue("link3"),$sql->getValue("link4"),$sql->getValue("link5"),
              $sql->getValue("link6"),$sql->getValue("link7"),$sql->getValue("link8"),
              $sql->getValue("link9"),$sql->getValue("link10"),$sql->getValue("php"),
              $sql->getValue("html"),$sql->getValue("article_id"),$sql->getValue("modultyp_id")
            );
    }
    return null;
  }



Jetzt erscheint wieder die ursprüngliche Fehlermeldung:

Anfang der Seite

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in /home/httpd/vhosts/url.de/httpdocs/ordner/redaxo/include/classes/class.ooarticleslice.inc.php on line 124


An der Stelle, in der das Teasermodul erscheinen sollte:

Fatal error: Undefined class name 'ooarticleslice' in /home/httpd/vhosts/url.de/httpdocs/ordner/redaxo/include/classes/class.article.inc.php(179) : eval()'d code on line 118


Das ganze auf folgender Website: http://www.url.de/ordner/index.php?article_id=6&clang=3

EDIT by tab: Übersichtshalber sollte hier nicht komplett der Code gepostet werden. Es reichen Änderungen mit Zeilenangaben.
Zuletzt geändert von marc am 4. Okt 2006, 08:24, insgesamt 1-mal geändert.
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Beitragvon marc » 7. Jul 2006, 09:16

In folgendem Thread wird die gleiche Problematik besprochen: http://forum.redaxo.de/ftopic2199.html&highlight=artikel+sprache

Die Zuweisung der Sprache in der Teaser-Ausgabe sollte das Problem beheben:

Code: Alles auswählen
if ($ooarticle->isOnline(true)) {
  $articleId = $ooarticle->getId();

  $article = new article();
  $article->setArticleId( $articleId);
  $article->setCLang($REX['CUR_CLANG']);


Leider klappt das auch nicht :? :cry:
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Beitragvon marcelfahle » 7. Jul 2006, 09:20

heyho, das mit den geschweiften Klammern nehme ich zurück.. ist doch heredoc syntax.. *klatsch*
Ansonsten ist die Nummer eigentlich mit meiner Version identisch.. Probier bitte nochmal und sag bescheid..
marcelfahle
 
Beiträge: 26
Registriert: 10. Sep 2005, 08:11
Wohnort: Bochum

Beitragvon marc » 7. Jul 2006, 09:38

Habs nochmal probiert. Fehlermeldungen sind immer noch da. Der einzige Unterschied ist, dass mit den geschweiften Klammern, die erste Fehlermeldung nicht mehr auf Linie 124 ist, sondern nun auf 154.

Sehr komisch diese ganze Sache.
Zuletzt geändert von marc am 10. Jul 2006, 10:18, insgesamt 1-mal geändert.
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Beitragvon marcelfahle » 7. Jul 2006, 09:40

hmm, in der zeile ist bei mir ein kommentar.. schick mir die datei mal bitte an die adresse an die du gestern schon die mail geschickt hattest.
marcelfahle
 
Beiträge: 26
Registriert: 10. Sep 2005, 08:11
Wohnort: Bochum

Beitragvon marc » 7. Jul 2006, 09:52

gerade verschickt...
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Beitragvon Markus.Staab » 10. Jul 2006, 12:10

Hi,

die Änderungen sind jetzt im CVS.

Gruß,
Markus
Benutzeravatar
Markus.Staab
Entwickler
 
Beiträge: 9781
Registriert: 29. Jan 2005, 14:50
Wohnort: Aschaffenburg/Germany

Beitragvon marcelfahle » 10. Jul 2006, 12:30

Fein!

Bin schon total horny auf euer nächstes Backend-Update.
Ich bin überzeugt das wird wieder ein Knaller :)
marcelfahle
 
Beiträge: 26
Registriert: 10. Sep 2005, 08:11
Wohnort: Bochum

Beitragvon marc » 27. Jul 2006, 15:45

Hab mir eben mal die neue Version aus dem CVS geholt und leider funzt es immer noch nicht.

Es kommt wieder die gleiche Fehlermelung:

Ganz am Anfang der Seite:

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in /home/httpd/vhosts/url.de/httpdocs/ordner/redaxo/include/classes/class.ooarticleslice.inc.php on line 110

dann an der Stelle wo das Teasermodul erscheinen sollte:

Fatal error: Undefined class name 'ooarticleslice' in /home/httpd/vhosts/url.de/httpdocs/ordner/redaxo/include/classes/class.article.inc.php(179) : eval()'d code on line 118

Quasi genau der gleiche Fehler wie vorher schon. Es scheint also in meinem Fall nichts zu nützen die clang in class.ooarticleslice.inc.php nachzufragen. Irgendwie will Redaxo wohl nicht...

Hab mich ja schon öfters mal mit marcelfahle in Verbindung gesetzt und bei ihm läuft alles tiptop, nur bei mir will's absolut nicht :-(

Woran kann's liegen?
Zuletzt geändert von marc am 4. Okt 2006, 08:25, insgesamt 1-mal geändert.
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Beitragvon Markus.Staab » 27. Jul 2006, 16:46

Hi,

marc hat geschrieben:Hab mir eben mal die neue Version aus dem CVS geholt und leider funzt es immer noch nicht.


ich hab den ganzen Tag schon Probleme mit dem CVS.. kann sein, dass du gar nicht die neuste Version bekommen hast...?

Gruß,
Markus
Benutzeravatar
Markus.Staab
Entwickler
 
Beiträge: 9781
Registriert: 29. Jan 2005, 14:50
Wohnort: Aschaffenburg/Germany

Beitragvon marc » 28. Jul 2006, 12:03

Ok, also irgendwas läuft mächtig schief mit dem getFirstSliceForArticle ().

Ich versuchs mal zu erklären:
Ich habe eine 2-sprachige Website (de und eng).

Bild

Auf der Willkommenseite befindet sich ein simples Teaser-Modul, das die Slices der 2 Artikel der Kategorie 42 auslesen soll:

Code: Alles auswählen
Ausgabe:

<?php
$cat = OOCategory::getCategoryById(42);
$articles = $cat->getArticles( true);

if (is_array($articles))
{
   foreach ($articles as $article)
   {
      $slice = OOArticleSlice::getFirstSliceForArticle($article->getId());
      echo "<pre>";
      print_r($slice);
      echo "</pre>";
   }
}

?>

Wenn ich jetzt in Neues 1 und Neues 2 jeweils mein newsmodul einfüge, wird das auch super auf der Willkommenseite ausgegeben.

Code: Alles auswählen
Eingabe:
<strong>Titel</strong>:<br />
<input type="text" size="50" name="VALUE[1]" value="REX_VALUE[1]" />
<br />
<strong>Einleitung</strong>:<br />
<textarea name="VALUE[2]" cols="80" rows="5" class="inp100">REX_HTML_VALUE[2]</textarea>
<br />
<strong>Text</strong>:<br />
<textarea name="VALUE[3]" cols="80" rows="5" class="inp100">REX_HTML_VALUE[3]</textarea>
<br />

Ausgabe:
<div class="titel">REX_VALUE[1]</div>
<div class="einleitung">
<?
//   Fliesstext
$input =<<< EOT
REX_HTML_VALUE[2]
EOT;
$textile = new Textile;
$text = "";
if ("REX_VALUE[2]" != "") $text = $textile->TextileThis($input);
$text = str_replace("###","&#x20;",$text);
print $text;
?>
</div>

<div class="text">
<?
//   Fliesstext
$input =<<< EOT
REX_HTML_VALUE[3]
EOT;
$textile = new Textile;
$text = "";
if ("REX_VALUE[3]" != "") $text = $textile->TextileThis($input);
$text = str_replace("###","&#x20;",$text);
print $text;
?>
</div>




Bis hier läuft alles wunderbar. Ich kann also die jeweiligen Werte der Slices aller Artikel der Kategorie 42 auslesen. Bisher ist die Website nur einsprachig! So weit so gut.

Jetzt zum Problem:
Wenn ich jetzt auf der Welcome-Seite das teaser-modul einbaue, gibt es mir die Slices der deutschen Artikel aus. Das ist schonmal nicht normal (1. Fehler). Ich habe allerdings auch noch kein Newsmodul in die englischen Artikel eingefügt. Tue ich dies, dann verschwinden auf der Willkommen und auf der Welcome Seite die Teasereinträge. (2. Fehler)

Schlussfolgerung:
Wenn ein Artikel in de & eng ein Modul enthält, wird auf der im teasermodul NICHTS ausgegeben.
Wenn ein Artikel entweder in de oder eng ein Modul enthält, wird in den teasermodulen beider sprachen nur die ausgefüllte Sprache ausgegeben.

also läuft irgendwas schief!

Eigentlich sollte ja dieser Thread die Lösung des Problems dank der abgeänderten class.ooarticleslice.inc.php aus dem CVS bringen, aber das scheint nicht zu funktionieren.

Könntet ihr das bitte mal auf euren Servern testen und mir das Resultat mitteilen. Solange ich dieses Problem nämlich nicht gelöst habe, kann ich auch keine weiteren Module entwickeln, das sie alle auf Slices&Mehrsprachigkeit basieren.

Verzweifle mittlerweile hier :?
marc
 
Beiträge: 76
Registriert: 10. Mai 2006, 11:12
Wohnort: Lux

Nächste

Zurück zu Bugs [R3]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast