হুক_ফর্ম_ল্টারে "আনড" এর জন্য ভাষা কীর জন্য সেরা অনুশীলন


30

আমি আমার কাস্টম মডিউলটিতে একটি ফর্ম পরিবর্তন করছি। কোডটি দেখে মনে হচ্ছে:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

তবে আমি মনে করি হার্ড কোডিংটি undখারাপ। এক্ষেত্রে ফর্ম ক্ষেত্রগুলি সঠিকভাবে সংশোধন করার উপযুক্ত উপায় কী হওয়া উচিত?


এই মন্তব্যটি দীর্ঘসময় আগে জিজ্ঞাসা করা হওয়ায় সম্ভবত এটি অপ্রাসঙ্গিক। foreachলুপ ব্যবহার করে এটি ব্যবহার করার একটি সহজ উপায় । যদি এটি কেবল LANGUAGE_NONE হয় তবে এটি একক রান। ফর্ম_ল্টার অর্থে, ফর্মটি যে ভাষাতেই থাকুক না কেন প্রযুক্তিগতভাবে এটি পরিবর্তন করতে হবে।
আইশক

উত্তর:


40

দুর্ভাগ্যক্রমে, আপনার স্ব-উত্তরটি এতটা সর্বজনীন নয়। মাঠের ভাষা এবং নোডের ভাষা একই জিনিস নয়।
আপনি যদি ফিল্ড ট্রান্সলেশন এপিআই ব্যবহার করেন (উদাহরণস্বরূপ সত্তা অনুবাদ ) তবে ক্ষেত্রের ভাষা প্রয়োজন । আপনি যখন এটি ব্যবহার শুরু করেন, কিছু ক্ষেত্র অনুবাদযোগ্য রূপান্তরিত হয়।

অনুবাদযোগ্য ক্ষেত্রগুলির ভাষা কোড রয়েছে, যা সত্যই অর্থবোধ করে। তবে ক্ষেত্রটি অনুবাদযোগ্য না হলে ভাষা কোডটি সর্বদা থাকবে (এবং সমস্ত সামগ্রীর ধরণের জন্য, সত্তা, ইত্যাদি) - LANGUAGE_NONE(ধ্রুবকটি ব্যবহার করা ভাল LANGUAGE_NONEএবং স্ট্রিংটি নয় 'und')।
সুতরাং আপনার সমাধানের সাহায্যে নোড রাশিয়ান হয়ে গেলে আপনি কোনও পরিস্থিতি পেতে পারেন তবে নোডের একটি ক্ষেত্র ব্যবহার করে LANGUAGE_NONE
সুখের সাথে, ক্ষেত্রগুলি '#language'কী সহ ফর্মের সাথে সংযুক্ত থাকে, যাতে সর্বদা সঠিক ভাষার কোড থাকে।

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

আপনার যদি সংযুক্ত ফর্মটিতে অ্যাক্সেস না থাকে তবে ফিল্ড ল্যাঙ্গুয়েজ এপিআই ফাংশন দরকারী হতে পারে।


4
এটি এই থ্রেডের একমাত্র সঠিক উত্তর।
বোজন জিভানোভিচ

নোড / সামগ্রী-ধরণের চিত্র ক্ষেত্রের পথটি পুনরুদ্ধার করার সময়ও এই পদ্ধতিটি ব্যবহার করা যেতে পারে। ধন্যবাদ
জয়রাম আর

10

আপনি যদি সত্তার ধরন এবং বান্ডেলটি জানেন তবে নীচের কোডের মতো কিছু ব্যবহার করুন, যা ক্ষেত্র_ভাষা () বলে

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

এটি সঠিক ভাষাটি বের করবে এবং বহুভাষিক সাইটে কাজ করবে।

এছাড়াও কটাক্ষপাত আছে field_get_items ()


এটি API উপায় হিসাবে সঠিক।
নিকিত

নোড তৈরি না হলে কী হবে?
আগা

@ নিকিত আমি নিশ্চিত নই, কারণ প্রদর্শনের ভাষা এবং ফর্মের ভাষা এক নয়। লেখক কিছু ফর্ম পরিবর্তন করে এবং এটি নতুন নোড তৈরি করার জন্য বা বিদ্যমান নোডের নতুন অনুবাদ যুক্ত করার জন্য ফর্ম হতে পারে।
কালব্রো

@ ক্যালাব্রো - প্রদর্শন ভাষা এবং ফর্ম ভাষা - বর্তমান প্রসঙ্গে একই।
নিকিত

4

পুরো undচুক্তিটি ড্রুপাল 7-এ আরও বিরক্তিকর জিনিসগুলির মধ্যে একটি যা বাস্তবে এটি যেমন ডিজাইন করা হয়েছিল তেমন কাজ করে না।

যাইহোক আপনি array_keysএই জাতীয় ভাষা ব্যবহার করে প্রথম ভাষা পেতে পারেন :

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

যে সব সময় কাজ করা উচিত।


আপনার উত্তরের জন্য ধন্যবাদ. আমি অন্য উত্তরে এই সমস্যাটি সমাধান করার জন্য আমি কী করেছি তা আটক করছি। :)
শফিউল

আমি কি ফর্ম_ স্টেটে একই ক্ষেত্রের মান অ্যাক্সেসের জন্য $ ল্যাংস ব্যবহার করতে পারি?
আগা

এটি কি নিরাপদ? আপনি কি নিশ্চিত যে ল্যাংস [0] সর্বদা সঠিক অ্যারে আইটেম?
ছদ্মবেশী

0

(কাউকে সাহায্য করার ক্ষেত্রে আমার নিজের প্রশ্নের উত্তর দেওয়া The উত্তরটি আমার পক্ষে কাজ করেছে))

ভাষাটি পেতে আমি নিম্নলিখিত লাইনটি লিখতে পারি:

$lang = $form['language']['#value'];    //  Instead of "und"

5

0

পুনঃ কলাব্রোর উত্তর

তার কোডটি আমার পক্ষে কার্যকর হয়নি - আমার কোডটি কিছুটা আলাদা

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ ল্যাং] [0] "ইউ" ফিরিয়েছে তবে [$ ল্যাং] এর সম্পূর্ণ মান "আনড" হয় এবং আমারও '[মান'] প্রয়োজন হয় না, কারণ $ ফর্ম ['ফিল্ডনেম'] ['# ভাষা' ] অ্যারে ছিল না, এটি একটি স্ট্রিং ছিল।


1
'আন' এর 0 তম চরিত্রটি 'ইউ' u আপনি ছোট ছোট ছোট প্যাসেজগুলির সমস্ত গোলকধাঁধায় রয়েছেন, সমস্ত অ্যারে।
ক্রিস বার্গেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.