Drupal Ajax: تمرير القيم بواسطة URL vs Data Param
-
23-09-2019 - |
سؤال
ما هو الفرق بين استخدام:
$.ajax({
type: 'POST',
url: Drupal.settings.basePath + 'module/get/' + node,
dataType: 'json',
data: { 'ajax' : true }
});
مقابل:
$.ajax({
type: 'POST',
url: Drupal.settings.basePath + 'module/get',
dataType: 'json',
data: { 'ajax' : true, 'node' : node }
});
في الحالة الأولى ، يمكنك الوصول إلى متغير العقدة كمعلمة في وظيفة رد الاتصال وفي الحالة الثانية التي يمكنك الوصول إليها باستخدام $ _post ['node'] أليس كذلك؟ ألن تكون الطريقة الثانية دائمًا أفضل ، لكني أرى الكثير من الناس يفعلون ذلك بالطريقة الأولى. لا يعني أن الطريقة الثانية آمنة أيضًا. لا تزال تبحث في الرموز النموذجية ، ولكن محاولة معرفة هذا الشيء الأساسي أولاً.
أتساءل أيضًا عن الحالة 1 ، على افتراض أن هذا Ajax يتم تشغيله بواسطة زر ، كيف تمنع شخص من الدخول مباشرة إلى عنوان URL ، mysite/module/get/20 وتفعيله؟ هل ببساطة التحقق من ذلك $ _post ['ajax'] == صحيح هل تفعل ذلك؟ أم أنه لا يزال هناك ثقب أمني هناك؟
المحلول
لا يوجد فرق حقيقي من النظرة الأولى:
على افتراض أن متغير "العقدة" الخاص بك هو مجرد معرف عقدة ، لا يوجد فرق كبير بين الاثنين. من الناحية الدلالية ، يبدو أن كلاهما يؤدي عملية "الحصول على" (على الرغم من أنهما تم نشرهم تقنيًا) ، حيث يسترجعان البيانات فقط دون تغيير أي حالة على الخادم (حسنًا ، هذا افتراض آخر).
من الحكمة الأمنية ، لا يوجد اختلاف ذي صلة أيضًا - يمكن أن يكون كلاهما "مزورًا" بسهولة ، ويغتل الفرق في نفس الشيء كما هو الحال مع "Get Of Post Standard" ، أي لا يوجد فرق إلا أن الأول يعرض المعلمات أ Wee أكثر قليلاً "يمكن الوصول إليها" للمراقب غير الرسمي ، لأنها في مرأى من عنوان URL.
لكن اختلاف "الراحة" داخل دروبال:
داخل دروبال ، غالبًا ما يتم مواجهة الإصدار الأول لأنه يمكن أن يستفيد من حجج اللودر البرية الوظيفة (التي تم تقديمها في دروبال 6). دعنا نقول أن عنوان URL لاستدعاءك محدد في Hook_Menu مثل ذلك:
$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);
مع هذا، yourModule_callback()
سيتم استدعاؤه مع المعلمة الأولى لها بالفعل هو Obect العقدة المحملة بالكامل للمرور في NID ، مثل %node
يخبر دروبال بتنفيذ أ node_load()
على المعلمة قبل تسليمها إلى وظيفة رد الاتصال. باستخدام الإصدار الثاني من مثالك ، يجب على وظيفة رد الاتصال تحميل كائن العقدة نفسه ، بعد استخراجه من بيانات المنشور.
لذلك شيء من الراحة هنا.
بالإضافة إلى ذلك ، فإن النمط الشائع داخل Drupal هو استخدام عنوان URL للاتصال نفسه لطلب AJAX كما هو الحال بالنسبة إلى بديل JavaScript 'Fackback'. اذن متى yourModule_callback()
يتم استدعاؤه ، يمكن أن يفعل كل ما هو المقصود مع تمريره في العقدة أولاً ، وتجميع نتائجها بشكل أساسي. بعد ذلك ، يتحقق فقط $ajax == TRUE
ضمن بيانات البريد. إذا كان هناك ، فهذا يعلم أن النتيجة مخصصة لطلب AJAX ، لذلك قد يخرج النتيجة كـ JSON. إذا لم يكن هناك ، فهذا يعلم أن دورة الصفحة الكاملة مستمرة ، ويمكنها ضبط إخراجها وفقًا لذلك (على سبيل المثال إعادة بناء نموذج ، وتجديد صفحة كاملة ، أيا كان ...).
وبهذه الطريقة ، ليس عليك تسجيل عناوين URL منفصلة لاتخاذ عمليات الاسترداد غير AJAX/AJAX.