mod_text "Pimp my Textfeld"

Diskussion zu nicht so umfangreichen Modulen und Start-Up für neue Module. Ansonsten bitte die speziellen Kategorien benutzen!
Benutzeravatar
Mr. Magpie
ConPresso-Profi
Beiträge: 1004
Registriert: 01.01.1970 02:00
Wohnort: Wuppertal
Hat sich bedankt: 274 Mal
Danksagung erhalten: 59 Mal

Beitrag von Mr. Magpie »

Hallo Markus,

manchmal hilft's, back to the roots zu gehen!

Es liegt wohl nicht an mod_text, sondern an deinem neuen Parser, der verschachtelet ifSets erlaubt. Ich habe einmal ein gaaanz einfaches Template gebaut, um dem Fehler auf die Spur zu kommen:

Code: Alles auswählen

<!-- Text: Testfeld; --><br />
<!-- ifSet: Testfeld; -->Dies ist Text.<!-- /ifSet -->
Bei diesem Template tritt der Fehler nicht auf, d.h., ist im ersten von drei sonst identischen Artikeln das Textfeld "Testfeld" leer, erscheint der Text "Dies ist Text." der anderen beiden Artikel.
Doch nun kommt der Hammer, denn das folgende Template funktioniert nicht, obwohl der Text-Platzhalter "Testfeld" definiert ist und auch Inhalt hat:

Code: Alles auswählen

<br />
<!-- ifSet: Testfeld; -->Dies ist Text.<!-- /ifSet -->
Und der Gipfel ist, dass das Template mit auskommentiertem Testfeld-Platzhalter wieder funktioniert:

Code: Alles auswählen

<!-- <!-- Text: Testfeld; --> --><br />
<!-- ifSet: Testfeld; -->Dies ist Text.<!-- /ifSet -->
Irgendwo muss also im Template der abgefragte Platzhalter ausgegeben werden, damit die ifSet-Abfrage funktioniert.
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7164
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 919 Mal

Beitrag von MarkusR »

Teste das doch bitte mal mit dem Original-Parser, denn der dürfte sich genauso verhalten.
Wenn ein Platzhalter nicht in der Form <!-- Typ: Name; --> im Template steht, dann wird auch nicht der Content gelesen und somit kein ifset ausgeführt.
Dabei kann er ja ruhig in einem anderen Teil des Templates stehen, aber er muß drinstehen. Sagt zumindest der Code...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
Mr. Magpie
ConPresso-Profi
Beiträge: 1004
Registriert: 01.01.1970 02:00
Wohnort: Wuppertal
Hat sich bedankt: 274 Mal
Danksagung erhalten: 59 Mal

Beitrag von Mr. Magpie »

:wall: :wall: :wall:

Du hast Recht!

... warum ist mir das nicht schon früher aufgefallen??????

Wenn ich's richtig verstehe (und ganz doll vereinfacht), fragen also die ifSets nicht ab, ob das Feld tatsächlich Inhalt hat, sondern ob der Parser etwas findet, was er ausgeben kann, oder?

Kann man dem nicht irgendwie Abhilfe schaffen? Oder vielleicht könntest Du das irgendwo bei der Beschreibung zu mod_text noch einmal ganz klar herausstellen? Denn durch die Möglichkeit der Checkboxen und noch verstärkt durch den Einsatz verschachtelter ifSets tritt das Problemchen ja erst so deutlich zutage.

Aber damit ich's nicht vergess': Viiielen Dank für dein Samstags-Engagement!!
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7164
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 919 Mal

Beitrag von MarkusR »

Mr. Magpie hat geschrieben:Wenn ich's richtig verstehe (und ganz doll vereinfacht), fragen also die ifSets nicht ab, ob das Feld tatsächlich Inhalt hat, sondern ob der Parser etwas findet, was er ausgeben kann, oder?
Der Parser prüft, welche Platzhalter es im Template gibt.
Für diese sucht er sich den Content zusammen.
Dann wird mittels ifset geprüft, ob es denn wirklich was dazu gibt.

Ganz theoretsch gedacht könnte man mal versuchen den Teil

Code: Alles auswählen

// create a regular expression with all available placeholders
$tagsPreg = '';
$_div = '';
foreach ($hdlr_parser_replacement as $k=>$v) {
    $tagsPreg .= $_div.preg_quote($k, '/');
    $_div = '|';
}
um die ifs zu ergänzen

Code: Alles auswählen

// create a regular expression with all available placeholders
$tagsPreg = '';
$_div = '';
foreach ($hdlr_parser_replacement as $k=>$v) {
    $tagsPreg .= $_div.preg_quote($k, '/');
    $_div = '|';
}
$tagsPreg .= '|/ifSet|/ifNotSet';
für den erweiterten Parser würde man es noch ergänzen

