رفتن به مطلب
وحید حاجی پور

نگاهی بر پلاگین نویسی در جوملا

پست های پیشنهاد شده

سلام دوستان همانطور که قول داده بودم می خوام نحوه ساخت پلاگین برای زرین پال رو و افزودن یک button در بخش tinymce رو اینجا آموزش بدم امیدوارم که از این مطلب استقبال بشه .

کاری که قرار این پلاگین انجام بده شما می تونید داخل اش قیمت نام محصول کد محصول و شماره حساب زرین پال رو وارد کنید .

بعد یک لینک ایجاد می کنه که کاربر شما می تونه با کلیک بر روی اون وارد بخش خرید زرین پال بشه . امیدوارم که بتونم این کار رو انجام بدم.

چون این کارم ترجمه نیست و دارم شخصا این کار رو می کنم یکم مثلا شاید دو یا سه روز طول بکشه موفق باشید

برای ساخت این پلاگین در ابتدا به دو فایل نیاز داریم

1- فایل XML

2- یک فایل PHP

از فایل XML برای نصب پلاگین استفاده خواهیم کرد

و از فایل پی اچ پی به عنوان اجرای فرامین مورد نیاز.

این دو فایلی که من در نظر گرفتم با نام های

Zarinpal_button.php

Zarinpal_button.XML

هستند

اگر بعدا فایلی هم اضافه شد مثلا کلاس خواصی نیاز داشتیم در حین آموزش ذکر می کنیم .

خوب دوستان در اینجا نمونه کد XML که نیاز داریم رو می بینید که فکر کنم دوستان با هاش برخورد کرده باشند .

بخش هاش واضح هست اش ولی اگر سوالی بود می تونید بپرسید.


<?xml version="1.0" encoding="utf-8"?>

Button - Zarinpal
August 22, 2011
barnamenevisan, LLC
admin@barnamenevisan.ir
http://www.barnamenevisan.ir
(C)2010 - 2011 Barnamenevisan, LLC. All rights reserved.
http://www.gnu.org/copyleft/gpl.html GNU/GPL
1.3
این پلاگین شمارو در اتصال مشتریان به زرین پال کمک خواهد کرد.در صورت داشتن پیشنهادی برای افزودن بخشی به این پلاگین از طریق ایمیل ما اقدام کنید.
   admin@barnamenevisan.ir


Zarinpal_button.php




خوب دوستان زمانی که ما می خواهیم یک پلاگین رو بنویسیم یک سری رخداد یا event های وجود دارد که باید نحوه کار با آن رو بدونیم

مثلا رخداد هایی که مربوط به ادیتور یا همون ویرایشگر می شوند رو می تونید در زیر ببینید.

onCustomEditorButton

onInitmall

onDisplay

onGetContent

onSetContent

onSave

onGetInsertMethod

و رخداد هایی که مربوط به محتوا هستند

onGetInsertMethod

onAfterDisplayTitle

onBeforeDisplayContent

onAfterDisplayContentmall

onBeforeContentSave

onAfterContentSave

فکر کنم برای نوشتن پلاگین این رخداد ها کافی باشه .

می خواهیم ببینیم کار این رخداد ها چیست و چگونه می توان از آنها استفاده کرد.

دوستان کامپوننت این پلاگین تموم شد انشا الله اگر پلاگین هم تموم شه کد هاش رو یکی یکی تحلیل خواهیم کرد.

در ارسال بعدی به این مطلب خواهیم پرداخت

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام دوستان ببخشید اقای بد قول برگشت

بازم شرمنده یکم طول کشید



<?php 
defined('_JEXEC') or die('restricted access');

