Хук content_TK_before_list плюс Шаблон default_list.tpl.php

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

Не доходят данные из хука в шаблон

#1 5 апреля 2022 в 15:00

Добрый день.
ICMS 2.15.1
Хук — content_TK_before_list 
Шаблон — default_list.tpl.php

Попытка перебрать элементы в хуке

  1. class onContentContentTkBeforeList extends cmsAction {
  2.  
  3. public function run($data){
  4.  
  5. list($ctype, $items) = $data;
  6.  
  7. foreach($items as $item){
  8. $item['new_bind'] = 8888888;
  9. print_r($item);
  10. }
  11. $items['new_bind_msg'] = 55555;

и вывести их в шаблоне заканчивается вот так

  1. // Из хуковского принта внутри дампа выводятся $item['new_bind'] = 8888888;
  2.  
  3. <div data-test-hook="<?php print_r($items); ?>"></div> // Не выводятся внутри дампа $item['new_bind'] = 8888888;
  4.  
  5. <?php foreach($items as $item){ ?>
  6.  
  7. <div data-cookie-chats="<?php print_r($items['new_bind_msg']); ?>" // Выводится 55555

не могу объяснить такое противоречивое поведение.
Прошу помощи у знатоков!

Как добиться того чтобы в шаблоне выводилась переменная  $item['new_bind'] 

#2 5 апреля 2022 в 15:18

 wir, покажите весь код. Пока ключевые моменты

В переборе должно быть так

  1. foreach($items as $key => $item){
  2. .....
  3. $items[$key]['new_bind'] = ...

и в конце хука надо возвращать не data, a

  1. return [$ctype, $items];
#3 5 апреля 2022 в 15:32

Запустите вот это

  1. <?php
  2. $items = [
  3. "a" => "aaa",
  4. "b" => "bbb",
  5. "c" => "ccc"
  6. ];
  7.  
  8. foreach($items as $item){
  9. $item['new_bind'] = 8888888;
  10. print_r($item);
  11. }

Получите

PHP Warning:  Illegal string offset 'new_bind' in /home/yozh/php-apps/trial/cycle/for.php on line 9
8aaPHP Warning:  Illegal string offset 'new_bind' in /home/yozh/php-apps/trial/cycle/for.php on line 9
8bbPHP Warning:  Illegal string offset 'new_bind' in /home/yozh/php-apps/trial/cycle/for.php on line 9
8cc

Ничего странного. 

Как добиться того чтобы в шаблоне выводилась переменная  $item['new_bind'] 

wir

Нужно корректно добавить ее в массив.

#4 5 апреля 2022 в 16:17

 wir, покажите весь код. Пока ключевые моменты

В переборе должно быть так

  1. foreach($items as $key => $item){
  2. .....
  3. $items[$key]['new_bind'] = ...

и в конце хука надо возвращать не data, a

  1. return [$ctype, $items];
Zau4man

Собственно пока это весь код (модель).
Все начиналось с 

  1. Notice: Undefined index: new_bind in

Спасибо Zau4man и IamB вывели из ступора.
Посмотрел в учебнике
«Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. В этом случае значение будет присвоено по ссылке.».
Вот рабочее решение:

  1. foreach($items as &$item){
  2. $item['new_bind_msg'] = 8888888;
  3. }
  4. unset($item); // разорвать ссылку на последний элемент
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.