Plugin Advanced Mod Rewrite für Contenido 4.8.x

Supporter
Beiträge: 124
Registriert: Mo 12. Mai 2008, 14:21
Wohnort: In the middle of something...
Kontaktdaten:

Beitrag von Supporter » Mi 5. Nov 2008, 22:58

Hallo xmurrix

Ich habe da ein Problem. In dem von mir verwendeten Modul Fotoalbum, wird eine Navigation der gesamten Bilder erzeugt, welche anschließend in einem iframe ausgegeben werden, soweit so gut. Doch aus irgend einem Grund, werden die URLs in der erzeugten Navigation falsch ausgegeben, denn anstatt dem Artikelnamen, wird in der URL die index_controller.php geschrieben.

Ich poste hier mal den Output von dem Modul, vielleicht kannst Du mir einen Tipp geben wie ich es anstellen kann, dass der Artikel und nicht die index_controller.php in der URL angegeben wird.

Code: Alles auswählen

<?php
/******************** editierbare variable ***************************/
$db_album = $cfg["tab"]["fotoalbum"];
$db_fotos = $cfg["tab"]["fotos"];
$upldir = "upload/galerie/";

//anzahl der angezeigten thumbnails
$fps = "14";

/*********************************************************************/
//fotoupdate
if ($Absenden = "Ändern")  {
  $sql_update = "UPDATE ".$cfg["tab"]["fotos"]." SET foto_pos='$foto_pos',foto_text='$foto_text' WHERE foto_id = '".$picture."'";
  $db->query($sql_update);
}

//galerie finden
$dbA = new DB_contenido;
$sqlA = "SELECT * from $db_album WHERE idart = ".$idart;
$dbA = mysql_query($sqlA);

if (mysql_num_rows($dbA) != 1)  {
  $fehler = "Keine Fotogalerie gefunden";
}  else  {
  $album = mysql_fetch_array($dbA);
  $album_id = $album[album_id];
  $img_dir = $upldir.$album[album_dir]."/";
  $thm_dir = $img_dir."thm/";
}
if (!$fehler)  {
  $dbF = new DB_contenido;
  $sqlF = "SELECT * from $db_fotos WHERE album_id = ".$album_id;
  $dbF->query($sqlF);
  if ($dbF->num_rows() < 1)  {
    $fehler = "Keine Fotos zu dieser Galerie gespeichert.";
  }  else  {
    $alle_fotos = $dbF->num_rows();
  }
}

if ($fehler)  {
    exit ('<p style="color:red; font-weight: bold;">'.$fehler.'</span>');
}
//##########-Navigation-###########
[color=red]$meineseite=$auth->url();[/color]
$seiten = ceil($alle_fotos / $fps);

switch ($eintrag) {      // das erste mal beim aufruf ist $eintrag undefiniert
  case "";
    $eintrag = "0";      // deswegen wertzuweisung 0
}

$max = ($eintrag + $fps);
if ($max > $alle_fotos)  {
  $last = $alle_fotos;
}  else  {
  $last = $max;
}
//##########-Output-##########
$nav1 = "<tr><td align=center colspan=2 class=thubor bgcolor=#D8DED8><strong>";
$nav2 = "<tr><td align=center colspan=2 class=thubor bgcolor=#D8DED8><strong>";
if ($max >= $fps)  {
  $nav1 .= "Fotos ".($eintrag+1)."-".($last)." von ".$alle_fotos;
  $nav2 .= 'Seite';
  $currpage = ($max / $fps);
  for ($i = 0; $i < $seiten; $i++)  {
    if (($i+1) == $currpage)  {
      $nav2 .= '</strong>&nbsp;|&nbsp;'.($i+1);
    }  else {
      $nav2 .= '</strong>&nbsp;|&nbsp;<strong><a href="'[color=red].$meineseite.[/color]'&eintrag='.(($i)*$fps).'">'.($i+1).'</a></strong>';
    }
  }//end for
  $nav2 .= '&nbsp;|';
}  else  {
  $nav1 .= "Fotos ".($eintrag+1)."-".($alle_fotos)." von ".$alle_fotos;
}

