Багряный edit catalog php. Правильный редактор для PHP. И вот оно

Иногда очень сильно не хватает какого-то хорошего редактора для PHP именно с точки зрения комфортной работы с кодом, что-то посерьезней, чем простая подсветка синтаксиса. При этом обычных редакторов пруд пруди, в которых, к сожалению, та же подсветка синтаксиса далеко не всегда корректно работает.

Хочется иметь нормальную реализацию IntelliSense, а не «деревянную» пародию на него в виде заранее определенного списка методов и констант языка, «вываливающегося» во время работы по поводу и без повода в виде полного списка. IntelliSense обязательно должен «знать» о всех используемыми вами классах, о их методах и переменных, то есть подключил через #include файл с определением своего класса, и редактор сразу же его подхватывает, подсказывая информацию о всех «внутренностях» объектов этого класса.

Не помешали бы так же подсказки во время набора названия функции в виде краткого описания функции (принимаемые параметры, есть ли перегруженные функции и т.п.). Особенно этого не хватает для самописных функций, в некоторых типичных редакторах я видел такие подсказки, но только для родных функций PHP. Ах да, еще очень удобно быстро переходить к определению функции из места ее вызова. Вообще, много чего еще хочется, причем все эти возможности считаю лишь толикой самых необходимых вещей в процессе кодинга и никак не излишеством…

Можно сказать, что в этом смысле моим идеалом является связка MS Visual Studio + Visual Assist , которую я использую при работе с C# и C++ (Visual Assist в этой связке просто как спасательный круг). Когда лишний раз не лезешь в другие файлы, чтобы посмотреть принимаемые параметры функции или названия тех или иных членов класса, это в любом случае способствует производительности и «приятности» процесса. Отсутствие среди своего инструментария такого редактора очень удручает, учитывая все большую (от версии к версии) объектно-ориентированность PHP.

И вот оно!

Все же нашел для себя достаточно неплохой редактор — . Если вы, как я, пользовались обычными редакторами, заменяющими стандартный «блокнот» и тоже жаждали человеческого IntelliSense, советую обязательно попробовать его. Он ко всему еще и бесплатный (о платной версии ниже) и работает на базе мозиловского фреймворка (XPFE), что делает его так же мультиплатформенным.

Этот редактор не идеал, в нем много хорошего, при этом, конечно же, ему есть куда еще развиваться. Но, в целом, в первые дни знакомства с ним у меня не было предела радости 🙂

Стоит так же отметить поддержку и других языков (Perl, Python, Ruby, Tcl), а так же JavaScript, CSS, HTML, XML и много другого (судя по списку файлов, которые он может открыть, он знает еще много языков и технологий, но не уверен насчет работы IntelliSense для них всех). Приятно удивила поддержка многих популярных фрейворков для JavaScript (для это было кстати).

Я наверняка еще не успел изучить весь функционал Komodo Edit, но некоторые моменты хотел бы описать.

Первым делом я настроил под себя цветовую схему подсветки кода для PHP (Edit -> Preferences… -> Fonts and Colors ), так как привык уже к цветам из .

Так же полезным дополнением оказался плагин , который находит все TODO в открытом проекте или файле и выводит их в один список (на подобие того, как это реализовано в VS). И плагин, позволяющий видеть в виде одного списка все классы и методы, определенные в открытом файле () для быстрой навигации по ним.

Вообще перед использованием Komodo имеет смысл изучить его настройки, изменив те или иные параметры под себя. Я, к примеру, еще переопределил горячую клавишу для перехода к определению функций (сделал F12, как в Visual Studio 🙂).

В целом все работает достаточно хорошо, «земля и небо» по сравнению с кодингом в обычном редакторе.

Немного неудобно, что для полноценной поддержки IntelliSense обязательно нужно создавать файл проекта (его нужно просто сохранить в корневой каталог сайта). То есть если открыть один файл вне рамок проекта Komodo, все инклуды, прописанные в нем, не будут обрабатываться как-либо, и, соответственно, Komodo не будет ничего знать о функциях и классах, определенных в подключаемых файлах. Но, в целом, это маленькое неудобство пережить можно 🙂

С другой стороны, создание файла проекта дает возможность выполнить более тонкие настройки проекта, которые сохраняются и при каждом открытии проекта, Komodo будет помнить о них. Через него, к примеру, можно указать дополнительные директории для того, чтобы Komodo при работе с вашим проектом все время имел ввиду структуру классов и методов (для IntelliSense и различных подсказок), реализованных в файлах, которые лежат в подключаемой директории, даже если эти файлы ни как фактически не подключены (через include или require) к редактируемому файлу. Еще можно производить поиск или замену текста во всех файлах проекта. Так же, Komodo запоминает сделанные вами закладки внутри кода (Ctrl+F2 ) для каждого файла, это очень удобно.

Немного неприятно удивило, что Komodo Edit ничего не знает о встроенных в PHP классах (может, я делаю что-то не так?). К примеру, если нужно использовать класс mysqli:

