- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
<?
namespace components\max;
class articles_element
{
static function run($_arParams)
{
$arParams = &$_arParams['PARAMS'];
$tm = &$_arParams['tm'];
$user = &$tm->user;
$code = $arParams['CODE'];
$arCache = array(
'prefix' => 'show',
'sufix' => $code,
'time' => -1,
'lang' => LANGUAGE_ID,
);
$tm->loadLang('show');
$arSelect = array(
'E.id',
'E.active',
'rel',
'time',
'code',
'date_active_from',
'title_'.LANGUAGE_ID.' AS title' => $tm->conf['LANG_FALLBACKS'][LANGUAGE_ID],
'content_'.LANGUAGE_ID.' AS content' => $tm->conf['LANG_FALLBACKS'][LANGUAGE_ID],
'author_id',
'only_for_auth_users',
'source_url',
'source_author',
'source_date',
);
$arJoin = [];
if($tm->conf['show']['show_additional'])
{
$arSelect[] = 'GROUP_CONCAT(show2category.category_id) AS categories';
$arJoin[\CShow2Category::$table.' show2category ON E.id = show2category.show_id'] = 'LEFT';
}
$arFilter = array('E.code' => $code, 'E.site_id' => $tm->conf['site_id']);
$dbShow = \CShow::GetList(false, $arFilter, ['E.id'], array('nTopCount' => 1), $arSelect, $arJoin);
while($arShow = mysql_fetch_assoc($dbShow))
{
$arShow['title'] = htmlspecialchars($arShow['title']);
if(!empty($arShow['categories']))
{
$arShow['categories'] = explode(',', $arShow['categories']);
}
$arShow['time_write'] = date("d.m.Y", $arShow['date_active_from']);
$arShow['only_for_auth_users'] = $arResult['only_for_auth_users'] && empty($tm->user['id']);
$arResult = $arShow;
if($arResult['only_for_auth_users'])
{
$arResult['title'] = GetMessage('ERROR_ONLY_AUTH');
}
$tm->setLastModifiedTime($arShow['date_active_from']);
$tm->setBuffered('title', $arResult['title'].' | '.GetMessage('sitename'));
$tm->setBuffered('h1', $arResult['title']);
}
if(empty($arResult))
{
// Проверяем редиректы
$arParamsRedirects = array(
'code' => $arFilter['code'],
'module' => 'show',
);
$tm->redirects_modules($arParamsRedirects);
$tm->pagenotfound();
}
$arResult['user_status'] = $user['sts'];
if($tm->conf['show']['show_additional'] && !empty($arResult['categories']))
{
$arFilter = [
'active' => 1,
'show2category.category_id' => $arResult['categories'],
'!E.id' => $arResult['id'],
];
$arSelect = [
'E.id',
'code',
'title_'.LANGUAGE_ID.' AS title' => $tm->conf['LANG_FALLBACKS'][LANGUAGE_ID],
Код от противника фреймворков (это контроллер). Цитата виновника торжества:
"У меня роутинга нету За роутинг отвечает nginx (ранее отвечал .htaccess)"
guest 26.04.2016 00:18 # 0
kegdan 26.04.2016 01:18 # 0
inkanus-gray 26.04.2016 01:44 # +7
— Как навоз?
— Навоз — дерьмо!
— Почему дерьмо?
— Потому что дерьма мало, сплошная солома.
kerman 26.04.2016 03:27 # 0
Не, ну правда, сам язык провоцирует говно писать.
guest 26.04.2016 05:10 # +3
дай-ка плюсану
guest 26.04.2016 10:57 # −1
guest 26.04.2016 04:42 # −4
Автор петух
guest 26.04.2016 09:20 # +3
M-A-X 26.04.2016 09:50 # −1
За него мне не стыдно.
Тут представлен не весь код, а "выдержка", некоторые куски могут показаться лишними.
Этот код писался с 2009 года.
В коде на Битриксе ничего плохого не вижу.
Некоторым людям фреймворки голову затуманили, что самостоятельно думать не в состоянии.
Роутинг исторически с 2008 года в .htaccess
Он справляется со всеми задачами, поэтому писать роутинг на пхп ради того, чтобы меня не критиковало быдло, не собираюсь.
Меньше кода, все довольны.
Олени просто не в состоянии оценить всю красоту игры. У них шаблонное мышление.
Вот сама статья о фреймворках:
http://blog.kpitv.net/article/frameworks-1/
Vasiliy 26.04.2016 09:57 # +2
ссаными тряпками из профессии.
M-A-X 26.04.2016 10:21 # 0
В PHP7 mysql_ функции удалены.
Сейчас такие вызовы mysql_ - просто обертка, которая равно или поздно будет удалена, а может и не будет.
Vasiliy 26.04.2016 14:24 # 0
А есть Ваш Код 2016 года строк 100.
M-A-X 26.04.2016 15:33 # 0
guest 26.04.2016 15:43 # 0
M-A-X 26.04.2016 15:50 # 0
Vasiliy 26.04.2016 16:05 # 0
M-A-X 26.04.2016 16:07 # 0
Какой точно, не скажу.
http://blog.kpitv.net/article/how-to-set-title/
А Вы стисняетесь выложить? :)
loki90 26.04.2016 16:11 # +1
M-A-X 26.04.2016 16:59 # +1
Vasiliy 26.04.2016 18:04 # 0
{
function TM()
........
Вон из профессии. Признай программирование это не твоё.
inkanus-gray 26.04.2016 18:11 # 0
Vasiliy 26.04.2016 18:16 # 0
Какой такой PHP 4. в 2009 уже вышел 5.3 Даже если он писался в 2009, он уже должен был иметь
__construct
M-A-X 26.04.2016 19:12 # 0
Тот класс был написан как я только начинал программировать.
Работает - не трогал. :)
Vasiliy 26.04.2016 19:16 # +1
Пока эта портянка похожа на кусок говна.
M-A-X 26.04.2016 19:46 # 0
Что было опубликовано, на то и дал ссылку.
Поддерживать актуальность кода в статье смысла не вижу.
Vasiliy 26.04.2016 19:19 # +1
{
if(!empty($this->buffered))
{
foreach($this->buffered as $contentID => $contentData)
{
$search[] = ' <!--'.$contentID.'--> ';
}
$data = str_replace($search, $this->buffered, $data);
}
}
короче я больше не хочу на это смотреть тут все настолько плохо, что хочется напиться.
M-A-X 26.04.2016 19:47 # 0
Vasiliy 27.04.2016 08:27 # 0
2. у тебя метод вместо того что бы вернуть значение нормальным ожидаемым способом, возвращает его через аргументы, хотя нормальному поведению ничего не мешает.
M-A-X 27.04.2016 09:19 # 0
2. Да, не совсем очевидно. Просто зачем лишние операции копирования в памяти. :)
Vasiliy 27.04.2016 10:28 # +1
Это все отмазки пэтеушников.
>лишние операции копирования в памяти
о да еще не знаем как php работает c памятью
Ну, я то скажу мне все ясно.
M-A-X 27.04.2016 10:51 # 0
:)
guest 26.04.2016 16:55 # +1
$arJoin = [];
какой нахрен 2009?
M-A-X 26.04.2016 17:08 # 0
"Этот код писался с 2009 года."
http://govnokod.ru/19878#comment323654
guest 26.04.2016 09:57 # 0
M-A-X 26.04.2016 10:24 # 0
Я в то время работал с Битриксом и мне такой подход понравился. Что-то менять, чтобы только путало, смысла не видел.
Код, написанный на моей самописи будет понятен всем битриксоидам.
Vasiliy 26.04.2016 10:03 # +2
Потому что #нисосилил.
M-A-X 26.04.2016 10:24 # 0
Читай статью.
Vasiliy 26.04.2016 19:07 # 0
То, что я вижу тут это говнище воняющее хуже Битрикса. А теперь вопрос с какими фреймворками Вы работали?
M-A-X 26.04.2016 19:38 # 0
Ну нету в PHP нормальных оберток для sql. Я в этом не виноват.
Во всемя написания АПИ работал с Битриксом, году так в 2011.
Перенял только позитивные моменты.
Этот код будет понятен всем битриксоидам.
inkanus-gray 26.04.2016 11:23 # 0
M-A-X 26.04.2016 15:34 # 0
inkanus-gray 26.04.2016 15:48 # 0
M-A-X 26.04.2016 15:49 # 0
inkanus-gray 26.04.2016 16:05 # +6
Если хотите, можем разобрать по пунктам:
• Cвоеобразное извращенное понимание МВЦ.
У MVC вообще много интерпретаций. Если есть претензия к тому, как реализована схема MVC в конкретном фреймворке, напишите подробнее.
• Нету настроек для конкретной страницы.
Поясните свою мысль.
• Чрезмерная сложность, много дырявых абстракций.
Да, абстракции иногда затрудняют отслеживание пути перемещения данных. Но то же самое можно сказать про любой распухший код. Чрезмерно просты только одностраничники и статические сайты.
• Плохая документация.
Обобщения не нужны. Бывают хорошо документированные фреймворки. А бывает и самописный код вообще без документации.
• Сложный дебаг, сложный аудит. Например нужно получить результирующий SQL-запрос.
Та же проблема бывает и без фреймворков. Получить результирующий SQL-запрос всегда можно, если очень нужно.
• Быстродейтсвие и потребление памяти.
Это проблема любого плохого кода. Есть примеры, что удалось сэкономить, отказавшись от фреймворка?
M-A-X 26.04.2016 16:17 # 0
В моей самописи нету распухания кода и дебаг простой.
Самописный код в большинстве случаев вообще без документации. :)
Но он свой. Нету нужны рыться в неполной документации фреймворка.
Примеров, что удалось сэкономить нету, так как не приходилось переписывать код с фреймворка на самопись.
Но моя самопись генерируется до 5мс.
inkanus-gray 26.04.2016 16:19 # +2
Выходит, что код одноразовый. Без первого автора его никто не сможет дорабатывать. Отличный способ стать незаменимым!
loki90 26.04.2016 16:20 # +1
M-A-X 26.04.2016 16:41 # 0
2. О документации думаю, часть функционала документирована
3. Приходилось работать в студии с самописной ЦМС. Ничего страшного, выучил за ИС
guest 26.04.2016 18:50 # +1
M-A-X 26.04.2016 19:40 # 0
И своей головой они думать не в состоянии.
inkanus-gray 26.04.2016 16:05 # 0
• Неудобно создавать статические страницы.
Поясните, с какими трудностями пришлось столкнуться.
• Непонятные и лишние обертки для SQL.
Никто не заставляет их использовать. Можно и без фреймворков обложиться ORM, и с фреймворками писать запросы вручную.
• Плохо работает многосайтовость из коробки.
Поясните.
• Отстутствие нужных фич, которые можно легко реализовать в самописи.
Нужны примеры.
• Нету нормальных готовых компонентов, например меню. Меню каждый обязан написать сам. :)
Меню есть. Хотя для сложных сайтов уж лучше реализовать его самому.
• Нету добавления хлебных крошек.
Смотря в каком фреймворке.
• При выпуске новых версий как правило отсутствует обратная совместимость. Программисты на фреймворках никогда не останутся без работы.
Есть такое. Но никто не заставляет переходить с одной несовместимой ветки на другую. У выпусков PHP тоже иногда возникает несовместимость.
• У добавленных цсс/жс файлов нету признака, что файл изменился.
Поясните свою мысль.
• Чтобы обратиться к GET/POST/COOKIE/SERVER нужно использовать непойми зачем неудобные обертки.
Зачастую возможность обращаться без обёртки сохраняется.
M-A-X 26.04.2016 16:33 # 0
Построение меню, иерархия папок, администрирование, доступность страниц по лишним адресам. Профессионалы-аутсорсеры такого понаделывали, что это ужас.
>SQL
ОРМ - тяжелая вещь. Но и не писать же рутинные SQL-запросы вручную. А обертки написаны глупо.
Поэтому проще самому написать нормальную обертку.
>Поясните. (многосайтовость)
Она как бы в "ядре" не предусмотрена. Реализация возложена на программиста.
>Нужны примеры. (нужных фич)
Например, отдача 304 ответа, языки-фоллбеки для переводов определенного языка, та же дописка даты модификации файла у ресурсов.
>Меню есть. Хотя для сложных сайтов уж лучше реализовать его самому.
Я прежде всего о построении самого массива меню, а не о выводе.
> Есть такое. Но никто не заставляет переходить с одной несовместимой ветки на другую. У выпусков PHP тоже иногда возникает несовместимость.
Поэтому проще владеть своим кодом.
У меня проблем с версиями php почти не было. Код легко пересел с 5.2 на 7.0
>Поясните свою мысль. (CSS/JS)
Изменился цсс/жс, а браузер продолжает использовать закешированную версию. Приходится устанавливать малое время кеширования.
>Зачастую возможность обращаться без обёртки сохраняется.
Да, это мелкий недостадок, который и не тянет на недостаток.
loki90 26.04.2016 16:53 # +1
и для этого есть вещи кстати http://symfony.com/doc/current/components/templating/helpers/assetshelper.html#versioning
M-A-X 26.04.2016 17:07 # −1
А если код подключения раскидали по 100500 файлам?
>и для этого есть вещи кстати http://symfony.com/doc/current/components/templating/helpers/assetshelper.html#versioning
Проблему как бы решает, но:
1. Очищается кеш всех файлов.
2. Нужно кодить.
3. Нужно лезть в код при изменениях, а у меня все меняется автоматом.
loki90 26.04.2016 17:13 # 0
M-A-X 26.04.2016 17:26 # 0
Ооо. :)
А че это Вы так быстродействием озадачились?
1. По сравнению с оверхедом фреймворка оверхед минимальный.
2. filemtime кешируется.
3. У меня filemtime выполняется за время равное 1.9073486328125E-6 с.
4. Купите себе ssd.
Склейка не производится по причине того, что:
а) разделение ролей пользователей
б) 1 лишний файл погоды не делает
в) на разных страницах могут подключаться разные файлы
г) зачем мобильному пользователю отдавать кучу хлама, который ему не нужен
д) для этого нужен галп, что подразумевает программирование, а я ленивый программист
э) для этого нужен галп, а я до недавнего времени сидел на шаред хостинге
loki90 26.04.2016 17:31 # 0
>Изменился цсс/жс, а браузер продолжает использовать закешированную версию. Приходится устанавливать малое время кеширования.
короче похуй на то, что файл не менялся, а ресурсы веб-сервера на его отдачу тратятся?
с таким подходом и знаниями дальше говносайтов на говноядре уйти трудно будет. Хотя не стоит пытаться - нужно же чьи-то говнокоды сюда добавлять
M-A-X 26.04.2016 17:36 # −1
1.9073486328125E-6 с?
Вы серьезно?
Экономия на спичках?
Ну да, лучше вообще не кешировать ресурсы, как и поступают в основном фреймворкостроители. Или отдают устаревшие файлы.
loki90 26.04.2016 17:38 # +3
M-A-X 26.04.2016 17:45 # 0
inkanus-gray 26.04.2016 17:37 # 0
Откройте для себя BundlePhu.
M-A-X 26.04.2016 17:42 # +1
Как такое только могли написать на фреймворке.
:)
loki90 26.04.2016 17:50 # +1
M-A-X 26.04.2016 17:55 # 0
А как он знает, что что-то изменилось без filemtime? :)
Почитайте исходники что ли...
loki90 26.04.2016 17:59 # 0
M-A-X 26.04.2016 19:19 # 0
Все, я больше не хочу спорить за 1.9073486328125E-6 с, а может и меньше, это погрешность измерения.
У вас квашеная капуста в голове, используете фреймворки с жутким оверхедом, а прицепились до погрешности измерения.
Не используйте фреймворки, раз так дорожите микросекундой.
:)
guest 26.04.2016 18:54 # +4
>>Поэтому проще самому написать нормальную обертку.
конечно, причем лучше писать ее под каждый проект заново
Кстати, функции для работы с массивами тоже тяжеловаты и не всегда нужны
потому я всегда сам пишу qsort, для каждого проекта с ноля
M-A-X 26.04.2016 19:22 # 0
Кстати о функциях для массивов.
Адепты ООП нервно курят в сторонке, так как для объектов нет таких функций.
guest 26.04.2016 19:23 # +1
у тебя есть свой файлик mylib.php, который ты во всех проекты копируешь по FTP
M-A-X 26.04.2016 19:49 # 0
guest 26.04.2016 19:53 # 0
M-A-X 26.04.2016 20:07 # 0
andrew_blablabla 19.07.2016 10:46 # 0
gost 26.04.2016 20:39 # +1
А потом такие - "Ой, а почему у меня тут какие-то MySQL Error??? Ой, а почему главная страница открывается полчаса??? Ой, а что делать, если функциональности моего велосипедика не хватает??? Ой, а чего это мой уютный сайтик взломали???" и т. д.
А через пару недель бессонного дебага: "Ой, лучше бы я использовал проверенные и надёжные решения..."
M-A-X 26.04.2016 21:05 # +1
На тебе sql-инъекцию на фреймворке:
http://govnokod.ru/13993
inkanus-gray 26.04.2016 21:27 # +2
В документации по Yii1 я увидел, что вторым аргументом where() может идти $params с массивом параметров:
http://www.yiiframework.com/doc/api/1.1/CDbCommand#where()-detail
Однако, как его использовать, в примерах не указано.
В документации Yii2 у where() появляется третий вариант аргумента $condition, содержащий ассоциативный массив колонка=>значение:
http://www.yiiframework.com/doc-2.0/yii-db-query.html#where()-detail
Условия свяжутся друг с другом оператором AND.
Лень сейчас читать исходники Yii, поэтому спрошу:
1. Как воспользоваться обещанной подстановкой параметров в Yii1?
2. Экранируются ли подставленные значения?
guestinho 20.07.2016 00:38 # 0
3_14dar 21.07.2016 22:33 # 0
bormand 21.07.2016 22:53 # +1
3_14dar 22.07.2016 02:03 # 0
inkanus-gray 22.07.2016 02:08 # 0
А самая интересная функция описана тут:
https://github.com/yiisoft/yii/blob/master/framework/db/CDbCommand.php#L1511
Комментарии в коде отсутствуют, а комментарии для докгена (или что там используется) не помогают. Надо разбирать весь код функции processConditions, чтобы понять, как она работает.
inkanus-gray 22.07.2016 02:22 # 0
Из исходника ясно, что функция processConditions тупо превращает array('and', 'id=1', 'id=2') в строку '(id=1) AND (id=2)'.
Никакого экранирования. Условие 'id=1' нужно клеить самому, так что все инъекции будут протащены.
Второй же параметр ($params) вообще не нужен. Он сохраняет перечисленные параметры в объекте и потом никак их не использует.
guest 03.09.2016 11:23 # 0
Это делается так:
$cmd->where([
'condition' => 'smth.id = :id',
'params' => [
'id' => 1,
]
])
Либо так
Smth::model()->findByAttributes([
'id' => 1
]);
В Yii2 сделали это дело немного комфортнее, но разница минимальна.
inkanus-gray 22.07.2016 02:24 # 0
Ну хоть что-нибудь хорошее в Yii есть?
guest 22.07.2016 02:58 # +2
равно как и пхп и джс
Vasiliy 26.04.2016 10:10 # +1
От этого кода хочется взять и уебать, автора. Потом еще раз и еще раз.
Но ГК он же обучающий, поэтому я поясню свою мысль.
1. 3 различных вида кодо стайла. ( GetMessage, $tm->setLastModifiedTime, $tm->redirects_modules )
2. mysql_fetch_assoc($dbShow)
3. <?
Вывод: Ебашить пока говно заменяющее мозг не вылезет.
M-A-X 26.04.2016 10:27 # 0
2. Уже сказал выше.
3. Ничего страшного в этом не вижу. Код пишу для себя. Если кто не может настроить себе short_open_tag - то вы ССЗБ.
dxd 26.04.2016 10:33 # +3
M-A-X 26.04.2016 10:36 # 0
https://gitter.im/dev-ua/php
Можете присоединиться к ообсуждению
:)
Vasiliy 26.04.2016 10:46 # +3
Код говно и обсуждать в нем нечего. В нем нет интересных решений.
M-A-X 26.04.2016 10:58 # −3
У фреймворкостроителей начался лютый батхерт. :)
Vasiliy 26.04.2016 14:02 # +2
http://blog.kpitv.net/article/%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0% B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D 1%81%D1%82%D1%8C-web-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0% BE%D0%B2-15343/
>Шардинг БД, репликация БД. Фреймворками не решается.
вот пример вашего ниосиляторства.
M-A-X 26.04.2016 15:35 # 0
Vasiliy 26.04.2016 18:50 # +1
M-A-X 26.04.2016 19:24 # 0
Как же с репликациями и шардингом помагает фреймворк?
guest 26.04.2016 19:27 # +1
Vasiliy 27.04.2016 08:36 # 0
Vasiliy 26.04.2016 10:44 # 0
Но есть стандарт оформления кода php http://svyatoslav.biz/misc/psr_translation/
И его необходимо придерживаться
guest 22.07.2016 03:52 # 0
необходимо придерживаться
окей
guest 03.09.2016 11:25 # 0
kerman 26.04.2016 11:50 # +3
defecate-plusplus 26.04.2016 11:55 # +2
пехопе самое лучшие удобно и для сибя
Vasiliy 26.04.2016 14:03 # +3
kerman 26.04.2016 14:29 # +2
Vasiliy 26.04.2016 14:31 # −2
vik_arhyz 23.06.2016 18:16 # 0
guestinho 20.07.2016 00:39 # 0
да, мои программы на пхп тормозят. Денис Попов говорит это потому что я использовал ооп.
Перепишу без ооп и будут летать
laMer007 20.07.2016 10:26 # 0
guestinho 21.07.2016 17:10 # 0