it-swarm-id.com

Cara mendapatkan parameter menu dan itemid di pengontrol komponen

Dalam pengontrol komponen khusus saya, saya memiliki fungsi save (). Pada akhirnya ini menampilkan pesan dan mengalihkan ke url

$this->setMessage(JText::_('SOME_TEXT'));
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo', false));

Saya mengalami masalah untuk melakukan hal berikut:

1.Gunakan parameter menu dari bidang khusus alih-alih string JText. Jika saya menggunakan fungsi ini:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$message = $active->params->get('message');

Saya mendapat pemberitahuan & kesalahan:

Notice: Trying to get property of non-object...
Fatal error: Call to a member function get() on a non-object...

$ message adalah nama bidang menu kustom saya yang didefinisikan dalam file xml. Jika saya menyebutnya langsung dari pandangan, maka tidak apa-apa.

2. Dapatkan itemid menu aktif dan gunakan di dalam setRedirect ().

Saya mendapatkan itemid kosong di URL jika saya menggunakannya seperti ini:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo&Itemid='.$itemId, false));

Saya telah menemukan banyak informasi tentang memanggil parameter menu dalam komponen tetapi tidak ada yang membantu saya

7
weezle

Setelah beberapa pengujian, saya dapat meniru masalah ini:

** Formulir mengalihkan ke tampilan tanpa item menu atau mengalihkan ke dirinya sendiri relatif ke url seperti ini:

komponen/mycomponent/myview

(Tidak masalah apakah tampilan memiliki item menu atau tidak, ini hanya routing Joomla yang bodoh.) **

Karena itu, hal-hal berikut harus dilakukan untuk mencegah kesalahan:

1) tampilan harus ditautkan dengan item menu di backend Joomla

2) url ke form di frontend seharusnya/menu-alias

3) bentuk tindakan tidak boleh mengarahkan ke tampilan lain, lebih baik kosong

4) formulir harus berisi input tersembunyi dengan tugas

Kemudian pos Anda dan simpan pengalihan di controller berfungsi seperti mantra, karena Anda beroperasi dalam konteks item menu (url).

Tetapi, jika Anda mengalihkan ke tampilan lain atau melalui JRoute ke tampilan yang sama tanpa menyimpan id item saat ini, Anda akan meninggalkan konteks item menu ("komponen/mycomponent/myview").

Ini sering terjadi di Joomla, karena sistem router saat ini tidak memeriksa url yang diberikan terhadap item menu dalam database. Untuk mencegahnya, Anda dapat melakukan tindakan berikut:

1) Perluas router komponen Anda dengan fungsi yang mencari tabel item menu untuk url saat ini dan mengembalikan id item/item menu. (Saya sudah melakukan itu di masa lalu dan itu berhasil.)

2) Tambahkan bidang tersembunyi di formulir Anda yang berisi id item, tugas dan tampilan target (cara yang benar di Joomla untuk merutekan).

3) Redirect url seperti "komponen/mycomponent/myview" ke jalur url yang benar.

4) Anda dapat mengatur fallback dalam param komponen untuk setiap tampilan. Ini akan mem-rantai id item ke params komponen dan bukan tampilan ke jalur url. View1 -> Dropdown -> Pilih Item Menu Dirantai

Dalam controller:

$ itemId = $ params-> get ($ mycurrentviewname);

Jangan gunakan $ menu-> getActive () jika tidak benar-benar diperlukan, karena sistem routing Joomla yang bodoh. Saya merekomendasikan untuk mengatur item menu secara manual entah bagaimana.

Kembali ke pertanyaan:

Bagaimana saya katakan, kesalahan Anda ada di suatu tempat di awal routing. Ini bisa berupa url Anda yang mengarah ke formulir Anda atau redirect setelah mengirimkan formulir ke tampilan tanpa item menu atau ke url yang tidak mengandung itemId.

Bukti:

Tambahkan ini ke fungsi simpan Anda antara $ itemid dan $ message:

if(empty($itemId)){

      $itemId = $app->input->get('Itemid', $itemId,'int');
      $active = $menu->getItem($itemId);
 }

Kemudian tambahkan "& task = save & Itemid = 101" ke url yang mengembalikan pesan kesalahan Anda. (Ubah 101 ke id item Anda!)

Anda harus dialihkan dengan benar sekarang.

2
Dennis Heiden

Gunakan yang berikut ini:

$menu           =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->id;

atau

$menu =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->query['Itemid'];

Untuk menyampaikan pesan Anda, Anda perlu mengambilnya dari input aplikasi

$JInput = JFactory::getApplication()->input;
$message = $JInput->get('message','','string');
2
Terry Carter

Untuk mendapatkan Menu Params

Yang ini sempurna saya mencari beberapa jam dan ini memecahkan masalah saya tentang Joomla 3.6.5 & PHP 7.1

0: Menggunakan $ this saat tidak dalam konteks objek

Solusi:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$menuparams         = $menu->getParams($itemId);
1
RadiusTheme