Code: Alles auswählen

$tagsPreg .= '|/ifSet|/ifNotSet|/ifValue';
Ist aber nur Theorie und nicht getestet!!!

Und wenn ich etwas dürber nachdenke kann es nicht funktionieren, weil im Parser-Array die nötigen Keys fehlen.

Im Grunde muß da aber eh von Seiten Bartels&Schöne was gemacht werden, weil sonst ja auch die manuell angelegten Platzhalter wertlos werden.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
Mr. Magpie
ConPresso-Profi
Beiträge: 1004
Registriert: 01.01.1970 02:00
Wohnort: Wuppertal
Hat sich bedankt: 274 Mal
Danksagung erhalten: 59 Mal

Beitrag von Mr. Magpie »

... das ist es leider auch, bloß Theorie, denn ich erhalte sofort folgenden Fehler:

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'f' in /homepages/14/d23972599/htdocs/cms/_include/parser.php on line 61


Aber ich glaube, wir werden nun zunehmend off-topic, was diesen Thread anbetrifft.

EDIT: Thema wurde unter http://community.conpresso.de/viewtopic ... 1020#21020 fortgeführt (und gelöst!)
Zuletzt geändert von Mr. Magpie am 18.07.2007 00:28, insgesamt 1-mal geändert.
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 02:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Beitrag von balu »

Hallo,

das schaue ich mir an. Die Idee war es damals, ein paar Datenbank-Abfragen zu sparen, indem die Daten für einen Typ erst geladen werden, wenn dieser Typ auch verwendet wird. Aber offensichtlich wird in diesem Fall zuviel gespart...

Balu
Bartels.Schöne
ConPresso Support & Development
Webteufel
ConPresso-User
Beiträge: 36
Registriert: 15.10.2007 23:59

Beitrag von Webteufel »

Hallo zusammen,

habe heute das mod_text "installiert". Jetzt kommt wenn man ein neuen Artikel erstellen will folgende Fehlermeldung:

Parse error: parse error, unexpected T_CASE in /homepages/41/d86050038/htdocs/cms/de/_include/form_fields.inc.php on line 144

Was ist das. Bitte um hilfe.

Danke Webteufel

PS. Conpressoversion = 4.0.7
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7164
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 919 Mal

Beitrag von MarkusR »

Das ist ein Codefehler, vermutlich vertippt bzw. falsch kopiert.

Wenn Du willst, daß das jemand beurteilt mußt Du den Code schon hier veröffentlichen.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Webteufel
ConPresso-User
Beiträge: 36
Registriert: 15.10.2007 23:59

Beitrag von Webteufel »

Hab den Fehler gefunden.

Ein } zuviel :oops:

Danke Webteufel
stefann
ConPresso-User
Beiträge: 34
Registriert: 31.07.2006 09:33
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Select "multiple" machen?!

Beitrag von stefann »

Schon etwas eingestaubt, dieser Thread, aber dennoch hab ich dazu eine Frage: Mal davon abgesehen das das Modul echt spitze ist, und bei mir bisher einwandfrei lief, fehlt mir dennoch eine Kleinigkeit. Und zwar bräuchte ich in meinem Fall eine multiple-Selectbox.
Hab das Modul mal weitestgehend angepasst, was ja nicht so schwer war da, es ja sehr übersichtlich und gut aufgebaut ist.

Habe die Datei manage_placeholder.inc.php um folgenden Code erweitert

Code: Alles auswählen

print('<input name="placeholder[formtype]" class="checkbox" type="radio" value="selectbox_m" id="selectbox_m" '.($placeholder['formtype']=='selectbox_m' ? 'checked' : '').'><label for="selectbox_m">'.__('Selectbox Multiple').'</label>');
Dann die Datei form_fields.inc.php bearbeitet, den Teil

Code: Alles auswählen

if ($value['formtype'] == 'selectbox' && isset($value['options'])) { 
        printf('<select name="content[%s][text]">', 
            htmlspecialchars($key) 
        ); 
      $select_options = explode(";",$value['options']); 
      foreach ($select_options AS $select_option)  { 
         $selected = ($select_option == htmlspecialchars($content[$key]['text'])) ? ' selected="selected"' : ''; 
         printf('<option value="%s"%s>%s</option>', $select_option, $selected, $select_option); 
      } 
        printf('</select>'); 
        print('</td></tr>'); 
        return; 
    } 
kopiert und folgendes daraus gemacht und als zusätlichen Formtyp hinzugefügt

Code: Alles auswählen

