Jo, Wenn. Wenn da Sojemand wie ich am Start ist und diese Klasse nicht erbt
Dann erklärt es, warum du keine BBCodes im Editor auswählen kannst. Du musst dem BBCode-Handler setAllowedBBCodes() mitteilen, welche BBCodes du erlaubst.
Jo, Wenn. Wenn da Sojemand wie ich am Start ist und diese Klasse nicht erbt
Dann erklärt es, warum du keine BBCodes im Editor auswählen kannst. Du musst dem BBCode-Handler setAllowedBBCodes() mitteilen, welche BBCodes du erlaubst.
Mhmm... Obwohl alles ausgefüllt erscheint die Fehlermeldung Ihre Angaben sind ungültig. Bitte überprüfen Sie die markierten Eingabefelder. Und die wysiwyg Items verschwinden. Felder werden keine markiert...
Mhmm... Okay...
Du hast vor einer Stunde noch geschrieben, dass deine Klassen die MessageForm nicht erben und jetzt erbt jede deiner auf GitHub befindlichen Form-Klassen von dieser Klasse.
Was heißt bei dir, dass „die Wysiwyg Items verschwinden”?
Wenn eine UserInputException geworfen wird, im Formular aber keine Fehler angezeigt werden, dann hast du entweder einen Rechtschreibfehler im ersten Parameter der UserInputException oder bei der entsprechenden Abfrage im Template. Da deine Applikation allerdings auch mehrere Formulare beinhaltet und du nicht schreibst, wo das Problem auftritt, kann man dir leider nicht helfen.
Also ich hab mir jetzt die MessageForm klasse mal angesehen und auch andere Plugins, welche einen Editor verwenden. Aber ich komme einfach nicht auf den Fehler...
Wenn ich das Formular normal aufrufe, sind die Items alle da (Bild 2), sobald ich das Formular abschicke, bekomm ich eben den Fehler wie in Bild 1 und die Items sind 'verschwunden'
Ich kann weder in der Entwickler Konsole etwas finden, noch irgendetwas in den Foren,- bzw. ServerLogs... Darum fällt es mir auch so schwer, den Fehler ausfindig zu machen.
<?php
namespace wcf\form;
use wcf\data\app\ApplicationAction;
use wcf\form\AbstractForm;
use wcf\system\WCF;
use wcf\system\exception\IllegalLinkException;
use wcf\system\exception\UserInputException;
use wcf\form\MessageForm;
/**
* Shows the application mod add page.
*
* @author Fabi_995
* @copyright 2015 fabi-995.de
* @license LGPL
* @package de.fabi-995.wcf.application
*/
class ApplicationBuilderAddForm extends MessageForm {
/**
* @see \wcf\page\AbstractPage::$activeMenuItem
*/
public $activeMenuItem = 'wcf.page.application';
public $neededPermissions = array('user.application.canWriteBuilder');
public $templateName = 'applicationBuilderAdd';
// parameters
public $appID = '';
public $phase = 'Architekt';
public $name = '';
public $age = '';
public $mcname = '';
public $about = '';
public $qualification = '';
public $experience;
public $online = '';
public $remarks = '';
public $reference = '';
/**
* @see Form::readFormParameters()
*/
public function readFormParameters() {
parent::readFormParameters();
if (isset($_POST['appID'])) $this->appID = $_POST['appID'];
if (isset($_POST['phase'])) $this->phase = $_POST['phase'];
if (isset($_POST['name'])) $this->name = $_POST['name'];
if (isset($_POST['age'])) $this->age = $_POST['age'];
if (isset($_POST['mcname'])) $this->mcname = $_POST['mcname'];
if (isset($_POST['about'])) $this->about = $_POST['about'];
if (isset($_POST['qualification'])) $this->qualification = $_POST['qualification'];
if (isset($_POST['experience'])) $this->experience = $_POST['experience'];
if (isset($_POST['online'])) $this->online = $_POST['online'];
if (isset($_POST['remarks'])) $this->remarks= $_POST['remarks'];
if (isset($_POST['reference'])) $this->reference= $_POST['reference'];
}
/**
* @see \wcf\form\IForm::validate()
*/
public function validate() {
parent::validate();
}
/**
* @see Form::save()
*/
public function save() {
parent::save();
$this->objectAction = new ApplicationAction(array(), 'create', array('data' => array_merge($this->additionalFields, array(
'phase' => $this->phase,
'name' => $this->name,
'age' => $this->age,
'mcname' => $this->mcname,
'about' => $this->about,
'qualification' => $this->qualification,
'experience' => $this->experience,
'online' => $this->online,
'remarks' => $this->remarks,
'reference' => $this->reference,
))));
$this->objectAction->executeAction();
$this->saved();
// reset values
$this->appID = '';
$this->phase = 'Architekt';
$this->name = '';
$this->age = '';
$this->mcname = '';
$this->about = '';
$this->qualification = '';
$this->experience = '';
$this->online = '';
$this->remarks = '';
$this->reference = '';
// show success
WCF::getTPL()->assign(array(
'success' => true
));
}
/**
* @see Page::assignVariables()
*/
public function assignVariables() {
parent::assignVariables();
WCF::getTPL()->assign(array(
'appID' => $this->appID,
'phase' => $this->phase,
'name' => $this->name,
'age' => $this->age,
'mcname' => $this->mcname,
'about' => $this->about,
'qualification' => $this->qualification,
'experience' => $this->experience,
'online' => $this->online,
'remarks' => $this->remarks,
'reference' => $this->reference,
'action' => 'add'
));
}
}
?>
Display More
{include file='documentHeader'}
<head>
<title>{lang}wcf.application.headline{/lang}</title>
{include file='headInclude'}
</head>
<body id="tpl{$templateName|ucfirst}">
{include file='header'}
<header class="boxHeadline">
<h1>{lang}wcf.application.{$action}{/lang}</h1>
</header>
{include file='formError'}
{if $success|isset}
<p class="success">{lang}wcf.global.success.{$action}{/lang}</p>
{/if}
<form method="post" action="{link controller='ApplicationBuilderAdd'}{/link}">
<div class="container containerPadding marginTop">
<fieldset>
<legend>{lang}wcf.global.form.data{/lang}</legend>
<dl{if $errorField == 'name'} class="formError"{/if}>
<dt><label for="name">{lang}wcf.application.name{/lang}</label></dt>
<dd>
<input type="text" maxlength="50" id="name" name="name" value="{$name}" class="" required="required" placeholder="RL Name"/>
{if $errorField == 'name'}
<small class="innerError">{lang}wcf.application.name.error.{$errorType}{/lang}</small>
{/if}
</dd>
</dl>
<dl{if $errorField == 'age'} class="formError"{/if}>
<dt><label for="age">{lang}wcf.application.age{/lang}</label></dt>
<dd>
<input type="date" id="age" name="age" value="{$age}" class="" required="required" placeholder="Geburtsdatum"/>
{if $errorField == 'age'}
<small class="innerError">{lang}wcf.application.age.error.{$errorType}{/lang}</small>
{/if}
</dd>
</dl>
<dl{if $errorField == 'mcname'} class="formError"{/if}>
<dt><label for="mcname">{lang}wcf.application.mcname{/lang}</label></dt>
<dd>
<input type="text" maxlength="50" id="mcname" name="mcname" value="{$mcname}" class="" required="required" placeholder="Minecraft Name"/>
{if $errorField == 'mcname'}
<small class="innerError">{lang}wcf.application.mcname.error.{$errorType}{/lang}</small>
{/if}
</dd>
</dl>
<br> <br>
<legend>{lang}wcf.global.form.content{/lang}</legend>
<fieldset>
<dl>
<dt><label for="about">{lang}wcf.application.about{/lang}</label></dt>
<dd>
<textarea id="about" name="about" rows="20" cols="40">{$about}</textarea>
{if $errorField == 'about'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{/if}
</small>
{/if}
</dd>
</dl>
{event name='messageFields'}
</fieldset>
<fieldset>
<dl>
<dt><label for="qualification">{lang}wcf.application.qualification{/lang}</label></dt>
<dd>
<textarea id="qualification" name="qualification" rows="20" cols="40">{$qualification}</textarea>
{if $errorField == 'qualification'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{/if}
</small>
{/if}
</dd>
</dl>
{event name='messageFields'}
</fieldset>
<fieldset>
<dl>
<dt><label for="experience">{lang}wcf.application.experience{/lang}</label></dt>
<dd>
<textarea id="experience" name="experience" rows="20" cols="40">{$experience}</textarea>
{if $errorField == 'experience'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{/if}
</small>
{/if}
</dd>
</dl>
{event name='messageFields'}
</fieldset>
<fieldset>
<dl>
<dt><label for="online">{lang}wcf.application.online{/lang}</label></dt>
<dd>
<textarea id="online" name="online" rows="20" cols="40">{$online}</textarea>
{if $errorField == 'online'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{/if}
</small>
{/if}
</dd>
</dl>
{event name='messageFields'}
</fieldset>
<fieldset>
<dl>
<dt><label for="remarks">{lang}wcf.application.remarks{/lang}</label></dt>
<dd>
<textarea id="remarks" name="remarks" rows="20" cols="40">{$remarks}</textarea>
{if $errorField == 'remarks'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{/if}
</small>
{/if}
</dd>
</dl>
{event name='messageFields'}
</fieldset>
<fieldset>
<dl>
<dt><label for="reference">{lang}wcf.application.reference{/lang}</label></dt>
<dd>
<textarea id="reference" name="reference" rows="20" cols="40">{$reference}</textarea>
{if $errorField == 'reference'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{/if}
</small>
{/if}
</dd>
</dl>
{event name='messageFields'}
</fieldset>
{event name='messageFields'}
</fieldset>
</div>
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s" />
<input type="reset" value="{lang}wcf.global.button.reset{/lang}" />
{@SECURITY_TOKEN_INPUT_TAG}
</div>
</form>
{include file='wysiwyg' wysiwygSelector='reference'}
{include file='wysiwyg' wysiwygSelector='remarks'}
{include file='wysiwyg' wysiwygSelector='online'}
{include file='wysiwyg' wysiwygSelector='experience'}
{include file='wysiwyg' wysiwygSelector='qualification'}
{include file='wysiwyg' wysiwygSelector='about'}
{include file='footer'}
</body>
</html>
Display More
Ich empfehle dir mal die MessageForm auch richtig anzuschauen ( https://github.com/WoltLab/WCF…essageForm.class.php#L220 ) da findest du sicher dein Fehler den du gemacht hast.
Ich hab kein Subject, was also bedeutet der Fehler deutet auf ein Textfeld was nicht vorhanden ist aber ausgefüllt sein sollte, sehe ich das richtig?
Wenn man einen Thread startet muss man ja das Thema irgendwie benennen.
Ich brauch das aber eigentlich nicht...
Dann überschreibe in der erbenden Klasse die validateSubject Methode und rufe dort nicht die parent Methode auf, sondern lass deine validateSubject Methode einfach leer.
Ich hab jetzt eine wichtige Sache, die auf jeden Fall zum Plugin dazu gehört: Den Status der Bewerbung bearbeiten + Message (Grund) mitschicken.
Das ganze möchte ich, sofern möglich, mit den wcfDialog verwirklichen. Dazu hab ich bereits:
<input type="button" value="{lang}wcf.global.button.edit{/lang}" id="appNoteItem">
<div id="appNote" style="display: none;">
<div id="appNoteContent" style="margin-top:10px;">
<form method="post" action="{link controller='ApplicationEdit'}{/link}">
<dl>
<dt><input type="radio" id="true" name="state" value="{lang}wcf.abblication.moderation.true{/lang}"></dt>
</dl>
<dl>
<dt><input type="radio" id="false" name="state" value="{lang}wcf.abblication.moderation.false{/lang}"></dt>
</dl>
<dl>
<dt><label for="message">{lang}wcf.application.message{/lang}</label></dt>
<dd>
<textarea id="message" name="message" rows=10></textarea>
</dd>
</dl>
<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s" />
{@SECURITY_TOKEN_INPUT_TAG}
</div>
</form>
</div>
</div>
<script data-relocate="true">
//<![CDATA[
$(function() {
$('#appNoteItem').click(function() {
$('#appNote').wcfDialog({
title: '{lang}wcf.application.moderation.headline{/lang}'
});
return false;
});
});
//]]>
</script>
{literal}
<script data-relocate="true">
//<![CDATA[
$.fn.pixels = function(property) {
return parseInt(this.css(property).slice(0,-2));
};
var $mainMenuHeight = $('#mainMenu').height();
var $marginTop = $('#logo').pixels('margin-top');
var $marginBottom = $('#logo').pixels('margin-bottom');
var $topHeaderGap = $('#logo').height() + $marginTop + $marginBottom;
var $wrapper = $('#mainMenu');
var $window = $(window);
$(function() {
var $scrollOffset = $window.scrollTop();
if ($scrollOffset > $topHeaderGap) {
$wrapper.addClass('fixed');
$('.navigationHeader').css("margin-top","51px");
}
else {
$wrapper.removeClass('fixed');
$('.navigationHeader').css("margin-top","0");
}
$(document).scroll(scrollPage).resize(scrollPage);
});
function scrollPage() {
var $scrollOffset = $window.scrollTop();
if ($scrollOffset > $topHeaderGap) {
$wrapper.addClass('fixed');
$('.navigationHeader').css("margin-top","51px");
}
else {
$wrapper.removeClass('fixed');
$('.navigationHeader').css("margin-top","0");
}
}
//]]>
</script>
{/literal}
Display More
Und die dazugehörige Klasse:
<?php
namespace wcf\form;
use wcf\data\app\Application;
use wcf\data\app\ApplicationAction;
use wcf\form\AbstractForm;
use wcf\system\WCF;
use wcf\form\MessageForm;
/**
* Shows the application mod add page.
*
* @author Fabi_995
* @copyright 2015 fabi-995.de
* @license LGPL
* @package de.fabi-995.wcf.application
*/
class ApplicationEditForm extends MessageForm {
/**
* @see \wcf\page\AbstractPage::$activeMenuItem
*/
public $activeMenuItem = 'wcf.page.application';
public $templateName = 'applicationEdit';
public $appID = 0;
public $app = null;
/**
* @see \wcf\page\IPage::readParameters()
*/
public function readParameters() {
AbstractForm::readParameters();
if (isset($_REQUEST['id'])) $this->appID = intval($_REQUEST['id']);
$this->app = new Application($this->appID);
if (!$this->app->appID) {
throw new IllegalLinkException();
}
if (!$this->app->canEdit()) {
throw new PermissionDeniedException();
}
}
/**
* @see Form::save()
*/
public function save() {
parent::save();
// update
$this->objectAction = new ApplicationAction(array($this->appID), 'update', array('data' => array_merge($this->additionalFields, array(
'state' => $this->state,
'message' => $this->message,
))));
$this->objectAction->executeAction();
$this->saved();
// show success message
WCF::getTPL()->assign(array(
'success' => true
));
}
/**
* @see Page::assignVariables()
*/
public function assignVariables() {
parent::assignVariables();
WCF::getTPL()->assign(array(
'app' => $this->app,
'message' => $this->message,
'state' => $this->state,
'action' => 'edit'
));
}
}
?>
Display More
Das Template wird in die application.tpl includet.
Das Dialogfeld kommt auch prima (Bis auf das die Sprachvariablen noch fehlen)
Aber ich glaube, ich hab 1. schonmal einen Denkfehler, weil woher weiß das Edit.tpl welche application bearbeitet werden soll und 2. Hab ich irgendwie meine Zweifel ob das überhaupt funktioniert. Mir wäre im normalen WCF solch eine Funktion, sprich DB eingaben über das Dialogfeld, nicht bekannt...
Irgendwelche Ratschläge, wie ich das ganze am besten angehen soll?
[Edit: Ups "abblication"]
Edit2: Verstehe ich das richtig, dass die Inhalte vom Popup von der tpl übernommen werden in der es Includet ist?!
Mir wäre im normalen WCF solch eine Funktion, sprich DB eingaben über das Dialogfeld, nicht bekannt...
Hab das Forum nochmal "untersucht", und doch solch eine art Funktion gefunden, nämlich bspw. das Editieren von Threads.
Und sowas will ich auch, nur bekomme ich es einfach nicht hin. Entweder bekomme ich Fehler das etwas undefiniert sei, obwohl es in der Edit Klasse zu 100% definiert ist, werde beim absenden auf eine nicht verfügbare Seite weitergeleitet, oder es passiert beim Absenden einfach nichts... Ich bin da langsam irgendwie am verzweifeln
Ich brauch ja nur 2 Radio Buttons á Annehmen / Ablehnen und eine kleine Message schreiben, wieso, weshalb, warum.
Stell bitte für jede Frage ein eigene Thema! Das hat den Grund, dass nachfolgende Leute mit gleichem Problem die Lösung schneller finden.
Ja, kann ich ja verstehen, aber das bezieht sich alles ja auf eine Sache darum kommt es mir etwas blöd dafür jedes mal ein neues Thema auf zu machen...
Trotzdem sind das unterschiedliche Probleme. Ich glaube mittlerweise kennt jeder dein Thema und weiss wovon du sprichst.
Dir dafür eine Anleitung zu schreiben sprengt finde ich etwas den Rahmen. Dafür solltest du Javascript können und PHP, am besten ist du setzt dich da wirklich mal richtig mir dem WCF und WBB auseinander.
Kann euch ja schon verstehen, aber ob ich das jetzt mach oder irgendjemand anders? Für "Neulinge" in Sachen WCF Programmieren ist es nicht gerade leicht.
Dennoch... Bitte... Das ist mein letzes Anliegen und dann lasse ich euch - versprochen - in Ruhe. Dann ist auch der wichtigste Umfang meines Plugins fertig.
Jeder der mir hier geholfen hat, hat mich ein ganz großes Stück weit weiter gebracht und hab hier auch schon einiges gelernt. Das Thema hier wird mir auch für zukünftige Plugins eine große Hilfe sein.
Angefangen hat es ja hier: https://community.woltlab.com/thread/244153 Da hab ich einfach nur Codeteile kopiert und eingefügt und irgendwie geändert, mit der Hoffnung es wird schon klappen. Ohne dabei den Code wirklich zu verstehen. Wenn ich das jetzt nochmal auflege was ich in dem Thema angefangen hab, dann weiß ich was zu tun ist, da mir vorallem @Josh das ganze erklärt hat. Auch die ganzen Tipps und Hinweise von allen anderen waren mir eine große Hilfe, auch wenn ich manchmal 2x überlegen/nachfragen musste was damit gemeint ist und wie ich es verwenden muss...
So, um das ganze nun rund abzuschließen: Mein erstes "großes" Plugin ist nun startklar. Es hat also jetzt alle wichtigen Funktionen, die es braucht.
Aber das Ganze hab ich ja nicht allein geschafft, sondern wegen denen, die mir hier tatkräftig geholfen haben, weshalb ich hier nochmal mein Dank aussprechen will
Danke an
@Josh
@Morik
@Fighter456
@web-produktion
@Woodmen
@azerus
@ramius
Und auch @Sonnenspeer, der mir anderswo schon ziemlich oft geholfen hat und nicht unerwähnt bleiben sollte
Sollte ich jemanden vergessen haben, so tut es mir leid
Mein Plugin ist natürlich noch stark ausbaufähig. Aber ich denke, das bekomme ich nun, dank der Hilfe hier von jedem, jetzt alleine hin.
Was ich natürlich noch dazu sagen muss, auch wenn ich mich jetzt ehrlich gesagt etwas... blöd fühle. JS ist nicht wirklich so meine Stärke. Ich hab das mit dem Popup auf biegen und brechen nicht hinbekommen. Irgendwie hatte ich dann kleine Änderungen gemacht, und da kam mir Plan B. Statt dem Popup füge ich das Bearbeiten einfach direkt in die Page mit rein.
Es war für mich leichter und ich musste nicht mehr 'nerven'. Tut mir leid wenn ich jetzt deswegen in den Rücken falle, weil es ja eigentlich über das Popup geplant war und auch schon Ansätze bekommen hab
Hier mal noch den Link zu Git auf mein Plugin https://github.com/Fabi995/de.ac-aom.wcf.application
Reißt mir bitte nicht den Kopf ab was den Code betrifft. Und ja, ich weiß dass man eigentlich keine .css mehr machen soll. Wird später evtl. rausgefixt. Ein paar Funktionen sind bis jetzt auch nur "Luft" wie die "Kann Bewerbung Abarbeiten".
In dem Sinne:
~LG Fabi
Übung macht den Meister und aller Anfang ist schwer. Es ist nicht schlimm viel zu Fragen, nur sollten die Fragen getrennt sein und manches ist ein wenig komplexer zu beschreiben und benötigt ein wenig mehr Fachwissen.
Aber sonst schön, dass du dich ran gehalten und auch trotzdem einiges probiert hast.
Don’t have an account yet? Register yourself now and be a part of our community!