Ok, det är inte helt att konfigurera MODx att fungera som en blogg, som t. ex på Åmålsbilder.se. Det finns ju t. ex ingen automatisk ping funktion som i WordPress. Det finns ett stort värde i att kunna pinga blogg sökmotorer, som Twingly, för att tala om att din blogg är uppdaterad, och MODx fixar inte det rakt av.

Så då får vi fundera på en alternativ lösning. Det jobbas på extra bloggfunktionalitet, så som ping, trackback etc, men varför inte prova att bygga en egen, baserat på ”template variables”, mallvariabler. Genom dessa kan vi skapa extra ”variabler” att koppla till en viss sid mall. Det kan t.ex vara ren text, rich text, checkbox alternativ, bild eller liknande.

Så, vi skapar först en mallvariabel till den mall, eller de mallar, vi använder för våra blogginlägg. Vi döper variablen till ”Ping”, kreativt nog.

Vissa sökmotorer vill vi alltid pinga, så vi anger några som standardvärde till vår mallvariabel. Den information vi behöver för att kunna pinga är server adress, sökväg och portnummer. Så vi anger denna information som en array, t. ex: 

rpc.twingly.com;/;80

Utifrån detta kan vi i vår plugin utvinna rätt information. Om vi vill ange fler servrar att pinga lägger vi till dem och separerar med kommatecken:

rpc.twingly.com;/;80,blogsearch.google.com;/ping/RPC2;80

Som vi ser här har Twingly ingen sökväg utan vi skickar pingen direkt till rpc.twingly.com, men Googles bloggsökning vill att vi skickar pingen till blogsearch.google.com/ping/RPC2. Vi anger alltså /ping/RPC2 som sökväg.

Vi skapar sedan en ny plugin, där själva koden skrivs. I korthet så kikar vi efter händelsen ”OnDocFormSave” och triggar vår ping, om det är så att vi använder oss av den mall vi har för blogginlägg. Alltså, först, kolla efter vårt event:

 

$e = &$modx->Event;
switch ($e->name)
{
	case "OnDocFormSave":

                  $docid = $e->params['id'];
                  $siteurl = $modx->config['site_url'];
                  $sitename = htmlentities(utf8_decode($modx->config['site_name']));

                  $url = $siteurl. 'index.php?id=' . $docid;

                  initiateping($docid,$url,$sitename);

		break;

 }

I funktionen kollar vi efter dokumentets id,  sajtens url och namn, och skickar detta vidare till nästa funktion, initatePing(). 

 

function initiateping($docid,$url,$sitename)
{
	$templateid = 4;
	global $modx;
	$tbl_tv = $modx->getFullTableName('site_tmplvars');
	$tbl_tv_temp = $modx->getFullTableName('site_tmplvar_templates');
	$result = $modx->db->select("default_text", $tbl_tv. ' INNER JOIN ' . $tbl_tv_temp . ' ON ' . $tbl_tv .'.id=' . $tbl_tv_temp . '.tmplvarid',$tbl_tv .'.name=\'Ping\' AND ' .$tbl_tv_temp .'.templateid=' .$templateid);
	$total_rows = $modx->db->getRecordCount( $result );
	if( $total_rows >= 1 )
	{
		$port  = "80";
		$sitetoping = "";
		$path = "/";

		while( $row = $modx->db->getRow( $result ) )
		{
			$indexof = strrpos($row['default_text'],',');
			if ($indexof === false)
			{
				$indexoff = strrpos($row['default_text'],';');
 				if (indexoff == false)
				{
					exit;
				}
  			    else
			    {
					$sitevars = split(';',$row['default_text']);
	    			if (count($sitevars) == 3)
	    			{
	    				$sitetoping = $sitevars[0];
	    				$path = $sitevars[1];
	    				$port = $sitevars[2];
	    			}
	    			ping($url,$sitename,$sitetoping, $path,$port);
			    }
			}
			else
			{
	            $rpcs = split(',',$row['default_text']);

				for($i=0;$i< count($rpcs);$i++)
				{
					$indexof = strrpos($rpcs[$i],';');
					if ($indexof === false)
					{

					}
					else
					{
						$sitevars = split(';',$rpcs[$i]);
	    				if (count($sitevars) == 3)
	    			  	{
	    					$sitetoping = $sitevars[0];
	    					$path = $sitevars[1];
	    					$port = $sitevars[2];
	    			  	}
	    			  	ping($url,$sitename,$sitetoping, $path,$port);
					}
				}
			}
		}
	}
}

 

Här hämtar vi alltså den text som finns angiven i vår mallvariabel, dvs de sajter vi ska pinga, om det är så att aktuellt dokument är av rätt mailltyp, $templateid. Sajter som skall pingas anges enligt:

blogsearch.google.com;/ping/RPC2;80

Informationen vi behöver, sajt, ping-sökväg och port anges alltså separerade med ;. Om vi ska pinga flera sajter, separeras dessa med kommatecken:

blogsearch.google.com;/ping/RPC2;80,rpc.twingly.com;/;80

Vad funktionen initiatePing() alltså gör är att sortera ut denna information, utifrån vad som angetts i vår mallvariabel och för varje sajt, anropar ping() funktionen.

 

function ping($url,$sitename,$sitetoping,$path,$port)
{
	global $modx;
	require_once $modx->config['base_path'].'assets/plugins/ping/xmlrpc.inc';
    $server = new xmlrpc_client($path,$sitetoping,$port);
	$message = new xmlrpcmsg('weblogUpdates.ping',
	array(new xmlrpcval(sitename, 'string'),new xmlrpcval($url, 'string')));
	$result = $server->send($message);

	if (!$result)
	{
    	  logEvent(123100,3,'Could not connect to HTTP server.');
	}
	elseif ($result->faultCode())
	{
         logEvent(123100,3,'XML-RPC Fault #' . $result->faultCode() . ': ' .   $result->faultString() . '::' . $sitetoping . '::'. $path . '::' . $port);
	}
	else
	{
      	 $struct = $result->value();
    	 $sumval = $struct->structmem('message');
    	 $mess = $sumval->scalarval();

    	 logEvent(123100,1,$mess . ': ' . $sitetoping . ', ' . $url);
	}
}

ping() funktionen läser in xmlrpc.inc som innehåller den logik vi behöver för att anropa en webbservice. För varje anrop kontrolleras resultatet, och detta loggas i MODx systemevent logg.

All done!

Denna plugin kan du hämta hem i det här inlägget på MODx forum:

http://modxcms.com/forums/index.php/topic,28837.0.html