Подводный камень в foreach($items as &$item). Описание структуры шаблона com_content Генерирование уникальных ID

См. невольно... Словарь русских синонимов и сходных по смыслу выражений. под. ред. Н. Абрамова, М.: Русские словари, 1999. безотчетно чутьем, сам не сознавая, стихийно, панически, инстинктивно, сам того не сознавая, не отдавая себе отчета,… … Словарь синонимов

Безотчетно, инстинктивно, машинально, стихийно, слепо. См … Словарь синонимов

Непроизвольно, безотчетно, бессознательно, инстинктивно, машинально, механически, слепо, стихийно; нечаянно, неумышленно; волей неволей, хочешь не хочешь (volens nolens), по необходимости Это ему пришлось сделать по не зависящим от него… … Словарь синонимов

Слепо, подсознательно, нутром, сам того не сознавая, сам не сознавая, стихийно, безотчетно, не отдавая себе отчета, бессознательно, механически, несознанно, несознательно, интуитивно, неосознаваемо, шестым чувством, инстинктивно Словарь русских… … Словарь синонимов

См. невольно... Словарь русских синонимов и сходных по смыслу выражений. под. ред. Н. Абрамова, М.: Русские словари, 1999. слепо бессознательно, невольно; неотчетливо, безрассудно, безотчетно, стихийно, инстинктивно, рабски, неосознанно, неясно,… … Словарь синонимов

Нареч. к безотчетный. [Мать] хотела повернуть назад, но безотчетно снова пошла вперед. М. Горький, Мать. [Иудушка] умолил доброго друга маменьку управлять его имением безотчетно. Салтыков Щедрин, Господа Головлевы … Малый академический словарь

БЕЗОТЧЁТНЫЙ, безотчетная, безотчетное; (кратк. мужск. не употр.) безотчетна, безотчетно. 1. Не подчиняющийся никакому контролю, не обязанный отчитываться. Он безотчетно (нареч.) распоряжался в лавке. 2. Не зависящий от разумных соображений,… … Толковый словарь Ушакова

- (греч.). Лицо, которому доверено торговать безотчетно, за счет другого лица. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910. АНАГАЛИСТ Лицо, которому доверено торговать за счет другого лица безотчетно. Объяснение… … Словарь иностранных слов русского языка

Безотчетно, бессознательно, механично, непроизвольно, автоматично, машинально, автоматом, механически, автопилотом Словарь русских синонимов. автоматически см. машинально Словарь синонимов русского языка. Практический справочник. М.: Русск … Словарь синонимов

См. невольно... Словарь русских синонимов и сходных по смыслу выражений. под. ред. Н. Абрамова, М.: Русские словари, 1999. инстинктивно бессознательно, невольно; непроизвольно, неосознанно, нутром, спонтанно, стихийно, несознательно, слепо,… … Словарь синонимов

Книги

  • Путешествие по Чехословакии , Й. Марко, М. Петерка. Прага, 1959 год. Артия. С множеством фотоиллюстраций. Издательский переплет. Сохранность хорошая.…
  • Доска, или Встречи на Сенной , Геннадий Григорьев, Сергей Носов. Есть в Петербурге места просто фантасмогенные. К ним относится Сенная площадь. "Сенная - колыбель…

Занимаетесь созданием и продвижением сайта под управлением CMS Joomla и у Вас вдруг возникла необходимость переделать на свой вкус и лад оформление материала путем редактирования стандартных шаблонов компонента com_content ? Компонент отвечает за формирование контента. Давайте разберемся в структуре самого компонента.

Расположение стандартного шаблона материалов

Оригинальные файлы компонента com_content находятся в папке components\com_content\views\Представление\tmpl. Если файлы компонента скопировать в каталог \templates\Вами используемый шаблон\html\com_content\, то шаблон материалов будет браться из файлов этой папки.

Каталоги и файлы шаблона

В директории расположения шаблона находятся пять папок для формирования представлений.

папка archive

  • Папка шаблон вывода архива. В данной статье не рассматривается, редко кто им пользуется. Структура аналогична нижеописанным папкам;

