Guten Tag,
Ich arbeite momentan an einer Form Page. Die Übergabe von Werten funktioniert, ich möchte aber unter anderem doppelte und zu kurze/lange Einträge unterbinden.
Ich habe mich an der RegisterForm.class.php und der register.tpl orientiert und dementsprechend unter anderem folgende Dateien angelegt/kopiert/angepasst:
<dl{if $errorField == 'valuename'} class="formError"{/if}>
<dt><label for="valuename">{lang}wcf.values.overview.name{/lang}</label></dt>
<dd>
<input type="text" id="valuename" name="valuename" value="{$valuename}" class=""/>
{if $errorField == valuename}
<small class="innerError">
{lang}wcf.user.username.error.notValid{/lang}
</small>
{/if}
</dd>
</dl>
Display More
<?php
namespace Values\form;
use Values\data\value\Value;
use Values\data\value\ValueAction;
use Values\data\value\ValueEditor;
use Values\util\ValueUtil;
use wcf\form\AbstractForm;
use wcf\page\AbstractPage;
use wcf\system\WCF;
use wcf\util\HeaderUtil;
use wcf\util\StringUtil;
use wcf\system\request\LinkHandler;
use wcf\system\exception\UserInputException;
class ValueCreateForm extends AbstractForm {
public $valuename = '';
public $formData = array(
'valuename' => '',
);
public function readFormParameters() {
parent::readFormParameters();
if (isset($_POST['valuename'])) {
$this->formData['valuename'] = StringUtil::trim($_POST['valuename']);
}
}
/**
* Throws a UserInputException if the valuename is not unique or not valid.
*
* @param string $valuename
*/
protected function validateValuename($valuename) {
if (empty($valuename)) {
throw new UserInputException('valuename');
}
// check for forbidden chars (e.g. the ",")
if (!ValueUtil::isValidValuename($valuename)) {
throw new UserInputException('valuename', 'notValid');
}
// Check if valuename exists already.
if (!ValueUtil::isAvailableValuename($valuename)) {
throw new UserInputException('valuename', 'notUnique');
}
}
public function save() {
parent::save();
$data = array(
'data' => array(
'valueName' => $this->formData['valuename'],
),
);
$action = new ValueAction(array(), 'create', $data);
$action->executeAction();
HeaderUtil::delayedRedirect(LinkHandler::getInstance()->getLink('Index', array(
'application' => 'values'
)),WCF::getLanguage()->get('wcf.values.add.successfulRedirect'), 10);
exit;
}
public function assignVariables() {
parent::assignVariables();
WCF::getTPL()->assign(array(
'formData' => $this->formData,
'valuename' => $this->valuename
));
}
}
Display More
<?php
namespace values\util;
use wcf\system\WCF;
final class ValueUtil {
/**
* Returns true if the given name is a valid name.
*
* @param string $name
* @return boolean
*/
public static function isValidValuename($name) {
// minimum length is 2 characters, maximum length is 32 characters
if (mb_strlen($name) < 2 || mb_strlen($name) > 32) {
return false;
}
// check illegal characters
if (!preg_match('!^[^,\n]+$!', $name)) {
return false;
}
return true;
}
/**
* Returns true if the given valuename is available.
*
* @param string $name
* @return boolean
*/
public static function isAvailableValuename($name) {
$sql = "SELECT COUNT(valuename) AS count
FROM values1_values
WHERE valuename = ?";
$statement = WCF::getDB()->prepareStatement($sql);
$statement->execute(array($name));
$row = $statement->fetchArray();
return $row['count'] == 0;
}
}
Display More
Allerdings funktioniert es nicht und ich kann sowohl einstellige Werte als auch Duplikate per Form in die Datenbank hinzufügen.
Ich vermute er ruft validateValuename erst gar nicht auf, allerdings erschließt sich mir nicht wieso, da ich mich ja an obig genannten Dateien orientiert habe.
Also habe ich wohl irgendwo etwas falsch gemacht und wollte nun hier fragen, ob mich jemand erleuchten kann, was genau ich vergessen habe bzw. falsch gemacht habe.
Viele Grüße
Trollgon