Category: Joomla

A letter to our bengali community of joomla and wordpress

to whom it may concern or not concern

নোটঃ একান্ত ব্যক্তিগত মতামত, পজেটিভ সমালোচনাও আছে কিছু জায়গায়, কারো কারো ব্যক্তিগত ভাবে লাগতে পারে কিন্তু সত্য সব সময় কঠিন হবে এটা মেনেই বাকীটুকু পড়তে হবে।

// দেশের বিভিন্ন টেক ইভেন্ট আমার অংশ গ্রহন এই রকম প্যাটার্নের ০ ০ ০ ১ ০ ০ ১০১০০০১ মানেই বুঝত পারতে ৩/৪টা ইভেন্টের (যা আমার কাছের সাথে সম্পর্কিত ) গড়ে একটিতে যাওয়া পড়ে। শেষ দুইটি ইভেন্টে অংশগ্রহন ছিল এক/ আজকে জুমলা ৩.x বাংলা অনুবাদ দুই/ ওয়ার্ডপ্রেসিয়ান গ্রুপ এর সম্ভবত ৬ষ্ঠ বা ৭ম মিটাপ। নিজের কিছু ব্যক্তিগত কারণ যেমন, ইভেন্টের দিন সময় বের করা , ইভেন্টে আমার কাজ যদি হয় শুধু বসে বসে শোনা (এক্ষেত্রে এক টানা কিছুক্ষন বসে থাকার পর আবার শারীরিক সমস্যা দেখা দেয় যেটা স্নায়ুবিক)

// দেশে যারা প্রডাক্ট বিক্রি করে তাদের সবাই এনভাটো গিয়ে বিক্রি করে না। অনেকেই নিজদের মার্কেট প্লেস তৈরি করে বিক্রি করে। এর মানে দাড়াচ্ছে এনভাটোর দেশের বর্তমান অনেক অথর যখন মার্কেটপ্লেস কি এটাই জানতো না তখন আমরা কয়েক জন ছোট স্টার্ট আপ দাড় করিয়ে কেউ বিভিন্ন সিএমএস এর জন্য এক্সটেনশন আবার কেউ থীম বা টেমপ্লেট বানিয়ে বিক্রি করতাম। তার মানে দাড়াচ্ছে আমাদের কেউ কেউ এখনো বড় মার্কেট প্লেসের সাথে পাল্লা দিয়ে নিজেদের প্রডাক্ট নিজেদের মার্কেটপ্লেসে বিক্রি করে যাচ্ছি এখনো।

//আমার শেষ থেকে অংশগহন করা ২য় ইভেন্ট ছিল ওয়ার্ডপ্রেসিয়ান এর ৬ষ্ঠ বা ৭ম মিটাপ, সেখানে আমি আর জুমশেপার এর কাউছার ভাই গিয়েছিলাম। একজন সাধারণ অংশগ্রহনকারী হিসাবে গিয়েছিলাম এবং যথেষ্ট ধৈর্য ধরে প্রায় প্রতিটি প্রেজেন্টেশন এর কম বেশি শুনেছি মাঝ খানে টুক টাক আড্ডা ছাড়া। শেষের দিকে যখন কাউছার ভাইকে জুমলার টেমপ্লেট ডেভেলপার হিসাবে পরিচয় করায়ে দেওয়া হল তখন আমি একসময় বের হয়ে আসছি। আমার সামান্য লেগেছিল, কারণ আমরা দুইজনই জুমলা নিয়ে কাজ করে বেশি পরিচিত, উনি টেমপ্লেট বানান, আমি এক্সটেনশন। কাউছার ভাইয়ের উপর কোন রাগ নেই, সে তার কাছের যোগ্য সম্মান পাবে, তার কাজকে আমিও সম্মান করি। কিন্তু মনে হচ্ছে, কিছু মানুষ ওয়ার্ডপ্রেস এর উপর ডেভেলপ করে ফাটিয়ে ফেলতেছে কিন্তু জুমলার এক্সটেনশনের নাম শুনে নাই কখনো ? যেহেতু আমি জুমলা বাংলাদেশ গ্রুপের এডমিনদের একজন এবং যদি জুমলার কোন ইভেন্টের সঞ্চালক থাকি আর সেখানে ওয়ার্ডপ্রেস এর কোন নোটেবল ডেভেলপার থাকে তাহলে আমি তাকে অবশ্যই ডেকে নিব। কারো সাথে যদি আমার ব্যক্তিগত কোন সমস্যাও থাকে কমিউনিটি ইভেন্টে সেটা আমি কোন ভাবেই প্রকাশ করব না।