jimport('joomla.plugin.plugin');
class plgContentbook extends JPlugin
{
var $path=JPATH_PLUGINS;
var $id;



//--------------------------تابع اصلی  پلاگین --------------------    


function onPrepareContent(&$article, &$params, $limitstart = 0)
  { 




//------------------------------جدا کردن کد از متن اصلی---------------------
		  // Simple performance check to determine whether bot should process further
		  if($first=strpos($article->text, '{zarinjoomina') )
		  {
		  $middle=strpos($article->text, '-');

		  $end=strpos($article->text, '}');

		  $pattern = '';
		  $replace = '';


		  $id=substr($article->text,$middle+1,$end-$middle-1);
		  $this->id=$id;


//------------------تولید کد جایگزین---------------------------   
//------------------- فرمت کلی بخش قابل نمایش برای مشتری 
 $replace="  

کد کالا:		".$this->getdbdata('proid')." 



نام کالا:	   ".$this->getdbdata('proname')."




قیمت:		   ".$this->getdbdata('proprice')."




قیمت قبلی:	    ".$this->getdbdata('prolprice')."




توضیحات:	    ".$this->getdbdata('prodes')."




		 ";
 if ($this->getdbdata('showperzarinpal')) 
	   $replace.= 
		  "    

درصد زرین پال		".$this->getdbdata('perzarin')."


		";	  
if ($this->getdbdata('showpermaliat')) 
	   $replace.= 
		  "    

  درصد مالیات:		  ".$this->getdbdata('permaliat')."


		";
if ($this->getdbdata('showsendprice')) 
	   $replace.= 
		  " 

  هزینه ارسال :	    ".$this->getdbdata('sendprice')."


		";					   

 $replace.="   

مبلغ پرداختی:		".$this->getdbdata('total')."


		"; 
 $replace.="";			
//-------------------پایان بخش قابل نمایش برای مشتری-------------------			  
$pro_des='نام محصول: '.$this->getdbdata('proname').'

کد محصول: '.$this->getdbdata('proid').'

شرح محصول: '.$this->getdbdata('prodes').'

قیمت: '.$this->getdbdata('proprice').'';		

$replace.='












';		    



$var ="{zarinjoomina-$id}";


//------------------------------جایگزاری کد در متن اصلی-------------------
$article->text=str_replace($var,$replace,$article->text);

  return true;
}

}


function getdbdata($cell)

{

 $prodata=$this->getdata($this->id);

 $config=$this->getdata_c(1); 

  //---------------------استخراج اطلاعات از دیتابیس------------------
		foreach($prodata[0] as $key[]=>$data[]);








	    $pro_id	=$data[0];
	    $pro_name   =$data[1];
	    $pro_price  =$data[2];
	    $pro_l_price=$data[3];
	    $pro_des    =$data[4];


		foreach($config[0] as $key1[]=>$datac[]);

	    $id_c			=$datac[0];
	    $acc_number_c	  =$datac[1];
	    $per_zarin_c	   =$datac[2];
	    $per_maliat_c	  =$datac[3];
	    $send_price_c	  =$datac[4];
	    $s_zarinpal_price_c =$datac[5];
	    $s_maliatprice_c    =$datac[6];
	    $s_sendprice_c	 =$datac[7];
	    $s_totalpris_c	 =$datac[8];
	    $redirect_link_c    =$datac[9];

switch ($cell){    

    case 'proid':		 return $data[0];
					   break;
    case 'proname':	    return $data[1];
					   break;
    case 'proprice':	   return $data[2];
					   break;
    case 'prolprice':	  return $data[3];
					   break;
    case 'prodes':		return $data[4];
					   break;
    case 'idconfig':	   return $datac[0];
					   break;
    case 'accnumber':	  return $datac[1];
					   break;
    case 'perzarin':	   return $datac[2];
					   break;
    case 'permaliat':	   return $datac[3];
					   break;
    case 'sendprice':	  return $datac[4];
					   break;
    case 'showzarinprice':  return $datac[5];
					   break; 
    case 'showmaliatprice': return $datac[6];
					   break;
    case 'showsendprice':  return $datac[7];
					   break;
    case 'showtotal':	  return $datac[8];
					   break;							 
    case 'redirect':	   return $datac[9];
					   break;    
	case 'total':		 return round(  $pro_price+$pro_price*$per_zarin_c /100+$pro_price * $per_maliat_c/100 +  $send_price_c); 
    default:			 return "-----";    
	   }






}
	   function getdata($id)
		  {


			 $db1=&JFactory::getDBO();
			 $query=" SELECT * FROM #__zarinpal where id=$id ";
			 $db1->setQuery($query);
			 $result=$db1->loadObjectList();
			 return $result;
		  }


		  //------------------------ اتصال به دیتا بیس---------------
		  function getdata_c()
		  {


			 $db2=&JFactory::getDBO();
			 $query="select * from #__zarinpal_c where id=1";
			 $db2->setQuery($query);
			 $result=$db2->loadObjectList();
			 return $result;
		  }


}

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام می ریم سراغ تحلیل این پلاگین .

کار این پلاگین اینه که مقدار موجود در دیتا بیس رو با {zarinjoomina-22} جایگذین کنیم .

برای پیدا کردن این کلمه در مطلب باید مطلب جستجو بشه و این عبارت پیدا بشه بعد از این که این عبارت پیدا شد جداسازی بشه یعنی عدد که مربوط به شماره کالا هست جدا بشه تا کالای مورد نظر از روی دیتا بیس فچ شده و به نمایش در بیاد.

خوب برای استخراج اطلاعات از دیتابیس ما دو تابع نوشتیم که اطلاعات مربوط به دو جدول رو برای ما استخراج کنند .