папка article - Материал

папка frontpage - Главная страница

  • default.php Такой же принцип, как и у category\blog.php;
  • default_item.php Такой же принцип, как и у category\blog_item.php;
  • default_links.php Такой же принцип, как и у category\blog_links.php;

папка section - Раздел

  • blog.php Шаблон блога раздела. Такой же принцип, как и у category\blog.php;
  • blog_item.php Шаблон отдельного материала из блога раздела. Такой же принцип, как и у category\blog_item.php;
  • blog_links.php Шаблон представления ссылок под блогом раздела. Такой же принцип, как и у category\blog_links.php;
  • default.php Стандартный шаблон раздела. Отображает заголовок категории, ее описание, количество элементов. После клика на заголовок категории страница обрабатывается category\default.php;

Пример редактирования шаблона. Отображение количества просмотров материала.

Допустим, мы хотим вывести количество хитов отдельного материала из блога категории. Для этого редактируем шаблон category\blog_item.php. Код для вставки информации о хитах будет таким:

item->hits ?>

Теперь нужно найти в файле шаблона category\blog_item.php место, где этот код вставить. Например перед отображением даты последнего редактирования материала. Ищем строку:

item->modified) !=0 && $this->item->params->get("show_modify_date")) : ?>

И перед ней вставляем строку с кодом.

Пример вывода списка категорий в несколько колонок .

Многие любят писать такие конструкции в том или ином виде, каждый сталкивался:
foreach ($items as &$item) { $item += 2; }
Но не многие подозревают о том, какая опасность тут скрывается.
Рассмотрим пример.

Вася Пупкин взял массив, прошелся по нему, увеличив на два все элементы:
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items as &$item) { $item += 2; } print_r($items);
Посмотрел дамп, увидел что задача решена, и ушел довольный:
Array ([a] => 12 [b] => 22 [c] => 32)
Спустя некоторое время, Петрович решил дополнить этот участок кода другим перебором, дописав ниже:
$newitems = array("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems as $key=>$item) { $newitems[$key] += 5; } print_r($newitems);
Посмотрел, что его задача тоже решена, и с чувством выполненного долга закрыл файл:
Array ([a] => 15 [b] => 25 [c] => 35)
Спустя какое-то время, стали вылезать необъяснимые баги. Почему?
Сделаем в конце кода var_dump($items):
array(3) { ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) }
30! Вася Пупкин клянётся, что проверял. Почему было 32, а после кода Петровича 30?

Причина кроется в амперсанде. Он сообщает, что на отмеченные данные ссылается кто-то ещё. Уходя, Вася не подтёр за собой временную переменную, которую использовал для перебора ($item). Переменная использовалась с разрешением на изменение источника ("&"), которое также называют «присваиванием по ссылке». Он был уверен, что переменная будет использоваться только внутри цикла. Петрович, используя переменную с таким же именем, в ходе своего перебора, менял её значение, и каждый раз менялось то место, где эта переменная хранилась. А хранилась она там же, где последний элемент массива Пупкина.

Конечно, в случай в статье утрирован. На практике такие связи могут быть очень сложными, особенно если проект недорогой, и в нём участвуют недостаточно опытные и разрозненные веб-разработчики.

Как можно с этим оброться?

  • Уничтожать временные переменные после использования, особенно если они имеют какие-то связи с используемыми данными:
    foreach ($items as &$item) $item += 2; unset($item);
  • Быть осторожнее с переменными, которые уже кем-то использовались.
  • Инкапсулировать свои действия в отдельные функции, методы или пространства имён.
  • Использовать var_dump, вместо print_r, и обращать внимание на амперсанд. Чтобы дампить в файл, а не в браузер, альтернативой print_r($var,true) будет такая конструкция:
    function dump() { ob_start(); foreach(func_get_args() as $var) var_dump($var); return ob_get_clean(); }
В заключение скажу, что баги, связанные со ссылками, могут быть не только в foreach. И все они когда-то обсуждались. Однако, этот случай, судя по моему опыту, так распространён на практике, что заслуживает отдельного внимания.