قم بإنشاء Object_action جديد في مولد مسؤول Symfony 1.4
-
23-09-2019 - |
سؤال
أنا أستخدم مولد مسؤول 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
الحدث ، من التمثيل المسبق للوحدة النمطية على سبيل المثال ، وإلى وظيفتك هناك :-)