stimmt das soweit?
Sieht erstmal richtig aus.
weil das Ganze irgendwie keine Wirkung hat
Das ist eine wenig hilfreiche Aussage, denn sie sagt nichts davon aus was du eigentlich machst und vor allem nicht, was du versucht hast …
stimmt das soweit?
Sieht erstmal richtig aus.
weil das Ganze irgendwie keine Wirkung hat
Das ist eine wenig hilfreiche Aussage, denn sie sagt nichts davon aus was du eigentlich machst und vor allem nicht, was du versucht hast …
also ich wollte über den EntryAddTestListener eine Klasse einbinden, dazu bin ich wie folgt vorgegangen:
$eventObj->className = 'blog\form\EntryTestAddForm';
was aber nichts bewirkt. Der Listener an sich funktioniert soweit, denn wenn ich die WCF::getTPL()->assign direkt in der execute() eintrage funktioniert das. Ich möchte aber ein weiteres Formular einbinden(als neuen Tab im Editor), weswegen ich das über die Klasse versuche... steig da irgendwie noch nicht ganz hinter
$eventObj->className = 'blog\form\EntryTestAddForm';
Was soll das denn überhaupt machen? Mir ist nicht ganz klar, was du damit versuchst, es gibt kein $className. PHP lässt es dich natürlich setzen, aber das war es dann auch.
Sorry hatte einen Denkfehler. Konnte mein Vorhaben jetzt aber auch noch einfacher lösen.
Aber mal eine andere Frage. Wie genau funktioniert das denn eigentlich mit dem Bildupload(z.B. Style-Vorschaubild). Also PHP-Seitig ist mir das klar, aber ich verstehe nicht ganz was ich vom Javascript alles brauche um den Button ordentlich anzuzeigen und einen Dateiupload zu ermöglichen.
https://github.com/WoltLab/WCF…emplates/styleAdd.tpl#L37
https://github.com/WoltLab/WCF…/WCF.ACP.Style.js#L67-162
So schwer ist das nicht zu finden, man muss nur wollen
danke hab ich auch schon entsprechend implementiert. allerdings bekomm ich nun beim bildupload einen fehler "errorMessage: "Der Parameter „className“ fehlt oder ist ungültig."
wo muss der classname denn definiert werden? holt er sich doch sicher aus this._super(this._button, undefined, 'wcf\\data\\style\\StyleAction'); oder irre ich mich?
Ja. Ansonsten einfach mal in die Klasse WCF.Upload schauen, da siehst du dann woher die Variable genommen wird.
okay dann könnte ich mir höchstens vorstellen, dass ich in meiner Action einen Fehler verbaut habe, ich hab hier mal ein bisschen Code, vill hab ich ja was grundlegendes falsch gemacht
Template
<script data-relocate="true">
//<![CDATA[
$(function() {
WCF.Language.addObject({
'wcf.global.button.upload': '{lang}wcf.global.button.upload{/lang}'
});
new Blog.Entry.Picture.ImageUpload({if $action == 'add'}0{else}{@$entryID}{/if}, '{$tmpHash}');
});
//]]>
</script>
Script
Blog.Entry.Picture = { };
Blog.Entry.Picture.ImageUpload = WCF.Upload.extend({
_button: null,
_image: null,
_entryID: 0,
_tmpHash: '',
init: function(entryID, tmpHash) {
this._entryID = parseInt(entryID) || 0;
this._tmpHash = tmpHash;
this._button = $('#uploadImage');
this._image = $('#entryImage');
this._super(this._button, undefined, 'blog\\data\\entry\\PictureAction');
},
_initFile: function(file) {
return this._image;
},
_getParameters: function() {
return {
entryID: this._entryID,
tmpHash: this._tmpHash
};
},
_success: function(uploadID, data) {
if (data.returnValues.url) {
this._image.attr('src', data.returnValues.url);
this._button.next('.innerError').remove();
var $notification = new WCF.System.Notification(WCF.Language.get('wcf.global.success'));
$notification.show();
}
else if (data.returnValues.errorType) {
this._getInnerErrorElement().text(WCF.Language.get('wcf.acp.style.image.error.' + data.returnValues.errorType));
}
},
_getInnerErrorElement: function() {
var $span = this._button.next('.innerError');
if (!$span.length) {
$span = $('<small class="innerError" />').insertAfter(this._button);
}
return $span;
}
});
Display More
Action
class PictureAction extends AbstractDatabaseObjectAction {
const PREVIEW_IMAGE_MAX_HEIGHT = 64;
const PREVIEW_IMAGE_MAX_WIDTH = 102;
protected $className = 'blog\data\entry\PictureAction';
public $entry = null;
public function validateUpload() {
$this->readString('tmpHash');
$this->readInteger('entryID', true);
$this->entry = $this->parameters['entryID'];
if (count($this->parameters['__files']->getFiles()) != 1) {
throw new IllegalLinkException();
}
$this->parameters['__files']->validateFiles(new DefaultUploadFileValidationStrategy(PHP_INT_MAX, array('jpg', 'jpeg', 'png')));
}
public function upload() {
$files = $this->parameters['__files']->getFiles();
$file = $files[0];
try {
if (!$file->getValidationErrorType()) {
$fileLocation = $file->getLocation();
$imageData = getimagesize($fileLocation);
if ($imageData[0] > self::PREVIEW_IMAGE_MAX_WIDTH || $imageData[1] > self::PREVIEW_IMAGE_MAX_HEIGHT) {
try {
$adapter = ImageHandler::getInstance()->getAdapter();
$adapter->loadFile($fileLocation);
$fileLocation = FileUtil::getTemporaryFilename();
$thumbnail = $adapter->createThumbnail(self::PREVIEW_IMAGE_MAX_WIDTH, self::PREVIEW_IMAGE_MAX_HEIGHT, false);
$adapter->writeImage($thumbnail, $fileLocation);
$imageData = getimagesize($fileLocation);
}
catch (SystemException $e) {
throw new UserInputException('image');
}
}
if (@copy($fileLocation, WCF_DIR.'images/entryPreview-'.$this->parameters['tmpHash'].'.'.$file->getFileExtension())) {
@unlink($fileLocation);
WCF::getSession()->register('entryPreview-'.$this->parameters['tmpHash'], $file->getFileExtension());
if ($this->parameters['entryID']) {
return array(
'url' => WCF::getPath().'images/entryPreview-'.$this->parameters['entryID'].'.'.$file->getFileExtension()
);
}
return array(
'url' => WCF::getPath().'images/entryPreview-'.$this->parameters['tmpHash'].'.'.$file->getFileExtension()
);
}
else {
throw new UserInputException('image', 'uploadFailed');
}
}
}
catch (UserInputException $e) {
$file->setValidationErrorType($e->getType());
}
return array('errorType' => $file->getValidationErrorType());
}
}
Display More
Wo bekomme ich denn eine Übersicht aller Icons, die ich so <span class="icon icon16 icon-list"></span> einbinden kann?
Auf der Website des Fonts kannst Du Dir eine Übersicht ansehen. Die Liste ist aber schon auf den Stand 4.0, die es im WCF noch nicht gibt. Teilweise wurden die Namen umbenannt, (bspw. das "fa-" gibt es erst mit 4.x) generell gibt sie aber einen guten Einblick.
Die Dokumentation für die Version 3.2.1 findet sich hier: http://fontawesome.io/3.2.1/icons/
Display MoreIch habe ein Problem mit der UsersOnlineList. Ich kriege es einfach nicht hin, hier einen Filter im Nachinein anzuwenden:
Code$eventObj->objectList->getConditionBuilder()->add('user_table.userID NOT IN (SELECT userID FROM wcf' . WCF_N . '_user_option_value WHERE userOption' . User::getUserOptionID('stopforumspam_userstatus') . ' = ?)', array(2) );
Hier erhalte ich nur die Meldung
Verwende ich statt user_table jedoch session, wird zwar gefiltert, jedoch werden keine Gäste/Bots mehr angezeigt
Jemand eine Idee?!
Die Benutzertabelle heißt doch wcf1_user und nicht user_table, oder hast Du Dir die selbst gebastelt?
user_table ist ein Alias, der eigentlich auch vorhanden ist... Davon abgesehen erhalte ich mit wcf1_user die selbe Fehlermeldung
Die Benutzertabelle heißt doch wcf1_user und nicht user_table, oder hast Du Dir die selbst gebastelt?
Ja, aber der Alias wird auf user_table gesetzt. (Siehe User-Klasse)
Moin,
ich stehe nun vor einem Problem, welches ich vorzugsweise heute noch lösen muss
Ich arbeite ja derzeit am Adventskalender. So weit, so gut. Man kann für jeden der 24 Tage mehrere "Überraschungen" definieren. Auch gut.
Aber... Ich will nun die Auflistung im ACP erstellen, was sich gerade insoweit als problematisch erweist, dass natürlich nicht für jeden Tag etwas eingetragen wurde. Ich möchte jedoch immer alle 24 Tage auflisten und diese Tage dann mit den angelegten Items füllen. Bei den Tagen, wo noch nichts eingetragen wurde, soll eine entsprechende Meldung angezeigt werden.
Ich hab's schon mit Pfuschen versucht, aber davon abgesehen, dass das natürlich kein guter Programmierstil ist, funktioniert das auch nicht:
public function readData() {
parent::readData();
$dayList = array();
foreach(range(1,24) as $day) {
foreach($this->objectList as $object) {
if ($object->itemDay == $day) {
$dayList[$day][] = $object;
}
}
if (!isset($dayList[$day])) {
$dayList[$day] = new AdventCalendarItem(null);
}
}
$this->objectList->objects = $dayList;
}
Display More
Wie könnte ich das am Besten lösen?
Im Template statt foreach eine for-Schleife verwenden?
Der eigentliche Prozess sollte doch besser durchgeführt werden, noch bevor die Objekte an die Page-Klasse übergeben werden, oder nicht?
Der eigentliche Prozess sollte doch besser durchgeführt werden, noch bevor die Objekte an die Page-Klasse übergeben werden, oder nicht?
Wenn du nur Inhalte für ein Jahr darstellen möchtest, ist das der einfachste Weg. Das Template ist schließlich das View und muss doch nicht immer nur aus einer simplen Liste der übergebenen Daten bestehen.
Beim Template bin ich doch noch gar nicht Es geht aktuell doch darum, die Daten aufzubereiten, bevor sie überhaupt zur Verfügung stehen.
Don’t have an account yet? Register yourself now and be a part of our community!