PDA

View Full Version : مشکل در ساخت اکشن جدید و url آن (حل شد)



desatir7316
پنج شنبه 29 آبان 1393, 19:20 عصر
ویرایش : مثال کار با ajax در yii2 (http://barnamenevis.org/showthread.php?476415-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%DA%A9%D8%B4%D9%86-%D8%AC%D8%AF%DB%8C%D8%AF-%D9%88-url-%D8%A2%D9%86-(%D8%AD%D9%84-%D8%B4%D8%AF)&p=2137080&viewfull=1#post2137080)
------------------------------------------------------------------------------------
سلام دوستان
یه فرم جستجو درست کردم به این شکل


<form id="frmSearch" name="frmSearch" method="POST" action="'. Yii::$app->urlManager->createUrl(['master-category/search']) .'">
...
...


یه اکشن هم درست کردم:


public function actionSearch(){
....
....
}


حالا وقتی فرم رو submit می کنم به این url می ره و پیغام زیر رو میده:


http://localhost/shopcenter/frontend/web/index.php?r=master-category%2Fsearch




Bad Request (#400) Unable to verify your data submission. The above error occurred while the Web server was processing your request.
Please contact us if you think this is a server error. Thank you.



ولی وقتی rul رو دستی درست می کنم به این شکل، دیگه ارور نمی ده اما دیگه layout هم برای لود نمی کنه


http://localhost/shopcenter/frontend/web/index.php?r=master-category/search


پاک گیج شدم

MMSHFE
پنج شنبه 29 آبان 1393, 19:39 عصر
اینو تست کنید ببینید اوکی میشه؟

<form id="frmSearch" name="frmSearch" method="POST" action="'. Yii::$app->urlManager->createUrl('master-category/search') .'">

MMSHFE
پنج شنبه 29 آبان 1393, 19:39 عصر
ضمناً تا جایی که میشه بهتره از dash توی اسم کنترلر استفاده نکنید. اگه برای SEO لازمش دارین بهتره با تنظیم کردن urlManager لینکش رو درست کنید.

desatir7316
پنج شنبه 29 آبان 1393, 20:04 عصر
پیش فرض خودشه dash داره(controllerId هست)
برش می داری خطا می ده

این هم که گفتید گذاشتم همون خطا رو داد
ولی یه چیزی که هست توی هر دو حالت بعد اینکه خطا می ده، توی آدرس بار کلیک می کنم بعد اینتر می زنم دیگه خطا نمی ده
وقتی یه اکشن قبلی هست لود می شه ولی وقتی اکشن جدید هست که درست کردم layout رو لود نمی کنه
وقتی از همین کد توی مثلا url لینک (تگ a) استفاده می کنم این مشکل رو ندارم



Yii::$app->urlManager->createUrl(['master-category/search'])

MMSHFE
پنج شنبه 29 آبان 1393, 20:08 عصر
باید همه چیز رو چک کنید. ببینید اگه CSRF Protection فعاله باید توی لینکتون حتماً Token رو بفرستین.
این لینک رو ببینید:
http://stackoverflow.com/questions/23237377/yii2-curl-bad-request-400

desatir7316
پنج شنبه 29 آبان 1393, 20:17 عصر
من تنظیماتی براش انجام ندادم
کدوم token رو بفرستم
خودش به صورت پیش فرض فعاله؟
ممنون می شم بیشتر راهنمایی کنید
لینک مرجعی چیزی بهم بدین هم ممنون می شم

MMSHFE
پنج شنبه 29 آبان 1393, 20:21 عصر
بله پیشفرض فعاله. توی لینکی که گذاشتم توضیح داده چطور غیرفعال کنید. اگه فرم دستی میسازین باید یک input مخفی بگذارین و CSRF Token رو توی فرم قرار بدین.

desatir7316
پنج شنبه 29 آبان 1393, 20:33 عصر
ممنون درست شد

MMSHFE
پنج شنبه 29 آبان 1393, 20:42 عصر
خواهش میکنم. البته کاربرد دکمه تشکر قشنگ تره.

desatir7316
پنج شنبه 29 آبان 1393, 21:19 عصر
درسته ولی اینجوری نوشتم که دوستانی که می خونن بدونن مشکل حل شده
هرچی عنوان تاپیک رو عوض می کنم حل شد نمی شه

MMSHFE
پنج شنبه 29 آبان 1393, 21:23 عصر
عنوان رو اصلاح کردم.

desatir7316
یک شنبه 02 آذر 1393, 10:13 صبح
سلام
توي يكي ديگه از كنترلر هام يه اكشن ساختم ولي بازم اجازه نمي ده
نمي دونم اصلا چرا اينجوري
اين مشكلات رو توي yii 1 نداشتم
csrf هم false كردم

اينم url ي كه مي خوام از طريقش دسترسي داشته باشم



http://localhost/shopcenter/frontend/web/index.php?r=master-category/addToCardAjax

MMSHFE
یک شنبه 02 آذر 1393, 10:24 صبح
توی اکشنتون AJAX چک شده؟ میخواین دسترسی مستقیم با url داشته باشین؟

desatir7316
یک شنبه 02 آذر 1393, 10:33 صبح
نه چك نشده(طبق كدي كه توي yii 1 توي يكي از پروژه هام داشتم و درست كار كرده بود اينو نوشتم)
مي خواستم دسترسي مستقيم داشته باشم كه اصلا بدونم چه خروجي ميده

MMSHFE
یک شنبه 02 آذر 1393, 10:57 صبح
الان چه خطایی دریافت میکنید؟

desatir7316
یک شنبه 02 آذر 1393, 11:13 صبح
اينه خطاش


Not Found (#404)
Unable to resolve the request: master-category/addtocardajax
The above error occurred while the Web server was processing your request.
Please contact us if you think this is a server error. Thank you.

MMSHFE
یک شنبه 02 آذر 1393, 11:18 صبح
آدرس رو دستی وارد میکنید کار میکنه؟

desatir7316
یک شنبه 02 آذر 1393, 11:23 صبح
كلا آدرس رو دستي وارد كردم اون خطا رو داد، مي خواستم ببينم view چه خروجي ميده
اگه يه مثلا ساده از ajax بهم بديد شبيه همين چيزي كه خودم مي خوام، يعني يه درخواست بره، توي atction روش محاسبات حالا خيلي هم ساده انجام بشه و بعد نتيجه رو برگردونه ممنون مي شم
فك مي كنم مشكل زودتر حل شه
يه چيز اصولي و پايه باشه كه ديگه طبق اون كد بزنم
ممنون

MMSHFE
یک شنبه 02 آذر 1393, 11:43 صبح
راستش Yii2 زیاد کار نکردم. تحقیق میکنم نتیجه رو خبر میدم.

desatir7316
یک شنبه 02 آذر 1393, 12:05 عصر
يه چيز جالب
نمي دونم چرا بايد اينجوري باشه
من يه action ايجاد كردم به اسم test كه كار كرد
حالا اونو تبديل كردم به testA بازم خطا داد
تبديل كردم به test_a و همينجوري هم فراخوانيش كردم كار كرد
عوضش كردم با test_A خطا داد
كلا capital كه توش مياد خطا مي ده :متفکر:

desatir7316
یک شنبه 02 آذر 1393, 12:36 عصر
http://www.yiiframework.com/forum/index.php/topic/28400-casesensitive-bug-in-url-manager/

MMSHFE
یک شنبه 02 آذر 1393, 12:43 عصر
دقت کنید که caseSensitive رو وقتی false میکنید فقط روی رولها اعمال میشه. مثلاً آدرس mysite.com/controller/action با mysite.com/controller/AcTIon یکیه. اما درمورد قوانین نامگذاری اکشنها و کنترلرها و فایلها و پوشه ها و... باید حساسیت رو رعایت کنید چون لینوکس به بزرگی و کوچکی حروف حساسه.

desatir7316
یک شنبه 02 آذر 1393, 12:47 عصر
من كه اصلا دست به caseSensitive نزدم، از اول خودش مقدارش false هست؟
در اون دو موردي كه گفتيد(AcTIon و action) واسه من فرق داره و اجرا نميشه، با اين كه توي ويندوز هم هستم

MMSHFE
یک شنبه 02 آذر 1393, 12:54 عصر
والا هرچی گشتم تو 2 چیزی واسه caseSensitive ندیدم. فکر میکنم پیشفرض فعاله چون توی 1 هم همینطوره یعنی پیشفرضش true هست.

desatir7316
یک شنبه 02 آذر 1393, 18:58 عصر
دوستانی که می خوان با ajax کار کنن می تونن از این استفاده کنن
فرض کنیم یه کنترلر به اسم masterCatgoryController داریم
یه اکشن هم به اسم test
اگه دوستورات js توی یه فایل دیگه بود می تونن اینجوری اونهارو فراخوانی کنن:

$this->registerJsFile(Yii::$app->urlManager->baseUrl. '/../jsAssets/addToCard.js',['position' => \yii\web\View::POS_END]);
توی اکشن همه محاسباتتون رو انجام بدین و بعد:


public function actionTest(){
return $this->renderPartial('test');
}


توی view هم دستوراتمون رو با فرمت json داریم (شما می تونید از هرجی که راحت تر هستید استفاده کنید)


<?php
echo json_encode(['var' => 'value']);


دوستورات js هم برای ارسال اطلاعات و دریافت نتیجه به این صورته (چون اونجا از فرمت json استفاده شده اینجا هم باید این نوع فرمت ذکر بشه):


$(document).ready(function(){
$.ajax ({
type: 'POST',
dataType : 'json',
url: '<?php echo Yii::$app->urlManager->createUrl(['master-category/test']); ?>',
success: function(data){
alert(data['var']);
}
});
});


توی appAsset.php هم توی پوشه assets این رو اضافه کنید که jquery رو در ابتدا فراخوانی کنه(البته اگه آخر باشه معمولا بهتره ولی خوب می هر کاری کردم خودم به مشکل برخوردم)


public $jsOptions = ['position' => \yii\web\View::POS_HEAD,];