فرم
فرمها بخش مهمی از سایت را تشکیل میدهند. کاربر از طریق فرم ها اطلاعات مورد نیاز را برای شما ارسال میکند. از جمله مواردی که در زمان کار با فرم ها با آن ها روبرو هستیم میتوان به ارسال خطای اعتبار سنج های انجام شده در کنترلر به view و یا مقدار دهی اولیه به فیلد ها در زمان باز شدن فرم ها اشاره کرد.
در فریمورک کلاس packages\base\views\form
برای مدیریت فرمها و ارتباط بین کنترلر و view ایجاد شده است.
برای کار با فرمها باید کلاس view از کلاس packages\base\views\form
ارث بری کند و یا مخزن ( Trait ) packages\base\views\traits\form
در کلاس view استفاده ( use ) شود.
نمونه کلاس view : ارث بری از کلاس
<?php
namespace themes\themename\views;
use packages\base\views\Form;
class ContactUs extends Form {
}
نمونه کلاس view : معرفی traits
<?php
namespace themes\themename\views;
use packages\base\View;
use packages\base\views\traits\Form;
class ContactUs extends View {
use Form;
}
مشخص کردن فیلدهای دارای خطا
متد setFormError()
فیلدهای دارای خطا را برای ارسال به view مشخص میکند.
آرگومان ورودی این متد شئ از کلاس packages\base\views\FormError
میباشد.
این متد در کنترلر برای ارسال فیلدهای دارای خطا به view صدا زده میشود .
نمونه فایل کنترلر
<?php
namespace packages\packagename\controllers;
use packages\packagename\User as Model;
use themes\themename\views\packagename as views;
use packages\base\{Controller, Response, View, InputValidationException, Password};
class Main extends controller {
public function login(): Response {
$view = View::byName(views\Login::class);
$this->response->setView($view);
$inputRules = array(
"username" => array(
"type" => "email",
),
"password" => array()
);
try {
$this->response->setStatus(false);
$inputs = $this->checkinputs($inputRules);
$model = new Model();
$model->where("email", $inputs["username"]);
$user = $model->getOne()
if (!$user) {
throw new inputValidationException("username");
}
if (Password::verify($inputs["password"], $this->password)) {
throw new inputValidationException("password");
}
Session::set("login", true);
Session::set("userID", $user->id);
$this->response->setStatus(true);
$this->response->Go(base\url("userpanel"));
} catch(InputValidationException $error) {
$view->setFormError(FormError::fromException($error));
}
return $this->response;
}
}
در مثال فوق اگر داده های دریافتی نامعتبر باشند استثنا InputValidationException پرتاب میشود. در catch متد setFormError فراخوانی شده و فیلد دارای خطا را به عنوان ورودی دریافت میکند.
عملیات تبدیل استثنا های packages\base\InputValidationException
و packages\base\db\DuplicateRecord
به خطاهای فرم توسط فرم ورک به صورت خودکار انجام شده و لازم به نوشتن آن توسط برنامه نویس نیست.
برای ا طلاعات بیشتر از اعتبارسنجی به صفحه اعتبارسنجی مراجعه کنید.
دریافت فیلدهای دارای خطا
متدهای getFormErrors()
و getFormErrorsByInput($input)
برای دریافت خطاهای ثبت شده تعریف شدهاند.
متد getFormErrors
آرگومان ورودی دریافت نمیکند.
خروجی این متد آرایهای از شئ کلاس packages\base\views\FormError
میباشد که فیلدهای دارای خطا را مشخص میکند.
متد getFormErrorsByInput
نام فیلد مورد نظر را در ورودی دریافت میکند و خروجی این متد اگر فیلد دارای خطا باشد شئ از کلاس packages\base\views\FormError و اگر خطا نداشته باشد false است.
مثال
<form action="" method="post">
<?php
$fnameError = $this->getFormErrorsByInput('fname');
$lnameError = $this->getFormErrorsByInput('lname');
$socialNumberError = $this->getFormErrorsByInput('social_number');
?>
<div class="form-group <?php echo $fnameError ? 'has-error' : ''; ?>">
<label class="control-label" for="fname"><?php echo t("fname"); ?></label>
<input type="text" name="fname" id="fname" class="form-control">
<?php
if($fnameError) {
$text = $fnameError->getMessage();
if (!$text) {
$text = t($fnameError->getCode());
}
echo "<span class=\"help-block\" >{$text}</span>";
}
?>
</div>
<div class="form-group <?php echo $lnameError ? 'has-error' : ''; ?>">
<label class="control-label" for="lname"><?php echo t("lname"); ?></label>
<input type="text" name="lname" class="form-control">
<?php
if($lnameError) {
$text = $lnameError->getMessage();
if (!$text) {
$text = t($lnameError->getCode());
}
echo "<span class=\"help-block\" >{$text}</span>";
}
?>
<div class="form-group <?php echo $socialNumberError ? 'has-error' : ''; ?>">
<label class="control-label" for="social_number"><?php echo t("social_number"); ?></label>
<input type="text" name="social_number" class="form-control">
<?php
if($socialNumberError) {
$text = $socialNumberError->getMessage();
if (!$text) {
$text = t($socialNumberError->getCode());
}
echo "<span class=\"help-block\" >{$text}</span>";
}
?>
</div>
</form>
در مثال فوق اگر هر کدام از فیلد ها دارای خطا باشند کلاس has-error به آن فیلد داده میشود. (که بطور مثال کادر فیلد قرمز شده و کاربر متوجه خطا در فیلد شود.)
همچنین میتوانید علت خطای به وجود آماده را نمایش دهید. با فراخوانی متد getMessage
میتوانید در صورتیکه متن خطا در آن ذخیره شده باشد، آن را دریافت و نمایش دهید. همچنین میتوانید برای هر کد خطا یک ترجمه افزوده و آن را از طریق مترجم نمایش دهید.
نکته: میتوانید کد خطا را دریافت کرده و با توجه به آن متن دلخواه خودرا نمایش دهید و استفاده از مترجم ( حتی در زمانیکه سایت شما تک زبانه است ) فقط برای کوتاه کردن کد ها و یکدست کردن خطا ها پیشنهاد شده است.
<?php
namespace packages\packagename\controllers;
use function packages\base\url;
use packages\packagename\Trip\Signup as Model;
use themes\themename\views\packagename\Trips as views;
use packages\base\{Controller, Response, View, InputValidationException, db\DuplicateRecord};
class Trips extends Controller {
public function signup(): Response {
$view = View::byName(views\Signup::class);
$this->response->setView($view);
$inputs = $this->checkInputs(array(
"fname" => array(
"type" => "string",
),
"lname" => array(
"type" => "string",
),
"social_number" => array(
"type" => "string",
),
));
if (strlen($inputs["social_number"]) < 10) {
throw new InputValidationException("social_number");
}
$model = new Model();
$model->where("social_number", $inputs["social_number"]);
if ($model->has()) {
throw new DuplicateRecord("social_number");
}
$model = new Model();
$model->name = $inputs["fname"];
$model->last_name = $inputs["lname"];
$model->social_number = $inputs["social_number"];
$model->save();
$this->response->Go(url("trips/signup/{$model->id}/overview"));
$this->response->setStatus(true);
return $this->response;
}
}
کد های استثناها
کد | استثنا |
---|---|
data_validation | packages\base\InputValidationException |
data_duplicate | packages\base\db\DuplicateRecord |
نمونه فایل مترجم
{
"rtl": true,
"phrases": [
"data_validation": "داده وارد شده معتبر نیست",
"data_duplicate": "داده وارد شده تکراری میباشد"
]
}
برای اطلاعات بیشتر به صفحه مترجم و خطاها در قالب مراجعه کنید.