$nav1 .= "</strong></td></tr>";
$nav2 .= "</td></tr>";
//##########-HTML-Output-##########
echo '
  <table width="512"  border="0" cellspacing="0" cellpadding="0" style="padding:16px 0; margin-top:0px;">
  <tr>
    <td width="192" valign="top">

    <table width="100%"  border="0" cellspacing="16" cellpadding="0" class="fotos">
';
echo $nav1.'<tr>';
//ausgabe thumbnails
  $dbF_limited = new DB_contenido;
  $sqlF_limited = "SELECT * from $db_fotos WHERE album_id = ".$album_id." ORDER by foto_pos LIMIT ".$eintrag.",".$fps;
  $dbF_limited->query($sqlF_limited);
  $count = "0";
  while ($dbF_limited->next_record())  {
    $link = "idart=".$idart."&picture=".$dbF_limited->f("foto_id");
    if ($contenido)  {  $link .= '&contenido='.$contenido;  }
    $img = $img_dir.$dbF_limited->f("filename");
    $thumb = $thm_dir.$dbF_limited->f("filename");
    echo '<td align="center"><a href="picture.php?'.$link.'" target="hauptbild"><img border=0 vspace=3 src="'.$thumb.'"></a></td>';
    $count++;
    if ($count == 2)  {
      echo '</tr><tr>';
      $count = 0;
    }
  }
echo '</tr>'.$nav2.'
    </table>
    </td>

<td width="32">&nbsp;</td>

    <td width="320" align="right" valign="top">

<iframe style="margin-top:16px;" name="hauptbild" src="picture.php?client=1&lang=1&idcat='.$idcat.'&idart='.$idart;
  if ($contenido)  {  echo '&contenido='.$contenido;  }
  if ($picture)  {  echo '&picture='.$picture;  }
  echo '" height="274" width="320" scrolling="no" border="0" frameborder="0" style="background:#eeeeee; padding:0px; margin-top:0px;">
    </iframe>

    </td>
  </tr>
</table>
';
//##########-HTML-Output Ende-##########
?>
Ειμαστε στη μεση απο κατι...

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Mi 5. Nov 2008, 23:55

Hallo,
Supporter hat geschrieben:...aus irgend einem Grund, werden die URLs in der erzeugten Navigation falsch ausgegeben, denn anstatt dem Artikelnamen, wird in der URL die index_controller.php geschrieben...

//##########-Navigation-###########
$meineseite=$auth->url();
...
das ist ein bekanntes Problem, das im MR-Plugin bis einschließlich der Version 0.4.4 vorkam.

Der Grund liegt daran, dass $auth->url() das aktuell ausgeführte Script zurückliefert (der Wert von $PHP_SELF). Das ist normalerweise die front_content.php, aber beim installierten MR-Plugin ist das die index_controller.php.

Lange Rede kurzer Sinn, beheben kannst du das Problem, indem du am Anfang des Modulcodes folgendes einbaust:

Code: Alles auswählen

$PHP_SELF = 'front_content.php?idcat=' . $idcat;
// oder
$PHP_SELF = 'front_content.php?idart=' . $idart;
Gruß
xmurrix

Supporter
Beiträge: 124
Registriert: Mo 12. Mai 2008, 14:21
Wohnort: In the middle of something...
Kontaktdaten:

Beitrag von Supporter » Do 6. Nov 2008, 14:16

Danke xmurrix, Du bist wie immer der Beste!
Ειμαστε στη μεση απο κατι...

Sundriver
Beiträge: 41
Registriert: Mo 21. Nov 2005, 17:06
Wohnort: BB
Kontaktdaten:

Beitrag von Sundriver » Mi 12. Nov 2008, 14:31

Hallo xmurrix,

