Site icon Gordarg Blog

SnowFramework CRUD: How to develop database records management from admin dashboard?

Step 1: A sample controller be like


<?php

class DashboardController extends Controller
{

	// این تابع در هنگام درخواست یک صفحه
	// جهت نمایش، اجرا می‌شود.
	// در این تابع، توابعی اجرا می‌شوند که وظیفه‌ی
	// احراز هویت، ارتباط با پایگاه‌داده، و پردازش خروجی
	// را بر عهده دارند.
	function LandingsGET()
	{
		// $this->Auth();
		$uow = new UnitOfWork();
		$rows = $uow->selectLandings();
		$this->Render('Landings', [
			'Title' => _AppName . ' | مدیریت صفحات فرود',
			'Rows' => $rows
		]);
	}
	// فرمی برای ورود اطلاعات لندینگ جدید یا ویرایش اطلاعات لندینگ قبلی
	// نمایش داده می‌شود. به مدت این تابع دقت کنید که اطلاعات را به
	// کاربر می‌فرستد. و اطلاعات فرم را دریافت نمی‌کند. دریافت اطلاعات
	// از فرم، در هنگام کلیک بر روی دکمه‌ی ذخیره‌سازی، از تابعی با نام مشابه
	// اما متد پُست استفاده می‌شود.
	function LandingGET($id = null)
	{
		// $this->Auth();
		if (is_null($id)) {
			$this->Render('Landing', [
				'Title' => _AppName . ' | صفحه فرود جدید',
			]);
		} else {
			$uow = new UnitOfWork();
			$row = $uow->selectLanding($id);
			$this->Render('Landing', [
				'Title' => _AppName . ' | ویرایش صفحه‌ی فرود',
				'Row' => $row
			]);
		}
	}
	// این تابع، مسول دریافت کردن اطلاعات ارسال شده در
	// فرم توسط کاربر است. و سپس نسبت به موقعیت، می‌فهمد که
	// باید آیتم جدید ایجاد کند یا قبلی را ویرایش کند.
	// سپس کاربر را به صفحه‌ی اول مدیریت این بخش بر می‌گرداند.
	function LandingPOST($id = null)
	{
		$uow = new UnitOfWork();
		if (isset($_POST['insert'])) {
			$uow->insertLanding($_POST);
			$this->RedirectResponse(_Root . 'Dashboard/Landings?msg=آیتم جدید ایجاد شد');
		} else if ($_POST['update']) {
			$uow->updateLanding($_POST);
			$this->RedirectResponse(_Root . 'Dashboard/Landings?msg=آیتم ویرایش شد');
		} else if ($_POST['delete']) {
			$uow->deleteLanding($_POST);
			$this->RedirectResponse(_Root . 'Dashboard/Landings?msg=آیتم حذف شد');
		}
	}

}

Step 2: In the UnitOfWork class we have

<?php

class UnitOfWork
{
        function selectLandings() // انتخاب همه
	{
		$sql = <<<EOF
			SELECT * FROM LANDINGS ORDER BY `Id` DESC;
		EOF;

		$output = [];

		$ret = $this->db->query($sql);
		while ($row = $ret->fetchArray(SQLITE3_ASSOC))
			array_push($output, $row);

		return $output;
	}
	function selectLanding($Id) // انتخاب یک آیتم تنها
	{
		$id = $this->preventInjection($Id);

		$sql = <<<EOF
			SELECT * FROM LANDINGS WHERE `Id`=$id LIMIT 1;
		EOF;

		$ret = $this->db->query($sql);
		return $ret->fetchArray(SQLITE3_ASSOC);
	}
	function insertLanding($inputs)
	{
		foreach ($inputs as $key => $value)
			$inputs[$key] = $this->preventInjection($value);

		$title = $inputs['title'];
		$excerpt = $inputs['excerpt'];
		$slug = $inputs['slug'];
		$innerHtml = $inputs['innerHtml'];

		$sql = <<<EOF
			INSERT INTO LANDINGS (Title,Excerpt,Slug,InnerHtml)
			VALUES ('$title','$excerpt','$slug','$innerHtml');
		EOF;

		$ret = $this->db->exec($sql);
		if (!$ret)
			throw new Exception($this->db->lastErrorMsg());
	}
	function updateLanding($inputs)
	{
		foreach ($inputs as $key => $value)
			$inputs[$key] = $this->preventInjection($value);

		$id = $inputs['id'];
		$title = $inputs['title'];
		$excerpt = $inputs['excerpt'];
		$slug = $inputs['slug'];
		$innerHtml = $inputs['innerHtml'];

		$sql = <<<EOF
				UPDATE LANDINGS SET
				Title='$title',Excerpt='$excerpt',
				Slug='$slug',InnerHtml='$innerHtml'
				WHERE `Id`=$id
			EOF;

		$ret = $this->db->exec($sql);
		if (!$ret)
			throw new Exception($this->db->lastErrorMsg());
	}
	function deleteLanding($inputs)
	{
		$id = $this->preventInjection($inputs['id']);

		$sql = <<<EOF
			DELETE FROM LANDINGS WHERE `Id`=$id
		EOF;

		$ret = $this->db->exec($sql);
		if (!$ret)
			throw new Exception($this->db->lastErrorMsg());
	}
}

Step 3: And finally for the views

Item.php

<?php
if (isset($Data['Row'])) {
    $u = true;
    $row=$Data['Row'];
}
?>
<form method="post">
    <label for="title">عنوان صفحه</label>
    <input type="text" name="title" value="<?php echo $u ? $row['Title'] : '' ?>">
    <label for="slug">آدرس</label>
    <input type="text" name="slug" value="<?php echo $u ? $row['Slug'] : '' ?>">
    <label for="excerpt">خلاصه</label>
    <input type="text" name="excerpt" value="<?php echo $u ? $row['Excerpt'] : '' ?>">
    <label for="innerHtml">محتوا</label>
    <textarea name="innerHtml"><?php echo $u ? $row['InnerHtml'] : '' ?></textarea>
    <?php if (!isset($u)) : ?>
        <input type="submit" name="insert" value="ذخیره">
    <?php else : ?>
        <input type="hidden" name="id" value="<?php echo $u ? $row['Id'] : '' ?>">
        <input type="submit" name="update" value="به روز رسانی">
        <input type="submit" name="delete" value="حذف">
    <?php endif; ?>
    <a href="<?php echo _Root ?>Dashboard/Landings">انصراف</a>
</form>

Items.php

<?php
// دریافت اطلاعات ارسال شده از کنترلر و قراردادن آن در یک متغیر.
// اطلاعات ارسال شده از کنترلر مربوطه در متغیر $Data ذخیره می‌شوند
// برای دسترسی ساده‌تر آن‌را در متغیر $rows قرار می‌دهیم.
$rows = $Data['Rows'];
?>

<table>
    <caption style="caption-side:bottom"><a href="<?php echo _Root ?>Dashboard/Landing">صفحه جدید</a></caption>
    <thead>
        <tr>
            <th>#</th>
            <th>عنوان</th>
        </tr>
    </thead>
    <?php foreach ($rows as $row) :
            $row =  [
                _Root . 'Dashboard/Landing',
                $row['Id'],
                $row['Title']
            ];
            echo sprintf('<tr><td><a href="%s/%d">ویرایش</a></td><td>%s</td></tr>', ...$row);
        endforeach; ?>
    </tbody>
    <tfoot>
        صفحات
    </tfoot>
</table>
Exit mobile version