function getdata($id)
	    {
 //------------------------ اتصال به دیتا بیس---------------	 

		  $db1=&JFactory::getDBO();
		  $query=" SELECT * FROM #__zarinpal where id=$id ";
		  $db1->setQuery($query);
		  $result=$db1->loadObjectList();
		  return $result;
	    }



	    function getdata_c()
	    {


		  $db2=&JFactory::getDBO();
		  $query="select * from #__zarinpal_c where id=1";
		  $db2->setQuery($query);
		  $result=$db2->loadObjectList();
		  return $result;
	    }

خوب قبلا با کلاس jfactory در نگاهی بر کامپوننت نویسی اشنا شدیم.

از این کلاس برای ایجاد یک شی از نوع دیتابیس استفاده می کنیم.که در اینجا دو شی db1 db2 را ایجاد کردیم .

سپس عبارت اسکیو ال مورد نظر را نوشته ایم و توسط تابع setquery ان را اجرا کرده ایم و بعد از ان با تابع loadobjectlist نتیجه را در result ذخیره کرده ایم و با استفاده از return آن را به جایی که فراخوانی شده است ارسال می کنیم .

این دو تابع دقیقا مثل هم هستند.

تابع بعدی تابع getdata است که یک ورودی دریافت می کند که این ورودی نامی است که برای هر سلول دیتا بیس درون این تابع در نظر گرفته شده است و ورودی ان در بخش case استفاده می شود که از توابع دو تابع بالایی استفاده می کند و هر کدام از انها لازم بود ان را اجرا کرده و مقدار را به بخشی که فراخوانی شده است ارسال می کند .


function getdbdata($cell)

{

$prodata=$this->getdata($this->id);

$config=$this->getdata_c(1);

  //---------------------استخراج اطلاعات از دیتابیس------------------
	  foreach($prodata[0] as $key[]=>$data[]);








	  $pro_id    =$data[0];
	  $pro_name   =$data[1];
	  $pro_price  =$data[2];
	  $pro_l_price=$data[3];
	  $pro_des    =$data[4];


	  foreach($config[0] as $key1[]=>$datac[]);

	  $id_c		  =$datac[0];
	  $acc_number_c	 =$datac[1];
	  $per_zarin_c	  =$datac[2];
	  $per_maliat_c	 =$datac[3];
	  $send_price_c	 =$datac[4];
	  $s_zarinpal_price_c =$datac[5];
	  $s_maliatprice_c    =$datac[6];
	  $s_sendprice_c	=$datac[7];
	  $s_totalpris_c	=$datac[8];
	  $redirect_link_c    =$datac[9];

switch ($cell){   

   case 'proid':	    return $data[0];
				  break;
   case 'proname':	   return $data[1];
				  break;
   case 'proprice':	  return $data[2];
				  break;
   case 'prolprice':	 return $data[3];
				  break;
   case 'prodes':	   return $data[4];
				  break;
   case 'idconfig':	  return $datac[0];
				  break;
   case 'accnumber':	 return $datac[1];
				  break;
   case 'perzarin':	  return $datac[2];
				  break;
   case 'permaliat':	  return $datac[3];
				  break;
   case 'sendprice':	 return $datac[4];
				  break;
   case 'showzarinprice':  return $datac[5];
				  break;
   case 'showmaliatprice': return $datac[6];
				  break;
   case 'showsendprice':  return $datac[7];
				  break;
   case 'showtotal':	 return $datac[8];
				  break;					   
   case 'redirect':	  return $datac[9];
				  break;   
   case 'total':	    return round(  $pro_price+$pro_price*$per_zarin_c /100+$pro_price * $per_maliat_c/100 +  $send_price_c);
   default:		   return "-----";   
	 }


   }

این دستور

$prodata=$this->getdata($this->id);

$this->id

این یک متغییر است که درون کلاس ایجاد شده تا در بخش های مختلف بشه از اون استفاده کرد کار این نگهدای ایدی است که از {zarinjoomina-22} استخراج شده است و در این بخش این ایدی تابع getdata ارسال می شه تا مشخص بشه که مشخصات چه کالایی باید از دیتا بیس نمایش داده بشه . و سپس خروجی و نتیجه و مشخصات کالا در prodata به صورت یک ارایه ذخیره می شود .

$config=$this->getdata_c(1);

این کد نیز مانند کد بالاست با این تفاوت که اینجا یک مقدار بیشتر ندارد و ان هم یک است چون مشخصات مربوط به پرداخت ها یکی بیشتر نبودهاست و در سطر اول دیتابیس ذخیره شد ه است .