auch von mir zuerst einmal ein Riesen Dankeschön für deine unermüdliche Arbeit und die weiterentwicklung des MR Plugins. Ich habe es heute das erste mal seit Stese installiert und es hat auf Anhieb geklappt :-)
Jedoch habe ich das gleiche Problem wie jdstrike. Die URL wird, wie unten im Quote (Seite 5 im Threat) beschrieben, nicht vollständig aufgelöst. Es handelt sich hier um das Umfragemodul. Deinen Workaround wollte ich ausprobieren aber die von dir angegebene Funktion im File /conlib/local.php gibt es in der 4.8.8 nicht mehr.

System: aktuell C4.8.8 -> gestern geupdatet von C4.6.23, hier gab es absolut keine Probleme und mod_rewrite 0.4.5 nach dem Update installiert
xmurrix hat geschrieben:
jdstrike hat geschrieben:also generieren tut er das hier

Code: Alles auswählen

onclick="document.location.href='/hosting/bwv/cms/umfragen/umfrage-ergebnis.html&id=1';"
...
Normalerweise würde in $formaction etwas wie front_content.php?idcatart=123 stehen. In der url() Methode wird die URL aber schon vom Mod Rewrite Plugin umschrieben, also steht in $formaction dann sowas wie /categorie/article.html.

In der Umfrage wird später die Id der Umfrage an $formaction angehängt.

Code: Alles auswählen

$formaction."&id=".$poll["id"]
Da die URL schon in der $sess->ur() umschrieben wurde, ist die neue URL dann /categorie/article.html&id=12.

Das werde ich entsprechend anpassen müssen, bis dahin kannst du folgendes als Workaround machen:
Öffne die /conlib/local.php und deaktiviere die Funktion (ab Zeile 282)

Code: Alles auswählen

  function url($url){
    // let parent do the the job
    $url = parent::url($url);
    
    // call CEC Hook
    return CEC_Hook::execute('Contenido.Frontend.CreateURL', $url);
      
  }
...
Hast du eventuel eine andere Idee um das Problem zu fixen?

Besten Dank
cu
Sundriver

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Do 13. Nov 2008, 16:10

Hallo,
Sundriver hat geschrieben:...
Jedoch habe ich das gleiche Problem wie jdstrike. Die URL wird, wie unten im Quote (Seite 5 im Threat) beschrieben, nicht vollständig aufgelöst. Es handelt sich hier um das Umfragemodul. Deinen Workaround wollte ich ausprobieren aber die von dir angegebene Funktion im File /conlib/local.php gibt es in der 4.8.8 nicht mehr. ...
die Verwendung von $sess->url() im Umfragemodul oder auch in anderen Modulen/Plugins sollte mittlerweile kein Problem verursachen, da das Umschreiben der URL in der Funktion wieder entfernt wurde.

Was steht genau im action-Attribut des Formulars oder im onclick-Attribut des Buttons drin, wenn du MR deaktivierst?

Gruß
xmurrix

Sundriver
Beiträge: 41
Registriert: Mo 21. Nov 2005, 17:06
Wohnort: BB
Kontaktdaten:

Beitrag von Sundriver » Do 13. Nov 2008, 16:46

Hallo,

Im Attribut steht folgendes wenn MR deaktiviert ist:

Code: Alles auswählen

<input type="submit" name="task_button" class="button" value="Wählen" />
&nbsp;
<input type="button" name="option" class="button" value="Ergebnis" onclick="document.location.href='front_content.php?idcatart=206&id=8';" />
cu
Sundriver

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Do 13. Nov 2008, 23:05

Hallo nochmal,

habe soeben bei die Umfrage auf Contenido 4.8.8 mit dem MR-Plugin 0.4.5 installiert. Bei aktivierten und deaktiviertem MR-Plugin funktioniert die Umfrage tatellos. Ich kann an der Umfrage teilnehmen und mir die Ergebnisse ansehen.

Vermutlich wird etwas Anderes die Ursache bei dir sein.

Habe das Plugin von folgender URL heruntergeladen:
http://www.suther.de/contenido-modules/skom_polls.zip
(Musste nur die install.php ändern, um es den Anforderungen von Contenido 4.8.8 anzupassen)