//ডিজিটাল ওয়ার্ড এর সিএমএস কনফারেন্সে যাওয়ার সময় ম্যানেজ করতে পারি নাই। তবে জানতে পারলাম সেখানে এমন স্পিকারও সিলেক্ট করা হয়েছে যে, জুমলা ফালতু বা জুমলা ৪২০ এমন কথাও বলেছে। আমার মনে হয় জেনে কথা বলা উচিৎ। যে জুমলা এবং ওয়ার্ডপ্রেস বা আরো অন্য সিএমএস নিয়ে জানে সে বুঝতে পারবে এক একটা সিএমএস এর ফিলোসফি, লার্নিং কার্ভ, মার্কেট প্লেস, ব্যবহারের রেটের আপ্স -ডাউন, ব্যবহারের প্রয়োগ এক এক রকম। এটা নির্ভর করে দৃষ্টিভঙ্গির উপর । একটা ছোট উদাহরন দিলে সহজ হবে বুঝতে, একবার জুমলার একটা ইভেন্ট শেষে আমরা সবাই খেয়াল করলাম, কাউছার ভাই এর লেকচার ছিল জুমলা দিয়ে সাইট বানানোর জন্য আপনাকে কোডিং জানতে হবে না আর আমার লেকচার ছিল কোডিং জানতে হবে। যেহেতু উনি টেমপ্লেট নিয়ে বলেছেন উনার পারসপিক্টিভ থেকে, আমি এক্সটেনশন নিয়ে বলেছি আমার পারস্পিক্টিভ থেকে। দুইজনই সঠিক। এর মানে দাড়াচ্ছে আপনি যদি জুমলা নিয়ে সমালোচনা করেন তাহলে এটা জেনে করেন। ডিজিটাল ওয়ার্ল্ডে জুমলার এক্সটেনশন ডেভেলপ নিয়ে একটা লেকচার/স্পিক থাকতেই পারত। কমিউনিটিতে পোস্ট হতে পারত আগ্রহী স্পীকার এবং টপিক লিস্ট নিয়ে। হয়তো বেসিস এটা ম্যানেজ করে, সেটা তাদের ব্যাপার। আমি আমার একান্ত ব্যক্তিগত মতামত দিচ্ছি।

// একই বিষয় নিয়ে কাজ করার জন্য অনেক গুলো গ্রুপ থাকতে পারে, জাতীয় ইভেন্টে সবাইকে এক্টিভ গ্রুপগুলোকে সমন্বয় করা উচিৎ, ব্যক্তি কেন্দ্রিক সিদ্ধান্ত না নিয়ে।

//কোন অপারেটিং সিস্টেম ব্যবহার করছি সেটা আমরা জন্য এত গুরুত্বপূর্ণ না, সেই অপারেটিং সিস্টেমে আমি স্বাচ্ছন্দে কাজ করছি পারছি কিনা সেটাকে গুরুত্ব দেয়।

