لطفا کامنتهای داخل کدها رو هم بخونید!! بعضیاشون واقعا ضروری هستن!

Zend Framework انتخاب من برای یک فریم ورک برای کار با PHP هستش. اینبار میخوام درباره چگونگی ارسال ایمیل به صورتی که بشه براش قالب ایجاد کرد بنویسم. این کد رو من خیلی وقت نیست که نوشتم. اگه مشکل داشت خوشحال میشم برام بنویسید تا بدونم.
برای استفاده باید چند تا کار انجام بدید. اول اینکه توی فایل تنظیمات برنامه خودتون یه سری اطلاعات اضافه کنید. اگه از ini استفاده میکنید اینو به فایل تنظیمات اضافه کنید :

mail.from= "you@yoursite.com"
mail.name= "Your name"
mail.templatePath=APPLICATION_PATH "/../../layouts/mails"
mail.host=imap.yoursite.com
mail.port=25
mail.param.auth=login
mail.param.username=you@yoursite.com
mail.param.password=yourpassword

اینو توی بخش مناسب بنویسید مثلا برای development توی بخش development و… فقط مساله templatePath هست که اونم آدرس رو عوض کنید با آدرسی که میخواید view های مربوط به ایمیل قرار بگیره. (این رو قطعا باید بر اساس پروژه خودتون عوض کنید)
گام بعدی اینه که تنظیمات رو بخونید. اینجوری (معمولا توی bootstrap):

//Load yor config CHANGE PATH TO YOUR CONFIG FILE!!!!!!
$config=new Zend_Config_Ini(APPLICATION_PATH . '/../../configs/application.ini',APPLICATION_ENV);
Zend_Registry::set('config',$config);	

//Do your stuff......

//Now its time to setup mail system :D
$config=Zend_Registry::get('config');
$mailParams=$config->mail->toArray();
Zend_Registry::set('mail_params',$mailParams);

شکه نشید ولی تا الان هیچ کاری انجام نشده :)‌ حالا وقت ایجاد Cybits_Utils_View_Helper_SendMail هستش. توی فولدر library چند تا فولدر باید درست شه :
خواندن ادامه این مطلب »

گراواتار

اردیبهشت ۱۳م, ۱۳۸۹

گراواتار سیستمیه که همه ی کسانی که با WordPress سر و کار دارن میشناسنش. این سیستم به شما امکان میده یه آواتار رو ایجاد کنید، و از این آواتار در همه سیستمهایی که از گراواتار پشتیبانی میکنن استفاده کنید. اما گراواتار چطوری کار میکنه؟
خیلی ساده، شما اونجا یه اکانت میسازید و میتونید بیشتر از یک میل رو هم به یه اکانت نسبت بدید و هم میتونید که برای هر ایمیل خودتون یه آواتار جداگانه ایجاد کنید.
گراواتار یه سیستم خیلی ساده داره. شما آدرس ایمیل شخصی رو که میخواید تصویرشو بگیرید رو به حروف کوچک تبدیل میکنید،‌ بعد آدرس ایمیل رو به صورت md5 درمیارید و همین. دیگه آدرس عکس رو دارید، در حقیقت لینک آدرس عکس رو توی PHP میتونید اینجوری بدست بیارید :

$email = "someone@somewhere.com";
$default = "http://www.somewhere.com/homestar.jpg";
$size = 40;
$rate = 'g';
$grav_url = "http://www.gravatar.com/avatar/" . md5( strtolower( $email ) ) .
"?default=" . urlencode( $default ) .
"&size=" . $size .
"&r=" . $rate;

echo "<img src=\"$grav_url\" alt=\"\" />";

سه تا مقدار default (که آدرس عکس پیشفرضه شماست که اگه نبود اون عکس نمایش داده بشه) و size که اندازه عکس مورد نظر شماست (که اندازه یه ظلع مربع عکسه) که بیشتر از ۵۱۲ هم نمیتونه باشه. (باشه هم مهم نیست، 512 برمیگردونه)‌ و rate (که میگه سایت شما جزو چه دسته ای هست، G ، PG ،R ،X ) که هر سه اختیاری هستن.
خوب، این روش کلی مزیت داره. مزیتاش یکی همین یه دست بودن آواتار کاربر همه جاست. از نظر ریاضیاتی میشه ثابت کرد تعداد کلماتی که md5 برابر داشته باشن بی نهایته :)‌ – تعداد حالت های مختلف md5 ، محدوده. یعنی ۲ به توان ۱۲۸ حالت مختلف. ولی تعداد کلمات چند تاست؟ بی نهایت. خوب یعنی بی نهایت کلمه هست که md5 یکسان داشته باشه، ولی خوب چقدر احتمال داره که دو تا ایمیل یک md5 داشته باشن؟ به نظر من یه احتمال نزدیک به صفر – پس این زیاد مهم نیست. ولی با این روش،‌آدرس لینک نمیتونه ایمیل رو لو بده، و رباتهای مزاحم نمیتونن که از طریق عکسهای گراواتار، آدرس ایمیل رو بگیرن. کاربر هم میتونه یه جا عکس رو عوض کنه و کلی جای دیگه این عکس رو داشته باشه. این سیستم، جدیدا xmlrpc رو هم پیاده سازی کرده که امکانات بیشتری میتونه به شما بده (طراح های WordPress علاقه زیادی به xmlrpc دارن ولی من به شخصه json رو ترجیح میدم که از طریق javascript هم به راحتی قابل دسترسیه. نه این که xmlrpc نیست، ولی json خیلی راحت تره) کلاس PHP هم براش پیاده سازی کردن و توی این آدرس هست. فقط من که تا حالا نتونستم بفهمم API Key واسه این xmlrpc رو از کجا باید بگیرم!

یه میل زدم برای ساپورت درباره API Key و اونا گفتن که API Key همونه که توی WordPress.com به شما میدن. همونی که مثلا برای Akismet هم استفاده میشده. خوب مشکل حل شد :)

راستی اینم گراواتار من :

گراواتار من

کد انتهایی یه مشکل کوچک داشت که اصلاح شد :)‌
ایندفعه،‌میخوام یه چیزی بنویسم درباره دانلود (آخرش هم نفهمیدم که این کلمه رو به فارسی چی بگیم!! بارگزاری،‌بارگیری، گرفتن ..)‌ خیلی وقتها میخوایم که یه فایل رو محافظت کنیم که همینجوری دانلود نشه، یعنی حتما اسم کاربری بخواد، یا اینکه مطمئن شیم که فایل حتما از تو صفحه خودمون دانلود میشه که آمار درست باشه.
یه راه ساده وجود داره، که بیشتر از اون استفاده میشه،‌اونهم به سادگی گذاشتن فایل در یک پوشه خارج از دسترسی مستقیم (مثلا خارج از ریشه وب سرور، یا محافظت شده توسط وب سرور،‌مثلا آپاچی با کمک فایل .htaccess ) و بعد به پس دادن فایل از طریق کد به کاربر. مثلا برای PHP میتونید همچین کدی بنویسید :

//Before this point you should check everything
//include user authenticate and any thing else
$result=@readfile('/path/to/file');
if ($result===false)
   //Error :(
else {
   // $result contain byte count
}

این روش بد نیست، کاربر نمیتونه لینک مستقیم بگیره، که خوب این معمولا برای خیلی ها مهمه، خصوصا با این وضع وبلاگها و سایتهای ایرانی که متخصص کپی/پیست و گرفتن لینک و گذاشتن به اسم خودشون حتی بدون زحمت آپلود مجدد هستن.
اما یه عیب بزرگ داره،‌این دانلود دیگه قابلیت resume نداره. منم که دقیقا میتونم کاربر دیال آپی رو درک کنم،‌مخصوصا اینکه تو ایران بزرگ شدم!! خوب این شد که نشستم و بررسی کردم که چطوری این مشکل رو هم حل کنم. البته این کارو خیلی وقت پیش انجام دادم، و چون امروز خواهر زاده ام گیر داده بود، ‌پیداش کردم و یادم افتاد که میشه اینجا بنویسمش،‌و خصوصا اینکه این روزا همش تو فکر اینم که چی بنویسم که ارزش نوشتن داشته باشه .
خواندن ادامه این مطلب »

فوت کوزه گری!

اسفند ۱۳م, ۱۳۸۸

گاهی یک فوت کوزه گری رو دونستن میتونه کلی بدادت برسه و از کلی دردسر نجاتت بده! یه قابلیت که توی فایلهای PHP هست اینه که اگه فایل PHP شما قرار نیست که ادامه داشته باشه یعنی قرار نیست بعد از اینکه کد تموم شد،‌ادامه فایل به صورت HTML باشه، اونوقت میتونید از گذاشتن علامت ?> در انتهای کد خودداری کنید. راستشو بخواید اول که این قابلیت رو دیدم کلا نفهمیدم به چه دردی میخوره یا اگه بیشتر راستشو بخواید به خودم گفتم این قابلیت اصلا احمقانه و به درد نخوره (نتیجه اخلاقی این پست اینه که زود قضاوت نکنید! )‌ ولی امشب فهمیدم که نخیر! اینطورا هم نیست!
قضیه اینطوریه که یه کدی دارم مینویسم که قراره یه تصویر رو از یه فایل بخونه و به خروجی بده (تابع readfile() از اون توابعیه که بعضیا کمتر میشناسنش!!)‌ همه چی درست بود (البته در ظاهر)‌ اما فایرفاکس خروجی رو نشون نمیداد. نتیجه رو که بررسی میکردم متوجه شدم که Content-Type هم درست ارسال میشه، ولی نمایش داده نمیشه. بارها و بارها کد رو بررسی کردم و هرچه بیشتر چک کردم کمتر نتیجه گرفتم.
تا بالاخره خروجی رو با یه ویرایشگر باینری (HexEditor ) چک کردم. نتیجه دو تا کاراکتر Space در ابتدای فایل تصویر بود. صفحات دیگه رو هم چک کردم. اونجا ها هم این دو تا کاراکتر اضافه بود، ولی خوب html مشکلی نداره با این فااصله های اضافی. فایلهای include شده رو یکی یکی بررسی کردم و آخر سر هم خرابکار، پروژه jDate خودم بود. توی یکی از فایلها بعد از پایان کد و تگ پایان PHP (یا همون ?> ) دو تا فاصله خورده بود. این فایل بعد از آغاز session و ارسال header ها استفاده شده بود و به همین دلیل مشکل خودشو توی اونها نشون نداده بود. جالبتر اینکه یه فایل دیگه هم پیدا کردم که دقیقا این مشکل رو داشت و یه Enter اضافه داشت، که خیلی پیش میاد تو یه ویرایشگر این اتفاق بیفته. تو همه فایلهای دوره ویندوزم هم این مشکل کم و بیش بود :) نتیجه گیری اینکه من از این به بعد کل فایلهایی که با کد PHP تموم میشن رو وقتی بنویسم، خصوصا فایلهایی که قرار نیست خروجی داشته باشن مثل همین کتابخونه ها، به همین صورت و بدون بستن کد PHP مینویسم، توصیه میکنم شما هم همین کارو بکنید. به دردسرش نمیرزه،‌این یه دفعه دقیقا ۴۵ دقیقه وقتمو گرفت!!
نکته دوم هم اینکه این پست اولین پست من با عینکه! دو سه روز پیش عینکی شدم!! :)

چند تا تابع هست که ممکنه شما ندیده باشیدشون. منم یه چند تایی رو میشناختم که هر کدوم یه وقتایی نجاتم داده بودن از کلی کد نویسی زاید. این شد که تصمیم گرفتم یه چند تایی رو معرفی کنم:
pack()
این تابع یک بار منو نجات داد. PHP برای عملیات بیتی مخصوصا روی فایلها کار چندانی انجام نداده. یعنی تمام توابع برخلاف زبانهای دیگه هستند. مثلا تابع fwrite یه رشته (string )‌رو توی فایل مینویسه و این یعنی یه مشکل :)‌.
یه زمانی میخواستم برنامه ای بنویسم که یه فایلی ایجاد کنه که توی دلفی بخونمش،‌اونجا قضیه برعکسه. توی دلفی باینری یه انتخاب ساده تره. اینجا بود که تابع pack رو پیدا کردم این تابع برای ایجاد یک رشته باینری استفاده میشه. یعنی اگه این رشته رو توی یه فایل بنویسی خیلی راحت میتونی مثلا توی دلفی یا سی اونو از فایل بخونی. مثلا برای ایجاد کردن یه خط حاوی دو تا کاراکتر،‌یه int اینجوری میشه عمل کرد :
خواندن ادامه این مطلب »