💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ میثم کیانی
abstract نهایی BaseMenu (تغییرات شخصی)
میثم کیانی حل شده توسط میثم کیانی

سلام وقت بخیر، من abstract که برای BaseMenu داشتیم رو کمی کامل ترش کردم و اومدم نسبت به نسخه php 8.3 تکمیلش کردم شاید برای سایر دوستان هم به کار بیاد :

 

<?php
abstract class BaseMenu {
	protected string
		$page_title,
		$menu_title,
		$capability = "manage_options",
		$menu_slug,
		$callback;
	protected string|null $icon_url = null;
	protected string|bool $sub_menu = false;
	protected array $sub_menu_items = [];
	protected int|float|null $position = null;
	public function __construct() {
		add_action( "admin_menu", [ $this, "op_add_menu_page" ] );
	}
	# template create menu
	public function op_add_menu_page(): void {
		add_menu_page(
			$this->page_title,
			$this->menu_title,
			$this->capability,
			$this->menu_slug,
			[ $this, 'index' ],
			$this->icon_url,
			$this->position
		);
	}
	# for create menu
	abstract public function index();
}

 

الان متوجه شدم که کدهارو ناقص گذاشتم. این کد نهایی هست. یک تغییری که داشتم این بود که الان میتونید زمانی که زیر منو دارین متن زیر منوی که تمام اطلاعات رو نمایش میده رو هم عوض کنید. مثل بجای مدیریت کاربران، نوشته باشه همه کاربران :

 

<?php
abstract class BaseMenu {
	protected string
		$page_title,
		$menu_title,
		$capability = "manage_options",
		$menu_slug;
	protected string|null
		$icon_url = null,
		$callback = null;
	protected string|bool $has_sub_menu = false;
	protected array $sub_menu_items = [];
	protected int|float|null $position = null;
	public function __construct() {
		add_action( "admin_menu", [ $this, "op_add_menu_page" ] );
	}
	# template create menu
	public function op_add_menu_page(): void {
		# create submenu
		if ( $this->has_sub_menu ) {
			add_menu_page(
				$this->page_title,
				$this->menu_title,
				$this->capability,
				$this->menu_slug,
				[ $this, 'index' ],
				$this->icon_url,
				$this->position
			);
			// var_dump($this->sub_menu_items);
			foreach ( $this->sub_menu_items as $sub_menu ) {
				add_submenu_page(
					$sub_menu['parent_slug'],
					$sub_menu['page_title'],
					$sub_menu['menu_title'],
					$this->capability,
					$sub_menu['menu_slug'],
					[$this, $sub_menu['callback']],
					$sub_menu['position'],
				);
			}
			# remove list name in admin menu
			remove_submenu_page( $this->menu_slug, $this->menu_slug );
		} else {
			add_menu_page(
				$this->page_title,
				$this->menu_title,
				$this->capability,
				$this->menu_slug,
				[ $this, 'index' ],
				$this->icon_url,
				$this->position
			);
		}
	}
	# for create menu
	abstract public function index();
}

 

به این صورت :

class Users extends BaseMenu {
	public function __construct() {
		$this->page_title = 'صفحه مدیریت کاربران';
		$this->menu_title = 'مدیریت کاربران';
		$this->menu_slug  = 'oop_all_users';
		$this->icon_url   = 'dashicons-businessman';
		$this->position   = '70';
		# add submenu
		$this->has_sub_menu   = true;
		$this->sub_menu_items = [
			'setting_users' => [
				'parent_slug' => $this->menu_slug,
				'page_title'  => 'صفحه تمام کاربران',
				'menu_title'  => 'همه کاربران',
				'menu_slug'   => 'all_users',
				'callback'    => 'all_users',
				'position'    => 1
			],
			'add_user' => [
				'parent_slug' => $this->menu_slug,
				'page_title'  => 'صفحه افزودن کاربر جدید',
				'menu_title'  => 'افزودن کاربر',
				'menu_slug'   => 'add_user',
				'callback'    => 'add_user',
				'position'    => 2
			],
		];
		# for no Conflict parent __construct function
		parent::__construct();
	}
	# TODO: Implement index() method.
	public function index() {
		echo "<h1>مدیریت کاربران</h1>";
	}
	public function all_users(  ) {
		echo "<h1>مدیریت کاربران</h1>";
	}
	# create callback function for submenu
	public function add_user() {
		echo "<h1>اضافه کردن کاربر جدید</h1>";
	}
}
بهترین پاسخ
میثم کیانی ۳۰ آذر ۱۴۰۲، ۱۳:۵۲

موفق باشید.

محسن موحد ۰۲ دی ۱۴۰۲، ۲۳:۳۶