ali_livero
11-11-2012, 08:01 PM
چطوری میشه در هنگام ثبت نام در جوملا 2.5 در بخش نام کاربری ،کاربر را محدود کنیم که مثلا فقط انگلیسی و عدد(حداکثر 10 کاراکتر) وارد کند و از حروف فارسی در نام کاربری جلوگیری کرد؟؟
samir
11-12-2012, 02:14 AM
کد اعتبار سنجی(Validation) فرم ثبت نام جوملا اینجاست :
/media/system/js/validate.js
خوب حالا عبارت username رو سرچ می کنی، می رسی به یه همچین چیزی :
this.setHandler("username",function(a){regex=/[<|>|"|'|%|;|(|)|&]/i;return!regex.test(a)});
اون قطعه از کد که مشخص شده جواب شماست، این یه عبارت با قاعده (<b><font color=red>فقط کاربران عضو انجمن می توانند لینک ها را مشاهده کنند</font></b> D8%A7%D8%B9%D8%AF%D9%87)(Regular expression (<b><font color=red>فقط کاربران عضو انجمن می توانند لینک ها را مشاهده کنند</font></b>)) رو تعریف کرده برای مقدار معتبر فیلد username، که حالا می تونی هرجور خواستی محدودش کنی...
مثلا این :
this.setHandler("username",function(a){regex=/^[a-zA-Z0-9];return!regex.test(a)});
یا هرچی دیگه...
ali_livero
11-13-2012, 06:51 PM
با تشکر
حالا حروف و عدد رو گفتی !@#$%^&*()_+= این کاراکتر ها هم میخوام به اونا اضافه کنم چظوری بزارم؟؟ بینشون ویرگول بزارم یا چیز دیگه نمی دونم دستور کامل که همه چی رو داشته باشه برام بزار.
ali_livero
11-13-2012, 06:54 PM
اون کدی بالا گذاشتی رو معتبر میدونه یا خیر منظورم این کده
this.setHandler("username",function(a){regex=/^[a-zA-Z0-9];return!regex.test(a)}); الان توی این کد از حروف انگلسیی و اعداد مجاز هست یا غیرمجاز، من میخوام فقط حروف فارسی رو نگذارم کاربر وارد کنه...
samir
11-13-2012, 10:35 PM
خوب تو همون کد یه نگا بندازی متوجه می شی :
initialize : function () {
this.handlers = {};
this.custom = {};
this.setHandler("username", function (a) {
regex = /[<|>|"|'|%|;|(|)|&]/i;
return !regex.test(a)
});
this.setHandler("password", function (a) {
regex = /^\S[\S ]{2,98}\S$/;
return regex.test(a)
});
this.setHandler("numeric", function (a) {
regex = /^(\d|-)?(\d|,)*\.?\d*$/;
return regex.test(a)
});
this.setHandler("email", function (a) {
regex = /^[a-zA-Z0-9._-]+(\+[a-zA-Z0-9._-]+)*@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
return regex.test(a)
});
$$("form.form-validate").each(function (a) {
this.attachToForm(a)
}
مثلا برای فیلد ایمیل :
<b><font color=red>فقط کاربران عضو انجمن می توانند لینک ها را مشاهده کنند</font></b>
یک الگوی نسبتا ساده برای بررسی آدرس ایمیل
۱- این یعنی آغاز خط و بلافاصله بعد از اون الگوی ۲ قرار گرفته باشه.
۲- در الگوی ۲ یک گروه کاراکتری متشکل از a تا z کوچک و بزرگ، صفر تا نُه، نقطه، زیرخط و علامت منها قرار گرفته. بلافاصله بعد از این گروه، یک علامت بعلاوه هست که یعنی از این گروه کاراکتری دست کم یکی و دست بالا! هر چند تا که باشه درسته. به عبارتی این میشه آدرس ایمیل قبل از @ مثلا در someone@example.com میشه someone .
۳- علامت @ معنی خاصی نداره و میشه خودش. تا به اینجا شد، ابتدای خط، بلافاصله بعدش یک تا هر چند تا کاراکتر (الگوی ۲) و بعد بلافاصله یک علامت @.
۴- بعد یه گروه کاراکتری دیگه.اینبار یه کم تفاوت داره با الگوی اسم. چون این مربوط میشه به اسم دومین. توی someone@example.com این میشه قسمت example یعنی بعد از @ و قبل از نقطه. اینبار دیگه نقطه و زیرخط نیستن چون این دو تا کاراکتر توی اسم مجازن، اما تو اسم دومین نه. بلافاصله بعدش هم یه علامت + (بعلاوه) اومده که یعنی الگوی کاراکتری یک یا هر چند بار میتونه تکرار بشه.
۵- اما نقطه، چون نقطه توی عبارت باقاعده معنی داره،*ولی ما اینجا منظورمون دقیقا خود نقطه هست نه معنیش، بالاجبار باید قبلش یه بک اسلش \ بگذاریم که نقطه تعبیر نشه به هر کاراکتری، و معنی فقط نقطه اعمال بشه.
۶-بعد از نقطه پسوند میاد مثلا کام (com) یا آی آر (ir) یا گاهی کو دات آی آر (co.ir) کوتاهترین پسوند دو حرفیه مثل ir و بلندترین پنج حرفی مثل co.ir ، به همین دلیل نوشته شده {2,5} .تشکیل هم شده از حروف انگلیسی و نقطه. که اگه دقت کنید نقطه ای که داخل گروه کاراکتری قرار گرفته بک اسلش نداره، چون اونجا دیگه معنی همه کاراکترها رو نمیده و معنی خودش رو میده.(بعضی کاراکترها داخل گروه کاراکتری معنیشون فرق میکنه مثل همین نقطه یا ^ )
۷- بعدشم که آخر خط. یعنی بعد از این الگوها باید برسیم به آخر خط و ادامه نداشته باشه.
منبعش هم اینه (<b><font color=red>فقط کاربران عضو انجمن می توانند لینک ها را مشاهده کنند</font></b>) که می تونی بیشتر مطالعه کنی...
ali_livero
11-15-2012, 08:27 PM
با سلام خسته نباشید واقعا دمت گرم
ولی من ازت یک خط کد میخوام من از این کدها سر در نمیارم من فقط یک خط کد میخوام که اونجا جابجا کنم، دستت درد نکنه جامع توضیح دادی، ولی یک خط کد به من بده که کاربر حداکثر10 حرف همه چی بتونه وارد کنه بجز حروف فارسی.. دستت دردنکنه
samir
11-16-2012, 03:12 AM
اگه یه خطی می خوای بیا :
می ری اینجا :
JOOMLA\libraries\joomla\database\table\user.php
می گردی دنبال این :
Line 197: if (preg_match("#[<>\"'%;()&]#i", $this->username) || strlen(utf8_decode($this->username)) < 2)
تغییرش می دی به این:
if (!preg_match("[a-zA-Z0-9]", $this->username) || strlen(utf8_decode($this->username)) < 2 || strlen(utf8_decode($this->username)) > 11 )
بعدم دیگه می ری به سلامت...
ali_livero
11-16-2012, 08:52 AM
با سلام
1-من میخوام کاربر در نام کاربری حروف انگلیسی،عدد و -_. مجاز باشه وارد کنه.
2-حروف فارسی ، و بقیه کاراکترها مثله !@#$%^&*)(=+ نتونه وارد کنه پیغام بده حروف غیر مجاز. تا اینجا با من اوکی هستی.
نکته : نکته اصلی اینه که شما اون رو در نظر نگرفتی، اینه که وقتی شما میگی a-z وارد کن وقتی کاربر alt+shift رو زد و فارسی تایپ کرد، چون در بازه ی a-z هست بازم میتونه فارسی وارد کنه متوجه ای.
بقیه کجا هستن مدیران عزیز کمک کنن.
samir
12-08-2012, 06:13 PM
این بحث، بحث مفیدیه... گفتم کاملش کنم شاید به درد کسی بخوره...
برای محدود کردن کاراکتر های ورودی در فرم ثبت نام دو راه وجود داره:
1- استفاده از اعتبار سنجی سمت کاربر(Client-side validation)
2- استفاده از اعتبار سنجی سمت سرور(Server-side validation)
1- استفاده از اعتبار سنجی سمت کاربر(Client-side validation)
خوب روش اول که کاربرپسندتره(برای نمونه فیلد نام کاربری یا Username رو بررسی می کنیم) :
کد اعتبار سنجی(Validation) فرم ثبت نام جوملا اینجاست :
JOOMLA/media/system/js/validate.js
خوب حالا عبارت username رو سرچ می کنیم، می رسیم به یه همچین چیزی :
this.setHandler("username",function(a){regex=/[<|>|"|'|%|;|(|)|&]/i;return!regex.test(a)});
اون قطعه از کد که مشخص شده یه عبارت با قاعده (<b><font color=red>فقط کاربران عضو انجمن می توانند لینک ها را مشاهده کنند</font></b> D8%A7%D8%B9%D8%AF%D9%87)(Regular expression (<b><font color=red>فقط کاربران عضو انجمن می توانند لینک ها را مشاهده کنند</font></b>)) رو تعریف کرده برای مقدار معتبر فیلد username، که حالا می تونیم هرجور خواستیم محدودش کنیم...
مثلا اینجا می خواییم جلوی ورود کاراکترهای فارسی رو بگیریم :
this.setHandler("username",function(a){regex=/[|ا|ب|پ|ت|ث|ج|چ|ح|ی|خ|د|ذ|ر|ز|س|ش| |ظ|ع|غ|ف|ق|ک|گ|ل|م|ن|و|ه|ي|ئ|ض|ص<|>|"|'|%|;|(|)|&]/i;return!regex.test(a)});
اتفاقی که وقتی کاربر از کاراکترهای فارسی توی فیلد نام کاربری استفاده می کنه می افته اینه که همون جا اون فیلد طبق دیفالت جوملا اعلام خطا می کنه(که معمولا رنگش قرمز می شه)...
برای اطلاع دادن به کاربر که چه خطائی رخ داده، ساده ترین راه اینه که hint فیلد نام کاربری رو هم سفارشی کنیم که اونم توی فلدر زبان جوملا توی این مسیر پیدا می شه:
JOOMLA\language\fa-IR\fa-IR.com_users.ini
هر توضیحی که مد نظر هست رو جلوی این فیلد وارد می کنیم:
مثلا:
COM_USERS_DESIRED_USERNAME="لطفا نام کاربری دلخواه خود را انتخاب نمایید-کاراکترهای فارسی مجاز نمی باشد"
حالا وقتی موس رو فیلد نام کاربری می ره، این پیغام نمایش داده می شه...
مشکل این روش: اگه جاوا در سمت کاربر به هر دلیل غیر فعال باشه دیگه این روش عمل نمی کنه...
2- استفاده از اعتبار سنجی سمت سرور(Server-side validation)
روش دوم که اصولی تره :
به آدرس زیر می ریم:
JOOMLA\libraries\joomla\database\table\user.php
این خط رو توی این فایل پیدا می کنیم:
if (preg_match("#[<>\"'%;()&]#i", $this->username) || strlen(utf8_decode($this->username)) < 2)
این شرط قبل از نوشتن نام کاربری توی بانک اعتبار مقدار اون رو چک می کنه؛ که حالا می تونیم هرجور می خواییم سفارشیش کنیم:
الگو:
if (preg_match("#[اینجا هرچی می خوایم نباشه رو اضافه می کنیم]#i", $this->username) || strlen(utf8_decode($this->username)) < حداقل تعداد کاراکتر || strlen(utf8_decode($this->username)) > حداکثر تعداد کاراکتر)
مثلا:
if (preg_match("#[<>\"'%;()&(ابپتثجچحیخدذرزسشطظعغفقکگ منوهيئضص)]#i", $this->username) || strlen(utf8_decode($this->username)) < 3 || strlen(utf8_decode($this->username)) > 15)
با کد بالا ما جلوی ورود کاراکترهای فارسی بعلاوهء کاراکترهای غیرمجاز رو هم می گیریم و تعداد کاراکترها رو هم بین 4 تا 14 کاراکتر محدود می کنیم...
و حالا کاری که باقی می مونه سفارشی کردن پیغام خطاست که کاربر متوجه مشکل بشه...
اونم توی مسیر زیر باید پیدا بشه:
JOOMLA\language\fa-IR\fa-IR.lib_joomla.ini
توضیحی که لازم هست رو جلوی فیلد زیر وارد می کنیم:
مثلا:
JLIB_DATABASE_ERROR_VALID_AZ09=""خطا... نام کاربری می بایست بدون فاصله، حداقل 4 و حداکثر 14 کاراکتر و <strong>نباید</strong> شامل کاراکترهای فارسی و این: < > \ "_QQ_" ' % ; ( ) &" کاراکترها باشد.""
اگه چیزی جا افتاده بگید که اضافه بشه...
sheerkoshan
04-30-2013, 10:46 PM
samir جان
من شدیدا نیاز دارم که فیلد یوزرنیم رو به یه عدد 8 رقمی محدود کنم و هیچ کاراکتر دیگری نیز وارد نشود . روش اول Client-side validation رو که شما فرموده بودین انجام دادم ولی هیچ اتفاقی نیافتاد و باز موقع ثبت نام همه کاراکتر ها را قبول می کنه . به نظرتون کار دیگری نیز بجز مواردی که فرموده بودین باید در مورد روش اول انجام می دادم ؟
samir
05-01-2013, 01:24 PM
سلام
خوب حل شد،فک کنم این کارت رو کامل راه بندازه:
به انتهای فایل زیر:
JOOMLA/media/system/js/validate.js
این رو اضافه کنید:
window.addEvent("domready", function() {
document.formvalidator.setHandler("username",
function (value) {
minValue=10000000;
maxValue=99999999;
if (value != "") {
regex=/[0-9]{8}$/;
if (!regex.test(value)) {
return false;
} else {
if (eval(value) < minValue || eval(value) > maxValue) {
return false;
}
}
}
return true;
});
})
برای تغییر توی بقیه فیلد هاهم فقط کافیه یه تابع مثل همین به آخر فایل validate.js اضافه بشه و فقط اون فیلد لازم رو توی تابع setHandler ذکر کنید، مثلا جای username می شه email یا password و ...
اون روش هائی رو که بالا اومده هم می شه استفاده کرد که یکم باید تغییرات رو با دقت انجام بدی تا عمل کنه...
sheerkoshan
05-01-2013, 08:39 PM
دوست مهربان از اینکه وقت گذاشتین بسیار سپاسگزارم.
طبق فرمایش حضرتعالی عمل کردم اما بازم جواب نمیده . یه نظر به محتوای فایل validate.js بیاندازین
/* GNU General Public License version 2 or later; see LICENSE.txt
*/
Object.append(Browser.Features,{inputemail:functio n(){var a=document.createElement("input");a.setAttribute("type","email");return a.type!=="text"}()});
var JFormValidator=new Class({initialize:function(){this.handlers={};this .custom={};this.setHandler("username",function(a){regex=/[<|>|"|'|%|;|(|)|&]/i;return!regex.test(a)});this.setHandler("password",function(a){regex=/^\S[\S ]{2,98}\S$/;return regex.test(a)});this.setHandler("numeric",function(a){regex=/^(\d|-)?(\d|,)*\.?\d*$/;return regex.test(a)});this.setHandler("email",function(a){regex=/^[a-zA-Z0-9._-]+(\+[a-zA-Z0-9._-]+)*@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;return regex.test(a)});$$("form.form-validate").each(function(a){this.attachToForm(a)},
this)},setHandler:function(a,b,c){this.handlers[a]={enabled:c==""?!0:c,exec:b}},attachToForm:function(a){a.getEleme nts("input,textarea,select,button").each(function(a){a.hasClass("required")&&(a.set("aria-required","true"),a.set("required","required"));if((document.id(a).get("tag")=="input"||document.id(a).get("tag")=="button")&&document.id(a).get("type")=="submit"){if(a.hasClass("validate"))a.onclick=function(){return document.formvalidator.isValid(this.form)}}else if(a.addEvent("blur",function(){return document.formvalidator.validate(this)}),
a.hasClass("validate-email")&&Browser.Features.inputemail)a.type="email"})},validate:function(a){a=document.id(a);if(a.get ("disabled"))return this.handleResponse(!0,a),!0;if(a.hasClass("required"))if(a.get("tag")=="fieldset"&&(a.hasClass("radio")||a.hasClass("checkboxes")))for(var b=0;;b++)if(document.id(a.get("id")+b)){if(document.id(a.get("id")+b).checked)break}else return this.handleResponse(!1,a),!1;else if(!a.get("value"))return this.handleResponse(!1,a),!1;b=a.className&&a.className.search(/validate-([a-zA-Z0-9\_\-]+)/)!=
-1?a.className.match(/validate-([a-zA-Z0-9\_\-]+)/)[1]:"";if(b=="")return this.handleResponse(!0,a),!0;if(b&&b!="none"&&this.handlers[b]&&a.get("value")&&this.handlers[b].exec(a.get("value"))!=!0)return this.handleResponse(!1,a),!1;this.handleResponse(! 0,a);return!0},isValid:function(a){for(var b=!0,a=a.getElements("fieldset").concat(Array.from(a.elements)),c=0;c<a.length;c++)this.validate(a[c])==!1&&(b=!1);(new Hash(this.custom)).each(function(a){a.exec()!=!0&&(b=!1)});return b},handleResponse:function(a,
b){b.labelref||$$("label").each(function(a){if(a.get("for")==b.get("id"))b.labelref=a});a==!1?(b.addClass("invalid"),b.set("aria-invalid","true"),b.labelref&&(document.id(b.labelref).addClass("invalid"),document.id(b.labelref).set("aria-invalid","true"))):(b.removeClass("invalid"),b.set("aria-invalid","false"),b.labelref&&(document.id(b.labelref).removeClass("invalid"),document.id(b.labelref).set("aria-invalid","false")))}});document.formvalidator=null;
window.addEvent("domready",function(){document.formvalidator=new JFormValidator});window.addEvent("domready", function() {
document.formvalidator.setHandler("username",
function (value) {
minValue=10000000;
maxValue=99999999;
if (value != "") {
regex=/[0-9]{8}$/;
if (!regex.test(value)) {
return false;
} else {
if (eval(value) < minValue || eval(value) > maxValue) {
return false;
}
}
}
return true;
});
})
دوست گرامی یکم تغییرش دادم درست شد . یه نظر بیاندازید
/* GNU General Public License version 2 or later; see LICENSE.txt
*/
Object.append(Browser.Features,{inputemail:functio n(){var a=document.createElement("input");a.setAttribute("type","email");return a.type!=="text"}()});
var JFormValidator=new Class({initialize:function(){this.handlers={};this .custom={};this.setHandler("username",function(a){regex=/^[0-9]{8,8}$/;return!regex.test(a)});;this.setHandler("password",function(a){regex=/^\S[\S ]{2,98}\S$/;return regex.test(a)});this.setHandler("numeric",function(a){regex=/^(\d|-)?(\d|,)*\.?\d*$/;return regex.test(a)});this.setHandler("email",function(a){regex=/^[a-zA-Z0-9._-]+(\+[a-zA-Z0-9._-]+)*@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;return regex.test(a)});$$("form.form-validate").each(function(a){this.attachToForm(a)},
this)},setHandler:function(a,b,c){this.handlers[a]={enabled:c==""?!0:c,exec:b}},attachToForm:function(a){a.getEleme nts("input,textarea,select,button").each(function(a){a.hasClass("required")&&(a.set("aria-required","true"),a.set("required","required"));if((document.id(a).get("tag")=="input"||document.id(a).get("tag")=="button")&&document.id(a).get("type")=="submit"){if(a.hasClass("validate"))a.onclick=function(){return document.formvalidator.isValid(this.form)}}else if(a.addEvent("blur",function(){return document.formvalidator.validate(this)}),
a.hasClass("validate-email")&&Browser.Features.inputemail)a.type="email"})},validate:function(a){a=document.id(a);if(a.get ("disabled"))return this.handleResponse(!0,a),!0;if(a.hasClass("required"))if(a.get("tag")=="fieldset"&&(a.hasClass("radio")||a.hasClass("checkboxes")))for(var b=0;;b++)if(document.id(a.get("id")+b)){if(document.id(a.get("id")+b).checked)break}else return this.handleResponse(!1,a),!1;else if(!a.get("value"))return this.handleResponse(!1,a),!1;b=a.className&&a.className.search(/validate-([a-zA-Z0-9\_\-]+)/)!=
-1?a.className.match(/validate-([a-zA-Z0-9\_\-]+)/)[1]:"";if(b=="")return this.handleResponse(!0,a),!0;if(b&&b!="none"&&this.handlers[b]&&a.get("value")&&this.handlers[b].exec(a.get("value"))!=!0)return this.handleResponse(!1,a),!1;this.handleResponse(! 0,a);return!0},isValid:function(a){for(var b=!0,a=a.getElements("fieldset").concat(Array.from(a.elements)),c=0;c<a.length;c++)this.validate(a[c])==!1&&(b=!1);(new Hash(this.custom)).each(function(a){a.exec()!=!0&&(b=!1)});return b},handleResponse:function(a,
b){b.labelref||$$("label").each(function(a){if(a.get("for")==b.get("id"))b.labelref=a});a==!1?(b.addClass("invalid"),b.set("aria-invalid","true"),b.labelref&&(document.id(b.labelref).addClass("invalid"),document.id(b.labelref).set("aria-invalid","true"))):(b.removeClass("invalid"),b.set("aria-invalid","false"),b.labelref&&(document.id(b.labelref).removeClass("invalid"),document.id(b.labelref).set("aria-invalid","false")))}});document.formvalidator=null;
window.addEvent("domready",function(){document.formvalidator=new JFormValidator});window.addEvent("domready", function() {
document.formvalidator.setHandler("username",
function (value) {
minValue=10000000;
maxValue=99999999;
if (value != "") {
regex=/[0-9]{8}$/;
if (!regex.test(value)) {
return false;
} else {
if (eval(value) < minValue || eval(value) > maxValue) {
return false;
}
}
}
return true;
});
})
samir
05-02-2013, 03:45 AM
سلام
خواهش می کنم...
روی دو تا جوملا 2.5 دیگه و یه جوملا 3 هم امتحان کردم، همون کد جواب داد و نیازی نبود اون تغییر رو بدم من، ولی شاید به قالب هم بستگی داشته باشه، من رو قالب استاندارد تست کردم اولین بار که جواب داد؛ بهرحال خوبه که حل شد...
موفق باشی...
vBulletin® v4.2.5, Copyright ©2000-2026, Jelsoft Enterprises Ltd.