استفاده از ویرایشگر tinymce در php و mysql

استفاده از ویرایشگر tinymce در php و mysql

tinymce در php – در این آموزش با استفاده از html , css , js , php , mysql یک cms ساده را می سازیم که ویرایش محتوای سایت را با ویرایشگر قدرتمند tinymce ویرایش می کنیم .

تشریح اسکریپت ها :

  1. create.php : فرم ایجاد مطلب
  2. edit.php : فرم ویرایش مطلب
  3. process.php : پردازش اطلاعات وارده از فرم ها
  4. list.php : لیست مطالب ایجاد شده
  5. view.php : نمایش اطلاعات کامل مطلب
  6. functions.php : توابع مورد نیاز جهت مدیریت ویژگی های برنامه
  7. app.js : پیکربندی tinymce در جاوا اسکریپت


ویدیوی خروجی برنامه tinymce


1- اسکریپت create.php

<?php require_once "parts/dashboard/header.php";?>

       <?php show_form_error(true);?>

       <form action="process.php" method="post">
            <input type="text" name="title" id="title" placeholder="عنوان" value="<?=form_value('title')?>"><br>
            <textarea name="content" id="content" placeholder="توضیحات"><?=form_value('content')?></textarea>
            <input type="hidden" name="ref" id="ref" value="<?=filename_to_ref(__FILE__)?>">
            <input type="submit" name="save" id="save" value="ثبت">
        </form>


<?php require_once "parts/dashboard/footer.php";?>


2- اسکریپت edit.php

<?php require_once "parts/dashboard/header.php";?>

        <?php show_form_error(true);?>
        <?php $row = $GLOBALS['data_middleware_callback'];?>

        <form action="process.php" method="post">
            <input type="text" name="title" id="title" placeholder="عنوان" value="<?=form_value('title', $row['title'])?>"><br>
            <textarea name="content" id="content" placeholder="توضیحات"><?=form_value('content', $row['content'])?></textarea>
            <input type="hidden" name="ref" id="ref" value="<?=filename_to_ref(__FILE__)?>">
            <input type="hidden" name="id" id="id" value="<?=$_GET['id']?>">
            <input type="submit" name="save" id="save" value="ثبت">
        </form>


<?php require_once "parts/dashboard/footer.php";?>


3- اسکریپت process.php

<?php

require_once __DIR__ . "/inc/functions.php";

if (isset($_POST['ref'])) {
	$ref = $_POST['ref'];
	$body = $_POST;
	$method = "post";
} else if (isset($_GET['ref'])) {
	$ref = $_GET['ref'];
	$body = $_GET;
	$method = "get";
}

$callback = generate_form_handler_callback($method, $ref);

if (is_callable($callback)) {
	$callback($body);
} else {
	die("callback {$callback} not found");
}

?>


4- اسکریپت list.php

<?php require_once "parts/dashboard/header.php";?>


      <h1>لیست مطالب</h1>

     <?php
$rows = $GLOBALS['data_middleware_callback'];

if (isset($rows['id'])) {
	$rows = [$rows];
}

if ($rows):
	foreach ($rows as $row):
	?>

				 <div class="col-4 the-content mt-2">
				      <h2><?=$row['title']?></h2>
				      <div class="actions">
				           <a href="edit.php?id=<?=$row['id']?>" class="text-decoration-none" id="edit-content" title="ویرایش" target="_blank">✎</a>
				      </div>
				      <div class="excerpt"><?=getContentExcerpt($row['content'], 30)?></div>
				      <a class="more-content" href="<?=getViewLinkPost($row['id'])?>" target="_blank">بیشتر</a>
				 </div>

			<?php
endforeach;
else:
	echo get_message_html_template("مطلبی وجود ندارد");
endif;
?>


<?php require_once "parts/dashboard/footer.php";?>

5- اسکریپت view.php

<?php require_once "parts/dashboard/header.php";?>


      <?php $row = $GLOBALS['data_middleware_callback'];?>

     <a href="list.php">لیست مطالب</a>

      <h1><?=$row['title']?></h1>
      <div class="body"><?=$row['content']?></div>


<?php require_once "parts/dashboard/footer.php";?>


6- اسکریپت functions.php

<?php

require_once "db.php";
require_once "constants.php";
require_once "main.php";

