Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Mo 26. Jun 2017, 11:16

Hallo,

wir haben seit langen ein Modul bei den 4.8er Versionen im Einsatz, dass ich gerne bei 4.9 nutzen würde, bekomme es aber nicht zum laufen.

Ursprung war mal ein Teil von "Vererbung". Ziel war nicht etwas zu vererben, sondern im Backend soviele Felder zu erzeugen wie in der Konfig eines Artikels eingetragen werden.
Beispiel: in Einem Slider gibt es pro Sliderelement: ein Bild, eine Headline, einen Text. In der Konfig gebe ich ein ich möchte 3 Slider Elemente, dann sehe ich im Backend 3 Boxen mit jeweils Bild, Headline und Text.
Das Ganze bot ziemlich viele Möglichkeiten, da man mit entsprechenden Javascripte auch Tabs usw. ausgeben konnte usw..

anbei nun der Code aus dem Modul (Beispielhaft). Hier habe ich schon Teile ersetzt (https://www.contenido.org/deutsch/techn ... lyser.html)
Input:

Code: Alles auswählen

?>
<table>
    <tr>
        <td>Anzahl Slider</td>
        <td><input type="text" name="<?php echo "CMS_VAR[0]"; ?>" value="<?php echo "CMS_VALUE[0]"; ?>" style="width: 30px;" /></td>
    </tr>
</table>
<?php
Output:

Code: Alles auswählen

<?php
if ($edit) {
echo '<style>
.camera_wrap {display:block;}
.sliderbackend1{height:400px; width:300px; margin-right:10px; float:left;margin-bottom:15px;}
</style>';
} else {

}

if ($edit) {
	
echo'<div class="fluid_container" style="z-index:9; width:1100px; margin:0px auto;padding-top:150px;">';
echo'<div class="camera_wrap" id="slider">';
} else {
echo'<div class="fluid_container">';
echo'<div class="camera_wrap" id="slider">';
}

cInclude("frontend", "includes/class.vererbung.php");
    $Anzahl = intval("CMS_VALUE[0]");
    $vererbung = new Vererbung();
    for ($i = 0; $i < $Anzahl; $i ++) {
        if ($edit) {

echo '<div class="sliderbackend1" style="font-size:15px; background-color:#f4f4f4; padding:5px; float:left; position:relative; left: 0px; top:0px;">';   
	    echo '<div style="position: absolute;">' . $vererbung->Vererbe(($i + 100), 'CMS_IMGDESCR') . '</div>';
	    echo '<div style="position: absolute;">' . $vererbung->Vererbe(($i + 100), 'CMS_IMGEDITOR') . '</div>';
            echo '<img src="' . strip_tags($vererbung->Vererbe(($i + 100), 'CMS_IMG')) . '" alt="" border="0" width="150px" /><br />';
            echo $vererbung->Vererbe(($i + 100), 'CMS_HTMLHEAD') . ' ';
            echo $vererbung->Vererbe(($i + 100), 'CMS_HTML') . ' ';
            echo "<br />";
echo '</div>';         

        } else {
       
            echo '<div data-src="' . $vererbung->Vererbe(($i + 100), 'CMS_IMG') . '">';
            echo '<div class="camera_caption moveFromBottom">';
            echo '<span class="center_helper"></span>';
            echo '<span class="center_content">';
            echo '<div class="head"><h1>' . $vererbung->Vererbe(($i + 100), 'CMS_HTMLHEAD') . '</h1></div>';
            echo '<div class="text">' . $vererbung->Vererbe(($i + 100), 'CMS_HTML') . '</div>';
            echo '</span>';
            echo '</div>';
            echo '</div>';
            
      
        }
}
echo'</div></div>';

if ($edit) {
echo '<div style="clear:both;"></div>';
} else {
echo '';
}

?>

Includiert wird dann nich die class.vererbung.php deren Code jetzt folgt. Auch hier habe ich schon Teile ersetzt (mit dem Code Analyzer):

Code: Alles auswählen

<?php
class Vererbung {
    
    function __construct() { }
    
    function Vererbe($field = 0, $type = 'CMS_HTML') {
        global $sess, $db, $cfg, $idcat, $idart, $client, $lang, $sitKeineVererbung, $edit;
        
        cInclude('classes', 'class.article.php');
	#cInclude('classes', 'class.article.collector.php');
        
        $type = strtoupper($type);
        if (substr($type, 0, 4) != 'CMS_') {
            $type = 'CMS_' . $type;
        }
        
        $tmp = '';
        
        $article = new cApiArticleLanguage($idart, $client, $lang);
        
        # Zuerst die Vererbung setzen
        if ((isset($_GET['sitVererbungType'])) && ($_GET['sitVererbungType'] == $type) && (isset($_GET['sitVererbungField'])) && ($_GET['sitVererbungField'] == $field)) {
            $status = $_GET['sitVererbungValue'];
            $sql = 'INSERT INTO `' . $cfg["tab"]["art_lang"] . '_vererbung` (`idartlang`, `index`, `type`, `status`)
                    VALUES (' . $article->getField('idartlang') . ', ' . $field . ', "' . $type . '", ' . $status . ')
                    ON DUPLICATE KEY UPDATE `status` = ' . $status . ';';
            $db->query($sql);
        }
        
        # Vererbung fuer dieses Feld ausgeschaltet?
        $sql = 'SELECT `status`
                FROM `' . $cfg["tab"]["art_lang"] . '_vererbung`
                WHERE ((`idartlang`=' . $article->getField('idartlang') . ')
                   AND (`index`=' . $field . ')
                   AND ((`type`="' . $type . '")
                     OR (`type`="' . $type . 'DESCR")
                     OR (`type`="' . $type . 'EDIT")))';
        if (!$db->query($sql)) {
            # Alte Version der Tabelle vorhanden?
            $sql = 'ALTER TABLE ' . $cfg["tab"]["art_lang"] . '_vererbung
                    ADD `type` VARCHAR(20) NOT NULL DEFAULT "CMS_HTML" AFTER `index`';
            if (!$db->query($sql)) {
                # Erster Aufruf der Klasse, also Tabelle anlegen
                $sql = 'CREATE TABLE IF NOT EXISTS `' . $cfg["tab"]["art_lang"] . '_vererbung` (
                            `idartlang` int(10) NOT NULL DEFAULT 0,
                            `index` int(10) NOT NULL DEFAULT 0,
                            `type` varchar(20) NOT NULL DEFAULT "CMS_HTML",
                            `status` tinyint(1) NOT NULL DEFAULT 0,
                            PRIMARY KEY (`idartlang`, `index`, `type`)
                        ) ENGINE=MyISAM;';
                $db->query($sql);
                $sitKeineVererbung[$type][$field] = 1;
            } else {
                $sql = 'ALTER TABLE `' . $cfg["tab"]["art_lang"] . '_vererbung` DROP PRIMARY KEY,
                        ADD PRIMARY KEY (`idartlang`, `index`, `type`)';
                $db->query($sql);
                $sql = 'SELECT `status`
                        FROM `' . $cfg["tab"]["art_lang"] . '_vererbung`
                        WHERE ((`idartlang`=' . $article->getField('idartlang') . ') AND
                               (`index`=' . $field . ') AND
                               (`type`="' . $type . '"));';
                $db->query($sql);
                $db->nextRecord();
                $sitKeineVererbung[$type][$field] = ((($db->f('status') == null) || ($db->f('status') == 1)) ? 1 : 0);
            }
        } else {
            if ($db->nextRecord()) {
                $sitKeineVererbung[$type][$field] = (($db->f('status') == 1) ? 1 : 0);
            } else {
                $sitKeineVererbung[$type][$field] = 1;
            }
        }
        
        # Dann den Feldinhalt holen
        $content = $article->getContent($type, $field);
        $a_content[$type][$field] = $content;
        if ((strlen($content)) && ($content != "0")) {
            # Eigener Content, also (nur) diesen zeigen
        } else {
            $pid = $idcat;
            
            while (($pid != 0) && (!$sitKeineVererbung[$type][$field])) {
                $sql = 'SELECT c.parentid, al.idart
                        FROM ' . $cfg["tab"]["cat"] . ' AS c INNER JOIN ' . $cfg["tab"]["cat_lang"] . ' AS cl ON c.idcat = cl.idcat INNER JOIN ' . $cfg["tab"]["art_lang"] . ' AS al ON cl.startidartlang = al.idartlang
                        WHERE ((c.idclient=' . $client . ')
                           AND (cl.idlang=' . $lang . ')
                           AND (c.idcat=' . $pid . '))';
                $db->query($sql);
                $db->nextRecord();
                $article = new cApiArticleLanguage($db->f('idart'), $client, $lang);
                $content = $article->getContent($type, $field);
                if ((strlen($content)) && ($content != "0")) {
                    # Vererbter Content, diesen zuerst zeigen
                    $edit_orig = $edit;
                    $edit = false;
                    $tmp .= $this->Field($db->f('idart'), $field, $type);
                    $edit = $edit_orig;
                    break;
                } else {
                    $pid = $db->f('parentid');
                }
            }
        }
        $tmp .= $this->Field($idart, $field, $type);
        if ($edit) {
            $tmp .= $this->showLink($field, $type);
        }
        return $tmp;
    }
    
    function Field($idart, $index, $type) {
        global $db;
        global $client;
        global $lang;
        global $cfg;
        global $cfgClient;
        global $area_tree;
        global $sess;
        global $perm;
        global $area_rights;
        global $item_rights;
        global $_SESSION;
        global $remakeCatTable;
        global $remakeStrTable;
        global $auth;
        global $tpl;
        global $edit;
        global $a_content;
        global $idartlang;
        global $idcat;
        
        $tmp = '';
        $val = $index;
        # Den Code fuer das Feld laden
        $sql = 'SELECT *
                FROM ' . $cfg["tab"]["type"] . '
                WHERE (type="' . $type . '")';
        $db->query($sql);
        if ($db->nextRecord()) {
            $code = $db->f('code');
            if (!$edit) {
                $new_code = '$article = new Article($idart, $client, $lang); $tmp = urldecode($article->getContent($type, $index));';
                $code = str_replace('$tmp = urldecode($a_content["' . $type . '"][$val]);', $new_code, $code);
                $code = str_replace('$tmp = urldecode($a_content[\'' . $type . '\'][$val]);', $new_code, $code);
                $new_code = '$article = new Article($idart, $client, $lang); $tmp = $article->getContent($type, $index);';
                $code = str_replace('$tmp = $a_content["' . $type . '"][$val];', $new_code, $code);
                $code = str_replace('$tmp = $a_content[\'' . $type . '\'][$val];', $new_code, $code);
            }
            eval($code);
            $tmp = str_replace('\\\\\\', '', $tmp);
            $tmp = str_replace("\'", "'", $tmp);
            $tmp = str_replace('border="0" /', 'border="0" style="margin-right: 2px;" /', $tmp);
        }
        return $tmp;
    }
    
    function showLink($field = 0, $type = 'CMS_HTML') {
        global $sess, $idart, $contenido, $sitKeineVererbung;
        
        return '<a class="CMS_VERERBUNG_SWITCH" href="' . $sess->url('front_content.php?idart=' . $idart . '&edit=1&contenido=' . $contenido . '&sitVererbungType=' . $type . '&sitVererbungField=' . $field . '&sitVererbungValue=' . (($sitKeineVererbung[$type][$field] == 1) ? '0' : '1')) . '" title="Vererbung an/aus"><img src="images/but_vererbung_' . (($sitKeineVererbung[$type][$field] == 1) ? 'aus' : 'an') . '.gif" alt="" style="margin-right: 2px; border: 0px none;" /></a>';
    }
}
?>
Am Anfang gibt es da ein cInclude der class.article.php, die in der 4.9 nicht existiert (mit dem Code Analyzer angepasste Version aus 4.8 reinkopiert habe ich schon gestestet, funktioniert aber nicht). An der Stelle ein cInclude von class.article.collector.php brachte auch nichts.

Meine Kenntnisse sind leider nicht ausreichend um hier noch durchzublicken. Veilleicht kann jemand helfen. Oder die Funktion der Elemente die sich ab 100 um 1 erhöhen (aus der php-Datei) gleich ins Modul zu implementieren.

VieleN Dank
lunsen_de

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von homtata » Mo 26. Jun 2017, 18:48

new Article
gibt's nicht... Eher

Code: Alles auswählen

new cApiArticle
....

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Di 27. Jun 2017, 08:37

Hallo,

habe ich geändert, aber ohne Erfolg.

mirt scheint, dass ab folgender Stelle Nichts generiert wird: Output Zeile 27

Code: Alles auswählen

...
echo '<div style="position: absolute;">' . $vererbung->Vererbe(($i + 100), 'CMS_IMGDESCR') . '</div>';
....
Das Div geht noch auf, dann $vererbung passiert Nichts.
Kann jemand helfen?

Gruß lunsen_de

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von homtata » Di 27. Jun 2017, 09:38

In 4.9 sind so gut wie alle Klassen über den Preloader schon eingebunden. Bitte entferne den cInclude für class.article.php. Ist eine Datei über cInclude nicht auffindbar, bricht das Skript ab. Danach weiter debuggen ;-)

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Di 27. Jun 2017, 10:52