Was für Probleme hast du genau, landest du immer auf der Fehler-/Startseite wenn das MR-Plugin aktiv ist?

Gruß
xmurrix

Sundriver
Beiträge: 41
Registriert: Mo 21. Nov 2005, 17:06
Wohnort: BB
Kontaktdaten:

Beitrag von Sundriver » Fr 14. Nov 2008, 07:31

Hi xmurrix,

Ja, ich lande immer wieder auf der Startseite wenn ich entweder abstimmen möchte oder mir die Ergebnisse anzeigen lassen möchte.
Die URL im Browser ist dann folgende:

Code: Alles auswählen

http://www.mein-server.de/umfrage/umfrageergebnis.html?id=8
Welche Änderungen in der install.php hast du denn gemacht? Eventuell macht es ja Sinn das Umfragemodul neu zu installieren, ich habe es ja wie gesagt aus einer älteren C4.6.15 später mit Upgrade auf C4.6.23 übernommen, ist somit ja auch ein etwas älteres.

Eine andere Frage habe ich jedoch auch noch, kannst du mir eventuell sagen welche Tabellen stese's MR in der C4.6.15 an der Datenbank wie geändert hat?

Ich habe ein Problem mit einem Upgrad von MR, altes C4.6.15 mit steses MR soll auf die neue C4.8.8 hoch. Ich habe ALLE alten Corefiles aus dieser Inst. raus und vor dem Update auch die alten MR eintragungen aus der /contenido/include/config.php rausgelöscht. Dann den cache und die con_code geleert und das Update auf die C4.8.8 vollzogen, alles Tadellos.

Wenn ich nun jedoch das MR 0.4.5 installieren möchte bekomme ich nach dem Start der install.php im Backend kein Install Link und auch keine Fehler angezeigt. Das MR Menü im Backend fehlt ebenfalls, jedoch funktioniert das MR auf den ersten Tests wenn ich in der /contenido/plugins/mod_rewrite/includes/config.mod_rewrite_default.php das MR manuell einschalte.

Ich vermute mal das es irgendwo in der DB noch einen Eintrag gibt der Signalisiert das das MR bereits installiert ist?? Die DB ist glaub ich hier so ziemlich das einzigste was aus der C4.6.15 übrig geblieben ist.
cu
Sundriver

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Fr 14. Nov 2008, 22:35

Hallo,
Sundriver hat geschrieben:Welche Änderungen in der install.php hast du denn gemacht? Eventuell macht es ja Sinn das Umfragemodul neu zu installieren, ich habe es ja wie gesagt aus einer älteren C4.6.15 später mit Upgrade auf C4.6.23 übernommen, ist somit ja auch ein etwas älteres.
musste am Anfag der /plugins/poll/setup.php die Zeilen

Code: Alles auswählen

$contenido_path = '../../';
if (file_exists( $contenido_path . 'includes/startup.php'))
gegen die Zeilen

Code: Alles auswählen

define("CON_FRAMEWORK", true);

$contenido_path = '../../';

include_once ($contenido_path . 'classes/class.security.php');
Contenido_Security::checkRequests();

if (file_exists( $contenido_path . 'includes/startup.php'))
ersetzen. Die Änderung ist aber nur bei einem Setup notwendig, bei einem installierten Umfrageplugin muss man da nichts machen.
Sundriver hat geschrieben:Eine andere Frage habe ich jedoch auch noch, kannst du mir eventuell sagen welche Tabellen stese's MR in der C4.6.15 an der Datenbank wie geändert hat?
Die einzige Änderung an der DB war das Hinzufügen der Spalte "urlname" in der Tabelle {prefix}_art_lang. Diese Spalte wird immer noch verwendet und ist mittlerweile in Contenido 4.8.8 integriert.
Sundriver hat geschrieben:Wenn ich nun jedoch das MR 0.4.5 installieren möchte bekomme ich nach dem Start der install.php im Backend kein Install Link und auch keine Fehler angezeigt. Das MR Menü im Backend fehlt ebenfalls, jedoch funktioniert das MR auf den ersten Tests wenn ich in der /contenido/plugins/mod_rewrite/includes/config.mod_rewrite_default.php das MR manuell einschalte.
Wenn man die install.php des Plugins aufruft, sollte das Backend mit der Anmeldemaske erscheinen. Nach erfolgreichem Login kann man das Plugin installieren. Falls du aber schom im Backend angemeldet bist, kannst den Parameter contenido einfach der install.php anhängen, also den Installer mit /contenido/plugins/mod_rewrite/install.php?contenido={deine_contenido_session_id} aufrufen. Danach sollte der Link zum Installieren des Plugins erscheinen.
Sundriver hat geschrieben:Ich vermute mal das es irgendwo in der DB noch einen Eintrag gibt der Signalisiert das das MR bereits installiert ist?? Die DB ist glaub ich hier so ziemlich das einzigste was aus der C4.6.15 übrig geblieben ist.
Wenn in der DB ein Eintrag zu einem installierten MR-Plugin existiert ({prefix}_plugins), dann bietet der Installer folgende Optionen:
1. Das schon vorhandene Plugin hat eine identische Version, dann lässt sich das Plugin deinstallieren (also nur die DB-Einträge werden entfernt)
2. Ein installiertes Plugin hat eine andere Version (egal ob größer oder kleiner), dann gibt es die Möglichkeit das neue Plugin über die vorhande drüber zu installieren.

Zum Problem mit dem Umfrageplugin:
Falls das Umfrageplugin z. B. damals modifiziert wurde, also der Sourcecode geändert wurde, könnte dies auch ein Grund sein.
Das MR-Plugin ersetzt folgende vorkommende Kombinationen der URL front_content.php:

Code: Alles auswählen