function add_to_root_url($path) {
	$final_url = ROOT_URL . "/{$path}";
	return $final_url;
}

function check_old_url_to_cookie() {
	setcookie("old_url", CURRENT_URL, 0);

	if (!isset($_COOKIE['old_url'])) {
		$_COOKIE['old_url'] = "/";
	}
}

function check_form_validation_error() {
	if (($_COOKIE['form_validation_error'] ?? "") != "") {
		$GLOBALS['form_validation_error'] = $_COOKIE['form_validation_error'];
		setcookie('form_validation_error', false, (time() - 10));
	}
}

function check_form_old_value() {

	if (($_COOKIE['form_validation_old_value'] ?? "") != "") {
		$GLOBALS['form_validation_old_value'] = json_decode($_COOKIE['form_validation_old_value'], true);
		setcookie('form_validation_old_value', false, (time() - 10));
	}

}

function check_middleware_callback() {
	$current_script_name = $_SERVER['SCRIPT_NAME'];
	$ref = filename_to_ref($current_script_name);

	$callback = generate_middleware_callback($ref);

	if (is_callable($callback)) {
		$res = $callback();
		$GLOBALS['data_middleware_callback'] = $res;
	}

}

function get_message_html_template($text = null) {
	$str = "<p class=\"bg-danger text-dark\">x-text</p>";

	if ($text) {
		$str = str_replace(['x-text'], [$text], $str);
	}

	return $str;
}

function show_form_error($echo = false, $template = "") {
	$str = "";
	$template = $template ?: get_message_html_template();
	if ($GLOBALS['form_validation_error'] ?? false) {
		$template = str_replace(['x-text'], [$GLOBALS['form_validation_error']], $template);
		$str = trim($template);
	}

	if ($str != "" && $echo) {
		echo $str;
	}

	return $str;
}

function form_value($key, $default = "") {
	return $GLOBALS['form_validation_old_value'][$key] ?? $default;
}

function the_list_of_form_fields() {
	return [
		"create" => [
			"title" => [],
			"content" => [],
		],

		"edit" => [
			"id" => [],
		],
	];
}

function get_page_link_by_name($page_name) {
	$list = the_list_of_form_fields();

	$page_link = "";
	$filename = $list[$page_name] ?? false;
	if ($filename) {
		$the_filename = ref_to_filename($page_name);
		$page_link = "/{$the_filename}";
	}

	return $page_link;
}

function generate_form_handler_callback($method, $ref) {
	return "{$method}_{$ref}_handler";
}

function generate_middleware_callback($ref) {
	return "{$ref}_action_middleware";
}

function filename_to_ref($filename) {
	$the_filename = basename($filename);

	$the_filename_list = explode(".", $the_filename);
	$the_filename = $the_filename_list[0];

	return $the_filename;
}

function ref_to_filename($ref) {
	$filename = "{$ref}.php";
	return $filename;
}

function directTo($address) {
	header("Location: {$address}");
	exit();
}

function directToBack() {
	directTo($_COOKIE['old_url']);
}

function getViewLinkPost($id) {
	return add_to_root_url("view.php?id={$id}");
}

function get_required_form_fields($ref) {
	$list = the_list_of_form_fields();

	$required_list = $list[$ref] ?? false;

	if (!$required_list) {
		die("no required list for {$ref}");
	}

	return $required_list;
}

function handle_required_list(&$body, $list, $autoTriggerValidation = true) {
	$the_list = array_keys($list);
	$empty_list = [];

	foreach ($the_list as $the_key) {
		$value = remove2OrMoreWhitespace($body[$the_key] ?? "");
		if ($value == "") {
			$empty_list[] = $the_key;
		} else {
			$body[$the_key] = $value;
		}
	}

	if ($empty_list && $autoTriggerValidation) {
		$validation_message = join(",", $empty_list) . " خالی می باشد";
		setcookie("form_validation_error", $validation_message, 0);
		setcookie("form_validation_old_value", json_encode($body), 0);
		$filename = ref_to_filename($body['ref']);
		directToBack();
	}

	return $empty_list;
}

function get_edit_link($id) {
	$link = get_page_link_by_name("edit") . "?id={$id}";
	return $link;
}

function checkForRecordOr404($table, $data = [], $whereQuery = [], $message = "Not Found") {
	$row = selectRow($table, $data, $whereQuery);

	if (!$row) {
		die($message);
	}

	return $row;
}

