PDA

View Full Version : سوال: سوال در مورد فرم ها



nimja145
جمعه 21 مرداد 1390, 17:14 عصر
سلام
من تو صفحه 2 تا فرم دارم.(مجبورم که بیش از یک فرم داشته باشم ) این کداچ تی ام ال اون :



<body>
<form action=index.html>
<select name="fild-1">
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<input type=submit />
</form>
<form action=index.html>
<select name="fild-2">
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<input type=submit />
</form>
</body>



این کد ها درون صفحه با نام Index.html قرار دارند.
وقتی که از لیست کشویی فرم اول گزینه ای رو انتخاب میکنم و submit اون فرم رو میزنم به آدرس زیر میره:



index.html?fild-1=2


حالا در این آدرس وقتی روس دکمه submit فرم دوم کلیک میکنم به آدرس زیر میره:


index.html?fild-2=2




سوال من اینه که چیکار کنم بعد از کلیک رو فرم دوم به آدرس زیر بره:


index.html?fild-1=2&fild-2=2

eshpilen
جمعه 21 مرداد 1390, 18:03 عصر
خب دوتا فرم رو بکن یک فرم. این چه کاری هست که دوتا فرم گذاشتی درحالیکه هردو میتونن یک فرم باشن.
اگر هم میخوای دوتا دکمهء سابمیت داشته باشی که میخوای سمت سرور بفهمی کدومش کلیک شده میتونی برای دکمه های سابمیت هم اسم بذاری.
یعنی اینطوری مثلا:

<body>
<form action=index.html>
<select name="fild-1">
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<input type=submit name="submit1" />
<br><br>
<select name="fild-2">
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<input type=submit name="submit2" />
</form>
</body>
حالا تنها اسم و مقدار اون دکمهء سابمیت به سرور ارسال میشه که فشار دادنش باعث سابمیت فرم شده. اسم و مقدار اون یکی ارسال نمیشه.
البته این روش تنها عیبش اینه که پارامترهای URL رو شلوغ میکنه. شاید بشه برای اینم فکری کرد. البته اگر از متد POST استفاده میکنی که این مشکلی نیست.

nimja145
جمعه 21 مرداد 1390, 19:26 عصر
ممنون. اصلا به این نکته توجه نکرده بودم که میشه چندتا submit برای یک فرم گذاشت.
یک سوال دیگه برام پیش اومد:
چطور میشه کاری کرد که بعد از ارسال ،وقتی که صفحه دوباره لود میشه گزینه ای که قبلا از لیست کشویی انتخاب شده بود ، پیش فرض انتخاب شده باشه؟

eshpilen
جمعه 21 مرداد 1390, 20:23 عصر
چطور میشه کاری کرد که بعد از ارسال ،وقتی که صفحه دوباره لود میشه گزینه ای که قبلا از لیست کشویی انتخاب شده بود ، پیش فرض انتخاب شده باشه؟ هان!
اینکار در کنترل های ASP.NET بصورت خودکار توسط چیزی بنام viewstat انجام میشه.
اینو برای این گفتم که بازم قلب PHP کارها رو بشکنم :لبخند:

اما خوشبختانه در PHP هم میشه براحتی به روشهای مختلف این کار رو انجام داد.
البته بازم ASP.NET کلا راحتتر و کاملتره ها، ولی PHP رو هم دست کم نگیرید. بارها گفتم. PHP از ASP.NET با اونهمه ادا و اطوارش بهتره واسه حرفه ایها، چون هم بازمتن هست و هم اینکه واسه کار سطح پایین و ویژه خوراکه.

حالا یه مثال:



<html>
<body>
<form action="">
<select name="fild-1">
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<input type=submit name="submit1" />
<br><br>
<select name="fild-2">
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<input type=submit name="submit2" />
<br><br><input type=reset />
</form>
<?php
if(isset($_REQUEST['submit1']) or isset($_REQUEST['submit2'])) {
echo '<script>';
$option=$_REQUEST['fild-1']-1;
echo "\ndocument.forms[0]['fild-1'].options[$option].selected=true;\n";
$option=$_REQUEST['fild-2']-1;
echo "document.forms[0]['fild-2'].options[$option].selected=true;\n";
echo '</script>';
}
?>
</body>
</html>


تست شده در FF 3.6.8 و IE 8.
البته این روش با جاوااسکریپت هست. بدون جاوااسکریپت هم میشه. ولی بنده شخصا روش جاوااسکریپت رو دوست دارم، چون دکمهء ریست فرم در این روش به صورت مورد انتظار کار میکنه.
البته توجه دارید که این فقط یه مثال پایه و ساده برای نشون دادن طرز کار کلی هست که بر اساس مورد خاص نمونه کد شما نوشته شده.