$mysqli = new mysqli(HOST, USER, PASS, MBASE); if (mysqli_connect_errno()) { print "Connect failed: ".mysqli_connect_error(); exit(); } $mysqli->query("INSERT......."); $mysqli->close();

Когда после написания слова «$mysqli» я начинаю обращаться к методам этого объекта (пишу знак «->»), Komodo Edit не хочет подсказывать ничего о методах query, close и т.д., а в строке состояния ругается, что, мол, в глаза не видел определения этого класса… При этом со встроенными в PHP функциями проблем нет, к примеру, о семействе функций mysqli_* (оберткой над которыми и является класс mysqli) Komodo прекрасно знает. Но, надеюсь, эту недоработку когда-нибудь поправят. Если же вы, к примеру, работаете с базой через свой класс — обертку (или через что-то вроде PEAR), то проблем с IntelliSense не должно возникать.

Один раз у меня случилось так, что при редактировании js файла Komodo не понял, какой Java Script фреймворк я использую. Но это, к счастью, всегда можно поправить в его настройках (Edit -> Preferences… -> Code Intelligence ).

Существует платная версия Komodo, называемая Komodo IDE . Как я понял, основное отличие от Komodo Edit в функциях, свойственных многим IDE . Комодо IDE имеет встроенные инструменты для работы с системой управления версиями (SVN) и отладчик кода.

Кстати, в Komodo Edit все же есть примитивный отладчик, который на ходу уведомляет о таких мелких ошибках, как забытая точка с запятой в конце строки, незакрытая скобка и т.п. Такие ошибки он подчеркивает красной волнистой линией. Для того, чтобы такая отладка работала, нужно в настройках программы указать путь к исполняемому файлу PHP и php.ini (Edit -> Preferences… -> Languages -> PHP ).

Как видно, подобные настройки можно проделать и для всех остальных языков.

Послесловие

Komodo Edit теперь мой повседневный инструмент 🙂 Плюс, для коротких правок каких-то мелочей в эпизодических случаях я продолжаю использовать аналог продвинутого блокнота — Notepad++, то есть использую его по своему настоящему назначению.

До Komodo Edit я еще пробовал интересный плагин к Visual Studio, который называется VS.Php . Он встраивается в Visual Studio и позволяет работать с PHP так же, как, к примеру, с C# (можно отлаживать код, работает IntelliSense и т.п.). Но как-то он не особо впечатлил, особенно на фоне своей платности. К тому же, как я понял, работая в нем можно полностью забыть про поддержку Java Script и т.п. Интересно еще то, что в нем точно так же, как в Komodo, не работает IntelliSense для классов, встроенных в PHP. Так же этот VS.Php конфликтует с Visual Assist.

Есть еще два подобных редактора, о которых я слышал, но как-то не случилось их попробовать (дальше лишь ИМХО и догадки на основе «слухов»):

  • Zend Studio – платный, по отзывам сложилось впечатление, что это нечто громоздкое и применимо в первую очередь ну в очень больших и сложных проектах, особенно он уместен, возможно, если проект создается на основе Zend Framework.
  • Eclipse – бесплатный, но отпугнул, скорее всего, своей «накрученностью». Как я понял, его еще нужно уметь собрать под себя из различных модулей. В общем, как-то не возникло желания разбираться с тем, как его установить и настроить (но в свое время я все же пытался немного 😉), хотя, несомненно, кому-то он может очень нравиться.

***

Если кто-то посоветует какие-нибудь еще редакторы с оглядкой на мои «придирчивые» вкусы, буду очень благодарен. Так же было бы интересно услышать о каких-то дополнительных интересных особенностях Komodo от тех, кто им уже пользуется.

В общем, долой примитивную подсветку кода с вагоном ненужных функций! Это «наболевший» камень в огород постоянно появляющихся простых редакторов кода, выставляющих на передний план среди своих «достоинств» встроенный проводник по файловой системе или что-то вроде мини редактора/вьювера базы данных (ну зачем это нужно, если нет самых важных вещей именно для того, для чего изначально предполагается использовать редактор кода) и т.п. и т.д.. Почему-то почти каждый начинающий (хотя, может, не всегда начинающий) программист хочет «быстренько» сделать свой «мега» редактор, который часто вырождается в «опять что-то до боли знакомое»… очевидно, это традиция из серии «Hellow World!» 😉

Компонент служит для редактирования результатов заполнения веб-форм.

При его использовании в сочетании с компонентом Список результатов значение поля RESULT_ID можно оставить по умолчанию. Если же компонент используется самостоятельно, то необходимо определить откуда компонент должен брать значение параметра RESULT_ID или задать его явно. Компонент стандартный и входит в дистрибутив модуля.

В структуре визуального редактора компонент расположен по пути Сервисы > Веб-формы > Редактирование результата .

Компонент относится к модулю Веб-формы .

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