و این اطلاعات نیز در config ذخیره می شود .

اطلاعات به وسیله یک for درون متغییر هایی ریخته می شوند که از لحاظ نام قابل تشخیص تر باشند و برای ما ملموس تر باشند .


foreach($prodata[0] as $key[]=>$data[]);

اطلاعات در خانه های ارایه data ذخیره می شود .

و سپس مقادیر به متغییر های مورد نظر داده می شود اینکار تنها برای افزایش خوانایی برنامه بوده است .

$id_c		  =$datac[0];
	  $acc_number_c	 =$datac[1];
	  $per_zarin_c	  =$datac[2];
	  $per_maliat_c	 =$datac[3];
	  $send_price_c	 =$datac[4];
	  $s_zarinpal_price_c =$datac[5];
	  $s_maliatprice_c    =$datac[6];
	  $s_sendprice_c	=$datac[7];
	  $s_totalpris_c	=$datac[8];
	  $redirect_link_c    =$datac[9];

و سوئیچ نیز برای این به کار رفته است که تابع مورد نظر برای هر مقدار اجرا شود


switch ($cell){   

   case 'proid':	    return $data[0];
				  break;
   case 'proname':	   return $data[1];
				  break;
   case 'proprice':	  return $data[2];
				  break;
   case 'prolprice':	 return $data[3];
				  break;
   case 'prodes':	   return $data[4];
				  break;
   case 'idconfig':	  return $datac[0];
				  break;
   case 'accnumber':	 return $datac[1];
				  break;
   case 'perzarin':	  return $datac[2];
				  break;
   case 'permaliat':	  return $datac[3];
				  break;
   case 'sendprice':	 return $datac[4];
				  break;
   case 'showzarinprice':  return $datac[5];
				  break;
   case 'showmaliatprice': return $datac[6];
				  break;
   case 'showsendprice':  return $datac[7];
				  break;
   case 'showtotal':	 return $datac[8];
				  break;					   
   case 'redirect':	  return $datac[9];
				  break;   
   case 'total':	    return round(  $pro_price+$pro_price*$per_zarin_c /100+$pro_price * $per_maliat_c/100 +  $send_price_c);
   default:		   return "-----";   
	 }

خوب در اخر هم می رسیم به تابع اصلی



function onPrepareContent(&$article, &$params, $limitstart = 0)
  {




//------------------------------جدا کردن کد از متن اصلی---------------------
	    // Simple performance check to determine whether bot should process further
	    if($first=strpos($article->text, '{zarinjoomina') )
	    {
	    $middle=strpos($article->text, '-');

	    $end=strpos($article->text, '}');

	    $pattern = '';
	    $replace = '';


	    $id=substr($article->text,$middle+1,$end-$middle-1);
	    $this->id=$id;


//------------------تولید کد جایگزین--------------------------- 
//------------------- فرمت کلی بخش قابل نمایش برای مشتری
 $replace=" 

کد کالا:	   ".$this->getdbdata('proid')." 



نام کالا:	  ".$this->getdbdata('proname')."




قیمت:		 ".$this->getdbdata('proprice')."




قیمت قبلی:	   ".$this->getdbdata('prolprice')."




توضیحات:	   ".$this->getdbdata('prodes')."




	   ";
 if ($this->getdbdata('showperzarinpal'))
	 $replace.=
	    "   

درصد زرین پال	   ".$this->getdbdata('perzarin')."


	  ";    
if ($this->getdbdata('showpermaliat'))
	 $replace.=
	    "   

  درصد مالیات:		".$this->getdbdata('permaliat')."


	  ";
if ($this->getdbdata('showsendprice'))
	 $replace.=
	    "

  هزینه ارسال :	   ".$this->getdbdata('sendprice')."


	  ";				 

 $replace.=" 

مبلغ پرداختی:	   ".$this->getdbdata('total')."


	  ";
 $replace.="";		 
//-------------------پایان بخش قابل نمایش برای مشتری-------------------		   
   $pro_des='نام محصول: '.$this->getdbdata('proname').'

   کد محصول: '.$this->getdbdata('proid').'

   شرح محصول: '.$this->getdbdata('prodes').'

   قیمت: '.$this->getdbdata('proprice').'';	 

$replace.='












';		 



   $var ="{zarinjoomina-$id}";


//------------------------------جایگزاری کد در متن اصلی-------------------
   $article->text=str_replace($var,$replace,$article->text);

 return true;
   }

}

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید ارسال داشته باشید و بعد ثبت نام خود را در سایت کامل نمایید. اگر حساب کاربری در سایت دارید، جهت ارسال با حساب کاربری خود هم اکنون وارد سایت شوید

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • افزودن...