nimja145
جمعه 21 مرداد 1390, 20:42 عصر
ممنون .میشه بدون جاوا رو هم مثال بزنید.چون احتمال اینو باید داد که جاوا برای کاربر شاید خاموش باشه

eshpilen
جمعه 21 مرداد 1390, 22:22 عصر
اینم بدون جاوااسکریپت:

<?php
if(isset($_REQUEST['submit1']) or isset($_REQUEST['submit2'])) {
$option1=$_REQUEST['fild-1'];
$option2=$_REQUEST['fild-2'];
}
else $option1=$option2=-1;
?>
<html>
<body>
<form action="">
<select name="fild-1">
<?php
for($i=1; $i<4; $i++) if($i!=$option1) echo "<option value=$i>$i</option>\n";
else echo "<option value=$i selected=true>$i</option>\n";
?>
</select>
<input type=submit name="submit1" />
<br><br>
<select name="fild-2">
<?php
for($i=1; $i<4; $i++) if($i!=$option2) echo "<option value=$i>$i</option>\n";
else echo "<option value=$i selected=true>$i</option>\n";
?>
</select>
<input type=submit name="submit2" />
<br><br><input type=reset />
</form>
</body>
</html>

همینجوری سردستی الان درستش کردم؛ شاید راه بهتری هم براش باشه.
اگر دقت کنید در این روش دکمهء ریست کارکرد طبیعی ای رو که اغلب مورد انتظار هست نداره، ولی مثلا میتونیم کارکرد طبیعی اون رو با جاوااسکریپت بنویسیم.


چون احتمال اینو باید داد که جاوا برای کاربر شاید خاموش باشه بنظر بنده بیشتر برای کاربردهای اصلی که بدون اونا کاربر نمیتونه از سایت استفاده کنه مهمه که بدون جاواسکریپت هم کار کنن. ضمنا بعضی کاربردها اساسا نیاز به جاواسکریپت دارن. بنابراین این امر اجباری نیست. گرچه بنده خودم یه زمانی روی این تاکید داشتم، اما فکر میکنم الان اینقدر فناوری و مرورگرها پیشرفت کردن و نیاز به جاوااسکریپت زیاد هست که میشه اساس کار رو بر وجود جاوااسکریپت گذاشت. البته اینو بگم که این اهمال یا بی سوادی بعضی برنامه نویسان رو توجیه نمیکنه، چون در بیشتر موارد میشه کاری کرد امکانات سایت بدون جاوااسکریپت هم حداقل در سطح پایه کار کنه؛ یعنی بدون اینکه خیلی سخت و حجیم باشه کدنویسیش. ولی خیلی ها این کار رو نمیکنن. مثلا یه منو طراحی میکنن که اگر جاوااسکریپت نباشه هیچ کاری نمیکنه، درحالیکه طراحی اون بصورتی که در هر حالتی کار کنه راحت هست و ضمنا اصولی تر و کاراتر هم میشه (مثلا اگر گزینهء منو بصورت لینک باشه میشه بوکمارکش کرد یا در یک تب دیگه بازش کرد).
اگر بررسی کنید میبینید که بیشتر سایتها و نرم افزارهای معتبر طوری طراحی شدن که بصورت کامل یا حداقل تاحدی که میشه بدون جاوااسکریپت هم کار کنن.

راستی بنده یه ایدهء دیگه درمورد حفظ وضعیت فیلدهای فرم دارم و اون با استفاده از کوکی در سمت کلاینت هست. ویژگی جالبی که این حالت میتونه داشته باشه اینه که حتی اگر کاربر فرم رو سابمیت نکرده رفرش کنه، وضعیت و محتوای فرم حفظ میشه. البته این ویژگی بصورت درونی در فایرفاکس هست ولی در IE 8 که تست کردم خیر.
شاید مزایای دیگری رو هم بشه به چنین روشی نسبت داد.

binyaft
شنبه 22 مرداد 1390, 00:05 صبح
اینکار در کنترل های ASP.NET بصورت خودکار توسط چیزی بنام viewstat انجام میشه.
اینو برای این گفتم که بازم قلب PHP کارها رو بشکنم

دفعه چندمه از این حرکتا میزنی ها :متفکر:
ترول بازی در نیار ما بهت غذا نمیدیم :لبخند:

nimja145
شنبه 22 مرداد 1390, 22:42 عصر
یک سوال دیگه:
چطور میتونم کاری کنم که توسط کد زیر فقط بتونم پشوند خاصی Open بکنم (یعنی وقتی پنجره open باز شد و فایل های پسوند خاص مثلا jpeg نشون بده)


<input type=file />