Пример вызова компонента form.result.edit

Секции настроек компонента:

Описание параметров

Если вы нашли эту статью, значит вы как и я не смогли решить данную задачи при помощи событий OnAfterIBlockElementUpdate 🙂

Как в битриксе перезаписать цену взятую из свойства

В одной статье сказано, «основная причина почему не работают обработчики событий для элементов связана с тем что сначала выполняются обработчики для инфоблока, а затем для каталога» .

Это значит что наши события при добавлении или обновлении информационных блоков просто отработают первыми, и даже если мы напишем CPrice::Update — то он просто перезапишется значениями из вкладки «торговый каталог».

Наша задача брать цену из свойства (при добавлении через админ форму, публичную или админ раздела) и перезаписывать значение цены в самом каталоге. Решить данную проблему можно в 2 шага:

Шаг 1: заходим в настройки инфоблока с товарами (Каталог). На первой вкладке ищем поле «Файл для редактирования элемента, позволяющий модифицировать поля перед сохранением:» . Записываем значение:

/bitrix/php_interface/include/iblock_catalog_edit_after_save.php

После сохранения создаем файл на сервере по данному пути.

Шаг 2: В файл iblock_catalog_edit_after_save.php — пишем следующий код:

$PRODUCT_ID, "CATALOG_GROUP_ID" => 1, "PRICE" => $price, "CURRENCY" => "RUB"); $res = CPrice::GetList(array(),array("PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => 1)); if ($arr = $res->Fetch()) { CPrice::Update($arr["ID"], $arField); } else { CPrice::Add($arField); } } ?>

А теперь давайте разбираться, тут есть несколько ньюансов:
1. BXIBlockAfterSave — именно это событие и поможет нам справиться с задачей, другие события просто не реагируют..
2. $price = array_shift($_POST[‘PROP’]); — в массиве $arFields не так и много полей за которые можно зацепиться (если я не путаю там даже ID информационного блока нет 🙂), поэтому мы будем работать с массивом $_POST . Вывести содержимое этого массива можно при помощи:

AddMessage2Log($_POST);

Не забудьте что вам нужно в файле /bitrix/php_interface/dbconn.php прописать путь к лог файлу:

Define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/.log.txt");

Если вы всё сделали правильно, можете попробовать пересохранить какой-либо элемент каталога (под элементом в данном контексте я имею ввиду товар, но в инфоблоках эта сущность по умолчанию называется элемент).
3. 55 — это ID моего свойства с ценой, которое я изменяю и далее значение которого мы записываем в переменную при помощи:

$price = array_shift($_POST["PROP"]); // take first value $price = str_replace(",", ".", $price); // replace coma

Вам нужно изменить 55 на ID вашего свойства. Ну а вторым действием заменяем запятую на точку, чтобы избежать каких-то ошибок.

Внимательный читатель спросит — а зачем же нам init.php? А в том то и дело, что единственное чем нам поможет этот файл, это записать данную функцию туда, вопрос — есть ли в этом смысл? Ведь всё что грузится в init.php доступно потом почти в любой части сайта.

Надеюсь у вас всё получилось, пишите в комментариях о своих успехах 🙂

Поле Параметр Описание
Источник данных
ID результата RESULT_ID Указывается идентификатор результата заполнения формы. По умолчанию указано $_REQUEST["RESULT_ID"] , но также может быть записан php-код, возвращающий RESULT_ID .
Внешний вид
Игнорировать свой шаблон IGNORE_CUSTOM_TEMPLATE При отмеченной опции для отображения веб-формы будет использоваться шаблон формы по умолчанию, даже если создан свой шаблон.
Использовать расширенный вывод сообщений об ошибках USE_EXTENDED_ERRORS При отмеченной опции будет использован расширенный вывод сообщений об ошибках.
Управление адресами страниц
Включить поддержку ЧПУ SEF_MODE При отмеченной опции будет включена поддержка ЧПУ.

Если режим поддержки ЧПУ включен , то необходимо настроить следующие параметры: SEF_FOLDER , SEF_URL_TEMPLATES .

Параметры компонента
Выводить на редактирование дополнительные поля EDIT_ADDITIONAL При отмеченной опции будут выведены для редактирования дополнительные поля формы при их наличии.
Выводить форму смены статуса EDIT_STATUS При отмеченной опции будет выведена форма смены статуса текущего результата. Статусы будут доступны в соответствии с правами пользователя.
Страница со списком результатов LIST_URL Указывается адрес страницы со списком результатов.
Страница просмотра результата VIEW_URL Указывается адрес страницы просмотра результата.
Название дополнительного пункта в навигационной цепочке CHAIN_ITEM_TEXT Указывается название дополнительного пункта в навигационной цепочке. Если оставить незаполненным, то в навигационную цепочку пункт не добавляется.
Ссылка на дополнительном пункте в навигационной цепочке CHAIN_ITEM_LINK