سؤال

أنا أستخدم مولد مسؤول Symfony 1.4/عقيدة.

هناك قائمة بالأسئلة وأود أن أتمكن من إجراء كائن مخصص على كل منها.

ما أبحث عنه هو تقليد _delete كائن إجراء ولكن القيام ببعض الحسابات قبل ذلك.

لذلك قمت بإنشاء إجراء جديد:

  public function executeListDeleteAndRecalculate(sfWebrequest $request)
  {
    // Do the calculation

    // Then delete the question
  }

وأضيفه إلى مولد الخاص بي.

object_actions:
    delete_and_recalculate: ~

يظهر الإجراء الجديد في مولد المسؤول ولكن الجزء الحذف لا يعمل.

حاولت مجموعة من الأشياء لجعلها تعمل:

  • بمجرد إجراء كل عملية الحساب ، حاولت أولاً إعادة توجيه إلى questionActions/delete عمل.
  • حاولت أيضًا نسخ executeDelete رمز إلى عملي الجديد.

لكن في كل مرة أحصل فيها على سيئة السمعة

500 | خطأ الخادم الداخلي | sfvalidatorerRorschema _csrf_token [مطلوب.

لذلك أعتقد أن Symfony تقوم ببعض السحر قبل حذف كائن فعليًا.

هل تعرف ما أفتقده و ما هي أفضل طريقة لتنفيذ نوع من الإجراءات الحذف؟

تعديل:

بالطبع إذا قمت بإزالة $request->checkCSRFProtection(); كل شيء يعمل بشكل جيد. لكنني أفترض أنه من المهم جدًا ، لذا أود العثور على حل أجمل.

هل كانت مفيدة؟

المحلول

هذا لأن ال delete يستخدم الرابط من مولد المسؤول رمزًا لمنع هجمات CSRF.

في الأساس ، يضع رمزًا في جلستك وإلى حقل مخفي من النموذج ، ثم يتحقق من أحدهم مقابل آخر بناءً على الطلب. هذا ممكن لأن ال delete الرابط في مولد المسؤول هو في الواقع نموذج (تم إنشاؤه javaScript) (يتم القيام بذلك لإضافة أ sf_method مجال مخفي لمحاكاة سلوك الراحة).

لمزيد من المعلومات حول كيفية عمل CSRF ويمكن منعه ، يمكنك القراءة أكثر على ويكيبيديا: http://en.wikipedia.org/wiki/cross-site_request_forgery

ما يمكنك فعله هو استخدام نفس النوع من الرابط ، عليك فقط تمرير أ method المعلمة ل link_to لكي ينشئ نموذجًا ، إلقاء نظرة على lib/generator/sfModelGeneratorHelper.class.php الخط 32 لمعرفة كيف يتم ذلك في العام.

ثم تنفذ $request->checkCSRFProtection() في الخاص بك executeDeleteAndRecalculate الطريقة ، وتابع ما تريد القيام به ، بما في ذلك حذف الكائن باليد.

لإنشاء الرابط بشكل صحيح ، يمكنك إضافة ملف linkToDeleteAndRecalculate الطريقة في فئة المساعد من الوحدة النمطية (التي يجب أن تكمن في lib/${YourModule}GeneratorHelper.class.php ملف دليل الوحدة النمطية) وأضف الكود التالي (تم التقاطه مباشرة وتكييفه من sfModelGeneratorHelper):

public function linkToDeleteAndRecalculate($object, $params)
{
  if ($object->isNew())
  {
    return '';
  }

  return '<li class="sf_admin_action_delete">'.link_to(__($params['label'], array(), 'sf_admin'), 'delete_and_recalculate', $object, array('method' => 'delete', 'confirm' => !empty($params['confirm']) ? __($params['confirm'], array(), 'sf_admin') : $params['confirm'])).'</li>';
}

يرجى ملاحظة أنه يجب عليك تغيير المسار (لقد وضعت delete_and_recalculate بشكل افتراضي ولكن قد ترغب في بادئة اسم الوحدة النمطية) من link_to يتصل.

يمكنك بعد ذلك استخدام الخاص بك delete_and_recalculate تقريبا مثل طريقة مصممة من مولد المسؤول (وقم بتمرير ملصق من generator.yml علي سبيل المثال)

الآن كان هذا هو الطريق الصعب.

الطريقة السهلة هي الاشتراك في admin.delete_object الحدث ، من التمثيل المسبق للوحدة النمطية على سبيل المثال ، وإلى وظيفتك هناك :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top