Всея ПЫХА epsyl adw0rd Мавр ГО Irinax http://hell.helldude.ru - это пиздец

Регулярные выражения. Joomla! com_hwdvideoshare + com_sef. История одной истории :)

Рубрики: (Парсинг, Полезные штуки, Регулярные выражения) Автор: phpdude 12-12-2008

Теги : , , , , , , , , ,

по работе пришлось поебаться с жумлой в очередной раз :)

после того, как я написал плагин для com_sef заказчик говорит ОООО! ахигенно, стало при переходе на «http://video.cucinabene.it/index.php?option=com_hwdvideoshare&task=viewvideo&Itemid=0&video_id=94″ перенаправляло на seo ссылку, он был рад. но он гвоорит, а почему ссылки то такие же остались? почему они не сразу сеошные …. тут и началась пляска :)

кстати вот код плагина для сео компонента:

<?
/**
* SEF module for Joomla!
*
* This is an example file demonstrating how to write own extensions for Artio JoomSEF.
*
* @author $Author: michal $
* @copyright ARTIO s.r.o., http://www.artio.cz
* @package JoomSEF
* @version $Name$, ($Revision: 4994 $, $Date: 2005-11-03 20:50:05 +0100 (??t, 03 XI 2005) $)
*/

// Security check to ensure this file is being included by a parent file.
if (!defined(‘_VALID_MOS’)) die(‘Direct Access to this location is not allowed.’);

/**
* Note 1: This file shoud be named as com_YOUR-COMPONENT-NAME.php in order to work correctly.
*/

/**
* Use this to get variables from the original Joomla! URL, such as $task, $page, $id, $catID, …
*/
class SefExt_com_hwdvideoshare extends SefExt
{
function create(&$uri) {
global $database;

$title = array();

$vars = $uri->getQuery(true);
extract($vars);

if($uri->getVar(«video_id»))
{
$query = ‘SELECT * FROM #__hwdvidsvideos WHERE id = ‘.$uri->getVar(«video_id»);
$database->SetQuery( $query );
$row = null;
$database->loadObject( $row );
$title[] = $row->title;
$cat_id = $row->category_id;
}

if($cat_id)
{
$query = ‘SELECT * FROM #__hwdvidscategories WHERE published = 1 AND id=’.$cat_id.»;
$database->SetQuery( $query );
$row = null;
$database->loadObject( $row );
$title[] = $row->category_name;
}

if(!count($title))
{
return $uri;
//        $title[] = «video»;
}

$newUri = JoomSEF::_sefGetLocation($uri, $title, @$task, null, null, null);

return $newUri;
}
}

как было сказано это всего лишь редиректит + придумывает имя. идея неплохая, мб позаивствую, но у меня есть уже другая идея (оффтоп) :)

редиректа мало, надо теперь сделал все ссылки сразу сеошные, но как!

ведь компонент com_hdwvideoshare написан жестко хардкорно и не располагал возможностями к использованию ссылок с самого начала :)

echo «<div style=\»text-align:right;padding:5px;\»><a href=\»".$mosConfig_live_site.«/index.php?option=com_hwdvideoshare&amp;Itemid=».$Itemid.«&amp;task=featuredvids\» title=\»"._HWDVIDS_INFO_MOREFEATUREDV.«\»>»._HWDVIDS_INFO_MOREFEATUREDV.«</a></div>»;

норм да? :(

думаю кто нить мог подумать — переписать …. если бы он мне это в лицо сказал, я бы его в лицо отправил нахуй :)

Регулярные выражения

Может быть они нам помогут? :)

да, я подумал что помогут.

потратив час на копание в исхониках, я понял что так

$db =& JFactory::getDBO();
$query = «SELECT * FROM `#__redirection` WHERE newurl LIKE ‘%com_hwdvideoshare%’»;
$db->setQuery($query);
$realloc = $db->loadObjectList();

$links=array();
$linkskeys=array();
foreach($realloc as $row)
{
$links[$row->newurl] = $row->oldurl;
$linkskeys[] = $row->newurl;
}

я могу вытащить все сеошные ссылки из бд! ура подумал я!!

сделал

echo str_replace(array_keys($links),array_values($links),JResponse::toString());

и смотрю …. а нихуя не поменялось.

думаю чо зе фак. смотрю есть ссылку у которых в середине запроса проскакивает параметр Itemid=0, мб другой какой то … я хз, кароче пиздец подумал я. задача чуток усложнилась.

решил сделать так ;)

echo preg_replace_callback(«#(index.php\\?([^\"']+com_hwdvideoshare[^\"']+))#»,«hdwreplacelinks»,JResponse::toString());

думаю если вы не знали про эту великую функцию, то вы точно ее запомните после этой статьи)

собственно сама функция

function hdwreplacelinks($string)
{
global $links,$linkskeys;
$string[2] = str_replace(«&Itemid=0″,«»,$string[2]);

parse_str($string[2],$vars);
unset($vars['Itemid']);

$link = preg_grep(«#(?:&?».str_replace(«&»,«&?|&?»,$string[2]).«&?){«.count($vars).«}#»,$linkskeys);
if(!$link)
{
return $string[0];
}
$link = array_values($link);
return $links[$link[0]];
}

в ней много непонятного с виду, я бы сам за это руки оторвал, но заказчик платит немного, поэтмоу сделаем чтобы работало :)

алгоритм поиска нашей ссылки

Используем функцию preg_grep для фильтрации массива ссылок.

Но как!)

global $links,$linkskeys;
$string[2] = str_replace(«&Itemid=0″,«»,$string[2]);

parse_str($string[2],$vars);
unset($vars['Itemid']);

в этих строках я очищаю ссылочные данные от всякой хуйни которая может быть или не быть. потом генерирую регулярное выражение для поиска :)

$link = preg_grep(«#(?:&?».str_replace(«&»,«&?|&?»,$string[2]).«&?){«.count($vars).«}#»,$linkskeys);

с виду пиздец, но она из параметров ссылки генерит регулярку которая теоретически может в массиве найти нужную ссылку

вот пример сгенерированной регулярки

#(?:&?option=com_hwdvideoshare&?|&?task=viewvideo&?|&?video_id=88&?){3}#

видите что она делает? :)   она ищет ссылку у которых есть 3 раза совпадение одного из 3 вариантов, соответственно это пиздато!! ))))))

я решил свою задачу. получил свои 60 баксов)

надеюсь статья поможет и вам.

Регулярные выражения — сила

Комментарии RSS тут:

Всего отзывов: 4 на Регулярные выражения. Joomla! com_hwdvideoshare + com_sef. История одной истории :)

Оставьте свой отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

О САЙТЕ

Крик души может быть будет на этом сайте, а может и будет что-нибудь другое :)



Яндекс.Метрика