function remove2OrMoreWhitespace($value) {
	$result = trim(preg_replace("/\s{2,}/i", " ", $value));
	return $result;
}

function merge_second_to_first_if_valid($first, $second, $check_list, $baseCheckValid) {

	foreach ($check_list as $element) {
		$the_value = remove2OrMoreWhitespace($second[$element] ?? "");
		$res = $baseCheckValid($the_value);
		if ($res) {
			$first[$element] = $the_value;
		}
	}

	return $first;
}

function getContentExcerpt(string $str, int $word = 5) {
	$tmpStr = trim($str);
	$word = abs($word);
	if ($tmpStr == "") {
		return $str;
	}

	$list = explode(" ", $tmpStr);

	if (count($list) < $word) {
		$word = count($list);
	}

	$tmpStr = array_slice($list, 0, $word);
	$tmpStr = join(" ", $tmpStr);

	return $tmpStr;
}

function abortIfEntityIsInvalid($key, $callback = null) {
	$entity = $_GET[$key] ?? false;

	$callback = $callback ?: function ($item) {
		return $item;
	};

	if (!$callback($entity)) {
		die("{$key} is invalid or empty");
	}

	return $entity;
}

#=========> FORM HANDLERS
function post_create_handler($body) {
	handle_required_list($body, get_required_form_fields($body['ref']));

	$id = insertRow([
		"title" => $body['title'],
		"content" => $body['content'],
	], "tinymce");

	directTo(get_edit_link($id));
}

function post_edit_handler($body) {
	handle_required_list($body, get_required_form_fields($body['ref']));

	$id = $body['id'];
	$row = checkForRecordOr404("tinymce", [$id], "id=?");

	$check_list = array_keys(get_required_form_fields("create"));

	$row = merge_second_to_first_if_valid($row, $body, $check_list, function ($element) {
		return $element != "";
	});

	updateRow([
		"title" => $row['title'],
		"content" => $row['content'],
	], "tinymce", ["keys" => "id=?", "values" => [$id]]);

	directToBack();
}

#=========> END FORM HANDLERS

#=========> MIDDLEWARE CALLBACK
function edit_action_middleware() {
	$id = abortIfEntityIsInvalid("id");

	$row = checkForRecordOr404("tinymce", [$id], "id=?");

	return $row;
}

function list_action_middleware() {

	$row = selectRow("tinymce");

	return $row;
}

function view_action_middleware() {

	$id = abortIfEntityIsInvalid("id");

	$row = checkForRecordOr404("tinymce", [$id], "id=?");

	return $row;
}

#=========> END MIDDLEWARE CALLBACK

?>


7- اسکریپت app.js

window.addEventListener("load" , function(){

	tinymce.init({
        selector: 'textarea#content',
        directionality : "rtl",
            plugins: [
            'a11ychecker','directionality','advlist','advcode','advtable','autolink','checklist','export',
            'lists','link','image','charmap','preview','anchor','searchreplace','visualblocks',
            'powerpaste','fullscreen','formatpainter','insertdatetime','media','table','help','wordcount'
            ],
            toolbar: 'undo redo | ltr rtl | a11ycheck casechange blocks | bold italic backcolor | alignleft aligncenter alignright alignjustify |' +
            'bullist numlist checklist outdent indent | removeformat | code table help',
            language: 'fa'
	}).then(function(tmce){
		
	});

	

	
});


قبل از استفاده از پروژه وارد inc/db.php شده و اطلاعات mysql را وارد کنید سپس وارد پوشه import database شده و دیتابیس را وارد کنید .

دانلود سورس tinymce در php

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

لیست نظرات

  1. مهدی وب نویس
    مهدی وب نویس

    Warning: Undefined array key "REQUEST_SCHEME" in C:\Users\mahdi\Downloads\tinymce_php-mysql-js\inc\constants.php on line 3 سلام دوست عزیز وقتی پرژه را ران میکنم یک همچین قطعه اروری به من میده مشکل چیه ؟

    21 فروردین 1402 | 19:20:48
  • حسین باقری
    حسین باقری

    درود ، باید Apache 2.4 به بعد داشته باشید تا این داده در لیست اعضای سرور قرار بگیره .

    21 فروردین 1402 | 19:41:40
contact us