Этого треда уже нет.
Это копия, сохраненная 2 мая 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
33 Кб, 500x500
157 Кб, 1024x683
194 Кб, 1024x768
202 Кб, 1024x768
Клуб изучающих PHP #74 #702800 В конец треда | Веб
Добро пожаловать в наш уютный тред. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).

Предыдущий тред был тут: >>689537 (OP) (1000 постов!)

Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).

Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.

Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП заходит где-то раз в 2-3 дня, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время.

У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.

Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

Надо переходить к более серьезным задачкам, которые научат тебя всему этому.

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1

Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
56 Кб, 500x644
187 Кб, 853x480
Помни #2 #702801
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md

------------------

Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.

Давай удочку, а не рыбу

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

Будь доброжелателен

Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»

Не придирайся к знанию английского языка.

Объясняй

Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»

Не проповедуй

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

Не придирайся к знанию английского языка, анон пишет как умеет.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
56 Кб, 500x644
187 Кб, 853x480
Помни #2 #702801
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md

------------------

Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.

Давай удочку, а не рыбу

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

Будь доброжелателен

Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»

Не придирайся к знанию английского языка.

Объясняй

Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»

Не проповедуй

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

Не придирайся к знанию английского языка, анон пишет как умеет.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
#3 #702802
Аноны, в старом треде >>689537 (OP) проверил все до 29 марта, оставшиеся посты проверю позже. Зайдите, найдите свое сообщение, прочитайте советы и замечания.
1832 Кб, 800x2800
427 Кб, 321x933
145 Кб, 1403x1037
458 Кб, 320x933
#4 #702830
Эйоу, крутые версталы и особенно оп. Зацените верстку.
http://w99953g4.bget.ru/tatukada/
Джипег макета: пикрил 1
Код: https://github.com/huyakhuyakivprodakshen/tatukadu/
- ссылки и формы статичные, не работают. Листалки работают (у листалок поваров и рецептов мелкие серые кнопки внизу)
- картинки с ватермарками заменил
- некоторые мелкие детали сделал по-своему где как мне кажется автор макета ошибся
- не понял нафига в макете две карты, вместо одной вставил нескучную панораму
- анимации, ховеры и все такое добавил по своему вкусу, в макете не было
- видео тока в вебм, на хостинге мало места. В едже не поддерживается
- в последней лисе и хроме вроде все ок, больше нигде скурпулезно не тестил
- все самописное
- круто ли я сделал сетку? Каждый блок вынесен в отдельный файл, легко находится; при необходимости столбцы или отдельные блоки меняются местами простым ctrl+c ctrl+v (блоки разных размеров с минимальной подгонкой) на пике 2 я перемешал блоки, все работает
- html написан на jade, пик 3. Повторяющиеся куски вынесены в миксины, например если надо добавить твит, повара или рецепт не надо копировать куски html достаточно писать что-то вроде +chef('имя','должность', 'краткая инфа', 'фото'), +tweet('автор', 'текст')
- css написан на sass, также с миксинами, также все переменные вынесены в отдельный файл, можно легко поменять брендовые цвета, шрифты, минимальную и максимальную ширину как на пике 4
343 Кб, 1920x1008
43 Кб, 603x213
#5 #702893
Сап, /pr/. Начал изучать laravel и запнулся об синтаксис. Почему обращения к методам get и group идет через Route, а не Routes? В API же написано что эти методы определены именно в Routes.
#6 #702894
>>702893

>Routes


Router
*быстрофикс
#7 #702899
>>702830
Долго шёл к такому результату? Сколько учишь это всё?
Не могу оценить само качество вёрстки, поскольку едва только решил задачи ОПа на HTML+CSS, но в целом всё хорошо отображается. Код аккуратный.
Дизайн сам по себе достаточно давящий на глаза, сразу не вполне ясна логика - чем не люблю material. Всё как-то в кучу. Но от тебя это не зависело, конечно, это сам макет.
Чем планируешь дальше заниматься? Силён ли во фронтенде? Оставь какой-нибудь контакт, мне через некоторое время понадобится фронтендщик, можем поговорить о некоторых вещах.
>>702992
#8 #702922
>>702830

Ты ведь уж постил верстку - ты замечания к ней учел? Я помню что там было довольно мрачно все. Мне не придется заново те же ошибки указывать?

Тут я как минимум br вижу - почему он там? Ты не забыл что за внешний вид отвечает CSS , а HTML предназначен для разметки?

Также, что за тег date? https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/app/jade/includes/_event.jade#L5

Также,

> ul.offer-image-list


> li.offer-image-list-li


Класс на li тут не особо нужен, удобнее писать .offer-image-list > li

Почему у тебя 2 тега h1?

Почему в наименовании CSS классов нет единообразия?

Алсо ты там используешь flex. Что с браузерами которые его не прддерживают или поддерживают но старую версию?

https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/public/css/main.css#L6
Зачем тут CSS reset? Напиши какие он преимущества дает? Я вижу только недостатки например.
>>702992
#9 #702925
>>702830

Почему шрифты только в ttf?
>>702992
#10 #702929
>>702830
На секции подели. Добавь футер и префутер, а так норм, молодец.
#11 #702930
>>702830

> [class="cell"]


> [class="col-"] {


Напиши, почему плохо так делать?

Когда я прокручиваю страницу и курсор оказывается над видео, прокрутка перестает работать. Почему?

Дизайн фиксированный что ли? Я меню размер окна и масштаб страницы и ничего не перестраивается.

Сам дизайн ужасен конечно, но это претензии к его автору.
>>702992
#12 #702937
бамп вопросу >>702893
#13 #702939
Как правильно сделать extension в php.ini, чтобы работать с PostgreSQL?

Апач и пхп ставил по тутору- http://blog.denisbondar.com/post/apache24php56win7
>>702956
#14 #702945
http://php.net/manual/ru/functions.anonymous.php
Почему в документации к php анонимные функции названы замыканиями? Ведь замыкание - это совсем другое.
#16 #702961
>>702956
Спасибо, буквально минуту назад сам прочитал это.
#17 #702973
Почему microtime отсчитывает с 1970 года?
>>703004
#18 #702992
>>702899
Саму эту страничку недели полторы мучал. HTML и CSS я знал на серднем уровне, прост пару месяцев назад захотел обновить стек технологий, разобрался наконец с командной строкой, npm, gulp, препроцессорами ну и попутно наверстать всяких хипстерских одностраниц. Фронтенд на уровне своровать скрипт и настроить, лол. Но ты пиши, там видно будет
huyakhuyafL^kivprodakshenANUSWF-gmailPUNCTUMcdL?om
>>702922

>что за тег date?


Фу, time конечно же

>Класс на li тут не особо нужен, удобнее писать .offer-image-list > li


Для этих конкретных ли-шек класс нужен затем чтобы их удобно взять в jquery. Но вообще над этим вопросом я думал очень долго. С одной стороны авторы БЭМа настаивают на 'минимуме непокрытых классами тегов' с другой стороны даже придумывать их имена утомительно и в половине случаев проще взять каскадом. Не готов спорить.

>Что с браузерами которые его не прддерживают


Как и говорил, ничего. Считаем что в ТЗ их нет.

>Зачем тут CSS reset?


Не весь, а тщательно отобранные 1.5 правила. Убраны аутлайны при фокусе инпутов, андерлайн у ссылок и поля+отступы (почему бы и нет?). Если ты на нормалайз намекаешь, то мне не нравится идея подрубать 400 строк кода потому что "там умные люди за тебя все написали, не выделывайся".

>Почему в наименовании CSS классов нет единообразия?


Наивно полагаю что есть, лол. Я старался придерживаться БЭМа но с авторскими нюансами, они вроде против такого не возражают.

>Почему у тебя 2 тега h1?


Наверное прозевал. Но стандарт не запрещает, тока рекомендует чтоб был один h1 на section, пруф:
https://www.w3.org/TR/html5/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements
>>702925
Лень искать было
>>702930

>почему плохо так делать?


1. Не самый быстрый селектор
2. Если забыть про это правило и завести класс 'col-something'...
Ну, это не самые жуткие моменты, лол

>курсор оказывается над видео, прокрутка перестает работать


Над панорамой. Она вставляется айфреймом. Наверняка есть фикс какой-то, лень искать было.

>Дизайн фиксированный что ли?


Я никак не могу найти годный сложный макет в котором будет все, и ховеры и модальные окна и анимации и мобильные версии и все-все. А без макета я не знаю как 'сделать красиво'.

>дизайн ужасен конечно


Вот, о чем я и говорю. Мне он понравился, например, лол.
#18 #702992
>>702899
Саму эту страничку недели полторы мучал. HTML и CSS я знал на серднем уровне, прост пару месяцев назад захотел обновить стек технологий, разобрался наконец с командной строкой, npm, gulp, препроцессорами ну и попутно наверстать всяких хипстерских одностраниц. Фронтенд на уровне своровать скрипт и настроить, лол. Но ты пиши, там видно будет
huyakhuyafL^kivprodakshenANUSWF-gmailPUNCTUMcdL?om
>>702922

>что за тег date?


Фу, time конечно же

>Класс на li тут не особо нужен, удобнее писать .offer-image-list > li


Для этих конкретных ли-шек класс нужен затем чтобы их удобно взять в jquery. Но вообще над этим вопросом я думал очень долго. С одной стороны авторы БЭМа настаивают на 'минимуме непокрытых классами тегов' с другой стороны даже придумывать их имена утомительно и в половине случаев проще взять каскадом. Не готов спорить.

>Что с браузерами которые его не прддерживают


Как и говорил, ничего. Считаем что в ТЗ их нет.

>Зачем тут CSS reset?


Не весь, а тщательно отобранные 1.5 правила. Убраны аутлайны при фокусе инпутов, андерлайн у ссылок и поля+отступы (почему бы и нет?). Если ты на нормалайз намекаешь, то мне не нравится идея подрубать 400 строк кода потому что "там умные люди за тебя все написали, не выделывайся".

>Почему в наименовании CSS классов нет единообразия?


Наивно полагаю что есть, лол. Я старался придерживаться БЭМа но с авторскими нюансами, они вроде против такого не возражают.

>Почему у тебя 2 тега h1?


Наверное прозевал. Но стандарт не запрещает, тока рекомендует чтоб был один h1 на section, пруф:
https://www.w3.org/TR/html5/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements
>>702925
Лень искать было
>>702930

>почему плохо так делать?


1. Не самый быстрый селектор
2. Если забыть про это правило и завести класс 'col-something'...
Ну, это не самые жуткие моменты, лол

>курсор оказывается над видео, прокрутка перестает работать


Над панорамой. Она вставляется айфреймом. Наверняка есть фикс какой-то, лень искать было.

>Дизайн фиксированный что ли?


Я никак не могу найти годный сложный макет в котором будет все, и ховеры и модальные окна и анимации и мобильные версии и все-все. А без макета я не знаю как 'сделать красиво'.

>дизайн ужасен конечно


Вот, о чем я и говорю. Мне он понравился, например, лол.
>>708324
#19 #703004
>>702973
Было второе пришествие Христа в виде Unix.

На самом деле:

Early versions of unix measured system time in 1/60 s intervals. This meant that a 32-bit unsigned integer could only represent a span of time less than 829 days. For this reason, the time represented by the number 0 (called the epoch) had to be set in the very recent past. As this was in the early 1970s, the epoch was set to 1971-1-1.

Later, the system time was changed to increment every second, which increased the span of time that could be represented by a 32-bit unsigned integer to around 136 years. As it was no longer so important to squeeze every second out of the counter, the epoch was rounded down to the nearest decade, thus becoming 1970-1-1. One must assume that this was considered a bit neater than 1971-1-1.

Note that a 32-bit signed integer using 1970-1-1 as its epoch can represent dates up to 2038-1-19, on which date it will wrap around to 1901-12-13.
#20 #703046
Есть ли php.net в формате PDF на русском языке?
>>708326
#21 #703062
>>702830
Когда скроллишь вниз и мышь попадает на флеш-панорамку, то скроллить больше низя :(

>huevos ponimatos?


ну кек, ну ладно, уболтал. Но бросается в глаза и по факту портит.

отиграл тебе тестирующего твой сервис пользователя за 2 минуты
#22 #703074
Вопрос от новичка, так что лучше обоссыте:

>$a = "алах акбар!";


>$a1 = mb_substr($a, 0, 1);


>$a3 = mb_strtoupper($a1);


>var_dump($a1);


>var_dump($a3);


>echo "{$a1} {$a3}";


Собственно вопрос - почему эчо не выводит нихуя? Через вардамп видно что а1 и а3 это строки состоящие из 2(!) символов, почему из двух?

>string(2) "а"


>string(2) "А"

24 Кб, 882x563
#23 #703079
>>703074
http://ideone.com/kDuQho

Всё выводит, проверяй еще раз.
>>703083
#24 #703083
>>703074
Нужно вначале объявить явно кодировку для функций mb
mb_internal_encoding('utf-8')
http://php.net/manual/ru/function.mb-internal-encoding.php

Вардамп пишет про два байта, а не два символа.
Кириллица в юникоде кодируется двумя байтами.
Про mb-функции
https://gist.github.com/codedokode/ff99e357e9860ea169b8

Загугли также что такое кодировка.

>>703079
То что на ideone автоматически utf это не панацея.
>>703094
#25 #703094
>>703083
Я объявил кодировку, просто в глаза ебался, сори.
Собственно проблема была в задании с заменой Первой буквы предложения на большую и исправлением пробелов и знаков препинания. Вот что у меня пока вышло:
http://ideone.com/sAOJKw
Помогите с регуляркой, пожалуйста.
>>708326
45 Кб, 604x452
#26 #703098
>>703074

>эчо


Ты чё?
11 Кб, 281x315
#27 #703131
>>703136
18 Кб, 344x326
#28 #703134
Анон, нужна помощь. Уперся в цикл, наверно я тупой. Задача из архива с народа.

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

1×1 = 1
2×2 = 4
...
9×9 = 81

Ты можешь взять пример кода с картинки ниже за основу.

Прошу объяснись.
#29 #703136
Бамп вопросам.
>>703131
>>703131

Забыл написать.
#30 #703138
>>703134
for ($i = 1; $i <= n; $i++) {
$i = $i1; //для вывода i до умножения
$i2 = $i2;
echo "{$i} x {$i} = {$i2}\n";
}
Мимо нуб*
#31 #703140
>>703138

>$i2 = $i2;


fastfix*
>>703142
#32 #703142
>>703140
>>703138
Бля, я даун, разметка макаки все ломает

>$i2 *= $i2;

#33 #703143
>>703134
>>703138
Не, вот так вот по-сишному напишу, т.к. доллары раздражаюць

for(i = 1; i<=N; ++i)
for(j = 1; j<=N; ++j){
prod = i * j;
echo "{i}x{j} = {prod}";
}
>>703144>>703145
#34 #703144
>>703143
А, бля, если на онли X2 выводить, то тогда да, вложенный цикл не нужен.
#35 #703145
>>703143
Так, а мой чем не подошел?
>>703138 - кун, поясни.
>>703147
#36 #703147
>>703145
Да просто я вывел всю таблицу умножения, а, походу, нужны только квадраты.

Алсо, афтар, написал бы тогда, что нужны квадраты, а не таблица умножения, ёпт.
>>703151>>703157
#37 #703150

>выводящую таблицу умножения чисел от 1 до N на самих себя, используя цикл

#38 #703151
>>703147

>Напиши программу, выводящую таблицу умножения чисел от 1 до N на самих себя


>на самих себя

#39 #703155
Спасибо всем отозвавшимся, но
for ($i = 1; $i <= n; $i++) {
$i = $i1;
$i2 *= $i2;
echo "{$i} x {$i} = {$i2}\n";
}
Не проходит, не выводит числа, будто эхо мертво.
И ещё просьба, если не сложно - объяснить. Это главное. И пожалуйста не нужно упрощать, из-за упрощения я не смогу пойти по гайду дальше, что о5 вернет меня в начало. :<
#40 #703157
>>703147

У нас учебник для начинающих, а не для математиков.
#41 #703158
Мне тут дали много полезных советов, хотелось бы еще!
http://www.emoji.esy.es/
https://github.com/Phrlog/Emoji
Очень жду рекомендаций по коду или юзабилити, тыкайте пальцем где плохо.
>>703169>>703172
#42 #703159
>>703155

Перечитай начало урока, как работает цикл for. Перепиши и выполни пример который выводит 10 раз одну и ту же надпись. Разбери его до последней запятой. А потом уже только делай таблицу умножения.
#43 #703161
>>703155
Ах да, при изменении >$i <= n не проходит вообще.
#44 #703162
>>703155

Запости код на ideone и дай ссылку - лучшие эксперты треда посмотрят твой код.
#45 #703164
>>703166>>708326
#46 #703166
>>703164

>$i = $i1;


Приравнивай к i2, ты чего!
>>703168
#47 #703168
>>703166
Ошибка выполненияtime: 0.06 memory: 61592 signal:25
>>703171
139 Кб, 1365x452
#48 #703169
>>703158

>1843 запроса


Почитай про спрайты.
А также про http протокол.
>>703176
#49 #703171
>>703168
Наверное не поставил $ перед переменной.
>>703173
#50 #703172
>>703158
Чего у тебя HTML разметка и PHP код смешан? И делал бы уже MVC тогда, чего размазывать логику в шаблонах.

>($_POST['back'] == "")


>($_POST['front'] == "")


>($_POST['word'] == "")


А что если я введу символ пробела? И что если полей с таким именем не будет существовать?
>>703180
#51 #703173
>>703171
Если тебе не сложно. Напиши полностью программу, которая будет делать, как нужно, а не тыкай пальцев в небо. Пожалуйста.
>>703182
#52 #703176
>>703169
Я думал о спрайтах, но мне нравится идея получения картинок по категориям из БД с помощью get и вывод смайликов по ссылке из ВК.
>>703494
#53 #703180
>>703172
Куда пробел введешь? Инпуты скрыты же. А MVC для одностраничного сайта как-то глупо, не? Может я не прав.
p-sch #54 #703182
>>703186
#55 #703186
>>703182
Замечательный гайд. С нуля. Вот и откуда я должен был >" . $i*$i . " это взять? С неба? От аллаха?
>>703192
#56 #703192
>>703186
на без этого http://ideone.com/VLRZCB
>>703195
#57 #703195
>>703192
Анон не поделишься контактом/скуп/мейл/тд, на случай тупика. Сложно в сольном освоении, так хоть будет у кого спросить.
Вк, если что http://vk.com/id338138188
>>703201>>703202
#58 #703201
>>703195
Залетай в конфу в телеграме.
#59 #703202
>>703195
Не. У нас тут не принято. пиши в тред если что. Тут много доброанонов.
58 Кб, 800x600
#60 #703205
бамп вопросам
>>702945
>>702893
>>703206
#61 #703206
>>703205
Жди ОПа, он ответит.
120 Кб, 1099x537
#62 #703233
Яндекс ее рука, а гугл платный.
Безысходность.
#63 #703240
>>703233
Что за фреймворк на пике?
>>703241
#64 #703241
>>703240
Slim 3.
>>703250
#65 #703242
Какие есть Управляющие последовательности? В мануале явно не все. Где например /s?
>>703245>>703494
#66 #703245
>>703242
Загуглил php string escape sequences
Выдало:
http://php.net/manual/ru/regexp.reference.escape.php
#67 #703250
>>703241
Почему ты его выбрал?
>>703260
#68 #703255
>>702945
Что по твоему замыкания тогда?
>>703256>>703260
#69 #703256
>>703255
Замыкание - это функция, которая получает доступ к внешнему scope при использование переменных и констант, которые не объявлены в теле функции.
44 Кб, 652x335
#70 #703260
>>703250
Потому что подходит для простых задач. У меня там примитивный mvc в три страницы. Большой фреймворк тут не нужен.

Перевод у яндекса иногда идиотский, об этом был пост. Он как-то лучше справляется с большими кусками текста (пик1), а гугл с одиночными словами.

>>703255
Замыкание на самом деле это способность анонимной функции захватывать переменные из родительской области видимости. Фактически замыканием является только конструкция use ($variable).
Но в php привыкли любую лямбда функцию называть замыканием.
Тем более что и та и другая являются объектом класса Closure.
Быдлокодерский язык, он будто сам подталкивает к написанию говнокода.
#71 #703261
Как правильно строить роутинг в случае когда пользователь сам генерирует URL?
#72 #703264
>>703260
Переводить нужно не слова, а обороты речи имхо.
#73 #703274
>>703260
Замыкание относится не только к анонимным функциям. Что такое лямбда-функция? Что за use ($variable)?
#74 #703286
>>703260

>Замыкание на самом деле это способность анонимной функции захватывать переменные из родительской области видимости.


Вот только будет она замыканием только когда будет захватывать эти переменные. Пока она не захватила переменные - это не замыкание
>>703312
#75 #703301
Анон, почему не работает регулярка со знаками препинания?
http://ideone.com/sAOJKw
>>703307>>703343
#76 #703307
>>703301
http://ideone.com/CjcRsw вроде работает
>>703308>>703343
#77 #703308
>>703307
Лол, а у меня - нет, наверное я неудачник.
>>703322
#78 #703311
http://ideone.com/yLkxSu
Аноны, тыкните, что я намутил не так?
>>703331>>703343
#79 #703312
>>703286
Я вроде это и сказал.

$x = 10;
$a = function () {}; // анонимная функция
$b = function () use ($x) {}; // анонимная функция с замыканием

Обе тем не менее являются объектом класса Closure.
https://habrahabr.ru/company/mailru/blog/103983/
>>703326
#80 #703322
>>703308
http://ideone.com/lzldQI
Как видишь работает(правда не так как ожидалось, ведь лишние пробелы не убраны). Ну и возьми на вооружение проверять что у тебя в переменных в тех местах, где ты не уверен, да и в тех, где уверен тоже, чтобы отловить баг, а то так и будешь на анонов надеяться, когда можешь сам найти и обезвредить проблему.
>>703369
#81 #703326
>>703312
Да что за use($x)?
>>708327
#82 #703331
>>703311
Во первых, смотри ошибки внизу, они там не для красоты

>PHP Notice: Array to string conversion in /home/fZTcro/prog.php on line 18


Далее, как работает implode? Объединяет элементы массива в строку. А что если внутри этого массива один или несколько элементов тоже окажутся массивами? Тогда получаем ошибку как выше. Тут или предварительно придется делать implode на каждый элемент, либо избавиться от подмассивов вообще.
>>703356
#83 #703342
>>703134
Держи, наверное поздно, но быстрее написать такое, чем весь тред читать
http://ideone.com/GLoZbr
>>703343
#84 #703343
>>703301
>>703307
>>703311
>>703342
Зачем вы это пишете?
Ответьте на вопрос лучше >>703261
sage #85 #703346
Обычная история: нуб спросит какую-нибудь поебень - набегает сотня хеллоувордлщиков, все суют свои решения.
Нет бы развести нуба на самостоятельное решение - нет, блять, будем совать своё говно с лопаты.
А потом нуб так и дальше будет просить и не хера не понимать.
Завязывайте с тем, чтобы готовые решения выдавать.
Побуждайте самостоятельно решать, пиииидры!
#86 #703347
>>703346
Но мы так и делаем.
#87 #703348
>>703346
Хуй ты меня >>703261 побудишь что-то решить. У меня архитектурные вопросы.
#88 #703356
>>703331
Не заметил сообщение снизу.
Так я вроде имплоднул ревёрснутый массив, а потом ещё сплитнутый текст.
>>703364
#89 #703364
>>703356
Какая разница реверснутый он или нет? От этого он не перестает содержать в себе подмассивы. Опять та же проблема, что у анона выше - неумение в базовый дебаг. Проблема в 18 строчке? Ну так выведи проблемную переменную на 17ой и посмотри что в ней и что не так http://ideone.com/FewWgl
Теперь ты видишь в чем проблема?
>>703373
#90 #703369
>>703322
Спасибо.
#91 #703373
>>703364
Умник, блядь. Ответь на вопрос >>703261
>>703382
1352 Кб, 960x960
#92 #703376
>>702945
>>702893
>>703261
Бамп вопросам
>>703410
#93 #703382
>>703373
Не отвечу, грубиян.
что значит сам генерирует URL, задай вопрос нормально
>>703409
#94 #703397
Я не пойму вам что тут медом намазано? За день сто постов насрали. Родина вам дала тостер, стаковерфлоу, гугл - задавайте там вопросы 'где я проебал запятую', вам ответят минут за 20. Тут три компетентных анона вынуждены разгребать по сто тупых вопросов в день.
>>703408>>703410
#95 #703408
>>703397
Так может ты задашь правила - какие на твой взгляд вопросы достойны этого треда, а какие - нет.
114 Кб, 1277x719
#96 #703409
>>703382
Вопрос в общем простой. Я привык работать с modx, там есть дерево ресурсов и задают шаблоны. Администраторы сайта сами правят это дерево. Теперь я как утенок хочу реализовать то же самое посредством фреймворка laravel. Я хочу написать админку с редактором дерева. Если админ захочет создать корневой ресурс, то пожалуйста. Как мне прописывать роуты? Единственное что приходит на ум - это создать таблицу в базе "контроллер-роутер". Как вообще на фреймворках пишут? Сразу задают четкую структуру сайта?
>>703504
#97 #703410
>>703397

>задавайте там вопросы


Зачем тогда этот тред нужен? Три компетентных анона не могу на мои 3 вопроса ответить уже день целый. >>703376
>>703504
#98 #703419
чому оно не работает :(

http://ideone.com/IX5BEm

по замыслу он должен исходный текст сначала зашифровать, а затем расшифровать,
>>703423
#99 #703423
>>703419
Когда расшифровываешь - поменяй ключи с индексами местами. Оно ищет по ключам, а ключи у тебя русские.
>>703439
#100 #703437
Пояните нафиг нужен isset() если есть empty() которой можно пользоваться практически во всех случаях вместо isset()
>>703504
#101 #703439
>>703423
не знаю, правильно ли я тебя понял, но там ведь есть array_flip, который и выполняет эту функцию - меняет местами ключи и значения, то есть всё должно быть в порядке
>>703441
#102 #703441
>>703439
Но ты переменную $l33t2 расшифровываешь по старому коду, а не флипнотому.
>>703445
#103 #703445
>>703441
о, господи, кажется, я понял. спасибо!
#104 #703450
Как правильно пользоваться API? Ни разу в жизни не пользовался API. Вот открыл я API Laravel, решил метод запустить и не получилось. В какой последовательности его использовать?
https://laravel.com/api/5.2/Illuminate/Routing/UrlGenerator.html
Метод full() класса UrlGenerator
Вставил в роутер для теста:

Route::get('/test', function () {
$a = \Symfony\Component\Routing\Generator\UrlGenerator::full();
echo $a;
});

Выдало ошибку:
FatalErrorException in routes.php line 18:
Call to undefined method Symfony\Component\Routing\Generator\UrlGenerator::full()

Переправил на:
Route::get('/test', function () {
$a = UrlGenerator::full();
echo $a;
});

Выдало ошибку:
FatalErrorException in routes.php line 18:
Class 'UrlGenerator' not found
>>703504
268 Кб, 1396x659
#105 #703455
Аштрисет. 3 класса на выбор. Магия. И какой же описан в API, ммм?
>>703504
#106 #703494
>>703176

> Я думал о спрайтах, но мне нравится идея получения картинок по категориям из БД с помощью get и вывод смайликов по ссылке из ВК.


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

Более того, на картинки распространяется закон об охране авторского права - слышал о таком (хотя если ты их не копируешь к себе, а подключаешь по ссылке то тут довоольно спорная ситуация, но решение вряд ли окажется в твою пользу).

Ну и мелочь конечно стоит склеивать в спрайты.

И судя по error.hostinger у тебя там фавиконки не хватает.

>>702945

Замыкание = функция + захваченные ей из наружной области видимости переменные. Анонимные функции в PHP могут захватывать переменные с помощью use и потому справедливо называются замыканиями.

>>702893

А там не написано что-то вроде use Router as Route?

>>703233

Ключи АПИ стоит выносить в конфиг и не светить на скриншотах.

>>703242

Где именно? В обычных строках или в регулярках?

В обычных строках: http://php.net/manual/ru/language.types.string.php
В регулярках - http://php.net/manual/ru/regexp.reference.escape.php

Тут важно понимать что эти последовательность работают на этапе компиляции. То есть PHP читает например \n а в строку в памяти записывает просто символ с кодом 10 (перевод строки).

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

Проверить что получилось можно с помощью echo:

echo "\s\n\y\t\u";

>>703260

Замыкание это функция с захваченными переменными. В википедии тоже примерно так написано:

https://en.wikipedia.org/wiki/Closure_(computer_programming)
https://ru.wikipedia.org/wiki/Замыкание_(программирование)

>>703261

У тебя должен быть какой-то признак для отличия пользовательских роутов от твоих. Иди ты разрешишь пользователям переопределить страницу регистрации например?

Алгоритм может выглядеть так:

- если это наш роут, найти его
- иначе, искать УРЛ в таблице пользовательских
- иначе, 404

>>703346

Да. Не давайте готовые решения и не пишите код. Дайте ссылку на мануал, объясните как пользоваться var_dump и тд. Помните только что начинающий еще почти ничего не знает и не загадывайте шарады.
#106 #703494
>>703176

> Я думал о спрайтах, но мне нравится идея получения картинок по категориям из БД с помощью get и вывод смайликов по ссылке из ВК.


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

Более того, на картинки распространяется закон об охране авторского права - слышал о таком (хотя если ты их не копируешь к себе, а подключаешь по ссылке то тут довоольно спорная ситуация, но решение вряд ли окажется в твою пользу).

Ну и мелочь конечно стоит склеивать в спрайты.

И судя по error.hostinger у тебя там фавиконки не хватает.

>>702945

Замыкание = функция + захваченные ей из наружной области видимости переменные. Анонимные функции в PHP могут захватывать переменные с помощью use и потому справедливо называются замыканиями.

>>702893

А там не написано что-то вроде use Router as Route?

>>703233

Ключи АПИ стоит выносить в конфиг и не светить на скриншотах.

>>703242

Где именно? В обычных строках или в регулярках?

В обычных строках: http://php.net/manual/ru/language.types.string.php
В регулярках - http://php.net/manual/ru/regexp.reference.escape.php

Тут важно понимать что эти последовательность работают на этапе компиляции. То есть PHP читает например \n а в строку в памяти записывает просто символ с кодом 10 (перевод строки).

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

Проверить что получилось можно с помощью echo:

echo "\s\n\y\t\u";

>>703260

Замыкание это функция с захваченными переменными. В википедии тоже примерно так написано:

https://en.wikipedia.org/wiki/Closure_(computer_programming)
https://ru.wikipedia.org/wiki/Замыкание_(программирование)

>>703261

У тебя должен быть какой-то признак для отличия пользовательских роутов от твоих. Иди ты разрешишь пользователям переопределить страницу регистрации например?

Алгоритм может выглядеть так:

- если это наш роут, найти его
- иначе, искать УРЛ в таблице пользовательских
- иначе, 404

>>703346

Да. Не давайте готовые решения и не пишите код. Дайте ссылку на мануал, объясните как пользоваться var_dump и тд. Помните только что начинающий еще почти ничего не знает и не загадывайте шарады.
>>703528>>703567
#107 #703504
>>703409

Что тебе мешает сделать дерево страниц и разделов в таблице в БД? Ты знаешь паттерны для хранения древовидных данных? У ОПа есть урок по теме, и в гугле есть информация.

>>703410

Не надо бампать каждые 15 минут. Тред не резиновый.

>>703437

Сделай список различий между isset и empty, то есть напиши для каких значений они дают разные результаты - тогда посмотрим.

>>703450

Это не статический метод. Ты знаком с ООП? Это метод который вызывается на экземпляре объекта. Очевидно, тебе надо сначала его создать или получить. Может он есть где-ниьудь в DI контейнере фреймворка.

>>703455

Они в разных нейсмпейсах. Ты неймспейсы изучил? Если нет, вернись и изучи прежде чем за фреймворки браться.
51 Кб, 791x316
#108 #703528
>>703494

>Более того, на картинки распространяется закон об охране авторского права - слышал о таком (хотя если ты их не копируешь к себе, а подключаешь по ссылке то тут довоольно спорная ситуация, но решение вряд ли окажется в твою пользу).



Я вот такое нашел.

Про фавикон точно, спасибо!
#109 #703549
Аноны, а как правильно инклюдить повторяющийся html код на две страницы, если внутри него некоторый код отличается? Вот оп мне сказал переделать шапку (http://ideone.com/dY7FgJ). С <span class="navbar-brand" понятно, я просто передам его содержимое переменной ($header = "Список студентов";) в пхпскрипт-контроллер в котором инклюдится данный шаблон, но что делать со списком ul, если он разный будет на двух страницах? Добавлять условие, если $header = "Список студентов" в инклюдищийся html инклюдится один html, если $header = "Регистрация" другой? Верстка на bootstrap 3, если что.
#110 #703550
>>703549
http://ideone.com/dY7FgJ быстрофиксим ссылку
#111 #703559
Ї Ї Ї фреймворк - це нова украЇнська розробка від творців ____
а дальше продолжите
>>703567
#112 #703567
>>703549
Первый и второй шаблон отличаются только названием страницы и содержимым списка.
Так что можно заменить "Список студентов" в первом случае и "Регистрация" на какой-нибудь $pageTitle, список пунктов меню тоже передавать из php.
Условие
if (!empty($cookie))
тоже перенести в контроллер, и в зависимости от него формировать массив для меню.

В будущем конечно надо переходить к великолепному шаблонизатору twig, который поддерживает наследование.
http://twig.sensiolabs.org/doc/templates.html#template-inheritance

>>703494

>Замыкание это функция с захваченными переменными


Ну дык а если переменных захвачено не было? Обычная анонимная функция нифига не видит из родительского скопа, почему ее тоже называют замыканием в официальном мануале? Я настаиваю, что пока анонимная функция не импортирует хотя бы одну переменную, ее замыканием считать нельзя. Почему любая безымянная функция считается замыканием, непонятно.
Хорошая статья в тему, вроде тоже четко проводится грань между замыканиями и простыми безымянными функциями.
http://www.ibm.com/developerworks/ru/library/os-php-5.3new2/

>>703559
Название китайское кажется.
Я одно время думал, что kohana разрабатывали поляки.
Оказалось поехавшие гики взяли слово из языка индейцев дакота.
>>705426
#113 #703627
Узрел в слиме обращение к $this внутри анонимных функций
http://www.slimframework.com/docs/objects/router.html#writing-content-to-the-response
думал щас прозрею, может действительно в любой калбек можно зашить обращение к свойствам объекта, в контексте которого его вызывают.

А там оказывается используется pimple, где тупо передается $this в качестве параметра
https://github.com/silexphp/Pimple/blob/master/src/Pimple/Container.php#L113
>>703628
#114 #703628
>>703627

$this в анонимной функции соответствует объекту в которой она создана. Твой вариант ($this указывает на место вызова, а не создания) не имеет смысла так как ты не угадаешь где ее вызовут и какие там доступны поля или методы и доступны ли вообще.
>>703863
#115 #703675
>>703346
Вопросы от нубов это в первую очередь повторение для меня самого и разминка в написании простого кода. Но в целом ты прав.
#116 #703691
http://ideone.com/dxcvbt
Прощу научить, объяснить, что не верно и как привязать подсчет чего либо в и вывод этого с помощью echo.
>>703696>>708326
#117 #703696
>>703691
Первое- поставь бекслеш n, а то читать тяжело. По твоему вопросу - добавь в цикл увеличение возраста анона на 1 (vozrast++ например), тогда у тебя кажды шаг цикла будет увеличиваться возраст.
#118 #703703
Задача на Большую букву в начале предложения и правильный пробел после знаков препинания, наковырял много лишнего, я уверен что можно сделать намного аккуратнее, посоветуйте.
http://ideone.com/FNT12r
>>704544>>708327
#119 #703720
http://ideone.com/dxcvbt
Анон взгляни, где то в теле ошибка. Все не как не дойду.
>>703734
#120 #703734
>>703720
Добавь проверку возраста.
http://ideone.com/694f1M
>>703742
#121 #703742
>>703734
Спасибо анон.
#122 #703753
Изучаю как работает фреймворк. Сложно запомнить как и где все инклюдится. Приходится бегать по разрозненным файлам. Как по инклюдам собрать один файл?
>>708327
#123 #703774
Напомните как включить связи таблиц в phpmyadmin?
>>704561>>708328
#124 #703783
>>702800 (OP)
Парни, ньюфаг вкатился. По совету товарища начал изучать пхп по мануалу ОПа тот самый который на народе и поймал себя на мысли о том, что вот такие задачи мне не интересны абстрактные типа счета суммы разницы процентов накопления на счету при покупке айфона в ипотеку. Гораздо интересней на уровне говнокогда, конечно, вкатываться в сайтострой. Но не создавать CMS, а уже на готовых решениях типа wp, joomla и так далее. Так вот, это я к чему, посоветуйте что можно почитать или где обмазаться именно практическими задачами. Алсо, сам мануал забросил после прохождения этапа повторения тот самый где ебаные регулярки.
>>703803>>703950
#125 #703803
>>703783
Спроси об этом у поехавших красноглазиков, обмазывающихся языками уровня С.
#126 #703863
>>703628

>$this в анонимной функции соответствует объекту в которой она создана


Слава богу, наконец-то понятно.
Почему сразу так не сказал? Куча заумных статей и прочей хуиты, а оказывается все так просто.
http://ideone.com/xvfNX9
Теперь конечно понятно, почему любая анонимная функция является замыканием.
Однако другие переменные все равно нужно импортировать поштучно, чтобы оно (замыкание) их увидело.
>>703976
8 Кб, 392x201
#127 #703865
Откуда такие кретины берутся вообще?
>>708328
#128 #703950
>>703783

Скачай себе CMS и установи локально. Многие CMS позволяют настраивать сайт через админку, без программирования.

Что же касается программирования, написания тем, плагинов, доработок, то конечно без знания языка PHP у тебя ничего не выйдет.
#129 #703954
>>702800 (OP)
У кого-нибудь есть решение задачи про список студентов? Я знаю основы, которые перечислены в требованиях, но не имею никакого понятия, как это реализуется и с чего начать.

Вот изучал синтаксис, а потом резко "напиши сайт". Ахуеть.
#130 #703971
>>703954
Что там такого сложного? Тоже самое, что ты делал в задачах ОПа, только результат вывода нужно еще и в хтмл код оборачивать
#131 #703976
>>703863
Я не понял, откуда там у тебя hello world, когда делаешь форк - и просто hello выводится в конце?
Мистика!
>>704073
#132 #704073
>>703976
Да, кстати, я думал это у меня уже галлюцинации.

Это с ideone какие-то проблемы, что-то у них там кешируется что ли.
А, я понял. Там есть кнопочка "сохранить", и есть кнопочка "run". Что-то у них там согласованность слетела.

Если сначала создать один вариант скрипта и запустить, все хорошо.
Нажимаем "редактировать", меняем скрипт, нажимаем "сохранить", но НЕ нажимаем "run".
Готово. Теперь по ссылке доступен новый код, а результат работы программы старый.
http://ideone.com/4ckkH3

Раньше такой фигни не было, я же всегда так делал.
Пишу скрипт -> запускаю -> редактирую -> сохраняю. Теперь обязательным действием после каждой редакции является новая компиляция нажатием "run".
Кнопку save тогда вообще можно выпилить за ненадобностью. Она нужна разве что для тех людей, кто собирается писать (именно писать, не вставлять из иде!) гигантские полотна на сотни строк и боится потерять промежуточный результат.
>>704215
#133 #704215
>>704073
Ясно, вот оно как, спасибо.
А то я уж было подумал сначала, что это какой-то трюк со строкой "hello", что она выводится как "hello world", муахаха!
#134 #704241
>>702795

>Проще сложить самих работников в массив, а не их часы. Обойти этот массив циклом и просуммировать.


>> for ($i = 0; $i < count($allHours); $i++) {


>> $hours += array_sum($allHours[$i]);


>Это не очень правльно так как суммировать часы за неделю должен сам работник.


Уже после того, как окончательно решил вот тут - >>702661 http://ideone.com/Np7lSE - понял, что одного массива $employees и вправду может быть достаточно. В этот же цикл foreach ($employees as $employee) подставить как $employee->hours - и всё.

>У работника должен быть метод который считает его зарплату. Суть ООП в том что мы в классе объединяем данные и методы для их обработки. И за расчет своей зарплаты отвечает сам работник.


>А вот за сумму по всем работникам- уже внешний код.


Бро, ОП, совсем не могу понять, в чём суть. Извини, я пока ещё не въехал в ООП. Метод есть в окончательном решении, которое пока ты не проверял, точнее, несколько методов для подсчёта отдельно нормальных часов и отдельно переработанных, подсчёта отдельно зарплаты для нормальных и отдельно для переработанных со сложением их в итоге. То ли это, что нужно?
Я пока ждал разбора решённой задачи, то всё были промежуточные варианты.

>Прочитай вот это:



----

Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:

— какие есть сущности, для которых мы сделаем классы? (Сотрудник)
— какие у них есть свойства. Зарплата не является свойством так как она вычисляются из других свойств и хранить ее не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал.
— как сущности связаны? Тут всего один класс и работники никак не связаны.

----

>Нужно сделать метод расчета зарплаты в сотруднике.


Брооо, я пока не понимаю этого, не могу уловить суть...
Как так в сотруднике сделать метод? То есть просто функцию (метод) добавить в класс, потом с её помощью определять зарплату?
У меня в итоговом варианте всё разрозненно, но я бы не смог сделать по-другому: там некоторые функции у меня не как методы, а после определения класса определены, за его пределами.
Потому что им на вход подаются изменённые данные.
Я не знаю, как такое могло бы быть, когда функция определена как метод и оперирует лишь имеющимися изначально данными...
#134 #704241
>>702795

>Проще сложить самих работников в массив, а не их часы. Обойти этот массив циклом и просуммировать.


>> for ($i = 0; $i < count($allHours); $i++) {


>> $hours += array_sum($allHours[$i]);


>Это не очень правльно так как суммировать часы за неделю должен сам работник.


Уже после того, как окончательно решил вот тут - >>702661 http://ideone.com/Np7lSE - понял, что одного массива $employees и вправду может быть достаточно. В этот же цикл foreach ($employees as $employee) подставить как $employee->hours - и всё.

>У работника должен быть метод который считает его зарплату. Суть ООП в том что мы в классе объединяем данные и методы для их обработки. И за расчет своей зарплаты отвечает сам работник.


>А вот за сумму по всем работникам- уже внешний код.


Бро, ОП, совсем не могу понять, в чём суть. Извини, я пока ещё не въехал в ООП. Метод есть в окончательном решении, которое пока ты не проверял, точнее, несколько методов для подсчёта отдельно нормальных часов и отдельно переработанных, подсчёта отдельно зарплаты для нормальных и отдельно для переработанных со сложением их в итоге. То ли это, что нужно?
Я пока ждал разбора решённой задачи, то всё были промежуточные варианты.

>Прочитай вот это:



----

Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:

— какие есть сущности, для которых мы сделаем классы? (Сотрудник)
— какие у них есть свойства. Зарплата не является свойством так как она вычисляются из других свойств и хранить ее не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал.
— как сущности связаны? Тут всего один класс и работники никак не связаны.

----

>Нужно сделать метод расчета зарплаты в сотруднике.


Брооо, я пока не понимаю этого, не могу уловить суть...
Как так в сотруднике сделать метод? То есть просто функцию (метод) добавить в класс, потом с её помощью определять зарплату?
У меня в итоговом варианте всё разрозненно, но я бы не смог сделать по-другому: там некоторые функции у меня не как методы, а после определения класса определены, за его пределами.
Потому что им на вход подаются изменённые данные.
Я не знаю, как такое могло бы быть, когда функция определена как метод и оперирует лишь имеющимися изначально данными...
>>704387>>708328
#135 #704356
Напомню себе: проверить https://github.com/MindiMakridi/filehosting

>>702249
>>712511
#136 #704384
Ответил в старом треде на все вопросы, проверил все задачи. зайдите и найдите ответ на свои посты:

>>704364 - https://github.com/foobar1643/filehosting/
>>704367- вопрос про Слим, код, про index.php
>>704370- Задача про ООО Вектор
>>704373 - еще про ООО Вектор

Если я кого-то забыл, пропустил - напомните о себе тут
#137 #704387
>>704241

Вот какие данные у тебя есть в работнике:

public $name; // имя-фамилия
public $rate; // часовая ставка (сколько он получает тугриков за час работы)
public $hours = array(); // массив, содержащий отработанные часы по неделям
public $overtimeHours = 0;

Что мы хотим знать?

- отработанное время
- овертайм
- полную зарплату

Что из этого мы можем сделать с помощью методв внутри класса Работника? Все можем, так как все нужные данные есть в полях объекта. Значит надо сделать их методами класса.

То есть ты вызваешь

$employee->getSalary()

и получаешь аутальную, точную информацию о полной зарплате этого работника.
>>706345
#138 #704437
ОП, подскажи, в цмсках часто можно кусок блока или поля выводить по алиасу - [mod.basket] типа, я сейчас проставляю некоторые данные в массив и вывожу его элементы через (пример)
<?php echo $massiv['phone']; ?>, эта конструкция слишком длинная. Как мне прикрутить алиас типа такого [phone]? Че почитать?
>>705609
#139 #704498
>>704370
Тащемта, мне показалось, что объекты в ООП по сути и есть массивы. А массив с сотрудниками я начал использовать только из-за изменения их количества, рангов и должностей в антикризисных мерах. Я не могу представить как, допустим, зарплата сотрудника будет вычисляться в классе для сотрудников, затем поступать в класс департамента, там складываться в зарплату всему департаменту и затем передаваться в антикризисный комитет, который будет каким-то образом опять разделять сотрудников и их зарплату из общей кучи, чтобы провести какие-то изменения.
В общем буду читать мануал и переделывать все сначала.
Вот мой вариант без антикризисных мер http://ideone.com/zrlKyB , который я написал ранее. Как лучше хранить и передавать данные типа зарплаты, кофе и страниц?

>почему мы копируем rates только из последнего объекта


Он одинаковый для всех работников, как и кофе и документы.

>Я вижу ты там еще одну задачу на ООП запостил - сначала надо ее сделать идеально тогда.


Это был не я.
>>704694
#140 #704544
>>703703
Анончики, проверьте плиз.
>>708327
#141 #704555
Почему некоторые программисты не любят php и унижают разработчиков на нем?
>>704566>>704569
#142 #704561
>>703774
Шта? пхпмайадмин отображает связи которые ты создал при помощи sql - `table.name` FOREIGN KEY `ololo` REFERENCE `table2`(`name2`)
чет типа такого
#143 #704565
Что такое абстракция в ООП?
>>704695
#144 #704566
>>704555
Так со всеми языками.
#145 #704567
Смотрю тут лекции по ООП на ютубе, но там пиздят за C и С++. Стоит ли их смотреть? Или в пхп ООП это совсем другое?
>>704695
#146 #704569
>>704555
Потому что порог вхождения низкий, из-за этого появилось много быдлокодеров, которые считают себя программистами. Из-за этого пошел стереотип что на пхп пишут только не очень умные люди, хотя это далеко не так. Если смотреть на наш /pr/ то тут ко всем языкам такое отношение, тролли же обычные.
>>704599
#147 #704571
Инкапсуляции стоит передерживаться всегда?
>>704593
#148 #704593
>>704571

>Инкапсуляции стоит передерживаться всегда?


Да. Следствие непредсказуемости разработки.
#149 #704599
>>704569
А мне казалось, что это стереотип из прошлого, когда php можно было с натяжкой назвать языком программирования.
#150 #704609
>>704599
Когда goto появился, то можно было уже говорить что это ЯП.
#151 #704610
>>704599
Язык меняется (медленно и мучительно), контингент - нет.
Большинство "пыхапыхеров" не знает английского языка (да и родной не очень), не знакомо с ооп, фреймворками, паттернами, другими языками программирования (базовый js не в счет) не имеет представления об http, сетях и вообще ни о чем.
>>704625>>704695
#152 #704625
>>704610
Скажи что ты шутишь. Рил. А как тогда они умудряются его выучить, чтоб еще и работать по вакансии пхп макакич?
>>704626
#153 #704626
>>704625
По секрету тебе скажу, чтобы работать по вакансии пхп макакич - не нужно знать язык. Главное разговаривать уметь и не выглядеть как полный чухан. От этого мы и получаем васянов-говнокодеров, проекты которых легче заново с нуля написать, чем разобрать готовый код. Конечно, в нормальных, крупных компаниях таких случаев почти нет.
>>704695
#154 #704694
>>704498

> объекты в ООП по сути и есть массивы.


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

Класс лучше по всем параметрам, а массив хуже (для хранения информации о каких-то сущностях), однако класс надо сначала определить, а массив - не надо, потому код на массивах пишется чуть быстрее ценой ухудшения читаемости.

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

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

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


Вот это важный момент. Дублирование данных - это почти всегда плохо. Мало того, что это лишний код, так еще и начинается путаница, где актулальные данные. а где нет. В ООП мы не делаем копирование если только это не требуется по логике задачи.

Вот у нас есть объект Компания. Внутри у него есть 4 Депармента. У каждого Департамента внутри допустим 20-30 Сотрудников.

Вот нам надо провести над этой Компанией какие-то действия. Что мы делаем?

- получаем из Компании нужный Департамент или все сразу (через метод)
- ищем нужных нам Сотрудников в Департаменте (можно сделать например метод для поиска по должности или рангу, можно получить всех Сотрудников в массиве и отфильтрровать самому)
- делаем над Сотрудниками нужные операции: уменьшаем зарплату, повышаем, меняем ранг
- если надо уволить сотрудника, делаем это через Депарамент в котором он работает

Больше нам ничего делать не надо. Если мы поменяли свойства Сотрудника, и вызовем у Депарамента метод ПосчитатьЗарплату(), то автоматически получим актуальную зарплату с учетом сделанных изменений.

Теперь поговорим про ситуации когда копирование данных нужно. Мы хотим протестировать 3 сценария. Но нам надо каждый раз применять их к исходной Компании, а не к измпененной. Для этого мы используем компирование - мы делаем 3 клона исходной Компании со всеми Департаментами и Сотрудниками и на клонах применяем наши антикризисные сценарии.

Задавай вопросы, что непонятно. Если понятно, то жду от тебя для начала переработанный класс для хранения информации о Сотруднике и расчета его показателей.

> Я не могу представить как, допустим, зарплата сотрудника будет вычисляться в классе для сотрудников, затем поступать в класс департамента, там складываться в зарплату всему департаменту



Очень просто: заводишь переменную, кладешь в нее 0, обходишь в цикле своих сотрудников и складываешь их зарплаты. Цикл это стандартный способ сделать что-то с массивом.

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


Она не будет передаваться. Он сам ее возьмет, если ему надо, вызвав метод:

echo $marketingDepartment->getTotalSalary();
echo $employee->getSalary();

> и затем передаваться в антикризисный комитет, который будет каким-то образом опять разделять сотрудников и их зарплату из общей кучи, чтобы провести какие-то изменения.


Если тебе нужна зарплата одного работника, ты берешь объект с ним и получаешь ее.

> Как лучше хранить и передавать данные типа зарплаты, кофе и страниц?


У работника и департамента должны быть методы которые возвращают индивидуальную и общую зарплату соответсвенно:

echo $marketingDepartment->getTotalSalary();
echo $employee->getSalary();

То же самое с кофе и страницами. Если тебе надо что-то получать от объекта, ты делаешь в нем метод для этого.

То что у тебя в коде - не годится так как у тебя нет объекта представляющего единственного работника. Я в прошлый раз это писал.

>>почему мы копируем rates только из последнего объекта


> Он одинаковый для всех работников, как и кофе и документы.


Это ты так думаешь. А на самом деле можно передать массив объектов где он будет разный. Ты должен либо учитывать зарплату для каждого индивидуально, либо если она одинаковая, передавать этот массив отдельно.

И да, так как у нас ООП то хранить вот так вот в простом массиве данные о зарплате нельзя. Если ты решил их зранить отдельно, сделай класс который спрячет их внутри и будет возвращать (не массив а конкретную зарплату дял данной профессии) через методы.

Массиво-ориентированное програмирвангие (имитация объектов через массивы) это плохо и с этим надо бороться.

И еще, я могу добавить, подумай как сделать чтобы код был более понятне. Вот у тебя например есть конструктор объекта Employees который принимает 6 аргументов и вообще непонятно какого они типа и что в них хранится.

Где можно, используй тайп хинты. Где нельзя и тип аргумента не очевиден, комментарии.

-----

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

Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
#154 #704694
>>704498

> объекты в ООП по сути и есть массивы.


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

Класс лучше по всем параметрам, а массив хуже (для хранения информации о каких-то сущностях), однако класс надо сначала определить, а массив - не надо, потому код на массивах пишется чуть быстрее ценой ухудшения читаемости.

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

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

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


Вот это важный момент. Дублирование данных - это почти всегда плохо. Мало того, что это лишний код, так еще и начинается путаница, где актулальные данные. а где нет. В ООП мы не делаем копирование если только это не требуется по логике задачи.

Вот у нас есть объект Компания. Внутри у него есть 4 Депармента. У каждого Департамента внутри допустим 20-30 Сотрудников.

Вот нам надо провести над этой Компанией какие-то действия. Что мы делаем?

- получаем из Компании нужный Департамент или все сразу (через метод)
- ищем нужных нам Сотрудников в Департаменте (можно сделать например метод для поиска по должности или рангу, можно получить всех Сотрудников в массиве и отфильтрровать самому)
- делаем над Сотрудниками нужные операции: уменьшаем зарплату, повышаем, меняем ранг
- если надо уволить сотрудника, делаем это через Депарамент в котором он работает

Больше нам ничего делать не надо. Если мы поменяли свойства Сотрудника, и вызовем у Депарамента метод ПосчитатьЗарплату(), то автоматически получим актуальную зарплату с учетом сделанных изменений.

Теперь поговорим про ситуации когда копирование данных нужно. Мы хотим протестировать 3 сценария. Но нам надо каждый раз применять их к исходной Компании, а не к измпененной. Для этого мы используем компирование - мы делаем 3 клона исходной Компании со всеми Департаментами и Сотрудниками и на клонах применяем наши антикризисные сценарии.

Задавай вопросы, что непонятно. Если понятно, то жду от тебя для начала переработанный класс для хранения информации о Сотруднике и расчета его показателей.

> Я не могу представить как, допустим, зарплата сотрудника будет вычисляться в классе для сотрудников, затем поступать в класс департамента, там складываться в зарплату всему департаменту



Очень просто: заводишь переменную, кладешь в нее 0, обходишь в цикле своих сотрудников и складываешь их зарплаты. Цикл это стандартный способ сделать что-то с массивом.

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


Она не будет передаваться. Он сам ее возьмет, если ему надо, вызвав метод:

echo $marketingDepartment->getTotalSalary();
echo $employee->getSalary();

> и затем передаваться в антикризисный комитет, который будет каким-то образом опять разделять сотрудников и их зарплату из общей кучи, чтобы провести какие-то изменения.


Если тебе нужна зарплата одного работника, ты берешь объект с ним и получаешь ее.

> Как лучше хранить и передавать данные типа зарплаты, кофе и страниц?


У работника и департамента должны быть методы которые возвращают индивидуальную и общую зарплату соответсвенно:

echo $marketingDepartment->getTotalSalary();
echo $employee->getSalary();

То же самое с кофе и страницами. Если тебе надо что-то получать от объекта, ты делаешь в нем метод для этого.

То что у тебя в коде - не годится так как у тебя нет объекта представляющего единственного работника. Я в прошлый раз это писал.

>>почему мы копируем rates только из последнего объекта


> Он одинаковый для всех работников, как и кофе и документы.


Это ты так думаешь. А на самом деле можно передать массив объектов где он будет разный. Ты должен либо учитывать зарплату для каждого индивидуально, либо если она одинаковая, передавать этот массив отдельно.

И да, так как у нас ООП то хранить вот так вот в простом массиве данные о зарплате нельзя. Если ты решил их зранить отдельно, сделай класс который спрячет их внутри и будет возвращать (не массив а конкретную зарплату дял данной профессии) через методы.

Массиво-ориентированное програмирвангие (имитация объектов через массивы) это плохо и с этим надо бороться.

И еще, я могу добавить, подумай как сделать чтобы код был более понятне. Вот у тебя например есть конструктор объекта Employees который принимает 6 аргументов и вообще непонятно какого они типа и что в них хранится.

Где можно, используй тайп хинты. Где нельзя и тип аргумента не очевиден, комментарии.

-----

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

Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
#155 #704695
>>704565

Для точного определения - гугли.

https://ru.wikipedia.org/wiki/Абстракция_данных

Абстракция, если говорить простыми словами, это когда ты вызываешь высокоуровневый метод, и получаешь результат, при этом как он был получен тебе не важно - это проблемы автора класса, который пишет этот метод. А ты лишь пользуешься им и не тратишь время.

Ну например слой абстракции от базы данных позволяет тебе вместо написания SQL запросов просто вызвать метод вроде

$employee = $employeeTable->findByName('Иван Иванов');

Вот мы только что выбрали данные из базы, не написав ни одной строчки SQL кода. Абстракция сэкономила нам время.

>>704567

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

Ближе всего к PHP ООП в Яве. Лучше найти лекции по ней тогда.

>>704599

В прошлом PHP выглядел еще выгоднее, так как другие платформы вроде Ява или Си++ требовали намного больше труда чтобы сделать например обработку данных из формы, чем простой пхп скрипт. Это сейчас много языков и фреймворков для веба, а раньше выбор был условно - PHP vs Perl vs Java vs C++ (nightmare mode).

>>704610

В мире JS сейчас то же самое, как и у рубистов. Люди учатся копипастить код из туториалов, а как устроен хотя бы их фреймворк не знают.

>>704626

Это только в компаниях где некому таких отсеивать или где экономят на зарплате. Мелкие веб-студии, не-IT компании вроде госорганизаций или турфирм и тд.
#155 #704695
>>704565

Для точного определения - гугли.

https://ru.wikipedia.org/wiki/Абстракция_данных

Абстракция, если говорить простыми словами, это когда ты вызываешь высокоуровневый метод, и получаешь результат, при этом как он был получен тебе не важно - это проблемы автора класса, который пишет этот метод. А ты лишь пользуешься им и не тратишь время.

Ну например слой абстракции от базы данных позволяет тебе вместо написания SQL запросов просто вызвать метод вроде

$employee = $employeeTable->findByName('Иван Иванов');

Вот мы только что выбрали данные из базы, не написав ни одной строчки SQL кода. Абстракция сэкономила нам время.

>>704567

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

Ближе всего к PHP ООП в Яве. Лучше найти лекции по ней тогда.

>>704599

В прошлом PHP выглядел еще выгоднее, так как другие платформы вроде Ява или Си++ требовали намного больше труда чтобы сделать например обработку данных из формы, чем простой пхп скрипт. Это сейчас много языков и фреймворков для веба, а раньше выбор был условно - PHP vs Perl vs Java vs C++ (nightmare mode).

>>704610

В мире JS сейчас то же самое, как и у рубистов. Люди учатся копипастить код из туториалов, а как устроен хотя бы их фреймворк не знают.

>>704626

Это только в компаниях где некому таких отсеивать или где экономят на зарплате. Мелкие веб-студии, не-IT компании вроде госорганизаций или турфирм и тд.
#156 #704790
Дайте туторов каких по postgres.
Сейчас нихуя не понимаю.
Хочу сделать простую регистрационную форму, но нихуя не получается на шаге подключения к бд.
#157 #704821
А при помощи какой функции (кроме mb_substr) можно удалить все пробелы из строки?
Я про задачу про палиндромы у ОПа.
>>704826>>704832
#158 #704826
>>704821
Preg_replace.
Интересно, а как ты собрался удалять пробелы с помощью mb_substr?
#159 #704831
>>704790
бамп
Конфиги и прочую хуйню за меня сделал опенсервер.
#160 #704832
>>704821

str_replace, strtr тоже подойдут.
>>704835
#161 #704835
>>704832

>Если не нужны сложные правила поиска/замены (например, регулярные выражения), использование этой функции предпочтительнее preg_replace().


Неплохо, спасибо.

Анон выше с preg_replace
#162 #704861
>>704790
Почему ты выбрал именно постгрес? Судя по вопросу, тебе лучше начать с изучения SQL, у ОПа были задачи и список полезной информации
https://gist.github.com/codedokode/10539213
>>704872
#163 #704872
>>704861
На РАБоте проект на пхп 5.6+yii2 + postgres.
Надо освоить по-быстрому основы.
>>704965
#164 #704882
>>704790

Надо писать подробности ошибки хотя бы. Как тебе помочь если неясно что за ошибка? Ну и кусочек кода где она происходит, запостить.
>>704925
165 Кб, 1920x1080
#165 #704925
>>704882
Что меня сделать, чтобы пхп знал об этой функции?
Что дать в аргументы, чтобы подключиться к бд справа?(users)

Fatal error: Call to undefined function pg_connect() in
>>704965
#166 #704965
>>704925
Наверное нужно сначала установить модуль для postgres и настроить php.ini.
Загугли по тексту ошибки.
Так как стоит говносборка под виндяхой, там могут быть свои особенности.

>>704872
Как устроился с таким уровнем знаний? По знакомству?
>>704970
#167 #704970
>>704965
Стажировка же.
43 Кб, 1206x244
#168 #704996
Как правильно удалять куки? В оф.мануале приводится странный пример
http://php.net/manual/ru/function.setcookie.php#example-4954
с выставлением пустой строки для значения и отрицательного времени жизни.

Хотя вроде бы достаточно передать только один параметр (имя куки)
setcookie('name') для ее удаления.
Айсберги?

Кстати, все php-программисты выглядят как чувак на пике? Я думал тут одни стеснительные омежки тщедушного телосложения, гуглю форумы, а там половина авок с лысыми мордатыми мужиками в солнцезащитных очках, отдыхающих в теплых странах. Или это новый тренд вместо желтого колобка?
42 Кб, 480x300
#169 #705016
>>704996

>на верника

>>705023
#170 #705023
>>705016
Голоснул с этого
>>704996

>отдыхающих в теплых странах


Их теплые страны больше похожи на речку в черте города. Хотя с зарплатой в 25-35 к можно себе позволить раз в год скататься в турцию или ещё куда. Я лично успешности в их фотках не вижу, только ожирение, облысение и не самую хорошую работу в их возрасте.
>>705025
#171 #705025
>>705023

В тред перезванивающих с этим.
>>705034
#172 #705034
>>705025
Чего бомбишь? Ты большой потный мужик? Я тоже. Давай дружить. © чатбот мейлру

На вопрос про куки ответь лучше.
>>704996
Почему такая странная процедура удаления кук?
Я конечно могу "просто" запомнить последовательность аргументов функции, но хотелось бы понимать, почему так происходит.
>>705042>>705609
#173 #705040
Это не чат! Пожалуйста не флудит
Ви таки хотите сказать, что при треде до сих пор не возникло конфы воннаби-погромистов?
Ну или хотя бы общесосачевской какой-нибудь. Неужели нет? Я вот почему-то ничего о подобном не слышал. Это странно.
>>705041>>705609
#174 #705041
>>705040
Возникали и не раз. О чем можно общаться в конфе программистов? Тем более в этом треде их по пальцам можно пересчитать, большинство еще только стремящиеся.
#175 #705042
>>705034
Что странного? Ты меняешь время жизни кук. Как только время истекло браузер удалит их. Сам ты их не удаляешь, этим занимается браузер. time() - возвращает текущее время в секундах. Значит если ты хочешь чтобы куки жили например 5 секунд, то ты передаешь time() + 5. time() - 5 будет значить что время истекло пять секунд назад. В примере задается один час (3600 сек = 60 мин * 60 сек), чтобы НА ВЕРНИКА.
#176 #705109
Насоветуйте библиотек на все случаи жизни.

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

Что конкретно нужно:
работа с базой (такие библиотеки называются ORM?), желательно на основе data mapper, а не странного active record, как в yii. Доктрина? Большая и страшная, буду конечно стараться осиливать в будущем. Может чего попроще?

Валидация форм. То же самое, symfony form пока слишком хардкорный.

Хеширование. Генерация соленых паролей и т.д.
Может потом еще что вспомню.

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

Пишу на слиме, знаю еще юи, но во-первых он слишком большой для сервиса в несколько страниц, во-вторых хочется развиваться и узнавать что-то новое.
>>705607
14 Кб, 681x280
Нубятня и SQL #177 #705129
Пагни, подскажите, как простейший SQL-запрос оформить?
Есть две таблицы: продажи и товары. У товаров разная цена, начиная с определённой даты. Нужно сделать запрос, который будет сопоставлять цену товара с актуальной на момент продажи. У меня получилась такая хуйня:

`SELECT *
FROM R
LEFT JOIN (
SELECT TOP 1 Date, ID
FROM SP
WHERE SP.ID=R.ID
AND SP.Date<=R.Date
ORDER BY SP.Date
) SP2 ON (SP2.ID=R.ID)
;`

Естественно внутренний SELECT вообще не в курсе, что такое R.ID, потому что я лох и так низя.

На пикрелейтеде пример содержимого и то, что должно получиться.
>>705291
#178 #705173
Зандстра хорош. Очень неплох. Крайне доволен и рекомендую.
Анон какой-то смотрит видеоуроки по ООП - лучше Зандстру наверни, базарю, ещё захочешь, поцене 38 рублей.
>>705208
#179 #705208
>>705173
Купил в бульбастане за 38 * 10^4 себе бумажную копию.
#180 #705232
Привет анон.Мои знания html/css/js на уровне копипаста и правки бутстрапа, php читал по книжкам, практики нет.Недавно потерял работу, и решил заняться yii2. Принципы построения приложения по мвс понял, а дальше просто мраки. Вроде и могу построить какой-то бложик, но это и так делают на вордпресах. Короче на хер никому не нужен с такими знаниями и кушать хочется. Время ограничено, нужно принимать решение.
Посоветуйте, может перепрыгнуть пока на cms типа друпала и дорости немного, или у всех так туго идет обучение?
>>705262>>705605
#181 #705237
возьмите на работу, сделаю вам еще одного котика на оп пик.
>>705605
#182 #705259
Конструкция вида $а = @$b['i']:
Это моветон?
>>705267>>705291
#183 #705262
>>705232
Делай задачи из оп поста.
Это как раз Джун левел
#184 #705267
>>705259
@ лишь подавляет сообщение об ошибке.
Конечно, моветон.
#185 #705291
>>705259
Тяжело написать isset?

>>705129
Да он не совсем простейший.
Если перефразировать: нужно найти значение по ближайшей меньшей дате по сравнений с данной.
Интересная задача, у меня пока не получается.
>>705296>>705441
#186 #705296
>>705291
При чём там isset, 0_о
>>705304
#187 #705304
>>705296
@ проигнорирует ошибку если элемента с индексом i в массиве $b не существует. А с помощью isset ты можешь проверить, существует ли такой элемент массива, и если существует - присвоить значение переменной $a.
#188 #705310
>>705304
А, вот ты к чему.
Все верно, спасибо.

Я мимо был
#189 #705339
>>703954

>У кого-нибудь есть решение задачи про список студентов?



Бамп вопросу.
>>705605
#190 #705346
>>703954
Найди реализацию mvc в php, разберись как она работает. Затем напиши сам небольшой двух страничный сайтик. Дальше будет проще. По крайней мере я сейчас таким образом делать первое задание на список студентов.
>>705355
#191 #705355
>>705346
Я уже неделю пытаюсь найти хоть какой нибудь гайд по "напиши сам небольшой двух страничный сайтик", но везде между изучением синтаксиса и "созданием сайтика" огромная пропасть. Так же и в шапке - неделю решаешь задачи в духе "хелловорлд" по синтаксису, не напрягаясь, а потом вдруг "создай сайт с базой данных с применением ООП".

Или ты предлагаешь сидеть неделями и изобретать велосипед вместо того, чтобы просто посмотреть как это грамотно реализуется?
#192 #705379
>>705355
На торрентах вроде есть http://srs.myrusakov.ru/php2?utm_source=Blog.MyRusakov.ru&utm_campaign=php2
Там исходники все в наличии
>>705385>>705415
#193 #705380
>>705355
https://habrahabr.ru/post/150267/
Ну вот например. Всё разжевано, все доступно. Можно скачать себе готовый проект и покопаться в нем.
>>705385
#194 #705385
>>705379
Смищно

>>705380
Спасибо, читну
#195 #705406
>>705304
Просто увидел частое использование такой конструкции в чужом коде
#196 #705415
>>705379
Ну а я понял, что это не шутка, а просто ссылка для удобства.
Сам не смотрел Русакова?
Я чё-то немного прибалдел от того, сколько видеоотзывов к его курсам (2500 или около того).
И при этом положительные, разумеется.
Вот думаю посмотреть его как-нибудь.
Его так-то и купить можно будет, если курсы толковые и человек заслуживаетю
Я бы курс у ОПа купил, если бы он продавал.
78 Кб, 604x446
#197 #705426
>>698478
Привет, Оп. У меня студенты. https://github.com/greenTea242/Student-list . Я надеюсь тебе не очень помешает то, что я пересоздал репозиторий. У меня коммит не хотел отправляться через gui гитхаб и я немного поспешил с переустановкой всего и вся...

> if (!empty($searchQuery)) {


> Это плохо что переменная может не существовать. Лучше тогда сделать массив вроде $values[':search'] = .... и передавать его в execute.


Если я буду передавать параметры массивом в ececute, они все будут приняты, как имеющие тип PDO::PARAM_STR (http://php.net/manual/ru/pdostatement.execute.php), а я так не могу, у меня order и limit должны быть явно указаны PDO::PARAM_INT, иначе будет ошибка. Не понял я тут твой совет, опиши подробней, что ты имел ввиду сделать.

> define('NOTIFY', $notify);


>Что это? константа это не переменная которая может принимать лббые значения. Более того непонятно зачем дублировать переменную константой.


Ты мне в позапрошлом утонувшем треде когда я первый раз выкладывал проект посоветовал сделать следующее:

> if (!empty($notify) == "registred") (мой код)


> Кстати можно сделать нотификации константами


Ну я вот неправильно и отреагировал. Как это правильно сделать?

> Что это такое? Нельзя править сторонние библиотеки. Во-первых, теперь бутстрап невозможно обновить, не потеряв изменения, во-вторых, как я должен догадаться что ты что-то там поменял? Никогда так не делай.


Я ничего не правил в коде бутстрапа, я положил бутстрап файлы в отдельную папку от моего css и все.

> Тут есть риск из-за того что диалект регулярок в HTML5 и в PHP вроде как не совпадает. Соответственно легко при редактировании кода получить не работающую на клиенте регулрку. Возможно стоит сдеалать по 2 версии регулярки или еще что-то придумать.


Чем? Все элементы которые я использовал, есть и в html5 паттернах, и в php регулярках.

> Тут полностью скопипащен огромный кусок кода с шапкой и подвалом. Ты ведь не первый день в нашем треде, наверно слышал что копипаста самое плохое что может сделать программист.


>>703567
>>703549
Шапку подправил как мне посоветовали тут. Форму поиска тоже вынес отдельно. На счет подвала не понятно, у меня он вроде разный. Алсо вопрос. Вот у меня два раза повторяется строка <p><a href="<?=$_SERVER['PHP_SELF']?>">Показать всех абитуриентов.</a></p>, но в том и смысл, что это всего лишь одна строка. Ее тоже выносить отдельно и инклюдить?

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

> оздаем уникальный идентификатор. если абитуриент впервые на сайте


> Это не требуется - mysql умеет это делать, почему не исплоьзуешь auto_increment?


Я решил удалить abiturientID из модели, потому что я не мог его получать до до добавления в базу и необходимость хранить его в модели отпало. Поэтому до добавления в базу вместо него используется пустое значение, а после – я достаю его из куки и добавляю в отдельную от модели переменную. Из-за этого пришлось переписать некоторый код, например в валидатор теперь передается кука, потому что она нужна в методе checkEmail, когда студент редактирует свою анкету и при поиске надо исключать его поле с email, потому что оно уже есть в базе.
78 Кб, 604x446
#197 #705426
>>698478
Привет, Оп. У меня студенты. https://github.com/greenTea242/Student-list . Я надеюсь тебе не очень помешает то, что я пересоздал репозиторий. У меня коммит не хотел отправляться через gui гитхаб и я немного поспешил с переустановкой всего и вся...

> if (!empty($searchQuery)) {


> Это плохо что переменная может не существовать. Лучше тогда сделать массив вроде $values[':search'] = .... и передавать его в execute.


Если я буду передавать параметры массивом в ececute, они все будут приняты, как имеющие тип PDO::PARAM_STR (http://php.net/manual/ru/pdostatement.execute.php), а я так не могу, у меня order и limit должны быть явно указаны PDO::PARAM_INT, иначе будет ошибка. Не понял я тут твой совет, опиши подробней, что ты имел ввиду сделать.

> define('NOTIFY', $notify);


>Что это? константа это не переменная которая может принимать лббые значения. Более того непонятно зачем дублировать переменную константой.


Ты мне в позапрошлом утонувшем треде когда я первый раз выкладывал проект посоветовал сделать следующее:

> if (!empty($notify) == "registred") (мой код)


> Кстати можно сделать нотификации константами


Ну я вот неправильно и отреагировал. Как это правильно сделать?

> Что это такое? Нельзя править сторонние библиотеки. Во-первых, теперь бутстрап невозможно обновить, не потеряв изменения, во-вторых, как я должен догадаться что ты что-то там поменял? Никогда так не делай.


Я ничего не правил в коде бутстрапа, я положил бутстрап файлы в отдельную папку от моего css и все.

> Тут есть риск из-за того что диалект регулярок в HTML5 и в PHP вроде как не совпадает. Соответственно легко при редактировании кода получить не работающую на клиенте регулрку. Возможно стоит сдеалать по 2 версии регулярки или еще что-то придумать.


Чем? Все элементы которые я использовал, есть и в html5 паттернах, и в php регулярках.

> Тут полностью скопипащен огромный кусок кода с шапкой и подвалом. Ты ведь не первый день в нашем треде, наверно слышал что копипаста самое плохое что может сделать программист.


>>703567
>>703549
Шапку подправил как мне посоветовали тут. Форму поиска тоже вынес отдельно. На счет подвала не понятно, у меня он вроде разный. Алсо вопрос. Вот у меня два раза повторяется строка <p><a href="<?=$_SERVER['PHP_SELF']?>">Показать всех абитуриентов.</a></p>, но в том и смысл, что это всего лишь одна строка. Ее тоже выносить отдельно и инклюдить?

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

> оздаем уникальный идентификатор. если абитуриент впервые на сайте


> Это не требуется - mysql умеет это делать, почему не исплоьзуешь auto_increment?


Я решил удалить abiturientID из модели, потому что я не мог его получать до до добавления в базу и необходимость хранить его в модели отпало. Поэтому до добавления в базу вместо него используется пустое значение, а после – я достаю его из куки и добавляю в отдельную от модели переменную. Из-за этого пришлось переписать некоторый код, например в валидатор теперь передается кука, потому что она нужна в методе checkEmail, когда студент редактирует свою анкету и при поиске надо исключать его поле с email, потому что оно уже есть в базе.
>>712598
#198 #705441
>>705291

>Если перефразировать: нужно найти значение по ближайшей меньшей дате по сравнений с данной. Интересная задача, у меня пока не получается.


Вот в итоге (если интересно):

SELECT R.*,
( SELECT TOP 1 Cost
FROM SP
WHERE SP.ID=R.ID
AND SP.Date<=R.Date
ORDER BY SP.Date DESC
) AS Price
FROM R;
>>705603
#199 #705457
Аноны, прошел гайд, умею решать задачи на ПХП очень резво. Но я не делал задачи на студентов и т.д., т.к. приверженец "фундаментального" обучения. В общем, господа, посоветуйте книжек по ПХП (Зандстру стоит читать, как руководство по ООП?).
Я нашел книгу "Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript и CSS", вроде норм, показано, как все это говнецо крутится между собой.
Еще мне посоветовали "PHP исчерпывающее руководство", но они примерно одинаково выглядят. Что стоит из этих двух читнуть?
Не могу я взять и сделать задачи, боюсь, что полезу смотреть чужой код. Это если что.
#200 #705461
>>705457
И если что, не ругайтесь на меня, а то я боюсь, что на меня выльют помои.
#201 #705462
>>705457

>Зандстру стоит читать, как руководство по ООП?


Да. Сейчас читаю, хорошая книга, все ООП с нуля описывается. У него там еще и про шаблоны проектирования, деплоинг и тестирование хорошо написано, попробуй, еще захочешь. Там выше анон который читал тоже его рекомендовал.
>>705470
#202 #705470
>>705462
Спасибо, мне по ООП еще советовали Совершенный код. У меня здоровенный план по чтению, сейчас завершаю первую треть, берусь за Совершенный код и алгоритмы, но я хочу на будущее (на лето) книжку, которую можно читнуть по ПХП не по ООП, а именно по стаку технологий, чтобы знать, как сделать сайт. А то не хочется велосипеды делать.
>>705603
#203 #705479
>>705457
Оо, ты - это я.
Как раз сейчас читаю Зандстру (выше его неистово рекомендовал), а Никсона с "Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript и CSS" пока отложил (у меня пока нет возможности настроить среду для разработки, как только настрою - пойду дальше; там с определённого момента без тестирования кода никак).
А на ООП решал задачи? У ОПа неплохие задачи и на ООП, я только вот две первые решил, но вторую совсем криво, уже отруган и возьмусь на выходных за переделывание.
#204 #705518
Как правильно коммитить в гит?
Стремиться каждый коммит делать для отдельного файла, или логически группировать?
Вот я добавил кой-какой функционал на сайт. Изменения были внесены во все части mvc: созданы модели (связанные с ними мапперы, хелперы), добавлено получение некоторых данных в контроллере, вывод этих данных в представлении (верстка).
Мне это все одним коммитом делать или по кусочкам? Если по кусочкам, то какие имена давать коммитам?

Хотя думается мне это временная проблема. Это сейчас файлики содержат по пару сотен строк, а в реальном большом приложении один класс будет занимать наверное тысячу, так что внести изменения сразу в кучу файлов не получится, над одним классом можно работать полдня и не закончить.
>>705525
#205 #705525
>>705518

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

В случае если в проекте исопльзуется багтрекер - стоит добавлять номер задачи.

Также, часто в описание добавляют теги вроде [bugfix], [feature] и тд.

Пост https://habrahabr.ru/post/183646/
>>705552
#206 #705552
>>705525
Превьюшки ведь тоже затронут кучу файлов из отдельных частей приложения, и модель, и
генератор-обертка над gd, и может быть какой-нибудь сервис, и верстка шаблона под них.
Значит таки по зоне ответственности? Ок, я понял, группировать изменения по смыслу и следить
за согласованностью (выражаясь языком транзакций), чтобы код был работоспособным в каждом
коммите.

Назрело еще несколько вопросов.

1. Папка vendor и ей подобные нужны ли в репозитории?
Содержимое понятно что не нужно. А вот сама папка с гиткипом?
Я пока слабо ориентируюсь в правах, вроде композер способен сам создать эту папку?
То же самое касается папки кеша и логгера.
Гитигноры добавлять в репозиторий? Если не добавить, тому кто клонирует и присоединится
к разработке все равно придется добавить гитигнор. С другой стороны возможно он
будет работать в другом редакторе, который оставляет после себя другой мусор.
Например phpstorm создает .idea, нетбинс что-то анологичное, гедит и вимы если не ошибаюсь
временные файлы с тильдой на конце.

2. При провале валидации формы мы подставляем в нее введенные пользователем значения.
Пароля это касается? Да, понятно что input[type=password], и его видно не будет, но
его видно из кода страницы и из js.
Сценарий: пользователь вбивает логин и пароль, но его не пускает, потому что мы выставили
сумасшедшее регулярное выражения для проверки имейла. Пользователь делает несколько попыток,
затем психует и уходит. Например из интернет-клуба или из дома приятеля.
Страница с введенным паролем осталась открытой.
Думаю все-таки не подставлять значение.
Хотя иногда задалбывает вбивать длинный пароль по несколько раз, но безопасность
превыше всего.

3. О, еще по поводу вот этой галочки remember me.
Получается я не смогу сделать ее активной по-умолчанию, потому что в таком случае пользователю
придется ее каждый раз снимать.
Тут есть два варианта: либо выставлять это значение по стандартному алгоритму форм в зависимости
от данных пользователя <input type="checkbox" name="remember" value="{{ form.remember }}">
Тогда при первом заходе понятно дело инпут будет задисейблен. Пользователю только первый раз
придется выставить эту галку (я например постоянно забываю), дальше при неправильном заполнении
его выбор будет запомнен.
Либо проставить статично <input type="checkbox" name="remember" checked>.
Тогда галка будет стоять по-умолчанию, но пользователю желающему разлогиниться автоматически,
придется каждый раз ее снимать при неправильном заполнении формы.
#206 #705552
>>705525
Превьюшки ведь тоже затронут кучу файлов из отдельных частей приложения, и модель, и
генератор-обертка над gd, и может быть какой-нибудь сервис, и верстка шаблона под них.
Значит таки по зоне ответственности? Ок, я понял, группировать изменения по смыслу и следить
за согласованностью (выражаясь языком транзакций), чтобы код был работоспособным в каждом
коммите.

Назрело еще несколько вопросов.

1. Папка vendor и ей подобные нужны ли в репозитории?
Содержимое понятно что не нужно. А вот сама папка с гиткипом?
Я пока слабо ориентируюсь в правах, вроде композер способен сам создать эту папку?
То же самое касается папки кеша и логгера.
Гитигноры добавлять в репозиторий? Если не добавить, тому кто клонирует и присоединится
к разработке все равно придется добавить гитигнор. С другой стороны возможно он
будет работать в другом редакторе, который оставляет после себя другой мусор.
Например phpstorm создает .idea, нетбинс что-то анологичное, гедит и вимы если не ошибаюсь
временные файлы с тильдой на конце.

2. При провале валидации формы мы подставляем в нее введенные пользователем значения.
Пароля это касается? Да, понятно что input[type=password], и его видно не будет, но
его видно из кода страницы и из js.
Сценарий: пользователь вбивает логин и пароль, но его не пускает, потому что мы выставили
сумасшедшее регулярное выражения для проверки имейла. Пользователь делает несколько попыток,
затем психует и уходит. Например из интернет-клуба или из дома приятеля.
Страница с введенным паролем осталась открытой.
Думаю все-таки не подставлять значение.
Хотя иногда задалбывает вбивать длинный пароль по несколько раз, но безопасность
превыше всего.

3. О, еще по поводу вот этой галочки remember me.
Получается я не смогу сделать ее активной по-умолчанию, потому что в таком случае пользователю
придется ее каждый раз снимать.
Тут есть два варианта: либо выставлять это значение по стандартному алгоритму форм в зависимости
от данных пользователя <input type="checkbox" name="remember" value="{{ form.remember }}">
Тогда при первом заходе понятно дело инпут будет задисейблен. Пользователю только первый раз
придется выставить эту галку (я например постоянно забываю), дальше при неправильном заполнении
его выбор будет запомнен.
Либо проставить статично <input type="checkbox" name="remember" checked>.
Тогда галка будет стоять по-умолчанию, но пользователю желающему разлогиниться автоматически,
придется каждый раз ее снимать при неправильном заполнении формы.
#207 #705561
>>702800 (OP)
Сах, пышники.
pHp годен для фриланса? А если отбросить сайтоёбство? Есть у него другие задачи и хватает ли такой работы?
>>705574
#208 #705571
Ребяты, я тут курсач делал. HTML+PHP, рега, авторизация, вопросы для тестов из БД дергать и результаты туда же записывать. Это как бы преамбула.

Все показалось относительно простеньким, ~350 строк кода на плюсах я бы так просто не родил. Отсюда вопрос - в какую сторону продолжать копать с пыхой? Чтоб фрилансом хотя бы тысяч 15-20 делать в месяц, в нашей мухосрани это приличные деньги.
#209 #705572
>>705571
В сторону вордпресса и других цмс. Нужно к ним уметь писать модули\править готовый говнокод. Так же нужно будет уметь хорошо верстать из макета\править готовую верстку. Фреймворки уже по желанию, если хочешь брать крупные заказы. Про минусы фриланса рассказывать не буду, тред не об этом. Если интересно, спроси в соседнем нытик-треде или в /wrk/.
#210 #705574
>>705561
Годен. Отбрасывать не надо, php для сайтов и делался. Других задач нет, работы хватает.
>>705576
#211 #705576
>>705574
Спс.
Да я просто вообще не хочу сайты делать. Не люблю это.
>>705596
#212 #705578
>>705571

>Все показалось относительно простеньким


Потому что говнокод написал, с кучей дыр и багов, плохой архитектурой, и отображение скорее всего перемешанно с логикой. На таком уровне писать, да, просто.

>350 строк кода на плюсах я бы так просто не родил


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

>Чтоб фрилансом хотя бы тысяч 15-20 делать в месяц


Уроки опа все сделай, без проблем сможешь фриланс выполнять.
>>705596
#213 #705581
>>705552
Ты слишком много значения коммитам придаешь. Коммит это просто сохранение текущего статуса, можно делать когда угодно. Для важных релизов есть тэги или новые бранчи. Если с другими людьми работаешь, общее правило такое - не пушить ничего, что другим их код сломает, выноси в отдельные ветки.
>>705594
#214 #705594
>>705581

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

И это обычно не требует каких-то особых затрат труда. Если у тебя задача занимает несколько часов, нет никаких проблем ее сделать, протестировать и только потом коммитить.

А в чем выгода "коммитить когда хочешь"? Я не вижу выгоды в твоем подходе.
>>705854
#215 #705596
>>705578

Ой, мы код не видели, не стоит его оценивать. Но конечно быстро все тонкости разработки приложений вряд ли изучишь, и те кто проскакивают важные темы или учатся по учебникам "PHP за 24 часа" многое теряют и вряд ли смогут над чем-то серьезным работать.

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

>>705578

пара тысяч вряд ли. У меня наверно не выйдет.

>>705576

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

>>705571

Мне кажется надо знать то что написано в ОП посте:

> Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

>>705851
#216 #705600
>>705552

> Превьюшки ведь тоже затронут кучу файлов из отдельных частей приложения, и модель, и


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

> и следить


> за согласованностью (выражаясь языком транзакций), чтобы код был работоспособным в каждом


коммите.
Да, толкьо без фанатизма - результат все же важнее расивой истории.

А вообще, посмотри коммиты в других проектах:

Slim https://github.com/slimphp/Slim/commits/3.x
Doctrine https://github.com/doctrine/doctrine2/commits/master
PHP https://github.com/php/php-src/commits/master
Chromium https://chromium.googlesource.com/chromium/chromium/
Android Base https://android.googlesource.com/platform/frameworks/base/
(проекты вроде Хромиума или Андроида содержат десятки репозиториев, а для их сборки нужно порядка 100 Гб места на жестком диске и много терпения).
Node js https://github.com/nodejs/node/commits/master

Они на английском, но тем не менее ты можешь просто потыкать там и посмотреть как все организовано.

У гуглеров еще есть код-ревью - изменения в код должны проверить 2 других человека: https://codereview.chromium.org/

Вообще, полезно смотреть как устроены другие проекты - можно что-то полезное подчерпнуть.

> Пароля это касается? Да, понятно что >input[type=password], и его видно не будет, но


> его видно из кода страницы и из js.


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

Аналогичная ситуация с файлами - при повторном выводе формы файлы теряются. Это конечно на мой взгляд недоработка со стороны HTML- лучше бы за сохранение данных отвечал браузер.

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

ну и при использовании аякса обе проблемы решаются сами собой.

> О, еще по поводу вот этой галочки remember me.


При неправильном заполнении формы лучше конечно сохранять ее состояние.

> либо выставлять это значение по стандартному алгоритму форм в зависимости


> от данных пользователя


Да, только твой код неправильный - изучи как работают чекбоксы в HTML, что хранит value и как управлять галочкой.

> придется каждый раз ее снимать при неправильном заполнении формы.


Это плохая идея по моему
#216 #705600
>>705552

> Превьюшки ведь тоже затронут кучу файлов из отдельных частей приложения, и модель, и


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

> и следить


> за согласованностью (выражаясь языком транзакций), чтобы код был работоспособным в каждом


коммите.
Да, толкьо без фанатизма - результат все же важнее расивой истории.

А вообще, посмотри коммиты в других проектах:

Slim https://github.com/slimphp/Slim/commits/3.x
Doctrine https://github.com/doctrine/doctrine2/commits/master
PHP https://github.com/php/php-src/commits/master
Chromium https://chromium.googlesource.com/chromium/chromium/
Android Base https://android.googlesource.com/platform/frameworks/base/
(проекты вроде Хромиума или Андроида содержат десятки репозиториев, а для их сборки нужно порядка 100 Гб места на жестком диске и много терпения).
Node js https://github.com/nodejs/node/commits/master

Они на английском, но тем не менее ты можешь просто потыкать там и посмотреть как все организовано.

У гуглеров еще есть код-ревью - изменения в код должны проверить 2 других человека: https://codereview.chromium.org/

Вообще, полезно смотреть как устроены другие проекты - можно что-то полезное подчерпнуть.

> Пароля это касается? Да, понятно что >input[type=password], и его видно не будет, но


> его видно из кода страницы и из js.


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

Аналогичная ситуация с файлами - при повторном выводе формы файлы теряются. Это конечно на мой взгляд недоработка со стороны HTML- лучше бы за сохранение данных отвечал браузер.

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

ну и при использовании аякса обе проблемы решаются сами собой.

> О, еще по поводу вот этой галочки remember me.


При неправильном заполнении формы лучше конечно сохранять ее состояние.

> либо выставлять это значение по стандартному алгоритму форм в зависимости


> от данных пользователя


Да, только твой код неправильный - изучи как работают чекбоксы в HTML, что хранит value и как управлять галочкой.

> придется каждый раз ее снимать при неправильном заполнении формы.


Это плохая идея по моему
#217 #705603
>>705470

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

>>705457

> Создаем динамические веб-сайты с помощью PHP,


Ты можешь почитать но это книга из серии пхп за 24 часа, ничему нормальному она не научит.

Зандстру почитать наверно стоит.

>>705441

Я не понял что ты хочешь но чтобы найти максимальную/минимальную дату у каждого товара можно использовать группировку и к ней потом джойнить таблицу чтобы получить цену в этот день.

решение с подзапросами - не уверен что такое хорошее, оно обычно читается хуже и дает меньше возможностей оптимизатору. Хотя это конечно проверять надо.

>>705355

У нас есть такой промежуточный урок: https://github.com/codedokode/pasta/blob/master/soft/web-server.md

Увы, там не все, что надо.

по идее тебе надо изучить основы HTTP, HTML, работу с формами, куки, основы SQl, PDO. И тогда ты будешь во всеоружии чтобы браться за студентов. В самих студентах подробные комментарии к задаче - ты их смотрел?

Также, чтобы решать студентов, надо изучить ООП, например на задачах про Вектор и Кошек-Мышек.
#217 #705603
>>705470

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

>>705457

> Создаем динамические веб-сайты с помощью PHP,


Ты можешь почитать но это книга из серии пхп за 24 часа, ничему нормальному она не научит.

Зандстру почитать наверно стоит.

>>705441

Я не понял что ты хочешь но чтобы найти максимальную/минимальную дату у каждого товара можно использовать группировку и к ней потом джойнить таблицу чтобы получить цену в этот день.

решение с подзапросами - не уверен что такое хорошее, оно обычно читается хуже и дает меньше возможностей оптимизатору. Хотя это конечно проверять надо.

>>705355

У нас есть такой промежуточный урок: https://github.com/codedokode/pasta/blob/master/soft/web-server.md

Увы, там не все, что надо.

по идее тебе надо изучить основы HTTP, HTML, работу с формами, куки, основы SQl, PDO. И тогда ты будешь во всеоружии чтобы браться за студентов. В самих студентах подробные комментарии к задаче - ты их смотрел?

Также, чтобы решать студентов, надо изучить ООП, например на задачах про Вектор и Кошек-Мышек.
#218 #705605
>>705339

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

>>705304

@ плохо так как он игнорирует вообще любые ошибки- например если в $b не массив или $b вообще не существует. Не пишите так. С таким подходом ты сделаешь приложение с кучей труднообнаружимых ошибок.

>>705237

Тут же не тред работодателей. Да и котик это конечно хорошо, но боюсь для программиста требуется чуть больеш навыков.

>>705232

Чтобы разбираться в Юи, надо ковырять его документацию, исходники. Надо знать ООП, MVC, паттерны работы с БД и другие вещи. Быстро это не освоить.
#219 #705607
>>705109

> работа с базой (такие библиотеки называются ORM?),


Нет ORM кроме доктрины. То есть они есть, но у них всех что-то не хватает. Доктрина самая универсальная так как позволяет замапить любые объекты на любую базу.

Но было бы неплохо сделать обзор. Заходи на

http://phptrends.com/
https://packagist.org/
http://pronskiy.com/php-digest/

Ищи там по словам ORM, database, data mapper и тжд. Возьми допустим 5 самых популярных библиотек и сделай обзор с плюсами и минусами. Может тогдатебе выбор станет очевиден. Ну и я смогу прокомментирвоать наверно.

> Валидация форм.


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

Тут надо понимать что некоторые компоненты намертво встроены в фреймворки - например то, что в юи выбрать из него не выйдет. А из симфони - можно.

> Хеширование. Генерация соленых паролей


Поищи. В php5.6 кстати есть стандартные функции для этого.

> А, вот еще, мне нужно чтобы пользователь вводил текст с возможностью простого форматирования


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

- тегов
- атрибутов у тегов
- протоколов ссылок в href/src (чтобы пользователь не вставил data или яваскрипт-ссылку)

Единственный нормальный способ это сделать - это распарсить HTML в дерево ДОМ, обойти дерево, фильтруя элементы и атрибуты, и собрать новый HTML. ты можешь увидеть людей, пытающихся делат это регулярками - это заведомо провальный подход.

Есть библиотеки для этого:

- http://htmlpurifier.org/
- kses (не работал с ним не знаю как он устроен)

Запомни еще раз:

- нужно парсить код в ДОМ
- нужен белый, а не черный список
- нужно проверять в том числе ссылки и их формат

Алсо набор способов для обхода фильтра: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

Хороший фильтр защищает от всех из них.
#219 #705607
>>705109

> работа с базой (такие библиотеки называются ORM?),


Нет ORM кроме доктрины. То есть они есть, но у них всех что-то не хватает. Доктрина самая универсальная так как позволяет замапить любые объекты на любую базу.

Но было бы неплохо сделать обзор. Заходи на

http://phptrends.com/
https://packagist.org/
http://pronskiy.com/php-digest/

Ищи там по словам ORM, database, data mapper и тжд. Возьми допустим 5 самых популярных библиотек и сделай обзор с плюсами и минусами. Может тогдатебе выбор станет очевиден. Ну и я смогу прокомментирвоать наверно.

> Валидация форм.


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

Тут надо понимать что некоторые компоненты намертво встроены в фреймворки - например то, что в юи выбрать из него не выйдет. А из симфони - можно.

> Хеширование. Генерация соленых паролей


Поищи. В php5.6 кстати есть стандартные функции для этого.

> А, вот еще, мне нужно чтобы пользователь вводил текст с возможностью простого форматирования


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

- тегов
- атрибутов у тегов
- протоколов ссылок в href/src (чтобы пользователь не вставил data или яваскрипт-ссылку)

Единственный нормальный способ это сделать - это распарсить HTML в дерево ДОМ, обойти дерево, фильтруя элементы и атрибуты, и собрать новый HTML. ты можешь увидеть людей, пытающихся делат это регулярками - это заведомо провальный подход.

Есть библиотеки для этого:

- http://htmlpurifier.org/
- kses (не работал с ним не знаю как он устроен)

Запомни еще раз:

- нужно парсить код в ДОМ
- нужен белый, а не черный список
- нужно проверять в том числе ссылки и их формат

Алсо набор способов для обхода фильтра: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

Хороший фильтр защищает от всех из них.
#220 #705609
>>705034
>>704996

Куки удаляют выставлением даты далеко в прошлом. Также, на всякий пожарный, ставим еще пустое значение.

В фреймвлрках обычно есть функция для этого.

Вот почитай http://citforum.ru/internet/html/cookie.shtml

>>705040

Есть что-то там slack/php-2ch или как-то так, спроси в прикрепленном или в гитхаб-треде.

>>704437

Никак. Надо использовать шаблонизатор. Алсо, ты забыл про htmlspecialchars для защиты от XSS.

Алсо, надо избегать огромных массивов сложной структуры, это запутывает код.
>>707916
#221 #705851
>>705596

>те кто проскакивают важные темы или учатся по учебникам "PHP за 24 часа" многое теряют и вряд ли смогут над чем-то серьезным работать


Пыхокотачую в общих чертах.
Но в качестве общего знакомства или, наоборот, закрепления изученного - очень полезны такие пошаговые руководства, как у того же Никсона.
Как полезно и разбирать задачи совсем нубов и середнячков в этих же тредах: лишний раз всё повторяешь, учишься на чужих ошибках, вырабатываешь привычку стремиться к оптимальности в программировании.
Верю в это.
#222 #705854
>>705594

>А в чем выгода "коммитить когда хочешь"? Я не вижу выгоды в твоем подходе.


В том, что другие члены команды могут продолжить твою работу из любой точки разработки, ты можешь в любое время делать pull кода остальных и мерджить, небольшие неправильные изменения проще откатить, чем целую большую фичу, над которой несколько часов работал (у самого так несколько раз было). Вообще с кодом проще работать становится, можно много экспериментировать, не боясь сломать что-то. Про внятные пояснения так и есть, они нужны, но эти пояснения делаются и на маленьких коммитах в любое время. Сделал небольшое изменение - описал смысл - закоммитил. А вот чтобы откатиться на предыдущую ревизию, для этого и есть ветки, делаешь ветку под свою фичу и мерджишь ее остальным только когда фича готова.
>>706399
#223 #705908
>>703134
У меня как-то так получилось:
for ($i = 0; $i <= 10; $i++){
$sum = $i $i;
echo "<br/>$i
$i = $sum";
}
Первый день в ПХП
>>705953
#224 #705953
>>705908
Запускать пробовал? Синтаксическая ошибка в строке 4.
>>705955
#225 #705955
>>705953
Сорри, в строке 2.
>>706044
#226 #706044
>>705955
Сорян, с разметкой наебался.
Запускать пробовал http://ideone.com/zoYf8l
>>706399
#227 #706107
Может кто-нибудь объяснить как с помощью композера сделать автозагрузчик с неймспейсами по psr-4? Я сделал через classmap, но с ним нужно после добавления нового класса обновлять загрузчик. Почитал в гайде, но ничего не понял.
#228 #706110
>>702800 (OP)
Имеется файл index.php. В нем как Пхп код, так и Хтмл код. Как выставить кодировку, чтобы в браузере отображался корректный текст, а не иероглифы?
>>706113
#229 #706113
>>706107
Ткни конкретно, что из написанного непонятно:
https://getcomposer.org/doc/04-schema.md#psr-4

"Monolog\\": "src/"
Где Monolog это корневой неймспейс твоего проекта, а папка src соответствует неймспейсам второго уровня.
Например App\Model\User.
Структура директорий должна быть такой: в папке src (или app, называй как хочешь) должна быть папка Model, в папке Model файл User.php. В файле User.php как ни странно class User. Неймспейс файла User.php
namespace App\Model; без слеша перед корневым неймспейсом (перед App).

dump-autoload нужно делать всегда, когда добавляешь новый файл-класс. Хоть через classmap, хоть psr4.

>>706110
1. Сохранить файл в кодировке utf-8 без BOM.
2. В html коде всегда ставить тег
<meta charset="utf8">
3. Если там только php-код без html, функция header('Content-Type: text/html; charset=utf-8"); в начале файла (это важно).
12 Кб, 525x225
#230 #706115
>>706113
Я все это делаю, но все равно иероглифы.
>>706134>>706136
#231 #706121
>>706113

>dump-autoload нужно делать всегда, когда добавляешь новый файл-класс


Тогда я вообще не понял зачем нужен композер. Я ведь могу через __autoload() сделать загрузчик, который будет искать файл класса в нужной директории и мне не нужно будет его заново переписывать каждый раз когда добвлю новый класс.
>>706134>>706399
#232 #706134
>>706115
Скриншот чего на пике?
Если браузера, то у тебя еще сервер не обрабатывает php-скрипт, потому что не установлен php. А сервер хоть установлен?
Что в адресной строке? http://localhost/.../index.php или file:///С:\sborka_name\...\index.php?

Или это блокнот (неполноценный текстовый редактор)?
Если блокнот, то он сохраняет вместе с BOM байтами, что препятствует работе с заголовками в php.
Хотя если стоит meta, все должно отображаться правильно.

>>706121
Я не знаю. Лично для меня не составляет огромного труда набрать в консоли composer dump-autoload после добавления нового класса, это занимает 5 секунд.
Смысл копипастить свой корявый автозагрузчик в каждый проект, если есть композер, который и так используется для подключения и обновления библиотек.
>>706143
#233 #706136
>>706115
Cам файл в студию
#234 #706143
>>706134
Это файл, открытый в браузере. Если открывать с помощью сервера, то все работает. Я понял ошибку.
>>706399
#235 #706147
>>706107
Юзай готовый загрузчик, зачем тебе писать свой велосипед. Подтягиваешь его композером в проект, потом make autoloader выполняешь и все, все твои классы подгружены. У меня вообще дополнительной командой в makefile к команде запуска тестов прикручен, каждый раз как тесты запускаю, все автозагрузчики обновляются.
>>706184>>706399
#236 #706148
Пишу в нетбинсе, хочу сделать отладку проекта. При отладке к url дописывается параметры xdebug'а, которые всё ломают. Можно как-то совершать отладку без лишних параметров в url?
>>706149>>706412
#237 #706149
>>706148
Можно, расширение для xdebug в браузер поставь и пропиши ide key от нетбинса в нем.
>>706163
#238 #706163
>>706149
Это я сделал, но как пользоваться не разобрался. При запуске отладки всё также переходит на страницу с XDEBUG_SESSION_START.
>>706401>>706409
#239 #706184
>>706147
Про makefile можно поподробнее?
Так, а если мы всё это делаем ради того, чтобы не подключать классы бесконечными require, то какой от этого выигрыш, если в итоге нужно будет писать use'ы в таком же количестве?
#240 #706208
>>706184
use не обязательно писать, это всего лишь псевдоним, чтобы не писать полный неймспейс.

Если нужно несколько раз например создать новый объект, то чтобы не писать
$test1 = new \AppName\Path\Test;
...
$testN = new \AppName\Path\Test;
можно один раз поставить use \AppName\Path\Test;
Тогда можно будет обращаться просто new Test.
В данном примере впрочем очевидно удобнее было использовать паттерн Фабрика.

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

Я имею ввиду такую ситуацию.
Например нужно залогинить пользователя.
В глобальном коде у тебя будет только что-то вроде
$loginManager->login($user);
Конструкция use понадобится только для создания экземпляров класса LoginManager и User. И то не обязательно, можно прописать полный неймспейс.
Внутри метода login выполняется куча других действий, обращение к множеству классов. Например там явно понадобится модель пользователя, обращение к базе (маппер), возможно какой-нибудь хелпер для генерации хеша и еще 100500 классов.
Для них не нужен use в главном файле (в index.php допустим у нас это дело происходит).
А вот если бы не было автозагрузки, то да, для абсолютно всех классов, к которым идет обращение во всех вложенных методах, пришлось бы писать require в файле index.php.

use \AppName\Path\Test; // теперь можно обращаться к классу просто Test
\AppName\Path\Test as Foobar; // псевдоним
>>706412
Сумма Прописью #241 #706281
ОП, проверь в очередной раз задачу, пожалуйста.

> function inclineWord. Также, ты не учел в этой функции что для чисел 11-19 используется другое окончание: 11 котов, а не 11 кот.



В этой функции это учтено

>Собирать текст по словам удобнее, складывая слова в массив.



С расстановкой пробелов, если не ошибаюсь, всё нормально.

http://ideone.com/XIoqxy
>>712599
182 Кб, 480x360
#242 #706294
Только что прошелся по туториалу на сайте ZF2, скопипастил пошагово тот несчастный круд, пытаясь вникнуть в суть происходящего, и понял что нихуя не понял. Может есть туториалы попроще или по таким вещам набрать знаний можно только в офисе? Потому что я, если честно, прифигел.
>>706323>>706412
#243 #706319
>>706184
Makefile выглядит примерно так:
autoloader:
$(PHP_BIN) $(AUTOLOADER) -b $(SOURCE) -n -o $(SOURCE)/autoload.php $(SOURCE) $(VENDOR)/package/src $(VENDOR)

test_unit: autoloader
@echo "+++ Run unit tests with coverage +++"
$(PHPUNIT) -c tests/unit/config/$(env)phpunit.xml $(ARGS)

Require не будет никаких, ты просто выполняешь make test_unit, и у тебя генерируется autoload.php со всеми подключенными классами из твоего проекта и всех подтянутых через composer пакетов в /vendor. Use будет, да. Просто в начале каждого класса до объявления класса стоит use namespace\ClassName с теми классами, которые ты у себя в классе используешь. Require нигде не надо будет писать, у тебя для этого autoload.php сгенерированный уже, который через spl_autoload_register все нужное подключает.
>>706412
643 Кб, Webm
#244 #706322
Привет, PHP-тредик и ОП, я выкладывал пару недель назад класс Announcement на рецензию.

Пока что я не слишком крутой, чтобы переписать его, но я решил новую задачу через ООП, прочитав треть книги Зандстра про ООП.

Смысл: есть html-странички сайта по единому шаблону, до этого правились руками. Разные в них только контент и title, грубо говоря.
Задача: В одной папке теперь лежат сами страницы (по факту, там лежат файлы с php-массивом $scope, где лежит вся разница). В другую папку нужно положить их статические версии, натянув на них шаблон. Шаблон - чистый html со вставками {key}, где key - ключ массива scope.

Вот клиентский код:
$pageCollection = PageCollectionFactory::getPagesByFolder(PAGES_FOLDER);
$pageCollection->applyTemplate(new Template(TEMPLATE_FILE));
$pageCollection->writeToFiles(CACHE_FOLDER);

Укажите на ошибки в классах, пожалуйста.
#245 #706323
>>706294
Лучше с Zend 1 начни, там попроще все устроено, потом на ZF2 перейдешь. А вообще советую книги по Zend1 скачать, там для начинающих подробно все разжевывается. Руководство по Zend немного запутанное в этом плане, оно больше для уже разобравшихся в структуре подходит. Офис помогает, но не нужен, Zend можно и самому освоить.
#246 #706328
>>706322
И еще.

Класс PageCollection наследует ArrayObject. Я хотел прикрутить какую-никакую валидацию, и переопределил метод append как

public function append(Page $page) {

parent::append($page);

}

PHP на это ругается: Strict Standards: Declaration of PageCollection::append() should be compatible with ArrayObject::append($value).
То есть PHP не нравится, что я нарушаю принцип полиморфизма. Но с другой стороны - разве потомок не должен быть более узкоспециализированным?
Если я перепишу это, кидая исключение, если page не instanseof Page, разве это не будет хуже?
>>706347>>706412
#247 #706345
>>704387
То есть, по идее, мне только и нужно, что вставить весь код внутрь класса, сделав это всё одним из методов?
Спасибо, немного просветлело в голове.
Зандстра помогает тоже.
>>708328
#248 #706347
>>706328
Потомок должен реализовывать тот же интерфейс, что и родитель, иначе будет нарушение прицнипа L в SOLID. У тебя все твои потомки должны крутиться в foreach цикле и выдавать один и тот же результат, если какой-то потомок это нарушает и в цикле на одном из методов кидает Exception, где другие этого не делают, то это уже не потомок, а отдельный независимый класс со своими собственными методами.
>>706351
#249 #706351
>>706347
Но ведь, грубо говоря, я делаю типизированную коллекцию, как в Ява.
И Ява кинет мне исключение несовместимого типа, если я попытаюсь засунуть туда что-то другое.
>>706362
#250 #706362
>>706351
Ты наследуешь от ArrayObject. Этим ты даешь понять всем, что твой объект ArrayObject. А потом убираешь один из методов ArrayObject и заменяешь своей левой реализацией. Этот класс у тебя уже не ArrayObject, ты не можешь его использовать там, где у тебя другие классы типа ArrayObject используются. Либо пиши другие методы и отдельный интерфейс для них, либо не наследуй от ArrayObject.
>>706363>>706372
#251 #706363
>>706362
Алсо лучший вариант - используй композицию.
>>706372
#252 #706367
>>706322
Ой, я же поехавший, я ссылку на пастбин забыл.
http://pastebin.com/Yd7infNJ
>>706378
#253 #706372
>>706362
Окей, понял.
Энивей, вручную реализовывать интерфейсы ArrayObject, чтобы написать свой класс, чтобы всего лишь принимать более узкоспециализированный параметр - как-то громоздко.
PHP нужны типизированные коллекции.

>>706363
Но разве коллекция чего-либо - это не композиция в чистом виде?
>>706384
#254 #706378
>>706367

> $newPagesArray = $this->getArrayCopy();


Бредово. Ты делаешь копию всех страниц? Зачем? Тут можно и без этого.

>writeToFiles($destination)


Зачем коллекции страниц знать про destination? Это не ее функция. Писать должен Writer, он и должен получать destination параметром или сам его содержать в подклассе.

> PageWriter::getInstance($page, $destination)->write();


Writer через dependency injection передаваться должен, зачем тебе привязка коллекции страниц к конкретному Writerу?
>>706496
#255 #706384
>>706372

>Но разве коллекция чего-либо - это не композиция в чистом виде?


Это уже внутренний функционал ArrayObject, он тебя тут не интересует. Если тебе просто нужно использовать ArrayObject, ты его и вешаешь через композицию в конструкторе, и используешь в своем классе вместо parent::метод там $this->конкретныйобъект->метод. В своем классе тогда можешь какие хочешь методы реализовывать.
>>706496
#256 #706399
>>705854

Ну не знаю, на практике мелкие коммиты получаются с бессмысленными описаниями вроде "правки верстки".

>>706044

Хорошее решение, только вот \n в начале ставить нелогично. Перевод строки логичнее ставить в конце.

>>706107

Указываешь имена неймспейсов и папок с файлами в autoload -> psr-4

> Я сделал через classmap, но с ним нужно после добавления нового класса обновлять загрузчик.


Потому что он не для этого. Он для старых библиотек которые не следуют psr-0 или psr-4.

Почитай про автозагрузку в композере, либо документацию, либо нагугли перевод.

>>706113

> dump-autoload нужно делать всегда, когда добавляешь новый файл-класс


Нет. Только если используется classmap или оптимизация. Для psr-4 не нужно.

>>706121

Не нужно.

>>706143

Да, браузер не умеет исполнять PHP код. Он только умеет отображать HTML, текст, картинки.

>>706147

Какие make? Ты о чем? Это все не требуется.

> У меня вообще дополнительной командой в makefile к команде запуска тестов прикручен, каждый раз как тесты запускаю, все автозагрузчики обновляются.


Ты что-то делаешь неправильно.
#256 #706399
>>705854

Ну не знаю, на практике мелкие коммиты получаются с бессмысленными описаниями вроде "правки верстки".

>>706044

Хорошее решение, только вот \n в начале ставить нелогично. Перевод строки логичнее ставить в конце.

>>706107

Указываешь имена неймспейсов и папок с файлами в autoload -> psr-4

> Я сделал через classmap, но с ним нужно после добавления нового класса обновлять загрузчик.


Потому что он не для этого. Он для старых библиотек которые не следуют psr-0 или psr-4.

Почитай про автозагрузку в композере, либо документацию, либо нагугли перевод.

>>706113

> dump-autoload нужно делать всегда, когда добавляешь новый файл-класс


Нет. Только если используется classmap или оптимизация. Для psr-4 не нужно.

>>706121

Не нужно.

>>706143

Да, браузер не умеет исполнять PHP код. Он только умеет отображать HTML, текст, картинки.

>>706147

Какие make? Ты о чем? Это все не требуется.

> У меня вообще дополнительной командой в makefile к команде запуска тестов прикручен, каждый раз как тесты запускаю, все автозагрузчики обновляются.


Ты что-то делаешь неправильно.
>>706404
96 Кб, 807x738
#257 #706401
>>706163
Памагитя! Хочу отлаживать.
#258 #706404
>>706399

>Какие make? Ты о чем? Это все не требуется.


>Ты что-то делаешь неправильно.


Нет, все правильно. Делаю make autoloader или make test_unit - он находит все новые обновленные классы через подключенный из композера автозагрузчик, делает их список с путями и кладет в autoloader.php. Также для всех классов из vendor. В итоге вполне ясная структура в autoloader.php, можно в любое время глянуть, что и откуда загружается, гадать не приходится. На весь проект один autoloader.php, он один раз подключается в bootstrap через require.
>>706414>>706416
#259 #706409
>>706163
Поставь другое расширение. И debug в нем нажать не забудь, может кнопку просто включить забыл.
#260 #706412
>>706148

Можно ставить куку, но это менее удобно. Ну и странный у тебя код что от одного GET параметра все ломается. ЧТо если его пользователь или еще кто-то припишет?

>>706184

use руками писать не надо - есть плагины к текстовым редакторам которые их сами вставляют. И ИДЕ должны уметь это делать.

Разница в том что require подключает файл а use лишь позволяет сокращенно указывать имя класса вместо полногог имени.

Вообще, почитай-ка мой урок, я это объяснял все: https://github.com/codedokode/pasta/blob/master/php/autoload.md

>>706208

> В данном примере впрочем очевидно удобнее было использовать паттерн Фабрика.


А по моему цикл и массив :) Фабрику обычно используют когда надо создавать разные классы (фабрика производящая элементы формы разных типов) или когда надо дать возможность менять тип создаваемых объектов извне (передавая другую фабрику).

>>706294

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

Ты пишешь что прошелся по туториалу. А документацию по всем использованным в нем классам и компонентам ты читал?

>>706319

Немного странный код.

$(AUTOLOADER) - что это?

в случае phpunit, код инициализации можно вызвать из bootstrap.php, а параметры указать в phpunit.xml.

Также, не очень понимаю зачем тут makefile - shell скрипт наверно было бы проще написать.

> Require не будет никаких, ты просто выполняешь make test_unit, и у тебя генерируется autoload.php со всеми подключенными классами из твоего проекта и всех подтянутых через composer пакетов в /vendor


Какие это дает преимущества перед PSR-4 автозагрузчиком? По моеум отсутсвие необходимости генерировать скрипт ускоряет запуск тестов.

Ты знаешь про psr-4 и автозагрузку? Что-то у меня ощущение что ты там велосипед изобрел.

>>706322

Ты про XSLT не слышал? Он позволяет наверно решить твою задачу несколькими строчками кода.

По ООП сказать ничего нельзя так как у тебя тут 3 строчки. Но как минимум странно что коллекция занимается записью в файлы или их преобразованием. Ведь задача коллекции - хранить другие объекты, а не записывать что-то в файлы. Ну или ты неудачно назвал класс.

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

Я бы сделал так:

$content = Util::loadContent(...);
$template = file_get_contents(..);

$processor = new PageProcessor;
$processor->apply($content, $template);

или так:

$t = new Template($template);
$result = $t->apply($content);

Ну а дальше уже можно усложнять в зависимости от того как там эта задача реализуется.

>>706328

Не, так нельзя. Придется писать свой класс с массивом внутри.
#260 #706412
>>706148

Можно ставить куку, но это менее удобно. Ну и странный у тебя код что от одного GET параметра все ломается. ЧТо если его пользователь или еще кто-то припишет?

>>706184

use руками писать не надо - есть плагины к текстовым редакторам которые их сами вставляют. И ИДЕ должны уметь это делать.

Разница в том что require подключает файл а use лишь позволяет сокращенно указывать имя класса вместо полногог имени.

Вообще, почитай-ка мой урок, я это объяснял все: https://github.com/codedokode/pasta/blob/master/php/autoload.md

>>706208

> В данном примере впрочем очевидно удобнее было использовать паттерн Фабрика.


А по моему цикл и массив :) Фабрику обычно используют когда надо создавать разные классы (фабрика производящая элементы формы разных типов) или когда надо дать возможность менять тип создаваемых объектов извне (передавая другую фабрику).

>>706294

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

Ты пишешь что прошелся по туториалу. А документацию по всем использованным в нем классам и компонентам ты читал?

>>706319

Немного странный код.

$(AUTOLOADER) - что это?

в случае phpunit, код инициализации можно вызвать из bootstrap.php, а параметры указать в phpunit.xml.

Также, не очень понимаю зачем тут makefile - shell скрипт наверно было бы проще написать.

> Require не будет никаких, ты просто выполняешь make test_unit, и у тебя генерируется autoload.php со всеми подключенными классами из твоего проекта и всех подтянутых через composer пакетов в /vendor


Какие это дает преимущества перед PSR-4 автозагрузчиком? По моеум отсутсвие необходимости генерировать скрипт ускоряет запуск тестов.

Ты знаешь про psr-4 и автозагрузку? Что-то у меня ощущение что ты там велосипед изобрел.

>>706322

Ты про XSLT не слышал? Он позволяет наверно решить твою задачу несколькими строчками кода.

По ООП сказать ничего нельзя так как у тебя тут 3 строчки. Но как минимум странно что коллекция занимается записью в файлы или их преобразованием. Ведь задача коллекции - хранить другие объекты, а не записывать что-то в файлы. Ну или ты неудачно назвал класс.

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

Я бы сделал так:

$content = Util::loadContent(...);
$template = file_get_contents(..);

$processor = new PageProcessor;
$processor->apply($content, $template);

или так:

$t = new Template($template);
$result = $t->apply($content);

Ну а дальше уже можно усложнять в зависимости от того как там эта задача реализуется.

>>706328

Не, так нельзя. Придется писать свой класс с массивом внутри.
>>706496
#261 #706414
>>706404

Какая выгода писать гиганский classmap?

Композер вообще-то умеет по моему дампить список классов - там есть опция "оптимизировать автозагрузчик" и она это делает. Если я не ошибаюсь, получается ты написал велосипед.

> можно в любое время глянуть, что и откуда загружается, гадать не приходится.


Это обычно и так очевидно, если соблюдать конвенции вроде psr-4.
#262 #706416
>>706404

> --optimize-autoloader (-o): Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but can take a bit of time to run so it is currently not done by default.



https://getcomposer.org/doc/03-cli.md

Вот-вот, ты написал велосипед.
>>706439
#263 #706429
>>706322

Погоди, ты там написал 5 классов только чтобы обернуть один вызов strtr? Почитай-ка https://habrahabr.ru/post/153225/
>>706496
#264 #706434
Анон, ты уже покаялся за программинг на богомерзком? Если не, вперед на быдгохабр, доказывать, что слабая динамическая типизация это хорошо, отсутствие логики и тонны легаси стандартной библиотеки тоже гуд: https://habrahabr.ru/post/280730/
>>706466
#265 #706437
>>706322

И прочитай еще тут пункт 6: https://habrahabr.ru/post/230737/
>>706496
#266 #706439
>>706416
Хорошая функция, не знал про такую. Надо попробовать.
#267 #706459
Что-то я не понял, как в третьем слиме рендерить страницу 404.
Пробовал так
http://pastebin.com/zVLtNSRE
не реагирует, все равно та же самая страница по-умолчанию.
>>706465>>706475
#268 #706465
>>706459
Попробуй сразу возвращать $c['view']->render().
>>706479
#269 #706466
>>706434

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

> Да-да, в PHP оператор присваивания "=" либо клонирует данные, либо передает их по ссылке в зависимости от того, данные какого типа следуют за оператором. Однажды пришлось тушить сидушку моего кресла, когда в сложной системе, где на ходу меняются типы, причиной бага оказалось именно эта «особенность» и я потратил полдня на дебаг.



Так же как и в яваскрипте например. Ну и автор по моему не читал мануал, раз не знает что массивы копируются.

Вообще, вопросы копирования или передаче по ссылки по моему есть везде (надо будет в своем учебнике это осветить получше). Например в Яве новички часто делают ошибку, пытаясь скопировать строку через = или сравнить через == (копируется и сравнивается лишь ссылка на объект). Хуже, там есть боксинг/анбоксинг. Ты кладешь в коллекцию число, а получаешь объект Integer - ни разу не весело.

Вот типичная проблема жителей "первого мира":http://stackoverflow.com/questions/960431/how-to-convert-listinteger-to-int-in-java

> Интересно, что мы не можем проверить тип $num в char ООП'шным способом: «function char(integer $num)», хотя этот integer в системе есть.


В PHP7 можно. Алсо, в Яваскрипте, Руби, Питоне - вообще нельзя никак.

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


Можно использовать шаблонизатор. Или не делать подключение к базе из шаблона.

> В других языках программирования за это светит синтаксическая ошибка.


В других языках встроенной шаблонизации нет вообще.

Вот что плохо в шаблонгизации в PHP - отсутствие встроенного экранирования - автор почему-то это не упомянул.

> За это время мимо меня прошло куча модных альтернатив, типа Ruby (on rails) или NodeJS


Каждая из которых хуже PHP так как не имеет ни нормального ООП, ни тайп-хинтинга. Кроме того в Руби быдлокодинг (monkey-patching) является стандартным приемом при написании кода, пруф: https://habrahabr.ru/company/Voximplant/blog/269467/

ну и насколько я знаю, в Руби он рейлс очень много статических методов и глобального состояния, то есть того за что часто ругают код на пхп.

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

Ну и наконец на малоизвестных платформах вроде какой-нибудь closure мало разработчиков и есть шанс повысить себе зарплату, "продав лопату" инвестору. Про лопату - это из золотой лихорадки, когда больше всех в итоге заработали продавцы лопат. В нашей сфере веб-разработки очень много торговли лопатами, когда разрабочик прекрасно понимает что продукт не взлетит, но не беспокоится по этому поводу.
#269 #706466
>>706434

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

> Да-да, в PHP оператор присваивания "=" либо клонирует данные, либо передает их по ссылке в зависимости от того, данные какого типа следуют за оператором. Однажды пришлось тушить сидушку моего кресла, когда в сложной системе, где на ходу меняются типы, причиной бага оказалось именно эта «особенность» и я потратил полдня на дебаг.



Так же как и в яваскрипте например. Ну и автор по моему не читал мануал, раз не знает что массивы копируются.

Вообще, вопросы копирования или передаче по ссылки по моему есть везде (надо будет в своем учебнике это осветить получше). Например в Яве новички часто делают ошибку, пытаясь скопировать строку через = или сравнить через == (копируется и сравнивается лишь ссылка на объект). Хуже, там есть боксинг/анбоксинг. Ты кладешь в коллекцию число, а получаешь объект Integer - ни разу не весело.

Вот типичная проблема жителей "первого мира":http://stackoverflow.com/questions/960431/how-to-convert-listinteger-to-int-in-java

> Интересно, что мы не можем проверить тип $num в char ООП'шным способом: «function char(integer $num)», хотя этот integer в системе есть.


В PHP7 можно. Алсо, в Яваскрипте, Руби, Питоне - вообще нельзя никак.

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


Можно использовать шаблонизатор. Или не делать подключение к базе из шаблона.

> В других языках программирования за это светит синтаксическая ошибка.


В других языках встроенной шаблонизации нет вообще.

Вот что плохо в шаблонгизации в PHP - отсутствие встроенного экранирования - автор почему-то это не упомянул.

> За это время мимо меня прошло куча модных альтернатив, типа Ruby (on rails) или NodeJS


Каждая из которых хуже PHP так как не имеет ни нормального ООП, ни тайп-хинтинга. Кроме того в Руби быдлокодинг (monkey-patching) является стандартным приемом при написании кода, пруф: https://habrahabr.ru/company/Voximplant/blog/269467/

ну и насколько я знаю, в Руби он рейлс очень много статических методов и глобального состояния, то есть того за что часто ругают код на пхп.

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

Ну и наконец на малоизвестных платформах вроде какой-нибудь closure мало разработчиков и есть шанс повысить себе зарплату, "продав лопату" инвестору. Про лопату - это из золотой лихорадки, когда больше всех в итоге заработали продавцы лопат. В нашей сфере веб-разработки очень много торговли лопатами, когда разрабочик прекрасно понимает что продукт не взлетит, но не беспокоится по этому поводу.
>>706481>>706485
#270 #706475
>>706459

Изучи код - как вызывается твой обработчик и что происходит с результатом. Может он и не вызывается вовсе.
>>706499
#271 #706479
>>706465
Не помогло. И смысл возвращать без статуса?

Погуглил,
http://stackoverflow.com/questions/32668156/slim-3-how-to-add-404-template
тоже не помогает. И что за TwigExtension? Зачем он тут?

Может тупо редиректить с 403 статусом на специально подготовленную страницу?
$c['notFoundHandler'] = function ($c) {
return function (Request $request, Response $response) use ($c) {
return $response->withStatus(404)->withHeader('Location', '/not_found');
};
};

И это не помогает. Как будто вообще не реагирует на то что я пишу.

О, вот нашел какое-то хардкорное решение с советом переопределить класс, надо попробовать
http://help.slimframework.com/discussions/problems/10851-how-to-add-404-template-in-slim-3
>>706501
#272 #706481
>>706466

>В нашей сфере веб-разработки очень много торговли лопатами, когда разрабочик прекрасно понимает что продукт не взлетит, но не беспокоится по этому поводу.



Это и не задача разработчика. Для этого есть менеджеры, product ownerы и высшее руководство, которые и должны правильно принимать все бизнес-решения по продукту. Разработчик сообщает им всю возможную информацию по срокам разработки, проблемам с архитектурой, техническим долгом, возможным будущим проблемам с расширяемостью. У нормального управленца видение проекта в целом должно быть лучше чем у разработчика, поскольку у него доступ к множеству других областей помимо самого программирования.
Если менеджеры некомпетентны и не могут с учетом всей стекающейся к ним информации спланировать адекватные бизнес-требования, грамотно распланировать разработку, и продукт не взлетает, то вины разработчика тут вообще нет. Так что разработчик правильно делает, что не беспокоится.
>>706501
#273 #706485
>>706466

>Унылый вброс. Не названо реальных недостатков, видимо человек плохо знает язык.


Я, например, пишу на питоне, а пхп не знаю вообще, тем не менее, пару напишу:
-слабая динамическая типизация
-ад и хаос в глобальном неймспейсе из-за кучи легаси-слоев. Как и в случае крестов, для вменяемого кода нужно знать, какое безопасное подмножество из этого говна использовать.
-хуевая работа с памятью для долгоживущих процессов (в пхп видимо нинужно)

>Вот типичная проблема жителей "первого мира"


Просто нужно брать нормальные язычки под ЖВМ

>В других языках встроенной шаблонизации нет вообще.


В скале есть edsl под это. Шаблоны проверяются на стадии компиляции, так то.

>Каждая из которых хуже PHP так как не имеет ни нормального ООП, ни тайп-хинтинга


В ноде можно использовать ES6+ с человеческими классами, декораторами, генераторами, и даже async/await, для аннотации типов есть от JSDoc до Flow и Typescript. Прекрасная альтернатива. Раби не жупал. В 3м Питоне сильная динамическая типизация и тайпхинтинг из коробки.
>>706501>>706548
#274 #706496
>>706378

>Ты делаешь копию всех страниц? Зачем?


И правда. Переписал через неявный итератор.

>Зачем коллекции страниц знать про destination? Писать должен Writer


Ты прав, по идее Writer должен принимать и PageCollection, и Page.
Как мне лучше это реализовать? Всегда принимать PageCollection и заворачивать Page в него?

>Writer через dependency injection передаваться должен


А если я передаю Writer то, что он должен написать?
Так же лучше, нет?

>>706384
Теперь точно понял, спасибо.
Реализовать все методы через __call, проверяя их наличие у ArrayObject, будет хорошей практикой?

>>706412

>Ты про XSLT не слышал?


Распарсить шаблон, обойти его, найти все, что {[^}]+} ?
str_replace проще же.

>Но как минимум странно что коллекция занимается записью в файлы или их преобразованием.


Да, плохо. Я перепишу, но пока не знаю, как.

>Я бы сделал так:


Первый пример странный какой-то, Util::loadContent какая-то неинтуитивная вещь.
Второй пример нраица.
Но я бы хотел оперировать сразу всеми страницами, а не крутить в клиентском коде циклы. Это плохо?

>>706429
Ну елки, то используй ООП, то не используй.

>>706437

>И прочитай еще тут пункт 6:


Если я реализую template как html со вставками php-переменных, мне придется инклудить его, ob_start(), ob_get_contents(), зачем, ради чего?
PHP шаблонизатор, но тут с ним было бы сложнее. Я не одну страницу вывожу, а много. И не на STDOUT, а черт его знает куда.
#274 #706496
>>706378

>Ты делаешь копию всех страниц? Зачем?


И правда. Переписал через неявный итератор.

>Зачем коллекции страниц знать про destination? Писать должен Writer


Ты прав, по идее Writer должен принимать и PageCollection, и Page.
Как мне лучше это реализовать? Всегда принимать PageCollection и заворачивать Page в него?

>Writer через dependency injection передаваться должен


А если я передаю Writer то, что он должен написать?
Так же лучше, нет?

>>706384
Теперь точно понял, спасибо.
Реализовать все методы через __call, проверяя их наличие у ArrayObject, будет хорошей практикой?

>>706412

>Ты про XSLT не слышал?


Распарсить шаблон, обойти его, найти все, что {[^}]+} ?
str_replace проще же.

>Но как минимум странно что коллекция занимается записью в файлы или их преобразованием.


Да, плохо. Я перепишу, но пока не знаю, как.

>Я бы сделал так:


Первый пример странный какой-то, Util::loadContent какая-то неинтуитивная вещь.
Второй пример нраица.
Но я бы хотел оперировать сразу всеми страницами, а не крутить в клиентском коде циклы. Это плохо?

>>706429
Ну елки, то используй ООП, то не используй.

>>706437

>И прочитай еще тут пункт 6:


Если я реализую template как html со вставками php-переменных, мне придется инклудить его, ob_start(), ob_get_contents(), зачем, ради чего?
PHP шаблонизатор, но тут с ним было бы сложнее. Я не одну страницу вывожу, а много. И не на STDOUT, а черт его знает куда.
#275 #706497
>>706496

>А если я передаю Writer то, что он должен написать?


Почему мне нужно передавать объекту Writer, а не объект Writer'у?

Вот что я хотел спросить.
>>706502
#276 #706499
Помогло создание своего класса-наследника NotFound.
Но это по-обезьяньи, я понимаю. Надо разобраться что происходит на низком уровне.

>>706475

>Изучи код


Ты так говоришь, как будто это так просто.
Как изучить код? Откуда начинать читать, какой файл смотреть?
Мне пока пришло в голову только выполнить поиск по слову 'notFoundHandler' в папке vendor.
Навело на класс
https://github.com/slimphp/Slim/blob/3.x/Slim/DefaultServicesProvider.php#L147
Но это вроде не то, там только присваивается значение по-умолчанию, если в контейнере не задан параметр 'notFoundHandler'.

Дальше не знаю куда смотреть.
>>706506
#277 #706501
>>706479

Что за бред ты пишешь? Как можно редиректить при ошибке 403? При ошибке ты должен отдать хттп код ошибки, а если ты делаешь редирект то это будет код 302, а не 404.

Я тебе уже выше написал - изучай код и проверяй вызывается ли твой обработчик вообще, скорее всего нет.

>>706481

Не всегда, тем более в стартапе, структура с кучей менеджеров и аналитиков. Часто бывает заказчик + тимлид с командой. И команда думает не как сделать успешный проект а как подольше и побольше брать деньги с заказчика. Это и есть торговля лопатами.

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

>>706485

В питоне даже тайп хинтов нет, а приватные поля обозначают подчеркиванием (типа, договорились, пацаны, эти поля не трогаем). Лол.

> ад и хаос в глобальном неймспейсе из-за кучи легаси-слоев.


Хаос это когда есть конфликты имен. В PHP их нету. Какая тебе разница, 100 или 10000 функций в глобальном неймспейсе? Ты пишешь свой код в своем неймспейсе все равно. И скорее всего ты будешь писать не функции, а классы, а там глобальный неймспейс почти пуст.

> работа с памятью для долгоживущих процессов


В PHP есть сборщик мусора. Проблемы могут быть только от быдлокода, например если кто-то логгирует все запросы в массив и никогда его не очищает. Есть более конкретный пример, а не "у нас быдлокодер Вася написал скрипт, и он че-то плохо работал".

> для аннотации типов есть от JSDoc до Flow и Typescript.


JSDOc проверяет типы? Это ведь просто синтаксис комментариев.

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

>>В других языках встроенной шаблонизации нет вообще.


> В скале есть edsl под это. Шаблоны проверяются на стадии компиляции, так то.


Скалу знает 3 с половиной человека, а на пхп куча рахработчиков любого уровня + фреймворки. Уговаривать заказчика взять скалиста = впаривать ему лопаты. Скорее всего его задача дешевле и лучше решится на пхп. А если он поссорится с вконец обнаглевшей командой, он всегда может найти другую, менее жадную.

> В 3м Питоне сильная динамическая типизация и тайпхинтинг из коробки.


Ой, не надо. https://www.python.org/dev/peps/pep-0484/#non-goals

> While the proposed typing module will contain some building blocks for runtime type checking -- in particular the get_type_hints() function -- third party packages would have to be developed to implement specific runtime type checking functionality,



Этим все сказано - хотим быдлокодить, не хотим проверять типы.
#277 #706501
>>706479

Что за бред ты пишешь? Как можно редиректить при ошибке 403? При ошибке ты должен отдать хттп код ошибки, а если ты делаешь редирект то это будет код 302, а не 404.

Я тебе уже выше написал - изучай код и проверяй вызывается ли твой обработчик вообще, скорее всего нет.

>>706481

Не всегда, тем более в стартапе, структура с кучей менеджеров и аналитиков. Часто бывает заказчик + тимлид с командой. И команда думает не как сделать успешный проект а как подольше и побольше брать деньги с заказчика. Это и есть торговля лопатами.

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

>>706485

В питоне даже тайп хинтов нет, а приватные поля обозначают подчеркиванием (типа, договорились, пацаны, эти поля не трогаем). Лол.

> ад и хаос в глобальном неймспейсе из-за кучи легаси-слоев.


Хаос это когда есть конфликты имен. В PHP их нету. Какая тебе разница, 100 или 10000 функций в глобальном неймспейсе? Ты пишешь свой код в своем неймспейсе все равно. И скорее всего ты будешь писать не функции, а классы, а там глобальный неймспейс почти пуст.

> работа с памятью для долгоживущих процессов


В PHP есть сборщик мусора. Проблемы могут быть только от быдлокода, например если кто-то логгирует все запросы в массив и никогда его не очищает. Есть более конкретный пример, а не "у нас быдлокодер Вася написал скрипт, и он че-то плохо работал".

> для аннотации типов есть от JSDoc до Flow и Typescript.


JSDOc проверяет типы? Это ведь просто синтаксис комментариев.

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

>>В других языках встроенной шаблонизации нет вообще.


> В скале есть edsl под это. Шаблоны проверяются на стадии компиляции, так то.


Скалу знает 3 с половиной человека, а на пхп куча рахработчиков любого уровня + фреймворки. Уговаривать заказчика взять скалиста = впаривать ему лопаты. Скорее всего его задача дешевле и лучше решится на пхп. А если он поссорится с вконец обнаглевшей командой, он всегда может найти другую, менее жадную.

> В 3м Питоне сильная динамическая типизация и тайпхинтинг из коробки.


Ой, не надо. https://www.python.org/dev/peps/pep-0484/#non-goals

> While the proposed typing module will contain some building blocks for runtime type checking -- in particular the get_type_hints() function -- third party packages would have to be developed to implement specific runtime type checking functionality,



Этим все сказано - хотим быдлокодить, не хотим проверять типы.
>>706519
#278 #706502
>>706497
Если объект принимает Writer, объект может вычленять у себя нужные данные и кормить их Writerу, в данном случае передавать странички по одной в Writer. Если Writer принимает объект, то ему нужно знать структуру объекта, а это уже тесная свазанность Writerа с объектом, т.е. Writer должен знать про коллекцию и ее структуру. При изменении структуры коллекции придется менять и Writer.
>>706511
#279 #706506
>>706496

>>Ты про XSLT не слышал?


> Распарсить шаблон, обойти его, найти все, что {[^}]+} ?


> str_replace проще же.


Велосипедист, плиз. XSLT хорош тем что уже написан, содержит кучу библиотеки инструментов, позволяет делать не только тупую вставку (а это рано или поздно понадобится) и код там будет состоять из нескольких строк типа:

- загрузить данные в DOM
- загрузить шаблон в друой ДОМ
- преобразовать
- сохранить результат в файл

> Но я бы хотел оперировать сразу всеми страницами, а не крутить в клиентском коде циклы. Это плохо?


Плохо то что ты пока не понимаешь ООП и просто суешь паттерны, чтобы они были, а не потому что они там дают какие-то преимущества.

Алсо, вот еще статья по теме: https://habrahabr.ru/post/172119/

>>706499

> Как изучить код? Откуда начинать читать, какой файл смотреть?


Слим вроде не такой большой, там можно по названиям файлов догадаться наверно. Ну а вообще, можно смотреть с точки входа ($app->run()), можно искать по словам вроде not found. Где-то же этот хендлер должен браться из контейнера.
>>706515>>706531
#280 #706507
>>706496

>Ну елки, то используй ООП, то не используй.


Обязательно использовать. Код, какой там Маркус написал - практически быдлокод. Он хорош для соревнований, воркшопов, стартапов и прочих мероприятий, где нужна скорость, а не архитектура. Если проект потом расширяется, использовать такой код кошмарно, связанность всего со всем будет жуткая. Код от Бориса не без проблем, но их можно пофиксить, он покрывается юнит тестами, и с ним можно работать большой командой. Он хорошо расширяется. Это в крупных проектах главное, так что я за Бориса.
>>706510>>706515
#281 #706509
>>706496

Также XSLT позволяет хранить данные о странице в удобном файле XML а не в виде PHP кода.
#282 #706510
>>706507

В примере анона неопреадванно писать 5 классов вместо 1 функции с strtr внутри.
>>706515
#283 #706511
>>706502
Хорошо, а если я передаю Writer классу Page и PageCollection, я должен буду реализовать у них метод write(Writer $wr) или даже setWriter(Writer $wr), write().
Получается, что класс странички что-то там выводит, нет?
>>706520
#284 #706515
>>706506
Не знал. Ну ок, у меня срок сдачи этой фигни - еще вчера (да-да, это пойдет в продакшн), у меня нет времени учить новый язык разметки вкупе с XPath.

>Алсо, вот еще статья по теме: https://habrahabr.ru/post/172119/


Это я тоже уже читал.

Каждый раз, когда я думаю, что понял ООП, мне говорят, что я его не понимаю. :(

>>706507
А мой код совсем неисправим?

>>706510
Да что strtr?

strtr заменяет у меня три строки кода:
foreach ($this->handledPage->getPageScope() as $scopeVar => $scopeVal) {

$output = str_replace('{' . $scopeVar . '}', $scopeVal, $output);

}

Да, здесь можно выкинуть это и вставить strtr($output, $this->handledPage->getPageScope()), с условием еще что ключи заранее должны быть обернуты в {}.
>>706522
#285 #706519
>>706501

>В питоне даже тайп хинтов нет, а приватные поля обозначают подчеркиванием (типа, договорились, пацаны, эти поля не трогаем).


Двойное подчеркивание работает как name mangling, снаружи до не го просто так не достучаться. И да, нахуя тебе приватные поля? Джентельменам верят на слово, а бинарных сборок вы не распространяете, карго-культ, ей-богу.

>Ой, не надо.


Вот тебе статический тайпчекер: http://mypy.readthedocs.org/en/latest/introduction.html

>JSDOc проверяет типы?


Проверяет специальная тулза или IDE.

> While the proposed typing module will contain some building blocks for runtime type checking -- in particular the get_type_hints() function -- third party packages would have to be developed to implement specific runtime type checking functionality,


Молодец, твоя цитата из секции Non-Goals. На самом деле:

>This PEP aims to provide a standard syntax for type annotations, opening up Python code to easier static analysis and refactoring, potential runtime type checking, and (perhaps, in some contexts) code generation utilizing type information.


Учись читать.

>майкрософт молодцы


Простое надмножество над JS.

>Какая тебе разница, 100 или 10000 функций в глобальном неймспейсе?


Тем, что стандартная библиотека не структурирована, и пользоваться этим говном без заучивания невозможно.

>В PHP есть сборщик мусора. Проблемы могут быть только от быдлокода,


Покажи мне продакшен-реди вебсокеты на пхп, лол.
>>706526
#286 #706520
>>706511
Нет, ты же можешь использовать dependency injection, передавая Writer в конструктор. Вообще по-хорошему тебе нужен еще один класс - Handler, он будет получать коллекцию и Writer, в методе save() делать foreach для коллекции, передавать полученные странички во Writer, который их и запишет. А Writerу неплохо бы еще иметь некую универсальную структуру, которую он принимает на вход. Тогда хэндлер будет делать мэппинг для страничка->новая структура (тут еще небольшой класс мэппера возможно понадобится), отдавать ее во Writer. Так и Writer, и коллекция, и страничка станут более заменяемыми.
>>706528
#287 #706521

>Скалу знает 3 с половиной человека


Похуй. Скала - нормальный промышленный язык, не какая-то эзотерика. Шаблоны средствами языка есть - факт, а

>В других языках встроенной шаблонизации нет вообще.


- пук в лужу
>>706526
#288 #706522
>>706515

Вот твоя супер-программа:

шаблон = загрузить шаблон ;
для каждого файла в папке {
массив = загрузить данные;
результат = сконвертировать(шаблон, массив);
сохранить в файл;
}

Я тут не вижу ни одного объекта. Объект либо что-то представляет, какую-то сущность, либо делает операции надо другими сущностями. Какие еще фабрики, какие писатели? Наркоман?

Если ты знаешь ООП, объясни необходимость каждого классса и чем твой код на 200 строк лучше кода выше на 10-20 строк.
>>706528
#289 #706526
>>706519

> Вот тебе статический тайпчекер:


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

>>JSDOc проверяет типы?


>Проверяет специальная тулза или IDE.


В динамическом языке ты не можешь просто так проверить типы. Также, непонятно почему я должен покупать дорогую ИДЕ вместо использования любимого редактора.

> Тем, что стандартная библиотека не структурирована, и пользоваться этим говном без заучивания невозможно.


А в Питоне с структурированными модулями ты все функции помнишь наизусть?

> Покажи мне продакшен-реди вебсокеты на пхп, лол.


реакт пхп может? Никогда не приходилось писать что-то на вебсокетах так как они нужны только во всяких порноприложениях .

>>706521

Так как разработчиков мало то писать на ней невыгодно.
>>706533
#290 #706528
>>706520

>передавая Writer в конструктор


А кто сказал, что за время жизни скрипта я не запишу сначала страницу в кэш, а потом отдам юзеру, используя оба врайтера?

Почему тогда действительно я не могу передавать в PageCollectionWriter строго PageCollection?
У Зандастры же ShopProduct и ShopProductWriter.

>>706522
Я же сказал, я не знаю XSLT.
Если ты напишешь, как это конкретно реализуется, раз там 20 строчек, буду благодарен.
>>706534
#291 #706531
>>706506
Вроде разобрался. Вот это место
https://github.com/slimphp/Slim/blob/3.x/Slim/App.php#L455-L456

По умолчанию если пользователем не определен сервис 'notFoundHandler', вернется экземпляр класса NotFound из ядра слима.
https://github.com/slimphp/Slim/blob/3.x/Slim/DefaultServicesProvider.php#L160-L162

Если мы переопределяем этот 'notFoundHandler', то этот метод должен либо возвращать экземпляр класса NotFound (или наследника), либо коллбек, который затем вызывается
$notFoundHandler = $this->container->get('notFoundHandler');
return $notFoundHandler($request, $response);

Поэтому и помогает наследование класса NotFound с переопределением __invoke
parent::__invoke($request, $response);
$this->view->render($response, 'not_found.twig');
return $response->withStatus(404);

Почему эти пидры не написали об этом в документации, а подсунули какой-то имбецильный пример с
->write('Page not found');
http://www.slimframework.com/docs/handlers/not-found.html#custom-not-found-handler

######################
Вообще слегка недоумеваю от происходящего и отношения к процессу обучения в этом треде.
1. Сделай задачу на калькулятор уровня урока по информатике 7-Б в классе для детей с умственными отклонениями. Сделал? Молодец, на тебе котиков))) ты хороший программист.
2. ???
3. Читай исходные коды фреймворков. Пиши йоба-приложения с применением десятка технологий. Люби гусей.

Ладно, не буду мешать господам вести пустопорожние дебаты о тайпхинтах в разных языках.
#291 #706531
>>706506
Вроде разобрался. Вот это место
https://github.com/slimphp/Slim/blob/3.x/Slim/App.php#L455-L456

По умолчанию если пользователем не определен сервис 'notFoundHandler', вернется экземпляр класса NotFound из ядра слима.
https://github.com/slimphp/Slim/blob/3.x/Slim/DefaultServicesProvider.php#L160-L162

Если мы переопределяем этот 'notFoundHandler', то этот метод должен либо возвращать экземпляр класса NotFound (или наследника), либо коллбек, который затем вызывается
$notFoundHandler = $this->container->get('notFoundHandler');
return $notFoundHandler($request, $response);

Поэтому и помогает наследование класса NotFound с переопределением __invoke
parent::__invoke($request, $response);
$this->view->render($response, 'not_found.twig');
return $response->withStatus(404);

Почему эти пидры не написали об этом в документации, а подсунули какой-то имбецильный пример с
->write('Page not found');
http://www.slimframework.com/docs/handlers/not-found.html#custom-not-found-handler

######################
Вообще слегка недоумеваю от происходящего и отношения к процессу обучения в этом треде.
1. Сделай задачу на калькулятор уровня урока по информатике 7-Б в классе для детей с умственными отклонениями. Сделал? Молодец, на тебе котиков))) ты хороший программист.
2. ???
3. Читай исходные коды фреймворков. Пиши йоба-приложения с применением десятка технологий. Люби гусей.

Ладно, не буду мешать господам вести пустопорожние дебаты о тайпхинтах в разных языках.
>>706538>>712600
#292 #706533
>>706526

>Как он работает с кодом, частично не содержащим тайп хинтов? Какой магией он угадает тип значения в перемнной?


Никак, там будет Any, прикинь? Что в питоне, что в жс/тайпскрипте, да хоть где.

>Статический анализ для динамических языков сильно ограничен.


>В динамическом языке ты не можешь просто так проверить типы.


Ну да, ты ниасилил, значит не нужен. К счастью, прогрессивное человечество другого мнения:
https://github.com/python/typeshed
https://www.npmjs.com/package/typings

>ты все функции помнишь наизусть?


Набрал имя модуля, дальше автокомплит, не нужно помнить все говно из глобального неймспейса.

Ладно, не буду тебя больше трогать. Пхп - лучшее, что изобрели, в питоне нет сильной типизации, пхп не течет, вебсокеты не нужны, процедурное говно вместо стандартной библиотеки - норма, как хочешь.
>>706539
#293 #706534
>>706528

>А кто сказал, что за время жизни скрипта я не запишу сначала страницу в кэш, а потом отдам юзеру, используя оба врайтера?


Почему через конструктор, а не setWriter - у тебя тогда в классе определенность в каждый момент, что он получил и что в нем используется. Тебе или другим не надо будет разбираться в коде, достаточно взглянуть на момент создания класса. С setWriter эта определенность теряется, ты уже не знаешь когда и что там юзается, нужно в коде разбираться. Плюс у тебя зависимость от порядка выполнения операций появляется. Т.е. сначала создай класс, потом поставь Writer, потом пиши. Что если кто-то забудет поставить Writer или поставит не тот Writer? В случае конструктора таких ошибок не будет.
>>706540
#294 #706538
>>706531

Логика тут такая: я ответа не знаю, значит надо читать исходные коды, и лучше поручить это тебе чем мне. Тем более что ты не начинающий, а довольно хорошо разбираешься. Вот видишь, ответ нашелся. А если ты действительно что-то не понимаешь, задавай конкретный вопрос по конкретной строчке кода.

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

> Если мы переопределяем этот 'notFoundHandler', то этот метод должен либо возвращать экземпляр класса NotFound (или наследника), либо коллбек, который затем вызывается


В комментарии написано что надо вернуть callable, и они делают свой класс вызываемым за счет invoke. Вполне нормальное решение, которое позволяет использовать как функцию, так и объект. для микрофреймворка ОК, для большого фреймворка лучше было бы сделать строго типизированный интерфейс.

> Поэтому и помогает наследование класса NotFound


Да, так как там довольно много кода и есть обработчики для разных контент-тайпов.

> не написали об этом в документации


наверно документация запаздывает просто
#295 #706539
>>706533

Тайп хинты в PHP проверяются всегда. В питоне - как повезет. это все, что надо знать о тайп-хинтах в нем. Может конечно, тут и есть какие-то преимущества, я думаю, не спроста они так сделали, но ты про них явно не знаешь.

> Набрал имя модуля, дальше автокомплит


В пхп ИДЕ тоже автокомплит, благодаря более строгой типизации он лучше работает.
>>706544>>706545
#296 #706540
>>706534
Так все-таки, чем плохо передавать объект во врайтер, созданный специально для этого объекта?
Должен ли PageCollection вообще что-нибудь знать про Writer?
#297 #706544
>>706539

>Тайп хинты в PHP проверяются всегда.


Работают только в рантайме, и не несут никакой пользы (пытаются лечить родовые проблемы пхп со слабой типизацией), только оверхед. Действительно, такого говна нигде больше нет, только в пхп.
>>706555
#298 #706545
>>706539

>В пхп ИДЕ тоже автокомплит


Не тоже автокомплит, а список говна из глобального неймспейса, акстись.

>благодаря более строгой типизации он лучше работает.


Смешно же
#299 #706548
>>706485

> хуевая работа с памятью для долгоживущих процессов (в пхп видимо нинужно)



А конкретно написать, что там не так с памятью можешь? Так как я никаких проблем не знаю.
>>706550
#300 #706550
>>706555
#301 #706551
Переписал код, починив вопиющую фигню. Теперь коллекция ничего не пишет, пишет врайтер.
http://pastebin.com/ksYTAfyf

Клиентский код теперь такой:

$pageCollection = PageCollectionFactory::getPagesByFolder(PAGES_FOLDER);
$pageCollection->applyTemplate(new Template(TEMPLATE_FILE));

PageCollectionWriter::getInstance($pageCollection, CACHE_FOLDER)->write();

Теперь серьезных ошибок нет?
Тогда завтра пойдет в продакшн, хех
#302 #706553
Кун с XSLT, ты еще здесь?
А поможет ли мне XSLT, если мне надо будет подстановки в plain text?
У тебя какой-то странный черный ящик под названием "сконвертировать", он мне непонятен.

Или пусть будет у меня в DOM большой textNode. Я же по нему все равно str_replace буду ходить, правильно?
Так какая разница, пройти str_replace сразу по всему коду, или распарсить шаблон в DOM, а затем ходить по атрибутам и текстовым узлам тем же str_replace?
>>706557
#303 #706555
>>706544

> Работают только в рантайме


Ну в Питоне они вообще нигде не работают же, типа просто комментарии.

>>706550

Не вижу ни одной ссылки на баг или описание проблемы. Читать стену комментариев из серии "я слышал что кто-то слышал что в пхп плохо с памятью" не вижу смысла. Зачем ты вбрасываешь ссылки которые даже не читаешь сам?
>>706558
#304 #706557
>>706553

Он там генерирует HTML потому ему подойдет. Насчет plain text - не уверен, XSLT это язык для конвертации XML в XML. Но тот же твиг умеет генерировать plain text.
#305 #706558
>>706555

>Ну в Питоне они вообще нигде не работают же, типа просто комментарии.


Работают в IDE и статическом тайпчекере, так же, как в ЖС/TS. В рантайме он нахуй не сдались, особенно при строгой динамической типизации.

> "я слышал что кто-то слышал что в пхп плохо с памятью"


да, все врут, конечно

Странные вы, пхп-фанатики, вместо объективности, делаете из из яп объект культа.
>>706562
#306 #706562
>>706558

>да, все врут, конечно


Прочитай свою ссылку внимательнее, там стоит, что была проблема с garbage collection, но в 5.3 ее исправили, теперь можно юзать и демоном. Впрочем и раньше можно было, если избегать циклических ссылок.
>>706617
#307 #706617
>>706562
Хуйню ты мне говоришь. В любой теме про что-то долгоживущее на пхп первый ответ - "не используйте это, пыха для этого не предназначена". Чтоб выловить всех блох gc, нужно хоть какое-то массовое использование в этом кейса, а этого нет нихуя: вебсокеты на пхп никто не делает, на реактивных фреймворках пишут еще меньше, чем на скале и хачкеле.
32 Кб, 600x396
#308 #706630

>Задача про компанию «Вектор»


Вот это пушка...
#309 #706645
>>702800 (OP)
Что такое дескриптор результирующей таблицы? По-простому в двух словах, пожалуйста.
>>706766>>706829
#310 #706708
Пыханы, решил поступать в бауманку как на второе высшее (по первой я филолог), сам немного умею в кодинг, но решил вышку получить(опыта работы нет, так, для себя кодил). Как идея, норм? куда ещё можно поступить в ДС?
#311 #706715
>>706708
Ты тредом ошибся
#312 #706726
Если у меня формируется название класса в строку и потом по ней вызывается конструктор, то как мне туда неймпспейс добавить?

$class = "someClass";
$object = new $class();

Пробовал так

$class = "myNamespace\someClass";
$object = new $class();

но не работает.
>>706829
#313 #706734
Думаю сделать фабрику контроллеров в mvc для удобства маршрутизации. Хорошая идея или хуйню придумал?
>>706822
#314 #706765
На связибыдло&&говнокодер.
поясните за код. Есть функция в классе которая вызывает, например массив

class Govnoclass {
function vyzovGovna () {
=/=
return $result;
}
}


и это например "модель". И я ее вызову в другом месте
$arr=Govnoclass:vyzovGovna();

теперь $arr массив говна.
А кто то делает так, что объявляет свойство в классе. И ему передает значение. А $arr вызывает уже не метод а свойство с уже заполненным массивом.

class Govnoclass {
public $govneco;
function vyzovGovna () {
=/=
$this->govneco=$result;
}
}

И теперь что бы передать значение надо сначала вызвать метод а потом уже и свойство. и это больше строчек кода писать.
$arr=Govnoclass::vyzovGovna();
$arr=Govnoclass::govneco;

Я правильно понял ведь без вызова говна, свойство говнецо будет null. Так зачем плодить код? Поясните если я идиот.
#314 #706765
На связибыдло&&говнокодер.
поясните за код. Есть функция в классе которая вызывает, например массив

class Govnoclass {
function vyzovGovna () {
=/=
return $result;
}
}


и это например "модель". И я ее вызову в другом месте
$arr=Govnoclass:vyzovGovna();

теперь $arr массив говна.
А кто то делает так, что объявляет свойство в классе. И ему передает значение. А $arr вызывает уже не метод а свойство с уже заполненным массивом.

class Govnoclass {
public $govneco;
function vyzovGovna () {
=/=
$this->govneco=$result;
}
}

И теперь что бы передать значение надо сначала вызвать метод а потом уже и свойство. и это больше строчек кода писать.
$arr=Govnoclass::vyzovGovna();
$arr=Govnoclass::govneco;

Я правильно понял ведь без вызова говна, свойство говнецо будет null. Так зачем плодить код? Поясните если я идиот.
>>706825>>706829
6 Кб, 200x199
#315 #706766
>>706645
бамп
51 Кб, 604x402
#316 #706818
Переделал первую задачу на ООО "Вектор": http://ideone.com/JW3pkH
По ООП ли на этот раз?
Смущает вот что.
Функция getSalary() на выходе даёт массив со всеми нужными нам значениями. А ОП завещал сделать так, чтобы эта функция просто сама по себе выдавала окончательный расчёт зарплаты. Я вник в это и представляю, как это нужно сделать, там ничего сложного: просто один return $salary в этой функции, а остальные нужные нам значения получить с помощью других функций, каждый раз вызывая соответствующую. Это всё вполне естественно и понятно.
Но целесообразен ли мой подход - в одной функции дополнительно хранить результаты работы всех функций и доставать их именно оттуда по мере надобности?
Ведь можно и с помощью getSalary() получить то же количество нормально отработанных часов, если оно нам нужно, и с помощью простого вызова функции getNormalSalary().
В любом случае, это всё кажется сейчас гораздо ближе к ООП, что было у меня в первый раз.
#317 #706820
>>706708
Чтобы на пыхе кодить не нужна бауманка. Любого вуза с айтишной специальностью хватит.
#318 #706822
>>706734
Локаторы юзай.
>>706824
192 Кб, 1366x768
#319 #706823
Ананасы хелп. Я уже заебался просто копаться в коде. Вот скажите какого хуя дегенрат автор темы сделал такие уебанские категории? Блять там эта хуй поймическая полоса снизу рубрики 2, хотя подсвечивается при наведении на рубрику 3. Как сделать стандартные рубрики? Где и как править код? В функции или скрипте? Чтоб одна за одной была категория.
>>712600
#320 #706824
>>706822
Они-то тут как помогут?
#321 #706825
>>706765
Напрямую к свойствам класса обращаться нельзя. В идеале они вообще приватные должны быть все, для получения вовне и существуют методы. Если свойство null, метод в классе может исключение кинуть, тогда использующий метод код будет знать, что что-то пошло не так.
53 Кб, 764x704
4 Кб, 335x58
#322 #706828
Аноны, что не так в этом коде? Тип данных строки status - bit, и тот же самый запрос в редакторе PhpMyAdmin выполняется и обновляет базу.
>>712600
#323 #706829
>>706726
В файле класса неймспейс myNamespace не забыл объявить?

>>706765
Лучше бы конкретный пример привел, в этом говне непонятно что тебе нужно сделать.
Есть смысл сохранять говно в свойство говнокласса, если необходимо возвращать одно и то же говно в нескольких местах.
То есть очевидно лучше один раз создать говно, сохранить его в переменую/свойство говнокласса, а потом по требованию выдавать на лопате, чем каждый раз создавать новое.
Но опять же нужно смотреть по конкретной ситуации.

>Я правильно понял ведь без вызова говна, свойство говнецо будет null


Да, поэтому в таком случае генерацию говна можно перенести в конструктор.
class Govnoclass {
public $govneco;
public function __construct()
{
$this->govneco = ... // генерация говна
}
public function vernutGovno()
{
return $this->govneco;
}
}

$govnoGenerator = new Govnoclass;
$nuzhnoGovno = $govnoGenerator->vernutGovno();
...
$bolsheGovna = $govnoGenerator->vernutGovno();

>>706645
Я не знаю. А откуда ты это принес?
Может быть дескриптор результата запроса?
Вот мы получаем от базы данных результат запроса.
$sth = $pdo->prepare("select ...");
Что лежит в переменной $sth? Объект, да, со ссылкой на что-то там в системе управления базой данных.
Mysql "подготавливает" запрос, то есть выполняет построение плана запроса, еще что-то там, в результате субд сохраняет у себя этот подготовленный запрос и возвращает php его дескриптор, номер короче.
Чтобы php мог прибиндить значения и послать по этому номеру-дескриптору значения.
$sth->bindValue(':val', $val1);
$sth->execute();
... fetch
$sth->bindValue(':val', $val2);
$sth->execute();
Наверное так, но я не уверен.
#323 #706829
>>706726
В файле класса неймспейс myNamespace не забыл объявить?

>>706765
Лучше бы конкретный пример привел, в этом говне непонятно что тебе нужно сделать.
Есть смысл сохранять говно в свойство говнокласса, если необходимо возвращать одно и то же говно в нескольких местах.
То есть очевидно лучше один раз создать говно, сохранить его в переменую/свойство говнокласса, а потом по требованию выдавать на лопате, чем каждый раз создавать новое.
Но опять же нужно смотреть по конкретной ситуации.

>Я правильно понял ведь без вызова говна, свойство говнецо будет null


Да, поэтому в таком случае генерацию говна можно перенести в конструктор.
class Govnoclass {
public $govneco;
public function __construct()
{
$this->govneco = ... // генерация говна
}
public function vernutGovno()
{
return $this->govneco;
}
}

$govnoGenerator = new Govnoclass;
$nuzhnoGovno = $govnoGenerator->vernutGovno();
...
$bolsheGovna = $govnoGenerator->vernutGovno();

>>706645
Я не знаю. А откуда ты это принес?
Может быть дескриптор результата запроса?
Вот мы получаем от базы данных результат запроса.
$sth = $pdo->prepare("select ...");
Что лежит в переменной $sth? Объект, да, со ссылкой на что-то там в системе управления базой данных.
Mysql "подготавливает" запрос, то есть выполняет построение плана запроса, еще что-то там, в результате субд сохраняет у себя этот подготовленный запрос и возвращает php его дескриптор, номер короче.
Чтобы php мог прибиндить значения и послать по этому номеру-дескриптору значения.
$sth->bindValue(':val', $val1);
$sth->execute();
... fetch
$sth->bindValue(':val', $val2);
$sth->execute();
Наверное так, но я не уверен.
>>706868
#324 #706831
>>706818
*чем то, что было у меня в прошлый раз
Думаю сейчас, однако, что лучше тогда и разделить функции.
Сделать функцию getAllIndex(), в которой все значения, а getSalary() оставить только для нахождения окончательной зарплаты сотрудника.
Всё это вполне легко, когда разберёшься во многом.
Приятная лёгкость.
>>708354
#325 #706868
>>706829

>Я не знаю. А откуда ты это принес?



Ну вот, к примеру: $dbcnx = mysql_connect("localhost", "root", "");

Написано, что $dbcnx, в случае успеха соединения, становится дескриптором.

И вообще в книге это слово постоянно используется. Вот я и хотел узнать его, так сказать, смысловое значение. Для чего он предназначен, я и так понимаю.
>>706889
#326 #706889
>>706868
Дескриптор там просто идентификатор созданного соединения подразумевается, то, что однозначно на определенное соединение указывает. В руководстве по PHP так же:
http://php.net/manual/ru/function.mysql-connect.php
Этим дескриптором потом можно оперировать, например закрыть соединение, передав его в функцию mysql_close.
#327 #706958
>>706818

> padRight


> padLeft


Ой, страшно как.
Алсо, копипаст кода - верный признак того, что ты что-то делаешь не так.

function myPad($input, $pad_length, $pad_type) {

if (mb_strlen($input) >= $pad_length || $pad_length < 1) {

return $input;

}

if ($pad_type = STR_PAD_LEFT) {

return str_repeat(' ', $pad_length - mb_strlen($input)) . $input;

} elseif ($pad_type = STR_PAD_RIGHT) {

return $input . str_repeat(' ', $pad_length - mb_strlen($input));

}

}
Не проверял, но должно работать.

>$hoursAWeek - ($hoursAWeek - 40);


Лол, гений, здесь всегда будет 40.

>getSalary


>возвращает небо и аллаха



Так быть не должно.
getSalary должно возвращать зарплату.
И по-хорошему, каждый элемент твоего массива - это результат отдельной функции твоего класса.

>целесообразен ли мой подход - в одной функции дополнительно хранить результаты работы всех функций


Даже если тебе когда-нибудь понадобится функция, возвращающая все, то она должна выглядеть так:

public function getFullInfo() {

return array(
'allHours' => $this->getAllHours(),
'normalHours' => $this->getNormalHours(),
'normalHoursSalary' => $this->getNormalHoursSalary(),
'overtimeHours' => $this->getOvertimeHours(),
'overtimeHoursSalary' => $this->getOvertimeHoursSalary(),
'salary' => $this->getSalary()
);

}
#327 #706958
>>706818

> padRight


> padLeft


Ой, страшно как.
Алсо, копипаст кода - верный признак того, что ты что-то делаешь не так.

function myPad($input, $pad_length, $pad_type) {

if (mb_strlen($input) >= $pad_length || $pad_length < 1) {

return $input;

}

if ($pad_type = STR_PAD_LEFT) {

return str_repeat(' ', $pad_length - mb_strlen($input)) . $input;

} elseif ($pad_type = STR_PAD_RIGHT) {

return $input . str_repeat(' ', $pad_length - mb_strlen($input));

}

}
Не проверял, но должно работать.

>$hoursAWeek - ($hoursAWeek - 40);


Лол, гений, здесь всегда будет 40.

>getSalary


>возвращает небо и аллаха



Так быть не должно.
getSalary должно возвращать зарплату.
И по-хорошему, каждый элемент твоего массива - это результат отдельной функции твоего класса.

>целесообразен ли мой подход - в одной функции дополнительно хранить результаты работы всех функций


Даже если тебе когда-нибудь понадобится функция, возвращающая все, то она должна выглядеть так:

public function getFullInfo() {

return array(
'allHours' => $this->getAllHours(),
'normalHours' => $this->getNormalHours(),
'normalHoursSalary' => $this->getNormalHoursSalary(),
'overtimeHours' => $this->getOvertimeHours(),
'overtimeHoursSalary' => $this->getOvertimeHoursSalary(),
'salary' => $this->getSalary()
);

}
>>706964>>706970
#328 #706964
>>706958
В сравнениях с $pad_type двойные равно, конечно.
#329 #706970
>>706958

>Ой, страшно как.


Да, сижу сейчас и пытаюсь поправить эти функции.
Но пока получается только jopa - что и есть там у меня в переменных...
За функцию спасибо, вроде всё понятно.
Я просто собираю из простейших кубиков, даже не сталкивался с такими функциями, как str_repeat или STR_PAD_LEFT (вообще не понял, что это такое, ох щи)...

>Лол, гений, здесь всегда будет 40.


Что? Там если, допустим, $hoursAWeek = 50, то это выражение даст 10 часов переработки - что нам и нужно.

>Так быть не должно.


>getSalary должно возвращать зарплату.


>И по-хорошему, каждый элемент твоего массива - это результат отдельной функции твоего класса.


>Даже если тебе когда-нибудь понадобится функция, возвращающая все, то она должна выглядеть так:


>public function getFullInfo() { ... }


Да, я потом сообразил всё-таки, что лучше так сделать - чуть ниже ответил на свой пост с этим, там подумал об аналогичной функции getAllIndex().
Большое спасибо за разбор!
#330 #706972
>>706970

>Что? Там если, допустим, $hoursAWeek = 50, то это выражение даст 10 часов переработки - что нам и нужно.


Так, подожди, что-то я туплю...
Там должно быть так, но там действительно и будет всегда 40...
Перемудрил я что-то, короче. Даже интересно, почему в итоге правильно считает, вот так смех!
>>706974
#331 #706974
>>706970>>706972

>Что? Там если, допустим, $hoursAWeek = 50, то это выражение даст 10 часов переработки - что нам и нужно.


> $normalHours += $hoursAWeek - ($hoursAWeek - 40);


Но ведь там и правда всегда будет $normalHours += 40, а работало правильно видимо потому что в эту секцию if'а код не попадал.
>>706977>>706978
#332 #706977
>>706974
Нет-нет, я вспомнил, для чего это - получить строго нормальные часы, отсеять переработанные.
И результат прибавить к уже имеющимся нормальным часам.
Без этого будет неправильно работать.
Но можно заменить всё не расчётом нормальных часов, а цифрой 40.

>$normalHours += 40;


Однако ОП внедрил в сознание универсальность - а вдруг изменится базовая нормальность часов, мм? Вдруг будет не 40 часов, а 42 или 43,5?
Вот поэтому так сделал.
>>706982
#333 #706978
>>706974
Нет-нет, он каждый раз попадает туда у Петрова и Сидорова - у них обязательно срабатывает условие if ($hoursAWeek > 40).
#334 #706982
>>706970

>STR_PAD_LEFT


Это предопределенная константа.
В оригинале используется в функции str_pad, но ничто не мешает нам ею воспользоваться.

>>706977

>Вот поэтому так сделал.


И снова захардкодил 40?
>>706988
#335 #706988
>>706982

>И снова захардкодил 40?


Блин, точно...
Ничто не мешает просто те же 42 или 43,5 прибавлять.

Спасибо за совет, друзья, учту в усложнённом варианте этой задачи с департаментами и прочим.
#336 #706993
Вопрос по уроку строки, хакеры и шифровки
Почему моя программа не работает и как бы нормальный программист написал бы эту программу ?
http://ideone.com/sdUzBO
#337 #706998
>>706993
Для начала почитай stderr.
>>707006
#338 #707000
Что можно сделать такого чтобы в портфолио не стыдно было положить и чтобы как можно больше всяких нюансов по-практиковать? Все ОПовские задачи делал кроме последней (тесты на Yii), но ее не хочется
>>707005>>712600
#339 #707005
>>707000
"Портфолио" обычно требуют веб-студии. Имеется ввиду несколько сайтов на wordpress/drupal/joomla/etc с качественной версткой.
В программерской конторе скорее попросят показать код на гитхабе, файлообменника вполне достаточно чтобы понять твой уровень.

Только вот без фреймворков ловить нечего кроме стажировки в лучшем случае.
53 Кб, 674x600
#340 #707006
>>706998
Почитал, не понял.
>>709029
#341 #707036
>>706993

>$halfl


>$halgl

>>707046>>707049
#342 #707046
>>707036
Кошмар какой я невнимательный, спасибо.
Но там всё равно как-то неправильно счетчик работает, или что-то...
Потому что оно показывает, что это не палиндром всегда, даже когда это он.
>>707050>>707139
#343 #707049
>>707036

>($hall-$i)


ШТО
Прочитай про mb_substr ещё раз.
Тебе надо брать по символу с конца предложения, а $hall - это середина предложения.
#344 #707050
>>707046
У тебя всё верно, кроме того момента, что неправильно символы берёшь с конца предложения.
С этим разберись.
Могут быть и -$i в ориентирах для работы функции - небольшая подсказка.
>>707470
#345 #707139
>>707046

>str_replace(" ","",$text1);


Нужно работу функции поместить в переменную.
Иначе куда у тебя денется работа функции, мм?
Пробел - это что мы ищем, отсутствие пробела - это то, на что мы заменяем, а $text1 - это то, где мы всё это ищем (мы туда это не сохраняем!).
>>707470
#346 #707157
Какие сборки локальных северов используете на линавксе? Хочется посмотреть альтернативы LAMPу.
>>707160>>712601
#347 #707160
>>707157
Давно собрал себе nginx + php-fpm + postgresql, так и стоит на седьмой центОС. Хочу пхп до седьмой версии обновить, и паралельно с постгресом поставить mysql или mariadb, но не могу выделить под это время. В целом мне nginx понравился больше чем апач, особенно конфигурацией.

Сам сервер я разделил на несколько блоков, основной выделил под статику, и на каждое крупное приложение по серверному блоку. Очень удобно, можно на каждое приложение делать свои настройки сервера. В апаче так тоже можно, конечно, но мне не очень нравится его конфигурация и эти .htaccess файлы.
Так верстают инвалиды умственного развития #348 #707176
Решил почитать нашумевшие новости. Захожу на сайт - сайт не открывается. В исходниках обнаружился шедевр:

> <meta name="viewport" content="width=device-width,maximum-scale=1,initial-scale=1,user-scalable=no">


> maximum-scale=1


> user-scalable=no



Также, в ДОМе видны следы использования реакта в видe атрибутов data-reactid и data-react-checksum (эта быдлоподелка считает контрольную сумму ДОМа! наверно на случай переворачивания битов в памяти браузера космическими лучами и вешает свой атрибут на каждый элемент дома). Тексты вроде как засунуты в яваскрипт и без него не видны.

В css куча мусора вроде кастомных шрифтов в формате base64, ссылки на внешние ресурсы (@import url(//hello.myfonts.net/count/30c1dc);). И разумеется флексбокс.

Как итог, огромный яваскрипт не догружается (серверу тяжело) и ничего не отображается.

Это прекрасно характеризует современных верстальщиков: неучи которые не разбираются в базовых технологиях вроде HTML, зато сразу напихивают в проект все технологии которые упоминаются в статьях типа "20 библиотек которые модно носить в этом году". А, и конечно используют руби он рейлс или ноду. и учатся по видеокурсам наверно.

Некоторые вещи прекрасно реализуются на обычных существующих уже 20 лет технологиях вроде HTML и CSS. Вам не нужен реакт и кастомные шрифты чтобы сделать статический сайт с 10 статьями. И вебпак, SASS, LESS, JADE, вам тоже не нужен. Вам нужно просто знание HTML и CSS. Да, может это не так можно, зато быстрее грузится и надежнее работает. Потому что за 20 лет все проблемы которые могли быть в этих технологиях, давно известны и решены.

Дожили, не могут без реакта сверстать статическую страничку.

Я кстати могу.

Ну то есть я понимаю, что верстальщики это обычно неосилившие программирование и ждать от них чудес не стоит, но что им мешает просто взять и верстать на хтмл? Это же проще, изучить 1 технологию вместо огромного набора. Или там есть какой-то шаблон который можно скачать не разбираясь и получить вебпак, лесс, htm5 shim и прочую дрянь уже установленной и настроенной и они просто сами не знают что они наподключали? Или это им ИДЕ подсовывает реакт может быть?
Так верстают инвалиды умственного развития #348 #707176
Решил почитать нашумевшие новости. Захожу на сайт - сайт не открывается. В исходниках обнаружился шедевр:

> <meta name="viewport" content="width=device-width,maximum-scale=1,initial-scale=1,user-scalable=no">


> maximum-scale=1


> user-scalable=no



Также, в ДОМе видны следы использования реакта в видe атрибутов data-reactid и data-react-checksum (эта быдлоподелка считает контрольную сумму ДОМа! наверно на случай переворачивания битов в памяти браузера космическими лучами и вешает свой атрибут на каждый элемент дома). Тексты вроде как засунуты в яваскрипт и без него не видны.

В css куча мусора вроде кастомных шрифтов в формате base64, ссылки на внешние ресурсы (@import url(//hello.myfonts.net/count/30c1dc);). И разумеется флексбокс.

Как итог, огромный яваскрипт не догружается (серверу тяжело) и ничего не отображается.

Это прекрасно характеризует современных верстальщиков: неучи которые не разбираются в базовых технологиях вроде HTML, зато сразу напихивают в проект все технологии которые упоминаются в статьях типа "20 библиотек которые модно носить в этом году". А, и конечно используют руби он рейлс или ноду. и учатся по видеокурсам наверно.

Некоторые вещи прекрасно реализуются на обычных существующих уже 20 лет технологиях вроде HTML и CSS. Вам не нужен реакт и кастомные шрифты чтобы сделать статический сайт с 10 статьями. И вебпак, SASS, LESS, JADE, вам тоже не нужен. Вам нужно просто знание HTML и CSS. Да, может это не так можно, зато быстрее грузится и надежнее работает. Потому что за 20 лет все проблемы которые могли быть в этих технологиях, давно известны и решены.

Дожили, не могут без реакта сверстать статическую страничку.

Я кстати могу.

Ну то есть я понимаю, что верстальщики это обычно неосилившие программирование и ждать от них чудес не стоит, но что им мешает просто взять и верстать на хтмл? Это же проще, изучить 1 технологию вместо огромного набора. Или там есть какой-то шаблон который можно скачать не разбираясь и получить вебпак, лесс, htm5 shim и прочую дрянь уже установленной и настроенной и они просто сами не знают что они наподключали? Или это им ИДЕ подсовывает реакт может быть?
>>707179>>707185
#349 #707179
>>707176

Также, не подумайте что я один такой: https://habrahabr.ru/post/278655/

Серьезно, люди понапихивают в проект 20 библиотек, а потом с умным видом пишут про ЦДН или оптимизацию загрузки первого экрана,
#350 #707185
>>707176

Насчет реакта я конечно мог ошибиться - возможно что оно там один раз отрендерено, сохранено в HTML и так уже с сервера приходит. Сайт тормозит, не понять.
#351 #707304
http://ideone.com/hHixB0 - задача на шифт
http://ideone.com/YTVLDH - задача на yodaSpeak
#352 #707385
>>707304
Кодировку не надо указывать, если у тебя изначально указана. На Идеоне изначально указана UTF-8.
В Йоде вылезают ошибки, хотя всё работает верно вроде бы. Лучше работу некоторых функций отдельно определять в переменную в этом случае.
Вообще не вполне правильно само по себе вот это:

>array_walk($reversedText, ($reversedText = preg_replace("/[;:,!\?\.]/", "", $reversedText)));


>$reversedText =


По идее, в этом случае надо оставлять без определения, просто саму функцию, но так не работает.
Короче, я запутался и ничего не понял.
>>707408
29 Кб, 1358x220
#353 #707397
Кодировкопроблемы в связке Apache+PHP7.
Пробовал ставить header('Content-Type: text/html; charset=utf-8');
Пробовал ставить <meta http-equiv="Content-Type" Content="text/html; Charset=Windows-1251"> и <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> в сам файл .php.
Пробовал создавать .html-файл со скриптом на РНР, прописывал там всякие кодировки в мета-тегах - не помогло.
Что делать дальше?
Где раскомментировать какие строки?
Везде всё по-разному советуют, помогите определиться!
>>707399>>707424
#354 #707399
>>707397
Ставь линукс, друг.
>>707400
#355 #707400
>>707399
Нет, там тоже бывают проблемы с кодировкой - судя по тому, что увидел, когда искал ответы.
Значит, разбираемся с ошибкой.
Линукс стоит у меня на нетбуке, на рабочем ноутбуке его ставить - не вариант.
Только если кучу программ сделают аналогичных на Линуксе (не криворукие аналоги того же Фотошопа типа GIMPа, ты понимаешь).
#356 #707408
>>707385
Спасибо за ответ. Я сам методом тыка делал, но один мудрый человек посоветовал через foreach прогнать, чтобы не было ворнингов.
>>707420
80 Кб, 950x473
#357 #707420
>>707408
Так предупреждения об ошибках и остались...
>>709027
#358 #707424
>>707397

Надо файл с кодом сохранять в кодировке utf-8 без BOM.
>>707428
53 Кб, 600x450
#359 #707428
>>707424
Огромное спасибо!
Помогло!
#360 #707469
ОП, если ты тут, напиши, пожалуйста, что думаешь по поводу>>706708
>>707494
#361 #707470
>>707050
>>707139
Переделал, спасибо.
Но палиндромы почему-то всё равно не ищет, пойду пока дальше, потому что идей нет совсем.

http://ideone.com/u1koYn
>>707475
#362 #707475
>>707470
Поставь парочку var_dump'ов, посмотри, почему у тебя $count-$i не равняется первому символу с начала.
Но вот какой совет: попробуй в начале цикла поставить $i = 1, а дальше в функциях поменять всё, чтобы было верно.
Тебе надо просто во втором случае (где $symbol2) идти с конца строки. Это можно сделать, указав всего лишь -$i (когда $i = 1, ведь если $i = 0, то в функции будет изначально -0, а это неправильно).
Лучше разбираться сразу, дальше как снежный ком часто накладывается всё.
Пробуй, братишки помогают.
>>707479
#363 #707479
>>707475
И правда, всё работает, спасибо, братишка :3
Хотя я так и не понял, чому с конца нельзя было отнимать.
#364 #707494
>>706708
>>707469

Обучение это очень дорого - не только плата за обучение, но и потраченное время. Уверен ли ты что оно окупится и того стоит? Насколько я знаю, во многих наших вузах CS преподают плохо.

Если ты заинтересован в образовании для IT, рассмотри учебные заведения которые делают образовательные программы совместно с крупными компаниями вроде Яндекса или Мейл ру:

- https://park.mail.ru/pages/index/ (вроде как раз это Бауманка и есть?).
- https://yandexdataschool.ru/

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

А то складывается ощущение что ты просто хочешь еще немного побездельничать за родительский счет.
>>707527
#365 #707507
SELECT title, adresses FROM Pickups AS t1
JOIN
(SELECT title as name, adresses FROM Pickups) as t2 on t2.name= t1.title

Почему не работает?
>>709027
#366 #707519
Что-то я торможу, есть один объект, ему поставлена постоянная анимация, анимация выполняется через keyframes, как сделать так, чтобы при наведении на объект мышкой, анимация останавливалась?
>>709027
#367 #707527
>>707494

>за родительский счет


Я сам скопил деньги на учёбу(почти полную сумму). Твой учебник решил до конца в январе, студентов сейчас делаю. Просто я имею гуманитарное образование и боюсь окунаться в кодинг без вышки. Думал поступать на вечерку и днём ходить на работу.

Что думаешь про ВМК МГУ?
>>707893>>709001
#368 #707587
http://ideone.com/9frEKW
Как слепить все выпавшие слоги в одно слово?
>>707658
#369 #707599
Не могу сообразить как организуется ajax в mvc. Мне нужно сделать методы в контроллере для обработки формы?
>>707610
#370 #707610
>>707599
Можно так, для аякс-запросов отдельные методы-обработчики.
А можно сделать ветку условий в том же методе, который обрабатывает "нормальную" форму.
if ($request->isAjax()) { отдать json, завершить скрипт }

Аякс запрос походу лучше всего детектить по гет-переменной ?ajax.
Другие способы (jquery прилепливает какой-то нестандартный http-заголовок) не очень кошерные, не во всех браузерах работают.
И урл должен однозначно идентифицировать запрос, контроллер не должен отдавать в одном случае html, в другом json (вдруг по этому адресу зайдет какой-нибудь индексирующий бот и не поймет юмора).
Поэтому лучше всего гет-переменной явно указать, что запрос был сделан аяксом.

Или действительно вынести обработку запросов через аякс в отдельный метод контроллера. Чревато копипастой. Обычная обработка формы ведь отличается от обработки аякс-запроса только формой ответа (html или json). Так что я б сделал один экшн в контролере с веткой условий (детектить аякс-запрос по гет-переменной).
>>707684>>709027
#371 #707645
ЧЯДНТ? Я так и не понял, как вы это делаете в 1 строку. Допустим, чтобы вывести какое-то рандомное значение из массива несколько раз, я делаю огромную вещь типа
$letters = array(%КУЧАЗНАЧЕНИЙ%);
for ($i = 1; $i <= 4; $i++) {
$random = rand(1, 4);
foreach ($letters as $num => $txt){
if ($random==$num){
$randomText = $txt;
break;
}
}
echo "Выпало число {$random}, слог {$randomText}\n";
}
Можно ли как-то упростить? Я что-то не догоняю...
>>707658>>707660
#372 #707658
>>707645
Зачем там вложенный цикл? И нумерация идет с нуля, так что если в массиве 4 элемента, их ключи будут 0,1,2,3. Числа нужно брать из этого диапазона rand(0, 3)

Чтобы взять элемент из массива, не нужно перебирать этот массив в цикле и сравнивать с искомым ключом, можно же просто выбрать элемент по ключу
$letters[$number], где $number = rand(0, 3)
если сократить $letters[rand(0,3)]
Поскольку это будет работать только с массивом длиной 4, наверное лучше подставить в формулу переменную count($array) - 1.
$randomElement = $letters[rand(0, count($letters) - 1)]

>>707587
Оператором конкатенации
$string .= $substring;
>>707662
#373 #707660
>>707645

google: array_rand
#374 #707662
>>707658
Огонь! Спасибо большое!
>>707670
#375 #707670
>>707662
array_rand лучше, потому что будет работать и с ассоциативными массивами (где ключи в виде строк а не чисел)

И способ с rand не будет работать с массивами, где пропущены элементы (php такое позволяет)
[0=>0, 1=>1, 3=>3]
16 Кб, 313x286
#376 #707684
>>707610
Только у меня проблема. Я сделал маршрутизацию так, что у меня url разбирается так mysite.ru/controller/action, соответственно внутри я вызываю метод action контроллера controller. Если класс контроллера не существует или в нем нет нужного метода, то редирект на 404. Разбор происходит в index.php. Если я буду передавать параметры через post, например index?q=n, то у меня будет 404, так как нет такого контроллера. В общем я запутался. То ли я говно сделал, то ли как-то нужно парсить параметры?
#377 #707770
`yearofbirth` year(4) NOT NULL

string(4) "1876"

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column 'yearofbirth' at row 1' in ...

Что эта ошибка означает?
>>707777>>707784
#378 #707777
>>707770
То, что номер который ты пытаешься вставить больше максимального. При создании numeric в скобках ты указываешь не количество символов, а максимальное число которое можно вставить. Т.е. в твоем случае в колонку yearofbirth числа больше 4 не вставить.
>>707784
#379 #707784
>>707770
>>707777
Извиняюсь, не заметил тип year.
http://dev.mysql.com/doc/refman/5.7/en/year.html
Согласно документации - туда можно вставлять только числа с 1901 по 2155.
>>709027
#380 #707893
>>707527
ОП, дорожу твоим мнением, отпишись, пожалуйста
>>708917>>709001
#381 #707902
Айпад в кредит
http://ideone.com/80ZwrY
Наверное, переплатил как всегда, но забыл как сделать по-нормальному, тем более разница и так видно, так что...пойдет ?
>>707962>>708005
#382 #707909
Оцените анчоусы http://parsing.pe.hu
>>707931>>709024
#383 #707916
>>705609
$tpl = str_replace('{body}', $body, $tpl);

я вот такой код откопал

http://www.phpinfo.su/articles/practice/shablony_v_php.html
>>709027
#384 #707931
>>707909
Что ты там пишешь? Ты что, ебанутый?
>>707937
#385 #707937
>>707931
Где? Что именно?
#386 #707954
>>707684
Хотя в принципе самому записывать параметры в $_GET массив - это же нормально?
>>707994>>709024
19 Кб, 768x214
#387 #707962
>>707902
Сразу добавлю задача на автомобильный номер
http://ideone.com/Zm5gfH

И почти допилил с номерами, но не совсем понял, почему случился пикрилейтед почему не записывает в массив первую цифру и скобку ? и как пробел добавить, помогите советом, а я на сегодня уже спать, а то устал, спасибо большое.
http://ideone.com/Bh4O60
>>708005>>709023
#388 #707971
Вопрос по учебнику.
Скажи пожалуйста, почему если у меня выпадает 2 дабла, то это не пишется, а пишется только кто победил?
http://ideone.com/fl1fI5
>>708013
#389 #707994
>>707954
При чем тут массив?

Гет-параметры конечно пользователь имеет право передавать по своему усмотрению.
Сосач же не выдает 404 при переходе по адресу https://2ch.hk/?abu=hui&mamku=ipal (М)

Напиши правильный роутер.
Если в мод реврайте у тебя
RewriteRule ^ index.php
то скрипте index.php первоначальный запрос пользователя доступен в массиве $_SERVER.
$_SERVER['REQUEST_URI'] выдаст '/a/b?c=123&d=456', с этой строкой и работаем.

Допустим, у тебя все адреса должны быть вида /controller/action и запрещены адреса /controller/action/govno. Ну так бей по слешу, если слешей будет больше 2, тогда отдавай страницу 404.
Квери стринг тут не при чем, его потом отдельно разобрать и разбить по &.

>>707684

>Если я буду передавать параметры через post, например index?q=n, то у меня будет 404


Ты не понимаешь разницу между методом гет и методом пост.

Вполне можно отправить постом данные на url, содержащий гет-параметры.
$.ajax({
method: "POST",
url: "some.php?getparam=123",
data: { name: "John", location: "Boston" }
})

Тогда в some.php доступны будут $_POST['name'] = John, $_POST['location'] = Boston и $_GET['getparam'] = 123.
#389 #707994
>>707954
При чем тут массив?

Гет-параметры конечно пользователь имеет право передавать по своему усмотрению.
Сосач же не выдает 404 при переходе по адресу https://2ch.hk/?abu=hui&mamku=ipal (М)

Напиши правильный роутер.
Если в мод реврайте у тебя
RewriteRule ^ index.php
то скрипте index.php первоначальный запрос пользователя доступен в массиве $_SERVER.
$_SERVER['REQUEST_URI'] выдаст '/a/b?c=123&d=456', с этой строкой и работаем.

Допустим, у тебя все адреса должны быть вида /controller/action и запрещены адреса /controller/action/govno. Ну так бей по слешу, если слешей будет больше 2, тогда отдавай страницу 404.
Квери стринг тут не при чем, его потом отдельно разобрать и разбить по &.

>>707684

>Если я буду передавать параметры через post, например index?q=n, то у меня будет 404


Ты не понимаешь разницу между методом гет и методом пост.

Вполне можно отправить постом данные на url, содержащий гет-параметры.
$.ajax({
method: "POST",
url: "some.php?getparam=123",
data: { name: "John", location: "Boston" }
})

Тогда в some.php доступны будут $_POST['name'] = John, $_POST['location'] = Boston и $_GET['getparam'] = 123.
>>709021>>709023
#390 #708005
>>707902
Нет, считает абсолютно неверно.
Там в среднем банке должно получиться столько же, сколько в задаче про Айфон.
Ты про Айфон решил? Что-то в последнее время не было решений её.
>>707962
Ты по какому учебнику делаешь? У ОПа на Народе актуальный вариант с разными дополнениями, а в архиве сейчас старый и неактуальный вариант. В новом варианте есть массив с правильными и неправильными номерами, прогони его через свой скрипт, он поможет выявить проблемы.
>>711143
#391 #708013
>>707971

>(($player1 == $player2) && ($ui == $ui2))


>(($x) > ($y))


Слишком много ненужных скобок.
Названия у переменных непонятные и непоследовательные.

>почему если у меня выпадает 2 дабла, то это не пишется, а пишется только кто победил?


Даблы могут быть разные. 3 и 3 у игрока и 4 и 4 у компьютера. А у тебя там сложение именно разных ходов идёт, а потом сравнение получившихся чисел между собой ($x и $y).
>>708015>>708016
#392 #708015
>>708013
То есть, если выпадет 3 и 3 у меня и 3 и 3 у компа, то выйдет надпись "2 дабла"?
>>708017
#393 #708016
>>708013
И таблицу я правильно сделал? Она работает, просто я не уверен, что именно так правильно делать.
http://ideone.com/pQcAor
>>708017
#394 #708017
>>708015
По идее - да.
Попробуй просто определённые значения этим переменным поставить, посмотри.
>>708016
Таблица хороша.
Можно в условиях разместить выражения, а можно в теле самого цикла.
У тебя правильно и вполне компактно.
>>708019
#395 #708019
>>708017
Пишет ничья. Выставил рандом от 1 до 1.
>>708026
#396 #708026
>>708019

>$y = $ui + $ui1;


>$ui == $ui2


Видишь ошибку сейчас?
А всё из-за того, что плохие и непонятные названия у переменных!
>>708028
#397 #708028
>>708026
Спасибо.
#398 #708042
Аноны, смотрите, случайно встретил видео про наверное все паттерны в ООП, может будет полезным.
https://youtu.be/nCodv8TBsWs
#399 #708056
>>708042
Зачем смотреть видео от каких-то обрыганов, когда есть папаша Фаулер?
>>708076
#400 #708062
Аноны, поясните за различие между блоками else и elseif и в каких случаях какой лучше использовать.
Гайд читал
>>708064>>709021
#401 #708064
>>708062
Может тебе еще за echo пояснить?
#402 #708065
Вопрос по учебнику.
Почему не считает год?
http://ideone.com/1Y4o9U
>>708071
#403 #708071
>>708065
Потому что сначала проверяется условие, а затем действие 2. Затем снова условие.
У тебя не успевает дойти ещё раз до echo, потому что условие срабатывает.
Так понятно?
>>708079
#404 #708076
>>708056
Кто это? Мне просто понравилось, что все в одной сборке.
#405 #708078
>>708042
Спасибо, интересненько выглядит многое.
#406 #708079
>>708071
Понятно, ток не понятно какое нужно условие выставить для $year.
>>708095
#407 #708083
Можно ли написать в лицензии ник гитхаба, а не настоящее имя?
>>708090>>708091
#408 #708090
>>708083
Нельзя.
#409 #708091
>>708083
В какой лицензии?
#410 #708095
>>708079
Разобрался.
14 Кб, 526x198
10 Кб, 473x172
#411 #708115
Анон пожалуйста подскажи.

Первый пик, почему выдает 65 в гайде ответ 49 или там ошибка?

Второй пик, почему такая версия не работает?
>>708116>>709021
#412 #708116
>>708115

Во втором случае условие в цикле внутри не написано и он будет крутиться вечно.
>>708118
#413 #708118
>>708116
Спасибо, понял
#414 #708176
HTML/CSS:
Задание 4: https://jsfiddle.net/wp2pbc87/1/
Задание 5: https://jsfiddle.net/qb7t863c/
>>709016
81 Кб, 885x590
#415 #708227
Как настроить PHPStorm так, чтобы работало всё не через его интерпретатор?
Мне он не нужен, потому что часто видел, как на Идеоне у анонов всё сыпало ошибками или вообще не работало, тогда как на Шторме было всё отлично.
Останавливаю Апач - всё работает всё равно в браузере, не хочется такого.
Там надо добавить сервер как-то, наверное?
>>709016
#416 #708287
Стоит ли использовать пакеты из pear если я пишу для практики, а не рабочие проекты? Например пакет mdb2 для работы с бд
>>708325>>709016
Ответы 30 марта https://github.com/huyakhuyakivprodakshen/tatukadu/ #417 #708324
>>702992

>>Класс на li тут не особо нужен, удобнее писать .offer-image-list > li


> С одной стороны авторы БЭМа настаивают на 'минимуме непокрытых классами тегов' с другой стороны даже придумывать их имена утомительно и в половине случаев проще взять каскадом. Не готов спорить.


У меня логика такая: ul и li это не случайные теги, они связаны друг с другом. Так что писать список > li вполне норимально на мой взгляд, а благодаря > эти свойства не вытекут на вложенные li, так что проблем быть не должно.

>>Что с браузерами которые его не прддерживают


> Как и говорил, ничего. Считаем что в ТЗ их нет.


Если так рассуждать, можно вообще представить что никаких браузеров нет и ничего не верстать.

>>Зачем тут CSS reset?


>Если ты на нормалайз намекаешь, то мне не нравится идея подрубать 400 строк кода потому что "там умные люди за тебя все написали, не выделывайся".


Я намекаю что это ненужная ерунда. Надо знать особенности дефолтных стилей в браузерах и использовать их, а не пытаться все сбрасывать. Вот посмотри на свой код: https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/public/css/main.css

Ты сбросил отступы у заголовов и абзацев, а кто их возвращать будет? В нынешнем виде если у тебя текст вставить на страницу, он будет сплошной стеной без абзацев. не бывает такого что тебе просто надо сверстать ровно то, что на макете. Почти всегда верстка натягивается на какой-то движок, редакторы там могут что-то править и это все долждно нормально работать.

Допустим, ты послушаешь меня и добавишь отступы для абзацев и заголовков. но тогда возникает другой вопрос, а зачем их было убирать вообще?

Все эти ресеты придумали бездарные неучи. Индусы которые клепают по 5 макетов в день и которым некогда разбираться. Не думаю, что стоит с них брать пример.

>>Почему у тебя 2 тега h1?


> Наверное прозевал. Но стандарт не запрещает


Нелогично, обычно h1 это заголовок всей страницы и 2 заголовка там быть не может, Более того, ты ипсползуешь эти теги заголовков чтобы свестать текст крупным шрифтом. Это неправильно. Это теги для разметки заголовков, а не написанного большими буквами текста.

> Лень искать было


Если тебе уже сейчас лень делать нормально, то дальше только хуже будет.

>> [class="cell"]


>> [class="col-"] {


> Напиши, почему плохо так делать?


>>почему плохо так делать?


> 1. Не самый быстрый селектор


> 2. Если забыть про это правило и завести класс 'col-something'..


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

Мне кажется, тебе надо больше усилий посвящать базовым технологиям. SASS/LESS это очень простая штука, которая изучается за пару часов.

> Я никак не могу найти годный сложный макет в котором будет все, и ховеры и модальные окна и анимации и мобильные версии и все-все. А без макета я не знаю как 'сделать красиво'.


А зачем нужны модальные окна и анимации? Мне например нравится дизайн "черный текст на белом фоне". Но адаптивный.

Если тебе нужны примеры адаптивных сайтов - поищи статьи типа "50 лучших адаптивных дизайнов".

Я не знаю, есть ли смысл мне разбирать код? В прошлый раз мои советы не очень-то и нужны оказались, что-то мне в этот раз уже лень время тратить. В общем, там есть какие-то странные моменты, например размеров много фиксированных, я вижу 1280px там миниумм 2 раза прописаны. Странные стили вроде font-size: 0. Верстка неадаптивная, не кроссбраузерная. Шрифты зачем-то прописаны в em. Можно увидеть тег br.

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

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

Тут https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/app/jade/includes/_blog.jade#L8 ты вкладывешь <a> внутри <a>. По моему это полное незнание HTML.

https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/app/jade/includes/_feedback.jade#L7 тут br

Алсо мне не нравится когда имена файлов называют с подчеркивания. Смысла в этом нет.

https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/public/js/main.js

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

Ну например у тебя в коде слайдера намертво прописаны идентификаторы элементов. Почему не разделить это? Отдельно слайдер, отдельно параметры его запуска.

Алсо я считаю что это плохой подход, исплоьзовать document.ready и писать там стену текста. Один глупец придумал антипаттерн и все его повторяют. Вообще этот document ready не нужен если подумать. На маленьком сайте еще ничего, но на большом сайте получается ад. Вот смотри, у нас там допустим 40 разных страниц и даун-верстальщик берет и засовывает в один файл main.js 40 скриптов с document.ready и они выполняются независимо от того нужны они на этой странице или нет. И отрефакторить это невозможно так как непонятно что из этой стены кода еще используется, а что уже нет. Ну соответственно никто это и не рефакторит, а просто дописывает еще больше кода снизу.
Ответы 30 марта https://github.com/huyakhuyakivprodakshen/tatukadu/ #417 #708324
>>702992

>>Класс на li тут не особо нужен, удобнее писать .offer-image-list > li


> С одной стороны авторы БЭМа настаивают на 'минимуме непокрытых классами тегов' с другой стороны даже придумывать их имена утомительно и в половине случаев проще взять каскадом. Не готов спорить.


У меня логика такая: ul и li это не случайные теги, они связаны друг с другом. Так что писать список > li вполне норимально на мой взгляд, а благодаря > эти свойства не вытекут на вложенные li, так что проблем быть не должно.

>>Что с браузерами которые его не прддерживают


> Как и говорил, ничего. Считаем что в ТЗ их нет.


Если так рассуждать, можно вообще представить что никаких браузеров нет и ничего не верстать.

>>Зачем тут CSS reset?


>Если ты на нормалайз намекаешь, то мне не нравится идея подрубать 400 строк кода потому что "там умные люди за тебя все написали, не выделывайся".


Я намекаю что это ненужная ерунда. Надо знать особенности дефолтных стилей в браузерах и использовать их, а не пытаться все сбрасывать. Вот посмотри на свой код: https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/public/css/main.css

Ты сбросил отступы у заголовов и абзацев, а кто их возвращать будет? В нынешнем виде если у тебя текст вставить на страницу, он будет сплошной стеной без абзацев. не бывает такого что тебе просто надо сверстать ровно то, что на макете. Почти всегда верстка натягивается на какой-то движок, редакторы там могут что-то править и это все долждно нормально работать.

Допустим, ты послушаешь меня и добавишь отступы для абзацев и заголовков. но тогда возникает другой вопрос, а зачем их было убирать вообще?

Все эти ресеты придумали бездарные неучи. Индусы которые клепают по 5 макетов в день и которым некогда разбираться. Не думаю, что стоит с них брать пример.

>>Почему у тебя 2 тега h1?


> Наверное прозевал. Но стандарт не запрещает


Нелогично, обычно h1 это заголовок всей страницы и 2 заголовка там быть не может, Более того, ты ипсползуешь эти теги заголовков чтобы свестать текст крупным шрифтом. Это неправильно. Это теги для разметки заголовков, а не написанного большими буквами текста.

> Лень искать было


Если тебе уже сейчас лень делать нормально, то дальше только хуже будет.

>> [class="cell"]


>> [class="col-"] {


> Напиши, почему плохо так делать?


>>почему плохо так делать?


> 1. Не самый быстрый селектор


> 2. Если забыть про это правило и завести класс 'col-something'..


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

Мне кажется, тебе надо больше усилий посвящать базовым технологиям. SASS/LESS это очень простая штука, которая изучается за пару часов.

> Я никак не могу найти годный сложный макет в котором будет все, и ховеры и модальные окна и анимации и мобильные версии и все-все. А без макета я не знаю как 'сделать красиво'.


А зачем нужны модальные окна и анимации? Мне например нравится дизайн "черный текст на белом фоне". Но адаптивный.

Если тебе нужны примеры адаптивных сайтов - поищи статьи типа "50 лучших адаптивных дизайнов".

Я не знаю, есть ли смысл мне разбирать код? В прошлый раз мои советы не очень-то и нужны оказались, что-то мне в этот раз уже лень время тратить. В общем, там есть какие-то странные моменты, например размеров много фиксированных, я вижу 1280px там миниумм 2 раза прописаны. Странные стили вроде font-size: 0. Верстка неадаптивная, не кроссбраузерная. Шрифты зачем-то прописаны в em. Можно увидеть тег br.

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

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

Тут https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/app/jade/includes/_blog.jade#L8 ты вкладывешь <a> внутри <a>. По моему это полное незнание HTML.

https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/app/jade/includes/_feedback.jade#L7 тут br

Алсо мне не нравится когда имена файлов называют с подчеркивания. Смысла в этом нет.

https://github.com/huyakhuyakivprodakshen/tatukadu/blob/master/public/js/main.js

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

Ну например у тебя в коде слайдера намертво прописаны идентификаторы элементов. Почему не разделить это? Отдельно слайдер, отдельно параметры его запуска.

Алсо я считаю что это плохой подход, исплоьзовать document.ready и писать там стену текста. Один глупец придумал антипаттерн и все его повторяют. Вообще этот document ready не нужен если подумать. На маленьком сайте еще ничего, но на большом сайте получается ад. Вот смотри, у нас там допустим 40 разных страниц и даун-верстальщик берет и засовывает в один файл main.js 40 скриптов с document.ready и они выполняются независимо от того нужны они на этой странице или нет. И отрефакторить это невозможно так как непонятно что из этой стены кода еще используется, а что уже нет. Ну соответственно никто это и не рефакторит, а просто дописывает еще больше кода снизу.
#418 #708325
>>708287

А почему нет? Единственное, не старый ли он? Сейчас уже PO давно есть.
>>709016
Ответы 30 марта #419 #708326
>>703046

Не знаю

>>703094

Вот смотри, там ошибки внизу:

> PHP Notice: Undefined variable: newText in /home/zar7d3/prog.php on line 20



Ты используешь переменную которая пока еще не существует. Надо сначала ее создать, а потом только использовать.

Насчпет исправления знаков препинания, у тебя заложено что может быть максимум один пробел рядом с ними:

> /\\s?([,!?])\\s?



лучше закладывать любое число пробелов.

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

> if (mb_substr(0, 1, $sentence) != " ") {


> $sentence = " ". $sentence;


> $newText = $newText . $newSentence. ".";


Тут лучше просто через implode склеить

В общем. надо еще немного доработать код.

>>703164
>>703691

> $creditBalance<=$needTotal;


Если ровно миллион набрали, все равно продолжать надо цикл? Наверно нет.

> if ($creditBalance>=$needTotal) {


> $userYears += $years;


Это лучше поместить не внутри цикла, а после него.
Ответы 30 марта #419 #708326
>>703046

Не знаю

>>703094

Вот смотри, там ошибки внизу:

> PHP Notice: Undefined variable: newText in /home/zar7d3/prog.php on line 20



Ты используешь переменную которая пока еще не существует. Надо сначала ее создать, а потом только использовать.

Насчпет исправления знаков препинания, у тебя заложено что может быть максимум один пробел рядом с ними:

> /\\s?([,!?])\\s?



лучше закладывать любое число пробелов.

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

> if (mb_substr(0, 1, $sentence) != " ") {


> $sentence = " ". $sentence;


> $newText = $newText . $newSentence. ".";


Тут лучше просто через implode склеить

В общем. надо еще немного доработать код.

>>703164
>>703691

> $creditBalance<=$needTotal;


Если ровно миллион набрали, все равно продолжать надо цикл? Наверно нет.

> if ($creditBalance>=$needTotal) {


> $userYears += $years;


Это лучше поместить не внутри цикла, а после него.
Ответы 31 марта #420 #708327
>>703233

ну что поделать, никто и не обещал тебе бесплатно хороший переводчик.

>>703326

Захватывает переменные, читай мануал http://php.net/manual/ru/functions.anonymous.php

>>703549

переменные передавать которые говорят что надо вывести + ифы. Копипасты быть не должно.

В твоем случае можно сделать переменную $isRegister которая говорит зарегистрированы мы или нет, а также вторую переменную, говоряющую надо ли показывать ссылку на страницу редактирвоания.

>>703703
>>704544

> function makeFirstLetterUppercase($text) {


Функция делает не точно то что указано в названии. Нехорошо.

> if ($number != 0 && mb_substr($newSentence, 0, 1) != " ") {


> $newSentence = " " . $newSentence;


лучше просто массив предложеий через implode склеить. И пробелы исправлять уже на склеенной строке.

> if ($number == 0) {


> $firstLeter = mb_strtoupper(mb_substr($newSentence, 0,1));


> $newSentence = preg_replace("/^\\s?[а-яa-z]/u", "{$firstLeter}", $newSentence);


Тут не нужны регулярки, берешь первую букву, переводишь в верхний регистр, присоединяешь остаток строки. Ну и желательно это вынести в отдельную функцию.

> [а-яa-z]


букву ё надо еще указыать отдельно

>>703753

Используй ИДЕ которая по клику переходит к определению класса. Ну и выписывай куда-нибуль зачем какой файл нужен. Обычно там имя файла соответствует имени класса так что даже запоминать не надо.
Ответы 31 марта #420 #708327
>>703233

ну что поделать, никто и не обещал тебе бесплатно хороший переводчик.

>>703326

Захватывает переменные, читай мануал http://php.net/manual/ru/functions.anonymous.php

>>703549

переменные передавать которые говорят что надо вывести + ифы. Копипасты быть не должно.

В твоем случае можно сделать переменную $isRegister которая говорит зарегистрированы мы или нет, а также вторую переменную, говоряющую надо ли показывать ссылку на страницу редактирвоания.

>>703703
>>704544

> function makeFirstLetterUppercase($text) {


Функция делает не точно то что указано в названии. Нехорошо.

> if ($number != 0 && mb_substr($newSentence, 0, 1) != " ") {


> $newSentence = " " . $newSentence;


лучше просто массив предложеий через implode склеить. И пробелы исправлять уже на склеенной строке.

> if ($number == 0) {


> $firstLeter = mb_strtoupper(mb_substr($newSentence, 0,1));


> $newSentence = preg_replace("/^\\s?[а-яa-z]/u", "{$firstLeter}", $newSentence);


Тут не нужны регулярки, берешь первую букву, переводишь в верхний регистр, присоединяешь остаток строки. Ну и желательно это вынести в отдельную функцию.

> [а-яa-z]


букву ё надо еще указыать отдельно

>>703753

Используй ИДЕ которая по клику переходит к определению класса. Ну и выписывай куда-нибуль зачем какой файл нужен. Обычно там имя файла соответствует имени класса так что даже запоминать не надо.
>>708533
Ответы 31 марта #421 #708328
>>703774

Не знаю, я их с помощью SQL создаю.

>>703865

есть целый сайт с примерами плохого кода

>>703954

есть такой урок недописанный https://github.com/codedokode/pasta/blob/master/soft/web-server.md

>>704241

> Бро, ОП, совсем не могу понять, в чём суть. Извини, я пока ещё не въехал в ООП. Метод есть в окончательном решении, которое пока ты не проверял, точнее, несколько методов для подсчёта отдельно нормальных часов и отдельно переработанных, подсчёта отдельно зарплаты для нормальных и отдельно для переработанных со сложением их в итоге. То ли это, что нужно?


Ну смотри, что там требуется выводить? Общие часы, овертайм, зарплату. Значит эти 3 метода нужны обязательно. Остальные - по желанию.

Суть в том что ты пишешь класс Employee, и после этого с его помощью можешь посчитать что тебе нужно.

> Как так в сотруднике сделать метод? То есть просто функцию (метод) добавить в класс, потом с её помощью определять зарплату?


да

>>706345

Не одним из методов, а несколькими. Для каждой величины свой метод. Зачем все в кучу сваливать.
Ответы 31 марта #421 #708328
>>703774

Не знаю, я их с помощью SQL создаю.

>>703865

есть целый сайт с примерами плохого кода

>>703954

есть такой урок недописанный https://github.com/codedokode/pasta/blob/master/soft/web-server.md

>>704241

> Бро, ОП, совсем не могу понять, в чём суть. Извини, я пока ещё не въехал в ООП. Метод есть в окончательном решении, которое пока ты не проверял, точнее, несколько методов для подсчёта отдельно нормальных часов и отдельно переработанных, подсчёта отдельно зарплаты для нормальных и отдельно для переработанных со сложением их в итоге. То ли это, что нужно?


Ну смотри, что там требуется выводить? Общие часы, овертайм, зарплату. Значит эти 3 метода нужны обязательно. Остальные - по желанию.

Суть в том что ты пишешь класс Employee, и после этого с его помощью можешь посчитать что тебе нужно.

> Как так в сотруднике сделать метод? То есть просто функцию (метод) добавить в класс, потом с её помощью определять зарплату?


да

>>706345

Не одним из методов, а несколькими. Для каждой величины свой метод. Зачем все в кучу сваливать.
>>708354
sage #422 #708331
Решил начать учить php.

Накатил апач, работает, но с пхп проблемы.
Какие модули подключать? Как настроить httpd.conf?
ОС : Arch linux
>>708373
#423 #708354
>>708328

>Не одним из методов, а несколькими. Для каждой величины свой метод. Зачем все в кучу сваливать


Спасибо.
Я так-то уже свалил всё в кучу (>>706818)
, но понял свою ошибку (>>706831) и братишки подсказали, что так неправильно.
Когда пришло общее понимание, то выдать те же данные через основные функции уже не проблема.
#424 #708373
>>708331
Все что в арчвики написано сделал?
>>708408
#425 #708408
>>708373
Теперь да, и все заработало.

Зря я до этого по мануалу с даунских форумов делал...
#426 #708416
Пыханы, чего можно читнуть по паттернам проектирования в PHP, так чтобы за день освноится?
Просто меня позвали на собеседование на неплохую джуниорскую вакансию, а там требуют знаний паттернов в пхп.
О себе - знаю джаву, праграммировал на енй около года на уровне мелктх проектов, о паттернах проектирования имею некоторое предстваляение.
>>708470
#427 #708419
https://github.com/codedokode/pasta/blob/master/js/spa.md

>время: 2-3 месяца


Оп, а почему время работы с заданием такое длинное? Это же за недельку можно успеть если присесть нормально или ты берешь в рассчет новичков?
>>708455>>709016
#428 #708455
>>708419
А зачем "неновичкам" вообще делать оповские задачи, если можно идти работать и набираться реального опыта?
#429 #708470
>>708416
Как будто паттерны в php отличаются от паттернов в других языках.
И там наверное требуют навыка применять паттерны на практике, а не зазубривать их определения.
Примеры реализации в php
http://designpatternsphp.readthedocs.org/ru/latest/README.html

Книга Зандстры еще неплохая.
#430 #708482
Привет аноны
Мне нужна помощь.
мне нужно сделать "написать программу которая считывает текст из файла и выводит его на экран только преложения не содержащие запятых" на php но я не очень понимаю как это сделать. Помоги пожалуйста
>>708520>>709016
20 Кб, 800x109
#431 #708503
Сап двач, знаю, что не личная армия, но всё же попрошу.
Помогите запилить пикрелейтед. Да я дегр, не могу в поргаммирование.
#432 #708514
>>708503
Это что, на php нужно написать?
>>708515
#433 #708515
#434 #708517
>>708503
Где ты берешь эти задания и зачем они тебе?
>>708519
#435 #708519
>>708517
Препод ссаными тряпками отпиздит, если не сделаю. Помогай, анон. (а вообще из учебника, который он дал(учебник по сишарпу))
>>708686
#436 #708520
>>708482
>>708503
Берёшь - и делаешь всё сам после чтения урока ОПа про регулярные выражения: http://archive-ipq-co.narod.ru/l1/regexp.html
Иначе за каким чёртом тебе решать эти задания, если не по учёбе?
Пробуй разобраться сам, тебе все подскажут в треде, но делать за тебя учебное задание - это неправильно.
Там несколько регулярных выражений, достаточно всё просто и для новичков.
#437 #708533
>>708327

>Используй ИДЕ которая по клику переходит к определению класса. Ну и выписывай куда-нибуль зачем какой файл нужен. Обычно там имя файла соответствует имени класса так что даже запоминать не надо.


Нет, мне нужно именно собрать файл по иклюдам. А еще лучше было бы если бы ИДЕ имели функцию разворачивать и сворачивать инклюд. Мне логика интересна как именно в собранном файле связи устроены.
>>708830
#438 #708686
>>708519
Приходишь к преподу и говоришь, что нихуя не знаешь как делать. Вместе сидите и разбираетесь. Нахуя тогда вообще учится, если кто-то будет делать это за тебя?
>>709016
#439 #708798
>>702800 (OP)
sup,
решил пробнуть пхп,
прохожу курс, который написан бравыми анонами http://archive-ipq-co.narod.ru/
https://ideone.com/vpjJRe
вот, собственно, код проги.
Вопрос. почему оно не компилит до конца? оно же остановилось на определённом месте и не делает дальше.
что тут не так? что делать?
#440 #708801
>>702800 (OP)
Поясните про ООП в задаче с регистрацией студентов. Как его использовать и зачем?
>>709010
#441 #708814
>>708798
да ответьте и я дальше мучить пойду, плизик
#442 #708830
>>708533

Ты случайно Си раньше не изучал? В PHP все по другому. Инклуд не вставляет один файл в другой. include просто значит "выполнить код из указанного файла". Соответственно собирать вместе их не имеет смысла.

Ну и в приложениях (с которыми я работаю) обычно 99% файлов содержат ровно одно определение одного класса. Какой смысл их объединять в гигантский файл на миллион строк? Он будет выглядеть примерно так:

- немного кода из index.php
- class A { .... }
- class B { ... }
.....
- class ZZZZ { ....}

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

Если тебе так это надо, ты можешь с помощью token_get_all распарсить файл на токены, найти там инклуды, и вставить их содержимое в файл.

>>708798

На ideone работают русские буквы, если что. У тебя в программе не проверяется случай когда ничья и равное число баллов.
>>708832>>708848
#443 #708832
>>708830
даже сейчас изучаю (в быдловузе, но мне не нравится)
#444 #708837
>>708798
Там всё работает.
>>708841
#445 #708841
>>708837
оно пишет просто: у меня столько, у компа столько
а мне в оутпуте нужна строка, где само уравнение (кто победил, или поровну..)
>>708843>>708846
#446 #708843
>>708841
https://ideone.com/WomORz - вот я просто форкнул твой код, ничего не менял.
Всё заработало, я хз.
>>708844
#447 #708844
#448 #708845
Перекомпилировать не забывайте после сохранения.

https://ideone.com/LjcPs0
#449 #708846
>>708841

Ты не понял.

У тебя программа проверяет толбко такие случаи:

- даблы: (($anon1 == $anon2) && ($comp1 == $comp2))
- победа: ($anonSum > $compSum) {
- проигрыш: ($anonSum < $compSum)

А где проверка ничьи? Ее нету. Тебе надо дописать еще одну ветку в блок if ... elseif которая будет срабатывать если ни один вариант выше не сработал и что-то выводить.
>>708847>>708849
#450 #708847
>>708846
мне это уже выше обьяснили
#451 #708848
>>708830

>Если тебе так это надо, ты можешь с помощью token_get_all распарсить файл на токены, найти там инклуды, и вставить их содержимое в файл.


То что надо! Спасибо!>>708830

>Соответственно собирать вместе их не имеет смысла.


Мне хочется полотно посмотреть в общем виде и побегать по нему. Я пока слабо представляю как по куче папок ориентироваться, там такой граф что я вообще соображать перестаю пока бегаю по отдельным файлам.
>>708870
#452 #708849
>>708846
Аа, да, вот в чём было дело, теперь понятно.
Поэтому я форкнул - уже была не ничья и всё заработало.
#453 #708870
>>708848

Сейчас принято хранить 1 файл в одном классе, а имя класса называть так же как и файл. Это называется PSR-4 и соответственно с закрытыми глазами можно угадать где лежит тот или иной класс: https://github.com/codedokode/pasta/blob/master/php/autoload.md

Если же у тебя старый проект то поможет только ИДЕ с переходом к функции/классу.
>>708889
#454 #708888
Ломаю голову с куками и сессиями. Где можно вычитать разжеванную информацию?
>>712601
#455 #708889
>>708870

>Сейчас принято хранить 1 файл в одном классе, а имя класса называть так же как и файл. Это называется PSR-4 и соответственно с закрытыми глазами можно угадать где лежит тот или иной класс


Мне это не помогает. В классе может использоваться куча use, которые грузят другие классы, которые используются в классе. Классы в классах. Вообще ничего не понимаю как все закручено.
>>709001>>709010
#456 #708917
>>707893
ОП?..
>>708922>>709001
#457 #708922
>>708917
Да успокойся ты, ответит тебе ОП, он всем отвечает, только не сразу, у него бывают паузы в 1 - 3 дня.
#458 #708927
Вопрос по учебнику.
Как вытащить слоги в $name?
http://ideone.com/ZxHqdT
>>708934
#459 #708934
>>708927
К $name приклеить конкатенацией $randomText.
Цикл проходит - каждый раз имя становится больше на слог, который приклеивается.
А дальше всё выводится в echo.
>>708942
#460 #708942
>>708934
Спасибо.
63 Кб, 799x507
Постигая Вектор #461 #708954
Задача про ООО "Вектор", вторая часть (с департаментами), без антикризисных мер.
Я вообще не представляю, как подступиться к решению, я весь в растерянности.

Имеем обязательное для вывода:
1. Названия департаментов
2. Количество сотрудников
3. Расход на зарплату
4. Расход кофе
5. Число страниц документов
6. Средний расход тугриков на одну страницу
7. Среднее значение для всех пунктов
8. Общее количество всего, что есть во всех пунктах

Имеем необходимые методы:
1. Расчёт количества сотрудников в департаментах
2. Расход на зарплату по каждому департаменту
3. Расчёт кофе
4. Расчёт числа страниц
5. Расчёт среднего числа тугриков на страницу
6. Расчёт среднего количества всего, что есть в пунктах
7. Расчёт общего количества всего
8. Функция для вывода данных в колонке

Я не пойму, что вообще надо делать тут, с чего начать.
Попытаюсь ответить на вопросы ОПа.

>Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:


>какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент, может быть еще Компания?)


При чём тут сама Компания, для чего она нужна, если расчёт идет внутри неё? Не понимаю.
Или класс Компания нужен для расчёта всего в целом? Класс Департамент имеет методы для расчета всего внутри. А что тогда имеет класс Сотрудник, кроме просто количества работников, профессии и т.п.? Хм, вроде что-то проясняется, но не совсем.

>какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.


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

>что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.


В каждом классе сделать метод для соответствующего расчёта нужного всего. Например, у нас менеджеры в Департаменте рекламы - методы для подсчёта всех менеджеров, для расчёта их зарплат, подсчёта количества потребляемого кофе, для подсчёта количества страниц и средней стоимости страницы. Тогда экземпляр класса должен содержать профессию, ранг, является ли боссом, в каком департаменте работает, а всё остальное можно держать в ассоциативном массиве типа 'coffee' => 15, 'pages' => 3 - и тому подобное. Ещё количество работников как-то должно учитываться... Не создавать же двух одинаковых менеджеров для одного департамента? Вот это непонятно.

>как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.


Это понимаю как необходимое указание на Департамент при создании экземпляра класса Сотрудник.
Попробую завтра на свежую голову всё воплощать, какой-то взгляд хотя бы возник после всей этой писанины.
Впрочем, как обычно.
Благодарю за внимание.
63 Кб, 799x507
Постигая Вектор #461 #708954
Задача про ООО "Вектор", вторая часть (с департаментами), без антикризисных мер.
Я вообще не представляю, как подступиться к решению, я весь в растерянности.

Имеем обязательное для вывода:
1. Названия департаментов
2. Количество сотрудников
3. Расход на зарплату
4. Расход кофе
5. Число страниц документов
6. Средний расход тугриков на одну страницу
7. Среднее значение для всех пунктов
8. Общее количество всего, что есть во всех пунктах

Имеем необходимые методы:
1. Расчёт количества сотрудников в департаментах
2. Расход на зарплату по каждому департаменту
3. Расчёт кофе
4. Расчёт числа страниц
5. Расчёт среднего числа тугриков на страницу
6. Расчёт среднего количества всего, что есть в пунктах
7. Расчёт общего количества всего
8. Функция для вывода данных в колонке

Я не пойму, что вообще надо делать тут, с чего начать.
Попытаюсь ответить на вопросы ОПа.

>Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:


>какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент, может быть еще Компания?)


При чём тут сама Компания, для чего она нужна, если расчёт идет внутри неё? Не понимаю.
Или класс Компания нужен для расчёта всего в целом? Класс Департамент имеет методы для расчета всего внутри. А что тогда имеет класс Сотрудник, кроме просто количества работников, профессии и т.п.? Хм, вроде что-то проясняется, но не совсем.

>какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.


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

>что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.


В каждом классе сделать метод для соответствующего расчёта нужного всего. Например, у нас менеджеры в Департаменте рекламы - методы для подсчёта всех менеджеров, для расчёта их зарплат, подсчёта количества потребляемого кофе, для подсчёта количества страниц и средней стоимости страницы. Тогда экземпляр класса должен содержать профессию, ранг, является ли боссом, в каком департаменте работает, а всё остальное можно держать в ассоциативном массиве типа 'coffee' => 15, 'pages' => 3 - и тому подобное. Ещё количество работников как-то должно учитываться... Не создавать же двух одинаковых менеджеров для одного департамента? Вот это непонятно.

>как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.


Это понимаю как необходимое указание на Департамент при создании экземпляра класса Сотрудник.
Попробую завтра на свежую голову всё воплощать, какой-то взгляд хотя бы возник после всей этой писанины.
Впрочем, как обычно.
Благодарю за внимание.
>>708964>>709001
#462 #708964
>>708954
Вдогонку: ассоциативный массив лучше, наверное, делать для кофе отдельно ('профессия' => количество литров), для страниц отдельно ('профессия' => количество страниц), для ставки отдельно тоже ('профессия' => базовая ставка).
>>709010
#463 #709001
>>708889

use ничего не грузит

>>707527
>>707893
>>708917

Ничего не знаю про это учебное заведение потому сказать не могу.

>>708954

Если сложно, лучше решать постепенно. Сделать полностью работающий класс Сотрудника, проверить его, потом сделать Департаменты, и тд.

ООП позволяет нам описывать реальные сущности вроде людей, департаментов, компаний с помощью классов (по умному такие объекты называют моделями доменной (предметной) области. То ест объект в нашей программе это модель сотрудника или департамента). Ты должен посмотреть какие сущности нужны в данной задаче.

> При чём тут сама Компания, для чего она нужна,


Это позволяет представить всю компанию с департаментами, в видео одного объекта. Ну вот возьмем антикризисные меры. пердположим, у нас есть функция которая применяет эти меры. Что мы ей передадим? Логично что антикризисные меры применяются к компании, и надо передать что-то что представляет эту компанию (модель компании):

applyAstiCrisisMeasures($company);

> А что тогда имеет класс Сотрудник, кроме просто количества работников, профессии и т.п.?


как минимум объект этого класса хранит информацию о сотруднике - ранг, зарплату и тд. Это ведь надо где-то хранить?

> Не понимаю, почему не надо хранить кофе, если все профессии по-разному потребляют?


Давай я тебе приведу пример. Допустим у нас есть объект, представляющий Прямоугольник. У него есть ширина и высота и мы хотим также знать его площадь. Допустим несмотря на мои полезные советы ты решил сделать свойство "площадь" вместо того чтобы сделать метод, вычисляющий ее из ширины и высоты:

class Rectangle
{
public $width;
public $height;
public $square;

public function __construct($width, $height) { ...}
}

теперь вопрос: если я создам прямоугольник и поменяю его ширину, его площать автоматически обновится? Попробуй сам сделать такой класс и проверить.

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

> Ещё количество работников как-то должно учитываться... Не создавать же двух одинаковых менеджеров для одного департамента? Вот это непонятно.


Создать 2 объекта. Были люди которые пытались сделать объект, который позволяет хранить нескольких одинаковых работников сразу. Но когда тебе надо например повысить зарплату части из них, это все становится неоправданно сложным.

> Это понимаю как необходимое указание на Департамент при создании экземпляра класса Сотрудник.


А в твоей схеме Сотрудник может менять Департаменты? Уволиться? В твоей схеме, мы можем из департамента получить список его сотрудников? Он будет актуальный?
#463 #709001
>>708889

use ничего не грузит

>>707527
>>707893
>>708917

Ничего не знаю про это учебное заведение потому сказать не могу.

>>708954

Если сложно, лучше решать постепенно. Сделать полностью работающий класс Сотрудника, проверить его, потом сделать Департаменты, и тд.

ООП позволяет нам описывать реальные сущности вроде людей, департаментов, компаний с помощью классов (по умному такие объекты называют моделями доменной (предметной) области. То ест объект в нашей программе это модель сотрудника или департамента). Ты должен посмотреть какие сущности нужны в данной задаче.

> При чём тут сама Компания, для чего она нужна,


Это позволяет представить всю компанию с департаментами, в видео одного объекта. Ну вот возьмем антикризисные меры. пердположим, у нас есть функция которая применяет эти меры. Что мы ей передадим? Логично что антикризисные меры применяются к компании, и надо передать что-то что представляет эту компанию (модель компании):

applyAstiCrisisMeasures($company);

> А что тогда имеет класс Сотрудник, кроме просто количества работников, профессии и т.п.?


как минимум объект этого класса хранит информацию о сотруднике - ранг, зарплату и тд. Это ведь надо где-то хранить?

> Не понимаю, почему не надо хранить кофе, если все профессии по-разному потребляют?


Давай я тебе приведу пример. Допустим у нас есть объект, представляющий Прямоугольник. У него есть ширина и высота и мы хотим также знать его площадь. Допустим несмотря на мои полезные советы ты решил сделать свойство "площадь" вместо того чтобы сделать метод, вычисляющий ее из ширины и высоты:

class Rectangle
{
public $width;
public $height;
public $square;

public function __construct($width, $height) { ...}
}

теперь вопрос: если я создам прямоугольник и поменяю его ширину, его площать автоматически обновится? Попробуй сам сделать такой класс и проверить.

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

> Ещё количество работников как-то должно учитываться... Не создавать же двух одинаковых менеджеров для одного департамента? Вот это непонятно.


Создать 2 объекта. Были люди которые пытались сделать объект, который позволяет хранить нескольких одинаковых работников сразу. Но когда тебе надо например повысить зарплату части из них, это все становится неоправданно сложным.

> Это понимаю как необходимое указание на Департамент при создании экземпляра класса Сотрудник.


А в твоей схеме Сотрудник может менять Департаменты? Уволиться? В твоей схеме, мы можем из департамента получить список его сотрудников? Он будет актуальный?
>>709213
#464 #709010
>>708964

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

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

>>708889

Начни с точки входа и смотри как что вызывается. Рисуй какие классы есть и как они связаны. Обычно в ООП один класс отвечает за что-то одно, попробуй понять за что.

>>708801

ООП придуман для того чтобы писать более структурированный (то есть разбитый на относительно небольшие слабосвязанные части), а не сплошной запутанной простыней. Объекты позводяют хранить информацию о каких-то сущностях (например Студентах), и делать операции над ними (например сохранять в базу или проверять правильность заполнения полей).

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

Реальные приложения большие и сложные. Без ООП их вообще невозможно писать и поддерживать. И соовтетственно от всех желающих с ними работать требуется знание ООП.

Если ты решал наши задачи про Вектор и Кошек-Мышек то как минимум базовые знания у тебя есть. А дальше читай комментарии к задаче где все подробно расписано.

А какие ты видишь альтернативы? Лапшу где все перемешано в кучу, нам не надо. Кучу функций которые жонглируют массивами сложной структуры - тоже.

Покажи строк 10-20 кода которым ты бы стал решать эту задачу, если у тебя есть альтернативный подход.
#465 #709016
>>708686

Вузовский препод это не репетитор. Ему не выгодно тратить время на одного студента когда можно прочесть лекцию и за то же время передать знания сотне человек.

>>708482

Бесплатно вряд ли кто за тебя будет твои задачи делать.

>>708419

Думаю ты переоценил свои силы.

>>708325
>>708287

* речь о PDO конечно же

>>708227

В phpstorm нет "своего" интерпретатора. он умеет либо запускать программу через командную строку стандартным интерпретатором, либо поднимает веб-сервер и использует php для выполнения скриптов. В настройках по моему задается путь к php и выбирается режим работы.

>>708176

Задание 4:

Я думаю. тут не стоило вешать везде класс block. Без него будет аккуратнее. А то тут этот класс почти на все теги повешен.

В остальном, верно.

Задание 5:

> font-family: Arial;


В конце списка должен быть стандартный шрифт вроде sans-serif.

Решено верно.
#465 #709016
>>708686

Вузовский препод это не репетитор. Ему не выгодно тратить время на одного студента когда можно прочесть лекцию и за то же время передать знания сотне человек.

>>708482

Бесплатно вряд ли кто за тебя будет твои задачи делать.

>>708419

Думаю ты переоценил свои силы.

>>708325
>>708287

* речь о PDO конечно же

>>708227

В phpstorm нет "своего" интерпретатора. он умеет либо запускать программу через командную строку стандартным интерпретатором, либо поднимает веб-сервер и использует php для выполнения скриптов. В настройках по моему задается путь к php и выбирается режим работы.

>>708176

Задание 4:

Я думаю. тут не стоило вешать везде класс block. Без него будет аккуратнее. А то тут этот класс почти на все теги повешен.

В остальном, верно.

Задание 5:

> font-family: Arial;


В конце списка должен быть стандартный шрифт вроде sans-serif.

Решено верно.
#466 #709020
>>702800 (OP)
Я тут мимо проходил и просто хотел сказать большое спасибо ОПу, который няшка и вообще молодец - ты мне очень помог с дипломом.
>>709023
#467 #709021
>>708115

Там написан не возраст, а сколько лет пройдет. 49 лет пройдет, 65 лет возраст будет. Решение верное.

>>708062

В elseif есть условие, в else условия нету и оно идет самым последним.

>>708042

Имей в виду паттерны изучать мало смысла без примеров реального использования. Изучай код фреймворка Симфони - там паттернов полно.

>>707994

В rewriteRule можно использовать флаг [QSA] который дописывает исходные параметры в УРЛ.
#468 #709023
>>709020

Спасибо на добром слове

>>707994

Лучше не закладывать жесткие правила в роутер, плохо когда структуру УРЛ приходится подгонять под роутер.

Также важно чтобы у каждой страницы был уникальный адрес и страница не была доступна по нескольким адресам.

>>707962

> задача на автомобильный номер


> [а-яё]{1}


{1} можно было и не писать

В остальном верно.

По задаче с телефонами: у тебя регулярка захватывает не весь номер, а только его конец. Попробуй подать ей на вход например "aaaaaaaaaaaaaaaaaaaaaaa12345678" и увидишь.

Пробельные символы (пробел, перевод строки и еще пара редких символов) можно в регулярке обозначит как \s. Либо просто вписат пробел.

Также, в учебнике есть список номеров, проверь себя на нем.
#469 #709024
>>707954

Нет. Это массив для пришедших снаружи параметров.

>>707909

Анончик, у тебя спутник отскакивает от краев орбиты как от стенок. Но на самом деле он должен плавно замедляться до нуля и плавно разгоняться. Если я не путаю, то координата со временем изменгяется как синус или косинус, а скорость (которая является производной от f(x) ) - как косинус или синус.

CSS-анимация не позволяет задать синусоидальный закон, она использует кривую Безье (вики https://ru.wikipedia.org/wiki/Кривая_Безье ), но ты можешь подобрать коэффициенты чтобы подогнать сплайн под синусоиду. Или попробовать погуглить, может кто-то это уже сделал.

Вот тебе сайт с наглядным графиком: http://cubic-bezier.com/

Можешь погуглить еще по css animation timing generator, css animation bezier generator

Ну и добавил бы пару мигающих звезд что ли .
#470 #709027
>>707916

Так он дан как пример того что делать не надо.

>>707784

Если нужно больше - придется видимо использовать DECIMAL

>>707610

> Другие способы (jquery прилепливает какой-то нестандартный http-заголовок) не очень кошерные, не во всех браузерах работают.



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

Использовать наверно выгоднее одну фукнции, а не копипастить. Это будет нарушение DRY.

>>707519

как-то через hover

>>707507

Зачем джойнить на подзапрос? SELECT FROM table AS a JOIN table AS b ON ....

>>707420

Надо исправлять. Там написано: array_walk ждет что вторым параметром ей передадут функцию (колбек), а ты ей дал какой-то левый массив.

>>707304

> задача на шифт


ой, сплошная нечитаемая стена текста. Ставь комментарии перед строчкой, а не справа, и отформатируй текст как написано во втором посте треда.

> mb_substr($trimmed, 0, 1, 'UTF-8')


кодировку писать не надо если есть mb_internal... в начале

> $splitedText as $value)


value надо переименовать в sentence

> function makeFirstLetterUppercase($text)


Назвнаие функции не соответствует тому что она делает

> $trimmed = trim($value);


Не надо заводить новую переменную тут

> $uperCase = mb_strtoupper(mb_substr($trimmed, 0, 1, 'UTF-8'), 'UTF-8') .


> mb_substr($trimmed, 1, mb_strlen($trimmed), 'UTF-8');


Это надо вынести в отдельную функцию

> $regexp = ["/((\s))(\.)((\s))/" , "/((\s))(\?)((\s))/"


Эти все регулярки надо объединить в одну.
#470 #709027
>>707916

Так он дан как пример того что делать не надо.

>>707784

Если нужно больше - придется видимо использовать DECIMAL

>>707610

> Другие способы (jquery прилепливает какой-то нестандартный http-заголовок) не очень кошерные, не во всех браузерах работают.



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

Использовать наверно выгоднее одну фукнции, а не копипастить. Это будет нарушение DRY.

>>707519

как-то через hover

>>707507

Зачем джойнить на подзапрос? SELECT FROM table AS a JOIN table AS b ON ....

>>707420

Надо исправлять. Там написано: array_walk ждет что вторым параметром ей передадут функцию (колбек), а ты ей дал какой-то левый массив.

>>707304

> задача на шифт


ой, сплошная нечитаемая стена текста. Ставь комментарии перед строчкой, а не справа, и отформатируй текст как написано во втором посте треда.

> mb_substr($trimmed, 0, 1, 'UTF-8')


кодировку писать не надо если есть mb_internal... в начале

> $splitedText as $value)


value надо переименовать в sentence

> function makeFirstLetterUppercase($text)


Назвнаие функции не соответствует тому что она делает

> $trimmed = trim($value);


Не надо заводить новую переменную тут

> $uperCase = mb_strtoupper(mb_substr($trimmed, 0, 1, 'UTF-8'), 'UTF-8') .


> mb_substr($trimmed, 1, mb_strlen($trimmed), 'UTF-8');


Это надо вынести в отдельную функцию

> $regexp = ["/((\s))(\.)((\s))/" , "/((\s))(\?)((\s))/"


Эти все регулярки надо объединить в одну.
#471 #709028
Ааа, как меня уже тошнит от всех этих документацй.
Опытные программисты их знают наизусть, или благодаря опыту знают как в них искать?

Вот где у этого перфоратора можно выставить версию стандарта html?
http://htmlpurifier.org/live/configdoc/plain.html
Я имею ввиду, мне нужен естественно html5, а он мне подрубает под какой-то xhtml что ли, проставляет слеши в конце инпутов и прочих одиночных тегов.
>>709030
#472 #709029
>>707304

> задача на yodaSpeak



> array_walk($reversedText, ($reversedText


Вторым параметром надо передавать функцию. Ты же просто передал значение переменной reservedText, то есть какой-то текст.

Почитай про колбеки

http://php.net/manual/ru/functions.anonymous.php
http://webnotes.by/docs/php/callback-funkcii-v-php
https://habrahabr.ru/post/147620/

Да и там не нужен array_walk, там можно регулярку применить к получившейся строке.

> function trim_value(&$value)


нельзя определять функцию внутри функции. Потому что при втором вызове reverseText будет ошибка.

Ну и кода много, сократи как-нибудь.

>>707006
>>706993

> str_replace(" ","",$text1);


str_replace не изменяет строку, а создает новую. Ты ее никуда не сохраняешь и потому эта команда ничего не делает.

> $text1=mb_strtolower($text);


Не надо тут новую переменную создавать

> ($count-$i)


Непаврильно, так как символы отсчитываются с 0.

Попробуй добавить echo и выводить сравниваемые символы.
#472 #709029
>>707304

> задача на yodaSpeak



> array_walk($reversedText, ($reversedText


Вторым параметром надо передавать функцию. Ты же просто передал значение переменной reservedText, то есть какой-то текст.

Почитай про колбеки

http://php.net/manual/ru/functions.anonymous.php
http://webnotes.by/docs/php/callback-funkcii-v-php
https://habrahabr.ru/post/147620/

Да и там не нужен array_walk, там можно регулярку применить к получившейся строке.

> function trim_value(&$value)


нельзя определять функцию внутри функции. Потому что при втором вызове reverseText будет ошибка.

Ну и кода много, сократи как-нибудь.

>>707006
>>706993

> str_replace(" ","",$text1);


str_replace не изменяет строку, а создает новую. Ты ее никуда не сохраняешь и потому эта команда ничего не делает.

> $text1=mb_strtolower($text);


Не надо тут новую переменную создавать

> ($count-$i)


Непаврильно, так как символы отсчитываются с 0.

Попробуй добавить echo и выводить сравниваемые символы.
#474 #709088
ОПецкий, а есть что-то подобное твоим урокам, только по C#? Уж больно хорошо у тебя все организовано, хочется чего-то такого же.
>>709097
#475 #709097
>>709088
MVSAcademy например
38 Кб, 807x369
#476 #709100
Сап погромач, есть один сайт.и мне надо что-бы в меню подсвечивалась ссылка текущей страницы пользователя.
Как у меня все сделано:
есть include.php который на все страницы подгружает меню
на всех страницах объявлены переменные с идентификаторами
страниц (например: страница "главная" на ней объявлена переменная "page=1", страница "профиль" на ней объявлена переменная "page=2". и тд)
В файле include.php содержится меню, в отдельном css файле содержаться стили для меню.
в фаиле include.php реализовано условие которое проверяет что содержится в переменной page и в соответсвии со значением переменой добавляет стиль(подсветка меню) к текущему эллементу меню на странице которого находится пользователь. НО БЛЯТЬ НИХЕРА НЕ РАБОТАЕТ. Двощь, чтоя делаю не так?
>>712601
#477 #709113
А можно как-то передать переменнуюв пост запрос, исключая инпуты, селекты и текстареи?
>>709158
#478 #709158
#479 #709165
https://jsfiddle.net/2pm6jezm/

Что не так с моей клиентской валидацией?

Алсо, где можно почитать про синтаксис?
>>709438>>712601
15 Кб, 400x224
немного мотивации #480 #709170
#481 #709173
Новичок итт.
Ситуация следующая. Знания о php околонулевые, но есть некоторый опыт в изучении Java (21 уровень javarush, если это о чем-нибудь говорит). На java решил забить, поскольку не вижу никаких перспектив - в нашем городе все вакансии расчитаны только минимум на миддлов, к тому же, как я понял, java это больше т.н. "энтерпрайз", а у меня сильное отвращение к корпоративщине и ее унылым задачам. К андроид-разработке тоже симпатий особых нет. Была мысль переключиться в сторону геймдева на C#, это да, это интересно, но надо быть реалистом, я такое не потяну чисто в интеллектуальном плане, плюс опять же, в этой сфере джунов очень не жалуют, да и просто-напросто вакансий в городе нет вообще.
С другой стороны, на php вакансий заметно больше, причем есть варианты и для джуниоров. К тому же, мне кажется, все-таки от php-джуниора на начальных этапах требуют поменьше, чем от java-джуниора, что мне тоже видится немаловажным, так как все-таки мне далеко до гения.
Поэтому я принял решение изменить свое направление учебы и посмотреть в сторону php. Что скажете?

И еще вопрос: за время существования этих тредов кому-то удалось найти работу?
#482 #709192
>>709173
Уже дрочи джаву до конца. Иначе так и будешь метаться с языка на язык.
>>709216
#483 #709213
>>709001
Спасибо!

>Если сложно, лучше решать постепенно. Сделать полностью работающий класс Сотрудника, проверить его, потом сделать Департаменты, и тд.


Да, сейчас так начинаю делать абсолютно всё.

>Ну вот возьмем антикризисные меры. пердположим, у нас есть функция которая применяет эти меры. Что мы ей передадим? Логично что антикризисные меры применяются к компании, и надо передать что-то что представляет эту компанию (модель компании):


>applyAstiCrisisMeasures($company);


Сложновато, ох как сложновато...

>как минимум объект этого класса хранит информацию о сотруднике - ранг, зарплату и тд. Это ведь надо где-то хранить?


Получается, вообще практически всё лучше помещать в сам объект? И зарплату, и потребление кофе (на всякий случай), и даже ставку, потому что её в экземпляре класса проще поменять?
То есть мне нужно будет кучу раз копировать одинаковых сотрудников?
Например, вот так (примерные значения):

>public function __construct($department, $profession, $coffee, $boss, $rank, $pages, $basicSalary);


>new Employees('Реклама', 'Me', 15, false, 1, 3, 400);


>new Employees('Реклама', 'Me', 15, false, 1, 3, 400);


>new Employees('Продажи', 'En', 25, true, 3, 5, 700);


- и так по каждому работнику с копированием одинаковых?.. Как-то всё напоминает мне мои топорные прошлые решения, без изящества и с кучей скопированных моментов...

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


>помни что во второй части надо иметь возможность индивидуально менять базовую ставку части работников. То есть 2 человека одной профессии и одного ранга не обязательно получают одинаково.


Зарплата у нас рассчитывается исходя из базовой ставки и ранга. Базовую часть мы можем поменять, получается, в определении каждого экземпляра класса.
Это то, что требуется в данном случае? Вручную менять некоторые значения у каждого работника?
Кое-что сделал сейчас для класса Employees: http://ideone.com/9ZrUd2
Ужасающая часть с определением экземпляров класса Employees - это нормально вообще? Но не кажется это правильным.
Однако потом можно у каждого менять что угодно...
#483 #709213
>>709001
Спасибо!

>Если сложно, лучше решать постепенно. Сделать полностью работающий класс Сотрудника, проверить его, потом сделать Департаменты, и тд.


Да, сейчас так начинаю делать абсолютно всё.

>Ну вот возьмем антикризисные меры. пердположим, у нас есть функция которая применяет эти меры. Что мы ей передадим? Логично что антикризисные меры применяются к компании, и надо передать что-то что представляет эту компанию (модель компании):


>applyAstiCrisisMeasures($company);


Сложновато, ох как сложновато...

>как минимум объект этого класса хранит информацию о сотруднике - ранг, зарплату и тд. Это ведь надо где-то хранить?


Получается, вообще практически всё лучше помещать в сам объект? И зарплату, и потребление кофе (на всякий случай), и даже ставку, потому что её в экземпляре класса проще поменять?
То есть мне нужно будет кучу раз копировать одинаковых сотрудников?
Например, вот так (примерные значения):

>public function __construct($department, $profession, $coffee, $boss, $rank, $pages, $basicSalary);


>new Employees('Реклама', 'Me', 15, false, 1, 3, 400);


>new Employees('Реклама', 'Me', 15, false, 1, 3, 400);


>new Employees('Продажи', 'En', 25, true, 3, 5, 700);


- и так по каждому работнику с копированием одинаковых?.. Как-то всё напоминает мне мои топорные прошлые решения, без изящества и с кучей скопированных моментов...

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


>помни что во второй части надо иметь возможность индивидуально менять базовую ставку части работников. То есть 2 человека одной профессии и одного ранга не обязательно получают одинаково.


Зарплата у нас рассчитывается исходя из базовой ставки и ранга. Базовую часть мы можем поменять, получается, в определении каждого экземпляра класса.
Это то, что требуется в данном случае? Вручную менять некоторые значения у каждого работника?
Кое-что сделал сейчас для класса Employees: http://ideone.com/9ZrUd2
Ужасающая часть с определением экземпляров класса Employees - это нормально вообще? Но не кажется это правильным.
Однако потом можно у каждого менять что угодно...
>>709274
#484 #709216
>>709192
Нет вакансий для джунов (а если и появляются раз в год, то там порог входа очень высок) - нет смысла учить.
23 Кб, 500x500
#485 #709220
>>709216

>>Нет вакансий для джунов



тленчик безысходнюличка
#486 #709223
>>709216
Наивный. Ты думаешь, что пхп сейчас выучишь и найдешь работу? Да хуй там. Открой вакансии и посмотри, там блять весь стек веб-технологий должен джун знать, такие вот охуевшие работодатели. Парочку фреймворков, парочку cms, адаптивную кроссбраузерную валидную верстку, линукс, уметь ставить и настраивать сервер ну и прочая хуйня по мелочи. О JS, Ajax, Jquery, SQL я уж не говорю это и так понятно, должно от зубов отскакивать. И даже зная все это ты будешь конкурировать с 15 летними школьниками.
#487 #709226
Какие плагины желательны для комфортного кодинга для vim?
>>712601
#489 #709230
>>709229
ЧТО Я ДЕЛАЮ НЕ ТАК?
>>709263
#490 #709235
Блять, в чем смысл Factory Method? Какая разница будем мы создавать напрямую нужный нам подкласс, типа $var = new ProductOne();
Или через этот ебаный шаблон так: $var = new ProductOneCreator();
Я вообще не догоняю в чем смысл этих лишних телодвижений. Вчера вроде бы понимал, а сегодня проснулся и перестал понимать.
>>709277
#491 #709236
>>709229
$debt никогда не будет равен нулю у тебя, соответственно, цикл вечный.
Поставь var_dump($debt); в цикл - увидишь, как $debt только увеличивается, а не уменьшается.
Подход твой вообще не совсем верен.
Не надо в цикл ставить выражения на первых порах, просто разберись для начала, как это всё функционирует.
>>709263
#492 #709237
>>709229
Что это $debt-$payments
Конечно у тебя фейл в цикле, дальше даже не читал ибо нахуй. Ты же понимаешь, что там не должно быть 8 итераций, а у тебя там их будет именно столько
>>709263
#493 #709240
>>709173

>21 уровень javarush, если это о чем-нибудь говорит


Это говорит о том, что ты подрочил самые основы и дропнул.
А вообще ты странный. Тырпрайз уныл, андроид вызывает отвращение, а клепать сайтики - дохуя весёлое занятие?
>>709250
#494 #709241
>>709223
Такое послушать - так вообще кажется, что пытаться влезть в программирование является безнадежной затеей.
#495 #709242
>>709216
И чего ты про "в моем городе" заладил? Люди вон переезжают в другие города как раз в поисках работы, социальная мобильность, вся хуйня. А ты хочешь ничего не делать, но чтобы всё было.
>>709246
6 Кб, 183x222
#496 #709243
Начал делать задачу на вектор и сразу какой-то пиздец вышел. Я правильно начал?
#497 #709245
>>709243
Эт чё у тебя там такое? Зачем куча файлов, для чего?

Я выше у ОПа спрашиваю, как быть с этой задачей
>>709254>>709259
#498 #709246
>>709242
Потому что я не собираюсь никуда переезжать, в итоге оставаясь совсем один, да еще и без жилья.
>>709256
#499 #709250
>>709240
Сайтики не так уныло.
Совсем не уныло, а наоборот, интересно - это игры, но в эту сферу, как я и сказал, нереально попасть, если ты не высококлассный профи.
>>709256
#500 #709252
>>709243
Нет
>>709254
#501 #709254
>>709245

ну каждый класс - один файл. Исходя из задачи у нас компания, департамент, департамент_имя, сотрудник, сотрудник_имя.

почитал твои вопросы и ответы и нихуя не понял
>>709252

а как правильно?
#502 #709256
>>709246
У меня двое знакомых так понаехали в ДС2. Один работал стажером в 1С в своем мухосранске зп еду, в течение пары месяцев нашел работу на 50к. Второй был эникейщиком, на новом месте тоже эникеил, параллельно учил руби, сейчас полностью перешел на него, не жалуется.
Но ты можешь и дальше сидеть на жопе, чому нет.

>>709250
Да не то, чтобы сайты были унылы хотя мне не нравится, я просто не особо понимаю, чем это хуже того же андроида.
Игры весело делать, если ты геймдизайнер, для рядового программиста никакого волшебства в этом процессе нет, тупо кодишь то, что сказали. Ну и, да, вкатываться туда те, кто реально этого хочет, люди, которые с детства пишут моды, участвуют в конкурсах, состоят в каких-то сообществах, это всё.
>>709265
#503 #709259
>>709245

да и вообще, думаю, может запилить сначала диаграмму классов перед писанием, думаю проще будет
#504 #709263
>>709236
>>709237
$debt-=$payments
Я лох, спасибо за подсказку, ананы. Пофиксил на форке.
>>709230
Фейлокод редактировать не буду, пусть останется уроком анонам.
Вот решение: http://ideone.com/lObIMN
БУДЬ ВНИМАТЕЛЬНЕЕ, АНОН!
#505 #709264
#506 #709265
>>709256
Интересно, сколько из этих 50к он отдает местному феодалу за право жить в крохотной комнатушке.
>>709266
#507 #709266
>>709265
Ну, стартовая у него была 50, сейчас кажется около 70, может больше, давно не общались. Квартиру вполне можно снимать тысяч за 25.
Знакомая понаехавшая тян работает манагеров в интернет-магазин, получает 50к, снимает квартиру в 10 минутах от метро за 20, квартирка, впрочем, так себе, но ее устраивает, да и на работе она 80% времени нихуя не делает, а 30к на одного человека - вполне себе норм.
Нахуй вообще жить с таким отношением? Везде всё плохо, везде пиздец, все хотят наебать, пойду выпилюсь.
>>709273
Объявление #508 #709271
Обновил урок по ООП, зайдите, почитайте.

Сделал оффлайновый актуальный архив сайта: http://rghost.ru/6bfCY9lfl
>>709319
#509 #709273
>>709266

>Нахуй вообще жить


А меня не спрашивали, хочу я жить или нет. Выбросили в этот мир и все, мучайся, страдай, ну, или превозмогай, если сможешь.
>>709287
#510 #709274
>>709173

За интересные задачи меньше платят - зачем платить, если и так интересно работать? Геймдев в России - это клонирование социальных или мобильных игр для умственно отсталых, туда можно идти если ты не очень хорошо программируешь, или хочешь со всякими странными личностями познакомиться.

> за время существования этих тредов кому-то удалось найти работу?


ОПу

>>709213

Ты сходи-ка перечитай обновленный урок по ООП (теперь с картинкой!)

> Получается, вообще практически всё лучше помещать в сам объект? И зарплату, и потребление кофе (на всякий случай), и даже ставку, потому что её в экземпляре класса проще поменять?


в данном случае да

> То есть мне нужно будет кучу раз копировать одинаковых сотрудников?


можешь хранить данные в массиве и по ним создавать

Почему Employees во множественном числе если он предствляет одного работника?

В конструкторе что-то дофига полей.

> public function getRate()


Зачем это выдавать наружу из класса?

> new Employees('Закупки', 'Me', 20, false, 1, 200, 500),


> new Employees('Закупки', 'Me', 20, false, 1, 200, 500),


> new Employees('Закупки', 'Me', 20, false, 1, 200, 500),


что есть в пхп для выполнения повторяющихся действий?
#510 #709274
>>709173

За интересные задачи меньше платят - зачем платить, если и так интересно работать? Геймдев в России - это клонирование социальных или мобильных игр для умственно отсталых, туда можно идти если ты не очень хорошо программируешь, или хочешь со всякими странными личностями познакомиться.

> за время существования этих тредов кому-то удалось найти работу?


ОПу

>>709213

Ты сходи-ка перечитай обновленный урок по ООП (теперь с картинкой!)

> Получается, вообще практически всё лучше помещать в сам объект? И зарплату, и потребление кофе (на всякий случай), и даже ставку, потому что её в экземпляре класса проще поменять?


в данном случае да

> То есть мне нужно будет кучу раз копировать одинаковых сотрудников?


можешь хранить данные в массиве и по ним создавать

Почему Employees во множественном числе если он предствляет одного работника?

В конструкторе что-то дофига полей.

> public function getRate()


Зачем это выдавать наружу из класса?

> new Employees('Закупки', 'Me', 20, false, 1, 200, 500),


> new Employees('Закупки', 'Me', 20, false, 1, 200, 500),


> new Employees('Закупки', 'Me', 20, false, 1, 200, 500),


что есть в пхп для выполнения повторяющихся действий?
>>709279
#511 #709276
Вопрос по учебнику.
Как теперь сравнивать буквы в цикле?
https://ideone.com/jBKUq2
>>712601
#512 #709277
>>709223

Попробуй не конкурировать со школьниками - устройся в Яндекс или Гугл. Там люди разных возрастов.

>>709235

А-а, значит ты ничего не понял.

> https://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования)



> Фабричный метод (англ. Factory Method также известен как Виртуальный конструктор (англ. Virtual Constructor)) — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса.


Это если ты хочешь дать возможнсть в наследнике переопределить процесс и тип создаваемого объекта. Ну есть у тебя допустим библиотека. В библиотеке класс ПарсерHTML и он создает дерево объектов DOMElement.

Ты исплоьзуешь библиотеку, но хотел бы расширить объекты DOMElement наследованием, улучшив их. Но так как код создания этих объектов в Парсере который написал не ты, ты не можешь ничего поменять.

Фабричный метод решает эту проблему.

Ты забываешь что часто разные части кода пишут разные люди и ты не можешь просто так взять и поменять что тебе хочется в чужой библиоетке.

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

Хочешь изучать паттерны - открывай код Симфони 2 и ищи их там, читай пояснения и думай зачем они там применены.
#513 #709278
>>709277
А чего сразу не в NASA?
#514 #709279
>>709274

>туда можно идти если ты не очень хорошо программируешь,


Как раз в геймдев, даже российский, попасть тяжелее всего.
#515 #709287
>>709243

По каким причинам для каждого департамента делается свой класс? В них есть хоть какая-то разница?

Ты тоже перечиатй обновленный урок по ООП.

>>709273

А за то что ты оффтопишь, тебя выбросят еще и из этого раздела. В тред перезвонивших с такими разговорами.
#516 #709303
https://m.habrahabr.ru/company/nixsolutions/blog/281004/

Автору этой статьи надо идти работать в пропаганду - он умудрился даже те вещи где руби проигрывает, подать как преимущество.
#517 #709304
>>709277
Да, я делал задачи на студентов и файлообменник. Не идеально конено, но все же с основами ООП знаком. Я просто не могу понять суть этого паттерна. Там же параллельно идут объекты, которые нам нужно генерировать (подклассы) и подклассы фабрики. Мы так или иначе создаем экземпляр одного из классов. В чем тогда смысл?
Вот например накидал - http://ideone.com/6E7teK
Какая разница писать так:
$creator_one = new ProductOneCreator(); //здесь же мы все-равно привязываемся к конкретному продукту
$product_one = $creator_one->getProduct();

или сразу так:
$product_one = new ProductOne();
>>709880
#518 #709305
Блин, такое ощущение, что фронт-энд - это основной индикатор успешности сайта. Всем похуй, какие костыли внутри движка, главное, чтобы было МОДНА. И больше всего времени уходит именно на фронт-энд. Сейчас верстаю, и внутренний я просто блюет от этого макакина труда. Абсолютно автоматическая работа, но долгая, нудная и меньше всего оплачиваемая из-за вкатившихся гуманитариев.
Эх. Что посоветуете? Как не тратить время на фронт?
>>712602
#519 #709315
Есть смысл в этом треде сидеть если я хочу во фронтэнд вкатиться? Ну и раз уж на то пошло, то какое из этих направлений по-профитнее?
>>709447
#520 #709319
>>709271
Подсказки для мышек - это хорошо, ̶н̶а̶к̶о̶н̶е̶ц̶-̶т̶о̶ ̶е̶е̶ ̶к̶т̶о̶-̶т̶о̶ ̶б̶у̶д̶е̶т̶ ̶в̶ы̶к̶л̶а̶д̶ы̶в̶а̶т̶ь̶ ̶в̶ ̶т̶р̶е̶д̶ анонам будет проще. Судя по старым тредам все начинали с двумерного массива.
>>709321
#521 #709321
>>709319

>Судя по старым тредам все начинали с двумерного массива.


А как надо было?
>>709323
#522 #709323
>>709321
Одномерным жи.
>>709324
#523 #709324
>>709323
Как отразить двухмерное поле в одномерном массиве?
>>709325>>709882
#524 #709325
>>709324
Вот что мне ответил оп в прошлом году:

>А зачем нам нужен двухмерный массив букв если удобнее просто хранить список животных? У них ведь есть координаты так что массив с буквами избыточен.

#525 #709327
>>709325
Он тебе, как я понял, про создание массива с животными намекал.
#526 #709330
>>709325
Массив букв?
Ну а список животных очевидно нужно хранить в одномерном массиве, куда там двойной? А вот само поле я не представляю как ты представишь одномерным массивом.
#527 #709332
>>709263
Нет, не совсем правильно решено.
40к считает верно, а попробуй проверить на кредите в 1к - там ерунда выходит, хотя должно 2030 рублей получиться.
>>709802
#528 #709334
>>709325
Да аноны, немного ввел вас в заблуждение. Поле будет двумерным. Но вы его не заполняйте сразу точками. Пишите функцию showField которая проверяет координаты объектов и если в данной клетке будет животное - выводите его символ, в противном случае изображайте поле (просто точку можно, например).
>>709338
#529 #709338
>>709334
Это про список животных он писал на счет одномерности.
#530 #709340
>>709173

>за время существования этих тредов кому-то удалось найти работу?


Я помню двух человек, один сделал список студентов и устроился джуном, второй сделал файлообменник и тоже устроился джуном. Так что если есть желание, то работу найти не проблема.
#531 #709346
>>709263
На тыще всё ломается, решение неправильное.
>>709802
#532 #709438
>>709165

>Что не так с моей клиентской валидацией?


>pattern="[A-Za-zА-Яа-яЁё]{3, 20}"


Разобрался, лишним был пробел в квантификаторе.
>>709490
#533 #709447
>>709315
Фронтенд профитнее
#534 #709488
Как часто PHP-программисту в офисе приходится ковыряться в Bitrix, CMS, процедурке? Если половина заданий от гендира связана с CMS, а половина с фреймворками/"пиши на чём хочешь", это хорошо? Если есть только требования и никакого абсолютно cod-review? Джуну нормально с такого начинать?
>>709961
#535 #709490
>>709438
Ввожу своё имя - выдаёт "Пожалуйста, используйте требуемый формат".
ЧЯДНТ?
>>709927
#536 #709521
https://habrahabr.ru/post/198450/

>пример data mapper


>public function saveFoo(Foo &$foo)


Что, простите?
Объект ведь и так передается по ссылке. Это они чтобы "на верника", или я чего-то не понимаю?
>>709557>>709961
15 Кб, 576x161
#537 #709541
Почему PHPStorm постоянно указывает на то, что метод не находится в соответствующем классе? При этом всё отлично работает, на Идеоне нет никаких ошибок, на Апаче нет ошибок, в самом Шторме нет ошибок.
Как это починить?
#538 #709557
>>709521
Поясните за ссылки, ни разу ими не пользовался. Они вообще нужны?
>>709961>>712602
10 Кб, 200x170
#539 #709598
ООО Вектор
Я опять выхожу на связь. Немного приуныл из-за того, что моё решение оказалось хуетой и вдоволь посаморазвивавшись анимой слепил вот это: http://ideone.com/egckIk .
Оп, ты писал насчет использования констант классов для обозначения должности. Поясни как их использовать, мануал написан как-то ебануто и я ничего не понял.
>>709961>>714988
#540 #709627
ОП, скажи пожалуйста, какого рода задачи ты делаешь на работе? Очень интересно. Ведь вряд ли человек с твоим уровнем клепает интернет магазины или лендинги на цмс. Меня не покидает ощущение что на текущей работе я буду заниматься только этим, и у меня нет ни времени ни сил изучать что-то для своего роста (angular, фреймворки и тд)
>>709672>>709963
#541 #709672
>>709627
Во-первых, нормальный интернет-магазин даже сеньор в одиночку не сделает. Это один из самых сложных типов проектов, наряду с соц-сетями.
Во-вторых, уровень знаний опа еле-еле тянет на миддла. Куча ошибок и неточностей в статьях. Я как открыл, сразу закрыл с фейспалмом.
#542 #709674
>>709672
Каких неточностей? Сказал А, говори и Б.
Иначе - толсто!
#543 #709694
>>702800 (OP)
В задачке про студентов требуется:

>После регистрации сайт должен запомнить пользователя и вместо формы регистрации показывать форму редактирования своих данных.



Форма должна меняться после обновления страницы или прямо в реальном времени? Или на Пхп нельзя писать скрипты, как на ЖС?
>>709929>>709963
#544 #709717
>>709672
Так никто с нуля не пишет инет магазины, в основном это цмс типа опенкарта. Более продвинутые на фреймворках.опенкарт он из коробки уже готов к работе
>>709985
#545 #709729
>>700759

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


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

Ладно, у меня что-то такое получилось на данный момент.
http://memtext.zzz.com.ua/
Для гостей создал одну запись (без права на редактирование, естствнно) /text/view/1
src
https://github.com/nsdvw/Memtext

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

Краткое содержание предыдущих постов: каждый текст разбивается на слова, этим словам ищется перевод из базы или по api яндекса. Полученный словарик нужно хранить пермаментно, чтоб юзер мог просматривать текст со словарем и проходил тесты неограниченное кол-во раз. Перевод каждого слова по отдельности хранится в базе. Вопрос как связать пары слов с конкретным текстом, которому они принадлежат? Многие ко многим даст таблицу в миллиарды строк. Каждый текст содержит несколько сот слов, допустим 1000 (хотя это хардкор конечно, но допустим). Каждый юзер может наклепать сотни текстов (первоначально задумывался парсинг xml/fb2 документа с автомат.разбитием на страницы - отдельные записи; одна загруженная книжка даст 300-500 страниц-текстов). Юзеров может быть десятки и сотни тысяч.

Сделал отдельной веткой под редис.
Потом дошло, что редис нафиг не нужен, с таким же успехом можно было сериализовать словарь и сохранить рядом с оригинальным текстом в таблице. Тем более что раз уж пошли на такое извращение как хранение неатомарных данных в реляционной базе, то там можно хранить вложенные типы данных (массивы объектов например), что позволит хранить не только ключ=>значение как в хеше редиса, но и отдельным полем признак игнорирования (если юзер не хочет видеть слово в словаре, однако не удалять его а только скрыть).
Теперь думаю обратно откатиться на редис, потому что возможно потребуется история прохождения тестов и их результаты, слова для повторения в тестах должны добавляться в очередь либо браться по весу (кол-ву неправильных ответов), а не выдаваться рандомно как сейчас.
Это я к вопросу о том, над чем нужно думать в начале: интерфейс или архитектура.

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

TODO:
-- пока еще не разобрался с этими странными middleware. В частности для защиты от csrf используется один из них https://github.com/slimphp/Slim-Csrf , но пока я не понимаю что это такое, не могу качественно применить. Применил пока только для одного роута (получается логаут защищен только с главной страницы). Если ко всему приложению типа $app->add(), то он не дает отправить ни одну форму вообще, например логин, мне же нужен только логаут. Если прописывать для каждого маршрута, то будет копипаста в каждом из них. Возможно когда разберусь с middlewarами, вопрос копипасты отпадет.
-- снова копипаста, например некоторые маршруты отличаются только шаблоном для рендера. Как избежать копипасты?
-- еще у редиски не нашел метода для удаления нескольких полей хеша (hdel). Есть только сомнительный метод remove http://rediska.geometria-lab.net/api/0-5-10/Rediska/Key/Rediska_Key_Hash.html#method_remove
у меня не получилось дать ему массив, но возможно я что-то не так сделал

По обработке ошибок вопрос. Как ее делать? Хотя бы это отлавливание исключений.
Что-то типа такого?
try {
$app->run();
} catch( PDOException($e) ) {
// залогировать. сразу вопрос по логирования: куда писать? в один и тот же файл, или отслеживать его размер чтоб не разбухал?
// общепринятый стандарт для записи в лог? или изобретать что-то свое вида [timestamp]: $e->_toString() ; что-то еще. Что еще можно записать в лог?
$app->view->render($c['response'], '500.twig');
}
#545 #709729
>>700759

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


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

Ладно, у меня что-то такое получилось на данный момент.
http://memtext.zzz.com.ua/
Для гостей создал одну запись (без права на редактирование, естствнно) /text/view/1
src
https://github.com/nsdvw/Memtext

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

Краткое содержание предыдущих постов: каждый текст разбивается на слова, этим словам ищется перевод из базы или по api яндекса. Полученный словарик нужно хранить пермаментно, чтоб юзер мог просматривать текст со словарем и проходил тесты неограниченное кол-во раз. Перевод каждого слова по отдельности хранится в базе. Вопрос как связать пары слов с конкретным текстом, которому они принадлежат? Многие ко многим даст таблицу в миллиарды строк. Каждый текст содержит несколько сот слов, допустим 1000 (хотя это хардкор конечно, но допустим). Каждый юзер может наклепать сотни текстов (первоначально задумывался парсинг xml/fb2 документа с автомат.разбитием на страницы - отдельные записи; одна загруженная книжка даст 300-500 страниц-текстов). Юзеров может быть десятки и сотни тысяч.

Сделал отдельной веткой под редис.
Потом дошло, что редис нафиг не нужен, с таким же успехом можно было сериализовать словарь и сохранить рядом с оригинальным текстом в таблице. Тем более что раз уж пошли на такое извращение как хранение неатомарных данных в реляционной базе, то там можно хранить вложенные типы данных (массивы объектов например), что позволит хранить не только ключ=>значение как в хеше редиса, но и отдельным полем признак игнорирования (если юзер не хочет видеть слово в словаре, однако не удалять его а только скрыть).
Теперь думаю обратно откатиться на редис, потому что возможно потребуется история прохождения тестов и их результаты, слова для повторения в тестах должны добавляться в очередь либо браться по весу (кол-ву неправильных ответов), а не выдаваться рандомно как сейчас.
Это я к вопросу о том, над чем нужно думать в начале: интерфейс или архитектура.

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

TODO:
-- пока еще не разобрался с этими странными middleware. В частности для защиты от csrf используется один из них https://github.com/slimphp/Slim-Csrf , но пока я не понимаю что это такое, не могу качественно применить. Применил пока только для одного роута (получается логаут защищен только с главной страницы). Если ко всему приложению типа $app->add(), то он не дает отправить ни одну форму вообще, например логин, мне же нужен только логаут. Если прописывать для каждого маршрута, то будет копипаста в каждом из них. Возможно когда разберусь с middlewarами, вопрос копипасты отпадет.
-- снова копипаста, например некоторые маршруты отличаются только шаблоном для рендера. Как избежать копипасты?
-- еще у редиски не нашел метода для удаления нескольких полей хеша (hdel). Есть только сомнительный метод remove http://rediska.geometria-lab.net/api/0-5-10/Rediska/Key/Rediska_Key_Hash.html#method_remove
у меня не получилось дать ему массив, но возможно я что-то не так сделал

По обработке ошибок вопрос. Как ее делать? Хотя бы это отлавливание исключений.
Что-то типа такого?
try {
$app->run();
} catch( PDOException($e) ) {
// залогировать. сразу вопрос по логирования: куда писать? в один и тот же файл, или отслеживать его размер чтоб не разбухал?
// общепринятый стандарт для записи в лог? или изобретать что-то свое вида [timestamp]: $e->_toString() ; что-то еще. Что еще можно записать в лог?
$app->view->render($c['response'], '500.twig');
}
#546 #709735
ну ка быстро, решительно, объясните

вот эти ваши регулярки на номер, я сколько работал в жизни не писал проверку или только цифры в поле (ну там ^(\+7|8) максимум). Тут оп дает таки-нихуевый списочек номеров.

'84951234567', '+74951234567', '8-495-1-234-567',
' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67',
'8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567',
'8 ( 999 ) 1234567', '8 999 123 4567'

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

кто писал, скиньте регулярку, каким боком решено, я иссяк с готовностью решать эту задачу. Ну как иссяк, проверять каждые 3 символа чем разделено, потом еще эти 3 символа проверить - а вдруг вообще один символ или два, а вдруг еще между ними пробел или знак евро решительно не буду - посмотрю и смекну как. Давайте без демагогий ток, что мой подход не особо продуктивен.
Не, ну по 1 символу проверять и я могу написать
>>709751>>709967
#547 #709738
>>709729

>Что-то типа такого?


Нет. В слиме ты можешь определить свой errorHandler, который будет автоматически ловить все исключения и делать с ними что захочешь.
Почитай вот.
http://www.slimframework.com/docs/handlers/error.html
#548 #709751
>>709735

>Не, ну по 1 символу проверять и я могу написать


Напиши, а потом оптимизируй, там всё будет однотипное.
>>709800
#549 #709765
Как можно сдетектить расширения браузера?

На многих говносайтах habrahabr часто вижу сообщения уровня "вы отключили рекламу, поэтому мы нашли другой способ подгадить вам, и теперь показываем это окно, перекрывающее часть функционала".
>>709777>>709967
#550 #709777
>>709765

>часто вижу сообщения уровня "вы отключили рекламу, поэтому мы нашли другой способ подгадить вам, и теперь показываем это окно, перекрывающее часть функционала"


Тут банальная проверка на отсутствие элементов с рекламой через жс. Адблок все элементы рекламы удаляет из документа, а скрипт на сайте это детектит. Можешь попробовать реализовать похожую проверку, если расширение которое ты хочешь сдетектить меняет разметку.
#551 #709800
>>709751
там ведь идет проверка, тип

/^(\+7|7|8)[(]?[0-9]{3}[)]?

к чему я пришел в итоге забив

/^(\+7|7|8)[\s]?[(]?([0-9]{3})[)]?[\s]?[0-9]{2}[0-9]{2}/"

может я че не понял из учебника опа?
>>710342
282 Кб, 1200x1920
#552 #709802
>>709332
>>709346
То ли я тупой, то ли хз.
Форкнул, сменил 40000 на 1000.
Всё сработало прекрасно.
2030 рублей.
http://ideone.com/rdZCpP
289 Кб, 1200x1920
#553 #709804
>>709802
Скрин с багом, программа выполнилась, а не "запускается".
111 Кб, 599x958
107 Кб, 750x1000
#554 #709828
>>702800 (OP)
Анонимусы, моя печальная история:
Пилил веб-приложение на Node.js, всё было сладко, как в раю, уже начал чувствовать себя человеком. Но не тут то было. Так вышло, что мне понадобился Webmoney XML интерфейс., и тут я обосрался. Так как на Ноду нету готовой библиотеки для пользование оным. Что значит, что если я хочу её юзать, мне нужно сделать дохуище работы. А на PHP есть уже готовая высокоуровневая(!) библитока. Вот я и решил перекатиться на ПХП, и запилить сою приложуху на нём. Так-что реквестирую советов от вас индусы аноны.
Нужен следующий функционал:
Примерно то же, что и карты один на один.
Тоесть -регистрация на сайте
- Обьеденение в одно лобби
- Игровой процесс
- Изьятие результатов и перечисление каких-то фишечек на счёт победителя ?

В какую сторону сразу смотреть, чтобы не проебать кучу времени на изучение ненужной хуерги ?
>>709829>>709967
#555 #709829
>>709828
Что вообще нынче на ходу в ПХП ?
Сервак - Апач, как я понимаю.
База данных - MySQL ?
Какой модуль ( или как это у вас называется ?) использовать для создания многопользовательского веб приложения ?
#556 #709830
>>709829
Нагуглил какой-то Webasyst, этому можно доверять ? Этим кто-то пользуется ?
>>709968>>709983
#557 #709842
>>709829
websockets -> reactphp -> ratchet
https://habrahabr.ru/post/198954/
>>709968
#558 #709880
>>709304

Перечитай мой пост внимательнее: >>709277

Там написано для чего: чтобы мы могли повлиять на процесс создания объектов другим классом.

Особенно внимательно перечитай вот это предложение:

> Ты забываешь что часто разные части кода пишут разные люди и ты не можешь просто так взять и поменять что тебе хочется в чужой библиоетке.



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

> Какая разница писать так:


> $creator_one = new ProductOneCreator(); //здесь же мы все-равно привязываемся к конкретному продукту


> $product_one = $creator_one->getProduct();


> или сразу так:


Ты отчасти прав. ты просто взял плохой пример. В твоем случае ProductOneCreatoe не делает ничего полезного и паттерн там вообще не нужен.

Вместо дурацкого бессмысленного примера попробуй сделать что-то более осмысленное. Например:

- допустим у тебя есть 3 таблицы в БД: posts, comments, users. И 3 класса-модели для них: Post, Comment, User. Напиши 3 класса PostFinder, CommentFinder, UserFinder, каждый из которых содержит метод getByid($id), который ищет в базе и загружает модель с указанным id. Добавь также метод getManyByIds(array $ids).

Также, я уверен, тебе интересен еще и паттерн Фабрика. Наверняка ты недоумеваешь: зачем она нужна когда объекты можно создавать напрямую.

Чтобы это понять, сделай класс для описания HTML-формы. Форма может содержать Текстовое поле, Селекты, Радиокнопки, Чекбоксы. Выводить форму в виде HTML не требуется, требуется только создать ее ООП представление. Для отладки можешь сделать метод который выведет ее в каком-то текстовом виде.

Но создавать формы руками из объектов довольно утомительно и неинтересно, верно? Напиши класс, который позволяет создать форму по ее описанию в XML- или JSON файле (советую выбрать XML как более сложный и интересный).

Сделав это, ты получишь что-то вроде библиотеки для создания форм. А теперь основное задание. Не меняя код библиотеки, добавь в нее новые типы полей, например Календарь или ПолеЗагрузкиФайла.

Вообще, с паттернами все плохо:

- работодатель не хочет брать быдлокодеров и пишет "паттерны" в вакансии
- при этом его разработчик сам толком не разбирается в паттернах, а но в коде они не используются. Он читает Фаулера и что-то запоминает.
- кандидат видит слово и идет гуглить
- ничего не понимает, но заучивает Синглтон, Фабрику, Наблюдатель так как они выглядят самыми простыми
- кандидат и разработчик на собеседовании говорят о том в чем не разбираются и что им не нужно

Если ты хочешь разбираться в паттернах, изучай сложные библиотеки вроде компонентов Симфони.
#558 #709880
>>709304

Перечитай мой пост внимательнее: >>709277

Там написано для чего: чтобы мы могли повлиять на процесс создания объектов другим классом.

Особенно внимательно перечитай вот это предложение:

> Ты забываешь что часто разные части кода пишут разные люди и ты не можешь просто так взять и поменять что тебе хочется в чужой библиоетке.



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

> Какая разница писать так:


> $creator_one = new ProductOneCreator(); //здесь же мы все-равно привязываемся к конкретному продукту


> $product_one = $creator_one->getProduct();


> или сразу так:


Ты отчасти прав. ты просто взял плохой пример. В твоем случае ProductOneCreatoe не делает ничего полезного и паттерн там вообще не нужен.

Вместо дурацкого бессмысленного примера попробуй сделать что-то более осмысленное. Например:

- допустим у тебя есть 3 таблицы в БД: posts, comments, users. И 3 класса-модели для них: Post, Comment, User. Напиши 3 класса PostFinder, CommentFinder, UserFinder, каждый из которых содержит метод getByid($id), который ищет в базе и загружает модель с указанным id. Добавь также метод getManyByIds(array $ids).

Также, я уверен, тебе интересен еще и паттерн Фабрика. Наверняка ты недоумеваешь: зачем она нужна когда объекты можно создавать напрямую.

Чтобы это понять, сделай класс для описания HTML-формы. Форма может содержать Текстовое поле, Селекты, Радиокнопки, Чекбоксы. Выводить форму в виде HTML не требуется, требуется только создать ее ООП представление. Для отладки можешь сделать метод который выведет ее в каком-то текстовом виде.

Но создавать формы руками из объектов довольно утомительно и неинтересно, верно? Напиши класс, который позволяет создать форму по ее описанию в XML- или JSON файле (советую выбрать XML как более сложный и интересный).

Сделав это, ты получишь что-то вроде библиотеки для создания форм. А теперь основное задание. Не меняя код библиотеки, добавь в нее новые типы полей, например Календарь или ПолеЗагрузкиФайла.

Вообще, с паттернами все плохо:

- работодатель не хочет брать быдлокодеров и пишет "паттерны" в вакансии
- при этом его разработчик сам толком не разбирается в паттернах, а но в коде они не используются. Он читает Фаулера и что-то запоминает.
- кандидат видит слово и идет гуглить
- ничего не понимает, но заучивает Синглтон, Фабрику, Наблюдатель так как они выглядят самыми простыми
- кандидат и разработчик на собеседовании говорят о том в чем не разбираются и что им не нужно

Если ты хочешь разбираться в паттернах, изучай сложные библиотеки вроде компонентов Симфони.
#559 #709882
>>709324

Двумерный массив не нужен. Какие у нас обычно задачи? Получить список животных определенного типа в определенном радиусе. Это прекрасно можно решить если хранить просто плоский одномерный список животных.

Двумерный список - лишняя головная боль. Например, ты должен корректно обновлять его если животное меняет свои координаты. То есть по идее ты должен либо заставить животное сообщать об изменении своих координат Карте (где гарантия что оно не забудет об этом? это усложнение кода), либо Карта должна хранить в памяти список координат и проверять не поменялись ли они у животного. Это все сильно усложняет код. А ради чего? непонятно.

Вместо того чтобы хранить координаты животного в одном месте (в самом животном) мы делаем второй зависящий от координат животных массив и как следствие получаем головную боль по их синхронизации.

Всегда старайся хранить любые данные в одном экземпляре, и не храни данные которые можно вычислить заново

Да и перебирать одномерный список удобнее чем 2-мерный массив.

А для вывода карты можно просто сделать временный массив, куда засунуть точки и буквы.
#560 #709898
>>709173
Я уже вторую нашел с момента как в тред залез.
#561 #709927
>>709490
Надо нажать Update в jsfiddle после редактирования кода.
#562 #709929
>>709694
Бамп вопросу
>>709933
#563 #709930
>>709173

>И еще вопрос: за время существования этих тредов кому-то удалось найти работу?


Я нашел за еду ну как за еду, получаю то я больше чем среднестатистический житель моей мухосрани, но намного меньше чем в профессии в своей мухосрани 80к населения. Сидел в треде примерно месяцев 7, сделал задачку на студентов. До этого навыков вообще никаких не было.
#564 #709933
>>709929
Без аякса в реальном времени ты не реализуешь. Значит данные из формы отправляются на скрипт, там проводишь валидацию и заполняешь массив ошибок, после валидации проверяешь - пуст ли массив ошибок, и если да - регистрируешь юзера, если нет - возвращаешь на страницу регистрации вместе с массивом ошибок и там его уже обрабатываешь - показывая пользователю где он ошибся. У ОПа на гите была статья об алгоритме регистрации.
>>709968
#565 #709947
Всем доброго дня!

Переписываю задачу "Числа прописью". Нужно указать склонения слов, в зависимости от числа. Имеем несколько последовательных областей определения, в зависимости от которых склоняется слова. Для охвата всех ОП, получается довольно объемная конструкция условий.
Можно ли ее как-то сократить?
Это вообще нормально с этической и моральной стороны писать такой код?
Что гуглить по сабжу?

if ($number==0) {
$word = $word5;
} elseif ($number==1) {
$word = $word1;
} elseif (2 <= $number && $number <= 4) {
$word = $word2;
} elseif (4 < $number && $number <= 19) {
$word = $word5;
} elseif (20 <= $number && $number %10 == 0) {
$word = $word5;
} elseif (21 <= $number && ($number %10 == 1)) {
$word = $word1;
} elseif (21 <= $number && $number %10 <= 4) {
$word = $word2;
} elseif (21 <= $number && $number %10 >= 5) {
$word = $word5;
}
>>709968
#566 #709961
>>709488

В разных компаниях разный уровень. Ты описал компанию где высококвалифицированные специалисты не требуются.

>>709521

МОжет автор изучал php4 где объекты клонируются при присваивании. Это явно ошибка.

>>709557

У тебя скорее всего аннотации неправильные в коде и пхпсторм не понимает что хранится в этом поле. Изучи phpDoc и поставь аннотацию что переменная хранит данные такого-то типа (массив объектов)

Алсо код явно неправильный, департамент это не массив, логичнее его сделать объектом. Или это пока промежуточная версия?

>>709598

Я недавно обновил урок по ООП. Перечитай.

> Я решил, что сделать классы на каждую должность лучше, чем


> наследовать должность от сотрудника, поэтому дальше много копипасты


Копипаста одна из самых плохих вещей которую моет сделать программист.Как это может быть лучше? Это заведомо худший вариант.

Поощрять такой подход я не буду. Избавься от копипасты в коде, если есть какие-то сложности или что-то непонятно, задавай вопросы.

Про константы написано в обновленном уроке по ООП на сайте. Дан пример.
#567 #709963
>>709672

Не хочешь сделать доброе дело и написать что именно не так и как лучше переделать?

>>709694

Чтобы зарегистрироваться надо отправить форму. После того тебя может редиректить например на таблицу с сообщением "вы зарегистрировались", а ссылка регистрации должна поменять на редактирвоание профиля.

Так что да, после обновления страницы.

>>709627

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

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

1) минимум затрачиваемого времени и усилий
2) оплата (заметьте что она идет вторым пунктом)

Но я точно не буду менять работу потому что кто-то на анонимном форуме считает что заниматься A "интереснее" чем Б или технлогия X лучше чем Y. Тем более что скоро выйдет технология Z и все любители X будут выглядеть ретроградами. Я готов хоть на языке 40-лентней давности (Си) вести разработку, особенно если сам код придется писать не мне.

Но это я. Ты анон, скорее всего начинающий и если ты будешь так поступать то быстро встанешь на путь деградации. Начинающий должен работать не менее 9-10 часов в сутки (сюда включается не только сама работа но и обучение в свободное от нее время) и выбирать "интересные" и современные технологии. И конечно стремится попасть в самую крутую компанию, в которую сложнее всего попасть и где на собеседовании просят доказать что не существует целых чисел возведенных в какую-то степень, которые бы в сумме дали другое число возведенное в эту же степень.
>>709970
#568 #709964
>>709729

Я тебя наверно запутал с интерфейсом, я имел в виду по наброскам интерфейса понять какие данные нам надо хранить и какие запросы будут идти, и на основании этого проектировать схему их хранения. То есть такой порядок проектирования:

- что хотим хранить, какие запросы делать, какой объем данных
- идеальная нормализованная схема
- выбор архитектуры хранилища
- денормализация если надо
- прототип для тестирования

Также, хотя объем данных огромен, но ведь ты не можешь показать на экране 500 страниц текста или 1000 переводов одновременно, думай, как уменьшить объем выбираемых данных за раз.

Выбор редиса пока выглядит нелогично. Он позиционируется как кеш, и кому в здравом уме придет в голову хранить данные в кеше?

Также, mysql вполне может хранить миллиард записей. Если это таблица из 2 колонок с числами, и есть индекс по обоим колонкам, то запись в нем весит 8 байт, а сам индекс 8 млрд байт = 8 Гб. Он целиком может уместиться в память и работать должен по идее быстро. Заметь что это только индекс, сами данные еще на диске не меньше 8 Гб займут, а скорее даже больше.

При этом mysql способна работать и не имея 8 Гб - в этом случае в памяти будут только самые "горячие" куски индекса. Разумеется, и скорость работы будет ниже.

Ты наверно думаешь что редис обладает какими-то чудесными свойствами? Ему для хранения миллиарда пар чисел точно также понадобится не меньше (а я даже думаю, что больше, так как там нужна еще обвязка к ним) 8 Гб. При этом редис держит 100% данных в памяти. И так как он использует форк для сохранения данных, ты должен зарезервировать еще столько же памяти под это дело.

Конечно, это мне так кажется. Мои догадки хорошо бы проверить на практике. Хотя бы на 50-100 млн записей. Редис, вообще, очень быстрый, скорее всего он даст больше операций в секунду чем mysql.

Я могу сказать, что многие сервисы (ютуб, вконтакте) начинались с одной базы mysql, а когда становились популярными, они как-то все это масштабировали, шардили. И конечно возможно что с ростом реляционная база была заменена на нереляционное хранилище, это да. На определенных объемах становится выгоднее иметь что-то свое специально под это заточенное. Но само использование mysql им не помешало масштабироваться дальше. Наоброт, помогло на начальном этапе.

Ну и вообще, у NoSQL хранилищ есть свои подвохи. Например, у монго долгое время был глобальный лок всей коллекции (аналог таблицы) при записи в нее одной записи. Разуимеется, фанаты монго предпочитают об этом не вспоминать, а просто говорят что SQL - старье, а NoSQL это новый подход, и вообще она в отличие от mysql - web scale: http://www.mongodb-is-web-scale.com/

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

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

Также, в NoSQL хранилищах часто отстутствуют такие удобные вещи, как язык запросов, внешние ключи, транзакции.

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

И еще есть такой совет, что "лучшее хранилище для стартапа это реляционная (SQL) база". думаю, ты уже к этому моменту понял что перед тобой фанат SQL баз данных.

Еще, mysql хоть и более популярная, но postgresql более интересная база, у нее есть куча возможностей, например можно использовать CHECK в CREATE TABLE, есть поддержка JSON, индексов по выражению (по моему это круто), и еще много чего. Но как там с производительнсотью. не в курсе, не работал с ней. Будет время - посмотри ее.

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

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

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


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

Вот какие есть варианты организации хранилища:

- mysql + шардинг на многих серверах
- mysql + кеш перед ней. Мы получаем скорость работы кеша + надежность и удобства реляционной Бд. Это хорошо работает при большом числе чтений и небольшом числе записей. Кеш впрочем тоже имеет недостатки.
- nosql (mongodb? что-то еще) на многих серверах без кеша
- свое хранилище на Си или может Яве или чем-то еще

При этом стоит учиытвать такие вещи:

- наличие вторичных индексов (возможность искать не по первичному ключу)
- наличие возможность делать джойны
- наличие ограничений и контроля целостности
- наличие транзакций
- многопоточность: может ли система задействовать много ядер процессора? Или она достаточно быстрая и это не нужно
- наличие возможности делать сложные запросы
- как организовано хранение данных (память, диск, как часто данные сохраняются)
- как организуется масштабирование

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

Хорошо бы сделать обзор нескольких вариантов хранения данных, а потом сделать быстрый прототип и протестировать.
#568 #709964
>>709729

Я тебя наверно запутал с интерфейсом, я имел в виду по наброскам интерфейса понять какие данные нам надо хранить и какие запросы будут идти, и на основании этого проектировать схему их хранения. То есть такой порядок проектирования:

- что хотим хранить, какие запросы делать, какой объем данных
- идеальная нормализованная схема
- выбор архитектуры хранилища
- денормализация если надо
- прототип для тестирования

Также, хотя объем данных огромен, но ведь ты не можешь показать на экране 500 страниц текста или 1000 переводов одновременно, думай, как уменьшить объем выбираемых данных за раз.

Выбор редиса пока выглядит нелогично. Он позиционируется как кеш, и кому в здравом уме придет в голову хранить данные в кеше?

Также, mysql вполне может хранить миллиард записей. Если это таблица из 2 колонок с числами, и есть индекс по обоим колонкам, то запись в нем весит 8 байт, а сам индекс 8 млрд байт = 8 Гб. Он целиком может уместиться в память и работать должен по идее быстро. Заметь что это только индекс, сами данные еще на диске не меньше 8 Гб займут, а скорее даже больше.

При этом mysql способна работать и не имея 8 Гб - в этом случае в памяти будут только самые "горячие" куски индекса. Разумеется, и скорость работы будет ниже.

Ты наверно думаешь что редис обладает какими-то чудесными свойствами? Ему для хранения миллиарда пар чисел точно также понадобится не меньше (а я даже думаю, что больше, так как там нужна еще обвязка к ним) 8 Гб. При этом редис держит 100% данных в памяти. И так как он использует форк для сохранения данных, ты должен зарезервировать еще столько же памяти под это дело.

Конечно, это мне так кажется. Мои догадки хорошо бы проверить на практике. Хотя бы на 50-100 млн записей. Редис, вообще, очень быстрый, скорее всего он даст больше операций в секунду чем mysql.

Я могу сказать, что многие сервисы (ютуб, вконтакте) начинались с одной базы mysql, а когда становились популярными, они как-то все это масштабировали, шардили. И конечно возможно что с ростом реляционная база была заменена на нереляционное хранилище, это да. На определенных объемах становится выгоднее иметь что-то свое специально под это заточенное. Но само использование mysql им не помешало масштабироваться дальше. Наоброт, помогло на начальном этапе.

Ну и вообще, у NoSQL хранилищ есть свои подвохи. Например, у монго долгое время был глобальный лок всей коллекции (аналог таблицы) при записи в нее одной записи. Разуимеется, фанаты монго предпочитают об этом не вспоминать, а просто говорят что SQL - старье, а NoSQL это новый подход, и вообще она в отличие от mysql - web scale: http://www.mongodb-is-web-scale.com/

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

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

Также, в NoSQL хранилищах часто отстутствуют такие удобные вещи, как язык запросов, внешние ключи, транзакции.

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

И еще есть такой совет, что "лучшее хранилище для стартапа это реляционная (SQL) база". думаю, ты уже к этому моменту понял что перед тобой фанат SQL баз данных.

Еще, mysql хоть и более популярная, но postgresql более интересная база, у нее есть куча возможностей, например можно использовать CHECK в CREATE TABLE, есть поддержка JSON, индексов по выражению (по моему это круто), и еще много чего. Но как там с производительнсотью. не в курсе, не работал с ней. Будет время - посмотри ее.

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

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

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


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

Вот какие есть варианты организации хранилища:

- mysql + шардинг на многих серверах
- mysql + кеш перед ней. Мы получаем скорость работы кеша + надежность и удобства реляционной Бд. Это хорошо работает при большом числе чтений и небольшом числе записей. Кеш впрочем тоже имеет недостатки.
- nosql (mongodb? что-то еще) на многих серверах без кеша
- свое хранилище на Си или может Яве или чем-то еще

При этом стоит учиытвать такие вещи:

- наличие вторичных индексов (возможность искать не по первичному ключу)
- наличие возможность делать джойны
- наличие ограничений и контроля целостности
- наличие транзакций
- многопоточность: может ли система задействовать много ядер процессора? Или она достаточно быстрая и это не нужно
- наличие возможности делать сложные запросы
- как организовано хранение данных (память, диск, как часто данные сохраняются)
- как организуется масштабирование

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

Хорошо бы сделать обзор нескольких вариантов хранения данных, а потом сделать быстрый прототип и протестировать.
>>710320
#569 #709965
>>709729

Также, могу дать пару ссылок почитать про архитектуру нагруженных сервисов:

https://www.insight-it.ru/highload/
https://github.com/vk-com/kphp-kdb - сишные хранилища которые написали разработчики вконтакта
https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/DBMS_Storage_Comparison.wiki - обзор подходов к архитектуре хранилищ, написанный ими же

> Сначала думал хранить словарь для текста в редисе, так как реляционная база не потянет такое кол-во записей


Ну офигеть теперь. Что же это за словарь, что база данных с ним не справится? В английском в ходу порядка пары десятков тысяч слов. База которая не может очилить 20 000 слов это не база, а какое-то недоразумение.

И вообще, мне не нравится твой подход. ты сначала выбираешь хранилище, а тольк опотмо решаешь что в нем хранить. Я думаю, стоит сделать так. Сначала набросать схему хранения данных: какие коллекции/таблицы есть, как они связаны, какие основные виды запросов будут делаться. Потом рассмотреть варианты разных архитектур про которые я писал выше, и посмотреть как они подходят для наших данных или не подходят и почему. И на этом этапе лучше для начала предположить что данные нормализованы, а потом уже, посмотрев на схему и увидев проблемы, денормализовывать, кешировать и тд.

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

> Вопрос как связать пары слов с конкретным текстом, которому они принадлежат? Многие ко многим даст таблицу в миллиарды строк.


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

> Каждый текст содержит несколько сот слов, допустим 1000 (хотя это хардкор конечно, но допустим). Каждый юзер может наклепать сотни текстов (первоначально задумывался парсинг xml/fb2 документа с автомат.разбитием на страницы - отдельные записи;


Плохо представляю себе человека, способного прочесть несколько сотен книжек на незнакомом языке. Я сам пробовал читать тексты на плохо знакомом языке и когда на каждом втором слове надо лезть в cловарь, это не быстро.

> одна загруженная книжка даст 300-500 страниц-текстов).


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

> Тем более что раз уж пошли на такое извращение как хранение неатомарных данных в реляционной базе, то там можно хранить вложенные типы данных (массивы объектов например),


Вообще еще есть вариант хранить нормализованные данные + хранить тут же или в кеше ненормализованные.

> Теперь думаю обратно откатиться на редис, потому что возможно потребуется история прохождения тестов и их результаты, слова для повторения в


Как ты собрался в хранилище даже без вторичных индексов хранить историю тестов? Тут реляционная база или хотя бы монга сама собой просится.

> Это я к вопросу о том, над чем нужно думать в начале: интерфейс или архитектура.


Да, я имел в виду что сначала надо определиться с тем какие данные мы храним, и какие запросы в ним делаем.

> В частности для защиты от csrf используется один из них https://github.com/slimphp/Slim-Csrf , но пока я не понимаю что это такое, не могу качественно применить.


надо смотреть документацию или исходники. Я мельком смотрел и помню что там что-то мутное и переусложненное и вообще ощущение что автор не очень в теме.

> Если ко всему приложению типа $app->add(), то он не дает отправить ни одну форму вообще,


По идее защищают все формы. Логаут тоже форма и делается через ПОСТ так как меняет состояние сервера.

> снова копипаста, например некоторые маршруты отличаются только шаблоном для рендера. Как избежать копипасты?


Сделать один обработчик, и в нем выбирать шаблон через иф. $handler = function ...;

> еще у редиски не нашел метода для удаления нескольких полей хеша (hdel).


можно попробовать дописать, благо там все выглядит расширяемым

> По обработке ошибок вопрос. Как ее делать? Хотя бы это отлавливание исключений.


Описано в уроке https://github.com/codedokode/pasta/blob/master/php/exceptions.md#Страница-ошибки-в-веб-приложениях

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

> залогировать. сразу вопрос по логирования: куда писать?


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

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

> `dictionary` TEXT NOT NULL COMMENT 'dictionary serialized in json',


Не вижу логики почему словарь хранится внутри текста? У тебя каждый текст на своем уникальном языке?

> CREATE TABLE `word`


Обычно словарь это не список слово -> слово, а слово -> статья. Пример: http://jisho.org/search/neko (хотел дать ссылку на словари яндекса, а они закрылись). И при изучении языка статья полезнее чем просто слово без пояснений. Плюс, одно слово может иметь много значений.

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

https://github.com/nsdvw/Memtext/blob/master/scripts/post-update-cmd.sh
Не очент надежно, что при обновлении там получится смесь старых и новых файлов. Ну и по идее надо названия папок и файлов версионировать. Не jquery.js, а jquery-10.01.1.js. Подумай, почему. Например чтобы обходить кеши, или чтобы не было смеси файлов из разных версий в одной папке.
#569 #709965
>>709729

Также, могу дать пару ссылок почитать про архитектуру нагруженных сервисов:

https://www.insight-it.ru/highload/
https://github.com/vk-com/kphp-kdb - сишные хранилища которые написали разработчики вконтакта
https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/DBMS_Storage_Comparison.wiki - обзор подходов к архитектуре хранилищ, написанный ими же

> Сначала думал хранить словарь для текста в редисе, так как реляционная база не потянет такое кол-во записей


Ну офигеть теперь. Что же это за словарь, что база данных с ним не справится? В английском в ходу порядка пары десятков тысяч слов. База которая не может очилить 20 000 слов это не база, а какое-то недоразумение.

И вообще, мне не нравится твой подход. ты сначала выбираешь хранилище, а тольк опотмо решаешь что в нем хранить. Я думаю, стоит сделать так. Сначала набросать схему хранения данных: какие коллекции/таблицы есть, как они связаны, какие основные виды запросов будут делаться. Потом рассмотреть варианты разных архитектур про которые я писал выше, и посмотреть как они подходят для наших данных или не подходят и почему. И на этом этапе лучше для начала предположить что данные нормализованы, а потом уже, посмотрев на схему и увидев проблемы, денормализовывать, кешировать и тд.

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

> Вопрос как связать пары слов с конкретным текстом, которому они принадлежат? Многие ко многим даст таблицу в миллиарды строк.


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

> Каждый текст содержит несколько сот слов, допустим 1000 (хотя это хардкор конечно, но допустим). Каждый юзер может наклепать сотни текстов (первоначально задумывался парсинг xml/fb2 документа с автомат.разбитием на страницы - отдельные записи;


Плохо представляю себе человека, способного прочесть несколько сотен книжек на незнакомом языке. Я сам пробовал читать тексты на плохо знакомом языке и когда на каждом втором слове надо лезть в cловарь, это не быстро.

> одна загруженная книжка даст 300-500 страниц-текстов).


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

> Тем более что раз уж пошли на такое извращение как хранение неатомарных данных в реляционной базе, то там можно хранить вложенные типы данных (массивы объектов например),


Вообще еще есть вариант хранить нормализованные данные + хранить тут же или в кеше ненормализованные.

> Теперь думаю обратно откатиться на редис, потому что возможно потребуется история прохождения тестов и их результаты, слова для повторения в


Как ты собрался в хранилище даже без вторичных индексов хранить историю тестов? Тут реляционная база или хотя бы монга сама собой просится.

> Это я к вопросу о том, над чем нужно думать в начале: интерфейс или архитектура.


Да, я имел в виду что сначала надо определиться с тем какие данные мы храним, и какие запросы в ним делаем.

> В частности для защиты от csrf используется один из них https://github.com/slimphp/Slim-Csrf , но пока я не понимаю что это такое, не могу качественно применить.


надо смотреть документацию или исходники. Я мельком смотрел и помню что там что-то мутное и переусложненное и вообще ощущение что автор не очень в теме.

> Если ко всему приложению типа $app->add(), то он не дает отправить ни одну форму вообще,


По идее защищают все формы. Логаут тоже форма и делается через ПОСТ так как меняет состояние сервера.

> снова копипаста, например некоторые маршруты отличаются только шаблоном для рендера. Как избежать копипасты?


Сделать один обработчик, и в нем выбирать шаблон через иф. $handler = function ...;

> еще у редиски не нашел метода для удаления нескольких полей хеша (hdel).


можно попробовать дописать, благо там все выглядит расширяемым

> По обработке ошибок вопрос. Как ее делать? Хотя бы это отлавливание исключений.


Описано в уроке https://github.com/codedokode/pasta/blob/master/php/exceptions.md#Страница-ошибки-в-веб-приложениях

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

> залогировать. сразу вопрос по логирования: куда писать?


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

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

> `dictionary` TEXT NOT NULL COMMENT 'dictionary serialized in json',


Не вижу логики почему словарь хранится внутри текста? У тебя каждый текст на своем уникальном языке?

> CREATE TABLE `word`


Обычно словарь это не список слово -> слово, а слово -> статья. Пример: http://jisho.org/search/neko (хотел дать ссылку на словари яндекса, а они закрылись). И при изучении языка статья полезнее чем просто слово без пояснений. Плюс, одно слово может иметь много значений.

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

https://github.com/nsdvw/Memtext/blob/master/scripts/post-update-cmd.sh
Не очент надежно, что при обновлении там получится смесь старых и новых файлов. Ну и по идее надо названия папок и файлов версионировать. Не jquery.js, а jquery-10.01.1.js. Подумай, почему. Например чтобы обходить кеши, или чтобы не было смеси файлов из разных версий в одной папке.
>>710320
#570 #709966
>>709729

https://github.com/nsdvw/Memtext/tree/master/vendor
Не надо ее добавлять, композер сам ее создает без прблем

https://github.com/nsdvw/Memtext/tree/master/web/vendor-css
На практике легче просто сделать web/library/ckeditor-1.2.3 а не разбивать руками на css и js файлы. У билблиотек часто есть папка dist, где хранится дистрибутив, то есть результат сборки, то что нужно выложить в публичную папку. Ее и надо копировать целиком.

https://github.com/nsdvw/Memtext/blob/master/app/Model/Text.php
Словарь это не часть текста. Неважно как он хранится в БД, он заслуживает отдельно класса для себя, мне кажется. Хотя, может и нет.

https://github.com/nsdvw/Memtext/blob/master/app/Form/LoginForm.php
Валидация в форме - правильно ли? Вообще, я бы этому вопросу дал минимальный прилоритет так как у нас куча более сложных проблем. Но вот подумай. Можешь ли ты сделать валидацию сущности без формы? Разве не лоичнее привязать валидацию к моделям? Также, посмотри, в Симфони есть компонент для валидации - Symfony Validation - он позволяет описывать правила в модели в виде аннотаций либо же отдельно. Ну и всегда можно сделать свою систему - например в XML-файле или массиве, чем мне нравятся компоненты симфони, что они обычно очень абстрактные и не навязывают никаких библиотек, совместимы с любым приложением.

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

Проверку логина логичнее наверно делать в сервисе: ты даеь логин/пароль он говорит ок или не ок.

https://github.com/nsdvw/Memtext/blob/master/app/Mapper/TextMapper.php
В save и update копипаста, надо сделать метод мапящий объект в массив.

https://github.com/nsdvw/Memtext/blob/master/app/Helper/YandexTranslator.php
Нет проверк на ошибки. Если у тебя 5% запросов идет с ошибками то ты их не видишь, а пользователи страдают. json_encode может вернуть null, у курла вообще много возможностей получить ошибку - проблемы DNS, сети, ответ не с кодом 200, у тебя вообше этого всего нет. Нет таймаутов. Нет переповторов (на практике часть запросов может отваливаться и иногда повтор с задержкой решает прооблему).

Для отправки запросов не стоит использовать курл и возиться с опциями, лушче высокоуровневй ООП-клиент вроде guzzle или поищи еще что сейчас модно.

Все обращения к сторонним серверам надо делать из кли- и крон-скриптов разумеется. Ну на этапер написания прототипа можно конечно пренебречь этим правилом. Но курл лучше не исопльзовать вообще, это низкоуровневая неудобная штука.

> foreach ($words as $word) {


> $url .= "&text={$word}";


Где кодирование спецсимволов? Читай урок https://github.com/codedokode/pasta/blob/master/network/urls.md

> mb_strlen($word, 'UTF-8')


Укажи mb internal encoding лучше.

https://github.com/nsdvw/Memtext/blob/master/app/Helper/TextParser.php#L25
Что за странная регулярка

https://github.com/nsdvw/Memtext/blob/master/app/Auth/LoginManager.php
Можно перенести в сервисы

https://github.com/nsdvw/Memtext/blob/master/app/Handler/NotFoundHandler.php#L20
Зачем вызываешь родительский инвоке? Не понимаю. Ты смотрел, что он делает?

В общем твой код скорее хорошее впечатление производит, копозер есть, ООП есть, библиотеки есть, видно что ты в нашем треде учился, но плохо что для HTTP клиента не додумался библиотеку поискать. Хотя бы для того чтобы не копаться в списке разных параметров курла.

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

А, если ты захочешь внешние программы запускать - для этого есть symfony process. Советую заранее. Для организации очереди задач тоже есть gearman, не придумывай велосипедов.

Идея в общем интересная, я сам когда-то думал сделать сайт который бы помогал читать и переводить мангу, книги, песни, видео и тд. на японском, расшаривать переводы, но это требует какого-то нереального времени, которого у меня нет и вряд ли будет.

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

Алсо, тут https://github.com/nsdvw/Memtext/blob/master/README.md возьми названия HTML тегов в пункте 3 в косые кавычки.
#570 #709966
>>709729

https://github.com/nsdvw/Memtext/tree/master/vendor
Не надо ее добавлять, композер сам ее создает без прблем

https://github.com/nsdvw/Memtext/tree/master/web/vendor-css
На практике легче просто сделать web/library/ckeditor-1.2.3 а не разбивать руками на css и js файлы. У билблиотек часто есть папка dist, где хранится дистрибутив, то есть результат сборки, то что нужно выложить в публичную папку. Ее и надо копировать целиком.

https://github.com/nsdvw/Memtext/blob/master/app/Model/Text.php
Словарь это не часть текста. Неважно как он хранится в БД, он заслуживает отдельно класса для себя, мне кажется. Хотя, может и нет.

https://github.com/nsdvw/Memtext/blob/master/app/Form/LoginForm.php
Валидация в форме - правильно ли? Вообще, я бы этому вопросу дал минимальный прилоритет так как у нас куча более сложных проблем. Но вот подумай. Можешь ли ты сделать валидацию сущности без формы? Разве не лоичнее привязать валидацию к моделям? Также, посмотри, в Симфони есть компонент для валидации - Symfony Validation - он позволяет описывать правила в модели в виде аннотаций либо же отдельно. Ну и всегда можно сделать свою систему - например в XML-файле или массиве, чем мне нравятся компоненты симфони, что они обычно очень абстрактные и не навязывают никаких библиотек, совместимы с любым приложением.

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

Проверку логина логичнее наверно делать в сервисе: ты даеь логин/пароль он говорит ок или не ок.

https://github.com/nsdvw/Memtext/blob/master/app/Mapper/TextMapper.php
В save и update копипаста, надо сделать метод мапящий объект в массив.

https://github.com/nsdvw/Memtext/blob/master/app/Helper/YandexTranslator.php
Нет проверк на ошибки. Если у тебя 5% запросов идет с ошибками то ты их не видишь, а пользователи страдают. json_encode может вернуть null, у курла вообще много возможностей получить ошибку - проблемы DNS, сети, ответ не с кодом 200, у тебя вообше этого всего нет. Нет таймаутов. Нет переповторов (на практике часть запросов может отваливаться и иногда повтор с задержкой решает прооблему).

Для отправки запросов не стоит использовать курл и возиться с опциями, лушче высокоуровневй ООП-клиент вроде guzzle или поищи еще что сейчас модно.

Все обращения к сторонним серверам надо делать из кли- и крон-скриптов разумеется. Ну на этапер написания прототипа можно конечно пренебречь этим правилом. Но курл лучше не исопльзовать вообще, это низкоуровневая неудобная штука.

> foreach ($words as $word) {


> $url .= "&text={$word}";


Где кодирование спецсимволов? Читай урок https://github.com/codedokode/pasta/blob/master/network/urls.md

> mb_strlen($word, 'UTF-8')


Укажи mb internal encoding лучше.

https://github.com/nsdvw/Memtext/blob/master/app/Helper/TextParser.php#L25
Что за странная регулярка

https://github.com/nsdvw/Memtext/blob/master/app/Auth/LoginManager.php
Можно перенести в сервисы

https://github.com/nsdvw/Memtext/blob/master/app/Handler/NotFoundHandler.php#L20
Зачем вызываешь родительский инвоке? Не понимаю. Ты смотрел, что он делает?

В общем твой код скорее хорошее впечатление производит, копозер есть, ООП есть, библиотеки есть, видно что ты в нашем треде учился, но плохо что для HTTP клиента не додумался библиотеку поискать. Хотя бы для того чтобы не копаться в списке разных параметров курла.

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

А, если ты захочешь внешние программы запускать - для этого есть symfony process. Советую заранее. Для организации очереди задач тоже есть gearman, не придумывай велосипедов.

Идея в общем интересная, я сам когда-то думал сделать сайт который бы помогал читать и переводить мангу, книги, песни, видео и тд. на японском, расшаривать переводы, но это требует какого-то нереального времени, которого у меня нет и вряд ли будет.

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

Алсо, тут https://github.com/nsdvw/Memtext/blob/master/README.md возьми названия HTML тегов в пункте 3 в косые кавычки.
>>710320
#571 #709967
>>709735

Не усложняй задачу. Пиши такую регулярку:

+7 ии 8, за ней ровно 10 цифр, между ними любое число пробелов, минусов или скобок.

>>709765

А я знаю как. Например ютуб или гугл умеет определять наличие расширения хромекаста. Как? Он просто аяксом файл из этого расширения запрашивает. зайди на ютуб и в консоли увидишь ошибки таких запросов.

GET chrome-extension://fmfcbgogabcbclcofgocippekhfcmgfj/cast_sender.js net::ERR_FAILED

В случае с адблоком вообще элементравно: запрашиваешь рекламный скрипт, если он не загрузился -> значит блокируют. Алсо у меня твой антиадблок не сработает так как у меня вообще яваскрипт для незнакомых сайтов отключен. Реклама сегодня создает по моему основную нагрузку на браузер и мне это даром не нужно.

>>709802

там ошибка notice undefined variable, надо исправить.

Также, сумма долга 1000 написана в 2 местах - надо только в одном чтобы было.

Так, в общем, решение годится, хотя пришлось немного поломать голову чтобы понять как оно работает.

>>709828

Не понимаю как переписать все приложение на другом языке может быть выгоднее чем написать одну библиотеку для работы с XML API.
#571 #709967
>>709735

Не усложняй задачу. Пиши такую регулярку:

+7 ии 8, за ней ровно 10 цифр, между ними любое число пробелов, минусов или скобок.

>>709765

А я знаю как. Например ютуб или гугл умеет определять наличие расширения хромекаста. Как? Он просто аяксом файл из этого расширения запрашивает. зайди на ютуб и в консоли увидишь ошибки таких запросов.

GET chrome-extension://fmfcbgogabcbclcofgocippekhfcmgfj/cast_sender.js net::ERR_FAILED

В случае с адблоком вообще элементравно: запрашиваешь рекламный скрипт, если он не загрузился -> значит блокируют. Алсо у меня твой антиадблок не сработает так как у меня вообще яваскрипт для незнакомых сайтов отключен. Реклама сегодня создает по моему основную нагрузку на браузер и мне это даром не нужно.

>>709802

там ошибка notice undefined variable, надо исправить.

Также, сумма долга 1000 написана в 2 местах - надо только в одном чтобы было.

Так, в общем, решение годится, хотя пришлось немного поломать голову чтобы понять как оно работает.

>>709828

Не понимаю как переписать все приложение на другом языке может быть выгоднее чем написать одну библиотеку для работы с XML API.
#572 #709968
>>709829

что ты имеешь в виду? Все приложения на пхп по умолчанию многопользовательские.

>>709830

Не работал, хрень какая-то. Есть CMS и фреймворки, Yii2, Symfony 2

>>709842

Зачем ему вебсокеты если он не чат пишет?

>>709933

тут не нужен аякс. И что значит не реализуешь? юзер отправляет форму и его редиректит на список студентов где он уже включен. Аякс тут выглядит как лишнее усложнение. Объясни какие он дает преимущеситва перед обычными формами + клиентская валидация?

>>709947

Слишком много ифов, там всего 3 или 4 варианта. Отдельно для 11-19, в остальнгых случаях достаточно проверить последнюю цифру.
>>709973
#573 #709970
>>709963

>Но это я. Ты анон, скорее всего начинающий и если ты будешь так поступать то быстро встанешь на путь деградации. Начинающий должен работать не менее 9-10 часов в сутки (сюда включается не только сама работа но и обучение в свободное от нее время) и выбирать "интересные" и современные технологии. И конечно стремится попасть в самую крутую компанию, в которую сложнее всего попасть и где на собеседовании просят доказать что не существует целых чисел возведенных в какую-то степень, которые бы в сумме дали другое число возведенное в эту же степень.


Спасибо большое, буду пересиливать себя и заниматься после работы.
#574 #709972
>>709729

Алсо, не могу промолчать по поводу интерфейса. Вот у тебя на главной кнопка регистрации.

Вот представь что ты хочешь сделать лабу и запускаешь допустим опенофис (ну или пиратский ексель). А там вместо таблицы появляется надпись что он помогает считать числа и предложение зарегистраироватья. не абсурдно ли?

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

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

Вот посмотри мои наброски интерфейса сайта для тестов:

https://gomockingbird.com/mockingbird/#l0bk13j/qSRrov
https://gist.github.com/codedokode/8733007#Описание-сайта

Там нет принудительной регистрации. Ты можешь анонимно создать тест и даже просмотреть потом статистику его прохождения. Регистрация занимает 30 секунд но я бы предпочел обойтись без нее, особенно если я просто зашел посмотреть. Если ты хочешь сделать как лучше для пользователей, а не дял себя, то не принуждай к регистрации. Добавь кнопку "Попробовать так".

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

Заодно время бы сэкономил на верстке форм регистрации и логина.
>>710320
#575 #709973
>>709968

>тут не нужен аякс. И что значит не реализуешь? юзер отправляет форму и его редиректит на список студентов где он уже включен. Аякс тут выглядит как лишнее усложнение. Объясни какие он дает преимущеситва перед обычными формами + клиентская валидация?


Ну он спросил можно ли на пхп в реальном времени обработать форму, я ответил что без аякса он этого не сделает. Средствами пхп только через перезагрузку страницы
>>709977
#576 #709974
>>709729

Алсо в тесте он меня спрашивает: руки? Я пишу hands. Оказывается arms.

При неправильном ответе можно не давать все слово сразу, а открывать постепенно. Или давать несколько вариантов на выбор.
>>710320
#577 #709977
>>709973

Ну да. Но смотри, форму в принципе нет смысла обрабатыывать в "реальном времени". Ты же не будешь регистрировать пользователя пока он не ввел все данные и не нажал кнопку? Верно?

Аякс выгоднее всего использовать там где перезагружать страницу нелогично: голосование, комментирование, переписка, может просмотр альбома. но регистрация это явно отдельная страница, так что перезагрузка страницы тут допустима. и пользователь делает ее один раз в жизни. Аякс тут не нужен.
>>709986>>710002
#578 #709983
>>709830
Делал пару интернет-магазинов на нем. Хорошая CMS.
#579 #709985
>>709717
Я как-то разбирался с опенкартом, дописывал фильтры для товаров. Так там в коде опенкарта какая-то полная неразбериха, сложно проследить логику.
>>709992
#580 #709986
>>709977
Помню заказчик как-то просил сделать, чтобы в случае, когда пользователь начал вводить данные, но передумал и не нажал кнопку отправить, данные все равно отправлялись на почту админа.
>>709988
#581 #709987
Увидел задачу в соседнем треде, поломайте голову:

- дано 3 числа, найти среднее из них.

Желательно как можно проще.
#582 #709988
>>709986

А как определяется что он передумал? Или каждые N секунд отслылать? Это нужно только сайтам с посещаемостью полчеловека в сутки. И более того, спамить человека который явно отказался от регистрации не лучшая идея. Я бы письмо от него сразу в спам отправил.
#583 #709992
>>709985
По мне так наоборот всё довольно просто, есть админка, есть каталог, разделение MVC, языковые файлы отдельно лежат.
84 Кб, 600x300
#584 #709994
В PHP есть анолог NodeXL. Мне нужно распарсить каждую страницу сайта и сохранить их связи с другими страницами в граф.

http://www.stateofdigital.com/visualize-your-sites-internal-linking-structure-with-nodexl/
>>709999>>714988
#585 #709996
>>709987
Берем минимальное из чисел, затем максимальное, оставшееся и будет средним.
#586 #709999
>>709994
В PHP есть анолог NodeXL?
fix
9 Кб, 504x292
#587 #710002
>>709977
Хорошо. А что насчет страницы со списком студентов? Если пользователь нажимает на двойку, то открывается другая страница или открывается та же самая страница (index.php), но с новым списком?
>>710006
#588 #710005
>>709987
свали нахуй, дегрод.
#589 #710006
>>710002

Та же самая со второй страницей.
#590 #710151
>>702830

при разрешении 1024x768 появляется горизонтальный скрол. нихуя не адаптивно.
#591 #710156
>>709729

А, еще:

> you may watch the vocabulary attached to the text and ignore garbage like short words,


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

> or words you already know


Вот тут наверно хорошо бы чтобы этот список работал для всех текстов пользователя.
>>710320
#592 #710165
>>709729

https://github.com/nsdvw/Memtext/blob/redis_based/app/Redis/RediskaAdapter.php
Если ты такое пишешь то тебе наверно не нужна редиска, а стоит просто поискать клиент с аналогичным интерфейсом.

Ну и что касается редиса, если уж ты его используешь как хранилище, логично сделать к нему какой-то интерфейс - то есть класс с методами вроде saveWords(), аналогично мапперам или TDG, а не размазывать везде низкоровневый код работы с ключами. Вот если бы ты его как кеш использовал - тогда ок, а если как хранилище то лучше сделать отдельный класс.
#593 #710178
>>709802
Да, сейчас всё нормально.
Вчера там было 2200, что-то такое.
Хз, из-за чего.
У тебя повторяется $interest+$commission; дважды - нельзя ли сократить это до одного?
58 Кб, 378x378
#594 #710213
ОП, новый урок по ООП хорош, но неподъёмен!
Слишком много всего за один раз: наследование, то, сё...
Я делаю вторую задачу про Вектор (кстати, почему так одинаково названы задачи: первая лёгкая про Вектор, где посчитать переработанные часы и так далее, и вторая сложная про Вектор с антикризисными мерами и прочим? Путаница возникает же!), так вот, со всеми новыми уточнениями такая каша вдруг в голове возникла...
Слишком резкий переход получился, мне кажется.
С другой стороны, возможно, это должно помочь определиться с решением, но пока не выходит...
Вот пока только что сделал: http://ideone.com/QmJ2WR
Всё по твоим заветам начинать с малого.
Мне этот мой подход не кажется ПО ТРУЪ ООП, такие дела.
Опять у меня расчёт всего происходит за пределами класса, не методом, а дополнительной функцией.
Переносить всё в сам класс, сделав одним из методов? Это возможно вполне, но обязательно ли?
Далее вообще не понимаю, для чего нам нужны классы Компания и Департамент в этом случае.
Достаточно одного класса Сотрудник, получается, чтобы всё найти.
Не по ООП это у меня, ох не по ООП, чую одним местом сердцем...
#595 #710214
>>710213
Кстати, подсказка в новой версии урока помогла функции padLeft и padRight упростить до предела.
Спасибо!
>>710226
#596 #710226
>>710214
Хм, однако Идеоне выдаёт предупреждение:
PHP Warning: str_repeat(): Second argument has to be greater than or equal to 0 in /home/PbKFpD/prog.php on line 69
Странно, там во втором аргументе у меня число недостающих пробелов, я не улавливаю, что ему нужно.
Также почему-то в графе "кофе" идёт смещение на один символ, что за бред...
Буду разбираться, хотя это всё предварительное решение, чтобы понять, в том ли вообще направлении двигаться.
>>710228
#597 #710228
>>710226
Разобрался: ширина первого слова "Департамент" была больше, чем ширина ячейки таблицы.
#598 #710235
>>710213

При расчете потребления кофе или страниц не учитывается статус босса.

Для обозначения профессий надо использовать константы как в уроке.

Зарплата для данной профессии должна быть указана один раз в коде, а не скопипастена много раз.

> $department = $employees[$i - 1]->department;


Это выглядит как минимум странно. А если там 0 сотрудников? А если у них разные департаменты? По моему так не надо вообще в этой функции определять департамент.

Давай дальше делай объекты Департамент и Компания.
>>710325
#599 #710238
>>710213

> Далее вообще не понимаю, для чего нам нужны классы Компания и Департамент в этом случае.


Чтобы хранить информацию о Департаменте: название, сотрудники. Чтобы были методы для получения общего потребления кофе, увольнения, приема на работу.

А сейчас у тебя фактически то, что должно быть в классе Департамент размазано по коду и по функции getIndex.

Ну смотри, например я хочу узнать сколько кофе выпивает департамент маркетинга. Где это получить? Пока что негде.

Компания нужна чтобы было объект представляющий компанию. Я же вроде писал выше - вот допустим у тебя есть функция, которая что-то делает с компанией, например увольняет плохих сотрудников. Что ты в нее передашь?

Ты можешь не делать ее, посмотрим что ты придумаешь.

В конструкторе Сотрудника многовато параметров, сделай-ка функцию для создания сотрудника, которая будет автоматически проставлять зарплату и прочее из таблицы.
>>710325
#600 #710320
>>709987
Числа положить в массив.
Сортировать массив.
Взять второй индекс.
Или тут где-то подвох?

>>709964

>redis позиционируется как кеш, и кому в здравом уме придет в голову хранить данные в кеше?


Если данные второстепенные, которые не страшно потерять, то почему бы и нет. Например я выбрал сначала схему с хранением словаря к тексту в виде хеша. Под словарем я имею ввиду именно слова, принадлежащие к данному тексту. То есть разбить текст на слова, найти этим словам перевод и сохранить в редис. Если этот словарь будет потерян, не составит труда снова проделать вышеупомянутую последовательность: разбить текст на слова, перевести, сохранить в мемкеш/редис.

К редису пришел, потому что испугало кол-во записей в таблице связи текст_слово. Это даст 1000 x 1000 до 1млн записей в эту таблицу на одного пользователя.
Я не знал, что реляционные базы могут справляться с такими объемами (десятки миллиардов). Но раз могут, то и хорошо. Тем более есть какие-то техники для распределения нагрузки по серверам (шардинги, масштабирование, репликации и другие незнакомые слова).

>Ты наверно думаешь что редис обладает какими-то чудесными свойствами? Ему для хранения миллиарда пар чисел точно также понадобится не меньше


Я думаю, что редис это хранилище ключ-значение без индексов и связей, значит один хеш может занять хоть 50, хоть 100gb, сколько там памяти на сервере. Или не может?
В субд все сложнее, вряд ли одна табличка может занимать столько места.
Ну и плюс скорость. Потому выбрал тогда редис.

>Насчет яндекс-переводчика, он тебе не нужен.


Не нашел (особо и не искал) дамп словаря. Потому схема такая: полезть в свою базу данных, если там нет, то отправить яндексу, и СОХРАНИТЬ полученный от яндекса список.
Так что пока нагрузка маленькая

>API бесплатно переводит до 10 миллионов символов в месяц


, то почему бы и не использовать такую схему. Тем более что рабочее приложение будет иметь платный акаунт.
Ладно, не поленюсь найти словарь, причем с подробным описанием и вариантами ответов, потому что пока отдает только один вариант. Чувствуется, что их переводчик заточен именно переводить тексты а не отдельные слова, подыскивая наиболее точный перевод из контекста.

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

Так что да, возвращаемся к обычной связи многие ко многим.
1. Таблица со словарем. (общим для всех текстов всех пользователей)
2. Таблица с текстами.
3. Связь. Большая, но нас это уже не пугает?

Запишу себе почитать про архитектуру нагруженных сервисов, nosql базы типа mongo, о преимуществах postgresql.

>>709965

>Что же это за словарь, что база данных с ним не справится?


Имелась ввиду большая таблица связей текст-слово. В одном тексте ~1000 слов, текстов несколько сот у каждого пользователя, пользователей десятки и сотни тысяч.
Но мы вроде решили, что это не проблема, там как-то разруливается при помощи распределения нагрузки по серверам.

>какие основные виды запросов будут делаться


Запрос на выбор текста со всеми принадлежащими ему словами. (Два запроса то есть, выбрать текст, выбрать слова по text_id).
Запрос на игнорирование некоторых слов. Получится глобальным, на все тексты пользователя, но это вроде и к лучшему.
Вроде все, остальное мелочи вроде "выбрать список названий текстов пользователя по id".

>Плохо представляю себе человека, способного прочесть несколько сотен книжек на незнакомом языке.


Речь шла об одной книжке, разбитой на страницы. Первоначально задумывалось, то пользователь может загрузить большой файл электронной книги.
Но я уже обломался, наверное пока не буду делать, может быть позже. Тем более придется учить библиотеку для xml. Ну и сам xml на всякий случай тоже.

>может какие-то из них можно вообще не хранить, а вычислять когда понадобятся.


Вот это классная идея.

>>709966

>Можешь ли ты сделать валидацию сущности без формы?


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

>Разве не логичнее привязать валидацию к моделям?


Не знаю, тогда уже наверное лучше запилить отдельный класс Identity, как в yii. Потому что та инфа что вбивает пользователь в форму, не имеет отношения к модели. В модели (если следовать логике что поля объекта модели должны совпадать с полями в таблице) пользователя есть поля "соль" и "хеш", тогда как в форме этих полей нет, но есть "пароль".

>https://github.com/nsdvw/Memtext/blob/master/app/Handler/NotFoundHandler.php#L20


>Зачем вызываешь родительский инвоке? Не понимаю. Ты смотрел, что он делает?


Для определения своего шаблона для страницы ошибки.
Да, смотрел. Он рендерит стандартную страницу с ошибкой, мне нужна была кастомная.
Последовательность такая:
1. При ошибке слим ищет в контейнере обработчик 'notFoundlerHandler'. Если не находит, создает дефолтный, где возвращается NotFound с инвоком
https://github.com/slimphp/Slim/blob/88bc70973d6dde7620f1287b4d7681923e0e616a/Slim/Handlers/NotFound.php#L43
2. Invoke вызывается https://github.com/slimphp/Slim/blob/3.x/Slim/App.php#L455-L456
Следовательно мне нужен другой класс для того чтобы отдать другую страницу.
А, ты наверное о том, зачем parent::_invoke. Не разобрался, думал это всегда нужно писать для переопределения метода.
parent позволяет как бы дописать в родительский метод что-то новое. С другой стороны, если метод что-то возвращает, то родительский код будет полностью затерт.
Да, понял, parent там не нужен.

>плохо что для HTTP клиента не додумался библиотеку поискать.


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

>>709972

> не могу промолчать по поводу интерфейса


Чукча не дизайнер и не архитектор, чукча старается быть хороший исполнитель.
Был бы у меня макет или хотя бы прототип, сверстал бы пиксель в пиксель.
Просто не знал, как сделать дизайн, потому передрал у memrise.com, там у них тоже без регистрации ничего не позволяется. Ну и там гораздо сложнее система, под пользователя хранится вся история, список заученных слов со статистикой прохождения и т.д. под незарегистрированных пользователей наверное даже не делали.

>>709974
Да, яндекс отдает только один вариант перевода. Нужно искать хороший дамп со статьей и вариантами перевода.

>>710156
К редису вернусь когда/если дойду до хранения статистики и истории. Хотя возможно и тут можно без него обойтись.

Ладно, пойду пока исправлять.
#600 #710320
>>709987
Числа положить в массив.
Сортировать массив.
Взять второй индекс.
Или тут где-то подвох?

>>709964

>redis позиционируется как кеш, и кому в здравом уме придет в голову хранить данные в кеше?


Если данные второстепенные, которые не страшно потерять, то почему бы и нет. Например я выбрал сначала схему с хранением словаря к тексту в виде хеша. Под словарем я имею ввиду именно слова, принадлежащие к данному тексту. То есть разбить текст на слова, найти этим словам перевод и сохранить в редис. Если этот словарь будет потерян, не составит труда снова проделать вышеупомянутую последовательность: разбить текст на слова, перевести, сохранить в мемкеш/редис.

К редису пришел, потому что испугало кол-во записей в таблице связи текст_слово. Это даст 1000 x 1000 до 1млн записей в эту таблицу на одного пользователя.
Я не знал, что реляционные базы могут справляться с такими объемами (десятки миллиардов). Но раз могут, то и хорошо. Тем более есть какие-то техники для распределения нагрузки по серверам (шардинги, масштабирование, репликации и другие незнакомые слова).

>Ты наверно думаешь что редис обладает какими-то чудесными свойствами? Ему для хранения миллиарда пар чисел точно также понадобится не меньше


Я думаю, что редис это хранилище ключ-значение без индексов и связей, значит один хеш может занять хоть 50, хоть 100gb, сколько там памяти на сервере. Или не может?
В субд все сложнее, вряд ли одна табличка может занимать столько места.
Ну и плюс скорость. Потому выбрал тогда редис.

>Насчет яндекс-переводчика, он тебе не нужен.


Не нашел (особо и не искал) дамп словаря. Потому схема такая: полезть в свою базу данных, если там нет, то отправить яндексу, и СОХРАНИТЬ полученный от яндекса список.
Так что пока нагрузка маленькая

>API бесплатно переводит до 10 миллионов символов в месяц


, то почему бы и не использовать такую схему. Тем более что рабочее приложение будет иметь платный акаунт.
Ладно, не поленюсь найти словарь, причем с подробным описанием и вариантами ответов, потому что пока отдает только один вариант. Чувствуется, что их переводчик заточен именно переводить тексты а не отдельные слова, подыскивая наиболее точный перевод из контекста.

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

Так что да, возвращаемся к обычной связи многие ко многим.
1. Таблица со словарем. (общим для всех текстов всех пользователей)
2. Таблица с текстами.
3. Связь. Большая, но нас это уже не пугает?

Запишу себе почитать про архитектуру нагруженных сервисов, nosql базы типа mongo, о преимуществах postgresql.

>>709965

>Что же это за словарь, что база данных с ним не справится?


Имелась ввиду большая таблица связей текст-слово. В одном тексте ~1000 слов, текстов несколько сот у каждого пользователя, пользователей десятки и сотни тысяч.
Но мы вроде решили, что это не проблема, там как-то разруливается при помощи распределения нагрузки по серверам.

>какие основные виды запросов будут делаться


Запрос на выбор текста со всеми принадлежащими ему словами. (Два запроса то есть, выбрать текст, выбрать слова по text_id).
Запрос на игнорирование некоторых слов. Получится глобальным, на все тексты пользователя, но это вроде и к лучшему.
Вроде все, остальное мелочи вроде "выбрать список названий текстов пользователя по id".

>Плохо представляю себе человека, способного прочесть несколько сотен книжек на незнакомом языке.


Речь шла об одной книжке, разбитой на страницы. Первоначально задумывалось, то пользователь может загрузить большой файл электронной книги.
Но я уже обломался, наверное пока не буду делать, может быть позже. Тем более придется учить библиотеку для xml. Ну и сам xml на всякий случай тоже.

>может какие-то из них можно вообще не хранить, а вычислять когда понадобятся.


Вот это классная идея.

>>709966

>Можешь ли ты сделать валидацию сущности без формы?


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

>Разве не логичнее привязать валидацию к моделям?


Не знаю, тогда уже наверное лучше запилить отдельный класс Identity, как в yii. Потому что та инфа что вбивает пользователь в форму, не имеет отношения к модели. В модели (если следовать логике что поля объекта модели должны совпадать с полями в таблице) пользователя есть поля "соль" и "хеш", тогда как в форме этих полей нет, но есть "пароль".

>https://github.com/nsdvw/Memtext/blob/master/app/Handler/NotFoundHandler.php#L20


>Зачем вызываешь родительский инвоке? Не понимаю. Ты смотрел, что он делает?


Для определения своего шаблона для страницы ошибки.
Да, смотрел. Он рендерит стандартную страницу с ошибкой, мне нужна была кастомная.
Последовательность такая:
1. При ошибке слим ищет в контейнере обработчик 'notFoundlerHandler'. Если не находит, создает дефолтный, где возвращается NotFound с инвоком
https://github.com/slimphp/Slim/blob/88bc70973d6dde7620f1287b4d7681923e0e616a/Slim/Handlers/NotFound.php#L43
2. Invoke вызывается https://github.com/slimphp/Slim/blob/3.x/Slim/App.php#L455-L456
Следовательно мне нужен другой класс для того чтобы отдать другую страницу.
А, ты наверное о том, зачем parent::_invoke. Не разобрался, думал это всегда нужно писать для переопределения метода.
parent позволяет как бы дописать в родительский метод что-то новое. С другой стороны, если метод что-то возвращает, то родительский код будет полностью затерт.
Да, понял, parent там не нужен.

>плохо что для HTTP клиента не додумался библиотеку поискать.


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

>>709972

> не могу промолчать по поводу интерфейса


Чукча не дизайнер и не архитектор, чукча старается быть хороший исполнитель.
Был бы у меня макет или хотя бы прототип, сверстал бы пиксель в пиксель.
Просто не знал, как сделать дизайн, потому передрал у memrise.com, там у них тоже без регистрации ничего не позволяется. Ну и там гораздо сложнее система, под пользователя хранится вся история, список заученных слов со статистикой прохождения и т.д. под незарегистрированных пользователей наверное даже не делали.

>>709974
Да, яндекс отдает только один вариант перевода. Нужно искать хороший дамп со статьей и вариантами перевода.

>>710156
К редису вернусь когда/если дойду до хранения статистики и истории. Хотя возможно и тут можно без него обойтись.

Ладно, пойду пока исправлять.
>>712495
#601 #710325
>>710235

>При расчете потребления кофе или страниц не учитывается статус босса.


Да, я пока только наметил общие функции, пока только для зарплаты добавил ставку босса.

>Для обозначения профессий надо использовать константы как в уроке.


Так, это я упустил. А что это даст? Пока не пойму.
Например, вот для этого, наверное:

>Зарплата для данной профессии должна быть указана один раз в коде, а не скопипастена много раз.


>Это выглядит как минимум странно. А если там 0 сотрудников? А если у них разные департаменты? По моему так не надо вообще в этой функции определять департамент.


Тут я вывернулся с костылём, буду думать, как сделать лучше, спасибо.
>>710238
Спасибо, буду осмысливать.

>Ну смотри, например я хочу узнать сколько кофе выпивает департамент маркетинга. Где это получить? Пока что негде.


Пока что нигде, потому что это всего лишь черновик для одного департамента Закупок.
Для него можно сделать вот это:

>$purchaseDepartment = getIndex($employeesPurchaseDepartment);


Так думал и со всеми другими департаментами делать, а потом объединить все департаменты и циклом пройтись по ним с выводом всех их получившихся значений.
Значит, это не верный подход?
Так, буду думать.

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


Для соответствующих должностей?
Если Me, то зарплата такая-то. Если Ma, то такая-то. А если босс, то лучше ставить всё равно профессию и вычислять в ставках и прочем? Наверное, так лучше.
Можно будет в этом же цикле сделать цикл foreach, который будет выяснять соотношение профессии и выдавать зарплату в виде $employee->basicSalary = соответствующее значение из массива.
Буду пытаться, спасибо, ОП!
>>714989
136 Кб, 600x1322
472 Кб, 679x3403
#602 #710327
Йоу йоу, ОП и крутые версталы, гляньте одним глазком
http://w99953g4.bget.ru/theband/
Как обычно половины картинок не было. Нормально работает только в хроме и только на разрешениях овер 1024 и еще этот плагин листающий на всю высоту искажает зум браузера.
Ладно-ладно, признаю, я там все запорол, прост скучно доделывать, а потраченного времени жаль.
Теперь серьезный вопрос. Где своровать СЛОЖНЫЙ, МНОГОСТРАНИЧНЫЙ макет и чтобы в нем обязательно были версии для мобильных, а также эффекты анимации, ховеров, фокусов, модальных окон и всего такого. Вот что-то уровня пик2 или http://envato.megadrupal.com/html/vastudio/index-video-full.php по качеству
Я уже перерыл весь behance и dribble и там только однообразное примитивное дно без челленджа
Я прям чувствую что познал дзен верстки, готов расчленять и потрошить, только дайте ГОДНЫЙ макет.
>>710338>>714990
#603 #710338
>>710327
скинь макет с хексагонами пож, есть тема куда можно применить первый экран
>>710347
#604 #710342
>>709800
дабл оставили без внимания? вы че еп
>>710348
#605 #710347
>>710338
http://www.filedropper.com/001-down
Он весьма донного качества при ближайшем рассмотрении(не дизайн, а сам псд-шник)
Взял отсюда
https://www.behance.net/gallery/26431723/Hexagon-One-Page-Portfolio-(Free-PSD)
#606 #710348
>>710342

>Не усложняй задачу. Пиши такую регулярку:


>+7 ии 8, за ней ровно 10 цифр, между ними любое число пробелов, минусов или скобок.


Пробуй сначала, чтобы все варианты отлавливало:
+7
+ 7
8
Дальше - по рекомендациям ОПа, которые я процитировал.
>>710444
#607 #710444
>>710348
первое что мне на ум приходит между каждым символом ставить группу [()\s-]?, не?
>>710447
#608 #710447
>>710444
Что именно ты делаешь?
Почему не слушаешь советов?
Попробуй добиться, чтобы отлавливала регулярка именно +7, + 7 и 8.
Подожди со скобками пока.
#609 #710582
>>709223
Всему этому учат на 3х месячных курсах кстати говоря. 3 месяца по 7 часов в день - и ты все это освоил, готовый джун. А ты тут порасписал, будто это все какие-то неодолимые сложности.
>>710588
#610 #710587
>>709223
Поэтому я и сижу в этом треде.
#611 #710588
>>710582
Примеры подобных курсов в студию!
Неистово реквестирую!
>>710591>>710593
#613 #710593
>>710588
Сам на такие ходил. Первую неделю - ставили xampp, настраивали apache, .htaccess, конфиги, php.ini и прочее такое. Вторая неделя - основы OOP, основы PHP, mysql селекты-джойны всякие. Третья неделя - сели писать CMS на чистом php и mysql, четвертая неделя - подключали bootstrap и jquery, переделывали cms, чтобы на все динамически реагировала. Дальше очень много ушло на javascript и его основы, Ajax запросы писали, кучу тестовых заданий по выборке из БД через Ajax и PHP, тут еще Mysql расширенно поосваивали. Заодно основы HTML и CSS по ходу дела. Последний месяц осваивали CMS - Magento, Wordpress, Typo3. В конце зацепили Zend Framework. В принципе у нас половина народа со всем справилась, стали готовые джуны. Половина не справилась, но сказали что тоже много полезного извлекли, будут свои сайты клепать.
>>710597
#614 #710595
Почаны. Чет я не догоняю. Вот у меня есть массив типа

$ololo = array('M','N','O','G','A','B','U','K','A','F');

И я хочу вывести случайный элемент таой вот штукой

$randOlolo = array_rand($ololo);

Но мне в консоль вместо имени элемента выводит его индекс, как я понял. Как сделать так, чтобы выводил имя элемента?
#615 #710597
>>710591
Этих знаю, пару раз мелькали в тредах. Того же Специалиста из Бауманки знаю.
Все есть на торрентах, только ведь нужен интерактив, чтобы поправили, если куда не туда улез.
>>710593
Вот именно пешочком ходил, не интерактивные онлайн-курсы?
Какой город?
>>710595
Попробуй $randOlolo[0], $randOlolo[1], $randOlolo[2] и так далее. Тебе надо указать ключ, чтобы вернулось его значение в массиве.
>>710602>>710603
#616 #710599
>>710591
Бля, сайт по второй ссылке какое-то УГ. Именно оформление. Если ресурс пилил автор, то нахуй надо? Или у меня неправильное суждение о верстальщиках?
>>710601
#617 #710601
>>710599
Это Евгений Попов, известный курсовод.
На этих курсах заработал не один миллион долларов.
Вот его основной сайт: http://evgeniypopov.com/
А то какой-то реселлер левый, похоже.
#618 #710602
>>710597

>Вот именно пешочком ходил, не интерактивные онлайн-курсы?


Да, пешочком, по 7 часов в день программирования с перерывом на час. Курсы от института местного, брали всех желающих. От интерактивных и онлайновых думаю такого толка не было бы, потому что у нас там был целый класс с компами и постоянно все друг к другу бегали помогать, и препод от стола к столу бегал, ошибки в коде править. Собственно от этого и весь эффект, так бы думаю вряд ли кто справился бы, программа очень интенсивная была.
>>710612
#619 #710603
>>710597
Чет я все равно не понял. так, а я могу сделать это через foreach($word1 as $num -> $name){
$randOlolo = array_rand($name)};?
>>710608>>710612
#620 #710608
>>710603
Хуйню написал.
#621 #710609
>>710595
$ololo[array_rand($ololo)]
Офигеть как сложно, правда?
>>710615
#622 #710610
>>710595
я выводил через shuffle($ololol);
echo $ololo[0];

потому что array_rand возвращает ключ и приходилось создавать еще одну переменную с этим ключом, с тем же успехом можно просто рандомить $a= rand(0,count($ololo)) и вставлять ключ в echo $ololo[$a]
#623 #710612
>>710602

>От интерактивных и онлайновых думаю такого толка не было бы


Sic!
Но буду Русакова смотреть, даже куплю несколько курсов, он вроде как отвечает и помогает новичкам.

>>710603
Там не ->, а =>.
Там будет ошибка, потому что ты даёшь строку в функцию, которая ожидает массива.
Что тебе нужно именно?
Вот такое, наверное:
$randOlolo = $ololo[array_rand($word1)];
>>710613>>710616
#624 #710613
>>710612

>он вроде как отвечает и помогает новичкам


В этом треде тоже отвечают и помогают, главное вопросы правильно задавать и примеры кода постить.
#625 #710615
>>710609
Ты лучший! Просто огромный шаг к своению похапы!
#626 #710616
>>710612
Ты лучший! Огромный шаг к освоению похапы!
#627 #710764
Как удалить элемент из массива?
>>710766
#628 #710766
>>710764
unset

анон, а как лучше передать json объект в js при непосредственной загрузке страницы? идея такая: при загрузке страницы сервер получает от api JSON объект, содержащий зависимые друг от друга варианты выбора в выпадающих списках. Правильно ли я понимаю, что единственный способ передачи этого JSON в js скрипт - это запрос по ajax при загрузке страницы?
>>710768>>710772
#629 #710768
>>710766
а если вот мне нужно каждый элемент массива проверить, например, на какой-то определенный признак, и если совпадает, то удалить элемент?
#630 #710772
>>710766
<script>var obj = JSON.parse(<?php echo $json;?>);</script>

>>710768
if (совпадает) { удалить элемент }
>>710940
#631 #710773
>>710768
$array = array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5,'f'=>6);
foreach ($array as $key=>$value)
{
if ($key == 'c')
unset($array[$key]);
}
var_dump($array);
#632 #710774
>>710768
array_filter()
#633 #710781
Как убрать из текста пробелы?
>>710787
#634 #710782
Как вывести текст на экран?
>>710787
#635 #710787
Анон, есть два массива $araEstJi=array(2,231,6,321,6342)
и второй массив $test=array(4,6,7,8,1,3)
У меня задача: сделать так, чтобы значения первого массива стали КЛЮЧАМИ второго, то есть, нужно это перевести в вид
$result=array(2 =>4, 231=>6, 6 =>7, 321=>8 и т.д.), я вот реально не пойму, как это сделать. Два дня ебусь, уже и с array_keys ебался, не помогает. Подскажите, что делать?
>>710781
explode(' ', $text);
>>710782
echo
>>710793
#636 #710788
Как сложить два числа?
>>710793
#637 #710793
>>710787

>Подскажите, что делать?


Бочку.
Прочитать список функций для работы с массивами, может там есть готовая. Четвертая по списку например.

>>710788
Зарепортил.
>>710798
#638 #710798
>>710793
Бля, анон, вот когда ведь заебываешься, не замечаешь ОЧЕВИДНЕЙШИХ вещей. Спасибо, много нефти тебе и женщин красивых.
#639 #710817
Cмотрите, у меня есть такая схема
foreach ($symb as $key=>$value)
{
if (($value == null)||($value == ' ')){
unset($symb[$key]);
}
$text1 = $text1.$value;

По идее, пробелов быть в $text1 не деолжно, т.к. там условием выше они убиваются. Но выводит все равно с пробелами. ЧЯДНТ?
>>710820>>710825
#640 #710820
>>710817
var_dump($symb) пробелов не показывает.
#641 #710825
>>710817
В foreach копируется значение, а не передается по ссылке.
Нужно as &$value.
И тебе уже выше говорили про array_filter.
#642 #710847
Наговнокодил наконец-то, пиздец. Два дня мучался, такое говнокодище - я ебал, зато сделал.
https://ideone.com/v8koxf
Постановка задачи. Определить слова какой длины чаще всего встречаются в строке.

Ввод. Последовательность символов, оканчивающаяся символом перехода на новую строку. Длина последовательности не превышает 256 символов. Словом считается последовательность символов, отделенная пробелами и содержащая только буквы латинского алфавита.

Вывод. Наиболее распространенная длина слов (целое число). Если слова различной длины встречаются одинаковое число раз, то вывести несколько значений.
>>710859>>711380
#643 #710859
>>710847
Выучи уже стандартные функции.
Там решается в три хода.

$words = explode(' ', $input);
$repeats = array_count_values($repeats);
$max = max($repeats);
#644 #710860
>>710859

>array_count_values


бляяяяя, анон. Ну почему я не нагуглил сразу-то, блять, я себя таким тупорылым дауном чувствовал, когда делал. Но зато руку набил.
#645 #710861
>>710859
Подсчет длины забыл вторым шагом.
#646 #710882
У меня explode(' ',$text) нахуй весь текст удаляет! Почему?
>>710890
#647 #710889
Эта чертова задача, с проверкой на палиндром! Я вижу, что ОП там убирает пробелы и делает строчные буквы в 2 строки! А я блядь ни так не могу ни через ебаные массивы не могу! Объясните пожалуйста! Я тупой!
>>710890
#648 #710890
>>710882
https://ideone.com/BWbhkB - всё там нормально.

>>710889
Одна функция убирает пробелы (регулярка с пробелом в preg_replace), другая функция переводит получившуюся строку в нижний регистр.
Всё.
>>710891
#649 #710891
>>710890
$txt = preg_replace('',' ', $text);
так?
#650 #710892
>>710891
Регулярку с замещением попутал.
>>710913
#651 #710894
>>710891
И там не регулярка - нет слэшей.
#652 #710913
>>710891
>>710892
Можно же ещё перебором всех символов в строке через цикл и обычной заменой " " на "", разве нет?
>>710917>>710938
#653 #710917
>>710913
Вот я понимаю это так: есть строка, я все символы сначала перевожу в строчные, затем разбиваю строку на массив символов, делаю замену " " на "", но индерс сохраняется же! Получается, что проверку по массиву на одинаковые буковки нет смысла делать. Получается, что мне потом из массива обратно превратить в обычную строчку. Но так можно?
>>710934>>714990
#654 #710921
Как с помощью for() "пройтись" по строке и проверить идентичность определенных символов в ней?
>>710922>>710938
#655 #710922
>>710921
это, кстати, следующий шаг ОПа в задаче на палиндром
309 Кб, 1920x1080
#656 #710931
Приближаясь к осознанию Вектора

Итак, ОП, Зандстра и братишки подсказывают, что надо делать несколько классов.
Класс Сотрудник, класс Департамент, класс Компания.
Класс Сотрудник может содержать в себе профессию, потребление кофе, ранг, является или нет боссом, производство страниц, ставку по зарплате.
Класс Департамент может содержать в себе общее количество сотрудников, общее потребление кофе, общее производство страниц, общую зарплату, среднее соотношение страницы к затратам на её производство.
Класс Компания может содержать департаменты, может содержать антикризисные меры (наверное).

Я верно вообще мыслю?
Чувствую себя каким-то жвачным животным - ОП всё разжёвывает, а я никак не дотуплю...

Тут Зандстра подсказывает (и ОП теперь поставил это перед решением задачи на сложный Вектор), что можно делать наследование. У Зандстры от класса Продукт наследуются классы Книга и Компакт-диск.
Мы можем наследовать от класса Сотрудник классы по каждой профессии. Далее можно включить любую другую профессию, так же унаследовав её от Сотрудника.
Но целесообразно ли это в нашей ситуации?

Вот небольшое внедрение по совету ОПа автоматизации при добавлении экземпляров классов: http://ideone.com/ozexhc
Также сейчас рассчитываются ставки босса по кофе и страницам.
Но не слишком ли громоздким будет такая реализация - через кучу однотипных циклов?
Можно так-то и в одном цикле с кучей условий сделать, чёрт, только сейчас подумал. Но там что-то поменять будет крайне сложно потом...
И прошу учесть - это всего лишь для одного департамента Закупок создание сотрудников, а у нас будет четыре таких департамента...
>>712486>>712487
#657 #710934
>>710917

>Но так можно?


Можно, в данной ситуации можно даже не разбивать на массив, а сразу составлять новую строку по мере прохождения цикла через if, гугли конкатенацию.
1113 Кб, 3822x1542
#658 #710938
>>710921
Пробуй сделать так, как прежде делал в циклах подобных.
Тебе брать нужно по одному символу с начала и с конца предложения и сравнивать.
В цикле будешь ты идти по одной букве от начала и от конца, к середине строки двигаясь .
Функция mb_substr да с тобой пребудет .

>>710913
Лишнее это.
Функция preg_replace без массивов сделает всё.
>>710948
#659 #710940
>>710772
>>710772

Быссмысленное переусложнгение. Джейсон это часть яваскрипта и можно (нужно) писать

var x = {{ y | json_encode | raw }} ;

У яндекса видел еще такую штуку:

<скрипт type="application/json" id="...">...</скрипт>

Почему у вас вообще такое стремеление пихать везде аякс запросы? В видеокурсах так учат?
#660 #710943
https://ideone.com/D1d0D8

Почему мое регулярное выражение не работает?
>>711583>>711584
#661 #710948
>>710938
Мастер, понял это я уже из теор. сведений предшедствующих задаче самой.
mb_substr($text, 0, 1) - символ первый, mb_substr($text, 0, -1) - символ последний. Но ведь написать не смогу я образом следующим:

for($i = 0; $i <= $halfLength; $i++) {
mb_substr($text, 0, 1) == ($text, 0, -1)
}

Не понимаю я поэтому, как символы эти сравнить.
>>710969>>714990
#662 #710969
>>710948
Нет
mb_substr($text, 0, 1) - первый
mb_substr($text, -1, 1) -последний
А для использования в цикле вот тебе подсказка: у тебя есть переменная, значение которой с каждым проходом цикла изменяется, и арифметика, пользуй их!
>>711109
161 Кб, 550x827
#663 #710994
Привет котоны.

Переделал "числа прописью", кода получилось в 3 раза меньше, чем в первый раз )
http://ideone.com/o10fvo // "числа прописью"

Сделал задачу с банкоматом, с помощью алгоритма из задач о рюкзаке
http://ideone.com/y7Fxkp // банкомат 6600

Объекты в PHP, часть 2
Программа для расчета зарплаты сотрудников «Вектор»
http://ideone.com/bx6lZv // ООП 2
#664 #711109
>>710969
for ($i=0; $i<=$halfLenght; $i++) {
$let1 = mb_substr ($text, $i, $i++);
$let2 = mb_substr ($text, -$i, -$i++);}
Не работает так.
>>711115
#665 #711115
>>711109
Понел.
for ($i=0; $i<=$halfLenght; $i++) {
$let1 = mb_substr ($text, $i, 1);
$let2 = mb_substr ($text, -$i-1, 1);}
Вот такие дела. Так вообще все идеально работает.
>>711120
#666 #711120
>>711115
http://ideone.com/JmM7FH
Сделал ебучую задачку с палиндромом. Целуйте меня в засосы.
>>711691>>712477
#667 #711143
>>708005

> Ты про Айфон решил? Что-то в последнее время не было решений её.


Тогда пропустил, если честно, вот она :
http://ideone.com/yuAXDw
Правда, слегка методом тыка, почему оно заработало именно при 3000 я не понял.
>>711154
#668 #711154
>>711143

>$creditBalance = ( $creditBalance * $percent ) + $servicePayment - $lastPayment;


Вот это повторяется, а значит - может быть сокращено до одного раза.
Забавно, считает всё верно, но какие-то 3000 откуда-то...
>>711168>>711194
#669 #711168
>>711154
Он просто подогнал к ответу.
>>711194>>711199
#670 #711194
>>711154

> Вот это повторяется, а значит - может быть сокращено до одного раза


Не понял, где оно повторяется, оно же выполняется только при условии $left>0

> Забавно, считает всё верно, но какие-то 3000 откуда-то...


Я так подумал, как вариант, проверка идет в самом начале и после последнего вычисление может остаться, скажем, 4500 + комиссия + проценты, значит с 1 раза я не смогу заплатить за этот месяц.
Всё, переделал, теперь нет там 3000
http://ideone.com/yuAXDw
>>711168
С другими числами тоже работает.
>>711206>>712477
#671 #711199
>>711168
Там на любой сумме считает правильно, в том-то и дело.
На 1к, на 3к, на 5к, я попробовал.
>>711200
#672 #711200
>>711199
На 5к и 4к у меня неправильно считало.
>>711206
#673 #711206
>>711194
Считает правильно, но куски кода повторяются, надоизбавляться от такого.
Например, вынести за пределы условий в цикле, избавившись от различных по названию, но одинаковых по сути переменных.
>>711200
Вроде было правильно и на 5к.
#674 #711310
Дампы добавлять ли в репозиторий? Они весят сотни мегабайт, вроде неприлично такой мусор тянуть в гит. С другой стороны, как же без дампов?
Вот к примеру шикарные словари от StarDict, бесплатные, легко конвертируются в sql.
Может мне в ридми пару слов кинуть типа вот тебе ссылка, берешь wget, потом делаешь tabfile2sql, и все дела?
Или скрипт написать, который это все сам делает?
>>711488
#675 #711311
Смысл в этих всех задачках? Ну не получилась какая-то, смысл заморачиваться? У новичков ещё нет столько знаний, чтобы их выполнять нормально. Сначала лучше учить синтаксис и функции например.
>>712477
89 Кб, 807x792
#676 #711326
>>702800 (OP)
Ребзи. такой вопрос.
Сохраняю файл с кодировкой УТФ-8 с БОМ, выскакивает ошибка с функцией сессии. Сохраняю в УТФ-8, ошибки нет, но текст становится нечитабельным. Что делать ?
>>712477
#677 #711352
Посоны, как взломать пхпсторм? Я заебался сидеть в блокноте++. Когда просто вбиваю пароли из сайтов где логин и пароль то не получается. В т.ч. и с выключенным интернетом.
#678 #711355
>>711352
Есть же бесплатный netBeans,чем шторм так хорош? Хотя я честно говоря пока вообще не прочувствовал преимущества IDE перед моим любимым саблаймом.
#679 #711356
>>711355
Net beans бесплатный? Ну тогда пойду скачаю.
Спасибо.
>>711359
#680 #711359
>>711356
>>711355
А с седьмой пыхой у него же всё ок?
#681 #711371
>>711352
Тут были аноны с ссылкой на какую-то китайскую залупонь, через неё всё работало, но полкомпа засорялось каким-то дерьмом.
Самого беспокоит этот вопрос, потому что 24 апреля заканчивается тестовый период.
Но phpstorm столь крут, что и сотни бачинских в год на него не жаль.

>чем шторм так хорош?


Я хз, всем.
72 Кб, 914x509
#682 #711376
Бля, седьмой пыхи не завезли
#683 #711377
>>711376
А на что это влияет, кроме автодополнения синтаксиса? По моему это вообще маловажно.
#684 #711379
>>711376
В ноутпад++ завезли, а в нетбинс не завезли?
Может, надо настроить на папку с РНР правильно?
Там какой-то адрес стандартный прописывается.
Хотя ты в курсе, скорее всего.
>>711381
#685 #711380
>>710859
>>710847
Долбоебы подъехали есть жи, красиво.
Перепилил я на стандартных функциях, стало в разы проще и понятнее. Но я не зря пердолился с прошлым своим ебланским вариантом, т.к. пару моментов для себя можно сказать "уяснил".
https://ideone.com/tTEy51
>>712476
#686 #711381
>>711379

>Там какой-то адрес стандартный прописывается.


>Хотя ты в курсе, скорее всего.


Не совсем в курсе, что прописывать, поясни?

В ноутпад я просто вообще без удобств как бомж сижу пишу, хочется комфорта.
>>711385
#687 #711382
>>711376
Кстати, я думал, что лучшие IDE пилят JetBrains (я их питонячьим IDE пользовался), но тут внезапно осознал, что sublime и atom в разы лучше работают с дополнением синтаксиса, хоть и нет столько плюшек. PHP Storm еще и лагает пиздец, а в netBeans нет темной темы. Короче, пацаны, юзайте sublime и atom, вот там душа и удобство. Если бы еще норм отладчик и коншольку и встроенный браузер - цены бы не было.
>>711383>>711493
#688 #711383
>>711382
НетБинс - самый удобный, кстати. Там столько всего - ебнешься, еще и бесплатный, но нет нормальных тем, глаза по пизде сразу идут.
тот же анон
>>711385
#689 #711385
>>711381
Так а как ты в рнрсторме прописывал?
У тебя 7 пых-то скачан?
У меня вот такой адрес до папки с пыхом7

>C:\PHP\php.exe


Стандартный, я так понял.
>>711383
А там разве есть подсветка синтаксиса? Я не тем нетбинсом пользовался, что ли.
>>711388>>711390
47 Кб, 886x509
#690 #711388
>>711385
У меня кроме 7 пыха то ничего и нету.
Вот создаю проект в нетбинсе и после того как чекнуть наличие пхп среди всех вариантов нету 7 пыха в списке. Хотя я думаю что это особо роли не играет.
>>711390>>711392
129 Кб, 1600x900
#691 #711390
>>711385
Есть, она не оче, но сойдет (пикрил). Мне больше всего браузер встроенный нравится.
Алсо, у меня пхп, если что установлен зборачкой (XMPP).
>>711388
Вообще забей, от версии только автодополнения зависят и все. код-то исполняется не в ide.
#692 #711391
>>711390
Ну это да.

Говоришь темных тем нету? Плоховато.
>>711395
#693 #711392
>>711388
Настрой ее на пых-то, ёпт!
Пропиши там где-нибудь в источниках.
В рнрсторме тоже нет 7 пыха из коробки, тоже надо прописать.
>>711390
Встроенный браузер даже в дримвивере хорош, азаза
>>711397
128 Кб, 1600x900
90 Кб, 1600x900
#694 #711395
>>711391
Нет, там только уебанский пикрилейтед (просто пиздецовая порнография, лол).

Сравни с сублаймом.
Вот в phpstorm есть темные темы и дохуя, но там плюшек меньше, чем в netbeanse, он тормозит ебанешься как, нужно воровать, нет плагинов, уебанское автодополнение.
#695 #711397
>>711392
Так а толку-то что-то там настраивать, лол? Это влияет на проверку синтаксиса и его автодополнение. Проверку можно вообще в расчет не брать, там только пробелы, точки с запятой и конфликтные переменные проверяются, вроде все.
>>711400
#696 #711399
>>711395
Я как-то ставил сублайм но он мне что-то не понравлися. Так был прикол что сьезжали шрифты в названии файла, не работало автодополнение тега и как добавить тему тоже не совсем понял.

Надо атом скачать посмотреть как он.
>>711406
#697 #711400
>>711395
Саблайм-то нормик выглядит.
Если не сломаю сторм, то на него перейду.
>>711397
Я хз. Лучше что поновее, мы ведь молодые и шутливые, нам всё легко.
>>711406
#698 #711406
>>711399
Если что, для добавления темы нужно в него поставить пакетный менеджер.
Вот тут, разберешься (особенно если прыщи юзал - труда не составит):
https://packagecontrol.io/installation
А так, он (атом тоже, но атом - зборочка сублайма, как мне показалось) лучше всего справляется с автодополнением.
>>711400
Так твой сервер и так будет все норм исполнять же.
>>711408>>712476
94 Кб, 1532x599
#699 #711407
>>711395
Ты чего-то путаешь. Там есть темные темы, одна прямиком из саблайма. Вот monokai например, немного перепиленный под себя. Хотя мне не хватает sunflare из саблайма.
>>711412>>711414
27 Кб, 1043x385
#700 #711408
>>711406
Потом после добавления сюда тыкнешь и делай что надо: ищи пакеты, устанавливай, удаляй и т.д.
Ищи нужные дополнения и темы на сайте packagecontrol, потом иди в пакетный менеджер сублайма и по названию ищи, ставь и ок, я так делаю.
#701 #711412
>>711407
Темы все-таки есть? Хм,ну норм. Хотя я сублаймом больше пользуюсь, для мелкого говнокодинга он подходит лучше. НетБинс для больших проектов.
#702 #711414
>>711407
Как установить тему в нетбинс?
>>711417
#703 #711417
>>711414
Я уже не помню, они по разному устанавливаются. Но если ты смог поставить сервер на компьютер, то установить тему на нетбинс явно труда не составит. К темам прилагается инструкция, просто погугли.
>>711418
#704 #711418
>>711417
Ок. Если реально есть тёмная тема на нетбинс то на нём буду сидеть(если не найду способ украсть пхпсторм). Но уже завтра, что-то устал.
>>711420
#705 #711420
>>711418
Зайди на nnmclub и своруй.
#706 #711488
>>711310

Если словарь легко конвертируется и меньше по объему, то конечно лучше его, причем указать откуда он взят. Правильнее даже сделать так: написать где взять словарь и как сконвертировать. приложить нужные скрипты.

Вообще, ты должен стремиться к тому чтобы в репозитории было как можно больше твоего кода и как можно меньше стороннего. Какой смысл дублировать файлы из других источников? По этой причине например мы используем композер а не копипастим папки с библиотеками в проект.

Ведь подумай сам, словари обновляются и пользователю твоего приложения надо будет как-то решать проблему обновления.

А чтобы приложение можно было тестировать, можно положить какой-нибудь маленький тестовый дамп.
#707 #711493
>>711352

Купить либо сидеть на тестовой EAP версии. Она собирает статистику как ты ее используешь и информацию о багах.

Алсо, вот вы пишете, пхпсторм хороший, а вы знаете и используете его возможности? Если вы в нем просто текст как в обычном редакторе пишете, может он не особо и нужен?

>>711376

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

>>711382

Саблайм это не полноценная иде, а редактор, потому он легче и быстрее работает. Условно говоря ИДЕ постоянно анализирует код и представляет в памяти его структуру, знает все классы и функции, а для саблайма код это просто текст. Единственное, что он еще делает - сканирует имена классов и функций для быстрого перехода к ним.

Ну и в ИДЕ люди ставят кучу дополнений которые утяжеляют ее, не думая, нужно им это или нет. Зайдите в настройки, отключите лишнее, может станет удобнее.

>>711390

Там шрифт - Courier New - не очень хороший. Он вообще по задумке имитирует печатную машинку, и не заточен специально под код. Я его видел и на экранах с большими пикселями, и на экранах с маленькими пикселями, и на бумаге и более-менее читаем он только на печати. У него тонкие линии в буквах, и на обычном десктопном мониторе он не очень смотрится.

Поставьте себе нормальный шрифт для кода - Lucida Console, Andale Mono, Consolas, или что-то посовременней (гуглите шрифты дял кода), и сразу начнет лучше выглядеть. Я советую просто поставить все эти шрифты и сравнить. Часть этих шрифтов платная, конечно. Часть идет в комплекте с виндой или макосью.

У меня раньше стоял в саблайме Andale Mono, но он вроде платный, я перешел на DejaVu Sans Mono, он вполне нормальный. Но многое еще конечно зависит от монитора, плотности пикселей, вида матрицы и даже цветов - в разных случаях разные шрифты лучше или хуже смотрятся.
#708 #711499
Не работают макро в твиге.

Объявляю согласно документации вот так http://pastebin.com/JFZEgVsq

На выходе получаю ошибку

Fatal error: Call to undefined method __TwigTemplate_998e8acb5e8740a6cc31d14ac6916c23e69c4779131b563b2e25481d5edd8ea8::getdisplay() in /var/www/vendor/twig/twig/lib/Twig/Environment.php(403) : eval()'d code on line 174

Пробовал подключать отдельным файлом, все равно не работает.
>>711501
#709 #711501
>>711499
Извиняюсь за щитпост, ошибка была в имени. Не проснулся еще.
#710 #711533
Я тут решил посмотреть видео про сегодняшний (вчерашний?) запуск американского космического корабля, и интересно что у них очень хорошо все это популяризируется и рекламируется. Снимают запуск с нескольких камер, включая камеры на самой ракете. И что интересно, они не стали брать ведущих трансляции со стороны, а комментируют запуск их же инженеры.

https://www.youtube.com/watch?v=7pUAydjne5M
#711 #711558
Вот тут https://vc.ru/p/ugly-interfaces пишут что дизайн крейглиста плохой ( https://newyork.craigslist.org/search/hsw?lang=ru ). И даже приводят пример якобы более хорошего варианта. Ну и глупцы. Если смотреть на дизайн не с точки того насколько он похож на содержимое главной страницы дриббла, а сколько там помещено информации, удобно ли ее воспринимать - то у крейглиста очень хороший дизайн. Практически ничего лишнего, только нужная информация - загловоки и информация об объявлениях, быстрые ссылки. Сайт не перегружен ненужными яваскрипт виджетами и не использует реакт или ангулар (что редкость в наше время). Единственное что мне не нравится - закрепленная шапка, вот это действительно плохо на моем небольшом экране.

------------

Вот пример действительно плохого дизайна и подачи информации: http://ic.pics.livejournal.com/tema/339052/1634064/1634064_original.jpg

Алсо не понял зачем дизайнер делал все надписи на ломаном английском.

------------

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

(нужно знать: массивы, строки, немного регулярки)

Возьмите какие-нибудь тексты. (ну например, возьмите этот тред распарсенный в JSON: https://2ch.hk/pr/res/702800.json (М) и сохраните на диск. Загрузить файл в строку можно функцией file_get_contents, а преобразовать JSON в файле в массив функцией json_decode($data, true). Убрать теги из текста можно через strip_tags, убрать спецсимволы через html_entity_decode).

Сделайте простую поисковую систему для постов в нем. Для начала, сделайте поиск по одному слову, затем научитесь искать несколько слов (слова в посте не обязаны идти подряд), а затем добавьте возможность писать условия вроде "или": php OR html - ищет документы где есть любое из слов.

Поисковая система должна использовать какой-нибудь индекс для ускорения поиска. Давайте предположим что постов много и перебор займет слишком много времени.
#712 #711568
Оп, объясни пожалуйста вот этот фрагмент из задач, в разделе про ОПП:

"Также, сразу дам еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчета зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда этот подход имеет недостаток: в этом случае мы не можем поменять профессию сотрудника (чтобы ее возможно было менять, надо сделать отдельно класс Сотрудник, и отдельно же классы для каждой профессии. Это усложнит код, но сделает его более универсальным)."

Чем отличается "сделать не один класс Сотрудник, а 4 класса + базовый абстрактный класс Сотрудник" от "сделать отдельно класс Сотрудник, и отдельно же классы для каждой профессии"?

Первый случай - мы создаем абстрактный класс Сотрудник со свойствами и (не абстрактными) методами (расчет потребления кофе, зп исходя из ставки ранга и тд). Затем создаем 4 класса профессии которые наследуют с-ва указанные в абстр. классе сотрудник. И переопределяются уникальные свойства присущие каждой профессии. А затем создаются объекты "объект#001 сотрудник>профессия#МЕ". Я правильно понимаю?

Во втором случае, не понятно, что значит поменять "профессию сотрудника"? Сотрудник это абстрактный класс, а у нас объекты наследующие св-ва и методы от абстрактного класса сотрудник и св-ва от класса профессии, и некоторыми св-вами определенными при создании экземпляров (ранг, начальник или нет). Зачем менять профессию и у кого, у объекта? То есть объект с профессией менеджер становится - аналитиком?
#713 #711580
>>711568

И еще один вопрос, зачем в первом случае, создавать абстрактный класс сотрудник? Абстрактный класс - класс, который содержит по крайней мере один абстрактный метод. А зачем переопределять методы для каждой профессии, если они одинаковые для всех профессий, значит в родительском классе можно полностью описать их функционал, не объявляя абстрактными?
>>711584
#714 #711583
>>710943
Бамп вопросу. Вопрос жизни и смерти. Не понимаю почему мои русские символы не определяются?
#715 #711584
>>711580

> Абстрактный класс - класс, который содержит по крайней мере один абстрактный метод


Неверно. Почитай определение или урок. Абстрактны класс это класс который не предназначен для создания объектов а как основа для наследования.

>>710943

Ты забыл поставить специальный флаг.
>>711591
#716 #711591
>>711584
http://php.net/manual/ru/language.oop5.abstract.php
"PHP 5 поддерживает определение абстрактных классов и методов. Класс, который содержит по крайней мере один абстрактный метод, должен быть определен как абстрактный. Следует помнить, что нельзя создать экземпляр абстрактного класса. Методы, объявленные абстрактными, несут, по существу, лишь описательный смысл и не могут включать реализации."

Тогда твое определение тоже неверно. Интерфейсы тоже не предназначены для создания объектов а как основа.
>>711597
#717 #711597
>>711591

Мануал PHP не объясняет концепции ООП и зачем нужна та или иная вещь. Он объясняет как она работает в PHP.

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


Из этого не следует что абстрактный класс обязан содержать абстрактные методы. Что спорить, проверь сам.
>>711611>>711630
#718 #711611
>>711597
Применительно к задачи, ключевое тут "нельзя создать, наследовать"?
>>711632>>714993
#719 #711630
>>711597
А что насчет условий задачи, чем отличается "сделать не один класс Сотрудник, а 4 класса + базовый абстрактный класс Сотрудник" от "сделать отдельно класс Сотрудник, и отдельно же классы для каждой профессии"?
>>711634
#720 #711632
>>711611

Вообще, с наследованием там не все однозначно. Ну например при наследовании мы не можем менять профессию. Да и вообще надо подумать, выгодно ли считать разные профессии или выгоднее считать их одним классом.
#721 #711634
>>711630

Это одно и то же. Имеется в виде "сделать отдельно базовый класс Сотрудник, и отдельно же классы для каждой профессии"
#722 #711676
>>711355
Как netBean настроить в линуксе под PHP?
>>714993
#723 #711691
>>711120
Genius!
#724 #711699
Аноны, вот я не понял. Допустим функция производит операции с текстом, то в конце обязательно через return надо получившимися изменениями заменить оригинальный текст?
>>711707
#725 #711701
Почаны, начал писать задачу про 3 банка и айпад в кредит. Чего-то я не понял.
http://ideone.com/pzG2Jf
вот у меня есть отдельные переменные по начальной цифре кредита и по ежемесячным 5-титысячным платам школяра. Но ведь в функцию нужно именно подавать значения, она сама не может их откуда-то брать. И как тогда быть?
>>711702>>711708
#726 #711702
>>711701
У функции могут быть и свои собственные переменные, не от аргументов.
#727 #711707
>>711699

Когда ты передаешь какие-то переменные в функцию то делается копия и передается эта копия. И если ты пишешь например

$x = 'hello';
func($x);

то функция получит копию $x и исходная переменная останется неизменной. Заметь, я не знаю что написано в функции, но знаю что переменная остается неизменной. Если тебе это не подходит, ты должен вернуть из функции измененную строку и присвоить ее $x явно

$x = func($x);

Это сделано специально, чтобы было сразу видно ситуации когда переменная меняется, по наличию оператора "=" и не надо было лезть в код функции и смотреть что она делает.

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

Хорошая функция получает данные только через аргументы, а возвращает только через return.
>>711977
#728 #711708
>>711701

Все значения которые нужны функции, надо передавать через аргументы в скобках. В твом случае payout надо передавать явно.

Хорошая функция получает данные только через аргументы, а возвращает только через return.

Есть способы обойти это, но я категорически против их использования. Нам нужны хорошие функции.
>>711720
#729 #711720
>>711708
А как вернуть несколько значений из функции? Через массив, или ещё какие-нибудь способы есть? И что писать, если нужно вернуть значения разных типов.
#730 #711725
>>711720

массив с понятными именами ключей
#731 #711753
Я правильно понимаю, что в мвц все запросы должны происходить через файл index и аякс туда же посылать?
>>712476
#732 #711757
Задолбался. Что тут не так? http://ideone.com/3GYwzG
Правильно ли я понял, что вместо текста выводит массив в конце?
>>711767
#733 #711767
>>711757
Зачем у тебя return внутри цикла в функции? Ты понимаешь, что функция на этом этапе и завершает свою работу?
Калькулятор #734 #711837
ОП, проверь задачу.

http://ideone.com/0e6sTX
>>712468
#735 #711882
>>711720
Одна функция и не должна возвращать кучу значений, тем более разных типов.
Сделай несколько функций, каждая из которых делает что-то одно.
>>712468
#736 #711892
>>711558

>Вот тут https://vc.ru/p/ugly-interfaces пишут что дизайн крейглиста плохой ( https://newyork.craigslist.org/search/hsw?lang=ru ). И даже приводят пример якобы более хорошего варианта. Ну и глупцы.


Согласен. Это вообще частая ошибка дизайнеров (как начинающих, так и "заканчивающих") - путать красивость расположения и удобство использования (юзабилити). Совсем недавно куча подобных дизайнеров переделала Кинопоиск, сделала - казалось бы этим дизайнерам и тем, кто так же путает красивость и юзабилити, - отличный красивый дизайн, достаточно простой и лёгкий. Что было дальше - известно: гораздо удобнее иметь кучу тегов-ссылок перед глазами, сжатую информацию и статистику, чем тыкаться в разные вкладки и искать это всё там.
Это всё происходит от того (говорю это на основе своего опыта в SEO, UI, UX и анализе юзабилити), что смотрящий воспринимает окружающих быдлом или считает их гораздо глупее и примитивнее себя, ущемляет их интересы, отказывает во многом. Мне не нравится - значит, и никому не нравится. Мне не удобно - значит, и всем неудобно. И наоборот, другая крайность: я лазаю по куче ссылок с непонятной структурой - и остальным нормик (это характерно больше для программистов с программированием головного мозга - не как что-то совсем уж плохое).
А на мнение vc.ru (он же siliconrus, он же facebookru.com, он же "Цукерберг позвонит") и многих пользователей там можно вообще не обращать внимания. Там вообще имеют значение не переводные статьи, а от конкретных людей или конкретных специалистов, кейсы, анализ успехов и неудач различных стартапов, - моё скромное мнение.
>>711919
#737 #711910
>>711720
function testReturn()
{
$one = 1;
$two = 2;
$three = 3;

$array = [];

$array[] = $one;
$array[] = $two;
$array[] = $three;

return $array;
}

$array = testReturn();

$one = $array[0];
$two = $array[1];
$three = $array[2];

echo $one;
echo $two;
echo $three;
>>712468
#738 #711919
>>711558
Дизайн крейглиста действительно плохой, хотя бы потому что слишком однотонный, глазу не за что зацепиться, я вижу просто громадное количество синих и черный букв на белом фоне. Нет никакого желания скроллить это полотно и искать нужную информацию.

Короче как всегда в своем максимализме бросаются из одной крайности в другую.
Одна крайность: вырвиглазные страницы, вобравшие в себя все цвета радуги лгбт, с гигантскими блоками на два экрана, с гигантскими заголовками не весь экран, с фоном в виде фотографии какого-то человека, людей или городского пейзажа. С мерзкой скачущей анимацией, выскакивающими из табакерки блоками, что-то сворачивается, разворачивается, преследует курсор.
Вторая крайность - убогие страницы уровня манов прошлого века, именуемый "минимализмом".
Вот вам неотформатированный текст, читайте как хотите.

>>711892
Ты прав в плане того, что сайты делаются для людей и дизайн нужно подбирать под пользователей.
Одни будут радоваться как дети (почему как? может на них это и рассчитано?) дизайну с обилием картинок и яркими цветами, текст для них вторичен.
Другие будут наслаждаться "минимализмом" в виде черно-белого полотна букв.
Сайты под общую аудиторию можно выдержать в компромиссном стиле.
14 Кб, 749x142
#739 #711926
https://github.com/foobar1643/filehosting Исправления по файлообменнику.

>> for($i = 100; $i < 100000000; $i += 100) {


>> if(($this->id / $i) <= 1) return $i;


>Деление используй без цикла.


Все равно не понял как поделить и получить целое число.

>Также, вставку надо завернуть в транзакцию. В базе не при каких условиях не должно быть записи, для которой еще или уже нет файла на диске. Сначала сохраняешь файл и в случае успеха коммитиш транзакцию.


Так и работает, я с самого начала это сделал.

>Это работает только если имя в кодировке ASCII, с русскими буквами не будет работать во всех браузерах.И вообще в заголовках можно только ASCII использовать.


А как же тогда отдавать файлы с нужным мне именем? Все имена конвертировать в латиницу? Тогда возникает вопрос, что делать с символами юникода, типа √?

>Для скачивания надо сделать поддержку отдачи файлов через Xsendfile если он установлен на сервере. Это эффективнее чем через PHP.


Я не очень понял как работает этот X-send-file. Просто берет файл с сервера и отдает его напрямую пользователю? В этом случае ведь нужно будет чтобы папка-хранилище файлов находилась в публичной папке, нет? Выходит я её зря убрал?

>Сфинкс при поиске умеет возвращать сразу и число результатов. Там в АПИ есть функция и в SQL наверно есть ее аналог. Погугли (SHOW META).


Это все равно не то что мне нужно. У меня объект пейджера создается вот так

>new PaginationHelper(ОБЩЕЕ КОЛ-ВО ФАЙЛОВ, ФАЙЛОВ НА СТРАНИЦУ, ССЫЛКА);


и оффсет для постраничной выборки тоже генерирует пейджер. Поэтому мне нужно сначала посчитать общее кол-во результатов которые вернул сфинкс, потом передать это число в пейджер и получить оффсет для поиска. От этого и возникает проблема, что общее количество результатов может быть больше, т.к. из основного индекса удаленные id никак не удалить. И если их там будет совсем много, то на странице с поиском будет показано 3 страницы, когда на самом деле их там две. Я вот думаю создавать объект пейджера по другому, ведь для того чтобы посчитать оффсет не нужно знать общее количество результатов, они нужны только для того чтобы посчитать количество страниц. В любом случае я пока это трогать не стал, потом починю. Ну и хотелось бы комментарии какие-нибудь услышать, может быть можно легче сделать.

>В качестве доказательства что твой код разделен, сделай простой клиент для командной строки. Он должен позволять добавлять файл с диска в приложение, удалять файл по id и например показывать список файлов с указанием оффсета и лимита.


Я это сделал, но возникла проблема с генерацией превью для картинок, загруженных таким способом. Если я в PreviewHelper указываю путь как "thumbnails/", то он будет искать эту папку в директории с самым первым файлом, откуда он был вызван. В моем случае это index.php и cli-tools.php. Ну и проблема в том что thumbnails лежит в публичной папке с index.php, а cli-tools в отдельной папке. Пришлось для этого добавить в конфиг абсолютный путь к папке с превью. Это может быть и не правильно, но как сделать по другому я не понимаю.

>> в конец колонки path для каждого файла добавляю id файла.


>Зачем? Не понимаю. path там содержит номера комментариев по порядку в каждой из веток в которые он вложен.


Потому что в другом случае сломается сортировка. По той ссылке на SO как раз было написано что в конце mpath не хватает id текущей записи. Сейчас, запросом SELECT FROM comments WHERE file_id = ID ORDER BY parent_path ASC я получаю пикрелейтед. Если бы у комментариев в пути не было своих id, результаты возвращались бы совсем по другому, и мне приходилось бы писать дополнительный код, чтобы нормально их отсортировать. А сейчас я прохожусь циклом по результатам из базы, и строю из них древовидную структуру. Я кстати комментарии полностью переделал, теперь все комментарии это древовидная структура, как в коде, так и в html. Это позволяет мне сортировать и перемещать любые комментарии как хочу. Так же позволяет скрывать определенный див, или его детей. И постинг комментариев я сделал через аякс на jquery, теперь обычное комментирование и древовидное комментирование работают без перезагрузки страницы. Там я использовал рекурсию и обход дерева в глубину, но я никогда раньше такого не писал, поэтому интересены комментарии. Я почему-то уверен что обход дерева в глубину сделан неправильно или может быть сделан проще.

>Далее, почему этот video.js такой гигантский? 681 Кб? Выясни. что там такого напихано и можно ли получить версию только с тем что нам нужно.


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

>> {% for i in range(0, files|length - 1) %}


>Нумерация же не учитывает номер страницы тут?


Нет, а зачем он там? На каждую страницу - 15 результатов, так и нумерую.

>Еще меня немного беспокоит отсутсвие системы именования классов. Где гарантия что твое имя не пересечется с используемым в бутстрапе? То же самое по поводу имен JS функций. Подумай, что можно сделать.


Я не знаю правил именования классов. Знаю у яндекса был БЭМ. Его нормально будет тут использовать?
14 Кб, 749x142
#739 #711926
https://github.com/foobar1643/filehosting Исправления по файлообменнику.

>> for($i = 100; $i < 100000000; $i += 100) {


>> if(($this->id / $i) <= 1) return $i;


>Деление используй без цикла.


Все равно не понял как поделить и получить целое число.

>Также, вставку надо завернуть в транзакцию. В базе не при каких условиях не должно быть записи, для которой еще или уже нет файла на диске. Сначала сохраняешь файл и в случае успеха коммитиш транзакцию.


Так и работает, я с самого начала это сделал.

>Это работает только если имя в кодировке ASCII, с русскими буквами не будет работать во всех браузерах.И вообще в заголовках можно только ASCII использовать.


А как же тогда отдавать файлы с нужным мне именем? Все имена конвертировать в латиницу? Тогда возникает вопрос, что делать с символами юникода, типа √?

>Для скачивания надо сделать поддержку отдачи файлов через Xsendfile если он установлен на сервере. Это эффективнее чем через PHP.


Я не очень понял как работает этот X-send-file. Просто берет файл с сервера и отдает его напрямую пользователю? В этом случае ведь нужно будет чтобы папка-хранилище файлов находилась в публичной папке, нет? Выходит я её зря убрал?

>Сфинкс при поиске умеет возвращать сразу и число результатов. Там в АПИ есть функция и в SQL наверно есть ее аналог. Погугли (SHOW META).


Это все равно не то что мне нужно. У меня объект пейджера создается вот так

>new PaginationHelper(ОБЩЕЕ КОЛ-ВО ФАЙЛОВ, ФАЙЛОВ НА СТРАНИЦУ, ССЫЛКА);


и оффсет для постраничной выборки тоже генерирует пейджер. Поэтому мне нужно сначала посчитать общее кол-во результатов которые вернул сфинкс, потом передать это число в пейджер и получить оффсет для поиска. От этого и возникает проблема, что общее количество результатов может быть больше, т.к. из основного индекса удаленные id никак не удалить. И если их там будет совсем много, то на странице с поиском будет показано 3 страницы, когда на самом деле их там две. Я вот думаю создавать объект пейджера по другому, ведь для того чтобы посчитать оффсет не нужно знать общее количество результатов, они нужны только для того чтобы посчитать количество страниц. В любом случае я пока это трогать не стал, потом починю. Ну и хотелось бы комментарии какие-нибудь услышать, может быть можно легче сделать.

>В качестве доказательства что твой код разделен, сделай простой клиент для командной строки. Он должен позволять добавлять файл с диска в приложение, удалять файл по id и например показывать список файлов с указанием оффсета и лимита.


Я это сделал, но возникла проблема с генерацией превью для картинок, загруженных таким способом. Если я в PreviewHelper указываю путь как "thumbnails/", то он будет искать эту папку в директории с самым первым файлом, откуда он был вызван. В моем случае это index.php и cli-tools.php. Ну и проблема в том что thumbnails лежит в публичной папке с index.php, а cli-tools в отдельной папке. Пришлось для этого добавить в конфиг абсолютный путь к папке с превью. Это может быть и не правильно, но как сделать по другому я не понимаю.

>> в конец колонки path для каждого файла добавляю id файла.


>Зачем? Не понимаю. path там содержит номера комментариев по порядку в каждой из веток в которые он вложен.


Потому что в другом случае сломается сортировка. По той ссылке на SO как раз было написано что в конце mpath не хватает id текущей записи. Сейчас, запросом SELECT FROM comments WHERE file_id = ID ORDER BY parent_path ASC я получаю пикрелейтед. Если бы у комментариев в пути не было своих id, результаты возвращались бы совсем по другому, и мне приходилось бы писать дополнительный код, чтобы нормально их отсортировать. А сейчас я прохожусь циклом по результатам из базы, и строю из них древовидную структуру. Я кстати комментарии полностью переделал, теперь все комментарии это древовидная структура, как в коде, так и в html. Это позволяет мне сортировать и перемещать любые комментарии как хочу. Так же позволяет скрывать определенный див, или его детей. И постинг комментариев я сделал через аякс на jquery, теперь обычное комментирование и древовидное комментирование работают без перезагрузки страницы. Там я использовал рекурсию и обход дерева в глубину, но я никогда раньше такого не писал, поэтому интересены комментарии. Я почему-то уверен что обход дерева в глубину сделан неправильно или может быть сделан проще.

>Далее, почему этот video.js такой гигантский? 681 Кб? Выясни. что там такого напихано и можно ли получить версию только с тем что нам нужно.


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

>> {% for i in range(0, files|length - 1) %}


>Нумерация же не учитывает номер страницы тут?


Нет, а зачем он там? На каждую страницу - 15 результатов, так и нумерую.

>Еще меня немного беспокоит отсутсвие системы именования классов. Где гарантия что твое имя не пересечется с используемым в бутстрапе? То же самое по поводу имен JS функций. Подумай, что можно сделать.


Я не знаю правил именования классов. Знаю у яндекса был БЭМ. Его нормально будет тут использовать?
190 Кб, 800x600
285 Кб, 640x970
#740 #711941
>>711919
Как тебе Flat UI, если воспринимать его как религию? То есть не просто плоский дизайн, а симбиоз простоты и в выражении, и в содержании?
Я к такому стремлюсь.
>>711958
#741 #711958
>>711941
Кстати хотел написать, что лично мне нравится плоский дизайн, но потом вспомнил о том что пишу на дваче, и не личный блог.
В книге Робин Вильямс "Дизайн для недизайнеров" (которую нужно рекомендовать 95% "профессионалам" веб-дизайна) перечисляются 4 элементарных правила дизайна.
Контрастность, повтор, выравнивание и приближенность. Достаточно придерживаться этих простых правил, и даже страница без css будет выглядеть очень неплохо.

Вот еще пример хорошего дизайна. Правда там сделали зачем-то фиксированную шапку.
http://symfony.com/doc/current/book/validation.html
Ну и другие мануалы sensiolabs
http://twig.sensiolabs.org/doc/templates.html
Сравнить их с документацией апача или тому подобным.
http://pcre.org/

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

>>711558

>вам наверняка пока что делать нечего


Я доктрину учу. Потом нужно ее использовать в своем проекте.

>Сделайте простую поисковую систему для постов в нем


Без базы и сфинкса что ли? Но зачем?
Задача на балансировку дерева наверное, или что-то в этом роде.
Ну ладно, может быть потом.
>>712215
#742 #711977
>>711707
можно ещё сделать func(&$x); и $x изменится даже без return $x внутри функции
>>711982
#743 #711982
>>711977

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

#744 #712017
>>711919

За что там должен глаз цепляться? Это сайт объявлений, а не развлекательный сайт. Ты либо используешь поиск либо глазами просматриваешь заголовки.

Дизайн результатов гугла в примерно таком же стиле выдержан ведь.

> Нет никакого желания скроллить это полотно и искать


Поиск есть.

>>711926

> Все равно не понял как поделить и получить целое число.


ceil, round, floor

> А как же тогда отдавать файлы с нужным мне именем?


По умолчанию браузер берет имя файла из последнего сегмента в URL. надо сделать чтобы УРЛ заканчивался на нужное тебе имя. Помни что в УРЛ некоторые символы вроде пробелов должны кодироваться.

> В этом случае ведь нужно будет чтобы папка-хранилище файлов находилась в публичной папке, нет?


Не нужно.

> и оффсет для постраничной выборки тоже генерирует пейджер. Поэтому мне нужно сначала посчитать общее кол-во результатов которые вернул сфинкс


Это неэффективно так как требует 2 запроса. Надо переделать твой код.

> От этого и возникает проблема, что общее количество результатов может быть больше, т.к. из основного индекса удаленные id никак не удалить


Я написал, можно писать что-то вроде "файл удален" или пропускать такие файлы. Можно не писать точное число найденных файлов. Можно запрашивать у сфинкса чуть больше файлов чем надо на страницу. Можно не показывать номер последней страницы. Ну подумай, может тебе что в голову придет. Считай это отдельной задачкой.

> Если я в PreviewHelper указываю путь как "thumbnails/", то он будет искать эту папку в директории с самым первым файлом, откуда он был вызван.


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

> Пришлось для этого добавить в конфиг абсолютный путь к папке с превью.


Надо определять путь автоматически. Есть константы __DIR__ и __FILE__. В скрипте инициализации например. или еще где-то.

Насчет mpath. Ты строишь путь из ид. Но почему у тебя заложено только 3 цифры на один уровень? Получается у тебя не может быть комментариев с id больше чем 999? Неужели ты об этом не подумал?

> Там много чего напихано, это очень функциональный плеер с поддержкой субтитров, разных дорожек и прочих вещей.


Я думаю, нам не нужны субтитры и "многие вещи". Нам нужно: 1) определять поддерживает ли браузер данный формат 2) выводить видеоплеер который по сути просто тег video с возможной обвязкой в виде кнопок 3) если можно, выводить флеш там где нет video

Ну не знаю, может какой-нибудь другой скрипт взять?

> Знаю у яндекса был БЭМ. Его нормально будет тут использовать?


Да.
#744 #712017
>>711919

За что там должен глаз цепляться? Это сайт объявлений, а не развлекательный сайт. Ты либо используешь поиск либо глазами просматриваешь заголовки.

Дизайн результатов гугла в примерно таком же стиле выдержан ведь.

> Нет никакого желания скроллить это полотно и искать


Поиск есть.

>>711926

> Все равно не понял как поделить и получить целое число.


ceil, round, floor

> А как же тогда отдавать файлы с нужным мне именем?


По умолчанию браузер берет имя файла из последнего сегмента в URL. надо сделать чтобы УРЛ заканчивался на нужное тебе имя. Помни что в УРЛ некоторые символы вроде пробелов должны кодироваться.

> В этом случае ведь нужно будет чтобы папка-хранилище файлов находилась в публичной папке, нет?


Не нужно.

> и оффсет для постраничной выборки тоже генерирует пейджер. Поэтому мне нужно сначала посчитать общее кол-во результатов которые вернул сфинкс


Это неэффективно так как требует 2 запроса. Надо переделать твой код.

> От этого и возникает проблема, что общее количество результатов может быть больше, т.к. из основного индекса удаленные id никак не удалить


Я написал, можно писать что-то вроде "файл удален" или пропускать такие файлы. Можно не писать точное число найденных файлов. Можно запрашивать у сфинкса чуть больше файлов чем надо на страницу. Можно не показывать номер последней страницы. Ну подумай, может тебе что в голову придет. Считай это отдельной задачкой.

> Если я в PreviewHelper указываю путь как "thumbnails/", то он будет искать эту папку в директории с самым первым файлом, откуда он был вызван.


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

> Пришлось для этого добавить в конфиг абсолютный путь к папке с превью.


Надо определять путь автоматически. Есть константы __DIR__ и __FILE__. В скрипте инициализации например. или еще где-то.

Насчет mpath. Ты строишь путь из ид. Но почему у тебя заложено только 3 цифры на один уровень? Получается у тебя не может быть комментариев с id больше чем 999? Неужели ты об этом не подумал?

> Там много чего напихано, это очень функциональный плеер с поддержкой субтитров, разных дорожек и прочих вещей.


Я думаю, нам не нужны субтитры и "многие вещи". Нам нужно: 1) определять поддерживает ли браузер данный формат 2) выводить видеоплеер который по сути просто тег video с возможной обвязкой в виде кнопок 3) если можно, выводить флеш там где нет video

Ну не знаю, может какой-нибудь другой скрипт взять?

> Знаю у яндекса был БЭМ. Его нормально будет тут использовать?


Да.
>>712092
#745 #712028
http://ideone.com/85xNqE
Объясните почему не работает. $b должно стать больше $a
>>712063>>712458
#746 #712063
>>712028
У тебя ошибка.
#747 #712092
>>712017

>Дизайн результатов гугла в примерно таком же стиле выдержан ведь.


Поэтому никто дальше первой страницы выдачи и не ходит, и люди не узнают о тысячах замечательных сайтов.
У того же гугла кстати в результатах поиска кроме ссылки еще адрес страницы и сниппет с описанием. Обрати внимание, что у этих элементов разный размер и цвет, за счет чего достигается контрастность. Вместе с тем эти элементы сгруппированы, хорошо заметно, что они принадлежат отдельному пункту поиска.

>Это сайт объявлений, а не развлекательный сайт.


Любой сайт должен приносить эстетическое удовольствие, а не угнетать унылостью и монотонностью.

>За что там должен глаз цепляться?


За логически сгруппированные блоки.
Я вижу там просто полотно из синих строчек. Каждое объявление (а я должен догадываться, что синие строчки это ссылки на конкретное объявление) отделено от другого только несчастным маржином. А может это просто синий текст с большим межстрочным интервалом?
Не понял, что означают буквы "изоб" и "карт". Ну да, наверное изображения (фото) и положение апартаментов на карте города. А как этим пользоваться? Я кликнул по "изоб", ничего не произошло, по "карт" тоже.
Почему превью нельзя прикреплять по дефолту? Это же раздел недвижимости, в list view обязательно должны быть фото. Или мне переходить по каждой из сотен ссылок и проверять, устраивает меня этот вариант или нет? inb4: где-то глубоко в настройках поиска можно включить отображение превью. Нет, спасибо, я лучше поищу другой сайт недвижимости.

Вот с моей точки зрения качественный дизайн сайта недвижимости.
http://www.rent.com/new-york/new-york-apartments/2-891
Начнем с того, что попадая на этот сайт, я сразу понимаю, куда попал. В случае с крейгслистом вообще не понятно что это доска объявлений.
Дальше, главные фильтры вынесены в отдельный контрастный блок. В отличие от крейгслиста мне не нужно скроллить унылый фрейм слева, перечитывать лейбелы для каждого чекбокса и инпута.
Если нажать "more filters", выезжает подробное меню, в котором опять-таки элементы сгрупированы и выровнены. Я могу сначала найти нужную мне группу фильтров, а не читать все подряд.
Ну и самое главное, результаты поиска.
Каждое объявление это отдельная сущность (кто-то отменял ооп в верстке?), а не поток строк как на крейгслисте.
Каждый элемент списка почти полностью раскрывает содержимое объявления, мне вообще даже не нужно переходить по ссылке и смотреть страницу конкретного объявления. Есть превью с качественной и удобной (это редкость) галереей. Адрес, цена, телефон, заголовок, ключевые атрибуты типа кол-ва комнат и санузлов. Все это красиво скомпоновано и приятно смотреть.
На странице просмотра объявления тоже все качественно и по правилам: группировка, контраст, выравнивание, приближение.

Вот другой пример сайта недвижимости с поиском. Тут наверное не будет разных мнений в оценке, это плохой сайт.
http://www.booking.com/city/us/new-york.en-gb.html?label=gen173nr-1DCAMo7AFCCG5ldy15b3JrSC5iBW5vcmVmaOkBiAEBmAEuuAEPyAEM2AED6AEBqAID;sid=8968ed056ec8b0a9ec335a4134bdd923;dcid=1;inac=0&
Набор блоков на главной странице такой же бессмысленный и беспощадный, как и url.
#747 #712092
>>712017

>Дизайн результатов гугла в примерно таком же стиле выдержан ведь.


Поэтому никто дальше первой страницы выдачи и не ходит, и люди не узнают о тысячах замечательных сайтов.
У того же гугла кстати в результатах поиска кроме ссылки еще адрес страницы и сниппет с описанием. Обрати внимание, что у этих элементов разный размер и цвет, за счет чего достигается контрастность. Вместе с тем эти элементы сгруппированы, хорошо заметно, что они принадлежат отдельному пункту поиска.

>Это сайт объявлений, а не развлекательный сайт.


Любой сайт должен приносить эстетическое удовольствие, а не угнетать унылостью и монотонностью.

>За что там должен глаз цепляться?


За логически сгруппированные блоки.
Я вижу там просто полотно из синих строчек. Каждое объявление (а я должен догадываться, что синие строчки это ссылки на конкретное объявление) отделено от другого только несчастным маржином. А может это просто синий текст с большим межстрочным интервалом?
Не понял, что означают буквы "изоб" и "карт". Ну да, наверное изображения (фото) и положение апартаментов на карте города. А как этим пользоваться? Я кликнул по "изоб", ничего не произошло, по "карт" тоже.
Почему превью нельзя прикреплять по дефолту? Это же раздел недвижимости, в list view обязательно должны быть фото. Или мне переходить по каждой из сотен ссылок и проверять, устраивает меня этот вариант или нет? inb4: где-то глубоко в настройках поиска можно включить отображение превью. Нет, спасибо, я лучше поищу другой сайт недвижимости.

Вот с моей точки зрения качественный дизайн сайта недвижимости.
http://www.rent.com/new-york/new-york-apartments/2-891
Начнем с того, что попадая на этот сайт, я сразу понимаю, куда попал. В случае с крейгслистом вообще не понятно что это доска объявлений.
Дальше, главные фильтры вынесены в отдельный контрастный блок. В отличие от крейгслиста мне не нужно скроллить унылый фрейм слева, перечитывать лейбелы для каждого чекбокса и инпута.
Если нажать "more filters", выезжает подробное меню, в котором опять-таки элементы сгрупированы и выровнены. Я могу сначала найти нужную мне группу фильтров, а не читать все подряд.
Ну и самое главное, результаты поиска.
Каждое объявление это отдельная сущность (кто-то отменял ооп в верстке?), а не поток строк как на крейгслисте.
Каждый элемент списка почти полностью раскрывает содержимое объявления, мне вообще даже не нужно переходить по ссылке и смотреть страницу конкретного объявления. Есть превью с качественной и удобной (это редкость) галереей. Адрес, цена, телефон, заголовок, ключевые атрибуты типа кол-ва комнат и санузлов. Все это красиво скомпоновано и приятно смотреть.
На странице просмотра объявления тоже все качественно и по правилам: группировка, контраст, выравнивание, приближение.

Вот другой пример сайта недвижимости с поиском. Тут наверное не будет разных мнений в оценке, это плохой сайт.
http://www.booking.com/city/us/new-york.en-gb.html?label=gen173nr-1DCAMo7AFCCG5ldy15b3JrSC5iBW5vcmVmaOkBiAEBmAEuuAEPyAEM2AED6AEBqAID;sid=8968ed056ec8b0a9ec335a4134bdd923;dcid=1;inac=0&
Набор блоков на главной странице такой же бессмысленный и беспощадный, как и url.
#748 #712108
>>712092

>Любой сайт должен приносить эстетическое удовольствие, а не угнетать унылостью и монотонностью.



Такое понятие существует только для дизайнеров. Пользователю абсолютно наплевать, какое там эстетическое удовольствие, у него 10 вкладок в браузере открыто, и он про дизайн одного сайта через 5 минут и не вспомнит. Пользователю главное удобство пользования, навигация, понятность всего функционала с первого взгляда, отсутствие необходимости в чем-то разбираться. Дизайна вообще может и не быть, но если в планете удобства все отлично сделано, то таким сайтом будут охотно пользоваться. Поэтому минималистические сайты и популярны.
>>712133
#749 #712120
>>712092

> (а я должен догадываться, что синие строчки это ссылки на конкретное объявление)


По синему цвету наверно? да, с подчеркиванием было бы наверно лучше.

> А может это просто синий текст с большим межстрочным интервалом?


Синий текст, состоящий из заголовков вперемешку с датами и ссылками? Не думаю.

> что означают буквы "изоб" и "карт".


В английской версии pic, map и это общеизвестные сокращения.

> Почему превью нельзя прикреплять по дефолту?


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

> Или мне переходить по каждой из сотен ссылок и проверять, устраивает меня этот вариант или нет?


Я сомневаюсь что кто-то выбирает только по фото. Более того, тебе придется еще и звонить по этим объявлениям и разговаривать с хозяевами или агентами.

> Вот с моей точки зрения качественный дизайн сайта недвижимости


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

Сайт использует кастомные шрифты что приводит к задержке отображения текста. Известная проблема.

Справа из боязни пустого пространства добавлено визуального мусора. Шапка гигантская.

Ты нахваливаешь фильтры, но тут фильтры занимают целый экран в отличие от полосочки слева на крейглисте. То же с объявлениями. На крейглисте я вижу 15 заголовокв, тут аж целых 4 с половиной (на первом экране вообще 3). Используется экранное пространство намного хуже. И что интересно, несмотря на то что на крейглисте больше информации, он воспринимается как более легкий за счет большого объема пустого белого пространства. А тут куча цветов и размеров шрифтов.

> В случае с крейгслистом вообще не понятно что это доска объявлений.


Мне понятно - из текста заголовков.

> Каждое объявление это отдельная сущность (кто-то отменял ооп в верстке?), а не поток строк как на крейгслисте.


Там ведь тоже - 1 строка одно объявление.

> Каждый элемент списка почти полностью раскрывает содержимое объявления


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

- рейтинг (бред же)
- сердечко
- rent specials

Форма контакта с кучей полей. С проставленной галочкой для спама.

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

Видимо у нас разный вкус или разное восприятие информации. Тут я вижу что полезная информация разбавлен большим числом лишних элементов, начиная от меню сверху и заканчивая цветными плашками и элементами, отвлекающими внимание. Когда первый раз открываешь страницу глаза разбегаются так как основной контент не выделен визуально и вокруг много других ярких элементов.
#749 #712120
>>712092

> (а я должен догадываться, что синие строчки это ссылки на конкретное объявление)


По синему цвету наверно? да, с подчеркиванием было бы наверно лучше.

> А может это просто синий текст с большим межстрочным интервалом?


Синий текст, состоящий из заголовков вперемешку с датами и ссылками? Не думаю.

> что означают буквы "изоб" и "карт".


В английской версии pic, map и это общеизвестные сокращения.

> Почему превью нельзя прикреплять по дефолту?


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

> Или мне переходить по каждой из сотен ссылок и проверять, устраивает меня этот вариант или нет?


Я сомневаюсь что кто-то выбирает только по фото. Более того, тебе придется еще и звонить по этим объявлениям и разговаривать с хозяевами или агентами.

> Вот с моей точки зрения качественный дизайн сайта недвижимости


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

Сайт использует кастомные шрифты что приводит к задержке отображения текста. Известная проблема.

Справа из боязни пустого пространства добавлено визуального мусора. Шапка гигантская.

Ты нахваливаешь фильтры, но тут фильтры занимают целый экран в отличие от полосочки слева на крейглисте. То же с объявлениями. На крейглисте я вижу 15 заголовокв, тут аж целых 4 с половиной (на первом экране вообще 3). Используется экранное пространство намного хуже. И что интересно, несмотря на то что на крейглисте больше информации, он воспринимается как более легкий за счет большого объема пустого белого пространства. А тут куча цветов и размеров шрифтов.

> В случае с крейгслистом вообще не понятно что это доска объявлений.


Мне понятно - из текста заголовков.

> Каждое объявление это отдельная сущность (кто-то отменял ооп в верстке?), а не поток строк как на крейгслисте.


Там ведь тоже - 1 строка одно объявление.

> Каждый элемент списка почти полностью раскрывает содержимое объявления


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

- рейтинг (бред же)
- сердечко
- rent specials

Форма контакта с кучей полей. С проставленной галочкой для спама.

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

Видимо у нас разный вкус или разное восприятие информации. Тут я вижу что полезная информация разбавлен большим числом лишних элементов, начиная от меню сверху и заканчивая цветными плашками и элементами, отвлекающими внимание. Когда первый раз открываешь страницу глаза разбегаются так как основной контент не выделен визуально и вокруг много других ярких элементов.
>>712133
#750 #712133
>>712108

>Пользователю главное удобство пользования


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

Плоский дизайн как раз тем хорош, что он и "минималистичен" с точки зрения бедности оформления, и удобен с точки зрения юзабилити, потому что контрастный в приятных цветах средних оттенков. Он красивый, удобный, и не перегружен. Но конечно это мое мнение, и если бы я был дизайнером, то ориентировался бы на вкусы аудитории.

> эстетическое удовольствие


> только для дизайнеров


Чушь. У любого человека, даже у гопника из падика, есть чувство прекрасного, пусть и грубое.
Кому-то может показаться смешным тюнинг калины под спорткар, но Лёха с тобой не согласится, с его точки зрения это красиво.
Если сайт уродливый (пусть даже с субъективной точки зрения конкретного юзера), он на него никогда больше не зайдет. Даже если сайт удобный.
Попробуй предложить христианской организации сайт в мрачных готических тонах, с атмосферой грусти и тлена.
Или любителям блек-метал дизайн для блондинок в розовых тонах с сердечками.

> минималистические сайты и популярны.


Пруф?
Может быть среди узкой аудитории гиков и тому подобных интересных личностей. Ну и не таких как все хипстеров и прочих нетрадиционных товарищей.

>>712120

>Более того, тебе придется еще и звонить по этим объявлениям и разговаривать с хозяевами или агентами.


А так звонить не придется? Мы такие хикке, что боимся говорить по телефону?
Конечно нужно звонить, а потом еще приехать и лично встретиться с хозяином/риелтером.

>- рейтинг (бред же)


>- сердечко


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

>Я сомневаюсь что кто-то выбирает только по фото.


Я выбираю. Во всяком случае начинаю фильтровать, отбрасывать неудовлетворительные варианты. Или тут тоже "эстетичность не имеет значения"? Если там раздолбанная советская халупа, я даже бесплатно туда не вселюсь (травма детства). Для меня интерьер квартиры имеет важнейшее значение. Если на превью кал, это можно разглядеть даже в низком разрешении.

>Более того, тебе придется еще и звонить по этим объявлениям и разговаривать с хозяевами или агентами.


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

>телефон большими цифрами есть, но наверно человек сначала захочет почитать описание прежде чем звонить


Нет. Я бы сначала позвонил.

>Видимо у нас разный вкус или разное восприятие информации.


Да, ты видимо привык читать маны и тому подобную техническую тягомотину, потому и сайты в таком стиле начинают по привычке нравиться.
За собой тоже начал замечать подобную страсть к "минимализму", но стараюсь бороться.
Сайт должен быть одновременно красивым и удобным. При чем как я уже говорил, элементы дизайна могут как повысить юзабилити (хотя бы цветом выделять разные блоки ради контраста), так и полностью его угробить.

Ну ладно, приходим к хомячковому выводу "на вкус и цвет))))".
Главное чтобы дизайнер ориентировался не на свой вкус, а на вкусы аудитории, которой сайт предназначен.
#750 #712133
>>712108

>Пользователю главное удобство пользования


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

Плоский дизайн как раз тем хорош, что он и "минималистичен" с точки зрения бедности оформления, и удобен с точки зрения юзабилити, потому что контрастный в приятных цветах средних оттенков. Он красивый, удобный, и не перегружен. Но конечно это мое мнение, и если бы я был дизайнером, то ориентировался бы на вкусы аудитории.

> эстетическое удовольствие


> только для дизайнеров


Чушь. У любого человека, даже у гопника из падика, есть чувство прекрасного, пусть и грубое.
Кому-то может показаться смешным тюнинг калины под спорткар, но Лёха с тобой не согласится, с его точки зрения это красиво.
Если сайт уродливый (пусть даже с субъективной точки зрения конкретного юзера), он на него никогда больше не зайдет. Даже если сайт удобный.
Попробуй предложить христианской организации сайт в мрачных готических тонах, с атмосферой грусти и тлена.
Или любителям блек-метал дизайн для блондинок в розовых тонах с сердечками.

> минималистические сайты и популярны.


Пруф?
Может быть среди узкой аудитории гиков и тому подобных интересных личностей. Ну и не таких как все хипстеров и прочих нетрадиционных товарищей.

>>712120

>Более того, тебе придется еще и звонить по этим объявлениям и разговаривать с хозяевами или агентами.


А так звонить не придется? Мы такие хикке, что боимся говорить по телефону?
Конечно нужно звонить, а потом еще приехать и лично встретиться с хозяином/риелтером.

>- рейтинг (бред же)


>- сердечко


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

>Я сомневаюсь что кто-то выбирает только по фото.


Я выбираю. Во всяком случае начинаю фильтровать, отбрасывать неудовлетворительные варианты. Или тут тоже "эстетичность не имеет значения"? Если там раздолбанная советская халупа, я даже бесплатно туда не вселюсь (травма детства). Для меня интерьер квартиры имеет важнейшее значение. Если на превью кал, это можно разглядеть даже в низком разрешении.

>Более того, тебе придется еще и звонить по этим объявлениям и разговаривать с хозяевами или агентами.


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

>телефон большими цифрами есть, но наверно человек сначала захочет почитать описание прежде чем звонить


Нет. Я бы сначала позвонил.

>Видимо у нас разный вкус или разное восприятие информации.


Да, ты видимо привык читать маны и тому подобную техническую тягомотину, потому и сайты в таком стиле начинают по привычке нравиться.
За собой тоже начал замечать подобную страсть к "минимализму", но стараюсь бороться.
Сайт должен быть одновременно красивым и удобным. При чем как я уже говорил, элементы дизайна могут как повысить юзабилити (хотя бы цветом выделять разные блоки ради контраста), так и полностью его угробить.

Ну ладно, приходим к хомячковому выводу "на вкус и цвет))))".
Главное чтобы дизайнер ориентировался не на свой вкус, а на вкусы аудитории, которой сайт предназначен.
>>712456
#751 #712141
Вот переделал http://ideone.com/IJoPB1.
Что не так? Что значит, неопределённое значение 3?
>>712161>>712455
#752 #712161
>>712141
В массиве нет такого элемента. Потому что implode(' ', $reverseText[$i]) у тебя вывалился за цикл. Или это так и задумывалось?
Переменная $i конечно живет после окончания цикла (хорошо ли сделали разработчики php, что допустили подобное, как и в foreach?), только ты делаешь $i++, потому ее значение после окончания цикла будет уже на единицу больше, чем индекс последнего элемента.
implode по пробелу же можно делать, "\s" это для регулярок, и он кстати отвечает не только за пробел, но и за табуляцию, перенос строк и т.д.
>>712191
#753 #712191
>>712161
Спасибо. Вот что получилось ideone.com/E7hUwq
Как передать значения массива?
>>712454
#754 #712215
>>711958

>В книге Робин Вильямс "Дизайн для недизайнеров" (которую нужно рекомендовать 95% "профессионалам" веб-дизайна) перечисляются 4 элементарных правила дизайна.


Хм, интересно, спасибо, прочитаю как-нибудь после Зандстры.
Советую со своей стороны Алана Купера "Психбольница в руках пациентов", если не читал, и "Умный дизайн" Джонсона. Шикарные книги, обязательно должны быть прочитаны тем, кто занимается созданием сайтов, программ, игр и прочего, прочего.
>>712454
#755 #712224
>>712092
На Букинге.ком много функционала для настройки поиска (хороший удобный фильтр), есть весьма важный штучки вроде количества просмотров объявления и ярлычка с акцией, скидками и прочим.
Как по мне - отбросив красивость - юзабилити там неплохое. Лучше, чем на том Рент.ком - там даже не понятно сразу, где фильтр для поиска находится - он вытянут и больше похож на панель навигации, особо не акцентирован, хотя должен (за настроенным поиском туда и приходят). Когда знаешь, где он, - уже всё в порядке становится. Хотя фильтр не такой мощный сам по себе, как на Букинге.
>>712454>>712458
#756 #712254
>>702800 (OP)
Как поле для приема мыла делать? Чтобы при любом вводе, кроме хх+x_ххANUSxThVxxxPUNCTUMv8arucom и т.д., выдавало ошибку.
>>712260>>712454
#757 #712260
>>712254
Регулярные выражения.
>>712273
Валера #758 #712265
Сделайте перекат. Вопросов много накопилось.
>>712454
#760 #712278
>>712273
Одно другому не мешает.
Кто-то разве запрещает после проверки регуляркой и-мейла отправлять письмо для подтверждения регистрации?
>>712285>>712287
#761 #712285
>>712278
Твоя кривая регулярка не пропустит часть валидных адресов - пользователи уйдут.
И продублирует уже имеющийся функционал проверки письма, ты увеличиваешь время разработки на ненужную фичу. Правильный способ уже описали - проверять только @ знак в мыле, дальше все через подтверждение.
#762 #712287
>>712278

>проверять только @ знак в мыле


>регуляркой

>>712454
#763 #712454
>>712287

ну там обычно проверяют еще наличие каких-нибудь символов справа и слева.

>>712254

Полная регулярка для проверки емайла очень сложная (погугли). Некоторые люди используют filter_var, некоторые просто пишут упрощенную проверяющую знак @ и что вокруг него есть символы.

На клиенте стоит использовать input type=email, он проверяет сам и на мобильных устройствах добавляет возможность выбрать из контактов (если я не путаю).

>>712265

Рано. Ответы еще не всем даны.

>>712224

На букинге ценность как я понимаю в большом числе проверенных отзывов.

>>712215

И еще книгу Джефа Раскина "Интерфейс" если интересно проектирование интерфейсов. Он когда-то для одного из первых компьютеров Эппл интерфейс проектировал.

>>712191

А ты предудыщие темы не пропустил и предыдущие задачи решил? Если нет, лучше вернуться и решить так как работать с функциями, массивами и строками ты должен не задумываясь.

Смотри там внизу ошибка:

> PHP Notice: Array to string conversion in /home/aySaIX/prog.php on line 19



Это значит что ты пытаешься использовать массив там где нужно дать строку. Я правда не понимаю, что плохого в строке 19. Я перезапустил программу и получил: http://ideone.com/NJt1UM

> PHP Notice: Array to string conversion in /home/AM8awx/prog.php on line 18


Вот тут уже ясно. В 18-й строке стоит $explodedText=implode(" ", $reverseText); и там reverseText должен быть массивом строк. А у тебя это массив содержащий массивы. И их склеить в строку не получается.

Вообще, код выглядит довольно бессмысленно. Такое ощущение что ты сам не понял, что написал. Давай-ка решим пару дополнительных задачек а потом вернемся к этой:

1) Напиши функцию, которая получает на вход массив чисел и возвращает (не выводит) сумму их квадратов. То есть мы даем ей массив [1, 3, 7] -> она возвращает 1 + 9 + 49 =59

В ответ на пустой массив возвращается ноль.

2) Сделай функцию, на вход которой дается текст в виде строки и число N. Она должна вернуть массив содержащий N самых часто встречающихся слов. Скорее всего тут тебе понадобится функция подсчета значений array_count_values и функция сортировки массива: http://php.net/manual/ru/array.sorting.php

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

Разумеется всегда можно показать код и попросить подсказки если что-то непонятно.
#763 #712454
>>712287

ну там обычно проверяют еще наличие каких-нибудь символов справа и слева.

>>712254

Полная регулярка для проверки емайла очень сложная (погугли). Некоторые люди используют filter_var, некоторые просто пишут упрощенную проверяющую знак @ и что вокруг него есть символы.

На клиенте стоит использовать input type=email, он проверяет сам и на мобильных устройствах добавляет возможность выбрать из контактов (если я не путаю).

>>712265

Рано. Ответы еще не всем даны.

>>712224

На букинге ценность как я понимаю в большом числе проверенных отзывов.

>>712215

И еще книгу Джефа Раскина "Интерфейс" если интересно проектирование интерфейсов. Он когда-то для одного из первых компьютеров Эппл интерфейс проектировал.

>>712191

А ты предудыщие темы не пропустил и предыдущие задачи решил? Если нет, лучше вернуться и решить так как работать с функциями, массивами и строками ты должен не задумываясь.

Смотри там внизу ошибка:

> PHP Notice: Array to string conversion in /home/aySaIX/prog.php on line 19



Это значит что ты пытаешься использовать массив там где нужно дать строку. Я правда не понимаю, что плохого в строке 19. Я перезапустил программу и получил: http://ideone.com/NJt1UM

> PHP Notice: Array to string conversion in /home/AM8awx/prog.php on line 18


Вот тут уже ясно. В 18-й строке стоит $explodedText=implode(" ", $reverseText); и там reverseText должен быть массивом строк. А у тебя это массив содержащий массивы. И их склеить в строку не получается.

Вообще, код выглядит довольно бессмысленно. Такое ощущение что ты сам не понял, что написал. Давай-ка решим пару дополнительных задачек а потом вернемся к этой:

1) Напиши функцию, которая получает на вход массив чисел и возвращает (не выводит) сумму их квадратов. То есть мы даем ей массив [1, 3, 7] -> она возвращает 1 + 9 + 49 =59

В ответ на пустой массив возвращается ноль.

2) Сделай функцию, на вход которой дается текст в виде строки и число N. Она должна вернуть массив содержащий N самых часто встречающихся слов. Скорее всего тут тебе понадобится функция подсчета значений array_count_values и функция сортировки массива: http://php.net/manual/ru/array.sorting.php

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

Разумеется всегда можно показать код и попросить подсказки если что-то непонятно.
>>712721
#764 #712455
>>712141

Ты по моему не очень сам понял что написал. У тебя переменная $i это счетчик в цикле. Тогда почему ты используешь ее за пределами цикла?

> implode("\s",


\s не обозначает пробел. Это только в регулярках эта конструкция значит "искать пробел, перевод строки или другие пробельные символы". В данном случае оно просто обозначает 2 символа, бекслеш и буква s.

> return ($explodedText);


> $text=implode(".", $explodedText);


return выходит из функции и код после него не выполняется. Не очень понятно зачем там implode.

> $explodedText[$i]=preg_split("/[\s,]/u",$explodedText[$i],0,PREG_SPLIT_NO_EMPTY);


Вот это плохая идея. Смотри, до этой строчки в $explodedText[$i] была строка (предложение), а после - уже массив. Плохая идея хранить в одной и той же переменной разные типы данных, это приведет к путанице, надо завести новую.
>>712533
#765 #712456
>>712133

> Нет. Я бы сначала позвонил.


Лучше сначала прочитать. Может там что-то что тебя не устраивает - если всем подряд звонить не читая, больше времени уйдет.

> Ну офигеть теперь. Конечно нужно звонить


Так да. Но перед этим надо прочитать описание чтобы не спрашивать например то что уже написано в объявлении. Потому телефон большими буквами на первой странице на мой взгляд смысла особого не имеет.

> Я выбираю. Во всяком случае начинаю фильтровать, отбрасывать неудовлетворительные варианты.


Ну расположение или цена ведь тоже имеет значение. А там например адрес не указан, только название района. Ну может конечно американцы привыкли на машине везде ездить и им это не так важно.

>Для абсолютного большинства людей отзывы, рейтинги и сердечки имеют решающее значение. Они не способны принять самостоятельного решения и легко ведутся на общественное мнение или рекламу.


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

> Плоский дизайн как раз тем хорош, что он и "минималистичен" с точки зрения бедности оформления, и удобен с точки зрения юзабилити, потому что контрастный в приятных цветах средних оттенков


да перегружен он. Вырежь с крейглиста полезную информацию - остается белый лист. Вырежь со своего сайта полезную информацию - остается куча мусора: шапка, сайдбар, куча цветовых плашек, кнопки.
>>712459
#766 #712458
>>712224

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

>>712028

Поставь echo и выводи значения всех переменных на каждом шаге.

>>711919

> Вторая крайность - убогие страницы уровня манов прошлого века, именуемый "минимализмом".


В книгах текст оформлен точно так же и никто не жалуется.

> Вот вам неотформатированный текст, читайте как хотите.


Почему неотоформатированный?

http://man7.org/linux/man-pages/man2/open.2.html

Я вижу тут абзацы, заголовки и разные стили для выделения ключевых слов.

Мне конечно больше нравится оформление мануалов на Убунту, там получше оформлено: http://manpages.ubuntu.com/manpages/lucid/man2/open.2.html

Или ты говорил про такие страницы? https://www.kernel.org/doc/htmldocs/alsa-driver-api/index.html

Они тоже отформатированы. Я вижу абзацы, заголовки, ссылки. Конечно на первый взгляд тут есть недостатки - например текст тянется на всю ширину страницы, шрифт в винде не очень красиво смотрится (он с засечками и лучше выглядит на печати или экранах высокого разрешения).

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

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

Заметь также что этот дизайн мог бы отлично выглядеть на мобильных телефонах - он адаптируется под любую ширину, плюс насколько я знаю, в том же андроиде по умолчанию стоит шрифт без засечек и текст смотрится аккуратнее. Мог бы - но не будет, так как разработчики мобильных браузеров требуют тег meta viewport, а без него рендерят страницу на ширине 800-960 пикселей. Это авторы документации виноваты? Впрочем, справедливости ради, браузер в андроиде умеет принудительно подстраивать текст под ширину страницы, так что читать можно.

То есть их подход как раз дает максимальную гибкость и адаптивность. Он выводится не так как хочет автор, а так как хочет пользователь, используя стили по умолчанию в браузере пользователя. Вот скажи, это авторы мануала виноваты что по умолчанию в твоем браузере стоят такие стили?

Здесь выбор между "решить все за пользователя, отобрав у него возможность повлиять на оформление" и "дать возможность решать все пользователю".

Ты возможно не знал, но в первых браузерах была идея что пользователь может сделать свой css файл (и даже несколько. переключаясь между ними) который бы применялся по умолчанию. Соответственно каждый мог бы настраивать вид текста под себя.

Вот печально же. Авторы постарались дать пользователю максимум свободы, дизайну - адаптивности, а пользователь пишет что это "плохой дизайн" и "неотформатированный текст".
#766 #712458
>>712224

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

>>712028

Поставь echo и выводи значения всех переменных на каждом шаге.

>>711919

> Вторая крайность - убогие страницы уровня манов прошлого века, именуемый "минимализмом".


В книгах текст оформлен точно так же и никто не жалуется.

> Вот вам неотформатированный текст, читайте как хотите.


Почему неотоформатированный?

http://man7.org/linux/man-pages/man2/open.2.html

Я вижу тут абзацы, заголовки и разные стили для выделения ключевых слов.

Мне конечно больше нравится оформление мануалов на Убунту, там получше оформлено: http://manpages.ubuntu.com/manpages/lucid/man2/open.2.html

Или ты говорил про такие страницы? https://www.kernel.org/doc/htmldocs/alsa-driver-api/index.html

Они тоже отформатированы. Я вижу абзацы, заголовки, ссылки. Конечно на первый взгляд тут есть недостатки - например текст тянется на всю ширину страницы, шрифт в винде не очень красиво смотрится (он с засечками и лучше выглядит на печати или экранах высокого разрешения).

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

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

Заметь также что этот дизайн мог бы отлично выглядеть на мобильных телефонах - он адаптируется под любую ширину, плюс насколько я знаю, в том же андроиде по умолчанию стоит шрифт без засечек и текст смотрится аккуратнее. Мог бы - но не будет, так как разработчики мобильных браузеров требуют тег meta viewport, а без него рендерят страницу на ширине 800-960 пикселей. Это авторы документации виноваты? Впрочем, справедливости ради, браузер в андроиде умеет принудительно подстраивать текст под ширину страницы, так что читать можно.

То есть их подход как раз дает максимальную гибкость и адаптивность. Он выводится не так как хочет автор, а так как хочет пользователь, используя стили по умолчанию в браузере пользователя. Вот скажи, это авторы мануала виноваты что по умолчанию в твоем браузере стоят такие стили?

Здесь выбор между "решить все за пользователя, отобрав у него возможность повлиять на оформление" и "дать возможность решать все пользователю".

Ты возможно не знал, но в первых браузерах была идея что пользователь может сделать свой css файл (и даже несколько. переключаясь между ними) который бы применялся по умолчанию. Соответственно каждый мог бы настраивать вид текста под себя.

Вот печально же. Авторы постарались дать пользователю максимум свободы, дизайну - адаптивности, а пользователь пишет что это "плохой дизайн" и "неотформатированный текст".
>>712548
#767 #712459
>>712456
Ладно, ладно, перегруженный так перегруженный. Я тоже вчера какой-то хуйни наговорил, не выспался.
Не сразу заметил, на craigslist есть кнопка переключения отображения результатов поиска и c превью, и в виде галереи, так что в этом плане беру слова обратно.
Но дизайн конечно отвратительный (его нет), мне было бы неприятно пользоваться таким сайтом.

Кстати выше в треде школьники восторженно обсуждали иде, руководствуясь при выборе красотой темы по умолчанию.
Я тогда посмеивался, а теперь получается что сам недалеко ушел. Хотя иде конечно выбирал по практическим соображениям.
По поводу иде не удивлюсь, если с такими вкусами ты предпочитаешь всякие вимы/емаксы. Вот они зашибись удобные и минималистичные.

К задаче по индексации сосаче-тредов.
Как php относится к юникодным символам в имени ключей массива?
Планирую создать массив с ключами в виде слов, чем не индекс? А значения - массив id постов.
Создал массив, отвардампил, пока все в порядке. Но мало ли, вдруг встроенные функции преподнесут сюрприз.

Еще вопрос по разбиению текста на слова.
Как насчет '/\W+/ui'? Все что не буква - разделитель между словами. Устроит?
>>712464
#768 #712460
>>711926

Что если я опечатаюсь в конфиге? Сообщат ли мне об ошибке?

https://github.com/foobar1643/filehosting/blob/master/app/Config.php#L25

По моему, не сообщат. Исправь, чтобы бросалось исключение с подробностями ошибки.

Кстати, заметь что класс использовать для конфига довольно удобно: мы получаем значения по умолчанию и можем проверять список допустимых полей.
#769 #712463
>>711926

Контейнер лучше инжектировать через конструктор: https://github.com/foobar1643/filehosting/blob/master/cli-tools/admin-tools.php

parseOpt переименовать во что-нибудь более соответствующее смыслу, например: runWithOptions

Ну и можешь глянуть как это сделано в симфони: http://symfony.com/doc/current/cookbook/console/console_command.html - тоже ООП используют. Хотя для простого скрипта можно и без ООП писать.

Также, в PHP есть такой класс: http://php.net/manual/ru/class.splfileinfo.php - мог бы он пригодиться в этом приложении, как ты думаешь? Вот например в Симфони класс File и UploadedFile от него унаследованы: https://github.com/symfony/http-foundation/blob/master/File/UploadedFile.php

Я конечно не призываю что-то менять, не надо, просто мне тут пришла в голову мысль что может можно как-то использовать SplFileInfo или классы из HttpFoundation для решения задачи.
>>713544
#770 #712464
>>712459

> Как php относится к юникодным символам в имени ключей массива?


Безразлично. PHP воспринимает строки как набор байт не задумываясь каким символам они соответствуют.

> Планирую создать массив с ключами в виде слов, чем не индекс? А значения - массив id постов.


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

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

> Все что не буква - разделитель между словами. Устроит?


Да
#771 #712468
>>711910

Лучше наверно ключи-слова использовать в массиве.

>>711882

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

>>711837

> foreach($numbers as $key => $number)


key не используется - не надо его писать

> $regexp = '/[0-9]+[.]*[0-9]+/';


> $input = preg_replace($regexp, '', $input);


тут наверно проще было регулярку в выражение вписать без переменной

> $sum + $numbers[$i+1];


> $sum = $sum - $numbers[$i+1];


Тут $numbers[$i+1]; скопипастено, лучше бы в переменную вынести.

Ты решил разбить текст на числа и знаки операций, но не учел что при этом мы теряем информацию о том в каком порядке они идут. Это делает твой скрипт очень хрупким. А что делать если в выражении встретится знак минус или просто ошибка?

Например:

http://ideone.com/YVa9Pc
http://ideone.com/Tyw4Uz - неверный ответ

Я бы советовал разбить строку на единый массив числ и знаков. Это можно сделать через preg_split с утверждениями ( http://php.net/manual/ru/regexp.reference.assertions.php ) которые не захватывают символы, либо через опцию PREG_SPLIT_DELIM_CAPTURE. Либо можно искать в строке все числа и знаки с помощью preg_match.
#771 #712468
>>711910

Лучше наверно ключи-слова использовать в массиве.

>>711882

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

>>711837

> foreach($numbers as $key => $number)


key не используется - не надо его писать

> $regexp = '/[0-9]+[.]*[0-9]+/';


> $input = preg_replace($regexp, '', $input);


тут наверно проще было регулярку в выражение вписать без переменной

> $sum + $numbers[$i+1];


> $sum = $sum - $numbers[$i+1];


Тут $numbers[$i+1]; скопипастено, лучше бы в переменную вынести.

Ты решил разбить текст на числа и знаки операций, но не учел что при этом мы теряем информацию о том в каком порядке они идут. Это делает твой скрипт очень хрупким. А что делать если в выражении встретится знак минус или просто ошибка?

Например:

http://ideone.com/YVa9Pc
http://ideone.com/Tyw4Uz - неверный ответ

Я бы советовал разбить строку на единый массив числ и знаков. Это можно сделать через preg_split с утверждениями ( http://php.net/manual/ru/regexp.reference.assertions.php ) которые не захватывают символы, либо через опцию PREG_SPLIT_DELIM_CAPTURE. Либо можно искать в строке все числа и знаки с помощью preg_match.
#772 #712473
>>711926

Насчет сфинкса есть такой момент:

- мы переиндексируем большой индекс, делая SQL запрос и читая результаты
- в процессе этого реалтйм индекс пополняется новыми записями
- мы дропаем реалтайм индекс с этими записиями

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

http://stackoverflow.com/questions/4643021/how-to-update-sphinx-main-and-delta-indexes

Там же упоминается фича для удаления лишних записей из индекса: http://sphinxsearch.com/docs/current.html#conf-sql-query-killlist

Изучи-ка, можно ли это у нас использовать? Есть ли выгода? Не слишком ли сложно выходит?

Если можно то я бы мог информацию добавить в комментарии к задаче. А то мы анонов оставляем один на один с проблемой переиндексации и не даем подсказок про то как сделать правильно.

Также, у меня есть еще альтернативный подход:

- сохранить текущее время (в БД?) в start
- перегенерировать основной индекс
- дропнуть из риалтайм индекса записи с временем обновления меньше start

Подвох: на сервере БД и сервере приложений может быть разное время.

Ну и про kill list посмотри, это довольно нужная штука. Хорошо бы определиться с оптимальной архитектурой для нашей задачи.
#772 #712473
>>711926

Насчет сфинкса есть такой момент:

- мы переиндексируем большой индекс, делая SQL запрос и читая результаты
- в процессе этого реалтйм индекс пополняется новыми записями
- мы дропаем реалтайм индекс с этими записиями

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

http://stackoverflow.com/questions/4643021/how-to-update-sphinx-main-and-delta-indexes

Там же упоминается фича для удаления лишних записей из индекса: http://sphinxsearch.com/docs/current.html#conf-sql-query-killlist

Изучи-ка, можно ли это у нас использовать? Есть ли выгода? Не слишком ли сложно выходит?

Если можно то я бы мог информацию добавить в комментарии к задаче. А то мы анонов оставляем один на один с проблемой переиндексации и не даем подсказок про то как сделать правильно.

Также, у меня есть еще альтернативный подход:

- сохранить текущее время (в БД?) в start
- перегенерировать основной индекс
- дропнуть из риалтайм индекса записи с временем обновления меньше start

Подвох: на сервере БД и сервере приложений может быть разное время.

Ну и про kill list посмотри, это довольно нужная штука. Хорошо бы определиться с оптимальной архитектурой для нашей задачи.
>>713544
#773 #712474
>>711926

Ок, я тут погуглил еще и видимо реалтайм индесы нельзя мерджить с обычными. Та схема, где используют main + delta предназначена для ситуаций когда у нас огромные объемы данных и переиндексация займет много времени. Они используют обычные индексы.

Но вопрос с отсутстующими или лишними результатами все же надо продумать - есть ли какое-то не сильно сложное решение.
>>713544
#774 #712476
>>711753

Это не MVC а паттерн Front Controller когда все запросы проходят через одно и то же место. Он часто исопльзуется вместе с MVC.

>>711568

> Во втором случае, не понятно, что значит поменять "профессию сотрудника"?


Если мы делаем для каждой професии свой класс то поменять профессию после создания нельзя так как нельзя поменять класс объекта после создания. А вдруг это надо для решения задачи? Вдруг человек решил перейти на другую должность?

>>711406

Атом это отдельный проект. Атом это HTML-приложение, там внутри браузер запакованный в exe. А вот саблайм для отображения кода использует код на Си++ или чем-то низкоровневом и по идее должен быстрее работать. А высокоуровневые вещи в саблайме сделаны на Питоне.

>>711395

Шрифт надо поменять просто.

>>711380

Все равно плохо. должно быть 5-10 строк, а не стена текста.

- разбить текст на слова
- получить массив длин слов
- посчитать количество длин
- отсортировать
- взять первые N элементов и вывести

у тебя много лишнего.

И что это за креатив? strlen($slova[$i]) / 2 - не работает же с любыми символами. Почитай про mb_strlen().
#774 #712476
>>711753

Это не MVC а паттерн Front Controller когда все запросы проходят через одно и то же место. Он часто исопльзуется вместе с MVC.

>>711568

> Во втором случае, не понятно, что значит поменять "профессию сотрудника"?


Если мы делаем для каждой професии свой класс то поменять профессию после создания нельзя так как нельзя поменять класс объекта после создания. А вдруг это надо для решения задачи? Вдруг человек решил перейти на другую должность?

>>711406

Атом это отдельный проект. Атом это HTML-приложение, там внутри браузер запакованный в exe. А вот саблайм для отображения кода использует код на Си++ или чем-то низкоровневом и по идее должен быстрее работать. А высокоуровневые вещи в саблайме сделаны на Питоне.

>>711395

Шрифт надо поменять просто.

>>711380

Все равно плохо. должно быть 5-10 строк, а не стена текста.

- разбить текст на слова
- получить массив длин слов
- посчитать количество длин
- отсортировать
- взять первые N элементов и вывести

у тебя много лишнего.

И что это за креатив? strlen($slova[$i]) / 2 - не работает же с любыми символами. Почитай про mb_strlen().
#775 #712477
>>711326

Надо использовать утф без БОМ и проставить правильный метатег в ХТМЛ коде для указания кодировки.

>>711311

Закрепить материал, набить шишек. Мы учим сначала синтаксис.

>>711194

> $percentMirror = 0.03;


Если мы захотим поменять процент придется менять в 2 местах сразу. Лучше получать эту переменную как (процент - 1).

> $creditBalance $percent ) + $servicePayment


это повторяется аж 3 раза. Попробуй убрать повторы. Там можно гораздо короче написать решение.

> - $creditBalance - ... - $creditBalance$percentMirror;


Это то же самое что -$creditBalane * $percent

>>711120

Норм

> почему -$i-1


Если i = 0 то что получается? А если бы мы использовали просто -$i?
#775 #712477
>>711326

Надо использовать утф без БОМ и проставить правильный метатег в ХТМЛ коде для указания кодировки.

>>711311

Закрепить материал, набить шишек. Мы учим сначала синтаксис.

>>711194

> $percentMirror = 0.03;


Если мы захотим поменять процент придется менять в 2 местах сразу. Лучше получать эту переменную как (процент - 1).

> $creditBalance $percent ) + $servicePayment


это повторяется аж 3 раза. Попробуй убрать повторы. Там можно гораздо короче написать решение.

> - $creditBalance - ... - $creditBalance$percentMirror;


Это то же самое что -$creditBalane * $percent

>>711120

Норм

> почему -$i-1


Если i = 0 то что получается? А если бы мы использовали просто -$i?
#776 #712479
>>710994

Число прописью

> $word = "Енот наносит ответный удар"; //правильная форма склонения


При ошибке лучше делать die "текст\n"; - а в будущем ты изучишь исключения и будешь использовать их.

> elseif ($number % 10 == 1) {


Там $number % 10 часто повторяется не лучше ли в пременную вынести?

> $numbers["0"] = $spelling[$numbers[0]];


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

> if (10 <= $number % 100 &&


> if (1 <= $number % 10 &


Там часто встречется number % x, стоит вынести в переменные.

> //склеиваем строку из слов


> foreach ($numbers as $key => $word) {


Используй implode

> while ($i < $number) {


А не лучше ли было сделать цикл по bit от 0 до 3? Я не очень понимаю логики в условии while, почему ты счетчик сравниваешь с числом. Мне кажется без i было бы проще.

> склеиваем результат в одну строку


implode нужен

> счету 95896535 девяносто пять миллионов восемьсот девяносто шесть тысяч пятьсот тридцать пять рублей


По условию цифра должна стоять перед "рублей"
#776 #712479
>>710994

Число прописью

> $word = "Енот наносит ответный удар"; //правильная форма склонения


При ошибке лучше делать die "текст\n"; - а в будущем ты изучишь исключения и будешь использовать их.

> elseif ($number % 10 == 1) {


Там $number % 10 часто повторяется не лучше ли в пременную вынести?

> $numbers["0"] = $spelling[$numbers[0]];


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

> if (10 <= $number % 100 &&


> if (1 <= $number % 10 &


Там часто встречется number % x, стоит вынести в переменные.

> //склеиваем строку из слов


> foreach ($numbers as $key => $word) {


Используй implode

> while ($i < $number) {


А не лучше ли было сделать цикл по bit от 0 до 3? Я не очень понимаю логики в условии while, почему ты счетчик сравниваешь с числом. Мне кажется без i было бы проще.

> склеиваем результат в одну строку


implode нужен

> счету 95896535 девяносто пять миллионов восемьсот девяносто шесть тысяч пятьсот тридцать пять рублей


По условию цифра должна стоять перед "рублей"
#777 #712482
>>710994

Сделал задачу с банкоматом, с помощью алгоритма из задач о рюкзаке

> PHP Notice: Undefined variable: Results in /home/4gaZXo/prog.php on line 21


> PHP Notice: Undefined variable: i in /home/4gaZXo/prog.php on line 21


> PHP Notice: Undefined variable: m in /home/4gaZXo/prog.php on line 21


Ошибки надо исправить

> $INF=1000000; // Значение константы


В PHP есть настоящая INF: http://php.net/manual/ru/math.constants.php

> $Results[$i][$m]; // Массив в котором мы храним результат


Эта команда ничего не делает. Также, имена переменных надо писать с маленькой буквы.

> $value[1]


Это не читаемо. Должно быть либо просто $value либо $bill['value']. У тебя имена переменных часто неудачно выбраны и из-за этого трудно понять алгоритм. Что еще за $m? Лучше $amount.

i -> billIndex, billNumber
m -> amount
result -> minBills, billCounts,

Подумай над нормальными именами.

Или вот это выражение: $Results[$i][$amount-$bills[$i][0]] -ну как его понять? $bills[$i][0] надо заменить на переменную.

В функции findAnsRecur рекурсия хвостовая и заменяется на цикл. Хотя не знаю, буде ли читабельнее.

Также, нет ли тут подвоха:

> Перебераем количество банкнот текущего номинала


> от минимально требуемого (или того что есть) до 1


> for ($l=min($value[1], intval(floor($m/$value[0]))); $l>=1; $l--) {


Эта проверка на $value[1] учитывает ли что мы могли уже выдать часть купюр и запас уменьшился?

Также, тебе вопрос. Вот ты генерируешь массив results, размера (сумма x число купюр). Довольно большой и довольно длого генерируется. Нельзя ли обойтись без него, вычисляя его динамически - через рекурсивную функцию getMinBills(billIndex, sum)?

Можешь прикинуть, есть ли выгода от отказа от массива? Сколько операций (вызовов) примерно придется выполнить в случае использования функции?

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

Альтернативная идея: можно ли в массиве не заполнять все клетки, а только те, где хранятся измененные числа? А те где нули или бесконечность вообще не хранить чтобы не тратить память?

Скажи что ты думаешь по поводу этих 2 оптимизаций.

Вообще, у тебя неплохо написан алгоритм, но вот код плохо читаемый из-за названий переменных и громоздких выражений.
#777 #712482
>>710994

Сделал задачу с банкоматом, с помощью алгоритма из задач о рюкзаке

> PHP Notice: Undefined variable: Results in /home/4gaZXo/prog.php on line 21


> PHP Notice: Undefined variable: i in /home/4gaZXo/prog.php on line 21


> PHP Notice: Undefined variable: m in /home/4gaZXo/prog.php on line 21


Ошибки надо исправить

> $INF=1000000; // Значение константы


В PHP есть настоящая INF: http://php.net/manual/ru/math.constants.php

> $Results[$i][$m]; // Массив в котором мы храним результат


Эта команда ничего не делает. Также, имена переменных надо писать с маленькой буквы.

> $value[1]


Это не читаемо. Должно быть либо просто $value либо $bill['value']. У тебя имена переменных часто неудачно выбраны и из-за этого трудно понять алгоритм. Что еще за $m? Лучше $amount.

i -> billIndex, billNumber
m -> amount
result -> minBills, billCounts,

Подумай над нормальными именами.

Или вот это выражение: $Results[$i][$amount-$bills[$i][0]] -ну как его понять? $bills[$i][0] надо заменить на переменную.

В функции findAnsRecur рекурсия хвостовая и заменяется на цикл. Хотя не знаю, буде ли читабельнее.

Также, нет ли тут подвоха:

> Перебераем количество банкнот текущего номинала


> от минимально требуемого (или того что есть) до 1


> for ($l=min($value[1], intval(floor($m/$value[0]))); $l>=1; $l--) {


Эта проверка на $value[1] учитывает ли что мы могли уже выдать часть купюр и запас уменьшился?

Также, тебе вопрос. Вот ты генерируешь массив results, размера (сумма x число купюр). Довольно большой и довольно длого генерируется. Нельзя ли обойтись без него, вычисляя его динамически - через рекурсивную функцию getMinBills(billIndex, sum)?

Можешь прикинуть, есть ли выгода от отказа от массива? Сколько операций (вызовов) примерно придется выполнить в случае использования функции?

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

Альтернативная идея: можно ли в массиве не заполнять все клетки, а только те, где хранятся измененные числа? А те где нули или бесконечность вообще не хранить чтобы не тратить память?

Скажи что ты думаешь по поводу этих 2 оптимизаций.

Вообще, у тебя неплохо написан алгоритм, но вот код плохо читаемый из-за названий переменных и громоздких выражений.
#778 #712485
>>710994

Программа для расчета зарплаты сотрудников «Вектор»

> public function getOvertimeHours() {


> public function getNormalHours() {


Эти функции очень похожи. Одну из них можно упростить используя формулу

число обычных часов + переработки = общее число часов

> for ($i=$length-mb_strlen($string); $i>0; $i--) {


> $string= " " . $string;


str_repeat

> class countCommonTotal {


Тут ведь есть еще другие варианты. Либо

1) сделать класс Компания, содержащий массив работников и методы расчета суммы зарплаты, часов и тд. Профит что можно добавлять работников ,увольнять, узнавать сколько в этом случае будет часов и вообще класс представляет информацию о компании

2) сделать класс СтрокаТаблицы, хранящий одну строку таблицы, но без расчета суммы и вообще без методов. Профит в том что этим классом можно хранить не только сумму, но и любую строку в таблице.

3) не делать этот класс, а сумму копить в переменной

Что думаешь?

Ну и имена классов пишут с большой буквы.
#778 #712485
>>710994

Программа для расчета зарплаты сотрудников «Вектор»

> public function getOvertimeHours() {


> public function getNormalHours() {


Эти функции очень похожи. Одну из них можно упростить используя формулу

число обычных часов + переработки = общее число часов

> for ($i=$length-mb_strlen($string); $i>0; $i--) {


> $string= " " . $string;


str_repeat

> class countCommonTotal {


Тут ведь есть еще другие варианты. Либо

1) сделать класс Компания, содержащий массив работников и методы расчета суммы зарплаты, часов и тд. Профит что можно добавлять работников ,увольнять, узнавать сколько в этом случае будет часов и вообще класс представляет информацию о компании

2) сделать класс СтрокаТаблицы, хранящий одну строку таблицы, но без расчета суммы и вообще без методов. Профит в том что этим классом можно хранить не только сумму, но и любую строку в таблице.

3) не делать этот класс, а сумму копить в переменной

Что думаешь?

Ну и имена классов пишут с большой буквы.
#779 #712486
>>710931

> Класс Департамент может содержать в себе общее количество сотрудников, общее потребление кофе, общее производство страниц, общую зарплату, среднее соотношение страницы к затратам на её производство.


Нет, это все производные величины и не надо их хранить в свойствах. Иначе ты замучаешься их пересчитывать при добавлении, увольнении и изменении данных сотрудников.

Департаменту достаточно хранить название и список персонала - все остальное высчитывается и не требует хранения.

> Класс Компания может содержать департаменты, может содержать антикризисные меры (наверное).


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

> Мы можем наследовать от класса Сотрудник классы по каждой профессии. Далее можно включить любую другую профессию, так же унаследовав её от Сотрудника.


Можем но тогда нельзя будет менять профессию.

> Но целесообразно ли это в нашей ситуации?


напиши плюсы и минусы и сравни

> public $rate;


зачем хранить это свойство? Оно независимое или вычисляется из чего-то другого?

> public $salary;


Вот у тебя есть итоговая зарплата. Если я поменяю ранг или базовую ставку - она сама пересчитается? Ты помнишь что публичные поля объекта должны хранить точные и актуальные значения?

Вот пример кода:

$ivan = new Employee(....);
var_dump($ivan->salary);
$ivan->rank ++;
var_dump($ivan->salary);
В обоих случаях должна выводиться точная зарплата на данный момент.У тебя это не так. У тебя чтобы в поле salary оказалась зарплата надо сначала вызвать getSalary (заметь, getSalary а не setSalary что абсолютно нелогично). Такого быть не должно. Вот сам подумай, как можно использовать твой класс если для каждого поля надо сначала вызвать какой-то метод? Как это все помнить? Как ты будешь помнить такие подробности если у тебя в программе 1000 классов?

Должно быть проще. Если есть публичное поле - в нем всегда точные данные. Если есть метод - он всегда вернет точные данные. Без оговорок что "ты должен сначала сделать это, это и это".

> public function getRate()


Неудачная функия. Ее название переводится как "получить коэффициент" и можно подумать что она ничего не меняет в самом объекте. Но трюк в том что она меняет значение поля, что абсолютно неожиданно, она же называется getrate а не setRate.

> public function getCoffeeByProfession($coffeeByProfession){


Что делает этот метод? Напиши потому что я не понял из названия. "получить потребление кофе зная профессию". А зачем в него что-то передавать если работник и так должен знать сам сколько он кофе потребляет?

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

> $employeesPurchaseDepartment[$i]->coffee = $employeesPurchaseDepartment[$i]-getCoffeeByProfession($coffeeByProfession);


> $employeesPurchaseDepartment[$i]->basicSalary = $employeesPurchaseDepartment[$i]->getBasicSalaryByProfession($basicSalaryByProfession);


> $employeesPurchaseDepartment[$i]->pages = $employeesPurchaseDepartment[$i]->getPagesByProfession($pagesByProfession);



Не это как-то неправильно. Должно быть проще:

// задаем базовую ставку
$employee->setSalary($x);

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

Ну и давай делай уже объект Департамента.

То что у тебя - это просто массив работников, это не Департамент.
#779 #712486
>>710931

> Класс Департамент может содержать в себе общее количество сотрудников, общее потребление кофе, общее производство страниц, общую зарплату, среднее соотношение страницы к затратам на её производство.


Нет, это все производные величины и не надо их хранить в свойствах. Иначе ты замучаешься их пересчитывать при добавлении, увольнении и изменении данных сотрудников.

Департаменту достаточно хранить название и список персонала - все остальное высчитывается и не требует хранения.

> Класс Компания может содержать департаменты, может содержать антикризисные меры (наверное).


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

> Мы можем наследовать от класса Сотрудник классы по каждой профессии. Далее можно включить любую другую профессию, так же унаследовав её от Сотрудника.


Можем но тогда нельзя будет менять профессию.

> Но целесообразно ли это в нашей ситуации?


напиши плюсы и минусы и сравни

> public $rate;


зачем хранить это свойство? Оно независимое или вычисляется из чего-то другого?

> public $salary;


Вот у тебя есть итоговая зарплата. Если я поменяю ранг или базовую ставку - она сама пересчитается? Ты помнишь что публичные поля объекта должны хранить точные и актуальные значения?

Вот пример кода:

$ivan = new Employee(....);
var_dump($ivan->salary);
$ivan->rank ++;
var_dump($ivan->salary);
В обоих случаях должна выводиться точная зарплата на данный момент.У тебя это не так. У тебя чтобы в поле salary оказалась зарплата надо сначала вызвать getSalary (заметь, getSalary а не setSalary что абсолютно нелогично). Такого быть не должно. Вот сам подумай, как можно использовать твой класс если для каждого поля надо сначала вызвать какой-то метод? Как это все помнить? Как ты будешь помнить такие подробности если у тебя в программе 1000 классов?

Должно быть проще. Если есть публичное поле - в нем всегда точные данные. Если есть метод - он всегда вернет точные данные. Без оговорок что "ты должен сначала сделать это, это и это".

> public function getRate()


Неудачная функия. Ее название переводится как "получить коэффициент" и можно подумать что она ничего не меняет в самом объекте. Но трюк в том что она меняет значение поля, что абсолютно неожиданно, она же называется getrate а не setRate.

> public function getCoffeeByProfession($coffeeByProfession){


Что делает этот метод? Напиши потому что я не понял из названия. "получить потребление кофе зная профессию". А зачем в него что-то передавать если работник и так должен знать сам сколько он кофе потребляет?

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

> $employeesPurchaseDepartment[$i]->coffee = $employeesPurchaseDepartment[$i]-getCoffeeByProfession($coffeeByProfession);


> $employeesPurchaseDepartment[$i]->basicSalary = $employeesPurchaseDepartment[$i]->getBasicSalaryByProfession($basicSalaryByProfession);


> $employeesPurchaseDepartment[$i]->pages = $employeesPurchaseDepartment[$i]->getPagesByProfession($pagesByProfession);



Не это как-то неправильно. Должно быть проще:

// задаем базовую ставку
$employee->setSalary($x);

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

Ну и давай делай уже объект Департамента.

То что у тебя - это просто массив работников, это не Департамент.
>>713490
#780 #712487
>>710931

По поводу заполнения. Сделай массив вида

$people = ['3xМе2', '5Ан2'];

Или строку:

$people = "3xМе2, 5xАн2";

И из нее уже создавай работников.
Приложение для изучения иностранных языков #781 #712495
>>710320

> Если данные второстепенные, которые не страшно потерять, то почему бы и нет. Например я выбрал сначала схему с хранением словаря к тексту в виде хеша. Под словарем я имею ввиду именно слова, принадлежащие к данному тексту. То есть разбить текст на слова, найти этим словам перевод и сохранить в редис. Если этот словарь будет потерян, не составит труда снова проделать вышеупомянутую последовательность: разбить текст на слова, перевести, сохранить в мемкеш/редис.


ну да, но тогда надо официально и считать его кешем. А не основным хранилищем.

Может сделаешь схему хранения данных (просто например в виде списока таблиц и полей или как-то так) чтобы было что обсудить? что будем хранить, что кешировать. А то так трудно абстрактно обсуждать.

Я не вижу надобности в хранении "миллиардов" записей. В принципе mysql потянет такой объем, тем более если ты будешь в основном работать с кешем, то эти данные в основном будут лежать на диске так как к ним нет обращений. mysql тем и хороша что она не требует держать все данные в памяти.

> К редису пришел, потому что испугало кол-во записей в таблице связи текст_слово. Это даст 1000 x 1000 до 1млн записей в эту таблицу на одного пользователя.


Так в редисе тот же миллион элекментов надо будет хранить. Причем майскул позволяет данные держать на диске пока они не нужны, а редис - нет. Редис быстрее но он не позволяет делать SQL запросы и требует больше памяти.

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

> Я не знал, что реляционные базы могут справляться с такими объемами (десятки миллиардов). Но раз могут, то и хорошо.



> http://dev.mysql.com/doc/refman/5.5/en/innodb-restrictions.html


> http://stackoverflow.com/questions/4836039/what-are-the-max-rows-for-mysql-table/4836053#4836053


> on an InnoDB database:


> The minimum tablespace size is 10MB. The maximum tablespace size is four billion database pages (64TB). This is also the maximum size for a table.


Пока у тебя меньше 64 Тб данных, майскул справится, было бы место на диске.

Кстати у postgresql это ограничение 32 Тб: http://www.postgresql.org/about/

На практике конечно не знаю что будет при хранении такого объема данных в одной таблице. Наверно до такого лучше не доводить и партицировать таблицу на части в отдельных базах данных. Как эти таблицы бекапить? Как менять их схему?

> Я думаю, что редис это хранилище ключ-значение без индексов и связей, значит один хеш может занять хоть 50, хоть 100gb, сколько там памяти на сервере. Или не может?


Так в mysql таблица ограничена диском а не памятью. И в каких-то случаях данные в mysql могут храниться плотнее (а в каких-то нет).

> В субд все сложнее, вряд ли одна табличка может занимать столько места.


Может. Но я бы не рисковал и партиционировал ее.

> Тем более что рабочее приложение будет иметь платный акаунт.


Выгоднее наверно словарь иметь. То есть затраты на перевод слов локально ниже будут при превышении определенного объема. Плюс, он быстрее работает.

> Вторым вариантом было сохранять рядом с текстом сериализованную структуру словаря, принадлежащего тексту.


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

> Так что да, возвращаемся к обычной связи многие ко многим.


Было бы хорошо сделать схему БД и кеша и ее обсуждать. Для каждого ключа кшеа хорошо бы написать 1) мотивацию для его добавления 2) условия инвалидации

Так как тебя беспокоит производительность, хорошо бы для каждой таблицы и ключа кеша оценить объем. Например, рассмотреть 2 сценария "небольшой сайт" и "популярный сервис".

Кстати, хорошо бы подумать про дедуплиткацию данных. Что если 2 пользователя хотят загрузить один и тот же текст? Может ли пользователь просто взять уже загурженный кем-то?

Ну и насчет списка слов в тексте - тут надо думать. Не проще ли на стороне PHP разбить текст на слова при выборке?

А, и вспомнил еще кое-что. Базы данных больше заточены на данные небольшого размера, пусть даже их много, чем на данные огромного размера. Файлы картинок например невыгодно хранить в БД.

>>плохо что для HTTP клиента не додумался библиотеку поискать.


> Думал о guzzle. Но во-первых я его так и не изучил, во-вторых ради одного несчастного запроса тянуть гигантскую библиотеку показалось неоправданным.


Чтобы пользоваться гуззлом достаточно прочитать ридми и примеры. Он не сложный. А вот дял курла надо например изучить список опций: http://php.net/manual/ru/function.curl-setopt.php

Тебе курл кажется проще потому что ты скопипастил из интернета (плохой) кусок готового кода. Если писать самому, с гузл лбудет проще мне кажется. Ну и там ООП исопльзуется, он с DI совместим. И даже если использовать курл, надо вынести его в отдельный класс. И когда ты будешь это делать, поймешь что гуззл подключить было проще.
Приложение для изучения иностранных языков #781 #712495
>>710320

> Если данные второстепенные, которые не страшно потерять, то почему бы и нет. Например я выбрал сначала схему с хранением словаря к тексту в виде хеша. Под словарем я имею ввиду именно слова, принадлежащие к данному тексту. То есть разбить текст на слова, найти этим словам перевод и сохранить в редис. Если этот словарь будет потерян, не составит труда снова проделать вышеупомянутую последовательность: разбить текст на слова, перевести, сохранить в мемкеш/редис.


ну да, но тогда надо официально и считать его кешем. А не основным хранилищем.

Может сделаешь схему хранения данных (просто например в виде списока таблиц и полей или как-то так) чтобы было что обсудить? что будем хранить, что кешировать. А то так трудно абстрактно обсуждать.

Я не вижу надобности в хранении "миллиардов" записей. В принципе mysql потянет такой объем, тем более если ты будешь в основном работать с кешем, то эти данные в основном будут лежать на диске так как к ним нет обращений. mysql тем и хороша что она не требует держать все данные в памяти.

> К редису пришел, потому что испугало кол-во записей в таблице связи текст_слово. Это даст 1000 x 1000 до 1млн записей в эту таблицу на одного пользователя.


Так в редисе тот же миллион элекментов надо будет хранить. Причем майскул позволяет данные держать на диске пока они не нужны, а редис - нет. Редис быстрее но он не позволяет делать SQL запросы и требует больше памяти.

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

> Я не знал, что реляционные базы могут справляться с такими объемами (десятки миллиардов). Но раз могут, то и хорошо.



> http://dev.mysql.com/doc/refman/5.5/en/innodb-restrictions.html


> http://stackoverflow.com/questions/4836039/what-are-the-max-rows-for-mysql-table/4836053#4836053


> on an InnoDB database:


> The minimum tablespace size is 10MB. The maximum tablespace size is four billion database pages (64TB). This is also the maximum size for a table.


Пока у тебя меньше 64 Тб данных, майскул справится, было бы место на диске.

Кстати у postgresql это ограничение 32 Тб: http://www.postgresql.org/about/

На практике конечно не знаю что будет при хранении такого объема данных в одной таблице. Наверно до такого лучше не доводить и партицировать таблицу на части в отдельных базах данных. Как эти таблицы бекапить? Как менять их схему?

> Я думаю, что редис это хранилище ключ-значение без индексов и связей, значит один хеш может занять хоть 50, хоть 100gb, сколько там памяти на сервере. Или не может?


Так в mysql таблица ограничена диском а не памятью. И в каких-то случаях данные в mysql могут храниться плотнее (а в каких-то нет).

> В субд все сложнее, вряд ли одна табличка может занимать столько места.


Может. Но я бы не рисковал и партиционировал ее.

> Тем более что рабочее приложение будет иметь платный акаунт.


Выгоднее наверно словарь иметь. То есть затраты на перевод слов локально ниже будут при превышении определенного объема. Плюс, он быстрее работает.

> Вторым вариантом было сохранять рядом с текстом сериализованную структуру словаря, принадлежащего тексту.


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

> Так что да, возвращаемся к обычной связи многие ко многим.


Было бы хорошо сделать схему БД и кеша и ее обсуждать. Для каждого ключа кшеа хорошо бы написать 1) мотивацию для его добавления 2) условия инвалидации

Так как тебя беспокоит производительность, хорошо бы для каждой таблицы и ключа кеша оценить объем. Например, рассмотреть 2 сценария "небольшой сайт" и "популярный сервис".

Кстати, хорошо бы подумать про дедуплиткацию данных. Что если 2 пользователя хотят загрузить один и тот же текст? Может ли пользователь просто взять уже загурженный кем-то?

Ну и насчет списка слов в тексте - тут надо думать. Не проще ли на стороне PHP разбить текст на слова при выборке?

А, и вспомнил еще кое-что. Базы данных больше заточены на данные небольшого размера, пусть даже их много, чем на данные огромного размера. Файлы картинок например невыгодно хранить в БД.

>>плохо что для HTTP клиента не додумался библиотеку поискать.


> Думал о guzzle. Но во-первых я его так и не изучил, во-вторых ради одного несчастного запроса тянуть гигантскую библиотеку показалось неоправданным.


Чтобы пользоваться гуззлом достаточно прочитать ридми и примеры. Он не сложный. А вот дял курла надо например изучить список опций: http://php.net/manual/ru/function.curl-setopt.php

Тебе курл кажется проще потому что ты скопипастил из интернета (плохой) кусок готового кода. Если писать самому, с гузл лбудет проще мне кажется. Ну и там ООП исопльзуется, он с DI совместим. И даже если использовать курл, надо вынести его в отдельный класс. И когда ты будешь это делать, поймешь что гуззл подключить было проще.
#782 #712503
Подскажите как лучше сделать,
класс департамента содержит массив сотрудников
array('me1'=>'9', 'me2'=>'3', 'me3'=>'2', 'ma1'=>'2', 'me2chief'=>'1')
ключ: первые две буквы обозначают профессию, цифра - ранг, chief после цифры - является ли сотрудник шефом.
значение: число сотрудников данной профессии.

Для просчета зп сотрудников нужна профессия, ранг, кол-во работников, и значение шеф(да или нет).

Вопрос, норм, если я перебираю этот массив и с помощью регекспа разбираю ключ на переменные $профессия, $ранг, $шеф?
Или лучше сразу сделать массив двумерным:
Employees=array(manager=>array(1=>9, 2=>3, 3=>2), marketer=>array(1=>2), chief=>array(manager=>2));
И просто перебирать вложенные массивы?
>>712510>>712515
#783 #712510
>>712503

Строкой может быть удобнее писать, я бы еще и количество поместил в строку тогда.
>>712521
https://github.com/MindiMakridi/filehosting/ #784 #712511
>>704356
>>702249

https://github.com/MindiMakridi/filehosting/blob/master/files/.gitignore
Лучше иметь единственный гитигнор файл - меньше путаницы

> $depth = preg_split("/\\./", $this->path);


Хватит explode для этого

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/models/Mappers/CommentsMapper.php#L9
Это неправильно:

> $this->dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);


PDO это объект который используется не только маппером. Маппер не должен менять его глобальные свойства. Это надо делать в том месте, где PDO создается (в index.php?)

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/models/Mappers/CommentsMapper.php#L58

> $sth = $this->dbh->prepare("SELECT MAX(number) FROM comments WHERE file_id = :id AND path LIKE :path ");


Это довольно неэффективно так как мы не можем использовать индекс и должны обходить всю таблицу, проверяя каждую запись на соотвествие LIKE. Чтобы это исправить, надо сделать поле parent_id и искать по нему WHERE parent_id = ? - такой запрос будет эффективен. Также, если что-то сломается, имея parent_id можно восстановить path.

> WHERE file_id = :id HAVING date>:time


HAVING равносилен WHERE если нету группировки. Почитай для чего он нужен.

> throw new Filehosting\Exceptions\PreviewGenerationException("Incorrect file extension");


А ты руками неймспейс пишешь? Найди расширение для редактора которое бы автоматически вставляло use. ИДЕ так умеют, для саблайма есть расширение.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/models/helpers/FilesHelper.php#L85

> return "/download/" . $id . "/" . $fileName;


Ошибка. в УРЛ не могут содержаться некоторые символы, напрмиер пробелы или знак вопроса или решетка. Попробуй загрузить файл с решеткой в имени например.

Надо кодировать спецсимволы в имени процентным кодированием.

Соответственно ниже есть место где имена сравниваются:

> if (file_exists($app->filesHelper->getPathToFile($file)) && $thumbName == $fileName) {


Тут надо будет учесть это кодирование. И протестировать на именах с пробелами и решетками.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/index.php#L164
Для картинок надо тоже сделать отдачу через xsendfile при наличии. И без копипаста.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/index.php#L87

> $app->setCookie("time", time());


Это что-то странное, а зачем-то куку стаивть с временем просмотра файла? Ты учел что куки общие для всех вкладок в браузере? Я думаю, время последнего обновления надо просто хранить в js переменной.

> if ($app->request->post('path')) {


> $path = $app->request->post('path');


Это неправильно. Тут легко передать некорректный path с целью забить нашу базу мусором. Лучше передавать просто id родителя который легко проверяется.

> $json = array();


> foreach($newComments as $newComment){


> $json[] = array('name'=>$newComment->getName(),


Я думаю конвертирование объекта комментария в JSON надо сделать в хелпере каком-нибудь. Это же может еще где-то пригодиться.

> echo $json;


В слиме принято использовать $app->response->setBody или как-то так. Тогда всякие плагины смогут обрабатывать выведенные данные. Например плагин для сжатия данных или еще чего-нибудь. Вот мануал:

http://docs.slimframework.com/response/body/

А, впрочем, там написано что может и echo использовать, он перехватывает вывод.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/js/drop.js#L7
Вот здесь мне кажется лучше будет сделать установку обработчиков отдельно, или хотя бы отформатировать код по-ругому, а то нечитаемая стена получается.

dropzone.on({
....x: function () {
..........
.......},
....y: function (),
....z: function ()
});

dropzone.on('x', funtion () {
});

dropzone.on('y', funtion () {
});

> if(window.FormData===undefined){


Лучше использовать оператор in. И мало проверить наличие FormData, надо проверить еще что оно позволяет прикладывать файлы так как была когда-то версия FormData без метода для добавления файла. И проверку вынести в функцию.

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

$('#dropZone').dropZone({
formData: {
'id': x,
'token': y,
'something': z
},
url: '/upload'
});

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

Проверь что твой плагин универсален, на отдельном HTML файле.

Возможно что такой плагин пригодится тебе еще в каком-нибудь проекте. Возможно что нет.

Я вижу, ты решил для вывода сделать клиентский шаблон. Это имеет такие недостатки:

- тебе нужно иметь 2 шаблона, серверный и клиентский, и держать их согласованными (так как твой шаблон не изоморфный и не может одновременно работать на клиенте и сервере)
- в клиентском шаблоне нельзя использовать хелперы, возможности твига

Как тебе вариант рендерить комментарии на сервере и отдавать JSON с HTML-ками?

> <a href="" class="add-comment" data-path="{path}">Ответить</a>


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

> {{file.getOriginalName()}}<small>({{filesHelper.getFormattedSize(file)}})</small>


Пробел перед скобкой пропущен

> <p class="comment">{{file.getComment()}}</p>


Сохраняются ли переводы строк? Или в комментарии их нельзя указать?

> <a href="#myModal" role="button"


А бутстрап не позволяет это кнопкой сверстать?

> <div class="commentary" id="{{commentary.getPath()}}"


id не должен начинаться с цифры.

> document.body.addEventListener('click', showForm);


Почему не jquery? ты же его используешь? И тот же вопрос про функцию showForm().

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/js/uploadComment.js#L13

> else{


> form.submit();


Это неправильно, смотри 2 сценария:

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

Не. это неправильно. Когда я такому учил? Также, я не вижу блокировки формы на время отправки. Я же вроде писал раньше:

-----

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

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

- индикатор прогресса операции
- вывод сообщений об ошибках
- возможность повторить операцию

Сооветственно если ты что-то делаешь через аякс, теперь ты а не браузер обязан реализовать эти возможности. Любой аякс-запрос должен сопровождаться:

- индикацией прогресса. Пользователь должен (не только при аякс запрсе, а всегда) иметь обратную связь и видеть состояние системы: идет обработка данных, успешно обработано, произошла ошибка. Ты можешь не показывать индикатор прогресса только в случаях когда обработка запроса происходит очень быстро (менее 100 мс) - тогда можно сразу показать сообщение с результатом операции.

Сайты с индикаторами: http://www.ajaxload.info/ http://preloaders.net/

- обработкой ошибок. Ошибки могут быть транспортного уровня (пропал интернет, сервер отдал код 500, пришел ответ не ожидаемого типа или формата), так и уровня приложения (сервер ответил что данные в форме заполнены неправильно)

- возможность при некоторых ошибках повторить запрос

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

-----

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

При получении комментариев нет индикатора или обработки ошибок.

> comment.innerHTML = comment.innerHTML.replace("{name}", comments.name);


> comment.innerHTML = comment.innerHTML.replace("{date}", comments.date);


Это копипаста. Учись разделять код на функции. В данном случае надо сделать функцию, полчающую шаблон и набор данных для вставки. Также, я не вижу в твоем коде защиты от XSS. Что если комментарий содержит теги?

Я смотрел только измененный с последней проверки код. Если тебе самому что-то кажется не очень правильным, напиши.
https://github.com/MindiMakridi/filehosting/ #784 #712511
>>704356
>>702249

https://github.com/MindiMakridi/filehosting/blob/master/files/.gitignore
Лучше иметь единственный гитигнор файл - меньше путаницы

> $depth = preg_split("/\\./", $this->path);


Хватит explode для этого

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/models/Mappers/CommentsMapper.php#L9
Это неправильно:

> $this->dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);


PDO это объект который используется не только маппером. Маппер не должен менять его глобальные свойства. Это надо делать в том месте, где PDO создается (в index.php?)

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/models/Mappers/CommentsMapper.php#L58

> $sth = $this->dbh->prepare("SELECT MAX(number) FROM comments WHERE file_id = :id AND path LIKE :path ");


Это довольно неэффективно так как мы не можем использовать индекс и должны обходить всю таблицу, проверяя каждую запись на соотвествие LIKE. Чтобы это исправить, надо сделать поле parent_id и искать по нему WHERE parent_id = ? - такой запрос будет эффективен. Также, если что-то сломается, имея parent_id можно восстановить path.

> WHERE file_id = :id HAVING date>:time


HAVING равносилен WHERE если нету группировки. Почитай для чего он нужен.

> throw new Filehosting\Exceptions\PreviewGenerationException("Incorrect file extension");


А ты руками неймспейс пишешь? Найди расширение для редактора которое бы автоматически вставляло use. ИДЕ так умеют, для саблайма есть расширение.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/models/helpers/FilesHelper.php#L85

> return "/download/" . $id . "/" . $fileName;


Ошибка. в УРЛ не могут содержаться некоторые символы, напрмиер пробелы или знак вопроса или решетка. Попробуй загрузить файл с решеткой в имени например.

Надо кодировать спецсимволы в имени процентным кодированием.

Соответственно ниже есть место где имена сравниваются:

> if (file_exists($app->filesHelper->getPathToFile($file)) && $thumbName == $fileName) {


Тут надо будет учесть это кодирование. И протестировать на именах с пробелами и решетками.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/index.php#L164
Для картинок надо тоже сделать отдачу через xsendfile при наличии. И без копипаста.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/index.php#L87

> $app->setCookie("time", time());


Это что-то странное, а зачем-то куку стаивть с временем просмотра файла? Ты учел что куки общие для всех вкладок в браузере? Я думаю, время последнего обновления надо просто хранить в js переменной.

> if ($app->request->post('path')) {


> $path = $app->request->post('path');


Это неправильно. Тут легко передать некорректный path с целью забить нашу базу мусором. Лучше передавать просто id родителя который легко проверяется.

> $json = array();


> foreach($newComments as $newComment){


> $json[] = array('name'=>$newComment->getName(),


Я думаю конвертирование объекта комментария в JSON надо сделать в хелпере каком-нибудь. Это же может еще где-то пригодиться.

> echo $json;


В слиме принято использовать $app->response->setBody или как-то так. Тогда всякие плагины смогут обрабатывать выведенные данные. Например плагин для сжатия данных или еще чего-нибудь. Вот мануал:

http://docs.slimframework.com/response/body/

А, впрочем, там написано что может и echo использовать, он перехватывает вывод.

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/js/drop.js#L7
Вот здесь мне кажется лучше будет сделать установку обработчиков отдельно, или хотя бы отформатировать код по-ругому, а то нечитаемая стена получается.

dropzone.on({
....x: function () {
..........
.......},
....y: function (),
....z: function ()
});

dropzone.on('x', funtion () {
});

dropzone.on('y', funtion () {
});

> if(window.FormData===undefined){


Лучше использовать оператор in. И мало проверить наличие FormData, надо проверить еще что оно позволяет прикладывать файлы так как была когда-то версия FormData без метода для добавления файла. И проверку вынести в функцию.

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

$('#dropZone').dropZone({
formData: {
'id': x,
'token': y,
'something': z
},
url: '/upload'
});

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

Проверь что твой плагин универсален, на отдельном HTML файле.

Возможно что такой плагин пригодится тебе еще в каком-нибудь проекте. Возможно что нет.

Я вижу, ты решил для вывода сделать клиентский шаблон. Это имеет такие недостатки:

- тебе нужно иметь 2 шаблона, серверный и клиентский, и держать их согласованными (так как твой шаблон не изоморфный и не может одновременно работать на клиенте и сервере)
- в клиентском шаблоне нельзя использовать хелперы, возможности твига

Как тебе вариант рендерить комментарии на сервере и отдавать JSON с HTML-ками?

> <a href="" class="add-comment" data-path="{path}">Ответить</a>


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

> {{file.getOriginalName()}}<small>({{filesHelper.getFormattedSize(file)}})</small>


Пробел перед скобкой пропущен

> <p class="comment">{{file.getComment()}}</p>


Сохраняются ли переводы строк? Или в комментарии их нельзя указать?

> <a href="#myModal" role="button"


А бутстрап не позволяет это кнопкой сверстать?

> <div class="commentary" id="{{commentary.getPath()}}"


id не должен начинаться с цифры.

> document.body.addEventListener('click', showForm);


Почему не jquery? ты же его используешь? И тот же вопрос про функцию showForm().

https://github.com/MindiMakridi/filehosting/blob/a01e579f88c721f448f3d5512214fff352479b9b/public/js/uploadComment.js#L13

> else{


> form.submit();


Это неправильно, смотри 2 сценария:

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

Не. это неправильно. Когда я такому учил? Также, я не вижу блокировки формы на время отправки. Я же вроде писал раньше:

-----

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

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

- индикатор прогресса операции
- вывод сообщений об ошибках
- возможность повторить операцию

Сооветственно если ты что-то делаешь через аякс, теперь ты а не браузер обязан реализовать эти возможности. Любой аякс-запрос должен сопровождаться:

- индикацией прогресса. Пользователь должен (не только при аякс запрсе, а всегда) иметь обратную связь и видеть состояние системы: идет обработка данных, успешно обработано, произошла ошибка. Ты можешь не показывать индикатор прогресса только в случаях когда обработка запроса происходит очень быстро (менее 100 мс) - тогда можно сразу показать сообщение с результатом операции.

Сайты с индикаторами: http://www.ajaxload.info/ http://preloaders.net/

- обработкой ошибок. Ошибки могут быть транспортного уровня (пропал интернет, сервер отдал код 500, пришел ответ не ожидаемого типа или формата), так и уровня приложения (сервер ответил что данные в форме заполнены неправильно)

- возможность при некоторых ошибках повторить запрос

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

-----

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

При получении комментариев нет индикатора или обработки ошибок.

> comment.innerHTML = comment.innerHTML.replace("{name}", comments.name);


> comment.innerHTML = comment.innerHTML.replace("{date}", comments.date);


Это копипаста. Учись разделять код на функции. В данном случае надо сделать функцию, полчающую шаблон и набор данных для вставки. Также, я не вижу в твоем коде защиты от XSS. Что если комментарий содержит теги?

Я смотрел только измененный с последней проверки код. Если тебе самому что-то кажется не очень правильным, напиши.
#785 #712515
>>712503
сейчас подумал, что лучше делать вторым способом, т.к. код перебора значений двумерного массива получится проще, чем перебор массива + поиск подстроки по шаблону, а значит меньше вероятность получить ошибку.
#786 #712521
>>712510
Точно, если использовать регексп, то в этом случае вообще можно отказаться от массива и использовать строку. Тогда выбор между строкой + регексп и перебором двумерного массива.
>>714993
#787 #712526
Что будет, если я в поле таблицы бд пропишу определенный тип данных, а скрипт заставлю сохранить в эту таблицу значение другого типа?
>>712602
#788 #712533
>>712455

> Тогда почему ты используешь ее за пределами цикла?


Всмысле? Ну там массив из 3 предложений. Мне надо разбить предложения на слова. То есть когда $i=0, происходят действия над 0 элементом массива, то есть первым предложением. Когда $i=1, то над первым предложением.

> Не очень понятно зачем там implode.


Когда я объединил массив в строку, то заменяет $explodedText, на предложения перевёрнутые.

> Вот это плохая идея.


Как я понял, я сделал этот массив, потом реверснул его и имплодом собрал обратно в строку, нет?
>>712602
#789 #712541
>>702800 (OP)
Анон, сделай ревью кода. Где я наговнокодил и что можно улучшить?
В общем это простенький скрипт автологин на один сайт. Я логинюсь, потом делаю запрос на формирование одного файла, сервер его формирует и отдаёт мне, я его сохраняю.
Ну и проверяю был ли логин успешным - ищу слово "Здравствуйте" в html лапше. Если не найдено, делаю в цикле повторные запросы через каждые 180 секунд в течение часа.
http://ideone.com/oVKpfl
>>712603
#790 #712548
Индексатор сосача. Очень важная и полезная вещь, на которую стоило потратить 2 часа жизни.
Тестировал на этом треде (786 постов): 2.8 секунд на создание индекса, поиск занимает 0.2 секунды.
Конечно, ctrl+f в браузере работает немного быстрее, но тут ведь дело принципа.

Индексер
http://pastebin.com/8LQ7vaDd
Поисковая утилита
http://pastebin.com/TxpRn7AB
Функции
http://pastebin.com/bSWeF3fv
Конфиг
http://pastebin.com/6uai8RQn

Создать папку archive, куда сохранить json треда. Создать папку indexes, куда скрипт будет класть (ложить?) индексы.
Свои пути можно впрочем прописать в конфиге.

>>712458

>Ты возможно не знал, но в первых браузерах была идея что пользователь может сделать свой css файл (и даже несколько. переключаясь между ними) который бы применялся по умолчанию. Соответственно каждый мог бы настраивать вид текста под себя.


Ну конечно не знал. Теперь после этого прозрения я немедленно кинусь писать свои стили под каждый говносайт.

Кстати с этими джейсонами у меня возникла гениальная идея. А на кой вообще сдался html? Давайте пользователям отдавать контент json формате, а они пусть верстают страницу на свой вкус. Или в xml.
Так потихоньку и до нижних уровней osi дойдем.
А то пользователи совсем тупые: хотят зайти на страницу и просто посмотреть ее, ничего не делая.
>>712552>>712603
#791 #712552
>>712548

> Ну конечно не знал. Теперь после этого прозрения я немедленно кинусь писать свои стили под каждый говносайт.


http://motherfuckingwebsite.com
Лучший дизайн, который можно было придумать. Остальное - говно для хипстеров.
Алсо
https://habrahabr.ru/post/278655/
>>712565
#792 #712565
>>712552
Это худший дизайн, который можно было придумать.
Статья совершенно не в тему.

И что за мода на это ебланское "алсо".
>>712603
#793 #712576
ДА КАК БЛЯТЬ ПОДНЯТЬ ЭТОТ ЕБАНЫЙ ПХПШТОРМ??? Я БЛЯТЬ ХОЧУ ЛАБЫ ИЗ ГАЙДА ДЛЯ НЬЮФАГОВ ПОРЕШАТЬ, А НЕ ЕБАТЬСЯ С БИБЛИОТЕКОЙ ДЛЯ МОДУЛЬНОГО ТЕСТИРОВАНИЯ
>>712582>>712603
#794 #712582
>>712576
Помогите мне, год назад ставил Пхпшторм и все было норм, сейчас даже элементарные проги не дает запустить.
Ругается на пхпюнит, я уже половину stackoverflow перерыл, опробованные решения-все равно приводят к ошибке, только уже другой.
>>712585
#795 #712585
>>712582
Нечего его обновлять постоянно, у меня два года стоит пиратская восьмерка.
>>712590
#796 #712590
>>712585
Я и поставил с пиратской бухты 8.0.1
https://github.com/greenTea242/Student-list/ #797 #712598
>>705426

Какой же все таки этот кот интересный.

> У меня коммит не хотел отправляться через gui гитхаб и я немного поспешил с переустановкой всего и вся...


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

> Если я буду передавать параметры массивом в ececute, они все будут приняты, как имеющие тип PDO::PARAM_STR (http://php.net/manual/ru/pdostatement.execute.php), а я так не могу, у меня order и limit должны быть явно указаны PDO::PARAM_INT, иначе будет ошибка. Не понял я тут твой совет, опиши подробней, что ты имел ввиду сделать.



Плохо что переменная не существует. Лучше сделать чтобы если запрос не задан, в переменной была пустая строка например.

> https://github.com/greenTea242/Student-list/blob/master/src/Authorization.php#L44


> header("Location: index.php");


> exit();


Функция должна только разлогинивать но не редиректить. Также, надо защитить разлогинивание от CSRF. У меня в гитхабе есть урок по теме.

https://github.com/greenTea242/Student-list/blob/master/src/ViewHelper.php#L14

> $search = preg_replace("/\\s/u", "%", $search);


лучше заменять любое число пробелов на один символ. И даже более, лучше наверно заменять все кроме букв, цифр на знак %

> static function paintFound($word, $search)


тут ты делаешь несклоько замен. Что если у нас в искомых словах есть слово mark? ты заменишь название тега. Это явно тянет на XSS уязвимсоть. Что если ты после замены нарушишь праила вложенности тегов?

Замену надо делать только один раз. В твоем случае вполне подойдет strtr для этого.

> $totalPages = ceil($counter/$recordsPerPage);


Этот расчет можно поместить в пейджер.

> Вовзращаем пробел (один) поисковой строки для вывода сообщения в шаблоне "вы искали a б", а не "вы искали a%б"


Не, это неправильно. Я думаю, надо тут выводить исходную фразу. Ну или сделать 2 функции, первая которая удаляет лишние символы и вторая которая генерирует строку для LIKE. Вот, точно, так и надо сделать. Мы передаем в маппер (точнее studentGateway) строку поиска или массив слов, а преобразовывать ее в совместимый с базой формат должен он.

То что ты сделал это неправильно. У нас маппер отвечает за все что связано с базой.

> $navigationList = file_get_contents("../templates/inc/navigationMenu1.html");


лучше сделать одно меню, просто с помощью if не выводить те или иные пункты

> /Массив для заполнения модели/


> $values = [


> "name" => "",


> "surname" => "",


> "groupNumber" => "",


Мне кажется проще сделать список полей в виде $fields = ['name', 'surname', ...].

> $gateway->updateAbiturient($abiturient, $abiturientID);


id надо хранить в самой модели

https://github.com/greenTea242/Student-list/blob/master/src/Authorization.php#L13

> setcookie("abiturientID", $this->gateway->getLastInsertID() ,


Это неправильно. У тебя функция работает корректно только если перед этим был в базу вставлен студент. Давай посмотрим на код ее вызова, сразу видно что что-то тут не так:

> $gateway->addAbiturient($abiturient);


> $authorizator->setCookie();


В setCookie ничего не передается и это как минимум странно.

Таких побочных эффектов быть не должно. Метод должен назваться loginStudent и принимать на вход что-нибудь, и работать всегда. Более того, у тебя же уже есть метод login. его и надо использовать.

Также, у тебя нет никакой защиты. id это маленькое число которое легко подобрать злоумышленнику. Надо более серьезную защиту. Чтобы с триллиона попыток не подобрать было.

https://github.com/greenTea242/Student-list/blob/master/src/Abiturient.php#L21
Нет проверки есть ли такое поле в объекте или нет. Так можно любые поля насоздавать. И если опечататься в имени поля то не будет ошибки.

https://github.com/greenTea242/Student-list/blob/master/src/AbiturientValidator.php#L20

> public function createErrorsList($abiturientID)


Нельзя ли тут цикл вместо копипасты поставиь?

https://github.com/greenTea242/Student-list/blob/master/src/ini.php#L10

> include("../templates/error.html");


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

https://github.com/greenTea242/Student-list/blob/master/templates/index.html
https://github.com/greenTea242/Student-list/blob/master/templates/register.html

Тут скопипащена шапка. Избавься от повторов.

> Ты мне в позапрошлом утонувшем треде когда я первый раз выкладывал проект посоветовал сделать следующее:


>> if (!empty($notify) == "registred") (мой код)


>> Кстати можно сделать нотификации константами


> Ну я вот неправильно и отреагировал. Как это правильно сделать?


Я имел в виду константы для обозначения видов нотификации:

class Notifications
{
const NOTIFY_REGISTERED = 'registered'; // или цифра
consy NOTIFY_UPDATED = 'updated';
}

Таким образом у тебя в одном месте сосредоточено все, что относится к нотификациям, и не надо гадать как называется та или иная нотификация.

Вообще, когда у тебя есть выбор из несколькиз вариантов чего-то, тебе могут пригодиться константы.

>> Тут есть риск из-за того что диалект регулярок в HTML5 и в PHP вроде как не совпадает.


> Соответственно легко при редактировании кода получить не работающую на клиенте регулрку. Возможно стоит сдеалать по 2 версии регулярки или еще что-то придумать.


> Чем? Все элементы которые я использовал, есть и в html5 паттернах, и в php регулярках.


Ты будешь редактировать и забудьешь что регулярка используется на клиенте например. На практике нам скорее всего придется держать 2 копии регулярки. Или хотя бы предупреждение поставь в комментарии.

> Вот у меня два раза повторяется строка <p><a href="<?=$_SERVER['PHP_SELF']?>">Показать всех абитуриентов.</a></p>, но в том и смысл, что это всего лишь одна строка.


Можно оставить так

> Я решил удалить abiturientID из модели, потому что я не мог его получать до до добавления в базу и необходимость хранить его в модели отпало. Поэтому до добавления в базу вместо него используется пустое значение, а после – я достаю его из куки и добавляю в отдельную от модели переменную.


да ну, ид это часть модели и должна храниться в ней. Тебе не надо получать его до вставки - вполне можно оставить его пустым, а после вставки пусть ему проставляется id.

Ну а иначе как-то нелогично, у тебя часть информации в модели, а часть отдельно.

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


Ну вот видишь как все плохо.
https://github.com/greenTea242/Student-list/ #797 #712598
>>705426

Какой же все таки этот кот интересный.

> У меня коммит не хотел отправляться через gui гитхаб и я немного поспешил с переустановкой всего и вся...


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

> Если я буду передавать параметры массивом в ececute, они все будут приняты, как имеющие тип PDO::PARAM_STR (http://php.net/manual/ru/pdostatement.execute.php), а я так не могу, у меня order и limit должны быть явно указаны PDO::PARAM_INT, иначе будет ошибка. Не понял я тут твой совет, опиши подробней, что ты имел ввиду сделать.



Плохо что переменная не существует. Лучше сделать чтобы если запрос не задан, в переменной была пустая строка например.

> https://github.com/greenTea242/Student-list/blob/master/src/Authorization.php#L44


> header("Location: index.php");


> exit();


Функция должна только разлогинивать но не редиректить. Также, надо защитить разлогинивание от CSRF. У меня в гитхабе есть урок по теме.

https://github.com/greenTea242/Student-list/blob/master/src/ViewHelper.php#L14

> $search = preg_replace("/\\s/u", "%", $search);


лучше заменять любое число пробелов на один символ. И даже более, лучше наверно заменять все кроме букв, цифр на знак %

> static function paintFound($word, $search)


тут ты делаешь несклоько замен. Что если у нас в искомых словах есть слово mark? ты заменишь название тега. Это явно тянет на XSS уязвимсоть. Что если ты после замены нарушишь праила вложенности тегов?

Замену надо делать только один раз. В твоем случае вполне подойдет strtr для этого.

> $totalPages = ceil($counter/$recordsPerPage);


Этот расчет можно поместить в пейджер.

> Вовзращаем пробел (один) поисковой строки для вывода сообщения в шаблоне "вы искали a б", а не "вы искали a%б"


Не, это неправильно. Я думаю, надо тут выводить исходную фразу. Ну или сделать 2 функции, первая которая удаляет лишние символы и вторая которая генерирует строку для LIKE. Вот, точно, так и надо сделать. Мы передаем в маппер (точнее studentGateway) строку поиска или массив слов, а преобразовывать ее в совместимый с базой формат должен он.

То что ты сделал это неправильно. У нас маппер отвечает за все что связано с базой.

> $navigationList = file_get_contents("../templates/inc/navigationMenu1.html");


лучше сделать одно меню, просто с помощью if не выводить те или иные пункты

> /Массив для заполнения модели/


> $values = [


> "name" => "",


> "surname" => "",


> "groupNumber" => "",


Мне кажется проще сделать список полей в виде $fields = ['name', 'surname', ...].

> $gateway->updateAbiturient($abiturient, $abiturientID);


id надо хранить в самой модели

https://github.com/greenTea242/Student-list/blob/master/src/Authorization.php#L13

> setcookie("abiturientID", $this->gateway->getLastInsertID() ,


Это неправильно. У тебя функция работает корректно только если перед этим был в базу вставлен студент. Давай посмотрим на код ее вызова, сразу видно что что-то тут не так:

> $gateway->addAbiturient($abiturient);


> $authorizator->setCookie();


В setCookie ничего не передается и это как минимум странно.

Таких побочных эффектов быть не должно. Метод должен назваться loginStudent и принимать на вход что-нибудь, и работать всегда. Более того, у тебя же уже есть метод login. его и надо использовать.

Также, у тебя нет никакой защиты. id это маленькое число которое легко подобрать злоумышленнику. Надо более серьезную защиту. Чтобы с триллиона попыток не подобрать было.

https://github.com/greenTea242/Student-list/blob/master/src/Abiturient.php#L21
Нет проверки есть ли такое поле в объекте или нет. Так можно любые поля насоздавать. И если опечататься в имени поля то не будет ошибки.

https://github.com/greenTea242/Student-list/blob/master/src/AbiturientValidator.php#L20

> public function createErrorsList($abiturientID)


Нельзя ли тут цикл вместо копипасты поставиь?

https://github.com/greenTea242/Student-list/blob/master/src/ini.php#L10

> include("../templates/error.html");


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

https://github.com/greenTea242/Student-list/blob/master/templates/index.html
https://github.com/greenTea242/Student-list/blob/master/templates/register.html

Тут скопипащена шапка. Избавься от повторов.

> Ты мне в позапрошлом утонувшем треде когда я первый раз выкладывал проект посоветовал сделать следующее:


>> if (!empty($notify) == "registred") (мой код)


>> Кстати можно сделать нотификации константами


> Ну я вот неправильно и отреагировал. Как это правильно сделать?


Я имел в виду константы для обозначения видов нотификации:

class Notifications
{
const NOTIFY_REGISTERED = 'registered'; // или цифра
consy NOTIFY_UPDATED = 'updated';
}

Таким образом у тебя в одном месте сосредоточено все, что относится к нотификациям, и не надо гадать как называется та или иная нотификация.

Вообще, когда у тебя есть выбор из несколькиз вариантов чего-то, тебе могут пригодиться константы.

>> Тут есть риск из-за того что диалект регулярок в HTML5 и в PHP вроде как не совпадает.


> Соответственно легко при редактировании кода получить не работающую на клиенте регулрку. Возможно стоит сдеалать по 2 версии регулярки или еще что-то придумать.


> Чем? Все элементы которые я использовал, есть и в html5 паттернах, и в php регулярках.


Ты будешь редактировать и забудьешь что регулярка используется на клиенте например. На практике нам скорее всего придется держать 2 копии регулярки. Или хотя бы предупреждение поставь в комментарии.

> Вот у меня два раза повторяется строка <p><a href="<?=$_SERVER['PHP_SELF']?>">Показать всех абитуриентов.</a></p>, но в том и смысл, что это всего лишь одна строка.


Можно оставить так

> Я решил удалить abiturientID из модели, потому что я не мог его получать до до добавления в базу и необходимость хранить его в модели отпало. Поэтому до добавления в базу вместо него используется пустое значение, а после – я достаю его из куки и добавляю в отдельную от модели переменную.


да ну, ид это часть модели и должна храниться в ней. Тебе не надо получать его до вставки - вполне можно оставить его пустым, а после вставки пусть ему проставляется id.

Ну а иначе как-то нелогично, у тебя часть информации в модели, а часть отдельно.

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


Ну вот видишь как все плохо.
>>720177
Ответы 1 марта #798 #712599
>>705552

> 1. Папка vendor и ей подобные нужны ли в репозитории?


нет, ее создаст композер при установке

> То же самое касается папки кеша и логгера.


нужны

> Гитигноры добавлять в репозиторий?


да. А то, что, каждый будет свой писать? не надо так.

> С другой стороны возможно он


> будет работать в другом редакторе, который оставляет после себя другой мусор.


> Например phpstorm создает .idea, нетбинс что-то анологичное, гедит и вимы если не ошибаюсь


> временные файлы с тильдой на конце.


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

>>706281

>> function inclineWord. Также, ты не учел в этой функции что для чисел 11-19 используется другое окончание: 11 котов, а не 11 кот.


> В этой функции это учтено


нет, не учтено. Я смотрю на код функции inclineWord() и не вижу этого. Выбором формы слова должна заниматься одна функция, этот алгоритм не должен быть размазан поразным местам кода. А у тебя часть логики в другой функции. Надо чтобы inclideWord передавалось число без всякой подготовки.

> foreach($level as $declension => $discharge) {


Странное название переменной $declension так как в массиве level ключ это просто номер.

> if ($number == 0) {


> $text = " ноль рублей";


> }


Почему это внутри цикла? Там пишут действия которые надо делать несколько раз.

> $text = $text.' '.$spelling[$numberInArray];


текст наверно удобнее складывать в массив и потом склеивать implode, разве нет? Это сделает код чище и тебе не надо отсчитывать с какой строны ставить пробел.

> if ($discharge <= 9 || $discharge % 10 == 0) {


> $i = 1;


Нужно название дать нормальное для переменной. Ну и вообще, тут switch не нужен, нужен if/else.

> if ($aboveZero == true) {


Эта переменная не нужна. Если в текущей группе цифр нули, можно просто пропустить шаг цикла через continue.
Ответы 1 марта #798 #712599
>>705552

> 1. Папка vendor и ей подобные нужны ли в репозитории?


нет, ее создаст композер при установке

> То же самое касается папки кеша и логгера.


нужны

> Гитигноры добавлять в репозиторий?


да. А то, что, каждый будет свой писать? не надо так.

> С другой стороны возможно он


> будет работать в другом редакторе, который оставляет после себя другой мусор.


> Например phpstorm создает .idea, нетбинс что-то анологичное, гедит и вимы если не ошибаюсь


> временные файлы с тильдой на конце.


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

>>706281

>> function inclineWord. Также, ты не учел в этой функции что для чисел 11-19 используется другое окончание: 11 котов, а не 11 кот.


> В этой функции это учтено


нет, не учтено. Я смотрю на код функции inclineWord() и не вижу этого. Выбором формы слова должна заниматься одна функция, этот алгоритм не должен быть размазан поразным местам кода. А у тебя часть логики в другой функции. Надо чтобы inclideWord передавалось число без всякой подготовки.

> foreach($level as $declension => $discharge) {


Странное название переменной $declension так как в массиве level ключ это просто номер.

> if ($number == 0) {


> $text = " ноль рублей";


> }


Почему это внутри цикла? Там пишут действия которые надо делать несколько раз.

> $text = $text.' '.$spelling[$numberInArray];


текст наверно удобнее складывать в массив и потом склеивать implode, разве нет? Это сделает код чище и тебе не надо отсчитывать с какой строны ставить пробел.

> if ($discharge <= 9 || $discharge % 10 == 0) {


> $i = 1;


Нужно название дать нормальное для переменной. Ну и вообще, тут switch не нужен, нужен if/else.

> if ($aboveZero == true) {


Эта переменная не нужна. Если в текущей группе цифр нули, можно просто пропустить шаг цикла через continue.
>>714673
Ответ 2-3 марта #799 #712600
>>706531

> думает что у любого проекта есть подробная и актуальная документация с работающими примерами


Ох ты и наивняша

>>706818

> public function getSalary()


Не нужен, нужны просто методы возвращающие общие показатели. Класс не должен ничего знать про вывод таблицы, он должен быть более универсальным. Вывод таблицы не его дело.

> public function getNormalHours() {


> public function getOvertimeHours() {


Одну из них можно выразить через другую

> function padRight($x, $y){


str_repeat

>>706823

не знаю

>>706828

не используй BIT в качесте булева значения. Ему надо значение в каком-то особом формате передавать.

>>707000

Не нужно делать портфолио. Ты не дизайнер же. Изучи какой-нибудь фреймворк и на нем сделай сайт. Идею - не знаю, если ты тесты не хочешь по придумай сам что-нибудь. Вот какое приложение тебе бы хотелось иметь? Может есть что-то?
Ответ 2-3 марта #799 #712600
>>706531

> думает что у любого проекта есть подробная и актуальная документация с работающими примерами


Ох ты и наивняша

>>706818

> public function getSalary()


Не нужен, нужны просто методы возвращающие общие показатели. Класс не должен ничего знать про вывод таблицы, он должен быть более универсальным. Вывод таблицы не его дело.

> public function getNormalHours() {


> public function getOvertimeHours() {


Одну из них можно выразить через другую

> function padRight($x, $y){


str_repeat

>>706823

не знаю

>>706828

не используй BIT в качесте булева значения. Ему надо значение в каком-то особом формате передавать.

>>707000

Не нужно делать портфолио. Ты не дизайнер же. Изучи какой-нибудь фреймворк и на нем сделай сайт. Идею - не знаю, если ты тесты не хочешь по придумай сам что-нибудь. Вот какое приложение тебе бы хотелось иметь? Может есть что-то?
Ответы 3-4 марта #800 #712601
>>707157

на линуксе не нужны сборки.

>>707684

Значит надо переделать маршрутизацию

>>708888

По кукам начни с википедии. По сессиям мануал пхп.

>>709100

Выведи чему равен $page и посмотри

>>709165

Также используй тег title чтобы задать пояснение выводящееся при ошибке валидации.

>>709226

не знаю

>>709276

Заведи переменную, положи в нее 1. Если буквы не совпали, кладешь 0 и выходишь из цикла. В конце смотришь что в ней лежит.
Ответы 3-4 марта #800 #712601
>>707157

на линуксе не нужны сборки.

>>707684

Значит надо переделать маршрутизацию

>>708888

По кукам начни с википедии. По сессиям мануал пхп.

>>709100

Выведи чему равен $page и посмотри

>>709165

Также используй тег title чтобы задать пояснение выводящееся при ошибке валидации.

>>709226

не знаю

>>709276

Заведи переменную, положи в нее 1. Если буквы не совпали, кладешь 0 и выходишь из цикла. В конце смотришь что в ней лежит.
Ответы 6 марта #801 #712602
>>709305

нанять верстальщика

>>709557

мануал пояснит

>>712526

В строгом режиме mysql ошибка. в том что по умолчанию - предупреждение которое проигнорируется и данные будут приведены к нужному типу.

>>712533

> > Не очень понятно зачем там implode.


> Когда я объединил массив в строку, то заменяет $explodedText, на предложения перевёрнутые.


Нет вопрос, почему ты пшешь код после return который выходит из функции

> > Вот это плохая идея.


> Как я понял, я сделал этот массив, потом реверснул его и имплодом собрал обратно в строку, нет?


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

> Всмысле? Ну там массив из 3 предложений. Мне надо разбить предложения на слова. То есть когда $i=0, происходят действия над 0 элементом массива, то есть первым предложением. Когда $i=1, то над первым предложением.


ну это внутри цикла. А после того как цикл завершился - какой смысл использовать счетчик? код после цикла выполняется ровно один раз.
>>712700
#802 #712603
>>712541

Не писать стену кода. Использовать готовый http клиент вместо курл.

>>712548

> Теперь после этого прозрения я немедленно кинусь писать свои стили под каждый говносайт.


Нет, идея была в том что ты пишешь стили одни раз для любых сайтов если они состоят из обычного HTML. Просто пишешь свои стили для стандартных тегов HTML.

Ведь на момент появления CSS он еще не использовался ни на одном сайте. Не вина авторов веб страниц что по умолчанию хтмл без стилей смотрится не очень красиво. На том же андроиде вроде стили по умолчанию чуть получше и текст более читаем.

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

Ты trim делать для поискового запроса не забыл?

> Очень важная и полезная вещь, на которую стоило потратить 2 часа жизни.


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

> А на кой вообще сдался html? Давайте пользователям отдавать контент json формате, а они пусть верстают страницу на свой вкус. Или в xml.


Ну HTML по моему для разметки текста лучше подходит. Ты замучаешься кавычки ставить и запятые в джейсоне. А насчет XML - сам по себе XML не определяет значения тегов. Была идея сделать XHTML, это как HTML только на основе XML со строгими правилами ( подробнее http://softwaremaniacs.org/blog/category/xhtml-vs-html/ ) - вот итог: http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/

Просто в то время был популярен XML, XSLT, все это. Так-то идея неплохая. мне вообще нравится строгий режим проверки кода в нем. Но видишь, этот строгий режим был бы для всех. А в случае с HTML он опционален - хочешь, ставишь на сервер проверялку и проверяешь, не хочешь - пишешь как хочешь.

>>712565

Почему худший? Текст есть? Есть. Что еще надо.

>>712576

Возьми пока нотепад++. Или удали модуль для модульного тестирования в настройках.
#802 #712603
>>712541

Не писать стену кода. Использовать готовый http клиент вместо курл.

>>712548

> Теперь после этого прозрения я немедленно кинусь писать свои стили под каждый говносайт.


Нет, идея была в том что ты пишешь стили одни раз для любых сайтов если они состоят из обычного HTML. Просто пишешь свои стили для стандартных тегов HTML.

Ведь на момент появления CSS он еще не использовался ни на одном сайте. Не вина авторов веб страниц что по умолчанию хтмл без стилей смотрится не очень красиво. На том же андроиде вроде стили по умолчанию чуть получше и текст более читаем.

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

Ты trim делать для поискового запроса не забыл?

> Очень важная и полезная вещь, на которую стоило потратить 2 часа жизни.


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

> А на кой вообще сдался html? Давайте пользователям отдавать контент json формате, а они пусть верстают страницу на свой вкус. Или в xml.


Ну HTML по моему для разметки текста лучше подходит. Ты замучаешься кавычки ставить и запятые в джейсоне. А насчет XML - сам по себе XML не определяет значения тегов. Была идея сделать XHTML, это как HTML только на основе XML со строгими правилами ( подробнее http://softwaremaniacs.org/blog/category/xhtml-vs-html/ ) - вот итог: http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/

Просто в то время был популярен XML, XSLT, все это. Так-то идея неплохая. мне вообще нравится строгий режим проверки кода в нем. Но видишь, этот строгий режим был бы для всех. А в случае с HTML он опционален - хочешь, ставишь на сервер проверялку и проверяешь, не хочешь - пишешь как хочешь.

>>712565

Почему худший? Текст есть? Есть. Что еще надо.

>>712576

Возьми пока нотепад++. Или удали модуль для модульного тестирования в настройках.
>>712608
#803 #712608
>>712603

> Не писать стену кода. Использовать готовый http клиент вместо курл.


Какой, например? Что бы ты использовал для такой задачи?
>>712610
#804 #712610
>>712608
Погугли, выбери 3 самых популярных, а мы подскажем на каком остановиться.
>>712628
#805 #712628
>>712610
Guzzle
Httpful
Zend_Http_Client
>>712634
#806 #712634
>>712628

Гузель норм.
#807 #712700
>>712602
http://ideone.com/Co0mda
Вот, попробовал описать, как я понимаю программу. Если не сложно, скажите, что я не так понимаю?
#808 #712713
>>712700

> return ($explodedText); / Заменяю начальный массив из предложений, на получившийся /


команда return выходит из функции. Код после нее не выполняется.
>>712732
#809 #712714
>>712700

Возможно ты подумал что команда return просто задает значение, которое в будущем вернет функция. Не так. Она и задает значение, и сразу же выходит из функции.
>>712732
#810 #712721
>>712700

Также, вот еще ошибки. Как известно, тело цикла выполняется несколько раз, столько раз, сколько у тебя предложений в тексте.

Вот эта вот команда:

> $reverseText=array_reverse($explodedText2[$i]);



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

Реши дополнительные задачи, которые я советовал выше: >>712454
>>712732
#811 #712732
>>712713
>>712714
Т.е. после return ($explodedText) начальная переменная $explodedText заменяется на данную и функция дальше не идёт?
>>712721
Забыл. Вот первая, так?
http://ideone.com/42W5ak
>>712745
#812 #712745
>>712732

return ничего не заменяет. Он выходит из функции и возвращает указанное после него значение. Куда попадет это значение зависит от того как вызвана функция.

В твоем случае оно попадет в глобальную переменню $yodaText

> Забыл. Вот первая, так?


В задании требуется работать с любым количеством чисел. Твоя функция работает только с 3 числами.

на вход функции подаются не числа по отдельности, а массив с ними.

Также, тут функция работает неправильно: http://ideone.com/jabD3h - должно получиться 12.

У меня ощущение что ты пропустил предыдущие темы. Тему про функции, про массивы, явно же видно что ты в них путаешься. Если так, то надо вернуться и решить задачки из этих уроков. А только потом делать задачу про Йоду.
>>712924
358 Кб, 1280x1707
#813 #712769
>>702800 (OP)
Ребята, а как и с помощью чего можно реализовать следующий функционал на PHP:
Есть одно веб приложение.
Нужно создать нечто, примерно как в покерных румах. То бишь лобби, возможность в него войти, по согласию сторон начать некое действо, по окончанию действа извлечь результат и раздать фантики победителю.
Есть годные фрймворки, гайды или советы по данному поводу ?
>>714993
Задача про студентов #814 #712781
"После регистрации сайт должен вместо формы регистрации показывать форму редактирования своих данных."

Как реализуется эта замена?
>>712785
#815 #712785
>>712781
Проверяешь, залогинен ли пользователь, если да, то выбираешь из базы его информацию и подставляешь в атрибут value тега input
>>712788
#816 #712788
>>712785
Это я понимаю. Я имел в виду другой момент.

У меня есть файл, к примеру, register.php с формой регистрации. Как мне в этот же файл запихнуть форму с данными студента, чтобы после его авторизации старая форма исчезала, а форма с данными студента появлялась?
>>712794>>712795
#817 #712794
>>712788
Это по сути одна и та же форма.

И условную конструкцию в шаблонах тоже никто не отменял.
Почему в этот же? Про require/include не слышал?
>>712796
#818 #712795
>>712788
Используй одну и ту же форму для регистрации и редактирования. На одной странице. Если пользователь залогинен - заполняй форму его данными. Ну и в контроллере ты тоже будешь проверять, если пользователь не залогинен - создаешь новую запись и залогиниваешь пользователя, если он залогинен - обновляешь старую запись.
>>712800
#819 #712796
>>712794

>Почему в этот же? Про require/include не слышал?



Слышал, но мне хочется обойтись одним файлом.

>И условную конструкцию в шаблонах тоже никто не отменял.



if/else? Или про что ты?
#820 #712800
>>712795

>Используй одну и ту же форму для регистрации и редактирования. На одной странице. Если пользователь залогинен - заполняй форму его данными.



В форме регистрации всего 2 поля, а в форме с данными студента - 8
>>712811
#821 #712811
>>712800

Нет. Там в форме регистрации столько же полей. Перечитай задание:

> Он состоит из 2 страниц: список зарегистрированных абитуриентов (главная страница) и форма ввода/редактирования информации о себе.



> Форма содержит поля: имя, фамилия, пол, номер группы (от 2 до 5 цифр или букв), e-mail (должен быть уникален), суммарное число баллов на ЕГЭ (проверять на адекватность), год рождения, местный или иногородний

>>712831
#822 #712831
>>712811
Хорошо, с задачей понятно. Но мне все равно интересно, как можно реализовать смену форм или другого контента, если обе формы находятся в одном файле?
>>712862>>712908
#823 #712862
>>712831

Это одна и та же форма. В случае регистрации она пустая, в случае редактирования профиля она уже заполнена данными студента.
>>712878
#824 #712878
>>712862
Забудь про задачу. Есть контент А и контент B в одном файле. Если ты гость, то видишь только контент А. Как только ты вошел, то страница обновляется и ты видишь только контент В. Такую систему можно реализовать? Как это сделать?

echo не подходит, ибо контент объемный
>>712908>>714993
#825 #712908
>>712831
Это очень сложная задача. Давай попробуем решить вместе.
Допустим, есть число
$a = 10;
Тебе нужно вывести "А больше нуля!", если $a больше 0, иначе вывести "А не больше нуля...".
Справишься?

Потом попробуем вместо $a подставить какой-нибудь html-тег. Возможно это даст ключ к решению головоломки с выводом блока верстки по условию.

Может ты не понимаешь как вообще работает php и веб-сервер, из-за этого такие странные вопросы?
Веб-сервер это такая программа, которая постоянно запущена в фоновом режиме на "сервере" (компьютере, где установлен сайт грубо говоря).
Такие программы в виндоус называют службами, а в линуксах демонами.
Веб-сервер постоянно запущен и ждет события, когда произойдет к нему обращение (говорят: сервер слушает соединения).
Обращаются к серверу клиенты. Под клиентами обычно подразумеваются браузеры пользователей.
Когда ты вбиваешь в адресной строке своего браузера http://site.name/index.php, происходит следующее:
браузер сначала обращается к dns-серверу твоего провайдера. Dns-сервер это такая специальная машина, которая отвечает за сопоставление доменных имен типа site.name реальным ip-адресам узлов сети. Под узлами я подразумеваю компьютеры, объединенные в сеть.
Браузер получает от dns-сервера ip-адрес узла site.name и соединяется с ним по http-протоколу, который тебе понадобится в дальнейшем тоже знать.
То есть отправляет запрос в виде строки типа
GET /index.php HTTP/1.1
Host: site.name

Клиент просит у сервера файл /index.php, находящийся в корневой директории сервера. В линуксе нет дисков типа C:, D:, там адреса вида /home/user.
В настройках сервера прописано, если у него попросят файл с расширением .php, нужно запустить программу-интерпретатор php, и ждать от нее строку с результатом.
Php запускается и начинает выполнять программу. Производит всякие вычисления. Когда натыкается на echo или другой вывод, отдает серверу, а тот пуляет браузеру. Браузер начинает потихоньку отрисовывать страницу.

Допустим, у тебя в index.php стоит следующее:
...
<body>
echo "Сегодняшнее число: " . date("d-m-Y");
</body>
...
Php отдаст как есть html-теги, а когда дойдет до выражения, которое нужно вычислить и отобразить, он его вычислит и отдаст полученный результат как строку.
Получится строка "Сегодняшнее число: 10-04-2016".
Естественно можно использовать любые вычисления, условия, циклы и так далее, чтобы сформировать конечный html, который будет возвращен браузеру.
Попробуй создать страницу, которая в понедельник пишет: "сегодня первый день недели", во вторник - второй и т.д.

>>712878
Забудь про echo в шаблонах. Оно вообще нужно разве что для консоли, но вряд ли ты до нее скоро доберешься.
http://php.net/manual/ru/control-structures.alternative-syntax.php
#825 #712908
>>712831
Это очень сложная задача. Давай попробуем решить вместе.
Допустим, есть число
$a = 10;
Тебе нужно вывести "А больше нуля!", если $a больше 0, иначе вывести "А не больше нуля...".
Справишься?

Потом попробуем вместо $a подставить какой-нибудь html-тег. Возможно это даст ключ к решению головоломки с выводом блока верстки по условию.

Может ты не понимаешь как вообще работает php и веб-сервер, из-за этого такие странные вопросы?
Веб-сервер это такая программа, которая постоянно запущена в фоновом режиме на "сервере" (компьютере, где установлен сайт грубо говоря).
Такие программы в виндоус называют службами, а в линуксах демонами.
Веб-сервер постоянно запущен и ждет события, когда произойдет к нему обращение (говорят: сервер слушает соединения).
Обращаются к серверу клиенты. Под клиентами обычно подразумеваются браузеры пользователей.
Когда ты вбиваешь в адресной строке своего браузера http://site.name/index.php, происходит следующее:
браузер сначала обращается к dns-серверу твоего провайдера. Dns-сервер это такая специальная машина, которая отвечает за сопоставление доменных имен типа site.name реальным ip-адресам узлов сети. Под узлами я подразумеваю компьютеры, объединенные в сеть.
Браузер получает от dns-сервера ip-адрес узла site.name и соединяется с ним по http-протоколу, который тебе понадобится в дальнейшем тоже знать.
То есть отправляет запрос в виде строки типа
GET /index.php HTTP/1.1
Host: site.name

Клиент просит у сервера файл /index.php, находящийся в корневой директории сервера. В линуксе нет дисков типа C:, D:, там адреса вида /home/user.
В настройках сервера прописано, если у него попросят файл с расширением .php, нужно запустить программу-интерпретатор php, и ждать от нее строку с результатом.
Php запускается и начинает выполнять программу. Производит всякие вычисления. Когда натыкается на echo или другой вывод, отдает серверу, а тот пуляет браузеру. Браузер начинает потихоньку отрисовывать страницу.

Допустим, у тебя в index.php стоит следующее:
...
<body>
echo "Сегодняшнее число: " . date("d-m-Y");
</body>
...
Php отдаст как есть html-теги, а когда дойдет до выражения, которое нужно вычислить и отобразить, он его вычислит и отдаст полученный результат как строку.
Получится строка "Сегодняшнее число: 10-04-2016".
Естественно можно использовать любые вычисления, условия, циклы и так далее, чтобы сформировать конечный html, который будет возвращен браузеру.
Попробуй создать страницу, которая в понедельник пишет: "сегодня первый день недели", во вторник - второй и т.д.

>>712878
Забудь про echo в шаблонах. Оно вообще нужно разве что для консоли, но вряд ли ты до нее скоро доберешься.
http://php.net/manual/ru/control-structures.alternative-syntax.php
#826 #712917
Так, внимание, очень серьезный вопрос по CSS.
Обычно мы пишем что-то типа
.link-social--facebook { background-image: url(sprite.png)} // тут из спрайта берем иконку фейсбука
.btn--next { background-image: url(sprite.png)} // тут стрелочку влево
.p-quote { background-image: url(sprite.png)} // тут фигурные кавычки или еще что-то
То есть в разных компонентах назначаем одно и тоже правило.
Насколько разумно будет вот такие объединения использовать?
.link-social--facebook, .btn--next, .p-quote, .list:after
{ background-image: url(sprite.png)}
>>714993
#827 #712924
>>712745
Про return понял, спасибо. Ну пойду читать заново тогда.
28 Кб, 367x367
#828 #712941
Читаю РНР5 в подлиннике, и назрел вопрос - нужно ли учить регэкспы или они нахуй не нужны в реальной работе?
#829 #712943
>>712941
Нужны конечно. Там особо и учить нечего, за пару дней можно осилить.
#830 #712948
>>712941
Каком-таком подлиннике? Сишные сорцы что ли?
>>712954
39 Кб, 264x400
#831 #712954
>>713092
#832 #713092
>>712954
Чё-т ржу.
130 Кб, 499x499
#833 #713110
>>712941
Нужны конечно. Сколько страниц прочитал? Меня на 200 хватило, потом на официальную документацию перешел. Котеров и Костарев конечно хорошие люди, но воду льют просто пиздец.
Мой совет: смешивай изучение верстки, Js и PHP. Начинай с ModX с упором на верстку, постепенно изучай Js и читай книги про PHP. Ковыряй код ModX, пробуй делать вставки своего кода. Через 3 месяца пробуй пилить сайт на голом PHP. Еще через 3 переходи на фреймворк Laravel, ООП и шаблоны проектирования, пробуй пилить сайт на фрейворке. В итоге через полгода ежедневного 8-ми часового труда ты будешь хоть немного знать азы. Находи время поизучать такие штуки как еmmet, regexp, sql, xml, REST, http, CGI, ajax, json, orm.
Думаю что это оптимальный путь.
>>713115>>713121
#834 #713115
>>713110

laravel весь на статических методах, active record, глобальном состонянии - вряд ли хорошему научит начинающего. Люди потом пишут весь код на статических методах.
>>713125
#835 #713121
>>713110

>еmmet


Не нужно
>>713125
#836 #713125
>>713115
Люди пишут "толстые тупые уродливые контроллеры". Не понимаю чем не устраивают статические методы. У Laravel большое комьюнити и тонны ответов на все вопросы.
>>713121
Нужно, даже очень.
>>713131>>713208
#837 #713131
>>713125
Постоянно дрочить таб и ждать пока этот тормоз развернет ненужные сопли из скобок и точек с запятыми? Зачем, если есть препроцессоры которые помимо своих основных функций делают тоже самое в фоне, а сам ты наслаждаешься чистым минималистичным кодом?
>>713208>>714993
#838 #713208
>>713125
Контроллеры конечно должны быть тонкими, всю логику выносить в модели и сервисы.
По поводу статических классов, то это же процедурный подход вместо ооп.
ооп означает, что у нас есть объекты и связи между ними. Нет объектов - нет ооп.
И тестировать это дело очень неудобно.

Последнее время в треде стало модным когда лень писать много букв (или хочется что-то сказать, но не хватает мозгов) тыкнуть ссылкой в нагугленную хабростатью. Последую тенденции
http://devcolibri.com/720
https://habrahabr.ru/post/169301/

>>713131
Хуй знает (он все знает), сколько плагинов ты навешал на несчастную ide, если тормозит даже emmet.
Препроцессоры используются верстальщиками для "ускорения разработки", что значит нужно наклепать побольше говносайтов в день, чтобы дотянуть хоть до средней зарплаты.
У нас тут больше уклон в программирование, поэтому less/sass мало кто пользуется, а вот эммет действительно незаменим.
Хотя учить там нечего, не знаю зачем аниме привело его в качестве важного пункта к изучению, скорее гит нужно было отметить в первую очередь.
И джейсона вся спецификация одна страничка, это же не yaml.
http://www.json.org/json-ru.html
>>714993
#839 #713292
>>712941

> РНР5


Уже 7, а ты всё 5 читаешь.
#840 #713321
ребят, а где вы задачки по ПХП берете?
мне бы для начинающих
>>713328>>713411
#841 #713328
>>713321
из оп поста
>>713332
#842 #713332
>>713328
мне мало этих задач
#843 #713403
>>713332
Сначала эти-то сделай.
#844 #713411
>>713321
>>713332
Удваиваю вопрос. Давно интересует вопрос о возможности создания генератора задач и решений к ним на различных языках программирования.
#845 #713440
Пацаны, а вот это нормальная практика?
body {
font-family: 'Roboto'
}
Просто если большинство текста на странице этим шрифтом писать его очень утомительно каждому классу. Но я где-то слышал что взрослые дядьки вообще селекторами тегов не советуют пользоваться
>>713448>>713463
#846 #713448
>>713440
Контейнеру лучше допиши класс. В body обычно только margin и padding в ноль выставляют.

>Но я где-то слышал что взрослые дядьки вообще селекторами тегов не советуют пользоваться


С ума сойдешь потому что потом переверстывать.

>Просто если большинство текста на странице этим шрифтом писать его очень утомительно каждому классу.


Можешь классы перечислить через запятую и задать шрифт в одном месте.

Вообще много способов. Верстка - это вообще костыльное дело.
>>713463
#847 #713459
>>712941
Нужны. В реальном коде часто встречаются, а если ты их не знаешь, то будешь в чужие регэкспы как баран смотреть. Сам так раньше постоянно накалывался, пока не выучил.
#848 #713463
>>713448
>>713440

Основной шрифт страницы, его размер, интервал, цвет как раз задают на body или html. Какой еще костыль? Так и задумано.

>>713332

Напиши на какую тему нужны задачки, придумаем еще.
>>713489
#849 #713489
>>713463
базовые, дабы в начале руку набить (на массивы, циклы, переменные...)
>>714994
#850 #713490
>>712486

>Нет, это все производные величины и не надо их хранить в свойствах. Иначе ты замучаешься их пересчитывать при добавлении, увольнении и изменении данных сотрудников.


Хм, верно. Я просто подумал, что удобнее было бы их вывести и сделать полями/свойствами класса, чтобы потом обращаться к ним вот так: $this->purchaseDepartmentSalary.
Действительно, экономим на многом в этом случае.

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


Пока сие вообще неподвластно мне.

>> Мы можем наследовать от класса Сотрудник классы по каждой профессии. Далее можно включить любую другую профессию, так же унаследовав её от Сотрудника.


>Можем но тогда нельзя будет менять профессию.


Я вообще не понимаю, как можно менять профессию, когда у меня такое идиотское создание самих сотрудников.

>Сделай массив вида


>$people = ['3xМе2', '5Ан2'];


>Или строку:


>$people = "3xМе2, 5xАн2";


Как можно сделать создание сотрудников из массива, в принципе, понятно, но кажется это каким-то переусложнением.
Хотя...
Нужен цикл foreach, регулярка, которая достаёт часть до знака умножения и множит на неё константу с профессией работника, потреблением кофе, производством количества страниц. Туда же можно дописать, является ли боссом, как тут братишка выше писал.
Спасибо за идею.
С функциями с get... и set... вроде бы тоже сообразил, спасибо.

>>public function getCoffeeByProfession($coffeeByProfession){


>Что делает этот метод? Напиши потому что я не понял из названия. "получить потребление кофе зная профессию". А зачем в него что-то передавать если работник и так должен знать сам сколько он кофе потребляет?


Ну, у меня в цикле создавались, допустим, 9 менеджеров, этот метод прописывал им всем их потребление кофе.
Я вроде бы как раз следовал предыдущему твоему совету максимально автоматизировать создание сотрудника.
А при этом не сделал аналогичный метод для установки базовой зарплаты, потому что её может потребоваться изменять вручную в каждом конкретном случае.

>В моем понимании дложно быть либо поле хранящее текущее потребление кофе, либо метод возвращающий его. Без аргументов.


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

>Ну и давай делай уже объект Департамента.


>То что у тебя - это просто массив работников, это не Департамент.


Какой же будет экземпляр в таком классе - отдельный департамент? Что там может быть, кроме включения всех сотрудников, имеющих аргумент при __construct, что они в таком-то департаменте находятся?
Черт, как же я туплю...
Завтра снова перечитаю урок про ООП и первые задачи заново решу.
#850 #713490
>>712486

>Нет, это все производные величины и не надо их хранить в свойствах. Иначе ты замучаешься их пересчитывать при добавлении, увольнении и изменении данных сотрудников.


Хм, верно. Я просто подумал, что удобнее было бы их вывести и сделать полями/свойствами класса, чтобы потом обращаться к ним вот так: $this->purchaseDepartmentSalary.
Действительно, экономим на многом в этом случае.

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


Пока сие вообще неподвластно мне.

>> Мы можем наследовать от класса Сотрудник классы по каждой профессии. Далее можно включить любую другую профессию, так же унаследовав её от Сотрудника.


>Можем но тогда нельзя будет менять профессию.


Я вообще не понимаю, как можно менять профессию, когда у меня такое идиотское создание самих сотрудников.

>Сделай массив вида


>$people = ['3xМе2', '5Ан2'];


>Или строку:


>$people = "3xМе2, 5xАн2";


Как можно сделать создание сотрудников из массива, в принципе, понятно, но кажется это каким-то переусложнением.
Хотя...
Нужен цикл foreach, регулярка, которая достаёт часть до знака умножения и множит на неё константу с профессией работника, потреблением кофе, производством количества страниц. Туда же можно дописать, является ли боссом, как тут братишка выше писал.
Спасибо за идею.
С функциями с get... и set... вроде бы тоже сообразил, спасибо.

>>public function getCoffeeByProfession($coffeeByProfession){


>Что делает этот метод? Напиши потому что я не понял из названия. "получить потребление кофе зная профессию". А зачем в него что-то передавать если работник и так должен знать сам сколько он кофе потребляет?


Ну, у меня в цикле создавались, допустим, 9 менеджеров, этот метод прописывал им всем их потребление кофе.
Я вроде бы как раз следовал предыдущему твоему совету максимально автоматизировать создание сотрудника.
А при этом не сделал аналогичный метод для установки базовой зарплаты, потому что её может потребоваться изменять вручную в каждом конкретном случае.

>В моем понимании дложно быть либо поле хранящее текущее потребление кофе, либо метод возвращающий его. Без аргументов.


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

>Ну и давай делай уже объект Департамента.


>То что у тебя - это просто массив работников, это не Департамент.


Какой же будет экземпляр в таком классе - отдельный департамент? Что там может быть, кроме включения всех сотрудников, имеющих аргумент при __construct, что они в таком-то департаменте находятся?
Черт, как же я туплю...
Завтра снова перечитаю урок про ООП и первые задачи заново решу.
>>714996
#851 #713544
>>712463

>Также, в PHP есть такой класс: http://php.net/manual/ru/class.splfileinfo.php - мог бы он пригодиться в этом приложении, как ты думаешь? Вот например в Симфони класс File и UploadedFile от него унаследованы


Вот это кстати полезная вещь, я не знал что такой класс существует. Мог бы пригодиться если бы я не использовал getId3.

>>712473

>- мы переиндексируем большой индекс, делая SQL запрос и читая результаты


>- в процессе этого реалтйм индекс пополняется новыми записями


>- мы дропаем реалтайм индекс с этими записиями


Не решается ли эта проблема использованием ranged_queries?
Как я понимаю, сфинкс сначала выбирает определенное кол-во записей, пишет их в память, потом выбирает следующее кол-во записей. У меня сейчас в индексере вот так https://github.com/foobar1643/filehosting/blob/master/sphinx.conf#L12 т.е. он выбирает на каждую тысячу id, что не должно быть слишком медленно. Таким образом добавить новую запись чтобы она не попала в индекс - практически невозможно.
>>712474

>Но вопрос с отсутстующими или лишними результатами все же надо продумать - есть ли какое-то не сильно сложное решение.


Отсутствующих результатов там быть не может, я проверяю все id перед выводом. Проблема с расчетом кол-ва страниц, потому что сфинкс считает все id, включая удаленные. И тогда получается что SHOW META показывает 15 записей, когда на странице их выводится пять (т.е. 10 из них удалены).
>>714996
51 Кб, 400x300
#852 #713599
Как из строки 'new Employee('Закупок', ME, 1, false, 2)' сделать реальное обозначение создания нового экземпляра класса?
Как её, скажем так, раскавычить?
Вот у нас, например:

>$newEmployee = 'new Employee('Закупок', ME, 1, false, 2)';


>$ivan = $newEmployee;


Ведь в этом случае просто

>$ivan = 'new Employee('Закупок', ME, 1, false, 2)';


- не создаётся экземпляр класса, а просто в переменную добавляется строка.
Как сделать такое преобразование из строки и добавление?
Это нужно мне для того, чтобы автоматизировать создание новых экземпляров класса.
>>713646
#853 #713646
>>713599
Помогли, оказалось вот так можно:

>$className = 'Employee';


>$ivan = new $className;


А дальше в скобках для передачи аргументов вот так можно:

>new $className($department, $profession, $rank, $boss ...)


И это всё у нас достаётся с помощью регулярки.
Красота.
>>714337
#854 #713723
ОП, нужно твое экспертное мнение. Меня везде игнорят с этим вопросом.
Какой вариант лучше:
1.
.кнопка-1 {color: red}
.ccылка-1 {color: red}
.заголовок-1 {color: red}
.инпут-1 {color: red}
.абзац-1 {color: red}
2.
.кнопка-1, .ccылка-1, .заголовок-1, .инпут-1, .абзац-1 {color: red}
Преимущество второго способа налицо - правило не дублируется.
Недостаток же заключается в том что мы в конечном css-файле получаем длинные групповые селекторы, а также то что разные свойства одного и того же элемента разбросаны по разным местам и там дублируется сам селектор, например может быть такое
...куча селекторов..., .кнопка-1, ... {color: red}
...куча селекторов..., .кнопка-1, ... {background-color: black}
...куча селекторов..., .кнопка-1, ... {font-family: arial}

НО. CSS-препроцессоры эти недостатки нивелируют, там можно писать такое:

%текст-красный
color: red

.кнопка-1
@добавить %текст-красный
//какие-то другие свойства
.ссылка-1
@добавить %текст-красный
.заголовок-1
@добавить %текст-красный

И это будет скомпилировано в
.кнопка-1, .ссылка-1, .заголовок-1 {color: red}
причем сам этот т.н. "тихий класс" %текст-красный в css не включается, компилятор как бы на его место через запятую подставляет все селекторы в которых встречается инструкция @включить

То есть в исходном SASS-файле сохранится структура при которой все свойства кнопки-1 сгруппированы внутри ее селектора, никаких длиннющих групповых селекторов там тоже не будет. Все чисто и красиво. Но в итоговом CSS-файле, да, будет грязно. С другой стороны css-файлы же все равно перед продашенком минифицируются, кому там что понадобиться читать? Разработчики же будут иметь дело с исходным хорошо организованным файлом.
Выигрыш в размере файле наступает если содержимое этих 'тихих' классов длиннее селектора, то есть
%текст-красный
color: red
еще сомнительно, но вот
%кнопка-стиль-1
color: red
background-color: black
border: 1px solid orange
уже однозначно выиграет
Твое мнение?
#854 #713723
ОП, нужно твое экспертное мнение. Меня везде игнорят с этим вопросом.
Какой вариант лучше:
1.
.кнопка-1 {color: red}
.ccылка-1 {color: red}
.заголовок-1 {color: red}
.инпут-1 {color: red}
.абзац-1 {color: red}
2.
.кнопка-1, .ccылка-1, .заголовок-1, .инпут-1, .абзац-1 {color: red}
Преимущество второго способа налицо - правило не дублируется.
Недостаток же заключается в том что мы в конечном css-файле получаем длинные групповые селекторы, а также то что разные свойства одного и того же элемента разбросаны по разным местам и там дублируется сам селектор, например может быть такое
...куча селекторов..., .кнопка-1, ... {color: red}
...куча селекторов..., .кнопка-1, ... {background-color: black}
...куча селекторов..., .кнопка-1, ... {font-family: arial}

НО. CSS-препроцессоры эти недостатки нивелируют, там можно писать такое:

%текст-красный
color: red

.кнопка-1
@добавить %текст-красный
//какие-то другие свойства
.ссылка-1
@добавить %текст-красный
.заголовок-1
@добавить %текст-красный

И это будет скомпилировано в
.кнопка-1, .ссылка-1, .заголовок-1 {color: red}
причем сам этот т.н. "тихий класс" %текст-красный в css не включается, компилятор как бы на его место через запятую подставляет все селекторы в которых встречается инструкция @включить

То есть в исходном SASS-файле сохранится структура при которой все свойства кнопки-1 сгруппированы внутри ее селектора, никаких длиннющих групповых селекторов там тоже не будет. Все чисто и красиво. Но в итоговом CSS-файле, да, будет грязно. С другой стороны css-файлы же все равно перед продашенком минифицируются, кому там что понадобиться читать? Разработчики же будут иметь дело с исходным хорошо организованным файлом.
Выигрыш в размере файле наступает если содержимое этих 'тихих' классов длиннее селектора, то есть
%текст-красный
color: red
еще сомнительно, но вот
%кнопка-стиль-1
color: red
background-color: black
border: 1px solid orange
уже однозначно выиграет
Твое мнение?
>>713731>>713734
#855 #713731
>>713723

Редко бывает что ссылки или кнопки на сайте разного цвета. Обычно задаются правила для любых ссылок (на тег a), а потом, если дизайн требует, делаются уточнения с помощью класса (ссылка с подсветкой, ссылка с волнистым подчеркиванием и тд).

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

То есть обычно есть какая-то типографика, как выглядит основной текст, ссылки, абзацы и прочее и надо эти стили описать в самом начале.

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

.кнопка-1 {color: red}
.ccылка-1 {color: red}
.заголовок-1 {color: red}

Ведь таких исключений все равно будет немного.

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

Если у тебя много таких элементов то скорее всего либо у дизайнера проблемы с дизайном либо у тебя проблемы с правильным переводом его в хтмл и ксс.

Вообще, я думаю, это не очень принципально, можно писать отдельно, можно через запятую, можно препроцессором. Главное понять где у нас основные стили а где исключения из них.
>>713745
#856 #713734
>>713723

Проверить твой ксс можно так. Возьми страницу с текстом и обычными хтмл тегами, прямо в body: h1, p, a, img. На странице должны быть только теги, без классов или id.

Вот пример страницы: http://motherfuckingwebsite.com/

Конечно, в идеале хорошо бы еще добавить на страницу списки ul/ol, пару таблиц какие там еще есть теги ... можно наверно просто скопировать кусок текста из статьи в википедии.

Добавь к ней свой css. И проверь адекватно ли выглядит текст. Если твой ксс правильный то текст будет смотреться аккуратно и соответствовать дизайну самого сайта.
26 Кб, 1205x398
#857 #713745
>>713731
Я примерно также и думал, но все-таки есть свойства, которые, скажем так, на всей странице могут принимать от силы 2-3 значения вне зависимости от того к какому элементу применяются.
Пример: font-family+font-weight. И ссылки, и кнопки, и заголовки и инпуты - все это может иметь одно из 2-3 семейств. Соостветственно вариант с
.ссылка-1, .кнопка-1, .заголовок-1
font-family: Helvetica
font-weight: 700
Вполне реален
Дальше, свойства связанные с цветами - color, border, background. На сайте обычно 1-2 брендовых цвета, белый, черный, пару серых полутонов. Вполне реально что кнопка-1, заголовок-2, параграф-6 будут иметь
color: red
background-color: yellow
Ну то есть понятно что если эти одинаковые свойства будут иметь только кнопки, то их надо выносить в общий класс и цеплять в html как <button class="btn btn-social btn-social--facebook"> но в том дизайне который я сейчас насилую кое-где так и просятся эти тихие классы.
Выигрыш налицо ящитаю(пример абстрактный)
>>713771
#858 #713754
preg_split("/[' '.?!]/u",$text)
Вот тут пробел надо ' экранировать? Или можно просто пробелом оставить?
>>713769>>713772
#859 #713769
>>713754
Кавычки не нужны, потому что воспринимаются символами. Лучше поставь \\s - этот символ обозначает пробел.
#860 #713771
>>713745

> , но все-таки есть свойства, которые, скажем так, на всей странице могут принимать от силы 2-3 значения вне зависимости от того к какому элементу применяются.


И во многих случаях такие свойства наследуются: шрифт, цвет и писать их много раз не требуется.

> Дальше, свойства связанные с цветами - color, border, background. На сайте обычно 1-2 брендовых цвета, белый, черный, пару серых полутонов.


бывает по-разному. не знаю, я бы не стал связывать, так как мне удобнее когда разные элементы описаны отдельно друг от друга.

Я не вижу особого выигрыша. 5, 10 или 20 строчек погоды не делают. Объединять можно, ошибки нет, но я бы так делать не стал.
>>713776
#861 #713772
>>713754

Можно оставить пробел, но без кавычек.
#862 #713776
>>713771

>И во многих случаях такие свойства наследуются


О, кстати. Допустим, есть 6 разных кнопок. Из них, допустим, у 3 есть бордюры(не стандартные), а у 3 нет.
1 или 2?
1.
button {border: none}
.btn-1, .btn-2, .btn-3 {border: 2px solid red}
2.
.btn-1, .btn-2, .btn-3 {border: 2px solid red}
.btn-4, .btn-5, .btn-6 {border: none}
>>714996
#863 #713777
Перекатите тред.
>>713941>>714996
#864 #713941
>>713777
Прекратите трёп.
А вообще трипл не врёт.
#865 #713959
Задача про опечатки.
http://ideone.com/JpQMaO
>>715026
48 Кб, 348x500
#866 #714005
Подскажите какую нибудь литературу по пыхе. Что можете сказать по поводу пики.
>>714338>>714550
#867 #714337
>>713646
В итоге снова подсказали добрые люди, что я не туда направляюсь: можно просто подставить аргументы-переменные в класс и не нужно мудрить.
Однако два часа мудрил и сделал вот это: http://ideone.com/qy2siu
С помощью сего можно создавать неограниченное количество любых сотрудников в любых департаментах. Пока там просто шаблон, но всё уже более-менее очевидно.
>>715026
#868 #714338
>>714005
Неплохое руководство, пока прошёл где-то четверть. Но лучше сначала весь учебник ОПа пройти, Зандстру почитать, а потом уже Никсона.
Так многое дополнительно уяснишь и запомнишь.
>>714428>>714550
#869 #714379
>>711558
Я твою задачу решил, а с моей справишься?

Общее описание.
Есть приложение, основное назначение которого - предоставить пользователю проходить тесты на знание иностранного языка.
Тест простой: пользователю показывают слово или описание термина на русском, он должен вбить перевод.
Подходящий готовый словарь для этих целей я так и не нашел. Есть замечательные словари XDXF/StarDict, но они слишком хардкорные, потому что вместо краткого перевода дают транскрипцию и целую статью по искомому слову, с примерами употребления слова в контексте предложений и т.д. Мне это не подходит, нужно показать пользователю краткий перевод слова на русском, а не статью на 3 страницы, где ответ к тому же многократно спойлерится.

Техническое описание.
Пример 1:
<ar><k>accession number</k>
инвентарный номер The accession number also serves to link the book with the catalogue, and distinguishes between copies of a book when there is more than one. ≈ Инвентарный номер служит для связи книги с записью в каталоге, а также он позволяет различать между собой разные копии одного и того же издания.</ar>

Можно попробовать пройтись в цикле по словарю, и убрать часть перевода регулярным выражением. Только непонятно как составить такое правило, чтобы перевод не сломался.
Допустим, мы могли бы брать только первую часть строки, до первого латинского символа. В примере выше получим accession number : инвентарный номер. Подстроку начиная с символа T удалить.
Но тогда возникают 2 проблемы.

Пример 2:
<ar><k>absolute URL</k>
абсолютный URL, абсолютный унифицированный указатель информационного ресурса (полный адрес страницы или иного ресурса WWW в сети Internet, включающий в себя название протокола, путь доступа к ресурсу и имя файла)</ar>
Пример 3:
<ar><k>JavaScript</k>
язык сценариев, созданный на основе языка Java</ar>

Наткнувшись на латинские буквы URL, наша регулярка отрежет конец строки, и останется одно слово "абсолютный". В третьем примере отвалится java. Хотя js не имеет отношения к джаве, так что может оно и к лучшему.

Пример 4:
<ar><k>accident</k>
<tr>ˈæksɪdənt</tr> сущ. 1) несчастный случай; катастрофа; авария to have an accident ≈ потерпеть аварию, крушение; попасть в катастрофу to meet with an accident ≈ потерпеть аварию, крушение; попасть в катастрофу awful, bad, dreadful, frightful, horrible, shocking accident ≈ ужасная, тяжелая авария, страшная катастрофа an accident occurs, takes place ≈ происходит несчастный случай She was involved in serious car accident last week. ≈ Она попала в серьезную автокатастрофу на прошлой неделе. automobile accident factory accident professional accident industrial accident ≈ fatal accident hit-and-run accident cerebrovascular accident cerebral accident cardiovascular accident home accident pedestrian accident hunting accident motorcar accident railway accident road accidents road traffic accidents serious accident train accident unavoidable accident 2) случай; случайность by accident ≈ случайно, нечаянно by a lucky accident ≈ по счастливой случайности pure accident ≈ чистая случайность sheer accident ≈ чистая случайность accident measures воен. ≈ меры предупреждения случайностей We discovered it by accident. ≈ Мы обнаружили это случайно.

Часто у слова несколько значений. В случае accident мне нужно получить 1) несчастный случай; катастрофа; авария 2) случай; случайность.
Тогда прихожу к тому, что регулярка должна вырезать символы не до конца строки, а пока не наткнется на \d[.)]

С примерами 2, 3 пока не знаю что делать. А и фиг с ними.

Завтра еще погуглю, но если честно уже заколебался. Нашел еще в txt формате без транскрипции и примеров, но там тоже сложности с тем чтобы отделить слово от перевода, и словарь маленький.
#869 #714379
>>711558
Я твою задачу решил, а с моей справишься?

Общее описание.
Есть приложение, основное назначение которого - предоставить пользователю проходить тесты на знание иностранного языка.
Тест простой: пользователю показывают слово или описание термина на русском, он должен вбить перевод.
Подходящий готовый словарь для этих целей я так и не нашел. Есть замечательные словари XDXF/StarDict, но они слишком хардкорные, потому что вместо краткого перевода дают транскрипцию и целую статью по искомому слову, с примерами употребления слова в контексте предложений и т.д. Мне это не подходит, нужно показать пользователю краткий перевод слова на русском, а не статью на 3 страницы, где ответ к тому же многократно спойлерится.

Техническое описание.
Пример 1:
<ar><k>accession number</k>
инвентарный номер The accession number also serves to link the book with the catalogue, and distinguishes between copies of a book when there is more than one. ≈ Инвентарный номер служит для связи книги с записью в каталоге, а также он позволяет различать между собой разные копии одного и того же издания.</ar>

Можно попробовать пройтись в цикле по словарю, и убрать часть перевода регулярным выражением. Только непонятно как составить такое правило, чтобы перевод не сломался.
Допустим, мы могли бы брать только первую часть строки, до первого латинского символа. В примере выше получим accession number : инвентарный номер. Подстроку начиная с символа T удалить.
Но тогда возникают 2 проблемы.

Пример 2:
<ar><k>absolute URL</k>
абсолютный URL, абсолютный унифицированный указатель информационного ресурса (полный адрес страницы или иного ресурса WWW в сети Internet, включающий в себя название протокола, путь доступа к ресурсу и имя файла)</ar>
Пример 3:
<ar><k>JavaScript</k>
язык сценариев, созданный на основе языка Java</ar>

Наткнувшись на латинские буквы URL, наша регулярка отрежет конец строки, и останется одно слово "абсолютный". В третьем примере отвалится java. Хотя js не имеет отношения к джаве, так что может оно и к лучшему.

Пример 4:
<ar><k>accident</k>
<tr>ˈæksɪdənt</tr> сущ. 1) несчастный случай; катастрофа; авария to have an accident ≈ потерпеть аварию, крушение; попасть в катастрофу to meet with an accident ≈ потерпеть аварию, крушение; попасть в катастрофу awful, bad, dreadful, frightful, horrible, shocking accident ≈ ужасная, тяжелая авария, страшная катастрофа an accident occurs, takes place ≈ происходит несчастный случай She was involved in serious car accident last week. ≈ Она попала в серьезную автокатастрофу на прошлой неделе. automobile accident factory accident professional accident industrial accident ≈ fatal accident hit-and-run accident cerebrovascular accident cerebral accident cardiovascular accident home accident pedestrian accident hunting accident motorcar accident railway accident road accidents road traffic accidents serious accident train accident unavoidable accident 2) случай; случайность by accident ≈ случайно, нечаянно by a lucky accident ≈ по счастливой случайности pure accident ≈ чистая случайность sheer accident ≈ чистая случайность accident measures воен. ≈ меры предупреждения случайностей We discovered it by accident. ≈ Мы обнаружили это случайно.

Часто у слова несколько значений. В случае accident мне нужно получить 1) несчастный случай; катастрофа; авария 2) случай; случайность.
Тогда прихожу к тому, что регулярка должна вырезать символы не до конца строки, а пока не наткнется на \d[.)]

С примерами 2, 3 пока не знаю что делать. А и фиг с ними.

Завтра еще погуглю, но если честно уже заколебался. Нашел еще в txt формате без транскрипции и примеров, но там тоже сложности с тем чтобы отделить слово от перевода, и словарь маленький.
>>714415
#870 #714415
>>714379

Ок, формат не предусматривает выделение из статьи отдельно краткой версии. Но что если просто нужен другой словарь?

Вот я например нагуглил http://dicto.org.ru/xdxf.html

Ты смотрел все англо-русские словари тут? Может там есть словарь без подробных статей, где только перевод слова?

Также, есть еще такой список https://ru.wiktionary.org/wiki/Индекс:Английский_язык

Также, советую смотреть откуда взят каждый словарь - может в исходном варианте есть то, что нужно. Не стоит искать какие-то много раз конвертированные левые словари.
#871 #714423
Не много не ваш формат, но может кто поможет.
Хочу сделать навигацию через вкладки на ксс (радио-кнопки), проблема в следующем - когда кнопки и вкладки с контентом находятся в одном блоке - все работает, но если они находятся в разных - нихуя не робит.
http://cssdeck.com/labs/addzgnxp - тут контент вынесен в отдельный блок, так не работает.
>>715026
92 Кб, 640x640
#872 #714428
>>714338
Понял, спасибо тебе
32 Кб, 459x620
#873 #714550
>>714338
>>714005
А есть что нибудь по типу питоновского Доусона с задачками и играми?
someApprentice #874 #714595
https://github.com/someApprentice/Students

Закончил с замечаниями прошлых тредов, самое сложное уже позади, осталось самое простое, это логин, кукисы и паджер. Задумываюсь над тем чтобы зарегистрировать бесплатный хостинг и домен, и выкладывать туда код по мере решения для наглядности. Все хочу установить Symfony Forms, но пока не знаю что мне мешает, наверно просто лень, хоть я и понимаю что научится пользоваться этим инструментом весьма полезно.

>663578

>Чтобы лучше это усвоить, напиши скрипт для командной строки, который генерирует студента, сохраняет в базу и выводит его данные. Имена и другие данные можно сгенерировать с помощью https://github.com/fzaninotto/Faker


>Далее напиши скрипт, проверяющий студентов в базе на текущие правила валидации и выводящего для ошибочных записей id и ошибки.


Готово https://github.com/someApprentice/Students/tree/master/app/Test

Надеюсь я правильно понял что их нужно сделать чтобы можно вызывать с помощью: php "...\скрипт.php"?

====

Несколько вопросов

>663578

>Можешь тогда еще README.md добавить, написав что это за проект и как его установить.


Полагаю, я могу писать readme как мне захочется? Сейчас бы я написал чтобы это просто закинули в рабочую директорию, но хочется чтобы это устанавливалось через консоль, как я устанавливал другие плагины с помощью композера.

>663578
https://github.com/someApprentice/Students/blob/master/app/Model/Validators/Validations.php#L56

>>if (mb_strlen($grupnumber) < 2) {


>проверка длины скопирована много раз. Не стоит ли ее вынести в отдельный метод?


А как тогда в отдельном методе выдавать разные ошибки для разных полей?

>663578
https://github.com/someApprentice/Students/blob/master/students.sql#L31

>> name` varchar(20) COLLATE utf8_bin NOT NULL,


>Почему сравнение с учетом регистра?


Это делает phpmyadmin, увы я не могу на это повлиять через его интерфейс. Знаю что нужно писать самому запросы, но этому я научусь потом, сначала с ООП разобраться надо.

https://github.com/someApprentice/Students/blob/master/templates/registration.phtml#L25
https://github.com/someApprentice/Students/blob/master/templates/registration.phtml#L60
Notice: Undefined index: gender in C:\Program Files\xampp\www\app\Controller\RegisterAction.php on line 57
Notice: Undefined index: location in C:\Program Files\xampp\www\app\Controller\RegisterAction.php on line 62
Когда чекбоксы остаются пустыми выдается ошибки о том что не существует таких индексов $_POST. Как сделать чтобы при пустых значениях отправлялось какое-то стандартное значение отличное от значений чекбоксов?

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/RegistrationHelper.php#L4
Стоит ли переделать класс в универсальный хелпер для всех классов, а не только для регистрации? Например, функция перенаправления подойдет для всех классов.
someApprentice #874 #714595
https://github.com/someApprentice/Students

Закончил с замечаниями прошлых тредов, самое сложное уже позади, осталось самое простое, это логин, кукисы и паджер. Задумываюсь над тем чтобы зарегистрировать бесплатный хостинг и домен, и выкладывать туда код по мере решения для наглядности. Все хочу установить Symfony Forms, но пока не знаю что мне мешает, наверно просто лень, хоть я и понимаю что научится пользоваться этим инструментом весьма полезно.

>663578

>Чтобы лучше это усвоить, напиши скрипт для командной строки, который генерирует студента, сохраняет в базу и выводит его данные. Имена и другие данные можно сгенерировать с помощью https://github.com/fzaninotto/Faker


>Далее напиши скрипт, проверяющий студентов в базе на текущие правила валидации и выводящего для ошибочных записей id и ошибки.


Готово https://github.com/someApprentice/Students/tree/master/app/Test

Надеюсь я правильно понял что их нужно сделать чтобы можно вызывать с помощью: php "...\скрипт.php"?

====

Несколько вопросов

>663578

>Можешь тогда еще README.md добавить, написав что это за проект и как его установить.


Полагаю, я могу писать readme как мне захочется? Сейчас бы я написал чтобы это просто закинули в рабочую директорию, но хочется чтобы это устанавливалось через консоль, как я устанавливал другие плагины с помощью композера.

>663578
https://github.com/someApprentice/Students/blob/master/app/Model/Validators/Validations.php#L56

>>if (mb_strlen($grupnumber) < 2) {


>проверка длины скопирована много раз. Не стоит ли ее вынести в отдельный метод?


А как тогда в отдельном методе выдавать разные ошибки для разных полей?

>663578
https://github.com/someApprentice/Students/blob/master/students.sql#L31

>> name` varchar(20) COLLATE utf8_bin NOT NULL,


>Почему сравнение с учетом регистра?


Это делает phpmyadmin, увы я не могу на это повлиять через его интерфейс. Знаю что нужно писать самому запросы, но этому я научусь потом, сначала с ООП разобраться надо.

https://github.com/someApprentice/Students/blob/master/templates/registration.phtml#L25
https://github.com/someApprentice/Students/blob/master/templates/registration.phtml#L60
Notice: Undefined index: gender in C:\Program Files\xampp\www\app\Controller\RegisterAction.php on line 57
Notice: Undefined index: location in C:\Program Files\xampp\www\app\Controller\RegisterAction.php on line 62
Когда чекбоксы остаются пустыми выдается ошибки о том что не существует таких индексов $_POST. Как сделать чтобы при пустых значениях отправлялось какое-то стандартное значение отличное от значений чекбоксов?

https://github.com/someApprentice/Students/blob/master/app/Model/Helper/RegistrationHelper.php#L4
Стоит ли переделать класс в универсальный хелпер для всех классов, а не только для регистрации? Например, функция перенаправления подойдет для всех классов.
>>714627>>714636
#875 #714627
>>714595

Вот этот класс https://github.com/someApprentice/Students/blob/master/app/Model/Entity/RegisterForm.php во многом дублирует студента. Почитай обновленный урок по ООП в учебнике и поищи способы как бороться с дублированием.

Далее, тут https://github.com/someApprentice/Students/blob/master/app/Test/validAllStudents.php#L9 много однотипных строк. Это плохо тем, что когда мы например добавляем с студента новое поле, мы должны найти это место и не забыть добавить сюда еще одну строку. Это нелогично. надо чтобы была функция которой на вход можно дать студента и которая его проверит.
#876 #714636
>>714595

> Надеюсь я правильно понял что их нужно сделать чтобы можно вызывать с помощью: php "...\скрипт.php"?


Да

> Полагаю, я могу писать readme как мне захочется? Сейчас бы я написал чтобы это просто закинули в рабочую директорию, но хочется чтобы это устанавливалось через консоль, как я устанавливал другие плагины с помощью композера.


Для гит проекта можно просто сделать git clone с гитхаба. А потом запустить композер. Это и будет установка через консоль.

> Все хочу установить Symfony Forms, но пока не знаю что мне мешает, наверно просто лень, хоть я и понимаю что научится пользоваться этим инструментом весьма полезно.


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

> А как тогда в отдельном методе выдавать разные ошибки для разных полей?


А ты подумай. что можно передать в функцию?

> Когда чекбоксы остаются пустыми выдается ошибки о том что не существует таких индексов $_POST.


Это логично. Пост приходит от пользователя и в нем вообще любые ключи могут отстутсовавть. Прежде чем брать элемент из этого массива ты должен проверять, а есть ли он там вообще . перечитай урок про обработку форм, там вроде это упомянуто. https://github.com/codedokode/pasta/blob/master/forms.md

> . Как сделать чтобы при пустых значениях отправлялось какое-то стандартное значение отличное от значений чекбоксов?


Никак . Незаполненные чекбоксы не отправляются в запросе.

> Стоит ли переделать класс в универсальный хелпер для всех классов, а не только для регистрации? Например, функция перенаправления подойдет для всех классов.


Перенаправления там вообещ не дложно быть. Редирект - это выдача HTTP заголовков, а взаимодействием с GET/POST данными и формированием ответа занимается контроллер. Хелпер не должен этим заниматься.

И еще кое-что. Тут много копипасты: https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php

Однотипные строчки просто скопированы. Так не пойдет. Надо либо заменять их на циклы либо еще что-то делать.
#876 #714636
>>714595

> Надеюсь я правильно понял что их нужно сделать чтобы можно вызывать с помощью: php "...\скрипт.php"?


Да

> Полагаю, я могу писать readme как мне захочется? Сейчас бы я написал чтобы это просто закинули в рабочую директорию, но хочется чтобы это устанавливалось через консоль, как я устанавливал другие плагины с помощью композера.


Для гит проекта можно просто сделать git clone с гитхаба. А потом запустить композер. Это и будет установка через консоль.

> Все хочу установить Symfony Forms, но пока не знаю что мне мешает, наверно просто лень, хоть я и понимаю что научится пользоваться этим инструментом весьма полезно.


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

> А как тогда в отдельном методе выдавать разные ошибки для разных полей?


А ты подумай. что можно передать в функцию?

> Когда чекбоксы остаются пустыми выдается ошибки о том что не существует таких индексов $_POST.


Это логично. Пост приходит от пользователя и в нем вообще любые ключи могут отстутсовавть. Прежде чем брать элемент из этого массива ты должен проверять, а есть ли он там вообще . перечитай урок про обработку форм, там вроде это упомянуто. https://github.com/codedokode/pasta/blob/master/forms.md

> . Как сделать чтобы при пустых значениях отправлялось какое-то стандартное значение отличное от значений чекбоксов?


Никак . Незаполненные чекбоксы не отправляются в запросе.

> Стоит ли переделать класс в универсальный хелпер для всех классов, а не только для регистрации? Например, функция перенаправления подойдет для всех классов.


Перенаправления там вообещ не дложно быть. Редирект - это выдача HTTP заголовков, а взаимодействием с GET/POST данными и формированием ответа занимается контроллер. Хелпер не должен этим заниматься.

И еще кое-что. Тут много копипасты: https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php

Однотипные строчки просто скопированы. Так не пойдет. Надо либо заменять их на циклы либо еще что-то делать.
#877 #714673
>>712599

>нет, не учтено. Я смотрю на код функции inclineWord() и не вижу этого. Выбором формы слова должна заниматься одна функция


ОП, возможно я ошибаюсь (если так, то извини за беспокойство), но я не вижу, чтобы логика выбора формы слова была вне функции. Я передаю последнюю (если от 10 до 19, то последние 2), и, если всё-таки передаётся две, то два первых условия не выполняются и присваивается нужная форма.

Ещё раз извини за то, что беспокою, так как не могу разораться.
>>714684
#878 #714684
>>714673

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

Ну вот представь я хочу вызвать твою фукнцию. У меня есть переменная

$n = 156;

Но я не могу передать ее в функцию, я должен как-то из нее выделить нужные цифры и только потом вызывать функцию. Неудобно же.
#879 #714706
В шторме случайно нет такой фичи, чтобы она заменяла попытки доступа к инкапсулированным свойствам на геттеры/сеттеры?
Есть код, где модели с публичными домами свойствами.
Мне нужно поставить приватные, но тогда придется лазить по всему коду и заменять
$model->prop = $x;
на
$model->setProp($x);
и
$y = $model->prop;
на
$y = $model->getProp();

Наверняка есть, просто не знаю по какому слову загуглить.
>>714780
#880 #714780
>>714706
Notepad++
Ctrl+F
Replace
Вводишь и жмешь Replace all
>>714796
#881 #714796
>>714780
Нотепад только в одном файле наверное может заменять.

Но ты меня натолкнул на мысль, в иде должно быть что-то типа замены по регулярному выражению, чтобы ставить сеттеры.
$model->:prop = :val;
Заменить на
$model->set:prop(:val); // Prop только нужно сделать с большой буквы

Да, нашлось
https://www.jetbrains.com/help/phpstorm/2016.1/tutorial-finding-and-replacing-text-in-file-using-regular-expressions.html#d968527e431
Даже есть флажок для приведения первой буквы к верхнему регистру.
https://www.jetbrains.com/help/img/idea/replaceText3.png
#882 #714823
Писать ли скобки конструктора при создании нового объекта?
Если конструктор не требует, их же можно опустить. Что стандарты говорят об этом?
Psrы смотрел, вроде ничего не говорят, но может быть невнимательно, так что уточняю на всякий случай.
Предлагаю ставить всегда, чтобы не морочиться.
>>715026
Ответы 7 марта #883 #714988
>>709598

Тут надо либо сделать наследование разных профессий от Employee либо сделать один класс сотрудника для любых профессий.

Департамент не должен создавать сотрудников. Это надо делать где-то снаружи и передавать уже готовые объекты. ну подмай сам что логичнее:

- Сотрудник приходит и устраивается на работу в Департамент после чего тот может узнать сколько он кофе выпил
- каждый раз когда надо посчитать потребление кофе, Департамент создает нового сотрудника (это как сделано у тебя)

В общем начни с того, что сделай нормально класс/классы Сотрудников. После чего сделай класс Департамент который может хранить внутри сотрудников.

Компания тоже сделана неправильно. Ты не понимаешь какие свойства первичные, а какие вычисляются из первичных. Вот смотри, у тебя есть в компании свойство public $totalSalary. А теперь ответь, если мы поменяем ранг одного из сотрудников, это свойство обновится? Нет. Значит, оно сделано неправильно.

Очевидно что это свйоство не первичное. Оно вычисляется как сумма зарплат сотрудников. Раз так, незачем его вообще хранить так как если мы будем его хранить то оно устарет как только хотя бы один сотрудник поменяет ранг или еще что-нибудь.

Любые публичные свойства и методы всегда должны возвращать точные и актаульнгые значения.

Если тебе что-то непонятно, то задавай уточняющие вопросы.

>>709994

Не знаю.

> NodeXL (that stands for Network Overview, Discovery and Exploration for Excel) is an easy to use free open-source Excel template that generates a network graph from vertices and edges (pages and links in our case) data in Excel.



Судя по этому это шаблон для экселя. Сохрани свои ссылки в эксель и тогда сможешь его использовать. А так, есть какая-то опен сурс штука для рисования таких графов но я не помню как она называется. Она не на пхп.
Ответы 7 марта #883 #714988
>>709598

Тут надо либо сделать наследование разных профессий от Employee либо сделать один класс сотрудника для любых профессий.

Департамент не должен создавать сотрудников. Это надо делать где-то снаружи и передавать уже готовые объекты. ну подмай сам что логичнее:

- Сотрудник приходит и устраивается на работу в Департамент после чего тот может узнать сколько он кофе выпил
- каждый раз когда надо посчитать потребление кофе, Департамент создает нового сотрудника (это как сделано у тебя)

В общем начни с того, что сделай нормально класс/классы Сотрудников. После чего сделай класс Департамент который может хранить внутри сотрудников.

Компания тоже сделана неправильно. Ты не понимаешь какие свойства первичные, а какие вычисляются из первичных. Вот смотри, у тебя есть в компании свойство public $totalSalary. А теперь ответь, если мы поменяем ранг одного из сотрудников, это свойство обновится? Нет. Значит, оно сделано неправильно.

Очевидно что это свйоство не первичное. Оно вычисляется как сумма зарплат сотрудников. Раз так, незачем его вообще хранить так как если мы будем его хранить то оно устарет как только хотя бы один сотрудник поменяет ранг или еще что-нибудь.

Любые публичные свойства и методы всегда должны возвращать точные и актаульнгые значения.

Если тебе что-то непонятно, то задавай уточняющие вопросы.

>>709994

Не знаю.

> NodeXL (that stands for Network Overview, Discovery and Exploration for Excel) is an easy to use free open-source Excel template that generates a network graph from vertices and edges (pages and links in our case) data in Excel.



Судя по этому это шаблон для экселя. Сохрани свои ссылки в эксель и тогда сможешь его использовать. А так, есть какая-то опен сурс штука для рисования таких графов но я не помню как она называется. Она не на пхп.
Ответы 7-8 апреля конечно же, а не марта #884 #714989
>>710325

>>Для обозначения профессий надо использовать константы как в уроке.


> Так, это я упустил. А что это даст? Пока не пойму.


В уроке же написано, почему не прочел?

> ....


> Но этот подход имеет недостатки:


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


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


> Решение - сделать в классе Заявки константы, обозначающие разные статусы. Если ты опечатаешься в имени константы, PHP сообщит тебе об ошибке, и нетрудно увидеть какие вообще статусы бывают.


> ...



> Пока что нигде, потому что это всего лишь черновик для одного департамента Закупок.


> Для него можно сделать вот это:


>>$purchaseDepartment = getIndex($employeesPurchaseDepartment);


> Так думал и со всеми другими департаментами делать, а потом объединить все департаменты и циклом пройтись по ним с выводом всех их получившихся значений.



Это не ООП. В ООП у нас есть классы, каждый из которых отвечает за свою часть работы. Если тебе нужна статистика по Департаменту то ты можешь получить ее из соовтетствующего класса. Ты же пишешь внешнюю функцию и тем самым выносишь наружу код который должен быть внутри класса Департамент.

В ООП должно быть так:

$total = $marketingDepartment->getTotalCoffee();

Вчитайся в эту строчку: мы спрашиваем у депарамента сколько он кофе выпил и получаем ответ. Потому что это его зона ответственности, вести учет статистики по депарматенту.

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


> Для соответствующих должностей?


> Если Me, то зарплата такая-то. Если Ma, то такая-то. А если босс, то лучше ставить всё равно профессию и вычислять в ставках и прочем? Наверное, так лучше.


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

> Можно будет в этом же цикле сделать цикл foreach, который будет выяснять соотношение профессии и выдавать зарплату в виде $employee->basicSalary = соответствующее значение из массива.


Нет, не стоит.
Ответы 7-8 апреля конечно же, а не марта #884 #714989
>>710325

>>Для обозначения профессий надо использовать константы как в уроке.


> Так, это я упустил. А что это даст? Пока не пойму.


В уроке же написано, почему не прочел?

> ....


> Но этот подход имеет недостатки:


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


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


> Решение - сделать в классе Заявки константы, обозначающие разные статусы. Если ты опечатаешься в имени константы, PHP сообщит тебе об ошибке, и нетрудно увидеть какие вообще статусы бывают.


> ...



> Пока что нигде, потому что это всего лишь черновик для одного департамента Закупок.


> Для него можно сделать вот это:


>>$purchaseDepartment = getIndex($employeesPurchaseDepartment);


> Так думал и со всеми другими департаментами делать, а потом объединить все департаменты и циклом пройтись по ним с выводом всех их получившихся значений.



Это не ООП. В ООП у нас есть классы, каждый из которых отвечает за свою часть работы. Если тебе нужна статистика по Департаменту то ты можешь получить ее из соовтетствующего класса. Ты же пишешь внешнюю функцию и тем самым выносишь наружу код который должен быть внутри класса Департамент.

В ООП должно быть так:

$total = $marketingDepartment->getTotalCoffee();

Вчитайся в эту строчку: мы спрашиваем у депарамента сколько он кофе выпил и получаем ответ. Потому что это его зона ответственности, вести учет статистики по депарматенту.

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


> Для соответствующих должностей?


> Если Me, то зарплата такая-то. Если Ma, то такая-то. А если босс, то лучше ставить всё равно профессию и вычислять в ставках и прочем? Наверное, так лучше.


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

> Можно будет в этом же цикле сделать цикл foreach, который будет выяснять соотношение профессии и выдавать зарплату в виде $employee->basicSalary = соответствующее значение из массива.


Нет, не стоит.
Ответы 7-8 апреля #885 #714990
>>710327

Прокрутка сделана ужасно. Я пытаюсь прокрутить подальше, а она искуственно замедляется и останавливается. Ну и ад. Зачем так делать?

Если уменьшить масштаб, то вообще стайт разрывается на блоки. Если увеличить то часть конента вываливается за край. Сразу видно злоупртребление overflow hidden. Для меня это признак того что человеку надо остановиться и вернуться перечитать учебник по css. Прежде чем вмешиваться в работу механизма прокрутки ты должен был подумать как это будет работать на различных видах устройств и экранов. И скорее всего тыпришел бы к выводу что в лучше всего в него не вмешиваться.

У тебя он сверстан под единственное разрешение экрана. Ты бы мог просто сделать нормальную резиновую верстку, а вместо этого потратил кучу времени чтобы сделать сайт менее удобным в пользовании. Не знаю, зачем ты это делаешь. Ты наверняка делаешь сайты чтобы потом показывать их работодателям и видимо ты ориентируешься на таких работодателей, которые не разбираются в вебе и которые будут смотреть на число использованных плагинов, а не качество верстки. Сомнительная тактика, на мой взгляд.

Ну и куча лишних тегов:

> <div class="member__name">


> <h2 class="name">curt<br/><span>sheard</span></h2>


Что делает <br/> со слешем в HTML коде?

И еще ты подключаешь скрипты в конце страницы. Это для сайта который без JS в принипе не работает.

> Где своровать СЛОЖНЫЙ, МНОГОСТРАНИЧНЫЙ макет и чтобы в нем обязательно были версии для мобильных, а также эффекты анимации, ховеров, фокусов, модальных окон и всего такого


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

Эффекты ховеров легко нагуглить в сети.

> Я прям чувствую что познал дзен верстки


По моему нет.

>>710917

Ты что-то путаешь. Тут str_replace достаточно и никакие циклы не нужны.

>>710948

Ифа не хватает.

>>711568

Если разным профессиям соответствуют разные классы то поменять профессию невозможно. Если же профессия обозначается просто значением в поле объекта, то ее можно поменять. Я это хотел сказать.
Ответы 7-8 апреля #885 #714990
>>710327

Прокрутка сделана ужасно. Я пытаюсь прокрутить подальше, а она искуственно замедляется и останавливается. Ну и ад. Зачем так делать?

Если уменьшить масштаб, то вообще стайт разрывается на блоки. Если увеличить то часть конента вываливается за край. Сразу видно злоупртребление overflow hidden. Для меня это признак того что человеку надо остановиться и вернуться перечитать учебник по css. Прежде чем вмешиваться в работу механизма прокрутки ты должен был подумать как это будет работать на различных видах устройств и экранов. И скорее всего тыпришел бы к выводу что в лучше всего в него не вмешиваться.

У тебя он сверстан под единственное разрешение экрана. Ты бы мог просто сделать нормальную резиновую верстку, а вместо этого потратил кучу времени чтобы сделать сайт менее удобным в пользовании. Не знаю, зачем ты это делаешь. Ты наверняка делаешь сайты чтобы потом показывать их работодателям и видимо ты ориентируешься на таких работодателей, которые не разбираются в вебе и которые будут смотреть на число использованных плагинов, а не качество верстки. Сомнительная тактика, на мой взгляд.

Ну и куча лишних тегов:

> <div class="member__name">


> <h2 class="name">curt<br/><span>sheard</span></h2>


Что делает <br/> со слешем в HTML коде?

И еще ты подключаешь скрипты в конце страницы. Это для сайта который без JS в принипе не работает.

> Где своровать СЛОЖНЫЙ, МНОГОСТРАНИЧНЫЙ макет и чтобы в нем обязательно были версии для мобильных, а также эффекты анимации, ховеров, фокусов, модальных окон и всего такого


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

Эффекты ховеров легко нагуглить в сети.

> Я прям чувствую что познал дзен верстки


По моему нет.

>>710917

Ты что-то путаешь. Тут str_replace достаточно и никакие циклы не нужны.

>>710948

Ифа не хватает.

>>711568

Если разным профессиям соответствуют разные классы то поменять профессию невозможно. Если же профессия обозначается просто значением в поле объекта, то ее можно поменять. Я это хотел сказать.
Ответы 9-10 апреля #886 #714993
>>711611

Да

>>711676

не знаю. Гугли, читай документацию.

>>712521

Делай как тебе удобнее.

>>712769

Не знаю

>>712878

if/else

>>712917

Можно и так и так, я бы не стал объединять никак не связанные элементы вместе.

>>713208

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


Не, так говорить не стоит, это скорее дело вкуса, что использовать. Хотя мне привычнее обычный синтаксис css и html например. А кому-то может на LESS писать удобнее, почему бы и нет, лишь бы меня это не касалось.

>>713131

Дело вкуса. Для меня он слишком минималистичный и неохота в уме его в теги переводить.
Ответы 9-10 апреля #886 #714993
>>711611

Да

>>711676

не знаю. Гугли, читай документацию.

>>712521

Делай как тебе удобнее.

>>712769

Не знаю

>>712878

if/else

>>712917

Можно и так и так, я бы не стал объединять никак не связанные элементы вместе.

>>713208

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


Не, так говорить не стоит, это скорее дело вкуса, что использовать. Хотя мне привычнее обычный синтаксис css и html например. А кому-то может на LESS писать удобнее, почему бы и нет, лишь бы меня это не касалось.

>>713131

Дело вкуса. Для меня он слишком минималистичный и неохота в уме его в теги переводить.
Ответы 10-11 апреля #887 #714994
>>713489

Ок, держи задачи. Функции уже изучал?

1) Выведи все 4-значные числа, сумма цифр в которых равна N (например, пусть N=27)

2) Дан массив в котором записаны дни рождения всех учеников в классе, например ['01.03', '24.04', ...]. У некоторых людей дни рождения могут совпадать. Посчитай, сколько всего в нем разных дат.

3) Дано 2 массива. В первом - названия городов, в которых побывал известный блоггер A, во втором - названия городов, где побывал не менее известный блоггер B. Выведи список городов, где побывали оба блоггера. Выведи список городов, где был A, но не был B.

4) Напиши программу вычисляющую N-е по счету число Фибоначчи. Что это за числа, посмотри в википедии

5) Дан текст, состоящий из слов, пробелов между ними, запятых и точек в конце предложений. Выведи 3 самых часто встречающихся в нем слова

6) сделай программу, которая имитирует колоду игральных карт. Ты указываешь сколько тебе нужно карт, она перемешивает их и выводит на экран N случайно выбранных карт.

7) В некоей социальной сети пользователи ставят друг другу лайки. Лайки могут быть взаимными, если пользватель A поставил лайк пользователю B, а тот - пользователю A. Дан список лайков в массиве вида

[['a', 'b'], ['c', 'd'], ['a', 'c']]

Здесь видно что пользователь a поставил лайки пользователям b и с, а пользователь c - лайк пользователю d.

Выведи:

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

8) Есть N городов, которые связаны M дорогами. Тебе дан список городов в виде:

['Болотинск', 'Зареченск', 'Ячмень', 'Черноград']

и список дорог, связывающих их:

[['Болотинск', 'Ячмень'], ['Черноград', 'Зареченск']]

Также, тебе даны названия 2 городов. Определи, возможно ли проехать из первого во второй.
Ответы 10-11 апреля #887 #714994
>>713489

Ок, держи задачи. Функции уже изучал?

1) Выведи все 4-значные числа, сумма цифр в которых равна N (например, пусть N=27)

2) Дан массив в котором записаны дни рождения всех учеников в классе, например ['01.03', '24.04', ...]. У некоторых людей дни рождения могут совпадать. Посчитай, сколько всего в нем разных дат.

3) Дано 2 массива. В первом - названия городов, в которых побывал известный блоггер A, во втором - названия городов, где побывал не менее известный блоггер B. Выведи список городов, где побывали оба блоггера. Выведи список городов, где был A, но не был B.

4) Напиши программу вычисляющую N-е по счету число Фибоначчи. Что это за числа, посмотри в википедии

5) Дан текст, состоящий из слов, пробелов между ними, запятых и точек в конце предложений. Выведи 3 самых часто встречающихся в нем слова

6) сделай программу, которая имитирует колоду игральных карт. Ты указываешь сколько тебе нужно карт, она перемешивает их и выводит на экран N случайно выбранных карт.

7) В некоей социальной сети пользователи ставят друг другу лайки. Лайки могут быть взаимными, если пользватель A поставил лайк пользователю B, а тот - пользователю A. Дан список лайков в массиве вида

[['a', 'b'], ['c', 'd'], ['a', 'c']]

Здесь видно что пользователь a поставил лайки пользователям b и с, а пользователь c - лайк пользователю d.

Выведи:

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

8) Есть N городов, которые связаны M дорогами. Тебе дан список городов в виде:

['Болотинск', 'Зареченск', 'Ячмень', 'Черноград']

и список дорог, связывающих их:

[['Болотинск', 'Ячмень'], ['Черноград', 'Зареченск']]

Также, тебе даны названия 2 городов. Определи, возможно ли проехать из первого во второй.
Ответы 11 апреля #888 #714996
>>713490

> Как можно сделать создание сотрудников из массива, в принципе, понятно, но кажется это каким-то переусложнением.


Идея в том чтобы более кратко описать список рангов и профессий сотрудников.

> Ну, у меня в цикле создавались, допустим, 9 менеджеров, этот метод прописывал им всем их потребление кофе.


> Я вроде бы как раз следовал предыдущему твоему совету максимально автоматизировать создание сотрудника.


Это хорошо, но это должно быть не внутри класса Сотрудник. Ведь фактически у тебя есть некая таблица и по ней ищется базовая ставка. Нелогично делать поиск внутри сотрудника, так как это не имеет особого отношения к его зоне ответственности. Это явно какая-то внешняя по отношению к нему штука (Бухгалтерия?). И значит поиск надо делать снаружи, а в сотрудника передавать уже конкретную цифру.

> Так вот же метод и есть, который проверяет, какая у сотрудника профессия и является ли он боссом, а потом в соответствии с этим возвращает потребление кофе! Или я опять что-то не то понимаю...


> Без аргумента как обойтись, когда нужно соответствие профессии и потребления кофе где-то хранить?


А зачем тебе полная таблица? Тебе достаточно знать сколько кофе потребляет конкретно этот сотрудник. Можно ведь просто сделать в нем поле с базовым значением потребления кофе для этой профессии. Тогда будет так:

$coffee = $ivan->getCoffeeConsumption();

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

$coffee = $calculator->calculateCoffeeConsumption($ivan);

Я наверно плохо объяснил, так что если кто-то может объяснить лучше, было бы неплохо.

> >То что у тебя - это просто массив работников, это не Департамент.


> Какой же будет экземпляр в таком классе - отдельный департамент? Что там может быть, кроме включения всех сотрудников, имеющих аргумент при __construct, что они в таком-то департаменте находятся?


Это уже неплохо. Затем можно добавить методы найма/увольнения. И имя департамента надо ведь хранить где-то.

>>713544

> Не решается ли эта проблема использованием ranged_queries?


они по идее для того, чтобы не перегрузить базу и не съесть всю память если данных много, а обрабатывать их потоково.

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

> Проблема с расчетом кол-ва страниц, потому что сфинкс считает все id, включая удаленные. И тогда получается что SHOW META показывает 15 записей, когда на странице их выводится пять (т.е. 10 из них удалены).


Тут можно хитрить - например брать не 5, а 7-8 и откидывать удаленные, если они там есть. Или не удалять записи из базы, а лишь помечать удаленнными. Также, можно попробовать использовать kill query для хранения информации об удаленных записях в риалтайм индексе. Ну в любом случае, надо что-то придумывать.

>>713776

нет особой разницы

>>713777

Уже скоро
Ответы 11 апреля #888 #714996
>>713490

> Как можно сделать создание сотрудников из массива, в принципе, понятно, но кажется это каким-то переусложнением.


Идея в том чтобы более кратко описать список рангов и профессий сотрудников.

> Ну, у меня в цикле создавались, допустим, 9 менеджеров, этот метод прописывал им всем их потребление кофе.


> Я вроде бы как раз следовал предыдущему твоему совету максимально автоматизировать создание сотрудника.


Это хорошо, но это должно быть не внутри класса Сотрудник. Ведь фактически у тебя есть некая таблица и по ней ищется базовая ставка. Нелогично делать поиск внутри сотрудника, так как это не имеет особого отношения к его зоне ответственности. Это явно какая-то внешняя по отношению к нему штука (Бухгалтерия?). И значит поиск надо делать снаружи, а в сотрудника передавать уже конкретную цифру.

> Так вот же метод и есть, который проверяет, какая у сотрудника профессия и является ли он боссом, а потом в соответствии с этим возвращает потребление кофе! Или я опять что-то не то понимаю...


> Без аргумента как обойтись, когда нужно соответствие профессии и потребления кофе где-то хранить?


А зачем тебе полная таблица? Тебе достаточно знать сколько кофе потребляет конкретно этот сотрудник. Можно ведь просто сделать в нем поле с базовым значением потребления кофе для этой профессии. Тогда будет так:

$coffee = $ivan->getCoffeeConsumption();

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

$coffee = $calculator->calculateCoffeeConsumption($ivan);

Я наверно плохо объяснил, так что если кто-то может объяснить лучше, было бы неплохо.

> >То что у тебя - это просто массив работников, это не Департамент.


> Какой же будет экземпляр в таком классе - отдельный департамент? Что там может быть, кроме включения всех сотрудников, имеющих аргумент при __construct, что они в таком-то департаменте находятся?


Это уже неплохо. Затем можно добавить методы найма/увольнения. И имя департамента надо ведь хранить где-то.

>>713544

> Не решается ли эта проблема использованием ranged_queries?


они по идее для того, чтобы не перегрузить базу и не съесть всю память если данных много, а обрабатывать их потоково.

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

> Проблема с расчетом кол-ва страниц, потому что сфинкс считает все id, включая удаленные. И тогда получается что SHOW META показывает 15 записей, когда на странице их выводится пять (т.е. 10 из них удалены).


Тут можно хитрить - например брать не 5, а 7-8 и откидывать удаленные, если они там есть. Или не удалять записи из базы, а лишь помечать удаленнными. Также, можно попробовать использовать kill query для хранения информации об удаленных записях в риалтайм индексе. Ну в любом случае, надо что-то придумывать.

>>713776

нет особой разницы

>>713777

Уже скоро
#889 #715026
>>713959

> $lettersRus[0] = '/A/';


> $lettersRus[1] = '/a/';


> $lettersRus[2] = '/B/';


> $lettersRus[3] = '/C/';


это слишком горомоздко, и надо следить за номерами. Очень неудобно. Лучше записать так:

'...' => '...',
'...' => '...',
...

Более того, тут не нужна мощь регулярок и хватит просто strtr.

> [а-я]+([a-z]+[а-я]*)+


Можно было чуть проще: русские буквы, за ними латинская, за ними любые.

Там у тебя явная копипаста для русских и латинских слов. Избавься от нее с помощью функций.

>>714337

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

> for ($x; $x < $numberOfEmployees;


Это не будет правильно работать, второй цикл будет отсчитываться не с нуля. И какой смысл вообще писать

$x

Это выражение ничего не делает, его можно вообще пропустить.

>>714423

А почему он должен работать? Почитай внимательно как работает ~.

>>714823

Не знаю. Если в PSR не написано то можно как угодно делать. Я не пишу обычно.
#889 #715026
>>713959

> $lettersRus[0] = '/A/';


> $lettersRus[1] = '/a/';


> $lettersRus[2] = '/B/';


> $lettersRus[3] = '/C/';


это слишком горомоздко, и надо следить за номерами. Очень неудобно. Лучше записать так:

'...' => '...',
'...' => '...',
...

Более того, тут не нужна мощь регулярок и хватит просто strtr.

> [а-я]+([a-z]+[а-я]*)+


Можно было чуть проще: русские буквы, за ними латинская, за ними любые.

Там у тебя явная копипаста для русских и латинских слов. Избавься от нее с помощью функций.

>>714337

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

> for ($x; $x < $numberOfEmployees;


Это не будет правильно работать, второй цикл будет отсчитываться не с нуля. И какой смысл вообще писать

$x

Это выражение ничего не делает, его можно вообще пропустить.

>>714423

А почему он должен работать? Почитай внимательно как работает ~.

>>714823

Не знаю. Если в PSR не написано то можно как угодно делать. Я не пишу обычно.
переход #890 #715029
Аноны, переходите в новый тред >>715010 (OP)

Если кого-то я пропустил, забыл, или мы не до конца что-то обсудили - напомните о себе в новом треде.

Этот тред закрыт. не пишите здесь больше.
#891 #715225
b
#892 #719987
>>703138
<?php

for ($i = 1; $i < 10; $i++) {
$x = ($i2);
echo "$i*$i=$x\n";
}
>>719990>>719991
12 Кб, 295x185
#893 #719990
>>719987
>>719987
обосрамс, господа
>>719991
#894 #719991
>>719987
>>719990
Ты чо тут некропостишь, ты ебанутый?
>>721642
#895 #720177
>>712598

> Также, у тебя нет никакой защиты. id это маленькое число которое легко подобрать злоумышленнику. Надо более серьезную защиту. Чтобы с триллиона попыток не подобрать было.


Так шифровать надо куки или айди в бд? Я предположил, что ты имел ввиду первое и получилось следующее. Мимоаноны или оп подправьте меня, если что не так. Проблема вот в чем: я шифрую куки через функцию password_hash. Мое куки - это айди студента из бд. В бд айди выглядят как 100, 101, 102. Мне нужно доставать данные из бд и я делаю так, я достаю массив айдишников из бд и каждый пропускаю через password_verify, если айдишник совпал с солью (зашифрованным куки), я использую его дальше как расшифрованное куки чтобы потом снова зашифровать и положить в куки. Я правильно накодил? Как шифровать куки, если хэш функция однонаправленная. Возможно хэш нужно хранить в бд? Извиняюсь за сложное описание.
107 Кб, 1059x1059
#896 #721642
>>719991
Ну да)
Тред утонул или удален.
Это копия, сохраненная 2 мая 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски