رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش ویرایش و تغیرات در ماژول با دستکاری کد های php + مثال های عملی
#1
با سلام خدمت دوستان

اموزشی که می خواهم توی این تاپیک بدم در مورد نحوه تغیر دادن فیلد ها و پارامتر های یک ماژول و اضافه کردن فیلد و امکانات جدید با دستکاری کد ها php ماژول می باشد

اموزش رو با یک مثال توضیح می دهم که ضمن مشاهده تغیرات این ماژول با نحوه انجام تغیرات آشنا می شوید

ماژولی که ما می خواهیم تغیر دهیم ماژول نمایش اخبار mod_jvnews که می تونید از این لینک دانلودش کنید و ما کارمون رو بروی جوملا 2.5 انجام می دیم برای سایر نسخه ها هم مشابه همین است

کاری که این ماژول انجام می دهد با توجه به تنظیمات موجودش اخرین مطالب رو به شکلی خاص مانند سایت های خبری نمایش می دهد

کاری که ما می خواهیم انجام دهیم این است که یک فیلد جدید به ماژول اضافه کنیم که با توجه به محدود زمانی انتخابی کاربر تایتل های مطالب اون بازه زمانی رو در بالای ماژول نمایش بدهد فیلدی مشابه شکل زیر :

[تصویر: xpwxnn91uf6m7totswb7.jpg]


به طور کلی در جوملا برای یجاد یه همچین تغیراتی باید 2 تا فایل ویرایش بشه
اول فایل xml اصلی ماژول که در روت ماژول قرار دارد و تغیراتش مستقیما در مدیریت ماژول اعمال می شود
دوم فایل php که دستورات دیتا بیس و نمایشی سمت سایت رو توش می نویسیم که معمولا در پوشه helper ماژول قرار دارد


اولی فایل xml ماژول است که توی روت اصلی ماژول به ادرس زیر قرار دارد را با یک ویرایش گر مانند notepad++ باز می کنیم

modules\mod_jvnews\mod_jvnews.xml

به دنبال فیلد های قبلی و موجود ماژولمون می گردیم

مثلا قبلا اخرین فیلدی که داشتیم فیلد فعال بودن لينك بوده که name ان در کد هامون به شکل grouplink می باشد
ما زیر تگ بسته فیلد قبلی فیلد جدید خودمون را قرار می دهیم

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

برای مثال ما یک فیلد لیست انتخاب می کنیم و تغیرات لازم رو می دهیم و در نهایت به شکل زیر در فایل xml مون اضافه می کنیم و دخیره می کنیم

کد PHP:
                  <field name="max_days" type="list" default="" label="محدوده زمانی" description="">
  <
option value="10000">همه </option>
  <
option value="7">یک هفته </option>
   <
option value="14">دو هفته  </option>
   <
option value="21">سه هفته </option>
   <
option value="30">یک ماه </option>
</
field


با یک ریفرش دادن در قسمت مدیریت ماژول مورد نظر می بینیم که فیلد لیست اضافه شده است


خوب تا اینجای کار نصف کار انجام شد

برای ادامه کار فقط کافی است فایل php ماژول را ویرایش کنیم

معمولا اطلاعات مربوط به فیلد ها و پارامتر های ماژول در فایل helper می باشد ولی قطعیتی وجود ندارد و باز ممکن است در یکی دیگر از فایل های php این دستورات قرار داده شود
برای این که یک پارچه و منظم باشد کد های ماژولتون نام پارامتر های قبلی ماژول را سرچ کنید تا مکان کد های قبلی را پیدا کنید

خوب برای این ماژول کد های دستوری دیتا بیس در مسیر زیر قرار دارند :

modules\mod_jvnews\tmpl\Default\default.php

فایل رو با یک ویرایش گر باز می کنیم
همون طور که گفتم کاری که ما می خواهیم انجام دهیم نمایش عنوان مطالب با توجه به گزینه محدوده زمانی انتخاب شده در قسمت مدیریت هستش و چون می خواهیم در بالای ماژول این نمایش انجام شود بلا فاصله بعد از دستور های کلی php کدمون را در حدود خط 30 قرار می دهیم
فیلدی که اون ور کاربر انتخاب می کند فیلدی به نام max_days می باشد که با توجه به فیلدی که انتخاب می کند مقدار value متفاوت است مثلا اگر یک هفته را انتخاب کند مقدار value =7 بر می گردد

کاری که کد ما می خواهیم انجام دهد این است که ابتدا ما تاریخ امروز را بدست می آوریم بعد با توجه به مقدار value در max_days از اون تاریخ تا به امروز را به ما گزارش می دهد یعنی اگر یک هفته انتخاب شد مقدار value =7 می شود پس بازه زمانی ما از هفت روز قبل تا به امروز می شود اگر مقدار دو هفته انتخاب شود مقدار value =14 می شود پس بازه زمانی ما از 14 روز قبل تا به امروز می شود و....
که این کار توسط یک شرط if به شکل زیر نوشته می شود

حال به تشریح دقیق کد زیر می پردازیم :
در ابتدا ما پارامتری داریم به اسم reza که تاریخ امروز را نمایش می دهد و یک پارامتر دیگر داریم به اسم taher که تغیرات که روی تاریخ امروز قرار است انجام شود رو می گوید و یک پارامتر هم داریم به اسم reza2 که تاریخ بعد از اعمال تغیرات taher را نمایش می دهد و در نهایت بازه بین reza و reza2 می شود محدوده زمانی ما
در مرحله بعد همون طور که گفته شد با یگ شرط if مقدار reza2 را برای value های مختلف می نویسیم

نکته : دو دستور زیر مشابه همدیگر است یعنی فرقی نمی کند 30 روز از day کم کنیم یه یک ماه از month

کد PHP:
$taher mktime(0,0,0,date("m")-1,date("d"),date("Y"));

$taher mktime(0,0,0,date("m"),date("d")-30,date("Y")); 

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

کد PHP:
$db JFactory::getDBO(); 

با این خط دستور می دهیم از دیتا بیسی که فراخوانی شد از تیبل tfmw4_content (پیشوند دیتا بیس خودتون را بنویسد ) تایتل هایی را برای ما منتشر کن که مقدار ستون created (تاریخ انتشار آن ) از reza2 بیشتر هستند که در واقع با این کار عنوان مطالب از تاریخ reza2 تا به امروز بدست می آید

کد PHP:
$query ="SELECT title FROM tfmw4_content WHERE created >'$reza2'"

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

کد PHP:
$db->setQuery($query); 


با این خط کد نتایج گرفته شده از کوئری را در ردیف های قرار می دهد
کد PHP:
$rows $db->loadObjectList(); 


و در نهایت با کد زیر مقدار ردیف های گرفته شده را echo و چاپ می کند


کد PHP:
<ul>
<?
php foreach($rows as $si => $item):?>
<li><?php echo $item->title ?></li>
<?php endforeach ?>
</ul> 


نکته مهم : در داخل تگ php نمی توان همین طوری یک کد html را به کار برد مگر این که کد را در داخل کوتیشن قرار بدهیم



در زیر کد نهایی قسمت php و به صورت کامل و نهایی اورده شده است :



کد PHP:
<?php
$reza
=date("Y-m-d");
$taher mktime(0,0,0,date("m"),date("d"),date("Y"));
$reza2=date("Y-m-d"$taher);


     
$max_days $params->get('max_days''');                
        if (!empty(
$max_days)) {
            
            switch(
$max_days) {
            
                case 
'7':
                     
$taher mktime(0,0,0,date("m"),date("d")-7,date("Y"));
                    
$reza2=date("Y-m-d"$taher);
                    break;


                    
                case 
'14':
                     
$taher mktime(0,0,0,date("m"),date("d")-14,date("Y"));
                     
$reza2=date("Y-m-d"$taher);
                    break;


                    
                case 
'30':
                     
$taher mktime(0,0,0,date("m")-1,date("d"),date("Y"));
                       
$reza2=date("Y-m-d"$taher);
                    break;
                    
                    case 
'10000':
                     
$taher mktime(0,0,0,date("m"),date("d"),date("Y")-5);
                       
$reza2=date("Y-m-d"$taher);
                    break;
                    
                    
                    }
            }
?>





<?php 
$db 
JFactory::getDBO();

$query ="SELECT title FROM tfmw4_content WHERE created >'$reza2'";

$db->setQuery($query);
$rows $db->loadObjectList();

?>

<ul>
<?php foreach($rows as $si => $item):?>
<li><?php echo $item->title ?></li>
<?php endforeach ?>
</ul> 
[تصویر: p1yi5d6sh60hdpc948p.jpg]
#2
خوب در مثال قبل فیلدی برای بازه زمانی درست کردیم و با یک شرط if بازه زمانی برای نمایش مطالب در اون بازه زمانی را درست کردیم

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


خوب برای مثال ما دوباره از همان ماژول mod_jvnews استفاده می کنیم این ماژول همان طور که می بینید در نمایشش بخش ها و ایتم های زیادی دارد (از جمله عکس - متن و ... )
ما اگر بخواهیم به کل این ایتم ها شرط مورد نظر را برای بازه زمانی مان بدهیم باید چه کار کنیم ؟


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

این شروط در متد buildCondition وجود دارد این متد در فایل content.php موجود می باشد خطی که عبارت where وجود دارد مربوط به شروط است که کوئری ما را می دهد

در این متد خط کد زیر وجود دارد

کد PHP:
$condition .= ' WHERE '.implode(" AND "$where). ' ' .$order

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


کد PHP:
$condition .= ' WHERE '.implode(" AND "$where)." AND a.created < '$reza2' "' ' .$order


در ابتدای متد هم باید شرط if را که قبلا نوشته بودیم برای پارامتر reza2 به شکل زیر بنویسیم :

کد PHP:
$reza=date("Y-m-d");
$taher mktime(0,0,0,date("m"),date("d"),date("Y"));
$reza2=date("Y-m-d"$taher);

$max_days $this->params->get('max_days''');  

        if (!empty(
$max_days)) {
            
            switch(
$max_days) {
            
                case 
'7':
                     
$taher mktime(0,0,0,date("m"),date("d")-7,date("Y"));
                    
$reza2=date("Y-m-d"$taher);
                    break;


                    
                case 
'14':
                     
$taher mktime(0,0,0,date("m"),date("d")-14,date("Y"));
                     
$reza2=date("Y-m-d"$taher);
                    break;


             
                case 
'30':
                     
$taher mktime(0,0,0,date("m")-1,date("d"),date("Y"));
                       
$reza2=date("Y-m-d"$taher);
                    break;
                   
                    case 
'10000':
                     
$taher mktime(0,0,0,date("m"),date("d"),date("Y")-5);
                       
$reza2=date("Y-m-d"$taher);
                    break;
                    
                    
                    }
            } 


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

که در مرحله قبل به شکل

کد PHP:
$max_days $params->get('max_days'''); 
می نوشتیم ولی در اینجا به این شکل می نویسیم

کد PHP:
$max_days $this->params->get('max_days'''); 



قطعه کد نهایی ما در این متد به شکل زیر می شود :


کد PHP:
    
    
function buildCondition($catids null){
        

$reza=date("Y-m-d");
$taher mktime(0,0,0,date("m"),date("d"),date("Y"));
$reza2=date("Y-m-d"$taher);

$max_days $this->params->get('max_days''');  

        if (!empty(
$max_days)) {
            
            switch(
$max_days) {
            
                case 
'7':
                     
$taher mktime(0,0,0,date("m"),date("d")-7,date("Y"));
                    
$reza2=date("Y-m-d"$taher);
                    break;


                    
                case 
'14':
                     
$taher mktime(0,0,0,date("m"),date("d")-14,date("Y"));
                     
$reza2=date("Y-m-d"$taher);
                    break;


             
                case 
'30':
                     
$taher mktime(0,0,0,date("m")-1,date("d"),date("Y"));
                       
$reza2=date("Y-m-d"$taher);
                    break;
                   
                    case 
'10000':
                     
$taher mktime(0,0,0,date("m"),date("d"),date("Y")-5);
                       
$reza2=date("Y-m-d"$taher);
                    break;
                    
                    
                    }
            }


        
$order     $this->buildContentOrderBy();
        
$condition ' ';  
        
$where     = array();  
        
$catids    $catids != null ? (array) $catids : (array) $this->params->get('catid''0');
        
        if(
$this->source == 'fpcontent'){
            
$condition .=     'JOIN #__content_frontpage AS fp ON fp.content_id = a.id';
        }
        
        
$where[]    = "c.id in (".implode(','$catids).")";
        
$where[]    = "a.state > 0";
        
$where[]    = "c.published = 1";
       
        
$condition .= ' WHERE '.implode(" AND "$where)." AND a.created < '$reza2' "' ' .$order;  

        return 
$condition;      
    } 
[تصویر: p1yi5d6sh60hdpc948p.jpg]
#3
خوب تغیری که امروز می خواهیم روی ماژول انجام دهیم :

باز بروی ماژول mod_jvnews با کمک پلاگین نمایش آواتار که در واقع می خواهیم وصل کردن یک پلاگین به ماژول را انجام دهیم

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

همان طور که می دونیم روال ماژول jvnews به این صورت است که اگر مطالب تصویر داشتند تصویر مطالب رو نمایش می دهد و اگر نداشتند یک تصویر پیش فرض NO image رو نمایش می دهد .

حال کاری که ما می خواهیم انجام دهیم این است که یک فیلد در مدیریت ماژول اضافه کنیم به اسم تصویر کاربر که اگر روی yes بود به جای کل تصاویر تصویر نویسنده مطلب نمایش داده شود و اگر روی no بود روال قبلی رو انجام دهد

برای این کار ابتدا در فایل mod_jvnews.xml یک فیلد برای این کار معرفی می کنیم

کد PHP:
        <field name="avatar" type="radio" default="0" label="JVTABS_AVATAR" description="JVTABS_AVATAR_DESC">
                    <
option value="0">JNo</option>
                    <
option value="1">JYes</option>
                </
field

خوب ابتدا باید دسترسی و فراخوانی عکس کاربر رو به ماژول اضافه کنیم این کار را با ویرایش فایل helpers/content.php انجام می دهیم
در خط ۷۰ این فایل شروط if اورده شده است ما بعد از شرط $item->emailLink و قبل از شروع if جدید قطعه کد زیر را اضافه می کنیم که دسترسی ما به عکس کاربری می باشد :

کد PHP:
$db       JFactory::getDbo();
            
$query $db->getQuery(true);

                 
$query->select('profile_value');
                 
$query->from('#__user_profiles');
                
$query->where('user_id = '.(int) $item->created_by);
                
$query->where('profile_key = '.$db->quote('profilepicture.file'));
                 
$db->setQuery($query);
                     
$item->profilepic $db->loadResult(); 

خوب در مرحله بعد وارد فایل default_article.php می شویم در خط 16 معرفی متغیر $thumbnail = ''; شروع می شود که این متغیر همون تصویر بند انگشتی می باشد که در ماژول نمایش داده می شود که ما می خواهیم شروط این تصویر را قرار دهیم که از قبل همون طور که گفتیم شروط برای این تصویر بند انگشتی موجود می باشد که ما یک شرط دلخواه خودمون رو بهش اضافه می کنیم و شروط قبلی را در غیر این صورت و زیر شاخه این شرط قرار می دهیم

به این شکل
if
شرط ما
else
حالت پیش فرض قبلی

که شرط ما این است که فیلد نمایش اواتار روی yes باشد تصویر اواتار کاربر نمایش داده شود و در غیر این صورت حالت پیش فرض قبلی پس زیر متغیر $thumbnail این چند خط را اضافه می کنیم

کد PHP:
if($avatar=='1')
{
  
$thumbnail =  JURI::base(1).'/media/plg_user_profilepicture/images/50/'.$item->profilepic;
}
else{ 

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

کد PHP:
$thumbnail '';
if(
$avatar=='1')
{
  
$thumbnail =  JURI::base(1).'/media/plg_user_profilepicture/images/50/'.$item->profilepic;
}
else{
 if(isset(
$specialArticle->thumbnails[0])){
    
$thumbnail =  $specialArticle->thumbnails[0];
}
elseif(
$params->get('show_noimage') != '0'){
  
$thumbnail =  JURI::base(1).'/modules/mod_jvnews/tmpl/'.$template.'/images/no_image.gif';
}



عینا مشابه همین کار را برای سه فایل دیگر یعنی
default_intro.php
default_leading.php
default_link.php

هم انجام می دهیم و شرط خودمان را اضافه می کنیم


ماژول بعد از اعمال این تغیر


فایل‌های ضمیمه
.zip   mod_jvnews_j16_1.6.1.5 (1).zip (اندازه: 52.69 KB / دانلودها: 0)
[تصویر: p1yi5d6sh60hdpc948p.jpg]
#4
خوب اموزش دیگری که می خواهیم امروز بدهیم بروی یکی از کامپوننت های جوملا یعنی کامپوننت نمایش مطالب (مقالات ) جوملا هستش

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

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

ابتدا به مسیر administrator\components\com_content\models\articles.php می رویم این مسیر مکانی است که باکس های فیلترمون رو نوش مشخص می کنیم در مکانی که دوست داریم باکس *****نمایش داده شود دو باکس برای search2 و search3 مطابق قطعه کد زیر اضافه می کنیم ما این کار رو در لاین 77 تا 83 قرار دادیم که در واقع می شود وسط *****های موجود

کد PHP:
        $search2 $this->getUserStateFromRequest($this->context.'.filter.search2''filter_search2');
        
$this->setState('filter.search2'$search2);
        
        
        
$search3 $this->getUserStateFromRequest($this->context.'.filter.search3''filter_search3');
        
$this->setState('filter.search3'$search3); 

در مرحله بعد در لاین 120 قسمت protected function باید *****ها به شکل زیر معرفی کنیم :
کد PHP:
    $id    .= ':'.$this->getState('filter.search2');
        
$id    .= ':'.$this->getState('filter.search3'); 

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


کد PHP:
protected function getStoreId($id '')
    {
        
// Compile the store id.
        
$id    .= ':'.$this->getState('filter.search');
        
$id    .= ':'.$this->getState('filter.search2');
        
$id    .= ':'.$this->getState('filter.search3');
        
$id    .= ':'.$this->getState('filter.access');
        
$id    .= ':'.$this->getState('filter.published');
        
$id    .= ':'.$this->getState('filter.category_id');
        
$id    .= ':'.$this->getState('filter.author_id');
        
$id    .= ':'.$this->getState('filter.language');

        return 
parent::getStoreId($id);
    } 

در حدود لاین 230 باید شرط if را برای این دو *****ایجاد کنیم بعد از شرط سرچ عادی ( // Filter by search in title.
) این دو رو به شکل زیر ایجاد کنیم

کد PHP:
        $search2 $this->getState('filter.search2');
        
$search3 $this->getState('filter.search3');

        

        
        if (!empty(
$search2)&&!empty($search3) ) {
            if (
stripos($search2'id:') === 0
            {
            
                   
$query->where('a.id = '.(int) substr($search23));
            }
            elseif (
stripos($search2'author:') === 0
            {
                
$search2 $db->Quote('%'.$db->escape(substr($search27), true).'%');
                
$query->where('(ua.name LIKE '.$search2.' OR ua.username LIKE '.$search2.')');
            }
            else 
            {
                
//$search2 = $db->Quote('%'.$db->escape($search2, true).'%');
              // $query->where("(a.created > '2013-04-14')");
               
$query->where("(a.created > '$search2')");
               
$query->where("(a.created < '$search3')");

                }
        } 


در مرحله بعد به مسیر administrator\components\com_content\views\articles\tmpl\default.php می رویم ودر لاین ۳۸ تا ۴۷ ابزار تقویم خود را برای اعمال *****معرفی می کنیم


کد PHP:
            
<link rel="stylesheet" type="text/css" href="http://unicloob.ir/3333/jquery.datetimepicker.css"/>
<
link rel="stylesheet" type="text/css" href="http://unicloob.ir/3333/reza.css"/>

            <
input type="text" class="some_class" name="filter_search2" id="filter_search2" value="<?php echo $this->escape($this->state->get('filter.search2')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />
            <
input type="text" class="some_class" name="filter_search3" id="filter_search3" value="<?php echo $this->escape($this->state->get('filter.search3')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />
  
<
script src="http://unicloob.ir/3333/jquery.js"></script>
<
script src="http://unicloob.ir/3333/jquery.datetimepicker.js"></script>
<
script src="http://unicloob.ir/3333/reza.js"></script



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


فایل‌های ضمیمه
.php   articles.php (اندازه: 10.09 KB / دانلودها: 1)
.php   default.php (اندازه: 10.6 KB / دانلودها: 1)
[تصویر: p1yi5d6sh60hdpc948p.jpg]


موضوعات مشابه ...
موضوع: نویسنده پاسخ: بازدید: آخرین ارسال
  پرسش و پاسخ جوملا m.taherkhani 62 21,255 2016-07-23, 12:26 PM
آخرین ارسال: m.taherkhani
  آموزش گام به گام RS FORM جوملا m.taherkhani 14 16,512 2016-07-22, 08:58 PM
آخرین ارسال: ucyr4u
  امکان ایجاد مولتی کتیگوری (چند مجموعه ) در جوملا 3 m.taherkhani 0 906 2015-11-23, 01:21 PM
آخرین ارسال: m.taherkhani
Thumbs Down سوال درمورد فرم ساز rs form جوملا dayyer 11 2,686 2015-01-13, 02:59 PM
آخرین ارسال: m.taherkhani
5 مشکل در ساخت منو و ارجاع به صفحه اول dayyer 1 958 2014-12-24, 01:48 PM
آخرین ارسال: m.taherkhani
  آموزش فارسی سازی (RTL کردن ) قالب جوملا m.taherkhani 2 5,537 2014-12-05, 07:49 PM
آخرین ارسال: m.taherkhani
  نمونه هایی از سایت های جوملایی m.taherkhani 12 14,091 2013-05-21, 08:14 PM
آخرین ارسال: s1r101
  مشکل در بروزرسانی جوملا 2.5 به 2.58 yyaass 0 1,612 2012-12-09, 02:33 PM
آخرین ارسال: yyaass
  آموزش گام به گام جوملا m.taherkhani 31 23,239 2012-12-03, 01:17 AM
آخرین ارسال: m.taherkhani

پرش در انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان