• 05-10-2014, 11:39:42
    #1


    Sorunum şu...
    Bayağı uğrastım ama çözemedim.
    Regex sisteme göre tutturamadım.

    vbulletin için alfabetik listeleme eklentisi var.
    ve bu eklenti güzel ancak türkçe karakterlerden i ye gelince problemli
    İ sesini Y ile aynı listede gösteriyor.
    bunu buldum ...
    sorun şurda..
    regex kodlama yöntemi galiba tam bilmiorum ama onu kulanıyor.

    if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    	if (!empty($ltr))
    	{
    		switch($ltr)
    		{
    			case 'reset':
    				break;
    			case '#':
    				$hook_query_where .= " AND thread.title NOT REGEXP(\"^[a-zA-Z]\")";
    
    				break;
    			default:
    				$ltr = chr(intval(ord($ltr)));
    				$hook_query_where .= " AND thread.title LIKE(\"" . $db->escape_string_like($ltr) . "%\")";
    		}
    	}
    }
    kaynak kod bu...
    kod içerisindeki kırmızı alan # bu belirli olmayan karakterler listesini belirliyor.
    diğer ö ş gibi sözcüklerde sorunsuz işliyor ancak İ ve Ü ile başlayan konu başlarını da # kategorisine atması gerekirken onu Y ile birlikte resimdeki gibi gösteriyor.
    kısaca bu sorunu nasıl çözebiliriz?
    basit yoldan regex ile nasıl İ yi Ü yi Y den nasıl ayırabiliriz?
    regex sistemi de Ascii karakterleri baz alıyor anladığım...
    ya da burdaki sınıflama yapan kodu yani
    $hook_query_where .= " AND thread.title NOT REGEX
    bu üstteki kodu farklı bir şekilde nasıl belirleyebiliriz?

    http://vbsupport.org/forum/showthread.php?t=39680
    bu sayfada bu eklenti rus sistemine göre uyarlanmış sanırım.
    belki bu fikir verebilir.
  • 05-10-2014, 12:10:23
    #2
    ylv
    Üyeliği durduruldu
    $ltr değişkenini nasıl bulduğuna bakın. verdiğiniz kodlar içerisinde mevcut değil. büyük ihtimal latin harfler a-z A-Z dışındakileri siliyordur.

    thread.title LIKE(\"" . $db->escape_string_like($ltr) . "%\")

    like araması yerine düzenli ifadeler kullanıcaksanız. Türkçe karakterler için regexp ile ü veya u araması yaptıracaksınız.
  • 05-10-2014, 13:10:11
    #3
    ylv adlı üyeden alıntı: mesajı görüntüle
    $ltr değişkenini nasıl bulduğuna bakın. verdiğiniz kodlar içerisinde mevcut değil. büyük ihtimal latin harfler a-z A-Z dışındakileri siliyordur.

    thread.title LIKE(\"" . $db->escape_string_like($ltr) . "%\")

    like araması yerine düzenli ifadeler kullanıcaksanız. Türkçe karakterler için regexp ile ü veya u araması yaptıracaksınız.

    if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    $url = fetch_seo_url('forum', $foruminfo, $pageinfo_pagenav);

    $selectedletter =& $ltr;

    $currentletter = $vbphrase['reset'];
    $linkletter = urlencode('reset');
    $show['selectedletter'] = $selectedletter == 'reset' ? true : false;
    $templater = vB_Template::create('forumdisplay_letter');
    $templater->register('url', $url);
    $templater->register('currentletter', $currentletter);
    $templater->register('linkletter', $linkletter);
    $letterbits = $templater->render();

    $currentletter = '#';
    $linkletter = urlencode('#');
    $show['selectedletter'] = $selectedletter == '#' ? true : false;
    $templater = vB_Template::create('forumdisplay_letter');
    $templater->register('url', $url);
    $templater->register('currentletter', $currentletter);
    $templater->register('linkletter', $linkletter);
    $letterbits .= $templater->render();

    for ($i = 65; $i < 91; $i++)
    {
    $currentletter = chr($i);
    $linkletter =& $currentletter;
    $show['selectedletter'] = $selectedletter == $currentletter ? true : false;
    $templater = vB_Template::create('forumdisplay_letter');
    $templater->register('url', $url);
    $templater->register('currentletter', $currentletter);
    $templater->register('linkletter', $linkletter);
    $letterbits .= $templater->render();
    }

    $templater = vB_Template::create('forumdisplay_letters');
    $templater->register('letterbits', $letterbits);
    $template_hook['forumdisplay_above_threadlist'] .= $templater->render();

    burda olabilir mi?
    başka bi yerde olamaz gibi geldi bana .
    olmazsa eklentiyi vereyim.

    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <product productid="alphabetical_forum_filter" active="1">
    	<title>Alphabetical Forum Filtering</title>
    	<description>Add an alphabetical forum filtering on Forumdisplay</description>
    	<version>4.0.1</version>
    	<url>http://www.forumsmods.com/</url>
    	<versioncheckurl />
    	<dependencies>
    	</dependencies>
    	<codes>
    	</codes>
    	<templates>
    		<template name="forumdisplay_filteringcss" templatetype="template" date="1293387776" username="vB Style" version="4.0.1"><![CDATA[{vb:cssfile forumfiltering.css}]]></template>
    		<template name="forumdisplay_letter" templatetype="template" date="1293230839" username="vB Style" version="4.0"><![CDATA[<vb:if condition="$show['selectedletter']">
    	<dd class="highlighted"><a href="{vb:raw url}&amp;ltr={vb:raw linkletter}">{vb:raw currentletter}</a></dd>
    <vb:else />
    	<dd><a href="{vb:raw url}&amp;ltr={vb:raw linkletter}">{vb:raw currentletter}</a></dd>
    </vb:if>]]></template>
    		<template name="forumdisplay_letters" templatetype="template" date="1293230027" username="vB Style" version="4.0"><![CDATA[<dl id="charnav" class="stats floatcontainer">
        <dt>{vb:rawphrase filter_results}</dt>
        {vb:raw letterbits}
    </dl>]]></template>
    		<template name="forumfiltering.css" templatetype="template" date="1293235867" username="vB Style" version="4.0"><![CDATA[#charnav {
    	border:solid {vb:stylevar lightweightbox_border.borderWidth}px {vb:stylevar lightweightbox_border.borderColor};
    	-moz-border-radius:5px;
    	border-radius:5px;
    	-webkit-border-radius:5px;
    	padding:7px;
    	margin-top:3.3em;
    	width:auto;
    	clear:both;
    }
    
    #charnav dt {
    	float:{vb:stylevar left};
    	width:10%;
    }
    
    #charnav dd {
    	float:{vb:stylevar left};
    	width:3.2%;
    }
    
    #charnav dd a {
    	font-size:{vb:stylevar small_fontSize};
    	padding:2px 4px;
    	border:solid {vb:stylevar lightweightbox_border.borderWidth}px {vb:stylevar lightweightbox_border.borderColor};
    	-moz-border-radius:3px;
    	border-radius:3px;
    	-webkit-border-radius:3px;
    	background-color:{vb:stylevar lightweightbox_background.backgroundColor};
    	text-decoration:none;
    	display:block;
    	text-align:center;
    	margin-{vb:stylevar left}:2px;
    }
    
    #charnav dd a:hover {
    	border-color:{vb:stylevar link_color};
    	background:{vb:stylevar link_color};
    	color:white;
    }
    
    #charnav dd.highlighted a {
    	border-color:{vb:stylevar linkhover_color};
    }]]></template>
    	</templates>
    	<stylevardfns>
    	</stylevardfns>
    	<stylevars>
    	</stylevars>
    	<plugins>
    		<plugin active="1" executionorder="5">
    			<title>Print Forums</title>
    			<hookname>admin_options_print</hookname>
    			<phpcode><![CDATA[if (preg_match('/multiselect:forums:eval/i', $setting['optioncode']))
    {
    	$options = null;
    	eval($setting['optiondata']);
    	$title = $description;
    	$array = construct_forum_chooser_options(0);
    	$selected = explode(',', $setting['value']);
    	$htmlise = 0;
    	$size = 10;
    	$multiple = true;
    	$name .= '[]';
    	$uniqueid = fetch_uniqueid_counter();
    	$select = "<div id=\"ctrl_$name\"><select name=\"$name\" id=\"sel_{$name}_$uniqueid\" tabindex=\"1\" class=\"bginput\"" . iif($size, " size=\"$size\"") . iif($multiple, ' multiple="multiple"') . iif($vbulletin->debug, " title=\"name=&quot;$name&quot;\"") . ">\n";
    	$select .= construct_select_options($array, $selected, $htmlise);
    	$select .= "</select></div>\n";
    	print_label_row ($title, $select, '', 'top', $name);
    	$handled = true;
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Process Forums</title>
    			<hookname>admin_options_processing</hookname>
    			<phpcode><![CDATA[if (preg_match('/multiselect:forums:eval/i', $oldsetting['optioncode']) AND is_array($settings[$oldsetting['varname']]))
    {
    	$settings[$oldsetting['varname']] = implode(',', $settings[$oldsetting['varname']]);
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Cache Templates</title>
    			<hookname>cache_templates</hookname>
    			<phpcode><![CDATA[if(THIS_SCRIPT == 'forumdisplay')
    {
    	$cache[] = 'forumdisplay_letter';
    	$cache[] = 'forumdisplay_letters';
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Add Alphabetical Forum Filtering</title>
    			<hookname>forumdisplay_complete</hookname>
    			<phpcode><![CDATA[if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    	$url = fetch_seo_url('forum', $foruminfo, $pageinfo_pagenav);
    
    	$selectedletter =& $ltr;
    
    	$currentletter = $vbphrase['reset'];
    	$linkletter = urlencode('reset');
    	$show['selectedletter'] = $selectedletter == 'reset' ? true : false;
    	$templater = vB_Template::create('forumdisplay_letter');
    	$templater->register('url', $url);
    	$templater->register('currentletter', $currentletter);
    	$templater->register('linkletter', $linkletter);
    	$letterbits = $templater->render();
    
    	$currentletter = '#';
    	$linkletter = urlencode('#');
    	$show['selectedletter'] = $selectedletter == '#' ? true : false;
    	$templater = vB_Template::create('forumdisplay_letter');
    	$templater->register('url', $url);
    	$templater->register('currentletter', $currentletter);
    	$templater->register('linkletter', $linkletter);
    	$letterbits .= $templater->render();
    
    	for ($i = 65; $i < 91; $i++)
    	{
    		$currentletter = chr($i);
    		$linkletter =& $currentletter;
    		$show['selectedletter'] = $selectedletter == $currentletter ? true : false;
    		$templater = vB_Template::create('forumdisplay_letter');
    		$templater->register('url', $url);
    		$templater->register('currentletter', $currentletter);
    		$templater->register('linkletter', $linkletter);
    		$letterbits .= $templater->render();
    	}
    
    	$templater = vB_Template::create('forumdisplay_letters');
    	$templater->register('letterbits', $letterbits);
    	$template_hook['forumdisplay_above_threadlist'] .= $templater->render();
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Alphabetical Forum Filtering</title>
    			<hookname>forumdisplay_complete</hookname>
    			<phpcode><![CDATA[if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    	if (!empty($ltr))
    	{
    		$pageinfo_pagenav['ltr'] = $ltr;
    	}
    
    	$pagenav = construct_page_nav(
    		$pagenumber,
    		$perpage,
    		$totalthreads,
    		'forumdisplay.php?' . $vbulletin->session->vars['sessionurl'] . "f=$foruminfo[forumid]",
    		'',
    		'',
    		'forum',
    		$foruminfo,
    		$pageinfo_pagenav
    	);
    
    	$perpage = $perpage . '" />
    			<input type="hidden" name="ltr" value="' . $ltr;
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Alphabetical Forum Filtering</title>
    			<hookname>forumdisplay_query_threadid</hookname>
    			<phpcode><![CDATA[if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    	if (!empty($ltr))
    	{
    		switch($ltr)
    		{
    			case 'reset':
    				break;
    			case '#':
    				$hook_query_where .= " AND thread.title NOT REGEXP(\"^[a-zA-Z]\")";
    				break;
    			default:
    				$ltr = chr(intval(ord($ltr)));
    				$hook_query_where .= " AND thread.title LIKE(\"" . $db->escape_string_like($ltr) . "%\")";
    		}
    	}
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Alphabetical Forum Filtering</title>
    			<hookname>forumdisplay_query_threadscount</hookname>
    			<phpcode><![CDATA[if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    	if (!empty($ltr))
    	{
    		switch($ltr)
    		{
    			case 'reset':
    				break;
    			case '#':
    				$hook_query_where .= " AND title NOT REGEXP(\"^[a-zA-Z]\")";
    				break;
    			default:
    				$ltr = chr(intval(ord($ltr)));
    				$hook_query_where .= " AND title LIKE(\"" . $db->escape_string_like($ltr) . "%\")";
    		}
    	}
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Alphabetical Forum Filtering</title>
    			<hookname>forumdisplay_start</hookname>
    			<phpcode><![CDATA[if (in_array($foruminfo['forumid'], explode(',', $vbulletin->options['forumfiltering_forums'])))
    {
    	$ltr = $vbulletin->input->clean_gpc('r', 'ltr', TYPE_NOHTML);
    }]]></phpcode>
    		</plugin>
    		<plugin active="1" executionorder="5">
    			<title>Alphabetical Forum Filtering</title>
    			<hookname>parse_templates</hookname>
    			<phpcode><![CDATA[if (THIS_SCRIPT == 'forumdisplay')
    {
    	if ($vbulletin->options['storecssasfile'])
    	{
    		$template_hook['custom_css_links'] .= vB_Template::create('forumdisplay_filteringcss')->render();
    	}
    	else
    	{
    		$template_hook['custom_css_list'] .= ',forumfiltering.css';
    	}
    }]]></phpcode>
    		</plugin>
    	</plugins>
    	<phrases>
    		<phrasetype name="vBulletin Settings" fieldname="vbsettings">
    			<phrase name="setting_forumfiltering_forums_desc" date="1293399579" username="vB Style" version="4.0.1"><![CDATA[Select forums where you want to enable alphabetical filtering.]]></phrase>
    			<phrase name="setting_forumfiltering_forums_title" date="1293399579" username="vB Style" version="4.0.1"><![CDATA[Forums to Enable Alphabetical Filtering]]></phrase>
    		</phrasetype>
    	</phrases>
    	<options>
    		<settinggroup name="forumdisplay" displayorder="420">
    			<setting varname="forumfiltering_forums" displayorder="240">
    				<datatype>free</datatype>
    				<optioncode>multiselect:forums:eval
    $options = construct_forum_chooser_options(1);</optioncode>
    				<defaultvalue>0</defaultvalue>
    			</setting>
    		</settinggroup>
    	</options>
    	<helptopics>
    	</helptopics>
    	<cronentries>
    	</cronentries>
    	<faqentries>
    	</faqentries>
    </product>
    full eklenti bu...
    ben tam anlamıyorum bu işlerden.
    sadece denedim o bölüm ile ilgili alanlarla çözemedim.
    dediğin gibi o kısımda latin harf dışını ayarlıyor onları dışarda tutuyor mantık sağlam ancak İ Y Ü bu sesleri bir görüyor...
    yani sanki bunlar aynı sesmiş gibi okuyor bu sistem...
    bunu ayıran bi yöntem olması gerek...
    yani i yi Y gibi görmemesinin yolu...