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

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

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

سلام دوستان نوشتن این آموزش از اونجا شروع شد که با یکی از دوستان جومینایی آشنا شدم ایشون به من انرژی مثبتی داد و گفت کاری که می خوام انجام بدم شدنی است .

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

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

التبه دیگه اینم بگم که باید با کلاس ها و پی اچ پی اشنا باشید .

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

می خواهیم با هم اموزش ساخت یک کامپوننت رو به نام HELLO WORLD بگذرونیم.

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

خوب بس دوبخش اصلی داریم یک بخش مدیریتی و یک بخش کاربر

برای هر بخش ما باید پوشه جداگانه را بسازیم.

اولین پوشه در ادرس زیر باید ساخته بشه

joomla/components

به نام com_hello و پوشه دوم نیز باید در آدرس

joomla/administrator/components

قرار بگیره به همان نام قبلی com_hello

اگر متوجه شده باشید در ابتدای هر کامپ.ننت عبارت com قرار داده شده است.

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

defined('_JEXEC') or die('Restricted access');

JEXEC_

این یک ثابت است که برای مثال به صورت معمول در فایل INDEX.PHPدر ریشه جوملا نیز تعریف شده است این ثابت یک نقطه ورود امن به جوملا می باشد. ببینید اگر دیده باشید در برخی مواقع مشکل دسترسی و یا خطا در فایل به وجود می اید که در این صورت مسیر خطا و خطی که خطا در آن به وجود می اید به طور واضح گزارش داده می شود. خوب زمانی که شما از این ثابت استفاده می کنید و از دستور بالا و کد بالا استفاده می کنید اگر دستور اجرا شد که هیچ اتفاثی نمی افتد و صفحه مورد نظر اجرا خواهد شد اما اگر با مشکل رو به رو شویم پیامRestricted access به نمایش در خواهد آمد شما می توانید این پیام را با هر متنی که می خواهید جایگزین کنید. برای مثال اگر شما به این مسیر برید البته اگرجوملا دارید

/plugins/system/backlink.php

خوب می بینید که پیام Restricted access نمایش داده می شود.

در این فایل اگر کد مورد نظر را حذف کنیم این پیام نمایش داده خواهد شد .

Fatal error: Call to undefined function jimport() in /home/abcde/public_html/plugins/system/backlink.php on line 18

همان طور که در خطای بالا نمایش داده شده است تابع jimport() وجود ندارد ولی به دلیل اینکه از ثابت استفاده کرده بودیم در صورتی که خطایی به وجود می امد پیام دسترسی محدود شده است را نمایش می داد.

خوب عزیزان تا به حال دو پوشه خالی داشتیم

مسیر پوشه ها را شماره گذاری می کنیم

  1. joomla/components
  2. joomla/administrator/components

خوب حال به مسیر شماره یک و داخل پوشه ساخته شده می شویم و یک فایل ایجاد می کنیم نام فایل را hello.php می گذاریم.

<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
echo 'Hello World!';
?>

خوب خط دوم که توضیح داده شده و خط سوم نیز یک تابع زبان پی اچ پی می باشد که برای چاپ یک رشته به کار می رود.

اگر این فایل رو ذخیره کنید می تونید در این مسیر از جوملا اون رو ببینید.

http://localhost/joomla/index.php?option=com_hello

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

localhost

می توانید آدرس سایت مورد نظر را وارد کنید

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

خوب یک فایل با نام

admin.hello.php ایجاد می کنیم و کد زیر را در آن وارد میکنیم.

<?php defined( '_JEXEC' ) or die( 'Restricted access' ); echo 'Hello, World!'; ?>  

خوب برای دسترسی به این بخش نیز باید ابتدا وارد بخش مدیریت شده و به مسیر زیر بروید

http://localhost/joomla/administrator/index.php?option=com_hello

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

INSERT INTO jos_components  (name, link, admin_menu_link, admin_menu_alt,  `option`, admin_menu_img, params) VALUES ('Hello World','option=com_hello','option=com_hello', 'Manage Hello','com_hello', 'js/ThemeOffice/component.png','');  

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

<?php

defined( '_JEXEC' ) or die( 'Restricted access' );
echo 'Hello, World!';


insertdata();

function insertdata()
{
$db=& jfactory::getdbo();
$query="INSERT INTO jos_components
(name, link, admin_menu_link, admin_menu_alt,
option, admin_menu_img, params)
VALUES
('Hello World','option=com_hello','option=com_hello',
'Manage Hello','com_hello',
'js/ThemeOffice/component.png','')

";
$db->setquery($query);
$result = $db->loadResult();

return $result;


}
?>

اگر دقت کرده باشید در اینجا یه تابع نوشته شده زمانی که شما این تابع رو صدا بزنید مقادیر وارد دیتا بیس شما میشه.

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

برای اینکه کاربر هم بتواند به این کامپوننت دسترسی پیدا کند میتواند از مسیر زیر اقدام کند.

ابتدا به منوی منو ها رفته بر روی منوی اصلی کلید کنید در صفحه باز شده روی جدید کلیک کنید بعد نوع منو را انتخاب کنید که همان HELLOW WORLD است بعد یک نام به منو بدهید و ذخیره اش کنید.

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

jfactory

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

  • getACL

  • getApplication

  • getCache

  • getConfig

  • getDate

  • getDBO

  • getDocument

  • getEditor

  • getLanguage

  • getMailer

  • getSession

  • getTemplate

  • getURI

  • getUser

  • getXMLParser

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

$db =& JFactory::getDBO(); echo "Database prefix is : " . $db->getPrefix(); 

تابع استفاده شده در کد بالا که نا آشنا است تابع getPrefix() که با استفاده از شی DB پیشوند جدول های دیتا بیس را برای ما بر می گرداند.

خروچی به صورت مقابل هست اش

Database prefix is : jos_

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

  • addQuoted

  • BeginTrans

  • CommitTrans

  • connected

  • debug

  • ErrorMsg

  • ErrorNo

  • Execute

  • explain

  • GenID

  • getAffectedRows

  • GetCol

  • getCollation

  • getConnectors

  • getErrorMsg

  • getErrorNum

  • getEscaped

  • getInstance

  • getLog

  • getNullDate

  • getNumRows

  • GetOne

  • getPrefix

  • getQuery

  • GetRow

  • getTableCreate

  • getTableFields

  • getTableList

  • getTicker

  • getUTFSupport

  • getVersion

  • hasUTF

  • insertid

  • insertObject

  • isQuoted

  • loadAssoc

  • loadAssocList

  • loadObject

  • loadObjectList

  • loadResult

  • loadResultArray

  • loadRow

  • loadRowList

  • nameQuote

  • PageExecute

  • query

  • queryBatch

  • Quote

  • replacePrefix

  • RollbackTrans

  • SelectLimit

  • setQuery

  • setUTF

  • splitSql

  • stderr

  • test

  • updateObject

توابعی که به کار برده میشود به طور کامل با مثال شرح داده خواهد شد.

اگر سوال یا ابهام یا مشکلی یا خطایی در متن وجود داشت لطف کنید و بیان کنید با کمال میل پذیرای آن هستم .

ادامه در پست بعدی


اگر در کامپوننت ها مشاهده کرده باشید زمانی که وارد کامپوننت می شوید یه نوار ابزار افقی وجود دارد برای اینکه این نوار ابزار را اضافه کنیم از کلاس ها و توابع آماده خود جوملا می توانیم استفاده کنیم.

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

toolbar.hello.html.php می سازیم و در داخل آن کدی همانند زیر می نویسیم.

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

<?php defined( '_JEXEC' ) or die( 'Restricted access' );
 class TOOLBAR_hello {
  function _NEW() {		 JToolBarHelper::save();
	 JToolBarHelper::apply();
	 JToolBarHelper::cancel();	
	 }	
 function _DEFAULT() {	
  JToolBarHelper::title( JText::_( 'Hello World Manager' ), 'generic.png' );
	 JToolBarHelper::publishList();
	 JToolBarHelper::unpublishList();	
 JToolBarHelper::deleteList();	
 JToolBarHelper::editListX();
	 JToolBarHelper::addNewX();
 } } 
?>

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

JToolBarHelper استفاده شده است .

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

  • title

  • spacer

  • divider

  • custom

  • customX

  • preview

  • help

  • back

  • media_manager

  • addNew

  • addNewX

  • publish

  • publishList

  • makeDefault

  • assign

  • unpublish

  • unpublishList

  • archiveList

  • unarchiveList

  • editList

  • editListX

  • editHtml

  • editHtmlX

  • editCss

  • editCssX

  • deleteList

  • deleteListX

  • trash

  • apply

  • save

  • cancel

  • preferences

خوب ما کلاسی به نام

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

JToolBarHelperاستفاده می کنیم در داخل کلاس یک تابع به نام ()new یک تابع به نام

_DEFAULT() اضافه می کنیم درصورتی که تابع اول صدا زده شود سه ابزار ذخیره و اعمال تغییرات یا همون گزینه به کار گیری و انصراف نمایش داده می شود .

زمانی که تابع دوم صدا زده شود نام اون صفحه با استفاده از تابع

JToolBarHelper::title( JText::_( 'Hello World Manager' ), 'generic.png' )

به نمایش در خواهد آمد .

خوب تابع دوم برای اضافه کردن کلید و گزینه انتشار می باشد

JToolBarHelper::publishList();

تابع سوم برا ی نمایش ایکن و کلید عدم انتشار می باشد

JToolBarHelper::unpublishList();

تابع چهار م برای نمایش ایکن و کلید حذف می باشد .

JToolBarHelper::deleteList();

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

JToolBarHelper::editListX();

تابع ششم برای نمایش آیکن و کلید جدید می باشد.

JToolBarHelper::addNewX();

خوب حالا ما نوار ابزار خود را با آیکن هایی که دوست داشتیم طراحی کردیم ولی هنوز کار خواصی انجام نمی دهند

خوب یک فایل در همان مسیر به نام

toolbar.hello.php می سازیم .

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


<?php  defined( '_JEXEC' ) or die( 'Restricted access' );
 require_once( JApplicationHelper::getPath( 'toolbar_html' ) );
 switch ( $task ) 
{	 case 'add'  :		 TOOLBAR_hello::_NEW();
	 break;	
 default:		 TOOLBAR_hello::_DEFAULT();	
 break; } ?>

خوب این کد چه کاری انجام می دهد . دوستانی که با php آشنا هستند با این دستور یعنی switch آشنا هستند در این کد می گوید که اگر مقدار task برابر با Add شد تابع

NEW()

در کلاس

TOOLBAR_hello فراخوانی شود و اگر مقداری نداشت تابع دوم صدا زده شود .خوب مقدار task را اگر با query string به تابع switch ارسال کنیم می توانیم به نوار ابزار ADD دسترسی یابیم و آن را مشاهده کنیم . (

&task=add)

می توانید آدرس را با این صورت وارد کنید .

[align=LEFT]

http://localhost/joomla/administrator/index.php?option=com_hello&task=add

[align=RIGHT]خوب بعد از ساخت نوار ابزار کامپوننت به سراغ ساخت جدول مورد نیاز برای کامپوننت در دیتا بیس می رویم برای اینکار دوباره از کد اس کیو ال استفاده می کنیم این کد را شما می توانید در phpmyadmin اجرا کنید و یا مانند قبل یک تابع بنویسید تا این کار را برای شما انجام دهد .

CREATE TABLE `jos_hello` ( `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `message` TEXT NOT NULL , `published` TINYINT( 1 ) NOT NULL  ); 

خوب در صورتی که این کد را شما اجرا کرده باشید در دیتا بیس یک جدول با یک ستون به نام id یک ستون به نام message و یک ستون به نام published اضافه می شود تا محیط برای ارسال و ذخیره سازی داده ها محیا شود.

ادامه دارد

[/align][/align]

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


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

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

در داخل مسیر دو و پوشه کامپوننت مورد نظر یک پوشه به نام table ایجاد می کنیم و در آن فایلی با نام

hello.php ایجاد می کنیم و درون آن کلاسی به صورت زیر ایجاد می کنیم .


<?php 
defined('_JEXEC') or die('Restricted Access');
 class TableHello extends JTable 
{
 var $id		 = null;
 var $message		 = null;	
 var $published		 = 0;
		  /**	 * @param database A database		connector object */	
function __construct(&$db)	
{
	 parent::__construct( '#__hello', 'id', $db );	
}	
  }
 ?> 

خوب یک کلا س تعریف کردیم با نام table hello که از کلاس jtable ارث بری می کند و والد کلاس ما می باشد.

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

خوب کاری که در این کلاس انجام دادیم این است که برای هر ستون از جدول یک متغییر تعریف کردیم و از طریق سازنده این کلاس توانستیم نام جدول و کلید ی که می خواهیم با اون کار کنیم اینجا مثلا id می باشد را مشخص کنیم . خوب اگر دقت کنید در ابتدای نام جدوم به جای jos از #_ استفاده شده است .زمانی که به این صورت استفاده می کنیم پیشوند مورد نظر هر چیزی که در جوملا تعیین کرده باشیم جایگزین این عبارت می شود .

قسمت اخر نیز اطلاعات مورد نیاز برای اتصال به دیتا بیس است که قبلا تعریف کردیم .$DB یک شی پایه می باشد که اطلاعاتی از قبیل نا م کاربری پسورد و نام دیتابیس در آن ذخیره شده است . دقت کنید سازنده ما از سازنده کلاس والد استفاده کرده است .

متدهای این کلاس


  • construct

  • addIncludePath

  • bind


  • canDelete


  • check


  • checkin


  • checkout


  • delete


  • getInstance


  • getNextOrder


  • hit


  • isCheckedOut

  • load

  • move


  • publish

  • reorder


  • reset

  • save


  • store


  • toXML

متدهای get و set


  • getDBO

  • setDBO

  • Compat_icon_1_6.png
    getAssetTitle

  • Compat_icon_1_6.png
    getAssetNamePrefix

  • getTableName

  • getKeyName

واقعا جوملا یک فریم ورک قدرت مند است که من رو خیلی متحییر کرده چقدر راحت و ساده می شه با اون کار کرد.

خوب حالا برا ی ساخت فرم ها در بخش کاربری یا در بخش مدیریت آماده شدیم .

در مسیر دو و پوشه کامپوننت مورد نظر فایل admin.hello.php باز می کنیم و کد ها را به شکل زیر تغییر می دهیم.

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

// to include admin.hello.html.php
require_once( JApplicationHelper::getPath( 'admin_html' ) );

$task	= JRequest::getCmd('task');

// checks the $task variable and 
// choose an appropiate function
switch($task){
case 'add':
	addHello();
	break;

case 'cancel';		
	cancelHello();
	break;

default:
	showHello();
	break;

}

function addHello(){
$lists['published'] = JHTML::_('select.booleanlist', 'published' , 'class="inputbox"', $row->published);

// display function
HTML_contact::addHello($lists);
}

function showHello(){
// display function
HTML_contact::showHello();
}

?>

و یک فایل در همین مسیر به نام admin.hello.html.php ایجاد کنید و کد زیر را در آن وارد کنید .

>

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

class HTML_contact
{
function addHello($lists){
	JRequest::setVar( 'hidemainmenu', 1 );
	$editor	=& JFactory::getEditor();
	?>




</pre>
<table>

						<?php echo JText::_( 'Message' ); ?>:


					<?php
                       echo $editor->display('message','','100%','250','40','6');
					?>


						<?php echo JText::_( 'Published' ); ?>:


					<?php
                       echo $lists['published'];
					?>
</table>
<br><br><br><br>       <?php<br><br>}<br><br>function showHello(){<br>	echo "Hello, World!";<br>}<br>}<br>?><br

در ادامه در رابطه با این کدها مفصل توضیح داده خواهد شد.

ادامه دارد.

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


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

بازم سلام

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

اولین کلاسی که به آن بر می خوریم JApplicationHelper می باشد خوب این کلاس دارای توابعی می باشد.

getClientInfo

ظgetPath

parseXMLInstallFile

parseXMLLangMetaFile

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

JApplicationHelper::getPath( 'admin_html' ) 

خوب این خط کد بالا طبق مطلبی که در بالا گفتیم مسیر فایل admin_html را بر می گرداند و چون دروون

درون تابع require_once قرار دارد پس ما می توانیم از کلاس ها و متغییر ها و توابعی که در فایل require_once شده ، ذکر شده است استفاده کنیم .

کلاس دیگری که در این فایل مشاهده می کنید کلاس JRequest می باشد .

توابع مربوط به کلاس در زیر آمده است

checkToken

clean

get

getBool

getCmd

getFloat

getInt

getMethod

getString

getURI

getVar

getWord

set

setVar

_cleanArray

_cleanVar

_stripSlashesRecursive

تابعی که استفاده شد است getcmd نام دارد و نحو دستوری ان به شکل زیرمی باشد.

[align=RIGHT]در بخش $name شما باید نام متغییر را وارد کنید و در بخش $default شما می توانید مقداری را مشخص کنید که در صورتی که متغییر وجود نداشت برگرداند و در بخش $hash می توانید از مقادیر POST, GET, FILES, COOKIE, METHOD استفاده کنیم

JRequest::getCmd('task');

[/align]

کار این تابع این است که مقادیر ورودی متغییر را چک کند و قیلطر نماید . این تابع حروف a-z و A-Z و O-9 را بر می گرداند.[/align][align=RIGHT]در حال حاضر این یک قیلطر برای تابع getVar می باشد.

کار این تابع این است که مقادیر ورودی متغییر را چک کند و قیلطر نماید . این تابع حروف a-z و A-Z و O-9 را بر می گرداند.[/align][align=RIGHT][align=RIGHT]کلاس بعدی کلاس JHTML می باشد این کلاس ، کلاس کاربردی ایست برا ی تمامی کلاس هایی که در آن کد اچ تی ام ال تولید می شود .

JHTML::_('select.booleanlist', 'published' , 'class="inputbox"', $row->published)

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

addIncludePath

calendar

date

iframe

image

link

script

stylesheet

tooltip

_

خوب تابعی که در این کد به کار رفته است _ می باشد که یک توع را دریافت می کند

ادامه دارد

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


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

سلام خوب می ریم سراغ تابعی که بخش قبلی به اون رسیدیم

تابع مورد نظر در کلاس JHTML قرار دارد برای درک بهتر این تابع به سورس این تابع نگاهی می اندازیم .

function _( $type )
{
   //Initialise variables
   $prefix = 'JHTML';
   $file   = '';
   $func   = $type;

   // Check to see if we need to load a helper file
   $parts = explode('.', $type);

   switch(count($parts))
   {
		 case 3 :
		 {
			    $prefix	    = preg_replace( '#[^A-Z0-9_]#i', '', $parts[0] );
			    $file		 = preg_replace( '#[^A-Z0-9_]#i', '', $parts[1] );
			    $func		 = preg_replace( '#[^A-Z0-9_]#i', '', $parts[2] );
		 } break;

		 case 2 :
		 {
			    $file		 = preg_replace( '#[^A-Z0-9_]#i', '', $parts[0] );
			    $func		 = preg_replace( '#[^A-Z0-9_]#i', '', $parts[1] );
		 } break;
   }

   $className	 = $prefix.ucfirst($file);

   if (!class_exists( $className ))
   {
		 jimport('joomla.filesystem.path');
		 if ($path = JPath::find(JHTML::addIncludePath(), strtolower($file).'.php'))
		 {
			    require_once $path;

			    if (!class_exists( $className ))
			    {
					  JError::raiseWarning( 0, $className.'::' .$func. ' not found in file.' );
					  return false;
			    }
		 }
		 else
		 {
			    JError::raiseWarning( 0, $prefix.$file . ' not supported. File not found.' );
			    return false;
		 }
   }

   if (is_callable( array( $className, $func ) ))
   {
		 $temp = func_get_args();
		 array_shift( $temp );
		 $args = array();
		 foreach ($temp as $k => $v) {
			$args[] = &$temp[$k];
		 }
		 return call_user_func_array( array( $className, $func ), $args );
   }
   else
   {
		 JError::raiseWarning( 0, $className.'::'.$func.' not supported.' );
		 return false;
   }
}

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


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

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

دوستان کمی در تابع های مورد نیاز در سورس این تابع توضیح می دیم.

در این کد مقدار prefix برابر با jhtml قرار می گیرد و مقدار متغییر filr برابر با " می باشد.

و مقدار ورودی که شما می گیرید رو به متغییر func می دهد.

خوب در اینجا به تابع explode() می رسیم کار این تابع parse و تجزیه یک استرینگ است آرگومانت اول چیزی را میگیرد که بر اساس آن بتواند یک استرینگ را جدا کند مثلا نقطه .

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

سپس ارایه را به یک تابع به نام cunt ارسال میکند که تعداد فیلد های یک ارایه را بر می گرد و میتوانیم از ان برای دسترسی به ارایه استفاده کنیم.

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

<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>

خوب این فایل را در کد زیر در نظر بگیرید و ببندید که چه کاری انجام می دهد خوب پترن ها و کاراکتر هایی که در بخش پترن در نظر گرفته می شود در string جستجو می شود و مقدار ان با متغییر replacement جایگزین می شود.

خروجی

The bear black slow jumped over the lazy dog.

تابع ucfirst از کلاس string می باشد که حرف اول یک استرینگ را اگر جز حروف الفبا باشد با حروف بزرگ می نویسد.این تابع class_exists وجود یک کلاس را بررسی می کند

jimport() از این تابع برای افزودن و اتصال فایل دیگر به سند استفاده می شود مانند include البته اگر اشتباه نکنم اگر اشتباه بود دوستان به من اطلاع بدن.

jimport
(

'joomla.application.component.model'

)
;

اگر به این کد نگاه کنید فایلی به نام path را در مسیر زیر به سند متصل می کند.

libraries/joomla/application/component/model.php

تابع دیگر را که در این سورس می بینیم

JError::raiseWarning()

است .

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

مثالی از این تابع را در زیر می بینیم.


 JError::raiseWarning( 0, $className.'::' .$func. ' not found in file.' );

& raiseWarning($code, $msg, $info=null)

ارگومانت اولی که به این تابع ارسال می شود کدی است که برای این خطا در نظر گرفته اید .

ارگومانت دوم کدی است که برای خطای مورد نظر به صورت پیشفرض تعریف شده است .

بخش سوم که اختیاری است توضیحی را به خطای رخ داده می افزاید.

تابع دیگر

is_callable

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

 if (is_callable( array( $className, $func ) ))

  {

	   $temp = func_get_args();

	   array_shift( $temp );

	   $args = array();

	   foreach ($temp as $k => $v) {

		 $args[] = &$temp[$k];

	   }

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

خوب کار تابع _ را نیز باید اینگونه بگوییم که یک کلاس را بارگذاری می کند .

JHTML::_('select.booleanlist', 'published' , 'class="inputbox"', $row->published);

به سراغ فایل دوم می رویم.

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


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

سلام دوستان ببخشید اگر مطالب رو کمی دیر می زارم . چون یکم سرم شلوغ شد . دوستان در فایل دوم ما یک فرم رو می خواهیم ایجاد کنیم برای اینکار باید آشنایی به تگ های اچ تی ام ال داشته باشیم ما اینجا در رابطه با این تگ ها توضیحی نمی دهیم و از آن ها گذر خواهیم کرد .

در فایل دوم یک کلاس به نام HTML_contact ایجاد کرده ایم و و سپس درون ان یک تابع به نام

addHello($lists)

افزودیم

از کلاس JRequestکه قبلا هم توضیح داده شده بود از تابع setvar استفاده کردیم .

JRequest::setVar( 'hidemainmenu', 1 );

دستور تابع گفته شده به صورت زیر است البته دو بخش اول ضروری است و بقیه بخش ها به صورت اختیاری می باشد.

setVar($name, $value=null, $hash= 'method', $overwrite=true)

این تابع یک متغییر را معرفی و مقدار دهی می کند در ارگومانت اول نام متغییر و در دومی مقدار متغییر تعیین می شود.

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

JFactory::getEditor()

می باشد .

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

و با تابع display یک ادیتور مثل ادیتور ارسال مطلب جوملا ایجاد کنید

کد زیر مثالی برای این کار می باشد.

$editor =& JFactory::getEditor();
$params = array( 'smilies'=> '0' ,
		  'style'  => '1' ,  
		  'layer'  => '0' , 
		  'table'  => '0' ,
		  'clear_entities'=>'0'
;
echo $editor->display( 'desc', '', '400', '400', '20', '20', false, $params );

در فایل دوم بغیر از مباحث بحث شده مطلب جدیدی موجود نبود به سراغ ادامه آموزش می رویم .

خوب حالا که این دو فایل رو نوشتیم می تونیم تابع add رو صدا بزنیم چون تابع add بر اساس مقدار task کار می کنه پس به ان مقدار می دهیم .

http://localhost/joomla/administrator/index.php?option=com_hello&task=add

خوب در این بخش که گفته شد ما توانستیم فرمی برای ارسال اطلاعات ایجاد کنیم در ادامه هم به روش ذخیره این اطلاعات خواهیم پرداخت .

ادامه دارد

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


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

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

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

خوب تابع

saveHello رادر فایل

admin.hello.php ایجاد می کنیم .

کد زیر بدنه تابع گفته شد ه است .


function saveHello(){	
global $mainframe;
 $row =& JTable::getInstance('hello', 'Table');
 if(!$row->bind(JRequest::get('post')))	
{		
JError::raiseError(500, $row->getError() );
 }
 $row->message = JRequest::getVar( 'message', '','post', 'string', JREQUEST_ALLOWRAW );		  if(!$row->store())
{
	 JError::raiseError(500, $row->getError() );
 }
 $mainframe->redirect('index.php?option=com_hello', 'Message Saved'); 
} 

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

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

    global $mainframe;

تا در کل فایل در دسترس باشد .

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

 $row =& JTable::getInstance('hello', 'Table');

از کلاس JTable تابع getInstance استفاده شده است دستور آن به صورت زیر می باشد.

& getInstance($type, $prefix= 'JTable', $config=array())

خوب این تابع سه ارگونانت می گیرد به غیر از مقدار اولی دو مقدار بعدی اختیاری است .

این تابع یک شی از نوع table ایجاد می کند.یعنی یک شی از نوع اشاره گر به دیتا بیس.

    $row =& JTable::getInstance('hello', 'Table');

به switch یک case اضافه می کنیم .


case 'save';			 saveHello();	 break; 



قبل از sitch هم یک خط کد اضافه می کنیم .

JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS. 2'com_hello'.DS.'tables');

کد کامل شده به صورت زیر در می اید.



<?php // no direct access
defined( '_JEXEC' ) or die( 'Restricted access' ); 
// to include admin.hello.html.php 
require_once( JApplicationHelper::getPath( 'admin_html' ) ); 
// Set the table directory 
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS. 'com_hello'.DS.'tables');
 $task	= JRequest::getCmd('task');
 // checks the $task variable and choose an appropiate function
switch($task)
{
 case 'add':	
 addHello(); 
	break;			 
case 'cancel';   
		   showHello();   
   break;  
		case 'save';
			 saveHello();  
    break;  
		default:
	 showHello(); 
	break; 
} 
function addHello(){ 
$lists['published'] = JHTML::_('select.booleanlist', 'published' , 'class="inputbox"', $row->published); 
// display function   
  HTML_contact::addHello($lists);
}
 function showHello(){ 
// display function  
   HTML_contact::showHello(); 
} 
function saveHello(){ 
global $mainframe;   
  $row =& JTable::getInstance('hello', 'Table');  
   if(!$row->bind(JRequest::get('post')))	 { 
	JError::raiseError(500, $row->getError() );   
  }  
   $row->message = JRequest::getVar( 'message', '','post', 'string', JREQUEST_ALLOWRAW ); 
	 if(!$row->store()){ 
	JError::raiseError(500, $row->getError() );  
   }
 $mainframe->redirect('index.php?option=com_hello', 'Message Saved'); 
}
?> 


دوستان دارم می رم مسافرت اگر نتونستم بنویسم دلیل بر کنار گذاشتن آموزش نیست بر میگردم و ادامه می دم شاید یکم طول بکشه

اگر عمری بود در خدمتیم.

ادامه دارد.

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


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

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

کد قبلی که اضافه کرده رو می تونیم توسط ادرس زیر باز خوانی و استفاده کنیم

http://localhost/joomla/administrator/index.php?option=com_hello&task=add

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

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

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

به فایل زیر می رویم

admin.hello.html.php

و کد زیر رو در اون جایگزین تابع

 showhello() 

> می کنیم .

[code]

function showHello(&$rows, &$pageNav, &$lists){

	JHTML::_('behavior.tooltip');	
?>


</pre>
<table>
			<?php echo JText::_( 'Filter' ); ?>:
value="<?php echo $lists['search'];?>" 
class="text_area" onchange="document.adminForm.submit();" />

<?php echo JText::_( 'Go' ); ?>

<?php echo JText::_( 'Reset' ); ?>
</table>
<br><br><br><br><br><br><br>value="<?php echo $lists['order']; ?>" /><br><br><br>   <?php<br>}<br><br

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

http://yuordomain/joomla/administrator/index.php?option=com_hello

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

کد رو در فایل

admin.hello.html.php جایگزین

showHello()

می کنیم

>

function showHello(&$rows, &$pageNav, &$lists){

	JHTML::_('behavior.tooltip');	
?>


</pre>
<table>
			<?php echo JText::_( 'Filter' ); ?>:
value="<?php echo $lists['search'];?>" 
class="text_area" onchange="document.adminForm.submit();" />

<?php echo JText::_( 'Go' ); ?>

<?php echo JText::_( 'Reset' ); ?>
</table>
<br><br><br><br><br><br><br>value="<?php echo $lists['order']; ?>" /><br><br><br>   <?php<br>}<br><br

و در فایل

admin.hello.php کد زیر را جایگزین تابع showhello() می کنیم .



function showHello(){
global $mainframe;

   $db =& JFactory::getDBO();

$filter_order= $mainframe->
   getUserStateFromRequest( $option.'filter_order',
	  'filter_order','id','cmd' );
$filter_order_Dir= $mainframe->
   getUserStateFromRequest( $option.'filter_order_Dir',	
  'filter_order_Dir','','word' );
$filter_state = $mainframe->
  getUserStateFromRequest( $option.'filter_state',	 'filter_state', '','word' );
$search = $mainframe->
   getUserStateFromRequest( $option.'search',
   'search','','string' );
$search = JString::strtolower( $search );

$limit= $mainframe->
   getUserStateFromRequest('global.list.limit', 
   'limit', $mainframe->getCfg('list_limit'), 'int');
$limitstart= $mainframe->
   getUserStateFromRequest($option.'.limitstart', 
'limitstart', 0, 'int');

$where = array();

if ( $search ) {
	$where[] = 'message LIKE "%'.$db->getEscaped($search).'%"';
}	

$where		 = ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
if ($filter_order == 'id'){
	$orderby	 = ' ORDER BY id';
} else {
	$orderby	 = ' ORDER BY '. 
    $filter_order .' '. $filter_order_Dir .', id';
}	

// get the total number of records
$query = 'SELECT COUNT(*)'
. ' FROM #__hello'
. $where
;
$db->setQuery( $query );
$total = $db->loadResult();

jimport('joomla.html.pagination');
$pageNav = new JPagination( $total, $limitstart, $limit );	


$query = "SELECT * FROM #__hello". $where. $orderby;
$db->setQuery( $query, $pageNav->limitstart, $pageNav->limit );
$rows = $db->loadObjectList();
if($db->getErrorNum()){
	echo $db->stderr();
	return false;
}

// table ordering
$lists['order_Dir']	= $filter_order_Dir;
$lists['order']		= $filter_order;	

// search filter	
   $lists['search']= $search;	

   // display function
HTML_contact::showHello(&$rows, &$pageNav, &$lists);

}


به دلیل اینکه در مسافرت هستم کوتاه می نویسم در پست بعدی بخش های این کد رو توضیح خواهم داد

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


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

سلام دوستان .

دوستان در پست قبلی قول داده بودم که راجع کد توضیح بدم ولی وقتی به کد نگاهی انداختم دیدم که بخش های پی اچ پی برنامه نویسی ساده بودن و بخش های که از فریم ورک جوملا هستند نیز در قسمت های قبلی گفته شده و بقیه موارد نیز اچ تی ام ال هستند از اونها گذر می کنیم .

خوب بعد از اینکه ما یک متن یا بخش رو اضافه کردیم مثلا مثل مطلب تمایل داریم که این بخش ها قابل ویرایش باشند بس بخشی را نیز باید برای ویرایش تنظیمات یا مطالب داشته باشیم .

خوب فایل

admin.hello.html.php رو باز می کنیم و کد رو درون تابع showhello() وارد می کنیم .

   <?php

   $k = 0;
for($i=0, $n=count($rows); $i < $n ; $i++)
{
$row = &$rows[$i];
$checked	 = JHTML::_('grid.id', $i, $row->id);
$published	 = JHTML::_('grid.published', $row, $i); 
// prepare link for id column
$link		 = JRoute::_( 'index.php?option=com_hello
&task=edit&cid[]='. $row->id );
?<
">
<?php echo $checked?>
// show link, that will clicked to go to edit form page

   <?php echo $row->id?>
<?php echo $row->message?>		  
<?php echo $published?>		  

   <?
$k = 1 - $k;
}
?>

خوب

کار بعدی که باید بکنیم تابع edithello رو بنویسم

خوب کد زیر نمونه ای از این کد می باشد ببینید.

این تابع را نیز در کنار تابع addhello اضافه می کنیم

   <?php

   $k = 0;
for($i=0, $n=count($rows); $i < $n ; $i++)
{
$row = &$rows[$i];
$checked	 = JHTML::_('grid.id', $i, $row->id);
$published	 = JHTML::_('grid.published', $row, $i); 
// prepare link for id column
$link		 = JRoute::_( 'index.php?option=com_hello
&task=edit&cid[]='. $row->id );
?<
">
<?php echo $checked?>
// show link, that will clicked to go to edit form page

   <?php echo $row->id?>
<?php echo $row->message?>		  
<?php echo $published?>		  

   <?
$k = 1 - $k;
}
?>


خوب به سراغ فایل

admin.hello.php می رویم و زیر کد ها اضافه می کنیم



$task	= JRequest::getCmd('task'); $id	 = JRequest::getVar('id', 0, 'get', 'int'); 

تابع Switch رو به شکل زیر به رو ز می کنیم .


switch($task){

 case 'edit':
   editHello();
   break;

 case 'add':
   addHello();
   break;

 case 'cancel';		
   showHello();
   break;

 case 'save';	
   case 'apply';	
   saveHello();
   break;		

 default:
   showHello();
   break;


}


تابع edithello را به شکل زیر اضافه می کنیم .


function editHello()
{
$db		=& JFactory::getDBO();

$cid	 = JRequest::getVar('cid', array(0), '', 'array');
JArrayHelper::toInteger($cid, array(0));

$id	 = $cid[0];

$row =& JTable::getInstance('hello', 'Table');
// load the row from the db table

$row->load( $id);

$lists = array();
$lists['published'] = JHTML::_('select.booleanlist', 'published' , 'class="inputbox"', $row->published);

// display function 
HTML_contact::editHello(&$lists, &$row);
}

خو ب حالا به سراغ تولبار می رویم

فایل

toolbar.hello.php باز می کنیم

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

switch ( $task )
{
case 'add'  :
case 'edit'  :	
	TOOLBAR_hello::_NEW();
	break;

default:
	TOOLBAR_hello::_DEFAULT();
	break;
}



این هم برای ویرایش مطالب موفق باشید تا بخش بعدی که در رابطه با حذف مطالب صحبت خواهیم کرد.

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


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

سلام دوباره

دوستان رسیدیم به حذف رکورد ها از جداول دیتا بیس

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

فایل

admin.hello.php رو باز می کنیم بعد از این که این فایل رو باز کردیم درون کیس یک عبارت برای حذف کردن اضافه می کنیم .


switch($task){

 case 'edit':
   editHello();
   break;

 case 'add':
   addHello();
   break;

 case 'cancel';		
   showHello();
   break;

 case 'save';	
   case 'apply';			
   saveHello();
   break;	

 // This will work when you set task to 'remove
 case 'remove':
   removeHello();
   break;


 default:
   showHello();
   break;

}


و سپس تابع مربوط به حذف کردن رو می نویسسم

کد رو ملاحظه کنید .


function removeHello()
{

 global $mainframe;
 // Initialize variables	
 $db =& JFactory::getDBO();
 // Define cid array variable
 $cid = JRequest::getVar( 'cid' , array() , '' , 'array' );
 // Make sure cid array variable content integer format
 JArrayHelper::toInteger($cid);

 // If any item selected
 if (count( $cid )) {
   // Prepare sql statement, if cid array more than one, 
   // will be "cid1, cid2, ..."
   $cids = implode( ',', $cid );
   // Create sql statement
   $query = 'DELETE FROM #__hello'
   . ' WHERE id IN ( '. $cids .' )'
   ;
   // Execute query
   $db->setQuery( $query );
   if (!$db->query()) {
 echo "\n";
   }
 }

 // After all, redirect again to frontpage
 $mainframe->redirect( "index.php?option=com_hello" );
}



اگر درون جوملا دقت کرده باشید شما می توانید برای هر مطلب حالت انتشار یا منتشر نشده در نظر بگیرید

برایا اینکار می توانید از به صورت زیر عمل کنید .

فایل

admin.hello.php را باز می کنیم .


switch($task){

 case 'remove':
   removeHello();
   break;
		
 case 'publish':
   changeHello(1 );
   break;

 case 'unpublish':
   changeHello(0 );
   break;				
		
 default:
   showHello();
   break;

}

و تابع cangehello () را اضافه می کنید.


function changeHello( $state=0 )
{
 global $mainframe;

 // Initialize variables
 $db	 =& JFactory::getDBO();

 // define variable $cid from GET
 $cid = JRequest::getVar( 'cid' , array() , '' , 'array' );	
 JArrayHelper::toInteger($cid);

 // Check there is/are item that will be changed. 
 //If not, show the error.
 if (count( $cid ) < 1) {
   $action = $state ? 'publish' : 'unpublish';
   JError::raiseError(500, JText::_( 'Select an item 
   to' .$action, true ) );
 }

 // Prepare sql statement, if cid more than one, 
 // it will be "cid1, cid2, cid3, ..."
 $cids = implode( ',', $cid );

 $query = 'UPDATE #__hello'
 . ' SET published = ' . (int) $state
 . ' WHERE id IN ( '. $cids .' )'
 ;
 // Execute query
 $db->setQuery( $query );
 if (!$db->query()) {
   JError::raiseError(500, $db->getErrorMsg() );
 }

 if (count( $cid ) == 1) {
   $row =& JTable::getInstance('hello', 'Table');
   $row->checkin( intval( $cid[0] ) );
 }

 // After all, redirect to front page
 $mainframe->redirect( 'index.php?option=com_hello' );
}


موفق باشید

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


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

سلام

یعنی ترکو.ندی ها :64 (34):

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

شما 27 ارسال دارید که همین چندتاش به قدر 500 ارسال میارزه

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

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


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

سلام

یعنی ترکو.ندی ها :64 (34):

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

شما 27 ارسال دارید که همین چندتاش به قدر 500 ارسال میارزه

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

سلام سلام به همه اونایی که برای جومینا زحمت می کشن و مخصوصا به اونایی که براشون خیلی احترام قائل هستم

مرسی از لطف شما آقای تهرانی ولی هدف من از این مقالات و ترجمه فقط ارائه نبود بلکه خودم هم تلاش می کنم یاد بگیرم چون از جوملا هیچی نمی دونم منظورم از فریم ورکش هست و تلاش می کنم که خودم رو بالا بکشم .

خوب بریم به سراغ ادامه آموزش کامپوننت نویسی دوستان ما در طی آموزش یه فایل داشتیم اگر اشتباه نکنم اسم اش بود hello.php

فکر کنم تو پوشه

joomla/components/com_hello

بود

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


<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
echo 'Hello World!';

jimport('joomla.application.helper');
require_once(JApplicationHelper::getPath( 'html' ));
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.$option.DS.'tables');

switch( $task ){
 default:
   showPublishedHello($option);
   break;
}

function showPublishedHello($option)
{
 $db =& JFactory::getDBO();
 $query = "SELECT * FROM #__hello 
 WHERE published= '1' ORDER BY id DESC";
 $db->setQuery( $query );
 $rows = $db->loadObjectList();

 if ($db->getErrorNum())
 {
   echo $db->stderr();
   return false;
 }
 HTML_hello::showHello($rows, $option);
}
?>

چون کد سادس و تماما پی اچ پی هست اش یا قبلا گفته شده توضیحی نمی دم.

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

داخل همین پوشه یه فایل می سازیم به نام

hello.html.php

و کد زیر رو براش می نویسم .

>

<?php
class HTML_hello
{
 function showHello($rows, $option)
 { ?>
</pre>
<table>
'. $row->message .'
</table>
<br> <?php<br> }<br>}<br>?><br><br

خوب این کد هم واضح هست اش.

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

می ریم به ادامه آموزش

بعد از اینکه ما اینکار رو کردیم حالا می خواهیم اطلاعات هر یک رو به صورت جداگانه نمایش بدیم

یعنی می خوایم یک تک صفحه برای اطلاعات بسازیم.

خوب فایل

hello.php رو باز می کنیم

بعد کد switch رو به روز رسانی می کنیم .


switch( $task ){
  case 'view':
   viewHello($option);
   break;

 default:
   showPublishedHello($option);
   break;
}

این تابع رو هم اضافه می کنیم .

viewhello()



function viewHello($option)
{
 $id = JRequest::getVar('id', 0);
 $row =& JTable::getInstance( 'hello', 'Table');
 $row->load($id);

 if(!$row->published)
 {
   JError::raiseError( 404, JText::_('Invalid ID Provided'));		
 }
 HTML_hello::viewHello($row, $option);
}

فایل زیر رو باز می کنیم

hello.html.php

و کد زیر رو در اون اضافه می کنیم.

البته بعد از تابع

howhello()


function viewHello($row, $option)
{ ?>

<?php echo "ID: ". $row->id ."";?>

<?php echo "Message: 
". $row->message . "";?>  

 <?php $link = 'index.php?option='. $option; ?>

< return to the hello frontpage  
 <?php
}


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

اگر بازم لازم بود بگید که بیشتر توضیح بدم.

باز هم ادامه داره البته اگر از دست من خسته نشده باشید ولی اخراشه فکر کنم 5 قسمت دیگه هم مونده که بعدش باید بشینم و شروع به کامپوننت نویسی کنم.

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


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

سلام دوستان دوباره ببخشید طول کشید در حال مطالعه روش کد نویسی MVC بودم دوستان شما هم یاد بگیرید چون خیلی کار رو راحت می گنه

خوب بریم سراغ ادامه آموزش .

دوستان ما می دونیم که آدرس های استاندارد جوملا به صورت استاندارد به صورت

http://jomla-site/index.php?option=com_contact&task=view&id=123

و برای کاربران و موتور ها ی جستجو خیلی جالب نیست .

فکر کنم این ادرس به شکل زیر باشه خیلی بهتره

http://jomla-site/contact/view/123

موافق نیستید .؟!

خوب برای اینکار به مدیریت سایت می ریم و در تنظیمات پیکره بندی سایت

Engine Friendly Urls به yes تغییر می دهیم و همچنین

Use Apache mod_rewrite رو هم yes می کنیم .

دقت کنید که

mod_rewrite باید روی اپاچی نصب باشه

سلام htaccess.txt رو

به .htaccess تغییر می دیم .

خوب بعد به بخش

joomla/components/com_hello می ریم و یک فایل به نام

router.php ایجاد می کنیم



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

function HelloBuildRoute(&$query)
{
 $segments = array();

 if(isset($query['task'])) 
 {
   $segments[] = $query['task'];		
   unset($query['task']);
 };

 if(isset($query['id']))
 {
   $segments[] = $query['id'];
   unset($query['id']);
 };

 return $segments;
}

?>

بعد از این کار

فایل

hello.html.php رو بازکنید

و کد زیر رو بنویسید یعنی این تابع رو به روز رسانی کنید .

>


function showHello($rows, $option)
{ ?>
</pre>
<table>
'. $row->message .'
</table>
<br> <?php<br>}<br>کد زیر رو در  <br>viewHello()<br>[php]<br><br><br><?php $link = JRoute::_('index.php?option='. $option); ?><br

?>

[/php]

به



<?php $link = JRoute::_('index.php?option='. $option); ?>

خوب حالا ادرس ها به شکل زیر در می یان

http://localhost/joomla/hello-world

http://localhost/joomla/news-feed

خوب اگر شما به این ادرس برید

http://localhost/joomla/hello-world با خطا مواجه خواهید شد

برای رفع این خطا به فایل

router.php می رویم

کد زیر رو درون اون می نویسم


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

function HelloBuildRoute(&$query)
{
 $segments = array();

 if(isset($query['task'])) 
 {
   $segments[] = $query['task'];		
   unset($query['task']);
 };

 if(isset($query['id']))
 {
   $segments[] = $query['id'];
   unset($query['id']);
 };

 return $segments;
}

function HelloParseRoute($segments)
{
 $vars = array();
 $vars['task']	= $segments[0];
 $vars['id']		= $segments[1];
 return $vars;
}

?>


خوب حالا ادرس ها به شکل زیر تبدیل می شوند

http://localhost/joomla/hello-world/view/1

http://localhost/joomla/hello-world/view/2

http://localhost/joomla/hello-world/view/3

موفق باشید

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


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

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

فرض می کنیم که من می خواتم یه تابع رو در در بخش مدل معرفی کنم به نام getDatafactbyid



function &getDatafactbyid($id)
   {
  $data=0;
   // Load the data
   if(empty($data))
   {
	  $query = 'SELECT * FROM #__fact'
	   . ' WHERE id = '.$id;	   
	  $this->_db->setQuery($query);
	 $data = $this->_db->loadObjectList();

   }


   return $data;
   }//function

در صورتی که ورودی نداشت مشکلی نبود و توسط تابع get در view قابل دسترس بود و مشکلی ایجاد نمی کرد و چیزی برای پاس کردن به تابع نداشت .

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

خیلی ساده اس

ما می تونیم از یه تابع دیگه از متد های jview به نام getmodel استفاده کنیم.

و توسط اون این کار رو انجام بدیم

خوب کد خیلی سادس ببینید .

$model = $this->getModel();

print_R ($model->getDatafactbyid(1));

خوب بالا می بینید که از تابع getmodel() برای دریافت نام مدل مربوط به view مورد نظر استفاده می شه و تمام متعییر ها و توابع داخل یک متغییر به نام model ریخته می شه و و در خط بعد من اومدم و خروجی رو چاپ کردم که ببینم درست کار می کنه یا نه

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

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

اگر با کامپوننت نویسی اشنا باشید می دونید که از طریق تابعی به نام assignRef امکان اش وجود داره که یه متغییر رو در داخل فایل tmp رجیستر کرد خوب از طریق این تابع این متغییر مدل رو داخل tmp رجیستر می کنیم .


   $this->assignRef('model', $model);

از این طریق متغییر model درون tmp با نام model در دسترس خواهد بود .

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

برای استفاده از این متغییر درون tmp به شکل زیر اقدام می کنیم.


$factname=$this->model->getDatafactbyid( ورودی مورد نظر);

خیلی راحت بود نه گفتیم این تابع یک شی رو بر می گردونه این خروجی رو درون یک متغییر به نام factname ذخیره می کنیم و برای دسترسی به بخش های مختلف این شی می تونیم از اشاره گر --> استفاده کنیم .

$factname[0]->fact

نکته ای که فراموش کردم بگم اینه که شما می تونید با استفاده از تابع getmodel به همه model ها دسترسی پیدا کنید در صورتی که مدل پارامتری نداشته باشد به مدل مربوط به خود ویو مراجعه می کند ولی چنانچه به این تابع نام یک مدل رو بدیم اون مدل رو فراخوانی می کنه

موفق باشید امیدوارم که واضح گفته باشم گرچه شک دارم چون یکم تخصصی بود

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


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

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

بحثی که الان یم خوام مطرح کنم شاید اگر با جی کوئری و توابعی چون

$.ajax
$.get
$.post

آشناییی نداشته باشید کمی نا مفهوم باشه ولی کسایی که تو جوملا حرفه ای هستن حتما کمی هم جی کوئری می دونن

خوب بریم سراغ اون چیزی که تازگی یاد گرفتم و یکم توضیح در رابطه با این دستورات جی کوئری و دلیل این که دنبال این بودم که این رو یاد بگیرم.

---------------------------------------------------------------------------------------------------------------

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

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

که این خیلی جالب نیست و باید بیایم و داخل متن اون صفحه پاسخ مورد نظر رو پیدا کنیم . یعنی همون ضرب المثل خودمون که می گه حالا پیدا کن پرتقال فروش رو.

خوب بس ما باید یه صفحه ای داشته باشیم که خروجی نداشته باشه بس تا اینجا قانع شدیم که باید یه صفحه داشته باشیم که شامل کلاس و توابع باشه و یه سری دستورات شرطی که خروجی رو که ما می خوایم تولید کنه و خروجی اضافه نداشته باشیم .

من داخل پوشه مدیریت یه فایل می سازم به نام ajax.php حالا من باید بیام و یه کاری کنم که به یه سری از توابع و فریم ورک جوملا دسترسی پیدا کنم و یه کار دیگه هم باید انجام بدم و اون هم اینکه چون به دیتا بیس دسترسی دارم بس این فایل فایل مهمی هست اش و نباید کسی وقتی به صورت مستقیم ادرس اون رو می ده چیزی ببینه خوب کدی که باعث می شه در دسترسی مستقیم ما چیزی نبینیم همون کدی هست اش که قبلا هم راجع اون با هم صحبت کردیم .


define('JPATH_BASE', dirname(__FILE__) );

کد بالا برای جلوگیر از دسترسی مستقیم به محتوای فایل بود

حالا کد هایی که باعث می شن ما به بخش هایی از فریم ورک دسترسی پیدا کنیم . اون هم انکلود کردن دو فایل هست اش

define('JPATH_BASE', dirname(__FILE__) );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

داخل این کدهای بالا یه بخش هم هست که توضیح ندادم و اون هم تعیین جدا کننده ادرس و مسیر فایل ها هست اش که خیلی راحت می شه اون رو تعریف کرد.

define( 'DS', DIRECTORY_SEPARATOR );

خوب حالا ببینیم واقعا دسترسی داریم به فریم ورک یا نه

یه تست کوچولو

$db=&jfactory::getdbo();
print_r($db);

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

کدها تا الان به صورت زیر در اومدن

فایل ajax.php



<?php 
$GLOBALS['ajax'] = true;
//defined('_JEXEC') or die('=;)');
define('JPATH_BASE', dirname(__FILE__) );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('administrator');

$db=&jfactory::getdbo();
print_r($db);

?>

ادامه دارد به شرط ها و شروطه ها

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


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

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

<?php
class JConfig {
 ...
 var $host = 'localhost';
 var $user = 'my_user';
 var $db = 'my_db';
 ...
 var $sitename = 'My Great Joomla! Site';
 ...
}
?>

فرض می کنیم که متن بالا محتوای فایل کانفیگ ما است برای دسترسی به مقادیر ان می تونیم از روش زیر استفاده کنیم .

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

برای این کا رنیاز هست که یک شی از کلاس jfactory بسازیم و توسط هندل اون دسترسی بگیریم به تابع مورد نظر

$app =& JFactory::getApplication();

خوب ما یک شی از کلاس ساختیم .


پecho $app->getCfg('sitename'); //outputs site name
echo $app->getCfg('host'); //outputs database host
echo $app->getCfg('user'); //outputs database user
echo $app->getCfg('db'); //outputs database name

فایل کلی به شکل زیر در می یاید.


$app =& JFactory::getApplication();
echo $app->getCfg('sitename'); //outputs site name
echo $app->getCfg('host'); //outputs database host
echo $app->getCfg('user'); //outputs database user
echo $app->getCfg('db'); //outputs database name

موفق باشید

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


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

سلام دوستان یه مطلب جدید یاد گرفتم که فکر کنم به درد حرفه ای ها و کسایی که کامپوننت می نویسن می خوره نه کسایی که ویرایش می کنن

قبلا راجع ارسال مقادیر از مدل به ویو بحث کرده بودیم حالا می خوایم یه سری مقادیر رو از ویو به کنترلر انتقال بدیم .

خوب دوستان ما میخوایم یه کاری انجام بدیم و اون هم اینه که می خوایم مقداری رو از view به controller ارسال کنیم در این صورت ما می یایم و داخل فرم های view یه فیلد مخفی تعریف می کنیم و مقدار مورد نظر رو به value می دیم و برای ان یه ای دی و نام انتخاب می کنیم. این دو رو مشابه انتخاب کنید. فرض می کنیم که می خوایم زمانی که روی کلید ذخیره فرم کلیک کردیم یه مقداری رو در داخل کنترلر بگیریم و بر اساس اون بیایم و یه تابعی رو صدا بزنیم .

بخش اول رو که توضیح دادم که مقدار دهی به یه فیلد مخفی بود .

الان ما کلید ذخیره رو زدیم فایل به کنترلر مراجعه می کنه و باید ما در کنترلر اون مقدار رو دریافت کنیم و نگهداریم داخل یه متغییر .

برای اینکه مقادیر فرم رو دریافت کنیم می تونیم از تابع زیر استفاده کنیم .

JRequest::getVar

خوب یه مثال می زنم مثلا من داخل فرم ام داخل view یه فیلد تعریف کردم و الان می خوام مقدار اون فیلد رو در کنترلر بگیرم اسم فیلدم رو و ایدی اون رو گذاشتم type

$type=JRequest::getVar('type');

مقدار رو داخل متغییر به نام type ذخیره می کنم و می تونم اون رو به یه تابعی به عنوان ورودی در مدل ارسال کنم یا کار هایی مشابه

موفق باشید

امید وارم که مفید بوده باشه

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


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

سلام دوستان علاوه بر مطلبی که در بالا گفتم می شه از تابع

$type=jrequest::getvar('type');

برای بیرون کشیدن مقادیر کوئری استرینگ استفاده برد .

برای مثال اگر ما یک کوئری استرینگ مانند زیر داشته باشیم می تونیم به روشی که در زیر گفته می شه مقادیر رو استخراج کنیم .


/index.php?option=com_mandegar&controller=groupfeaturedata&task=edit&type[]=cpu&cid[]=40

در صورتی که من بخوام مقدار یک ارایه رو که در کوئری استرینگ می بینید بیرو ن بکشم باید به شکل زیر اقدام کنم

$type=jrequest::getvar('type');
                    print_r($type[0]); 

در کد بالا ما مقدار ارایه type رو که cpu باشه رو در می یاریم و به متغییر type می دهیم .

دقت کنید که کووری ما یعنی type یک ارایه بوده بس باید مانند یک ارایه از اون استقبال کنیم .

حالا می خوایم مقدار کنترلر رو ببینیم چی هست مثلا می خواهیم بر اساس مقدار کنترلر کار خاصی رو انجام بدیم .

$type=jrequest::getvar('controller');
                    echo $type;  

در کد بالا نیز مقدار کنترلر ور به دست اوردیم و مقدار اون برابر با groupfeaturedata خواهد شد .

دوستان اگر شما هم چیزی ار کامپوننت نویسی می دونید یا در حال یادگیری اون هستید به من حقیر هم یاد بدید لطفا اگر مطلبی داشتید در همین تاپیک بزنید

موفق باشید

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


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

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

ما می دونیم که در هر پایگاه داده ای از نوع مای اس کیو ال یه دیتابیس وجود داره که اطلاعات جدول ها رو مشخص می کنه که اسم اون information_schema هست اش داخل اون جدولی وجود داره به نام COLUMNS که مشخصات ستون ها رو نگه می داره خوب برای اینکه ما مشخصات یک جدول خاص رو بدست بیاریم باید یه select انجام بدیم خوب چیز هایی که مانیاز داریم یکی اسم جدول مونه یکی نوع داده جدول مون و اسم ستون جدول

داخل جوملا ما برای دسترسی به دیتا بیس همونطور که قبلا گفتیم از یک هندل استفاده می کردیم .

$db=&JFactory::getDBO();

خوب این از اهرم دسترسی ما به دیتا بیس حالا باید کوئری مورد نظر رو بنویسیم تا بتونیم مطالب خواسته شده رو ببینیم .

$qry="SELECT `TABLE_NAME`,`COLUMN_NAME`,`DATA_TYPE`
FROM `information_schema`.`COLUMNS`
WHERE TABLE_NAME = 'jos_cpu'
";

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

$db->setQuery($qry);

برای گرفتن اطلاعات می تونیم از تابع زیر استفاده کنیم .

$result=$comments=$db->loadObjectList();

خوب حالا دیگه می تونید به استفاده از foreach یا همون for یا هر حلقه دیگه ای بیاید و یه سری کارها رو روی دیتا تون انجام بدید

موقق باشید.

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


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

سلام دوستان امروز داشتم کامپوننت های 1.6 رو بررسی می کردم به یه بخشی برخورد کردم گفتم شاید بد نباشه یه نگاهی بهش بندازیم . از این به بعد هم سعی می کنم در رابطه با فریم ورک های 1.6 و 1.7 بنویسم اخه تا کی می شه روی 1.5 مانور داد و اقتصاد فناوری اطلاعات دست کسایی هست اش که به روز ترن . بس می ریم سراغ بحث اصلیمون

     // Create a new query object.    
     $db = JFactory::getDBO();
     $query = $db->getQuery(true);
     // Select some fields
     $query->select('id,greeting');
     // From the hello table
     $query->from('#__helloworld');
     return $query;

اگر دقت کرده باشید زمانی که یه کامپوننت 1.5 رو روی 1.6 نصب می کنید اکثر مشکل ارتباط با دیتا بیس داره و این به خاطر این مطلب هست اش که روال دریافت کوئری یه کم تغییر کرده قبلا به صورت خطی می نوشیتم و لی الان به وسیله تابع هر بخش رو ارسال می کنیم .

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

  $db = JFactory::getDBO();

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

     $query = $db->getQuery(true);

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

     $query->select('id,greeting');

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

     $query->from('#__helloworld');

و در اخر نیز کوئری ساخته می شه و می تونم اون رو return بکنم

   return $query;

البته بخش های دیگه ای هم می تونم به کوئری اضافه کنم و این کوئری رو بفرستم به دیتا بیس و خروجی رو بگیرم

     $query->leftJoin('#__categories on catid=#__categories.id');
     $db->setQuery((string)$query);
     $messages = $db->loadObjectList();

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

 $query->leftJoin('#__categories on catid=#__categories.id');

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

     $db->setQuery((string)$query);

دستور سوم هم خروجی رو در متغییر ذخیره می کنه

     $messages = $db->loadObjectList();

موفق باشید .

امیدوارم به دردتون خرده باشه.

دوستان اگر شما هم چیزی ار کامپوننت نویسی می دونید یا در حال یادگیری اون هستید به من حقیر هم یاد بدید لطفا اگر مطلبی داشتید در همین تاپیک بزنید

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


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

سلام یکی دیگه از تفاوت های 1.7 نسبت به 1.5 در نحوه push data into the template هست اش یعنی زمانی که ما می خوایم یه سری اطلاعات رو از مدل به ویو و از اونجا به تمپلیت ارسال کنیم.

قبلا ساختار 1.5 رو دیدیم فقط اینجا نمونه رو می یارم تا مثالی بتونیم بزنیم .

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

 $group_ariapardakht =& $this->get('Data');
       $pagination =& $this->get('Pagination');
       $items = $this->get('Items');

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

حالا بخشی که تغییر کرده رو می خوایم ببینیم .

این کد به نسخه 1.5 تعلق داره.

       $this->assignRef('group_ariapardakht', $group_ariapardakht);
       $this->assignRef('pagination', $pagination);
       $this->assignRef('items', $items);

تو نسخه 1.7 ساده تر و منطقی تر شده و به پی اچ پی نزدیک تر شده. البته به نظر من.


       $group_ariapardakht =& $this->get('Data');
       $pagination =& $this->get('Pagination');
       $items = $this->get('Items');

در تمپلیت هم به اسونی می تونید به این مقادیر دسترسی داشته باشید همونطور که در 1.5 بهش دسترسی داشتید

موفق باشید

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


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

سلام

مطلب جدیدی که دیدم و در 1.5 یا وجود نداشته یا من استفاده نمی کردم این بود که داخل کامپوننت بخش view و بخش tmpl فایل پی اچ پی رو به چند بخش تقسیم می شه کرد به طور مثال:

header

footer

body

file:default.php


<?php

defined ('_JEXEC') or die('RESTRICTED ACCESS');

JHtml::_('behavior.tooltip');

?>



   <?php echo $this->loadtemplate('head')?>


   <?php echo $this->loadtemplate('foot')?> 


   <?php echo $this->loadtemplate('body')?> 



با استفاده از تابع

$this->loadtemplate('body')

می تونیم بخش مورد نظر رو در tmpl لود کنیم .

برای این کار باید سه فایلی که در بالا لود می شن رو در کنار فایل اصلی اینجا به طور مثال نام اش default هست اش می ریزیم . نحوه نام گذاری سه فایل به به صورت زیر هست اش .

ابتدا نام فایل اصلی و سپس نام خود بخش به طور مثال default_body.php default_foot.php

داخل این فایل ها هر چیزی که باشه داخل فایل اصلی لود می شه و برای مدیریت کد و راحتی برنامه نویس خیلی مفیده

موفق باشید

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


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

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


public function sendMail($from, $fromName, $recipient, $subject, $body, $mode=0,
	$cc=null, $bcc=null, $attachment=null, $replyTo=null, $replyToName=null)
{
	$this->setSender(array($from, $fromName));
	$this->setSubject($subject);
	$this->setBody($body);

	// Are we sending the email as HTML?
	if ($mode) {
		$this->IsHTML(true);
	}

	$this->addRecipient($recipient);
	$this->addCC($cc);
	$this->addBCC($bcc);
	$this->addAttachment($attachment);

	// Take care of reply email addresses
	if (is_array($replyTo)) {
		$numReplyTo = count($replyTo);

		for ($i = 0; $i < $numReplyTo; $i++)
		{
			$this->addReplyTo(array($replyTo[$i], $replyToName[$i]));
		}
	}
	else if (isset($replyTo)) {
		$this->addReplyTo(array($replyTo, $replyToName));
	}

	return  $this->Send();
}

مقادیر ارگومانت ها رو هم می تونید ببینید .

/**

* Function to send an email

*

* @param string $from From email address

* @param string $fromName From name

* @param mixed $recipient Recipient email address(es)

* @param string $subject email subject

* @param string $body Message body

* @param boolean $mode false = plain text, true = HTML

* @param mixed $cc CC email address(es)

* @param mixed $bcc BCC email address(es)

* @param mixed $attachment Attachment file name(s)

* @param mixed $replyTo Reply to email address(es)

* @param mixed $replyToName Reply to name(s)

*

* @return boolean True on success

* @since 1.6

*/

برای این که بتونیم از این کد و تابع استفاده کنیم باید ابتدا کتابخانه مخصوص اش رو ایمپورت کنیم .

jimport( 'joomla.mail.mail' );

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


$a=JUtility::sendMail("admin@barnamenevisan.ir", "vahid","click2ir@yahoo.com","test","
asdasd
asdasd",true);

اگر دقت کرده باشید کلاس این تابع با قبلی فرق می کنه

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

jimport( 'joomla.utilities.utility' );

ورودی ها به صورت زیر هستند

@param string $from From email address

* @param string $fromname From name

* @param mixed $recipient Recipient email address(es)

* @param string $subject Email subject

* @param string $body Message body

* @param boolean $mode false = plain text, true = HTML

* @param mixed $cc CC email address(es)

* @param mixed $bcc BCC email address(es)

* @param mixed $attachment Attachment file name(s)

* @param mixed $replyto Reply to email address(es)

* @param mixed $replytoname Reply to name(s)

* @return boolean True on success

موفق باشید

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


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

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

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

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

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

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

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

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

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


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