if ($value['formtype'] == 'selectbox_m' && isset($value['options'])) {
		  
        printf('<select name="content[%s][text][]" multiple size="'.(empty($value['length']) ? 5 : $value['length']).'">', 
            htmlspecialchars($key) 
        ); 
      $select_options = explode(";",$value['options']); 
      foreach ($select_options AS $select_option)  { 
         $selected = (in_array($select_option, $content[$key]['text'])) ? ' selected="selected"' : ''; 
         printf('<option value="%s"%s>%s</option>', $select_option, $selected, $select_option); 
      } 
        printf('</select>'); 
        print('</td></tr>'); 
        return; 
    } 
Funktioniert auch alles recht gut, nur habe ich Probleme mit

Code: Alles auswählen

name="content[%s][text][]
um die mehrfachauswahl abzuspeichern! Ich dachte eigentlich das die Funktion save_article() den content per serialize speichert und so funktionieren müsste... Irgendwelche Ideen? :P

Grüße
Stefan
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7164
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 919 Mal

Beitrag von MarkusR »

Ich dachte eigentlich das die Funktion save_article() den content per serialize speichert
Genau das ist falsch und im Code von save_article() sowie der gesamten Datenbank ersichtlich.
Es wird nach dem Prinzip einer relationalen Datenbank gespeichert, es erhält jeder Platzhalter seinen eigenen Datensatz.

Code: Alles auswählen

    case 'text': 
        // Update if something was entered
        if ($value['text']!='') {
            $query = sprintf("INSERT INTO ".CPO_CONTENT_TEXT." "
                ."SET id='%s', "
                ."article_id='%s', "
                ."fieldname='%s', "
                ."text='%s'",
                addslashes($value['id']), 
                $nr, 
                addslashes($name), 
                addslashes($value['text'])
            );
            DEBUG(1, $query, __FILE__, __LINE__);
            $db->query($query); 
        }
        break;
    }
Hast Du Dir denn auch schon überlegt, wie später der Inhalt eines Arrays wieder ausgegeben werden sollte. Auch das sieht ConPresso nicht vor.

Du müsstest also die Inhalte Deiner Auswahl in einen String umwandeln lassen und dann speichern.

Leider gibtst Du nicht an, wie und wofür Du ein select multiple benötigst und wie die Ausgabe erfolgen soll...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
stefann
ConPresso-User
Beiträge: 34
Registriert: 31.07.2006 09:33
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Beitrag von stefann »

Ich dachte eigentlich daran den Array per serialize in das Datenbank-Feld "text" in der cpo4_content_text zu schreiben, und bin wohl davon ausgegangen das dies automatisch geschiet sobald ein Array vorliegt. War wohl etwas voreilig! Im Grunde wollte ich nur eine Liste möglicher Begriffe zu einem Artikel selektierbar machen, sprich ein Schlagwortpool woraus sich ein Redakteur bedienen kann.
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7164
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 919 Mal

Beitrag von MarkusR »

Dann gilt das hier:
Du müsstest also die Inhalte Deiner Auswahl in einen String umwandeln lassen und dann speichern.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
stefann
ConPresso-User
Beiträge: 34
Registriert: 31.07.2006 09:33
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Beitrag von stefann »

Ok, habs jetzt mit folgendem hinbekommen:

Code: Alles auswählen

if ($value['formtype'] == 'selectbox_m' && isset($value['options'])) {
		  $c = explode(',',$content[$key]['text']);
		  $select_options = explode(";",$value['options']); 
		  printf('<input type="hidden" name="content[%s][text]" value="%s">', 
            htmlspecialchars($key),
            $content[$key]['text']
        );
        printf('<select id="ms_%s" multiple size="'.(empty($value['length']) ? 5 : $value['length']).'" onChange="multipleSelect(\'%s\');">', 
            htmlspecialchars($key),
            htmlspecialchars($key)
        );    
      
      echo $content[$key]['text'];
      foreach ($select_options AS $select_option)  { 
         $selected = (in_array($select_option, $c)) ? ' selected="selected"' : ''; 
         printf('<option value="%s"%s>%s</option>', $select_option, $selected, $select_option); 
      } 
        printf('</select>'); 
        print('</td></tr>'); 
        return; 
   } 
und in der Datei article_form.php am Ende noch die JS-Funktion

Code: Alles auswählen

<script type='text/javascript'>
	function multipleSelect(n) {
		var ms = document.getElementById('ms_'+n);
		
		a = new Array();
	   for(i=0;i<ms.options.length;i++){
	     if(ms.options[i].selected) a.push(ms.options[i].value);
	   }
	   document.getElementsByName('content['+n+'][text]')[0].value = a.join(',');
	   
	}
</script>
Dankeschön fürs Augenöffnen! ;)
Gruß
Stefan
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7164
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 919 Mal

Beitrag von MarkusR »

Sieht gut aus :!:
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle