ايجاد پيوند به ديگر صفحات با HTML
برچسب: طراحی وب سایت, طراحی سایت, طراحی وب,
نویسنده: ali
همان طور که در قسمت سي و يکم توضيح داده شد، دو حالت از Operator Method وجود دارد: Unary Operators و Binary Operators که با Binary Operators نيز آشنا شديد. Unary Operator ها مانند Binary Operator ها overload مي شوند و با اين تفاوت طراحی وب سایت که در Unary Operators تنها يک operand وجود دارد.
زنگ سي شارپ - قسمت سي و سوم
فرم کلي Unary Operators به شکل زير است:
// General form for overloading a unary operator
public static ret-type operator op(param-type operand)
{
// operations
}
به عنوان مثال متد زير، unary minus را overload مي کند:
public static TwoD operator -(TwoD ob)
{
TwoD result = new TwoD();
result.X = -ob.X;
result.Y = -ob.Y;
retu result;
}
در اين جا يک شيء جديد retuمي شود که شامل مقدار منفي فيلدهاي operand است. دقت کنيد که operand تغيير نمي کند، براي مثال در عبارت a = -b مقدار منفي b به a اختصاص داده مي شود در حالي که b بدون تغيير مي ماند.
using System;
class TwoD
{
private int X, Y;
public TwoD()
{
X = Y = 1;
}
public TwoD(int a, int b)
{
X = a;
Y = b;
}
public static TwoD operator -(TwoD ob)
{
TwoD result = new TwoD();
result.X = -ob.X;
result.Y = -ob.Y;
retu result;
}
public void Show()
{
Console.WriteLine("{0}, {1}", X, Y);
}
}
class UnaryOpertorDemo
{
static void Main()
{
TwoD ob = new TwoD(1, 1);
TwoD result;
result = -ob;
ob.Show();
result.Show();
}
}
در سي شارپ، overload کردن ++ و - - بسيار آسان است. کافي است که مقدار را افزايش يا کاهش دهيد و آن را retu کنيد اما نبايد مقدار شيء operand را تغيير دهيد. سي شارپ به طور خودکار حالت هاي postfix و prefix را براي شما در نظر مي گيرد. براي مثال متد زير يک ()++operator براي کلاس TwoD است:
شما مي توانيد operator methods را هم overload کنيد. رايج ترين دليل آن اين است که با اين کار اين امکان را فراهم مي کنيد تا عمليات بين يک class type (مثل کلاسي که خودتان تعريف کرديد) و يک built-in type (يک type که در دات نت موجود است، مثل int) انجام شود. به عنوان مثال، مجدداً به کلاس TwoD دقت کنيد. مشاهده کرديد که + را overload کرده ايم و اين باعث مي شود تا مختصات يک شيء TwoD با مختصات يک شيء ديگر جمع شود. اما اين تنها راه جمع کردن براي شيء TwoD نيست! شما فقط توانستيد دو شيء را با هم جمع کنيد اما گاهي نياز داريد يک int را با يک شيء جمع کنيد. براي اين منظور شما نياز داريد که + را دوباره overload کنيد
// Overload binary + for TwoD + int.
public static TwoD operator +(TwoD op1, int op2)
{
TwoD result = new TwoD();
result.X = op1.X + op2;
result.Y = op1.Y + op2;
retu result;
}
دقت کنيد که پارامتر دوم از جنس int است. بنابراين اين متد اجازه مي دهد يک مقدار int به هر يک از فيلدهاي TwoD افزوده شود. توجه داشته باشيد هنگامي که يک binary operator را overload مي کنيد، يکي از operand ها حتماً بايد از جنس کلاسي باشد که در آن operand مربوطه overload مي شود اما بقيه ي operand ها مي توانند از هر نوعي باشند. به همين دليل است که در متد قبل يکي از parameter ها از جنس TwoD (جنس کلاسي که در آن operand مورد نظر overload شده) و ديگري از يک جنس دل خواه مثل int است.
در زير مشاهده مي کنيد که + دو بار overload شده دارد:
using System;
class TwoD
{
int X, Y;
public TwoD()
{
X = Y = 0;
}
public TwoD(int a, int b)
{
X = a;
Y = b;
}
// Overload binary + for TwoD + int.
public static TwoD operator +(TwoD op1, int op2)
{
TwoD result = new TwoD();
result.X = op1.X + op2;
result.Y = op1.Y + op2;
retu result;
}
// Overload binary + for TwoD + TwoD.
public static TwoD operator +(TwoD op1, TwoD op2)
{
TwoD result = new TwoD();
result.X = op1.X + op2.X;
result.Y = op1.Y + op2.Y;
retu result;
}
public void Show()
{
Console.WriteLine(X + ", " + Y);
}
}
class OpOverloadingDemo
{
static void Main()
{
TwoD ob1 = new TwoD();
TwoD ob2 = new TwoD(3, 3);
TwoD result;
result = ob1 + 2; // TwoD + int
ob1.Show();
result.Show();
result += ob2; // TwoD + TwoD
ob2.Show();
result.Show();
}
}
همان طور که مي بينيد، هنگامي که + روي دو شيء TwoD اعمال شده، مختصات اين دو شيء با هم جمع مي شود و هنگامي که + روي يک شيء TwoD و يک مقدار int اعمال شده ، فيلدهاي شيء با مقدار int جمع شده است.
overload کردن + کاربرد مفيدي را به کلاس TwoD مي افزايد اما هنوز اين تمام چيزي نيست که مورد نياز است و در واقع کار هنوز تمام نشده است. متد (operator+(TwoD, int تنها براي عبارتي از اين جمله:
ob1 = ob2 + 10;
مجاز است و عبارتي مثل:
ob1 = 10 + ob2;
را نمي پذيرد. به اين دليل که argument عدد صحيح، دومين argument است يعني آن operand که در سمت راست قرار دارد. اما در عبارت قبلي مي بينيد که argument عدد صحيح را در سمت چپ قرار داده ايم. براي اين که هر دو عبارت براي استفاده مجاز باشند، بايد يک بار ديگر + را overload کنيد. اين بار بايد اولين پارامتر را int و دومين پارامتر را TwoD در نظر بگيريد.
به اين ترتيب، يک ورژن از متد ()+operator براي TwoD + int و يک ورژن ديگر آن براي int + TwoD است. Overload کردن + (يا هر binary operator ديگري) به اين شکل باعث مي شود تا يک built-in type هم بتواند در سمت چپ و هم در سمت راست قرار بگيرد. در نمونه ي زير مي بينيد که چگونه + همان گونه که شرح داده شد، overload شده است:
using System;
class TwoD
{
int X, Y;
public TwoD()
{
X = Y = 0;
}
public TwoD(int a, int b)
{
X = a;
Y = b;
}
// Overload binary + for TwoD + int.
public static TwoD operator +(TwoD op1, int op2)
{
TwoD result = new TwoD();
result.X = op1.X + op2;
result.Y = op1.Y + op2;
retu result;
}
// Overload binary + for int + TwoD.
public static TwoD operator +(int op1, TwoD op2)
{
TwoD result = new TwoD();
result.X = op1 + op2.X;
result.Y = op1 + op2.Y;
retu result;
}
// Overload binary + for TwoD + TwoD.
public static TwoD operator +(TwoD op1, TwoD op2)
{
TwoD result = new TwoD();
result.X = op1.X + op2.X;
result.Y = op1.Y + op2.Y;
retu result;
}
public void Show()
{
Console.WriteLine(X + ", " + Y);
}
}
class OpOverloadingDemo
{
static void Main()
{
TwoD a = new TwoD(1, 2);
TwoD b = new TwoD(10, 10);
TwoD c = new TwoD();
Console.Write("Here is a: ");
a.Show();
Console.WriteLine();
Console.Write("Here is b: ");
b.Show();
Console.WriteLine();
c = a + b; // TwoD + TwoD
Console.Write("Result of a + b: ");
c.Show();
Console.WriteLine();
c = b + 10; // TwoD + int
Console.Write("Result of b + 10: ");
c.Show();
Console.WriteLine();
c = 15 + b; // int + TwoD
Console.Write("Result of 15 + b: ");
c.Show();
}
}
overload کردن عملگرهاي رابطه اي
عملگرهاي رابطه اي (Relational Operators)، مثل == يا > مي توانند به سادگي overload شوند. به طور معمول، يک عملگر رابطه اي overload شده، مقدار true يا false را retu مي کند، به اين دليل که حالت و کاربرد استاندارد عملگرهاي رابطه اي حفظ شود و بتوان از آن ها در عبارت هاي شرطي استفاده کرد. اگر در اين موارد به جاي مقادير bool چيزي ديگري را retu کنيد، به شدت کاربرد اين operator را محدود کرده ايد. نکته ي مهم ديگر اين جاست که بايستي relational operators را به طور جفتي overload کنيد. به عنوان مثال اگر > را overload کرديد، بايستي < را نيز overload کنيد. اين مورد براي operator هاي (<= و >=) و (== و !=) نيز صادق است.
using System;
class TwoD
{
int X, Y;
public TwoD()
{
X = Y = 0;
}
public TwoD(int a, int b)
{
X = a;
Y = b;
}
public static bool operator <(TwoD op1, TwoD op2)
{
retu ((op1.X < op2.X) && (op1.X < op2.Y));
}
public static bool operator >(TwoD op1, TwoD op2)
{
retu ((op1.X > op2.X) && (op1.Y > op2.Y));
}
}
class OpOverloadingDemo
{
static void Main()
{
TwoD ob1 = new TwoD(1, 4);
TwoD ob2 = new TwoD(2, 3);
if (ob1 > ob2)
Console.WriteLine("ob1 is greater than ob2");
if (ob1 < ob2)
Console.WriteLine("ob1 is less than ob2");
}
}
در مثال بالا، (operator>(TwoD, TwoD در صورتي true را retu مي کند که هم X و هم Y شيء اول از X و Y شيء دوم بزرگ تر باشد. (operator<(TwoD, TwoD در صورتي مقدار true را retu مي کند که هم X و هم Y شيء اول از X و Y شيء دوم کوچک تر باشد.
نکته ي ديگر اين که اگر مي خواهيد operator هاي == و =! را overload کنيد، بايستي متدهاي ()Object.Equels و ()Object.GetHashCode را نيز override کنيد. در مورد اين متدها و تکنيک overriding بعداً صحبت خواهيم کرد.
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
تاريخچه وب
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
اتحاد جماهير شوروي آن زمان موشکي با نام «اسپونيک» (Spotnik) را به فضا مي فرستد و نشان مي دهد داراي قدرتي است که مي تواند شبکه هاي ارتباطي آمريکا را توسط موشک هاي بالستيک و دوربرد خود از بين ببرد. آمريکايي ها در پاسخگويي به اين اقدام روس ها، موسسه پروژه هاي تحقيقي پيشرفته “ARPA” را به وجود آوردند. هدف از تاسيس چنين موسسه اي پژوهش و آزمايش براي پيدا کردن روشي بود که بتوان از طريق خطوط تلفني، کامپيوترها را به هم مرتبط نمود. به طوري که چندين کاربر بتوانند از يک خط ارتباطي مشترک استفاده کنند. در اصل شبکه اي بسازند که در آن داده ها به صورت اتوماتيک بين مبدا و مقصد حتي در صورت از بين رفتن بخشي از مسيرها جابه جا و منتقل شوند. در اصل هدف “ARPA” ايجاد يک شبکه اينترنتي نبود و فقط يک اقدام احتياطي در مقابل حمله احتمالي موشک هاي اتمي دوربرد بود. هر چند اکثر دانش امروزي ما درباره شبکه به طور مستقيم از طرح آرپانت “ARPPA NET” گرفته شده است. شبکه اي که همچون يک تار عنکبوت باشد و هر کامپيوتر ان از مسيرهاي مختلف بتواند با همتايان خود ارتباط دااشته باشد واگر اگر يک يا چند کامپيوتر روي شبکه يا پيوند بين انها از کار بيافتاد بقيه باز هم بتوانستند از مسيرهاي تخريب نشده با هم ارتباط بر قرار کنند. طراحی وب سایت
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
Begiers' Guide to Web Design with WordPress
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
گزينشکرها (selectors)
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
سريعترين و ساده ترين روش براي ساخت وب سايت خود را عملياتي را فقط در چند دقيقه است که نصب ورد پرس است که بستر هاي نرم افزاري رايگان وبلاگ نويسي. ورد پرس شما اجازه مي دهد براي دريافت رايگان از پيش ساخته شده وب سايت که شما برخي از جنبه هاي متمرکز نشان مي دهد مانند مطالب, منافع, فروش وب سايت شما و…. در اين مقاله ما در مورد مطبوعات واژه ها و منافع آن به طور مفصل مورد بحث.
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
پردازش فرم ها با زبان PHP
فرم ها يکي از مهمترين و شايد جالب ترين کاربردهاي زبان قدرتمند PHP مي باشد ، فرم ها در طراحی وب سایت کاربردهاي بسيار زيادي را دارند ، اين کاربرد ها از قبيل :ثبت کاربران جديد ، دريافت سفارش در فروشگاه هاي اينترنتي ، ارسال فيدبک و ... مي باشند
همانطور که ملاحظه نموديد ، همه ي اين فرم ها دقيقا به يک صورت عمل يا پردازش مي شوند ، ايجاد يک فرم و طراحی وب سایت آن با استفاده از زبان HTML و CSS صورت مي گيرد ولي پردازش اين فرم يا به عبارتي ديگر کاري که فرم انجام مي دهد مثلا ارسال ايمل توسط يکي از زبان هاي تحت سرور همانند PHP و يا ASP صورت مي گيرد.
در اين سري مجموعه هاي آموزش پردازش فرم در سون لرن سعي مي کنيم تا شما را به صورت کامل و کاربردي با پردازش فرم همراه با يک يا دو پروژه عملي مثل ساخت Quizو يا فرم تماس با ما آشنا خواهيم کرد.
در ابتدا ما قصد داريم يک فرم را با بک سري فيلد هاي مشخص تعريف نمائيم:
نام و نام خانوادگي
ايميل
پيام شما
1 <form action="" method="post">
2 Name: <input type="text" name="name" />
3 Email: <input type="text" name="email" />
4 Comment: <input type="text" name="comment" />
5 <input type="submit" />
6 </form>
از اين پس ما بر بخش آموزش پردازش فرم با php با اين فرم کار طراحی وب سایت خواهيم کرد.
اما قبل از اينکه شروع به کد نويسي براي پردازش فرم ها نمائيم ، بهتر شما را با تفاوت متدهاي Get و Post آشنا سازيم:
تفاوت دو متد Get و Post :
بهترين طريقه آموزش طراحی وب سایت براي نمايش تفاوت بين اين دو متد ، استفاده از فرم مي باشد ، ما با همان فرم قبلي کار خود را شروع مي کنيم ، در ابتدا فرم خود را از متد Post به Get تبديل نمائيد :
1 <form action="" method="get">
سپس فرم خود را در xampp اجرا نمائيد ، حال اگر شما هر فيد نام ، ايميل و پيام را وارد نمائيد و دکمه Submit را کليک کنيد ، در نوار آدرس مرورگر خود با آدرس زير مواجه مي شويد:
http://localhost/xampp/aaa.php?name=MiladHeydari&email=miladbruce%40live.com&comment=i+love+the+world!
همانطور که ملاحظه نموديد ، شما تمام مقاديري که در فيلدهاي خود وارد نموديد ، در نوار آدرس مشخص گرديد ، پس يعني متد Get چندان ايمن يا Secure نيست!
اما هم اکنون متد فرم خود را از Get به Post تغيير دهيد :
1 <form action="" method="post">
حال اگر فيلدهاي طراحی وب سایت فرم خود را پر کنيد ف و بر روي دکمه Submit کليک نمائيد ، هيچ گونه تغييري را در نوار آدرس مرورگر خود ملاحظه نخواهيد کرد.
نتيجه گيري :
همان طور که ديديد ، متد Get داده هاي شما را به صورتي نمايش مي دهد که در معرض ديد است و همچنين مرورگرهايي همچون Inteet Explorer يک محدوديت کارکتري در نوار آدرس را براي خود ايجاد کرده اند به طول 2048 کاراکتر ، بنابراين از متد Get فقط زماني استفاده مي شود که پاسخ فرم ما بسيار کوتاه باشد و همچنبن متد Get چندان ايمن نيست!
ولي در مقابل متد Post ايمن تر بوده و مي توان اطلاعات يک فرم را به اندازه 8 مگابايت کاراکتر پردازش کرد ، به طور معمول اکثرا از متد Post براي فرم ها استفاده مي کنند ولي Get نيز کاربرد خاص خود را دارد به عنوان مثال اکثر سايت هايي که امکان جستجو را به کاربران خود مي دهند ، فرم جستجوي خود را با متد Get طراحي کرده اند ، در اين صورت اين کار مي تواند حتي باعث افزايش بازديد نيز شود و همچنين کاربران مي توانند آدرس جستجو را در مرورگر خود BookMark نمايند.
ساده و منطقي است. مرورگر HTML را مثل وقتي که شما انگليسي را ميخوانيد مي خواند: از بالا به پايين و از چپ به راست. بنابراين يک سند HTML ساده با آن چيزي که بايد اول بيايد شروع مي شود، و با آن چيزي که بايد در انتها بيايد به آخر مي رسد.
اولين کاري که نياز داريد انجام دهيد، اين است که به مرورگر بگوييد که، شما با زبان HTML مي خواهيد با او گفت و گو کنيد. اين کار با برچسب <html> انجام مي شود. بنابراين قبل از اينکه هر کاري را غير از اين انجام دهيد، برچسب <html> را در اولين خط از سندتان در برنامه notepad تايپ کنيد.
همانطور که ممکن است از درس هاي قبل به ياد داشته باشيد، <html> يک برچسب باز است و بايد زماني که نوشتن کدهاي html تان به پايان رسيد، با برچسب بسته به اتمام برسد. بنابراين براي اينکه مطمئن شويد که برچسب بسته را فراموش نمي کنيد، طراحی وب سایت حال <htm/> را در دو خط پايين تر تايپ کنيد و بقيه کدهاي اچ تي ام ال را بين <html> و <html/> تايپ کنيد.
مورد بعدي که سندتان به آن احتياج دارد برچسب <head> است، که اطلاعاتي را در مورد صفحه آماده مي کند. و <body> که محتواي سندتان در آن وجود دارد. به دليل اينکه اگر HTML منطقي نباشد بي ارزش ميشود، برچسب باز و بسته head، بايد بالاي برچسب باز و بسته body قرار گيرد.
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali
مزایای طراحی وب سایت با div نسبت به table
دسته بندی : آموزش html، طراحی وب سایت ، اخبار اینترنت
حتما شنیدید که خیلی جاها توصیه میشه که برای Layout صفحه بجای Table از Div استفاده کنید. اما چرا؟
وظیفه اصلی تگ div در واقع چیدمان صفحه و طراحی قالب صفحه است و به همین دلیل است که نسبت به table فوق العاده انعطاف پذیرتر است. شما براحتی می توانید یک div را در هر مکانی از صفحه در کوتاهترین زمان قرار بدهید. حالا به این انعطاف پذیری قابلیت حرکت ( انتقال ) را که با کمک تکنولوژی آژاکس اضافه شده نیز بی افزایید.
از طرف دیگر، div کد کمتر و بهینه تری (<div> </div>) نسبت به یک table (که معادل <table><tr><td></td></tr></table>) ایجاد می کند. که این هم باعث کاهش حجم صفحه تولیدی می شود و هم باعث لود شدن سریعتر صفحه .
نکته دیگری که وجود دارد آن است که crawler ها که وظیفه جستجوی و ذخیره کردن طراحی وب سایت را برای موتورهای جستجو ( مثلگوگل ) بعهده دارند. چون بصورت معنایی صفحات را crawl می کنند بنابراین اگر صفحه شما بهتر و معنایی تر ایجاد شده باشد ، ازPage rank بالاتری هم برخوردار خواهد بود. مشکل Crawler ها در ایجاد ارتباط بین مطالب داخل تیبل است. زمانیکه شما مطالب مرتبط با یک موضوع را در بخش های مختلف یک تیبل قرار میدید Crawler ها در نحوه ارتباط این بخش ها با هم و همچنین نحوه ارتباطشون با مطلب اصلی دچار سردرگمی میشن.
نکته دیگری که یک div را در قالب بندی دردرجه بالاتری قرار می دهد، انعطاف پذیری آن در CSS هاست. به این معنی که شما می توانید یک قالب چندین منظوره ایجاد کنید و بعد با تغییر مکان div ها که با css انجام می دهید . کل قالب صفحه تغییر شکل پیدا می کند.
حالا با این همه برتری div نسبت به table ممکن است برای شما این سوال ایجاد شود که table برای چه مواردی باید استفاده شود. طراحی وب سایت html همانطور که div را برای قالب بندی وقرار دادن متن و تصویر پیاده سازی کردند. table را هم برای ایجاد صفحات به شکل Tab و ایجاد جداول ( لیست های موجود در صفحه) بوجود آوردند. در اکثر مواقع توصیه می شود که برای پیاده سازی Tab ها از table استفاده کنید. همانطور که مسلما خود شما هم متوجه شدید با استفاده از یک table براحتی می توان یک tab را پیاده سازی کرد. درصورتی که اگر بخواهید همان tab را با div پیاده سازی کنید باید زمان و انرژی بیشتری صرف کنید.
در کل با توجه به این نکات کلیدی :
حجم کمتر صفحه طراحی وب سایت تولید شده
Page rank بالاتر در گوگل و سایر search engine ها
قالب انعطاف پذیرتر
برای قراردادن متن و تصویر در وب توصیه شده که از div استفاده شود
کنترل بیشتر بوسیله css
جدول صرفا برای ساختار tabی مناسب است
کنترل و حرکت توسط آژاکس
…
به شما اکیدا توصیه می کنم که بجای استفاده از table در قالب بندی صفحات از div استفاده کنید و از قدرت آن لذت ببرید.
....
آموزش ساخت طراحی وب سایت با Dreamweaver CS4
آموزش ساخت وب سايت با Dreamweaver CS4
عنوان اصلي : Creating First Web Site In Dreamweaver CS4
آموزش طراحی وب سایت بسيار زيبا اما ساده در نرم افزار Adobe Dreamweaver CS4 به مدت زمان 2 ساعت و 40 دقيقه در آموزش مالتي مديا محصول موسسه آموزشي Lynda ارائه شده بر روي 1 حلقه CD به همراه فايل هاي تمريني
اين آموزش پروسه طراحي يك سايت را در نرم افزار دريم ويور CS4 به شما مي آموزد از ساختن يك صفحه ساده HTML تا استايل گذاري بر روي آن بوسيله CSS و همچنين نحوه ساخت انواع فرم ها به عنوان مثال فرم تماس با ما .
اين مجموعه آموزش بهترين مجموعه آموزش طراحی وب سایت براي شروع آموختن طراحي وب است .
در ادامه با برخي از سرفصل هاي درسي اين مجموعه آموزش Dreamweaver CS4 آشنا مي شويم :
آشنايي با مدرس مجموعه و سرفصل هاي اين كورس آموزشي از زبان مدرس شامل 3 درس
آموزش مفاهيم اوليه وب و وب سايت ها شامل 3 درس
آموزش ساخت صفحات وب در دريم ويور شامل 5 درس
آموزش اعمال CSS ها براي سبك بندي صفحات وب در Adobe Dreamweaver CS4 شامل 4 درس
آموزش پيشرفته CSS ها در Dreamweaver CS4 شامل 5 درس
آموزش ذخيره و استفاده از قالب ها در Dreamweaver CS4 شامل 1 درس
آموزش وارد كردن تصاوير در صفحات طراحی وب سایت شامل 2 درس
آموزش ساخت Photo Gallery و كاربرد فايل هاي فلش در صفحات وب شامل 3 درس
آموزش ساخت فرم تماس وب سايت در Dreamweaver CS4 شامل 2 درس
آموزش تست كردن نهايي براي رفع ايرادات آن و در نهايت آموزش كامل قرار دادن يك وب سايت بر روي اينترنت شامل 3 درس
و چندين و چند آموزش كاربردي ديگر مانند آموزش آماده سازي وب سايت براي موتورهاي جستجو ، استفاده از FTP و بسياري موارد ديگر
برچسب: طراحی وب سایت,طراحی سایت,طراحی وب,
نویسنده: ali