شاید در یک پروژه به این مسئله برخورد کرده باشید که چگونه می توانید فیلد ایمیل را در ثبت نام از حالت ضروری بودن خارج کنید تا کاربر بدون فیلد ایمیل بتواند ثبت نام کند؛ این یک معضل بزرگی در جوملا به شمار می رود چرا که جوملا اجازه این کار را به شما نمی دهد و شما باید از ترفندهای غیر اصولی این کار را انجام دهید. البته نباید از این حقیقت غافل شد که ایمیل در تمامی سایت ها و حتی غیر از دنیای مجازی یک شناسه و راه ارتباطی کاملا شناخته شده بوده و وجود آن کاملا ضروری است؛ اما این آموزش برای آن دسته از افرادی است که نیاز به انجام این کار دارند.
برای درک بهتر و انجام دقیق تر این آموزش نیاز به آشنایی نسبی به زبان برنامه نویسی PHP خواهید داشت.
در این آموزش اجبارا هسته جوملا تغییر خواهد کرد و تغییر هسته جوملا تحت هیچ شرایطی از سوی تم ایران پیشنهاد نخواهد شد چرا که با بروزرسانی جوملا ، تمام این اعمال دوباره باید انجام گردد.
در اولین گام لطفا فایل زیر را با یک ویرایشگر متنی باز کنید:
YOUR_JOOMLA_ROOT\components\com_users\models\forms\registration.xml
و 2 خط زیر را پیدا کنید :
<field
name="email1"
type="email"
label="COM_USERS_REGISTER_EMAIL1_LABEL"
description="COM_USERS_REGISTER_EMAIL1_DESC"
field="id"
filter="string"
message="COM_USERS_REGISTER_EMAIL1_MESSAGE"
required="true"
size="30"
unique="true"
validate="email"
autocomplete="email"
/>
<field
name="email2"
type="email"
label="COM_USERS_REGISTER_EMAIL2_LABEL"
description="COM_USERS_REGISTER_EMAIL2_DESC"
field="email1"
filter="string"
message="COM_USERS_REGISTER_EMAIL2_MESSAGE"
required="true"
size="30"
validate="equals"
/>
تگ <field> اول برای فیلد ایمیل اصلی و تگ دوم برای فیلد تاییدیه ایمیل می باشد؛ هر دو تقریبا دارای خصوصیت های مشابهی هستند که زیاد به کار ما نمیان اینجا به جز خصوصیت زیر :
required="true"
برای هر دو فیلد مقدار این خصوصیت را از true به false تغییر دهید سپس این فایل را ذخیره کنید؛ توجه کنید که اگر می خواهید کلا فیلد ایمیل در فرم ثبت نام نباشد ، می توانید این 2 تگ را کلا از این فایل حذف یا کامنت کنید.
سپس فایل زیرا از مسیر داده شده پیدا و با یک ویرایشگر متنی باز کنید :
// For Joomla 3.3.6 Until 3.7.5
YOUR_JOOMLA_ROOT\libraries\joomla\table\user.php
// For Joomla 3.8.0 And Higher
YOUR_JOOMLA_ROOT/libraries/src/Table/User.php
در این فایل دنبال تابع check بگردید (تقریبا حدود خط 160 تا 170 این تابع شروع شده)
سپس درون این تابع دنبال خط زیر بگردید :
if (($filterInput->clean($this->email, 'TRIM') == '') || !\JMailHelper::isEmailAddress($this->email))
{
$this->setError(\JText::_('JLIB_DATABASE_ERROR_VALID_MAIL'));
return false;
}
سپس این شرط را کامنت کنید یعنی به صورت زیر :
/*
if (($filterInput->clean($this->email, 'TRIM') == '') || !\JMailHelper::isEmailAddress($this->email))
{
$this->setError(\JText::_('JLIB_DATABASE_ERROR_VALID_MAIL'));
return false;
}
*/
شرط بالا داره چک می کنه اگر فیلد ایمیل خالی بود یا حالت استاندارد آدرس ایمیل نوشته نشده بود خطا بده که با کامنت کردن دیگه این خط اجرا نمی شود.
حال مشکل بعدی ما خطای "این ایمیل از قبل ثبت شده است" می باشد چرا که وقتی اولین شخصی که بدون ایمیل ثبت نام کند یا یک متن کاملا بی ربط موقع ثبت نام وارد کند ، ممکن است نفر بعدی هم این کار را انجام دهد و با خطای ذکر شده مواجه شود؛ برای حل این موضوع در همان فایل قبلی دنبال کد زیر بگردید :
// Check for existing email
$query->clear()
->select($this->_db->quoteName('id'))
->from($this->_db->quoteName('#__users'))
->where($this->_db->quoteName('email') . ' = ' . $this->_db->quote($this->email))
->where($this->_db->quoteName('id') . ' != ' . (int) $this->id);
$this->_db->setQuery($query);
$xid = (int) $this->_db->loadResult();
if ($xid && $xid != (int) $this->id)
{
$this->setError(JText::_('JLIB_DATABASE_ERROR_EMAIL_INUSE'));
return false;
}
مجدد کل این کد را هم کامنت کنید؛ بصورت زیر :
// Check for existing email
/*
$query->clear()
->select($this->_db->quoteName('id'))
->from($this->_db->quoteName('#__users'))
->where($this->_db->quoteName('email') . ' = ' . $this->_db->quote($this->email))
->where($this->_db->quoteName('id') . ' != ' . (int) $this->id);
$this->_db->setQuery($query);
$xid = (int) $this->_db->loadResult();
if ($xid && $xid != (int) $this->id)
{
$this->setError(JText::_('JLIB_DATABASE_ERROR_EMAIL_INUSE'));
return false;
}
*/
در آخر ممکن است با خطای "یک خطا در هنگام ارسال ایمیل ثبت نام رخ داده است" در هنگام ثبت نام مواجه شوید که برای رفع این خطا فایل زیر را از مسیر داده شده باز کنید :
YOUR_JOOMLA_ROOT/components/com_users/models/registration.php
در این فایل دنبال تابع register بگردید؛ تقریبا در انتهای تابع کد زیر رو مشاهده خواهید کرد :
if ($return !== true)
{
$this->setError(JText::_('COM_USERS_REGISTRATION_SEND_MAIL_FAILED'));
// Send a system message to administrators receiving system mails
$db = $this->getDbo();
$query->clear()
->select($db->quoteName('id'))
->from($db->quoteName('#__users'))
->where($db->quoteName('block') . ' = ' . (int) 0)
->where($db->quoteName('sendEmail') . ' = ' . (int) 1);
$db->setQuery($query);
try
{
$userids = $db->loadColumn();
}
catch (RuntimeException $e)
{
$this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500);
return false;
}
if (count($userids) > 0)
{
$jdate = new JDate;
// Build the query to add the messages
foreach ($userids as $userid)
{
$values = array(
$db->quote($userid),
$db->quote($userid),
$db->quote($jdate->toSql()),
$db->quote(JText::_('COM_USERS_MAIL_SEND_FAILURE_SUBJECT')),
$db->quote(JText::sprintf('COM_USERS_MAIL_SEND_FAILURE_BODY', $return, $data['username']))
);
$query->clear()
->insert($db->quoteName('#__messages'))
->columns($db->quoteName(array('user_id_from', 'user_id_to', 'date_time', 'subject', 'message')))
->values(implode(',', $values));
$db->setQuery($query);
try
{
$db->execute();
}
catch (RuntimeException $e)
{
$this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500);
return false;
}
}
}
return false;
}
حال فقط باید کاری کنیم که سیستم نتواند هیچگاه وارد این شرط شود چرا که این شرط برای بررسی کردن صحت ارسال ایمیل است و چون احتمالا همیشه کاربران ایمیل را پر نمی کنند پس ایمیلی نمی تواند ارسال شود در نتیجه این شرط اجرا خواهد شد.
در خط اول این شرط کد زیر قرار دارد :
if ($return !== true)
این تیکه کد را به کد زیر تغییر بدید :
if (1 === 2)
کدی که ما تغییر داده ایم هیچگاه اجرا نخواهد شد چرا که عدد 1 هیچوقت برابر 2 نخواهد شد فلذا شرط اجرا نخواهد شد.
خب تا اینجا کار ما با هسته جوملا تمام شده و چند تنظیم در تنظیمات بخش کاربران باقی مونده که در ادامه آنها رو هم خواهیم گفت. احتمالا الان که ثبت نام کنید ، بعد از ثبت نام پیغام زیر رو مشاهده خواهید کرد :
برای اینکه حساب کاربری افراد ثبت نام کننده بعد از ثبت نام بصورت خودکار فعال گردد و نیازی به ارسال کد فعال سازی نباشد وارد بخش مدیریت -> مدیریت کاربران -> تنظیمات شوید و کانفیگ 2 پارامتر زیر را انجام دهید :
1) پارامتر "ارسال رمز عبور" را روی خیر تنظیم کنید.
2) پارامتر "فعال سازی حساب کاربری جدید" را روی مدیریت سایت تنظیم کنید
کار تمام است و هم اکنون کاربران شما بدون هیچ مشکلی می توانند ثبت کنند و هیچ اجباری هم برای درج ایمیل وجود دارد. اما در نظر داشته باشید خیلی از امکانات سایت برای آنها کار نخواهد کرد. یکی از راه های منطقی تر برای حل این موضوع ، استفاده از کامپوننت فرم ساز RSForm Pro می باشد؛ این سیستم یک پلاگین جهت همگام سازی با ثبت نام جوملا دارد که می توانید با نصب آن ، فرم ساز را به ثبت نام جوملا متصل کنید و دیگر نیازی به تغییر هسته نخواهد بود.
همچین شما می توانید از سیستم ثبت نام پیامکی استفاده کنید که علاوه بر ویژگی حذف یا غیر اجباری کردن فیلد ثبت نام ، سیستم ثبت نام سایت شما مجهز به احراز هویت کاربر توسط پیامک خواهد شد همچنین مشکل خالی بودن ایمیل را هم حل کرده است؛ اطلاعات بیشتر را در صفحه معرفی این سیستم می توانید مطالعه کنید.