- 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)"
— Как навоз?
— Навоз — дерьмо!
— Почему дерьмо?
— Потому что дерьма мало, сплошная солома.
Не, ну правда, сам язык провоцирует говно писать.
дай-ка плюсану
Автор петух
За него мне не стыдно.
Тут представлен не весь код, а "выдержка", некоторые куски могут показаться лишними.
Этот код писался с 2009 года.
В коде на Битриксе ничего плохого не вижу.
Некоторым людям фреймворки голову затуманили, что самостоятельно думать не в состоянии.
Роутинг исторически с 2008 года в .htaccess
Он справляется со всеми задачами, поэтому писать роутинг на пхп ради того, чтобы меня не критиковало быдло, не собираюсь.
Меньше кода, все довольны.
Олени просто не в состоянии оценить всю красоту игры. У них шаблонное мышление.
Вот сама статья о фреймворках:
http://blog.kpitv.net/article/frameworks-1/
ссаными тряпками из профессии.
В PHP7 mysql_ функции удалены.
Сейчас такие вызовы mysql_ - просто обертка, которая равно или поздно будет удалена, а может и не будет.
А есть Ваш Код 2016 года строк 100.
Какой точно, не скажу.
http://blog.kpitv.net/article/how-to-set-title/
А Вы стисняетесь выложить? :)
{
function TM()
........
Вон из профессии. Признай программирование это не твоё.
Какой такой PHP 4. в 2009 уже вышел 5.3 Даже если он писался в 2009, он уже должен был иметь
__construct
Тот класс был написан как я только начинал программировать.
Работает - не трогал. :)
Пока эта портянка похожа на кусок говна.
Что было опубликовано, на то и дал ссылку.
Поддерживать актуальность кода в статье смысла не вижу.
{
if(!empty($this->buffered))
{
foreach($this->buffered as $contentID => $contentData)
{
$search[] = ' <!--'.$contentID.'--> ';
}
$data = str_replace($search, $this->buffered, $data);
}
}
короче я больше не хочу на это смотреть тут все настолько плохо, что хочется напиться.
2. у тебя метод вместо того что бы вернуть значение нормальным ожидаемым способом, возвращает его через аргументы, хотя нормальному поведению ничего не мешает.
2. Да, не совсем очевидно. Просто зачем лишние операции копирования в памяти. :)
Это все отмазки пэтеушников.
>лишние операции копирования в памяти
о да еще не знаем как php работает c памятью
Ну, я то скажу мне все ясно.
:)
$arJoin = [];
какой нахрен 2009?
"Этот код писался с 2009 года."
http://govnokod.ru/19878#comment323654
Я в то время работал с Битриксом и мне такой подход понравился. Что-то менять, чтобы только путало, смысла не видел.
Код, написанный на моей самописи будет понятен всем битриксоидам.
Потому что #нисосилил.
Читай статью.
То, что я вижу тут это говнище воняющее хуже Битрикса. А теперь вопрос с какими фреймворками Вы работали?
Ну нету в PHP нормальных оберток для sql. Я в этом не виноват.
Во всемя написания АПИ работал с Битриксом, году так в 2011.
Перенял только позитивные моменты.
Этот код будет понятен всем битриксоидам.
Если хотите, можем разобрать по пунктам:
• Cвоеобразное извращенное понимание МВЦ.
У MVC вообще много интерпретаций. Если есть претензия к тому, как реализована схема MVC в конкретном фреймворке, напишите подробнее.
• Нету настроек для конкретной страницы.
Поясните свою мысль.
• Чрезмерная сложность, много дырявых абстракций.
Да, абстракции иногда затрудняют отслеживание пути перемещения данных. Но то же самое можно сказать про любой распухший код. Чрезмерно просты только одностраничники и статические сайты.
• Плохая документация.
Обобщения не нужны. Бывают хорошо документированные фреймворки. А бывает и самописный код вообще без документации.
• Сложный дебаг, сложный аудит. Например нужно получить результирующий SQL-запрос.
Та же проблема бывает и без фреймворков. Получить результирующий SQL-запрос всегда можно, если очень нужно.
• Быстродейтсвие и потребление памяти.
Это проблема любого плохого кода. Есть примеры, что удалось сэкономить, отказавшись от фреймворка?
В моей самописи нету распухания кода и дебаг простой.
Самописный код в большинстве случаев вообще без документации. :)
Но он свой. Нету нужны рыться в неполной документации фреймворка.
Примеров, что удалось сэкономить нету, так как не приходилось переписывать код с фреймворка на самопись.
Но моя самопись генерируется до 5мс.
Выходит, что код одноразовый. Без первого автора его никто не сможет дорабатывать. Отличный способ стать незаменимым!
2. О документации думаю, часть функционала документирована
3. Приходилось работать в студии с самописной ЦМС. Ничего страшного, выучил за ИС
И своей головой они думать не в состоянии.
• Неудобно создавать статические страницы.
Поясните, с какими трудностями пришлось столкнуться.
• Непонятные и лишние обертки для SQL.
Никто не заставляет их использовать. Можно и без фреймворков обложиться ORM, и с фреймворками писать запросы вручную.
• Плохо работает многосайтовость из коробки.
Поясните.
• Отстутствие нужных фич, которые можно легко реализовать в самописи.
Нужны примеры.
• Нету нормальных готовых компонентов, например меню. Меню каждый обязан написать сам. :)
Меню есть. Хотя для сложных сайтов уж лучше реализовать его самому.
• Нету добавления хлебных крошек.
Смотря в каком фреймворке.
• При выпуске новых версий как правило отсутствует обратная совместимость. Программисты на фреймворках никогда не останутся без работы.
Есть такое. Но никто не заставляет переходить с одной несовместимой ветки на другую. У выпусков PHP тоже иногда возникает несовместимость.
• У добавленных цсс/жс файлов нету признака, что файл изменился.
Поясните свою мысль.
• Чтобы обратиться к GET/POST/COOKIE/SERVER нужно использовать непойми зачем неудобные обертки.
Зачастую возможность обращаться без обёртки сохраняется.
Построение меню, иерархия папок, администрирование, доступность страниц по лишним адресам. Профессионалы-аутсорсеры такого понаделывали, что это ужас.
>SQL
ОРМ - тяжелая вещь. Но и не писать же рутинные SQL-запросы вручную. А обертки написаны глупо.
Поэтому проще самому написать нормальную обертку.
>Поясните. (многосайтовость)
Она как бы в "ядре" не предусмотрена. Реализация возложена на программиста.
>Нужны примеры. (нужных фич)
Например, отдача 304 ответа, языки-фоллбеки для переводов определенного языка, та же дописка даты модификации файла у ресурсов.
>Меню есть. Хотя для сложных сайтов уж лучше реализовать его самому.
Я прежде всего о построении самого массива меню, а не о выводе.
> Есть такое. Но никто не заставляет переходить с одной несовместимой ветки на другую. У выпусков PHP тоже иногда возникает несовместимость.
Поэтому проще владеть своим кодом.
У меня проблем с версиями php почти не было. Код легко пересел с 5.2 на 7.0
>Поясните свою мысль. (CSS/JS)
Изменился цсс/жс, а браузер продолжает использовать закешированную версию. Приходится устанавливать малое время кеширования.
>Зачастую возможность обращаться без обёртки сохраняется.
Да, это мелкий недостадок, который и не тянет на недостаток.
и для этого есть вещи кстати http://symfony.com/doc/current/components/templating/helpers/assetshelper.html#versioning
А если код подключения раскидали по 100500 файлам?
>и для этого есть вещи кстати http://symfony.com/doc/current/components/templating/helpers/assetshelper.html#versioning
Проблему как бы решает, но:
1. Очищается кеш всех файлов.
2. Нужно кодить.
3. Нужно лезть в код при изменениях, а у меня все меняется автоматом.
Ооо. :)
А че это Вы так быстродействием озадачились?
1. По сравнению с оверхедом фреймворка оверхед минимальный.
2. filemtime кешируется.
3. У меня filemtime выполняется за время равное 1.9073486328125E-6 с.
4. Купите себе ssd.
Склейка не производится по причине того, что:
а) разделение ролей пользователей
б) 1 лишний файл погоды не делает
в) на разных страницах могут подключаться разные файлы
г) зачем мобильному пользователю отдавать кучу хлама, который ему не нужен
д) для этого нужен галп, что подразумевает программирование, а я ленивый программист
э) для этого нужен галп, а я до недавнего времени сидел на шаред хостинге
>Изменился цсс/жс, а браузер продолжает использовать закешированную версию. Приходится устанавливать малое время кеширования.
короче похуй на то, что файл не менялся, а ресурсы веб-сервера на его отдачу тратятся?
с таким подходом и знаниями дальше говносайтов на говноядре уйти трудно будет. Хотя не стоит пытаться - нужно же чьи-то говнокоды сюда добавлять
1.9073486328125E-6 с?
Вы серьезно?
Экономия на спичках?
Ну да, лучше вообще не кешировать ресурсы, как и поступают в основном фреймворкостроители. Или отдают устаревшие файлы.
Откройте для себя BundlePhu.
Как такое только могли написать на фреймворке.
:)
А как он знает, что что-то изменилось без filemtime? :)
Почитайте исходники что ли...
Все, я больше не хочу спорить за 1.9073486328125E-6 с, а может и меньше, это погрешность измерения.
У вас квашеная капуста в голове, используете фреймворки с жутким оверхедом, а прицепились до погрешности измерения.
Не используйте фреймворки, раз так дорожите микросекундой.
:)
>>Поэтому проще самому написать нормальную обертку.
конечно, причем лучше писать ее под каждый проект заново
Кстати, функции для работы с массивами тоже тяжеловаты и не всегда нужны
потому я всегда сам пишу qsort, для каждого проекта с ноля
Кстати о функциях для массивов.
Адепты ООП нервно курят в сторонке, так как для объектов нет таких функций.
у тебя есть свой файлик mylib.php, который ты во всех проекты копируешь по FTP
А потом такие - "Ой, а почему у меня тут какие-то MySQL Error??? Ой, а почему главная страница открывается полчаса??? Ой, а что делать, если функциональности моего велосипедика не хватает??? Ой, а чего это мой уютный сайтик взломали???" и т. д.
А через пару недель бессонного дебага: "Ой, лучше бы я использовал проверенные и надёжные решения..."
На тебе sql-инъекцию на фреймворке:
http://govnokod.ru/13993
В документации по 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. Экранируются ли подставленные значения?
А самая интересная функция описана тут:
https://github.com/yiisoft/yii/blob/master/framework/db/CDbCommand.php#L1511
Комментарии в коде отсутствуют, а комментарии для докгена (или что там используется) не помогают. Надо разбирать весь код функции processConditions, чтобы понять, как она работает.
Из исходника ясно, что функция processConditions тупо превращает array('and', 'id=1', 'id=2') в строку '(id=1) AND (id=2)'.
Никакого экранирования. Условие 'id=1' нужно клеить самому, так что все инъекции будут протащены.
Второй же параметр ($params) вообще не нужен. Он сохраняет перечисленные параметры в объекте и потом никак их не использует.
Это делается так:
$cmd->where([
'condition' => 'smth.id = :id',
'params' => [
'id' => 1,
]
])
Либо так
Smth::model()->findByAttributes([
'id' => 1
]);
В Yii2 сделали это дело немного комфортнее, но разница минимальна.
Ну хоть что-нибудь хорошее в Yii есть?
равно как и пхп и джс
От этого кода хочется взять и уебать, автора. Потом еще раз и еще раз.
Но ГК он же обучающий, поэтому я поясню свою мысль.
1. 3 различных вида кодо стайла. ( GetMessage, $tm->setLastModifiedTime, $tm->redirects_modules )
2. mysql_fetch_assoc($dbShow)
3. <?
Вывод: Ебашить пока говно заменяющее мозг не вылезет.
2. Уже сказал выше.
3. Ничего страшного в этом не вижу. Код пишу для себя. Если кто не может настроить себе short_open_tag - то вы ССЗБ.
https://gitter.im/dev-ua/php
Можете присоединиться к ообсуждению
:)
Код говно и обсуждать в нем нечего. В нем нет интересных решений.
У фреймворкостроителей начался лютый батхерт. :)
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/
>Шардинг БД, репликация БД. Фреймворками не решается.
вот пример вашего ниосиляторства.
Как же с репликациями и шардингом помагает фреймворк?
Но есть стандарт оформления кода php http://svyatoslav.biz/misc/psr_translation/
И его необходимо придерживаться
необходимо придерживаться
окей
пехопе самое лучшие удобно и для сибя
да, мои программы на пхп тормозят. Денис Попов говорит это потому что я использовал ооп.
Перепишу без ооп и будут летать