Hallo, hat mich leider nicht weitergebracht.

Gruß lunsen_de

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von homtata » Di 27. Jun 2017, 11:17

Dann behalte doch bitte mal das errorlog im Blick oder gib Zeile für Zeile in der Klasse Vererbung per echo Befehle aus oder sonst irgendwas, damit du siehst, WO es genau hängen bleibt. Das musst du bitte schon soweit selbst erledigen, damit wir weiter mit dir suchen können ;-)
cApiArticleLanguage() wird wohl auch anders geladen als über die drei Parameter, so wie du sie angibst, schaust du hier:
https://api.contenido.org/latest/class- ... guage.html
Oftmal haben sich nicht nur die Klassennamen, sondern auch die Instanzierungen geändert. Meist ist es ratsamer, das Objekt erstmal zu instanzieren, also:

Code: Alles auswählen

$article = new cApiArticleLanguage();
und es dann zu laden:

Code: Alles auswählen

$article->loadByMany(irgendwasDieDokuSagts);

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Di 27. Jun 2017, 11:34

Hallo, ich muss zu meiner Schande gestehen, dass meine Kenntnisse doch klein sind und ich meist nicht weiß was du meinst (will es aber gerne lernen).

Was muss ich denn wo dafür tun, damit:
...gib Zeile für Zeile in der Klasse Vererbung per echo Befehle aus....
Danke.