//জুমলা সম্পর্কে জানার আগে থেকে ওয়ার্ডপ্রেস এর প্রেমে পড়েছি। পরে চাকরী করতে গিয়ে জুমলাতে কাজ করে এটাতেও কাজ শুরু করি। জুমলা, ওয়ার্ডপ্রেস কিংবা মুডল এগুলোর প্রতিটিতে কাজ করছি প্যাশন থেকে, টাকা আয় করার জন্য না। টাকা আয় একটি প্রাকটিক্যাল ধাপ কারণ কাজ করলে টাকা আসবে।

// আমি হনু বলে আমার আশে পাশের বাগানে আর কোন হনুমান থাকতে পারবে না বা আর কেউ কাজ করতে পারবে না এমন ভাবার কারণ নাই। আমি ‘x’ নিয়ে কাজ করছ বলে আশে পাশের সবাই ‘x’ নিয়ে কাজ করবে এমন ভাবার কিছু নাই। সহজ কাজ সবাই করে, কঠিন কাজ করার লোকের অভাব। ‘ক’ প্রতিষ্ঠান ওয়ার্ডপ্রেস নিয়ে কোর্স করালে ‘খ’ গ্রুপের গাত্র দাহ হবার কিছু নাই। ‘গ’ জুমলার একটা ভালো টেমপ্লেটে বানালে ‘ঘ’ কম্পানীর এটা নিয়ে ঘষাঘষির কিছু নাই। পারলে ভালো কিছু কর, পারলে ভালো কাজের প্রশংসা কর, খারাপ কাজের পজেটিভ সমালোচনা কর। কিছুদিন আগে রাগীব ভাইয়ের শিক্ষক সাইটের ওয়ার্ডপ্রেস এর একটা কোর্স নিয়ে ওয়ার্ডপ্রেসিয়ান গ্রুপের সাধারণ সদস্যের পাশাপাশি এডমিনদের পক্ষ থেকে কুৎশিত ভালো নেগেটিভ সমালোচনা করতে দেখেছি। দ্বায়িত্বশীলতা আর বালখিল্যতা এক নয়। আমি নিজেও ওয়ার্ডপ্রেসিয়ান গ্রুপের নিয়মিত সদস্য, সময় পেলেই সাহায্য করি অন্যদের যেমনটা জুমলা বাংলাদেশ গ্রুপে। নতুনরা উদ্ভুৎ ভাবে প্রশ্ন করলে তাদের মাথা ঠান্ডা করে কোন সময় মজা করে বা কোন সময় বকা দিয়ে সাহায্য করার চেস্টা করি।

//কাউকে ফলো না করে নিজের মত নিজের ট্রেন্ড নিয়ে চলতে পছন্দ করি। কেউ আমাকে ফলো করুক না করুক তা নিয়ে আমার কোন চিন্তা নাই। আমার কাউকে ফলো করতেই হবে এমন ভাবার কিছু নাই। তবে কমিউনিটি ইভেন্ট গুলোতে আমি সবাইকে সম্মান দেওয়ার চেস্টা করি এবং সবার মতামত গ্রহন করে কাজ করতে পছন্দ করি, দিন শেষে কাজগুলো শেষ করতে পছন্দ করি।

// হুট জুমলা বা ওয়ার্ডপ্রেস নিয়ে কাজ করে টাকা করা টাইপ লোক আমি নই, আমি আমার ক্যারিয়ার এর শুরু থেকে এগুলো নিয়ে কাজ করি, যতদূর সম্ভব কমিউনিটিতে কন্ট্রিবিউট করার চেস্টা করি। প্যাশন থেকে করি।

নোটঃ একান্ত ব্যক্তিগত মতামত, পজেটিভ সমালোচনাও আছে কিছু জায়গায়, কারো কারো ব্যক্তিগত ভাবে লাগতে পারে কিন্তু সত্য সব সময় কঠিন হবে এবং আপনি হয়তো মনে করতে পারেন , আমার এই লেখাকে আপনি পাত্তা দেন না কিন্তু সময় নিয়ে ধৈর্য্য ধরে পড়ার জন্য ধন্যবাদ