="front_content.php"
="/front_content.php"
="/front_content.php?parameter=wert..."
=".front_content.php?parameter=wert..."
=front_content.php?...
document.location.href='front_content.php'
also alle Vorkommen von front_content.php, egal ob mit Anführungszeichen (" oder ') oder ohne aber beginnend mit einem =-Zeichen, der Regex-Pattern dazu lautet

Code: Alles auswählen

/(["|\'|=])front_content\.php(.?|.+?)(["|\'|>])/i
Du kannst auch, nachdem das MR-Plugin installiert und auch aktiviert wurde, das Testscript des Plugins mal aufrufen (/cms/mr_test.php), der umschreibt alle URL zu den im Projekt vorhandenen Kategorien/Artikeln und versucht diese URLs wieder aufzulösen. Umschriebene URLs, die erfolgreich wieder aufgelöst wurden, werden grün dargestellt, ansonsten rot bei Problemen. Das Script muss in der .htaccess erstmal scharfgeschalten werden, damit es überhaupt aufrufbar ist

Code: Alles auswählen

RewriteRule ^cms/mr_test.php.*$ - [L]
Gruß
xmurrix

Sundriver
Beiträge: 41
Registriert: Mo 21. Nov 2005, 17:06
Wohnort: BB
Kontaktdaten:

Beitrag von Sundriver » Sa 15. Nov 2008, 10:29

Hi xmurrix,

das nenn ich mal einen richtig guten Support :-) Vielen Dank für deine Antwort. Das hilft mir schon sehr gut weiter.

Was die RegEx Pattern angeht sollte es ja normal ohne Probleme laufen, ich habe jedoch echt keine Ahnung ob das Modul vor meinem Einsatz im Sourcecode verändert wurde, ich selbst habe ein paar Änderungen gemacht, allerdings betreffen diese lediglich das Optische Erscheinungsbild des Moduls. Notfalls werde ich es einfach auswechseln und das neuere einbauen.
Wenn man die install.php des Plugins aufruft, sollte das Backend mit der Anmeldemaske erscheinen. Nach erfolgreichem Login kann man das Plugin installieren. Falls du aber schom im Backend angemeldet bist, kannst den Parameter contenido einfach der install.php anhängen, also den Installer mit /contenido/plugins/mod_rewrite/install.php?contenido={deine_contenido_session_id} aufrufen. Danach sollte der Link zum Installieren des Plugins erscheinen.
Ich war zu diesem Zeitpunkt nicht im Backend angemeldet, hatte auch schon den Browsercache geleert aber ohne Erfolg. Die session_id war ein gutes Stichwort, ich habe sie, wie du geschrieben hast, einfach hinten dran gehängt und schon war der Link zum Installieren vorhanden :-)

Besten Dank und ein schönes Wochenende
cu
Sundriver

Calimero
Beiträge: 60
Registriert: Do 4. Aug 2005, 13:44
Kontaktdaten:

Beitrag von Calimero » Mi 19. Nov 2008, 13:57

hallo leute,

erstmal vielen dank für das geile modul amr für 4.8.8.

ich habe nur ein problem und zwar:
nach der installation von 4.8.8 habe ich direkt das modul 0.4.5 von amr installiert. danach kam eine fehlermeldung:
Fatal error: Call to undefined function mr_debugOutput() in /usr/www/users/xxx/contenido/plugins/mod_rewrite/includes/functions.mod_rewrite.php on line 587

danach habe ich nochmal alles überprüft und die function mr_debugOutput ist nicht vorhanden.
nun habe ich testweise die funktion aus front_content_controller.php in die functions.mod_rewrite eingefügt und siehe da der fehler ist zwar weg und die links werden richtig übersetzt aber leider ändert der inhalt sich auf den jeweiligen seiten nicht.
d.h. es wir immer der inhalt des startartikels angezeigt.

kennt jemand diesen "fehler"?

vielen dank im voraus.

gruß calimero

Calimero
Beiträge: 60
Registriert: Do 4. Aug 2005, 13:44
Kontaktdaten:

Beitrag von Calimero » Mi 19. Nov 2008, 14:15

ok danke an das ganze team,

mein fehler ist behoben.
es lag tatsächlich an meinem ftp-programm. bitte benutzt nicht flash fxp sondern filezilla.
nun geht alles wie es soll.

super danke an das ganze team.

gruß

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Geänderte config.plugin.php

Beitrag von malsdgtac » Fr 21. Nov 2008, 10:18

Ich habe, wie ganz vorne beschrieben die config.plugin.php "einfach ausgetauscht" und prompt einen "Illegal Call" erhalten.

Woran kann das liegen, soll die config.plugin.php doch nicht ausgetauscht werden?
Worin liegt der Fehler der verhaften Version?

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Geänderte config.plugin.php

Beitrag von xmurrix » Fr 21. Nov 2008, 13:51

Hallo,
smac hat geschrieben:Ich habe, wie ganz vorne beschrieben die config.plugin.php "einfach ausgetauscht" und prompt einen "Illegal Call" erhalten.

Woran kann das liegen, soll die config.plugin.php doch nicht ausgetauscht werden?
Worin liegt der Fehler der verhaften Version?
ich vermute, dass die verwendete config.plugin.php mit deiner Contenido Installation nicht kompatibel ist.
Wenn am Anfang der config.plugin.php sowas wie

Code: Alles auswählen

if(!defined('CON_FRAMEWORK')) {
    die('Illegal call');
}
steht und du dann die Meldung bekommst, dann ist deine Contenido-Version kleiner als 4.8.6.

Ein anderer Grund fällt mir dazu nicht ein.

Ausgetausscht soll die config.plugin.php bei der Pluginversion 0.4.5 und die ist für Contenido 4.8.8 gedacht. Stimmen auch diese Voraussetzungen bei dir?

Gruß
xmurrix

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Beitrag von malsdgtac » Fr 21. Nov 2008, 13:57

Ja genau so. :oops:

Vielen Dank für deine Antwort. Das System ist ein Contenido 4.8.6.

Gesperrt