Gruß lunsen_de

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von homtata » Di 27. Jun 2017, 12:07

also, die class Vererbung wird ja abgearbeitet, nach und nach, Zeile für Zeile. Und irgendwo hakts und das Skript bricht ab, bis dorthin läufts aber.
Solange es funktioniert, werden print/echo-Befehle abgearbeitet. Das nutzt du, um zu prüfen, ob vor oder nach einer Codezeile das Skript noch funzt.

Bsp:

Code: Alles auswählen

    function Vererbe($field = 0, $type = 'CMS_HTML') {
        global $sess, $db, $cfg, $idcat, $idart, $client, $lang, $sitKeineVererbung, $edit;
        print "yes";
        cInclude('classes', 'class.article.php');
	#cInclude('classes', 'class.article.collector.php');
Wird bei Aufruf von $article->Vererbe(Parameter) dann "yes" angezeigt im Browser oder nicht? Falls nein, hakts schon vorher. Entweder in DER function oder im construct-Teil.
Falls was ankommt, kannst du dir auch Variablen in den Funktionen mal ausgeben lassen, um zu sehen, ob da überhaupt was drinsteht, was Sinn macht oder ob die leer sind.
So kannst du das Schritt für Schritt eingrenzen und die print/echo-Befehle dann wieder auskommentieren.

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Di 27. Jun 2017, 14:26

Hallo, danke für die Info.

Ich habe das mit dem yes in den Funktionen getestet. Es wurde immer ein yes ausgegeben. Ein echo im Modul wird auch ausgegeben.

Problem ist, das im Backend mit:

echo $vererbung->Vererbe(($i + 100), 'CMS_HTMLHEAD') . ' ';

kein Headline feld mit der id 101 generiert wird.

Heisst das, dass die Funktion $vererbung keinen Dienst tut?

Gruß lunsen_de

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von homtata » Di 27. Jun 2017, 17:37

Heißt das, dass die anderen CMS-Typen funktionieren mit der Funktion/Klasse oder nur DIESER CMS_HTMLHEAD nicht?

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von Faar » Mi 28. Jun 2017, 12:48

lunsen_de hat geschrieben:
Di 27. Jun 2017, 08:37

Code: Alles auswählen

...
echo '<div style="position: absolute;">' . $vererbung->Vererbe(($i + 100), 'CMS_IMGDESCR') . '</div>';
....
Das Div geht noch auf, dann $vererbung passiert Nichts.
Kann jemand helfen?
Ich würde einen Konstruktor bauen.
Aber hier schon würde ich $vererbung->Vererbe(($i + 100), 'CMS_IMGDESCR') anders schreiben.

Code: Alles auswählen

$eins = $i + 100;
$zwei = "CMS_IMGDESCR";
$vererbung->Vererbe($eins,$zwei);
Es gibt oft mal Probleme, wenn nicht der Wert direkt übergeben wird sondern eine Rechenoperation oder ein Ersatzzeichen wie "CMS_IMGDESCR".
Letzteres wird durch Contenido ersetzt und je nachdem ob es Frontend oder Backend ist, kann es was anderes sein.
Und dann kann man auch einfach testen, was in den Variablen steht.

Code: Alles auswählen

echo $eins;
echo $zwei;
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Di 4. Jul 2017, 17:50

Hallo,
ich werde das nach meinem Urlaub noch einmal versuchen umzusetzen.
Allerdings denke ich das die Anpassung des Moduls (Anforderungen müssten noch einmal definiert werden) vielleicht eine Auftragsarbeit wird.

Grüße
lunsen_de

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Mo 10. Jul 2017, 15:02

Hallo,

ich habe es getestet. bei echo $eins usw. steht im Bachend als Text das richtige. Wenn ich in der Konfig also 3 eingebe steht im Backend
100CMS_HTML ..... 101CMS_HTML .... 102CMS_HTML.

Wie muss ich diesen Abschnitt jetzt schreiben, damit ich im Backend 3 Buttons oder in dem Fall Textfelder sehe.

Code: Alles auswählen

$eins = $i + 100;
$zwei = "CMS_HTML";
$vererbung->Vererbe($eins,$zwei);
			echo $eins;
			echo $zwei;
			echo '<div style="background-color:cc0000;">' . $vererbung->Vererbe($eins,$zwei) . '</div>';
führt nicht zum Erfolg.

Kann mir jemand schreiben, wie ich diesen Abschnitt schreiben muss, damit ich 3 Felder bekomme. Danke.

Gruß lunsen_de

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von homtata » Mo 10. Jul 2017, 16:41

Ich denke mal, dass wir dir den Code nicht so ohne weiteres schreiben können. Wenn du dich auf die echos beziehst, die du in den paar Zeilen Code eben zeigst, ist es kein Wunder, dass du für $eins und $zwei Ergebnisse kriegst - du hast die Variablen ja grad zuvor definiert. Das sagt dir aber noch nicht, wo in der großen Class wahrscheinlich der Fehler steckt. Du musst jetzt mal Stück für Stück in der Klasse selbst wieder echos produzieren für Variablen, um zu sehen, ob die Datenbankabfragen überhaupt mit gefüllten Variablen durchlaufen und auch wieder Ergebnisse bringen usw. usw. Und außerdem ist der oben gepostete volle Code der Klasse in bezug auf "new Article" ja eh noch komplett fehlerhaft.

lunsen_de
Beiträge: 297
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Brauche Hilfe bei Modulanpassung von 4.8 auf 4.9

Beitrag von lunsen_de » Di 11. Jul 2017, 08:34

Hallo,

ersteinmal danke für die Hilfe aber ich breche den Versuch hier ab da meine Kenntnisse und mein Verständnis nicht ausreichen um hier zu einer Lösung zu kommen.
Außerdem glauche ich ist dieses Modul keine so gute Grundlage für das, was ich haben will, da es ursprünglich für eine andere Funktion und einen anderen Zweck gemacht wurde und ich bis dato nur eine (Neben)Funktion genutzt habe.

Ich werde das wohl jetzt lieber als Jobangebot für einen Programmierer einstellen und hoffe damit eine (bezahlbare) Lösung zu finden.

Sollte hier schon jemand Interesse haben, kann ich gerne ein Leistungsbeschreibung zusammenstellen und wir hören uns per PN.

Grüße lunsen_de

Antworten