পোস্টটির সাথে সম্পর্কিত এবং সম্পর্কিত নয় এমন কয়েকজনকে ট্যাগ করলাম। কেউ চাইলে নিজেকে আন ট্যাগ করে নিতে পারেন।

Adding custom fields to ‘any’ joomla component’s any view

I was finding is there any way to add custom fields to joomla core component (please don’t start discussing about other 3rd party has those options built in as I know them and I wanted this with core joomla, btw, I didn’t check the tables for j3.2 yet)

Found this in joomla docs http://docs.joomla.org/Adding_custom_fields_to_the_article_component

where they showed an example how to use the #__user_profiles table where custom or extra user fields are stored.

This seems funny to me what will happen when someone add custom field for user id suppose 321 and same way article id 321 ? !

Current structure of the #__user_profiles table is https://gist.github.com/manchumahara/7427002

I think we need something like
https://gist.github.com/manchumahara/7426784


CREATE TABLE IF NOT EXISTS `#__cbcustompostmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `component` varchar(255) DEFAULT NULL,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext,
  PRIMARY KEY (`meta_id`),
  KEY `post_id` (`post_id`),
  KEY `meta_key` (`meta_key`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

This table sql is little modified from wordpress meta table. I added the extra col ‘component’.

The good use of this table structure is post_id can be used to store any component’s any single view (article , category, event, contact etc) id (means article id, event id, or category id)

for ‘component’ col value should be inserted following this convension “com_content.article” , we need to use the view name with component as for same component we may need to add custom fields for different view like for event component event and venue both are treated as single article .

What do you think ?

Jomsocial auth Controller callback fix to allow other application

I was working with a new extension for jomsocial for auto update any jomsocial status update to linkedin. Please note that jomsocial has a packaged apps for twitter for such purpose and that’s why I was trying to go with same thing for linkedin and tried to use the jomsocial library etc. After authentication callback it was trying to access a method of jomsocial default twitter plugin. That means a hardcode class and it’s method.

Let me share the controller class

class CommunityOauthController extends CommunityBaseController
{
	public function callback()
	{
		$mainframe	=& JFactory::getApplication();
		$my			= CFactory::getUser();
		$denied     = JRequest::getVar( 'denied' , '' );
		$app        = JRequest::getVar( 'app' , '' );
		$url        = CRoute::_('index.php?option=com_community&view=profile&userid=' . $my->id , false );

		if( empty($app) )
		{
			echo JText::_('COM_COMMUNITY_INVALID_APPLICATION');
			return;
		}

		if( $my->id == 0 )
		{
			echo JText::_('COM_COMMUNITY_INVALID_ACCESS');
			return;
		}

		if( !empty( $denied ) )
		{
		    $mainframe->redirect( $url , JText::_( 'COM_COMMUNITY_OAUTH_APPLICATION_ACCESS_DENIED_WARNING' ) );
		}

		$oauth	=& JTable::getInstance( 'Oauth' , 'CTable' );
		if( $oauth->load( $my->id , $app ) )
		{
			$consumer       = plgCommunityTwitter::getConsumer();
			$oauth->userid	= $my->id;
			$oauth->app     = $app;
			$getData    	= JRequest::get('get');

			try
			{
			    $oauth->accesstoken 	= serialize( $consumer->getAccessToken( $getData , unserialize( $oauth->requesttoken ) ) );
			}
			catch( Exception $error )
			{
			    $mainframe->redirect( $url , $error->getMessage() );
			}

			if( !empty($oauth->accesstoken) )
			{
				$oauth->store();
			}
			$msg	= JText::_( 'COM_COMMUNITY_OAUTH_AUTHENTICATION_SUCCESS' );
			$mainframe->redirect( $url , $msg );
		}
	}

Check line number 31
$consumer = plgCommunityTwitter::getConsumer();

Suppose if we take the getConsumer() method is a standard practice to get the configuration for the authentication method for jomsocial application for social network then we can make the plgCommunityTwitter class name here dynamic depending on the variable found from
$app = JRequest::getVar( ‘app’ , ” );

for twitter we get $app = ‘twitter’ and as I was developing another apps plugin and it’s application name is “cblinkedin” it will get $app = ‘cblinkedin’

So just modifying the line 31 will give other extension developer use this controller and this will be more practical and my suggestion here is modifying the code like

//$consumer       = plgCommunityTwitter::getConsumer();
                        //$consumer       = plgCommunityCBLinkedin::getConsumer();
                        $appclassname   = strtolower('plgCommunity'.$app);                        
                        $consumer       = call_user_func( array($appclassname,'getConsumer') );  

What do you think ?

BTW, we are close to develop an jomsocial extension that will allow users to update their jomsocial status update to linkedin as the core twitter apps does. Let me show my screenshot of current work.

I am testing here

Update: 12.08.2012
I have a new update for the above issue and that can be solved using adding an extra method in the plugin.

Solution is using onSystemStart method and check if the app is your plugin app and task is call back.

function onSystemStart(){
                    $mainframe  =& JFactory::getApplication();
                    $my         = CFactory::getUser();
                    $denied     = JRequest::getVar( 'denied' , '' );
                    $app        = JRequest::getVar( 'app' , '' );
                    $task       = JRequest::getVar( 'task' , '' );
                    $url        = CRoute::_('index.php?option=com_community&view=profile&userid=' . $my->id , false );
                    if($app == 'cblinkedin' && $task == 'callback'){
                        if( $my->id == 0 )
                        {
                                echo JText::_('COM_COMMUNITY_INVALID_ACCESS');
                                return;
                        }

                        if( !empty( $denied ) )
                        {
                            $mainframe->redirect( $url , JText::_( 'COM_COMMUNITY_OAUTH_APPLICATION_ACCESS_DENIED_WARNING' ) );
                        }

                        $oauth	=& JTable::getInstance( 'Oauth' , 'CTable' );
                        if( $oauth->load( $my->id , $app ) )
                        {
                              
                              
                                $consumer       = plgCommunityCBLinkedin::getConsumer();                              
                                $oauth->userid	= $my->id;
                                $oauth->app     = $app;
                                $getData    	= JRequest::get('get');

                                try
                                {
                                    $oauth->accesstoken 	= serialize( $consumer->getAccessToken( $getData , unserialize( $oauth->requesttoken ) ) );
                                }
                                catch( Exception $error )
                                {
                                    $mainframe->redirect( $url , $error->getMessage() );
                                }

                                if( !empty($oauth->accesstoken) )
                                {
                                        $oauth->store();
                                }
                                $msg	= JText::_( 'COM_COMMUNITY_OAUTH_AUTHENTICATION_SUCCESS' );
                                $mainframe->redirect( $url , $msg );
                        }
                    }                    
                    
                }

But still I think if jomsocial gives 3rd party plugins execution for it’s built in Controller.

Quick tips to work with joomla caching in different joomla versions

Here just some quick tips about how to use joomla caching in joomla extensions , here for module and component.

For joomla 1.5 module caching:


//$params, $module are global parameter here , can be used in default.php or have to pass in helper method.
$enable_cache 		=   $params->get('cache',0);
$cachetime		=   $params->get('cache_time',0);
//for 1.5
if($enable_cache == 1) {
    $conf =& JFactory::getConfig();
    $cache = &JFactory::getCache($module->module);
    $cache->setLifeTime( $params->get( 'cache_time', $conf->getValue( 'config.cachetime' ) * 60 ) );
    $cache->setCaching(true);
    $cache->setCacheValidation(true);
    $output =  $cache->get( array('modClassname', 'getMethod'), array($params, $module));
} else {
    $output = modClassname::getMethod($params,$module);
}

For joomla 1.6 we do the same thing in following way

$cacheparams = new stdClass;
$cacheparams->cachemode = 'safeuri';
$cacheparams->class = 'modClassname';
$cacheparams->method = 'getMethod';
$cacheparams->methodparams = array($params,$module);
$cacheparams->modeparams = array('id'=>'int','Itemid'=>'int');
$output = JModuleHelper::moduleCache ($module, $params, $cacheparams);

For joomla 1.5 and 1.6 compatibility we can code like this which will work for both joomla version

$enable_cache 		=   $params->get('cache',0);
$cachetime		=   $params->get('cache_time',0);
if(version_compare(JVERSION,'1.6.0','ge')) {
    $cacheparams = new stdClass;
    $cacheparams->cachemode = 'safeuri';
    $cacheparams->class = 'modClassname';
    $cacheparams->method = 'getMethod';
    $cacheparams->methodparams = array($params,$module);
    $cacheparams->modeparams = array('id'=>'int','Itemid'=>'int');
    $output = JModuleHelper::moduleCache ($module, $params, $cacheparams);
}
else{
    //for 1.5
    if($enable_cache == 1) {
            $conf =& JFactory::getConfig();
            $cache = &JFactory::getCache($module->module);
            $cache->setLifeTime( $params->get( 'cache_time', $conf->getValue( 'config.cachetime' ) * 60 ) );
            $cache->setCaching(true);
            $cache->setCacheValidation(true);
            $output =  $cache->get( array('modClassname', 'getMethod'), array($params, $module));
    } else {
            $output = modClassname::getMethod($params,$module);
    }
}

Note: here I assumed the modClassname is the class name of the helper and modMethod is the method used to handle the caching part. In next post I will write something about the component caching and in 3rd one post about how to caching when we are not doing any function call or how about handle caching in plugin. Let me have time for the next post.

Detect User type in joomla 1.6 or later

In Joomla1.5.x we can detect user type easily or check if a user is admin type.

    $isadmin = false;
    $user           =&JFactory::getUser();
    if($user->usertype == "Super Administrator" || $user->usertype == "Administrator"){
        $isadmin = true;
    } 

But from joomla 1.6 as the user group architecture is changed the above way will not work.
From j1.6 we can do this in this way, here actually I was trying to detect if the user is super user or not like admin user in j1.5

$isadmin = false; 
    $user           =&JFactory::getUser();
    $db = JFactory::getDbo();
    //var_dump($user->getAuthorisedGroups());
    $userid         = intval($user->get( 'id' ));
    if($userid > 0){
        $query = $db->getQuery(true);
        $query->select('g.title AS group_name')
        ->from('#__usergroups AS g')
        ->leftJoin('#__user_usergroup_map AS map ON map.group_id = g.id')
        ->where('map.user_id = '.(int) $userid);
        $db->setQuery($query);
        $ugp = $db->loadObject();
        $usertype =  $ugp->group_name;
        if(is_string($usertype)) $usertype = array($usertype);
        if(in_array('Super Users', $usertype)){
            $isadmin = true;
        }
        //var_dump($usertype);
    }

thanks

My trouble story about ‘onContentPrepare’ hook for joomla

1. I was developing a content plugin for joomla, currently I was working with joomla1.6 or earlier.
2. My target was skip some specific or used defined category for the plugin execution as this is very useful feature.
3. It works in article details page but doesn’t work in other view of com_content component. Why
4. Here is the function that get’s hooked in content plugin for onContentPrepare
Continue reading

Virtuemart2.0 content plugin support/fix for joomla1.6+

I see virtuemart2 is compatible with joomla 1.6 , hope for 1.7 too. I see there is a issue for content plugin compatibility for vm2 in joomla1.6. Then checked the vm2 code where the plugin event if fired. I see the plugin trigger method is not compatible with 1.6 content plugin structure, the hook name is for old joomla 1.5 series

note: paths are windows style
folder components\com_virtuemart\views\productdetails open file view.html.php line 97
Continue reading