Двач.hk не отвечает.
Вы видите копию треда, сохраненную 29 августа 2015 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
17 Кб, 284x177
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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

Предыдущий тред был тут: >>503607

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

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

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

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

Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.

- Простая, но полезная задача сделать список студентов: 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

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

https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863

Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568

Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.

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

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

- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Проверялка решений на 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.github.io/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git:

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

Легитимный тред с прошаренным ОПом и гейскими картинками все еще здесь https://2ch.hk/pr/res/510035.html#bottom
sage #3 #514878
>>514877
Ясно, почему второго поста не было.
#4 #514889
>>514877
>>514878
хаха, в очко себя выеби, высокомерный пидор, пишущий в тред, достигший лимита.
#5 #514940
>>514870

Даже ссылку на тред правильно не поменяли, ну их. И у нас всего 600 постов пока.

>>514851

> for ($i=0; $i<=strlen($lowercasedtext);$i++) {if (mb_substr($lowercasedtext,$i,1) != $empty) {


Чтобы убрать пробелы, используй функцию str_replace или strtr, заменяя пробелы на пустую строку.

>for ($ii=0; $ii <= $half; $ii++){


После $i можно использовать $j, $k, Они лучше читаются.

> strlen($without)-$ii-1


Тут ошибка. strlen возвращает длину в байтах, а не число букв (для русских букв не совпадает). Надо использоват mb_strlen. Почитай урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8

> \tif ($ii == $half){


> echo "this word is a fucking PALINDROME, congrats, m8";


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

И смотри внизу ошибку:

> PHP Notice: Undefined variable: without in /home/hz6bPR/prog.php on line 12


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

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

>>514860

Тролль, уходи.
#5 #514940
>>514870

Даже ссылку на тред правильно не поменяли, ну их. И у нас всего 600 постов пока.

>>514851

> for ($i=0; $i<=strlen($lowercasedtext);$i++) {if (mb_substr($lowercasedtext,$i,1) != $empty) {


Чтобы убрать пробелы, используй функцию str_replace или strtr, заменяя пробелы на пустую строку.

>for ($ii=0; $ii <= $half; $ii++){


После $i можно использовать $j, $k, Они лучше читаются.

> strlen($without)-$ii-1


Тут ошибка. strlen возвращает длину в байтах, а не число букв (для русских букв не совпадает). Надо использоват mb_strlen. Почитай урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8

> \tif ($ii == $half){


> echo "this word is a fucking PALINDROME, congrats, m8";


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

И смотри внизу ошибку:

> PHP Notice: Undefined variable: without in /home/hz6bPR/prog.php on line 12


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

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

>>514860

Тролль, уходи.
#6 #514941
>>514894

>>Стоит сделать проверку на наличие apc и при отсуствии откатываться на файловый кеш


> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L12


> $config->setQueryCacheImpl(new \Doctrine\Commmon\Cache\MemcacheCache());


По моему это не файловый кеш

> Это то о чем я говорил, что $app->getRootUri() возвращает не то что мне нужно, он показывает путь до файла index.php, то есть в моем случае он возвращает "/"


Ну и отлично, припиши к этому 'css/bootsrap.css' и получишь нужный путь который независим от текущего URL. Разве это то что надо?

> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/MediaInfo.php#L44


Эту функцию надо сделать либо нестатической либо сделать чтобы она сама создавала и возвращала объект. А то странно смотрится:

> $mediaInfo = $mediaInfo->setMediaInfo($mediaInfo, $info);


Ехал mediaInfo через mediaInfo.

Копипасту из ифов стоит заменить на список полей + цикл по нему.

json_decode лучше использовать с массивом, а не объектом StdClass, так как для работы с массивами есть много функций, а для StdClass нет.

Класс MediaInfoType лучше поместить в другую папку, например, Types.

> public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)


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

https://github.com/doctrine/dbal/tree/master/lib/Doctrine/DBAL/Types

Класс File стоит переименовать в FileUtil или FileUploader и перенести в другую папку.

Почему тип регистрируешь через

> Type::addType('mediainfotype', 'Uppu3\Resource\MediaInfoType');



А не как в мануале советуют,

> $conn->getDatabasePlatform()->registerDoctrineTypeMapping('db_mytype', 'mytype');



?
#6 #514941
>>514894

>>Стоит сделать проверку на наличие apc и при отсуствии откатываться на файловый кеш


> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L12


> $config->setQueryCacheImpl(new \Doctrine\Commmon\Cache\MemcacheCache());


По моему это не файловый кеш

> Это то о чем я говорил, что $app->getRootUri() возвращает не то что мне нужно, он показывает путь до файла index.php, то есть в моем случае он возвращает "/"


Ну и отлично, припиши к этому 'css/bootsrap.css' и получишь нужный путь который независим от текущего URL. Разве это то что надо?

> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/MediaInfo.php#L44


Эту функцию надо сделать либо нестатической либо сделать чтобы она сама создавала и возвращала объект. А то странно смотрится:

> $mediaInfo = $mediaInfo->setMediaInfo($mediaInfo, $info);


Ехал mediaInfo через mediaInfo.

Копипасту из ифов стоит заменить на список полей + цикл по нему.

json_decode лучше использовать с массивом, а не объектом StdClass, так как для работы с массивами есть много функций, а для StdClass нет.

Класс MediaInfoType лучше поместить в другую папку, например, Types.

> public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)


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

https://github.com/doctrine/dbal/tree/master/lib/Doctrine/DBAL/Types

Класс File стоит переименовать в FileUtil или FileUploader и перенести в другую папку.

Почему тип регистрируешь через

> Type::addType('mediainfotype', 'Uppu3\Resource\MediaInfoType');



А не как в мануале советуют,

> $conn->getDatabasePlatform()->registerDoctrineTypeMapping('db_mytype', 'mytype');



?
#7 #514942
>>514470
https://github.com/V3N0m21/Uppu3
Поправил несколько моментов, чуть не сломал мозг делая custom type в доктрине, но все-равно до конца не уверен что все правильно, как-то слишком мудрено получилось, ну и в моем случае не дает никаких плюсов, разве что в целях обучения и понимания.

>При ресайзе маленькие картинки не увеличиваются? ЧТо-то я не вижу проверки на это.



Там стоит проверка на размер, и если одна из сторон меньше заданного размера, задается размер самой картинки
https://github.com/V3N0m21/Uppu3/blob/master/app/Helper/Resize.php#L55

>Стоит сделать проверку на наличие apc и при отсуствии откатываться на файловый кеш



https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L9
Поправил, но не уверен что это правильное решение, я так и не нашел четкого мануала по этому поводу, походу все приходят к пониманию этого методом проб и ошибок.

> {{ app.request.getRootUri() }}../css/bootstrap.min.css


>Что-то это странно. Зачем тут две точки? Мне кажется сразу должен идти путь. Что у тебя выдает getRootUri() ?



Это то о чем я говорил, что $app->getRootUri() возвращает не то что мне нужно, он показывает путь до файла index.php, то есть в моем случае он возвращает "/"

Остальные замечания подправлю и сделаю древовидные комменты, а сейчас интересует вопрос правильно ли я сделал custom type в доктрине
#8 #514943
Пишем тут, посоны.
ОП прошлого треда
#9 #515288
>>514943
Тут только тролли и на ваши вопросы никто не ответит, имейте в виду.
#10 #515299
>>515288
Имейте ввиду, что у кого-то высокомерие и запеканус.
#11 #515355
>>515299
Имейте в виду, что слово «ввиду» не всегда пишется слитно.
#12 #515390
>>515355
Имейте введу, что тут раздел для программистов, а не лингвистов-пидорасов )
#13 #515447
<?php
$opName = "хуй";
echo "Оп - $opName";
exit();
#14 #515550
>>515447
Оставайся на связи, ебанашка в бамплимите.
______
Кто-нить знает, как скачать 1С битрикс? чот грузится долго.
#15 #515620
Внезапно здравствуйте.

Прокомментируйте этот >>514981 пост, пожалуйста.
#16 #515641
Аноны, сегодня совершенно случайно решил посмотреть API контакта https://vk.com/dev/methods и надо заметить очень многое там нашёл интересное для себя. В голове сразу возникло несколько идей приложений для контакта, поясните, например если я напишу приложение для контакта в котором можно будет по интересующему запросу найти группы и пользователей, а потом автоматически оставить на стенах (если они открыты) всякие сообщения, то есть сделать это массово сразу для всех, то есть например слать спам так можно, это будет как-то сразу же пресекаться? Или попросту такое приложение не напишешь в силу некоторых ограниений?
#17 #515739
>>515641
Капча появится
#18 #515782
>>515739
Точно, об этом я не подумал. А какие вообще полезные скрипты со всем этим можно писать? Кроме авторизации и комментариев?
#19 #515817
Продолжая тему АПИ контакта, почему мне выскакивает подобное:
[function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in
Когда я работаю с определёнными и методами и не выскакивает никаких проблем когда работаю с другими методами из АПИ ВК? Код в этом случае выглядит следующим образом:

$uid = "555555555555"; //тут я заменил на случайный
$text = "Ты понимаешь что ты поехавший?";
$mes = file_get_contents('https://api.vk.com/method/messages.send?domain='.$uid.'&message='.$text);
$mes = json_decode($friends);
print_r($mes);
32 Кб, 709x709
#20 #515905
Парни, не могу совладать с cURL.

Uncaught exception 'Exception' with message 'cURL error 77: error setting certificate verify locations: CAfile: cacert.pem CApath: none

Как быть? В php классе cURL явно нигде не вызываю, curl.cainfo = 'cacert.pem'; подключил.
Как быть?
#21 #516005
Я один учу программирования по статьям с хабра и стак оверфлоу вместо учебников?
#22 #516008
>>516005

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


У нас в группе таких полно.

>>515390
Написала тупая обезьяна, не желающая развиваться многогранно.
#23 #516009
>>515620
$lowercasedtext = str_replace(' ',$empty,$lowercasedtext);

Зачем так делать, когда есть trim.
#24 #516011
>>516008
иди сборничек Есеннина почитай, если в школе не начитался, Тупая_абизяна_тм.
10 Кб, 559x228
#25 #516052
Нет времени испытывать это самостоятельно, потому что не дома за пекой, а ответ нужно знать быстро, а как нагуглить я хз.

Такое наследование классов допускается в php?
#27 #516237
Переписал МВК со статьи в хабре, загрузил на хост - не работает.
#28 #516241
Господа, я чот подзаебался на гит чужие работы заливать, где же мой фриланс?
#29 #516249
>>516056
>>516056
тамже написано что множественное наследование одного класса запрещено.
#30 #516260
И как проверять задачи опа, если на хосте и локалке отключен .htaccess, т.е. работу не проверить никак, не писать же в слепую.
#31 #516393
Как через ПХП залезть в HTML DOM, через класс new DOMDocuemnt, или этот класс только для XML?
#32 #516404
По поводу задания про тесты, сама организация добавления вопросов подойдёт как здесь http://www.banktestov.ru ?
То есть после каждого действия перезагрузка сервера а не проблемы с яваскриптом и прочим подобным.
18 Кб, 1366x768
#33 #516599
>>514869
echo "Панель добавления материалов";
echo '<form enctype="multipart/form-data" method="post" action="work.php">
Документ:</br>
<input type="file" name="doc" /></br>
<input type="text" value="Название" name="name" /></br>
<select name="type">
<option value=1>Собственные материалы</option>
<option value=2>Дополнительные материалы</option>
</select></br>
<input type="text" value="Описание" name="descr" /></br>
<input type="submit" value="Загрузить" />
</form>';

Ну и обработчик work.php
$link = mysql_connect('localhost', 'dbroot', 'passwd');
mysql_select_db('database', $link) or die('Could not select database.');
if (!$link) {die('Ошибка соединения: ' . mysql_error());}
else {
\tif ( empty( $_FILES['doc']['name'] )) echo "ОШИБКА ЗАГРУЗКИ";
\tif ( $_FILES['doc']['error'] > 0 ) echo "ОШИБКА ЗАГРУЗКИ";

$doc = file_get_contents( $_FILES['doc']['name'] );
$doc = mysql_escape_string( $doc );
$query="INSERT INTO `data_storage` VALUES(NULL,'".$_POST['type']."', '".$doc."','".$_POST['descr']."')";
mysql_query( $query ) or die ('MysqlERRROR!');
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
}

Результат на скрине. ЧЯДНТ?
18 Кб, 1366x768
#33 #516599
>>514869
echo "Панель добавления материалов";
echo '<form enctype="multipart/form-data" method="post" action="work.php">
Документ:</br>
<input type="file" name="doc" /></br>
<input type="text" value="Название" name="name" /></br>
<select name="type">
<option value=1>Собственные материалы</option>
<option value=2>Дополнительные материалы</option>
</select></br>
<input type="text" value="Описание" name="descr" /></br>
<input type="submit" value="Загрузить" />
</form>';

Ну и обработчик work.php
$link = mysql_connect('localhost', 'dbroot', 'passwd');
mysql_select_db('database', $link) or die('Could not select database.');
if (!$link) {die('Ошибка соединения: ' . mysql_error());}
else {
\tif ( empty( $_FILES['doc']['name'] )) echo "ОШИБКА ЗАГРУЗКИ";
\tif ( $_FILES['doc']['error'] > 0 ) echo "ОШИБКА ЗАГРУЗКИ";

$doc = file_get_contents( $_FILES['doc']['name'] );
$doc = mysql_escape_string( $doc );
$query="INSERT INTO `data_storage` VALUES(NULL,'".$_POST['type']."', '".$doc."','".$_POST['descr']."')";
mysql_query( $query ) or die ('MysqlERRROR!');
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
}

Результат на скрине. ЧЯДНТ?
#34 #516604
Ребят, какой учебник по php лучше читать? Просто нет доступа к интернету на работе, так что нужен вариант в pdf.
#35 #516610
>>516599

>$query="INSERT INTO `data_storage` VALUES(NULL,'".$_POST['type']."', '".$doc."','".$_POST['descr']."')";


Шёл 2015 год...
#36 #516617
>>516610
Да похуй мне на ваши инъекции. Я для себя делаю.
Надо будет выложить не долго будет засунуть туда реалэскейпстринг
#37 #516619
Бери nosql спасай анус.
#38 #516627
>>516599
нету такой директории - написано же. либо папки нет, либо файла, алсо не уверен, что расширение жпг можно доставать функцией файл гет контентс.
#39 #516628
>>516610
>>516627
ясно, хули вы на двачах сидите)))
косяк вам хуй найти, ребята.
а я пойду дальше.
#40 #516657
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
перепечатываю туториал с оф. сайта фреймворка, но в библиотеке нет таких директив, значит ли это, что мне нужно обновить библиотеку?
#41 #516755
Как закрывать соединение с базой данных в PDO?
#42 #516775
>>516604
Пхп для чайников.
#43 #516782
>>514869
Как часто в ПХП используется класс DOMDocument, он чаще используется для чтения? Или для создания тоже часто используется? Я сейчас начал его учить и в качестве обучения решил создать таблицу, довольно много времени заняло, кстати как добавить атрибуты таблицы border = 1 там например через класс DOMDocument
4 Кб, 1061x114
#44 #516814
Не понимаю, почему МВК отказывается работать. В апаче разрешил htaccess.
#45 #516849
Аноны, хочу стать программистом. Хочу стать веб программистом. Стоит ли учить этот язык? Если да, то какие языки помимо этого еще требуются? JS?
#46 #516854
Антоши, а вот я, допустим, начал изучать веб-программирование (стандартную связку php, html, css, js, чуть позже питон с апачем и мускулом вспомню). Всё понятно, проблем нет в общем никаких, но.
Недавно я беседовал со знакомым и заговорили про это вот дело.
Ну и он мне рассказывает о флешкуки, lso итд, т.е. о том, чего не было в учебниках и на разных сайтах.
Так к чему я это - где помимо собственно изучения можно следить за новинками и вообще тенденциями что ли? Чтобы не вышло, что я изучил то, что уже давным-давно устарело.
#47 #516864
>>516854

>Недавно я беседовал со знакомым


Вот у него и спроси. Вангую, что хабр.

>>516849

>Хочу стать веб программистом


>какие языки помимо этого еще требуются?


Гуглишь вакансии "веб программист" и смотришь требования.
#48 #516865
Аноны, сложно ли на пыхе качалку картинок со страницы написать? Что гуглить? Какой примерно алгоритм будет у скрипта?
#49 #516868
>>516864
Значит я по месту попал, но если пхп такой востребованный, то почему его все хуесосят?

С чего посоветуешь учить? Какие основы я должен знать, пока только знаю связь между субд, сервером и пользователем. С полного нуля начинаю.
#50 #516870
>>516864

>Вот у него и спроси.


Спасибо, анон, я не додумался /
#51 #516871
>>516868

>если пхп такой востребованный, то почему его все хуесосят?


Простота, как следствие низкий порог вхождения, как следствие много идиотов в области, как следствие много говнокода. Но в умелых руках...
Я вот, например, часто сталкиваюсь с ситуацией, когда хуесосят убунту, советуя переходить на другие дистрибутивы линукса. Только вот всего парочка вопросов выводит этих высокомерных малограмотных далбаёбов на чистую воду, во всей красе демонстрируя их невежественность и неосведомлённость. Некоторые и не знают про mini iso, судят по Desktop Environment обо всём дистрибутиве, увидивляются, когда я им показываю, что "так", оказывается можно и на убунте.
Поэтому можешь стать джедаем PHP, чтобы потом уверенно ссать ливнем аргументов на ёбла хейтеров.
Почитать не знаю что тебе посоветовать, я так и не понял, что ты знаешь, а что нет.
#52 #516872
>>516865
Бамп. Мне только наводку, ребята. :3
#53 #516873
>>516871
Конечно не к месту, но разве разные дистры линя это не просто одно и то же ядро, но с разными драйверами и софтом идущими изначально (а, ну и граф.оболочкой конечно)?
#54 #516874
>>516873
Есть различия в установке софта, расположении конфигурационных файлов. Но в целом да, популярные дистрибутивы сейчас толком ничем друг от друга не отличаются.
#55 #516878
>>516871
Предположим, что я нихуя не знаю, конечно в моём техновузе немного рассказывали про базы данных, я ставил сайт на хостинг и регистрировал домен. Очень смкьно понимаю как это работает, может даже ошибочно.
Я вот представляют себе так.
Есть хостинг, место на чьём то компе куда ты загружаешь все нужные файлы для своего сайта. Там находятся файлы с хтмл кодом возможно и цсс, но я не видел почему-то

Когда юзер заходит на сайт то у него открывается хтмл код и браузер преобразует его в веб страничку. Юзер лазит по сайту и по сути тут везде хтмл. Юзер региструется на сайте и его данные попадают в базу данных которая предоставляется хостингом как эта база данных работает я вообще не ебу. Жаваскрипт отвечает за анимашки и эффекты всякие.

Я правильно мыслю?

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

Можешь подсказать литературу которая позволит для начала понять КАК ЭТО РАБОТАЕТ.

А то вот все пишут код и все такое, а вот куда они его засовывает я понять не могу.
#56 #516879
>>516878

>Я правильно мыслю?


В общих чертах - да.
Советую "Изучаем PHP и MySQL" Мишель Е. Дэвис, Джон А. Филлипс.
#57 #516881
>>516879
Так объясни вкратце в каком промежутке принимает участие пхп и что он делает своими словами?
sage #58 #516896
>>516881
http://archive-ipq-co.narod.ru/
проскроль до "А как PHP используется на сайтах?" ленивая макака
#59 #516900
Как демонстративно оп хуй игнорирует сложные вопросы поглядитке ка.
sage #60 #516917
>>516900
Сажи лже-треду.
#61 #516950
>>516249
Нет.

Можно:
- class B extends A
- class C extends A
- class D extends B
- class F extends D

Нельзя:
- class C extends A, B
39 Кб, 747x282
16 Кб, 779x354
16 Кб, 775x390
#62 #516975
Анончики, начал учить пхп. Вот читаю сайтик из оп поста с описанием и задачаками. Делаю второе задание и вот задачка, ну вот только делать как сказал автор пик1 редактировать одну строку которую он указал, то у меня вылезает ошибкапик2, делаю по своему и получается, только мне вот почему-то кажется, что это начало того, что я буду говнокодить.

Скажите вот третий пик - говнокод? Нужно делать как написано на первом пике? Так правильней? Или похуй?

Как решить ту задачку по способу автора?
#63 #516976
>>516975

>быстрофикс



Да, проебал в конце второго пика двойную кавычку, ну то похуй.

Если справить, то ошибку не выдает, но вот рандомное число все равно не выводит, вместо $random - пустота
#64 #516980
>>516975
а все разобрался, оказывается еще не работало потому что в скобках в mt_rand была точка, хотя на втором пике стоит запятая хз как она изменилась на точку.

Кароч все работает
#65 #516984
Я не оп, но задачи пока слишком простые, чтобы по ним возникали вопросы. Старайся этот начальный период разбираться сам и гуглить.
40 Кб, 484x506
#66 #516986
>>516984
хорошо, ток подскажи, почему постоянно выполняется первое условие, хотя оно нихуя не выполняется так как $random1 не равен $random2.

написал эту задачку не смотря на то, что писал автор, просто подсмотрел как правильно исопльзовать условие действие, интересно так
#67 #516987
>>516984
а все, сам разобрался, надо ставить двойное равно, сорян, что тут так насрал, больше не буду
#68 #517017
>>514869
Знаете, что я заметил. Никогда не учитесь по русскоязычным туториалам. Пытался ТРИ раза создать MVC по русскоязычному видео с юутуба - ни разу не вышло, сейчас делаю по англоязычному - все получается и все понятно разъяснено. Русня сосет.
#69 #517019
>>516986
Знак равенства == должен быть. Слушай, нахуя тебе эти задачки обоссанные от обосанного пидораса-анимешника, если ты нихуя не знаешь - пиздуй по самоучителю все делай.
#70 #517028
>>517019
Да что блять учить то. Вот я потихоньку познакомился с переменными, циклами и прочей, уже написал пару задачек интересно и то, что нужно. Что не так то?
#71 #517051
explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL))

Вот это вот работает корректно, но я чисто теоретически не могу понять, как можно разбить строку по разделителю, предварительно убрав разделитель rtrim??
#72 #517053
>>517028
Знак равенства от присваивания не отличаешь.
#73 #517102
>>517053
я отличаю, я сделал ту задачу не читая пояснений автора, хотел сам, без помощи, потом почти сразу же нашел ошибку и тоже сам
#74 #517115
Скачал много всяких баз каталогов для регистрации сайтов (СЕО), собрал в один файл получилось примерно 35 000 уникализировал при помощи пхп скрипта, получилось 24 000, теперь хочу проверить сколько из них реально рабочих (те которые хотя бы загружаются) и хочу для каждого послать запрос, то есть 24 000 запросов при помощи file_get_content, но что то я боюсь это делать, как на это отреагирует провайдер?

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

Если у них есть АПИ, то есть смысл попробовать написать скрипт который будет проверять насколько живой тот или иной каталог сайтов. То есть загружаешь файл со списком (урлами) каталогов, проверяешь каждый и возвращаешь уже файл только с теми которые реально работают.
#75 #517215
Народ заделитесь своими решениями регулярных выражений. Хочется посмотреть кто как делает. Они меня в могилу сведут.
#76 #517223
>>517102
>>517102
да не слушай никого. твоя ошибка - дело привычки. Могу посоветовать при проверке равенства писать сначала не имя переменной, а её значение. Т.е if('znachenie==$peremennaya') ,а не if($peremennaya=='znachenie'). В этом случае,если перепутаешь знаки, скрипт выдаст ошибку и проще будет исправить.
#77 #517401
>>516976
>>516980
Будь внимательнее. Подучи синтаксис и посмотри примеры как строятся конструкции.
#78 #517452
В этой задаче

> «Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:


>В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).



Не понимаю, как можно оформить последний пункт с выводом куска текста. Помогите, кто знает, пожалуйста
#79 #517481
Здравствуйте, подскажите, как сделать простенькое меню для сайт в html5/css3. У меня не получается сделать так, чтобы цвет текста меню менялся, когда на него наводишь мышкой. Да и вообще хоть как-то шрифт поменять не получается. Меню типа ul.
#80 #517490
>>517481
тебе нужна анимация в Jquerly
#81 #517514
Зачем вокруг переменной фигурные скобки? Ведь и без них норм выводится.
echo "Число a равно {$a} и оно {$aValue}";
Иглавный вопрос. Почему на оп-пике кот?
#82 #517582
Ни понимаю, как в mvc вывести массив данных. куда его в модель пихать, что в контроллере писать?
#83 #517588
>>517582
модель только возвращает массив с данными, а в контроллере можешь делать все что угодно с этими данными. Если так не выходит, значит, что у тебя неправильная модель хотя, я новичек
#84 #517600
>>517582
Модель нужна ТОЛЬКО для работы с БД/тем местом где у тебя данные. Также в ней могут быть правила ввода данных(name не более 255 символов, например). Естественно что ты должен получать удобные для последующих операций данные, так что если там есть например json, то имеет смысл его декодировать.

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

Такие дела.
#85 #517605
>>514869
ОП, будь человеком, в следующий раз в заголовке/в первой строке треда пиши слово PHP, чтобы господа юзающие "Избранное" на харкаче и/или юзающие куклу, могли без боли понять че это за тред в списке
33 Кб, 500x500
157 Кб, 1024x683
34 Кб, 650x384
187 Кб, 853x480
Клуб любителей изучать PHP 55 #86 #517643
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

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

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

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

Предыдущий тред был тут: >>510035

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

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

продолжение этой захватывающей пасты в ОП-посте
56 Кб, 500x644
72 Кб, 1022x575
Остановись #87 #517645
Остановись.

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

Если тебе лень выравнивать код руками, закачай его на 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
72 Кб, 1022x575
Остановись #87 #517645
Остановись.

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

Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
43 Кб, 721x480
#88 #517649
Если я кого-то пропустил и не ответил в предыдущем треде, напомните о себе
#89 #517656
>>517605

Тред создал не ОП а какой-то торопыга.

>>517582

Если вывести как JSON то должен быть метод в контроллере или вью вроде sendJsonResponse(array $data)

>>517588

Мне слово «массив» тут не нравится. Это может быть и объект, например функция

$studentMapper->getStudentById($id);

вернет объект-студента.

>>517514

Тред создал не ОП

> Зачем вокруг переменной фигурные скобки?


Можно и без них, но если надо отделить переменную от текста то они нужны:

{$x}kg

Также для сложных выражений с массивами они нужны, мануал: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

>>517481

Тебе надо сначала изучить CSS. У нас есть задачки на HTML/CSS и в них ссылки на сайты с туториалами.

>>517490

Хватит и CSS

>>517452

Ну например выводить можно так:

Ошибки:

- не простой а золотой
- жызнь
- жыр

Или так:

[жы]знь [жы]р не простой[ a] золотой
#89 #517656
>>517605

Тред создал не ОП а какой-то торопыга.

>>517582

Если вывести как JSON то должен быть метод в контроллере или вью вроде sendJsonResponse(array $data)

>>517588

Мне слово «массив» тут не нравится. Это может быть и объект, например функция

$studentMapper->getStudentById($id);

вернет объект-студента.

>>517514

Тред создал не ОП

> Зачем вокруг переменной фигурные скобки?


Можно и без них, но если надо отделить переменную от текста то они нужны:

{$x}kg

Также для сложных выражений с массивами они нужны, мануал: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

>>517481

Тебе надо сначала изучить CSS. У нас есть задачки на HTML/CSS и в них ссылки на сайты с туториалами.

>>517490

Хватит и CSS

>>517452

Ну например выводить можно так:

Ошибки:

- не простой а золотой
- жызнь
- жыр

Или так:

[жы]знь [жы]р не простой[ a] золотой
#90 #517662
>>517645

> - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)


Ненавижу, блядь, таких даунов.
Кому-то удобнее отступ в 2 пробела, кому-то в 8, зачем навязывать свое оформление? Табуляция позволяет выглядеть коду так, как программист привык.
А еще стирать такие отступы заебешься. С табуляцией - нажал Backspace один раз, и все, а тут надо держать эту клавишу и следить, чтобы выравнивание не поехало.
#91 #517671
>>517656
А все таки, каким способом мне достать кусок текста? Какую функцию использовать?
#92 #517673
>>517215

запости код и напиши на чем остановился. Может быть подскажем тогда что делать дальше.

>>517102

Не беда, начинающие часто путают = и ==. Ну теперь-то ты вряд ли их перепутаешь.

>>517051

rtrim убирает разделитель только с правого края а не из всей строки:

rtrim("/a/c/c///") => /a/c/c

Ну и это:

> FILTER_SANITIZE_URL



мне не нравится. Зачем это? Ты можешь объяснить как и от чего оно защищает?

>>517028

Все нормально, не слушай троллей.

>>517017

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

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

>>516900

Он не то что вопросы, он тред игнорировал пока старый не закончился.

>>516878

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

PHP используется в динамических сайтах, в которых HTML код геенрируется скриптами на PHP. Как правило PHP скрипт берет данные из базы (например список комментариев) и вставляет в заранее заголовтенный шаблон, получая на выходе динамиечски сгенерированную HTML страничку которую он отдает пользователю.

Статиеские сайты обновляет только вебмастер, руками. Динамические сайты позволяют обновлять содержимое в базе (например добавлять комментарии или редактировать статьи) автоматически, без участия вебмастера.
#92 #517673
>>517215

запости код и напиши на чем остановился. Может быть подскажем тогда что делать дальше.

>>517102

Не беда, начинающие часто путают = и ==. Ну теперь-то ты вряд ли их перепутаешь.

>>517051

rtrim убирает разделитель только с правого края а не из всей строки:

rtrim("/a/c/c///") => /a/c/c

Ну и это:

> FILTER_SANITIZE_URL



мне не нравится. Зачем это? Ты можешь объяснить как и от чего оно защищает?

>>517028

Все нормально, не слушай троллей.

>>517017

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

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

>>516900

Он не то что вопросы, он тред игнорировал пока старый не закончился.

>>516878

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

PHP используется в динамических сайтах, в которых HTML код геенрируется скриптами на PHP. Как правило PHP скрипт берет данные из базы (например список комментариев) и вставляет в заранее заголовтенный шаблон, получая на выходе динамиечски сгенерированную HTML страничку которую он отдает пользователю.

Статиеские сайты обновляет только вебмастер, руками. Динамические сайты позволяют обновлять содержимое в базе (например добавлять комментарии или редактировать статьи) автоматически, без участия вебмастера.
#93 #517674
>>517662

>Кому-то удобнее отступ в 2 пробела, кому-то в 8, зачем навязывать свое оформление?


Причин куча, гугли.

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


Установи нормальный редактор.
#94 #517683
>>516878

> А то вот все пишут код и все такое, а вот куда они его засовывает я понять не могу.


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

> Юзер региструется на сайте и его данные попадают в базу данных которая предоставляется хостингом


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

>>516873

Ядро одно и то же, но например пакетный менеджер разный (apt vs yum).

>>516868

Завидуют успеху или может их на собеседовании прокатили.

>>516868

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

>>516865

Проще может wget взять?

А так, гугли HTTP-клиенты, например buzz, guzzle и библиотеки разбора HTML вроде phpquery.

>>516854

Флеш умирает (последние лет 5, но никак не умрет) так что думаю тебе это не очень актуально. Но если надо, можно взять учебник/мануал по нему и почитать.

> где помимо собственно изучения можно следить за новинками и вообще тенденциями что ли?


Хабр читай для начала.

>>516849

HTML/CSS/SQL/JS/PHP

>>516814

Синтаксическая ошибка, там написано в каком файле и какой строке. Апач и htaccess тут не при чем.

>>516782

Чаще для чтения наверно, но и для создания можно тоже использовать.

Для вывода HTML страницы обычно используют шаблоны (пример http://www.phpinfo.su/articles/practice/shablony_v_php.html ) а не генерирутют дерево DOM. DOM больше для работы с XML.
#94 #517683
>>516878

> А то вот все пишут код и все такое, а вот куда они его засовывает я понять не могу.


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

> Юзер региструется на сайте и его данные попадают в базу данных которая предоставляется хостингом


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

>>516873

Ядро одно и то же, но например пакетный менеджер разный (apt vs yum).

>>516868

Завидуют успеху или может их на собеседовании прокатили.

>>516868

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

>>516865

Проще может wget взять?

А так, гугли HTTP-клиенты, например buzz, guzzle и библиотеки разбора HTML вроде phpquery.

>>516854

Флеш умирает (последние лет 5, но никак не умрет) так что думаю тебе это не очень актуально. Но если надо, можно взять учебник/мануал по нему и почитать.

> где помимо собственно изучения можно следить за новинками и вообще тенденциями что ли?


Хабр читай для начала.

>>516849

HTML/CSS/SQL/JS/PHP

>>516814

Синтаксическая ошибка, там написано в каком файле и какой строке. Апач и htaccess тут не при чем.

>>516782

Чаще для чтения наверно, но и для создания можно тоже использовать.

Для вывода HTML страницы обычно используют шаблоны (пример http://www.phpinfo.su/articles/practice/shablony_v_php.html ) а не генерирутют дерево DOM. DOM больше для работы с XML.
#95 #517692
>>517674

> Причин куча, гугли.


Хоть одну?

> Установи нормальный редактор.


В нормальном редакторе надо нажимать Shift-Tab. А при использовании табуляции - просто Backspace. Одну клавишу нажимать гораздо быстрее.
#96 #517696
>>516755

Тут http://php.net/manual/ru/pdo.connections.php есть способ но он как я понимаю без четких гарантий (так как не факт что ты можешь найти и уничтожить все ссылки в большой программе). Фактически получается, что в большой программе никак. В маленькой — как описано в документации.

С другой стороны при завершении скрипта объект все таки будет уничтожен (как и все остальные переменные) и соединение закроется.

>>516657

Я не понимаю, что значит « в библиотеке нет таких директив»? Где ты смотришь какие «директивы» есть а какие нет?

И что у тебя за библиоека, какой версии? Не ZF1 случайно?

>>516628

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

расширение mysql устарело (открой мануал по mysql_query и посмотри сам), вставлять POSt-переменные прямо в запрос это SQL инъекция. Надо использовать плейсхролдеры.

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

>>516617

Надо делать либо правильно либо не делать вообще.

Вот почитай про PDO например: http://habrahabr.ru/post/137664/

Не любишь PDO, читай про mysqli но там после каждого вызова надо if с проверкой на ошибки писать: http://habrahabr.ru/post/141127/

> Надо будет выложить не долго будет засунуть туда реалэскейпстринг


Что тебе мешает сразу писать правильно? Дай угадаю, неохота писать длинное название mysql_real_escape? Ну так сделал бы функцию которая получает данные и экранирует перед вставкой в запрос. А еще лучше возьми PDO где это уже встроено.

>>516599

Он же пишет, файл не найден. Проверь какой файл он ищет и какая текущая директория (echo getcwd(); ).

Алсо

> $doc = file_get_contents( $_FILES['doc']['name'] );


name это имя файла на компьютере пользователя а не на сервере. Почитай мануал по загрузке файлов: http://php.net/manual/ru/features.file-upload.post-method.php

Вообще, у тебя пока маловато знаний чтобы писать «панель добавления материалов». Сначала надо изучить работу с формами и базой. Я советую пройти наши задачки на список студентов и файлообменник, и тогда ты сможешь свою задачу решить с легкостью. Там правда ООП надо знать, но по ООП у меня есть глава в учебнике.
#96 #517696
>>516755

Тут http://php.net/manual/ru/pdo.connections.php есть способ но он как я понимаю без четких гарантий (так как не факт что ты можешь найти и уничтожить все ссылки в большой программе). Фактически получается, что в большой программе никак. В маленькой — как описано в документации.

С другой стороны при завершении скрипта объект все таки будет уничтожен (как и все остальные переменные) и соединение закроется.

>>516657

Я не понимаю, что значит « в библиотеке нет таких директив»? Где ты смотришь какие «директивы» есть а какие нет?

И что у тебя за библиоека, какой версии? Не ZF1 случайно?

>>516628

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

расширение mysql устарело (открой мануал по mysql_query и посмотри сам), вставлять POSt-переменные прямо в запрос это SQL инъекция. Надо использовать плейсхролдеры.

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

>>516617

Надо делать либо правильно либо не делать вообще.

Вот почитай про PDO например: http://habrahabr.ru/post/137664/

Не любишь PDO, читай про mysqli но там после каждого вызова надо if с проверкой на ошибки писать: http://habrahabr.ru/post/141127/

> Надо будет выложить не долго будет засунуть туда реалэскейпстринг


Что тебе мешает сразу писать правильно? Дай угадаю, неохота писать длинное название mysql_real_escape? Ну так сделал бы функцию которая получает данные и экранирует перед вставкой в запрос. А еще лучше возьми PDO где это уже встроено.

>>516599

Он же пишет, файл не найден. Проверь какой файл он ищет и какая текущая директория (echo getcwd(); ).

Алсо

> $doc = file_get_contents( $_FILES['doc']['name'] );


name это имя файла на компьютере пользователя а не на сервере. Почитай мануал по загрузке файлов: http://php.net/manual/ru/features.file-upload.post-method.php

Вообще, у тебя пока маловато знаний чтобы писать «панель добавления материалов». Сначала надо изучить работу с формами и базой. Я советую пройти наши задачки на список студентов и файлообменник, и тогда ты сможешь свою задачу решить с легкостью. Там правда ООП надо знать, но по ООП у меня есть глава в учебнике.
#97 #517706
>>517683
ой смотрите, кто это у нас собственной персоной заявился.
#98 #517710
>>516599

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

>>516404

Для начала пойдет. Но JS/DOM не такие и сверхсложные вещи, а их знание даст тебе плюсы на собеседовании (если ты хочешь работать программистом) и даст тебе новые возможности по оформлению интерфейса страниц (если ты делаешь проекты для себя).

>>516393

В первую очередь для XML, но умеет читать и генерировать HTML тоже.

> Как через ПХП залезть в HTML DOM,


Создай объект и сделай в нем loadHTML, как в мануале: http://php.net/manual/ru/class.domdocument.php

>>516260

Во-первых, код можно запускать в консоли (на винде в консоли не будет русских букв). ВО-вторых, в некоторых IDE можно запускать код не выходя их них, в встроенной консоли (с русскими буквами в том числе).

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

Как ты пробуешь запускать код?

Как запустить код в консои описано тут в конце: https://gist.github.com/codedokode/7054af4a03865c4cc863

Тебе может быть проще запустить код через браузер под апачом.

>>516241

Так не заливай чужие работы.

>>516237

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

>>516052

да

>>516011

Тупые обезьяны и любители так обзываться идут в другие треды.

>>516009

trim удаляет символы только с краев, а str_replace везде.

>>516008

Тупые обезьяны и любители так обзываться идут в другие треды.

>>516005

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

>>515905

> Как быть? В php классе cURL явно нигде не вызываю, curl.cainfo = 'cacert.pem'; подключил.


А файл cacert.pem в какой папке лежит? Надо наверно полный путь писать. Он еще какой-то CAPath упоминает, может надо его задать?

В мануале написано:

http://php.net/manual/ru/curl.configuration.php

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



Анон, ну ты бы хоть мануал нагуглил для начала.

>>515817

При вставке данных в URL они кодируются процентным кодированием. Если ты это не знаешь то стоит начать с изучения HTTP (урок по нему я пока не написал, так что гугли) и того, как формируются URL.

Также код у тебя конечно ужасный, без проверки на ошибки. хотя как минимум 2 функции (file_get_contetnts и json_decode) могут их выдать.

Алсо отправка сообщений требует авторизации, почитай документацию по API.

>>515641

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

>>515620

В старом треде ответил.

>>515447

Молодец, все верно

>>514943

Ты не ОП
#98 #517710
>>516599

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

>>516404

Для начала пойдет. Но JS/DOM не такие и сверхсложные вещи, а их знание даст тебе плюсы на собеседовании (если ты хочешь работать программистом) и даст тебе новые возможности по оформлению интерфейса страниц (если ты делаешь проекты для себя).

>>516393

В первую очередь для XML, но умеет читать и генерировать HTML тоже.

> Как через ПХП залезть в HTML DOM,


Создай объект и сделай в нем loadHTML, как в мануале: http://php.net/manual/ru/class.domdocument.php

>>516260

Во-первых, код можно запускать в консоли (на винде в консоли не будет русских букв). ВО-вторых, в некоторых IDE можно запускать код не выходя их них, в встроенной консоли (с русскими буквами в том числе).

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

Как ты пробуешь запускать код?

Как запустить код в консои описано тут в конце: https://gist.github.com/codedokode/7054af4a03865c4cc863

Тебе может быть проще запустить код через браузер под апачом.

>>516241

Так не заливай чужие работы.

>>516237

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

>>516052

да

>>516011

Тупые обезьяны и любители так обзываться идут в другие треды.

>>516009

trim удаляет символы только с краев, а str_replace везде.

>>516008

Тупые обезьяны и любители так обзываться идут в другие треды.

>>516005

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

>>515905

> Как быть? В php классе cURL явно нигде не вызываю, curl.cainfo = 'cacert.pem'; подключил.


А файл cacert.pem в какой папке лежит? Надо наверно полный путь писать. Он еще какой-то CAPath упоминает, может надо его задать?

В мануале написано:

http://php.net/manual/ru/curl.configuration.php

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



Анон, ну ты бы хоть мануал нагуглил для начала.

>>515817

При вставке данных в URL они кодируются процентным кодированием. Если ты это не знаешь то стоит начать с изучения HTTP (урок по нему я пока не написал, так что гугли) и того, как формируются URL.

Также код у тебя конечно ужасный, без проверки на ошибки. хотя как минимум 2 функции (file_get_contetnts и json_decode) могут их выдать.

Алсо отправка сообщений требует авторизации, почитай документацию по API.

>>515641

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

>>515620

В старом треде ответил.

>>515447

Молодец, все верно

>>514943

Ты не ОП
#99 #517713
>>517662

В PSR так написано.

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

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

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


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

> Ненавижу, блядь, таких даунов.


Даун тут ты потому что не можешь настроить свой редактор чтобы он отображал код как тебе нравится. Какие же вы убогие табодауны, который год ноют что им не разрешают настраивать отступы и ни один не может дописать пару строчек в конфиге своего редактора.
#100 #517716
>>517600
Так как ввести данные массивом в модель, чтобы потом их соперировать в контроллере и выложить на вью?
#101 #517720
>>517716
Создай ф-ю в модели, которая будет вытаскивать все необходимые данные из БД в массив. После возвращай массив в контроллер с помощью return
#102 #517721
>>517671

Откуда достать? Из HTML? Я же тебе написал, есть библиотеки вроде phpquery. Я дал название (самое важное), твое дело прочесть документацию и разрбраться как она работает. Я за тебя делать твое домашнее задание не планирую.

>>517692

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

> В нормальном редакторе надо нажимать Shift-Tab.


Это неправда. Редакторы прекрасно умеют удалять группы пробелов одним нажатием. Мой саблайм например по бекспейсу все прекрасно удаляет.

Только из-за того что ты не можешь установить и настроить нормальный редактор никто стандарты менять не станет.
#103 #517723
>>517692
Я в emacs нажимаю tab один раз и он автоидентит все с учетом текущей расстановки фигурных скобок.
По поводу причин - не всегда индентация равна кратному числу пробелов. Иногда мы переносим строки на новую строку в случае табов возникает трэш. Вот тут мы хотим сдвинуть под открывающуюся скобку, однако имя функции занимает 9 символов, поэтому нужен лишний пробел:
foo_baarr(bla, bla bla
--->--->-bla, bla, bla) {
В случае другой настройки размера таба, все поедет. В случае пробелов, будет отображаться везде одинаково.
#104 #517728
>>517721
Нет не из html. Есть переменная $text, усть регулярка на проверку ошибок. Ошибку в тексте я могу найти с помощью if(preg_match). Вот, а после того как нашел требуется еще вывести на экран кусок текста
#105 #517729
Ну и да, анон выше правильно написал - не всегда мы смотрим код в любимом редакторе. Иногда нужно и гитхаб заюзать, ideone, или вообще pastebin. И каждый раз наблюдать, как код разъехался из-за того, что размер табов не совпадает с настройками программиста?
#106 #517731
>>517721

> Таб неотличим от пробела и вызывает путаницу


Какая путаница? В начале строки использовать табы, в середине - пробелы.

> Мой саблайм например по бекспейсу все прекрасно удаляет.


Говно же. Переходи на PhpSorm.
#107 #517733
>>517723
Тебе шашечки или ехать? Я просто пишу:
foo_baarr(bla, bla bla
--->bla, bla, bla) {
А художества в стиле ASCII Art в коде не нужны. Таб означает просто отступ внутри блока.

> Иногда нужно и гитхаб заюзать, ideone, или вообще pastebin.


Если иногда - то можно конвертировать и в пробелы.
8 Кб, 480x360
#108 #517737
Может кто запилит нормальный подробный гайд по MVC - в рунете полторы непонятных страницы с хабра, а на ютубе один англ. видос с генерацией url и пара отечественных устаревших пятилетней давности.
#109 #517742
>>517737
Попробуй посмотреть уроки по YII . После просмотра пары уроков, все стало понятно с MVC.
#110 #517744
>>517728

А, понял. У preg_match есть третий параметр, массив, в которой она кладет найденный регуляркой и круглыми скобками в ней текст.

Но тебе нужен не preg_macth, который ищет только первое совпадение, а preg_match_all, который ищет все совпадения, он описан ниже в уроке.

Выделить ощибки можно так же с помощью preg-replace.

>>517731

Визуально неотличим

>>517733

А можно с самого начала конвертрровать все в пробелы и не мучаться с выбором.

>>517737

Есть паста:

https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
#111 #517757
>>517744
А как быть если preg_match находит вхождение, но не помещает его в массив . Вот пиример http://ideone.com/H2Qni1 . Или есть какая-то неучтенная мной особенность ф-и, которую я не знаюю
#112 #517776
>>517757

Ты опечатался в имени переменной, о чем тебе внизу говорит PHP
#113 #517783
>>517776
Спасибо за помощь, забыло что-то эрор репортинг прописать
#114 #517788
>>517776
Но к сожалению теперь появилась другая проблема. http://ideone.com/PM7MFc . Условие проходит как истинное, но не выводится ничего, даже слово Yes. А вот если условие будет ложным то, No выводится нормально
#115 #517790
>>517788

Где флаг u в конце регулярки? Без него корректная работа с utf 8 вообще не гарантируется.
#116 #517795
На чем сайты лучше писать, на фреймворке или цмсе?
#117 #517796
>>517790
Точно же, еще раз спасибо за помощь.
#118 #517799
PHP и MySQL. Разработка веб-приложений
Хотел скачать ее, но в электронных форматах еще не появилась. :(
ОП, посоветуй что почитать, методики, подходы. С документацией я ознакомился, с синтаксисом, но теперь вопрос как все это применить и чтобы это было правильно.
#119 #517802
>>517744
ахуеть какой подробный манул. ну кароч вот тут кантролеры, вот тут мадель, тут вью)) все панятна дети?)) плиз, если тебе нечего ответить на вопрос - не отвечай на него.
#120 #517808
>>517733
А я не пишу, emacs автоматом индентирует под скобку после нажатия Tab и это очень удобно. Я вообще не юзаю оформления, отличного от автоматического (и по этой причине ненавижу питон).

>Если иногда - то можно конвертировать и в пробелы.


Что значит - иногда? У меня все проекты так или иначе лежат в облаке - будь то опенсорсный гитхаб или закрытые гитлаб и битбакет. И это нормально для 21 века. А ты предлагаешь хранить в табах ради... чего? Неумения настроить редактор, чтобы backspace стирал индентационные пробелы (т.е. с начала строки) как табы, по 4 сразу?
#122 #517828
>>517809
все еще недостаточно подробно.
#123 #517837
Оп, поясни как эта строка работает. Тут какая-то магия?

var diff = $(old_array).not(new_array).get();

В итоге получаем массив с элементами old_array, которых нет в new_array.
#124 #517843
>>517837
http://api.jquery.com/not/
https://api.jquery.com/get/
.not() убирает элементы из первого массива, которые есть во втором
.get() без параметра возвращает просто все оставшиеся
#125 #517844
Написал сайт, хочу его выкласть на хостинг, как это можно сделать? Взять заархивировать папку с файлами сайта и кинуть на хостинг? Какой бесплатный хостинг есть?
#126 #517846
>>517844
Если папку заархивируешь, ее придется на серваке и распаковывать. Доступ к unzip на бесплатных не везде есть.
Хостингов бесплатных тут гора
http://www.free-webhosts.com/power-search.php
#127 #517849
>>517844

Hostinger попробуй.
#128 #517857
Касательно качалки картинок.

>Проще может wget взять?


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

>А так, гугли HTTP-клиенты, например buzz, guzzle и библиотеки разбора HTML вроде phpquery.


Спасибо, начал читать.
#129 #517901
ОП, я наконец-то разобрался с настройками Doctrine Extensions, там все просто жуть как мутно, и что удивительно нигде нет четкого объяснения как правильно делать, может конечно я совсем нуб, и для прошаренных это очевидно, но мне кажется в инструкции можно было бы и указывать что нужно ручками регистрировать файл DoctrineAnnotations так как он по какой-то причине сам композером не подтягивается (это я прочитал где-то в комментарии к комментарию на стековэрфлоу, ссылку уже и не найду)

Вот только теперь у меня возник вопрос как эти комменты правильно рендерить. Если не трудно, направь меня в правильном направлении, и если можешь посмотри мой бутстрап
https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php
и таблицу с комментами
https://github.com/V3N0m21/Uppu3/blob/master/comments.sql

Я не уверен, там должен быть внутренний foreign key между parent и child?
#130 #517958
>>517901

> Я не уверен, там должен быть внутренний foreign key между parent и child?


Да, это же связь, пусть и с самой собой.
#131 #517966
>>517901

> `path` varchar(60)


Этого хватит ли? Не забудь сделать проверку на допустимую глубину при постинге.

> `comment` varchar(255)


Этот хватит? У varchar кстати ограничение 65535, но размер строки тоже должен быть не большее 65535 байт и реально можно указать около 20 000 символов.

> `fileId` int(11) DEFAULT NULL,


Нужен foreign key

> ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`children`) REFERENCES `comments` (`parent`)


Что в children хранится? Добавь-ка COMMENT к этому полю.

И добавь-ка уникальный индекс по (fileId, path). Во-первых, это логично, во-вторых, это оптимизирует выборку

WHERE fileId = ? ORDER BY path

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

> `posted` datetime DEFAULT NULL,


Можно писать DEFAULT CURRENT_TIMESTAMP

Также, у тебя там много DEFAULT NULL. Это все необязательные для заполнения поля? Разберись-ка где NULL а где NOT NULL. Для level например можно выставить NOT NULL DEAFULT 0 или NOT NULL DEFAULT 1 в зависимости от того как помечается верхний уровень.
#132 #517972
>>517795

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

>>517799

По SQL есть задачки в ОП посте и там ссылки на какие-то туториалы.

По PHP есть задачки на студентов и файлообменник в ОП-посте.

Ну и 2 неплохих книги по PHP тоже в ОП-посте, правда они не на полного нуба рассчитаны а на того кто знает синтаксис.

>>517802

какой ты дерзкий

>>517837

Это нестандартное использование jQuery. Вообще jQuery это библиотека для работы с массивом DOM объектов. Если ты читал мануалы по jQuery (я надеюсь что читал) то должен знать что объект jQuery имитирует read-only массив — у него есть свойство length и свойства 0, 1, 2 ...

Так-то в этом массиве должны храниться DOM элементы, но jQuery принимает массив чего угодно и этим пользуются, например так:

$([1, 2, 3]).each(...);

То есть как заменой для underscore/lodash (в которой гораздо больше методов работы с массивами).

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

>>517844

По FTP или SFTP. В качестве программы можно взять например WinSCP или (под командуную строку линукса по SFTP) написать bash-скрипт с использованием rsync.

Мне нравится вариант с bash-скриптом так как с ним не надо жать никакие кнопки, но для его написания требуется иметь определенные навыки. Может впрочем можно какую-то GUI программу настроить чтобы синхронизация делалась одной кнопкой.

Не сохраняй пароль от FTP на компьютере, их воруют трояны и заражают потом сайт.
#132 #517972
>>517795

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

>>517799

По SQL есть задачки в ОП посте и там ссылки на какие-то туториалы.

По PHP есть задачки на студентов и файлообменник в ОП-посте.

Ну и 2 неплохих книги по PHP тоже в ОП-посте, правда они не на полного нуба рассчитаны а на того кто знает синтаксис.

>>517802

какой ты дерзкий

>>517837

Это нестандартное использование jQuery. Вообще jQuery это библиотека для работы с массивом DOM объектов. Если ты читал мануалы по jQuery (я надеюсь что читал) то должен знать что объект jQuery имитирует read-only массив — у него есть свойство length и свойства 0, 1, 2 ...

Так-то в этом массиве должны храниться DOM элементы, но jQuery принимает массив чего угодно и этим пользуются, например так:

$([1, 2, 3]).each(...);

То есть как заменой для underscore/lodash (в которой гораздо больше методов работы с массивами).

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

>>517844

По FTP или SFTP. В качестве программы можно взять например WinSCP или (под командуную строку линукса по SFTP) написать bash-скрипт с использованием rsync.

Мне нравится вариант с bash-скриптом так как с ним не надо жать никакие кнопки, но для его написания требуется иметь определенные навыки. Может впрочем можно какую-то GUI программу настроить чтобы синхронизация делалась одной кнопкой.

Не сохраняй пароль от FTP на компьютере, их воруют трояны и заражают потом сайт.
#133 #517973
>>517901

> как эти комменты правильно рендерить.


Выбираешь комменты отсортированные по path, они будут идти в нужном порядке. Отступы можно делать одним из 2 способов:

- просто делать отступ слева например $level × 15px
- заморочиться с иерархической структурой, например используя ul/li для списка комментов и вкладывая список дочерних комментов в блок с родительским. Плюс — в такой схеме проще скрывать/раскрыват ветки так как иерархия тегов соответствует иерархии комментов.
Аноним #134 #517975
Я хейтер, любящие пых - не читайте.
Посоны, начинайте писать на Питоне для начала, или на крестах, синтаксис пыха тяжёлой для понимания, stdlib скомкана в одно пространство имён.
Да, ны пыхе можно фрилансить, а на Питоне с фласком - нет.
Но питон ламповый, для души.
#135 #517978
>>517901

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


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

> и если можешь посмотри мой бутстрап


Вот этот вот кусок: https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L36

> $config = new Doctrine\ORM\Configuration;


> $config->setProxyDir(sys_get_temp_dir());


Подозрительно напоминает содержимое метода

Doctrine\ORM\Tools\Setup::createConfiguration()

Если так, то нельзя ли копипасту заменить на вызов этого метода? Глянь-ка его, реально ли его использовать?

Более того, выше у тебя уже есть вызов

> $config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/Resource"), $isDevMode);



Это как-то нелогично, 2 раза создавать конфиг. Попробуй разобраться как это отрефакторить.
#136 #517981
>>517975
Найди мне в Брянске хоть одну вакансию где нужен питон. Я только рад буду на него свалить, я на нем диплом писал.
Только вот нет таких вакансий, и я более чем уверен, что и в других регионах таких вакансий нет (или появляются раз в год).
А души не существует. А вот голод вполне реален, я проверял.
#137 #517983
>>517981
Ищи удаленку.
25 Кб, 438x323
#138 #517988
Помогите дауну, я уже и гуглил и читал манул и нихуя.

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

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

Помогите блять, посмотрите на пик и скажите как сравнить числа в массиве $height с числом в переменной $anonHeight и занести результат в $answer и так, чтобы $answer стал массивом с числами которые больше того с каким я сравнивал.

Неужели я такой даун,ч то сам не могу осилить? Даже гугл и мануалы не помогли
#139 #517991
>>517988

>быстрофикс



проебал знак $ возле предпоследнего number, но то хуйня
#140 #517993
>>517988
if( $anonHeight < $classmates ) $count++
Как-то так наверное.
#141 #518001
>>517988
if ($height > $anonHeight) $number += 1;
#142 #518007
>>517993

вообще нихуя не понятно, что за $count++. Я это еще не учил. Можешь обьяснить, что происходит если предположим это ввести?
>>518001
Попытался так сделать и в результате выдает пустоту.

Как это понять? Если рост одноклассника анона больше роста самого анона, то мы увеличиваем количество одноклассников аноны которые его выше на один?
#143 #518020
>>518001
>>517993
блять, до меня все таки дошло, спасибо
#144 #518023
>>518007

заовдишь переменную, кладешь в нее ноль, затем каждый раз когда видишь высокого одноклассника увеличиваешь на один.
#145 #518025
>>518007

Там же написано в уроке

$x ++; это то же самое что $x = $x + 1;
$x += $a; то же самое что $x = $x + $a;

Просто более короткий синтаксис для часто встречающихся операций.
#146 #518039
>>518025
Это я знаю, у меня просто хуево с логикой и я хотел сравнить массив с переменной, потом то что подходит под мое условие занести в другой массив, потом подсчитать количество значений в массиве когда можно было просто при нужном ответе увелчивать количество одноклассников на 1 и все.
#147 #518072
Короче, мне надоело заниматься баловством и я решил задрочить что-то близкое к реальной жизни, на чем можно рубить бабло. Что легче будет освоить ньюфагу: yii, symfony или magento?
#148 #518080
>>518072
Смотря чем ты хочешь заниматься. Если тебя устроит клепать интернет-магазины (это очень скучная и однообразная работа) можешь изучать CMS (opencart, magneto). Стоит отметить, не знаю как magneto, но opencart может научить начинающего человека очень хуевым практикам от которых потом будет сложно избавиться. Говеная структура (на словах MVC, а на деле лишь жалкое подобие), повторяющийся код, идиотский метод работы с базой данных, много их.

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

Начинать лучше с yii, потому что понять symfony, если в глаза не видел ни одного фреймворка будет очень сложно.
#149 #518083
ОП, студенты, наверное, готовы: https://github.com/blackberryJam/abiturients
Ошибки исправлены.
Только с неймспейсами и PSR-4 не разобрался ещё. Можешь привести пример, как правильно раскидать классы по неймспейсам?
#150 #518185
Что быстрее будет:
Изучить фреймворк пхп и все что он за собой тянет, или изучить питон?
По пхп знаний побольше будет, чем по питону, хотя с синтаксисом обоих знаком. Применяться будет для веба. Очень сильно не бейте.
#151 #518188
Нужен совет, братья разрабы.
Кошерно ли делать switch case внутри switch case?
#152 #518190
>>518083
Не ОП.
Антоша, а как твой сайт открыть?
Склонировал репозиторий, скинул в папку со своими сайтами на локалхосте, он старые видит, а твой нет. В httpd.conf добавил index.php в строку с DirectoryIndex, с правами доступа всё ок, выставил drwxrwxrwx. В первый раз пытаюсь чей-то сайт открыть.
#153 #518192
>>518190
Удалось получить выхлоп. Всё, я просто MySQL не учил ещё, только установил.
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in /srv/http/hui/app/classes/Container.php:13 Stack trace: #0 /srv/http/hui/app/classes/Container.php(13): PDO->__construct('mysql:host=loca...', 'root', 'ghbdtndfcz', Array) #1 /srv/http/hui/app/bootstrap.php(19): Container->getPDO('mysql:host=loca...', 'root', 'ghbdtndfcz', Array) #2 /srv/http/hui/index.php(2): require('/srv/http/hui/a...') #3 {main} thrown in /srv/http/hui/app/classes/Container.php on line 13
#154 #518194
>>518192
А ты базу слил?
И пользователя и пароль прописал?
#155 #518196
Пых может поломать жизнь не хуже любой дури, поэтому слушай, мой юный друг. Да, Пых — самый короткий и быстрый путь к баблу. Но если ты решил связать свою жизнь с программированием, то совет один: даже и не думай о Пыхе, иначе через пару лет будешь рвать волосы на жопе.

PHP (вместе с Pascal) — самые низкооплачиваемые языки программирования. Сколько бы книг ты ни прочитал, сколько бы мегабайт кода ни написал, ты никогда не будешь получать больше, чем Java-быдлокодер средней криворукости. «На Яве пишут Корпорации», а на Пыхе…
Порог выхода такой же низкий, как и порог входа: если у программиста на полноценных языках с возрастом есть шанс стать ценным высокооплачиваемым специалистом, то у похапе-олдфага такой возможности нет просто ввиду убогости и примитивности решаемых задач, его спокойно можно выгнать на улицу, взяв взамен школьника, который обучится всем премудростям похапе-быдлокоддинга за пару месяцев, потребляя при этом в три раза меньше доширака.
Возможно, сейчас тебе кажется, что делать сайты — достойное и интересное занятие, но если ты хоть немного программист, через пару лет такой работы ты просто завоешь от того, насколько это унылая и далекая от программирования деятельность.
Большинство проектов кроме того, что по сути своей убоги, представляют из себя чудовищный говнокод на кривых самодельных говнофреймворках и говноCMS (потому как сам язык не только не заставляет писать правильно, но и фактически подталкивает к производству быдловелосипедов). Как следствие такой работы — необратимое поражение мозга и окончательная потеря квалификации. Чему также способствует работа в коллективе невероятно тупых похапешников, постоянные оскорбления и обвинения (просто потому, что умный человек PHP не выберет).
Некоторые начинают работать на PHP с надеждой потом перейти на что-нибудь другое. Но это тоже большая ошибка: во-первых, теряется драгоценное время для старта (наверное, самое важное и ценное в и без того короткой профессиональной жизни программиста), а во-вторых, PHP-опыт никому не нужен и нормальные программисты справедливо смотрят на него как на говно. «PHP» — клеймо быдлокодера на лбу и крест на карьере профессионального программиста, если ты пошёл по этому пути, назад дороги уже не будет. Единственное исключение — устроится похапешником на многопрофильную фирму, где тебя каким-то чудом заметят и предложат перейти на полноценную технологию, но это невероятная удача.
Чуть более, чем вся относительно хорошо оплачиваемая работа для похапешников состоит из поддержки ботнетов, порносайтов, говносайтов с вирусами и прочего подобного дерьма. Подумай, хочешь ли ты потратить свою жизнь на засирание интернетов.

PHP погубил очень много потенциально хороших программистов просто благодаря легкости изучения на начальных этапах. Он затягивает как наркотик, с ним очень легко и приятно начать, вот только когда приходит понимание принципиальных недостатков как самого языка, как и (что гораздо более важно) его убогой ниши — часто оказывается уже слишком поздно что-то менять. Так что учись программировать, думай о будущем и обходи PHP стороной. Потому что с PHP у тебя нет будущего — это путь в никуда.
#155 #518196
Пых может поломать жизнь не хуже любой дури, поэтому слушай, мой юный друг. Да, Пых — самый короткий и быстрый путь к баблу. Но если ты решил связать свою жизнь с программированием, то совет один: даже и не думай о Пыхе, иначе через пару лет будешь рвать волосы на жопе.

PHP (вместе с Pascal) — самые низкооплачиваемые языки программирования. Сколько бы книг ты ни прочитал, сколько бы мегабайт кода ни написал, ты никогда не будешь получать больше, чем Java-быдлокодер средней криворукости. «На Яве пишут Корпорации», а на Пыхе…
Порог выхода такой же низкий, как и порог входа: если у программиста на полноценных языках с возрастом есть шанс стать ценным высокооплачиваемым специалистом, то у похапе-олдфага такой возможности нет просто ввиду убогости и примитивности решаемых задач, его спокойно можно выгнать на улицу, взяв взамен школьника, который обучится всем премудростям похапе-быдлокоддинга за пару месяцев, потребляя при этом в три раза меньше доширака.
Возможно, сейчас тебе кажется, что делать сайты — достойное и интересное занятие, но если ты хоть немного программист, через пару лет такой работы ты просто завоешь от того, насколько это унылая и далекая от программирования деятельность.
Большинство проектов кроме того, что по сути своей убоги, представляют из себя чудовищный говнокод на кривых самодельных говнофреймворках и говноCMS (потому как сам язык не только не заставляет писать правильно, но и фактически подталкивает к производству быдловелосипедов). Как следствие такой работы — необратимое поражение мозга и окончательная потеря квалификации. Чему также способствует работа в коллективе невероятно тупых похапешников, постоянные оскорбления и обвинения (просто потому, что умный человек PHP не выберет).
Некоторые начинают работать на PHP с надеждой потом перейти на что-нибудь другое. Но это тоже большая ошибка: во-первых, теряется драгоценное время для старта (наверное, самое важное и ценное в и без того короткой профессиональной жизни программиста), а во-вторых, PHP-опыт никому не нужен и нормальные программисты справедливо смотрят на него как на говно. «PHP» — клеймо быдлокодера на лбу и крест на карьере профессионального программиста, если ты пошёл по этому пути, назад дороги уже не будет. Единственное исключение — устроится похапешником на многопрофильную фирму, где тебя каким-то чудом заметят и предложат перейти на полноценную технологию, но это невероятная удача.
Чуть более, чем вся относительно хорошо оплачиваемая работа для похапешников состоит из поддержки ботнетов, порносайтов, говносайтов с вирусами и прочего подобного дерьма. Подумай, хочешь ли ты потратить свою жизнь на засирание интернетов.

PHP погубил очень много потенциально хороших программистов просто благодаря легкости изучения на начальных этапах. Он затягивает как наркотик, с ним очень легко и приятно начать, вот только когда приходит понимание принципиальных недостатков как самого языка, как и (что гораздо более важно) его убогой ниши — часто оказывается уже слишком поздно что-то менять. Так что учись программировать, думай о будущем и обходи PHP стороной. Потому что с PHP у тебя нет будущего — это путь в никуда.
#156 #518200
>>517643
помогите советом
у меня есть несколько блоков, в которых есть изображения, эти блоки формируются на основе данных из бд.
Так вот, мне хотелось бы иметь возможность посчитать количество изображений в каждом из блоков и в зависимости от этого менять их размер.
$('.изображение').length показывает количество всех изображений, но как найти конкретно в каждом из блоков?
#157 #518206
>>518196
Ну и что посоветуешь? Я сам на второй курс перевёлся, на первом был С++, вроде нормально зашёл, но вакансий я по нему в нашем городе не видел. Летом начал учить PHP, чтобы уже следующим летом мог зарабатывать, рассказал об этом своему дяде-железячнику (C+asm, но зарабатывает благодаря знаниям в електронике), он меня засмеял и сказал "бросай эту хуйню, это не программирование". Вкатываться к дяде и в настолько низкий уровень я не хочу. Куда податься?
#158 #518209
>>518206
Хз бро. По мне так пхп переживает второе рождение. С ООП и фреймоворками. Осенью уже 7 версия должна выйти. Да и посмотри рынок вакансий не только в своем городе. В представлении можно годика 3 в бэкенде поработать. Потом на Java переехать. А там уже ентерпрайз кодить.
sage #159 #518212

>php


>размять мозги

#160 #518216
>>518209

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


Да, я просто охуеваю, глядя на вакансии. Поэтому и выбрал PHP.
Есть вакансии, на которые я уже по скиллам могу за еду устраиваться, судя по требованиям. А я готов и не против.
#161 #518219
>>518192
Шоб работало, тебе надо создать виртуальный хост "site.local" и в dbconfig.php своего юзера, название БД и пасс поставить. Ну и таблицу abiturients создать не забудь (её дамп есть в репозитории).
#162 #518220
>>518219
пасс всмысле пасскод?
#163 #518221
>>518196

>PHP (вместе с Pascal) — самые низкооплачиваемые языки программирования.


ВАСИК забыл ещё.
#164 #518222
>>518220
Пароль к твоей бд.
#166 #518269
Что быстрее будет:
Изучить фреймворк пхп и все что он за собой тянет, или изучить питон?
По пхп знаний побольше будет, чем по питону, хотя с синтаксисом обоих знаком. Применяться будет для веба. Очень сильно не бейте.
#167 #518310
>>516942

>Также когда ты хочешь найти знак доллара, придется наставить бекслешей. По правилам регулярок ты должен вписать \$ но с учетом обработки строк PHP придется написать "\\\$" для строки в двойных кавычках и '\\$' для строки в одинарных.


Получается, и двойные, и одинарные кавычки конвертируют "\\" в "\"?
Как-то нелогично сделано. В мануале сказано, что экранирование работает только для двойных кавычек, а на деле выходит не совсем так.
#168 #518343
>>518310
$text = "Съешь еще этих мягких \"французских\" булочек.";
#169 #518353
>>518343
Я имел в виду, что экранировать символы возможно только внутри двойных кавычек. Так сказано в мануале.
А на деле echo '\\s' выводит \s.
#170 #518354
>>518353
Я к тому, что экранирование бекслеша срабатывает и в одинарных кавычках, не только в двойных.
#171 #518356
>>518354
Так и должно быть. Разницы между одинарными и двойными кавычками нет.
#172 #518389
>>518310

Список всех escape-последовательностей есть в мануале, почитай его: http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.single

> Чтобы использовать одинарную кавычку внутри строки, проэкранируйте ее обратной косой чертой (\). Если необходимо написать саму обратную косую черту, продублируйте ее (\\). Все остальные случаи применения обратной косой черты будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как \r или \n, они будут выведены как есть вместо какого-либо особого поведения



В одиночных кавычках escape-последовательностей меньше (всего две), но они есть.
#173 #518391
>>518356

Разница есть и она описана в мануале.
Аноним #174 #518469
Сап, pr. Недавно в программировании и многое еще не понимаю, надеюсь на вашу помощь. Суть в чем, есть форма с html страницы, нужен файл-обработчик php, который при отправлении данных с этой страницы брал все значения, и просто высвечивал эти результаты уже на другой странице. Т.е есть например
<select>
<option name="doc1" value="fr">Док1</option>
<option name="doc1" value="bs">Док2</option>
<option name="doc1" value="mel">Док3</option>
<option name="doc1" value="gl">Док4</option>
</select>
И если пользователь выберет, например, Док2, то на след. странице было бы написано doc1, bs. Если кто подскажет как такое сделать, было бы здорово.
Спасибо большое заранее.
#175 #518470
Оп.
Посмотри в правильном ли я направлении решаю задачу про котов и мышей.
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse
Можешь попинать.
#176 #518537
В общем MVC из туториалов я ни асилил. Пишу шаблонизатор по его мотивам.
#177 #518543
>>518537

Прежде чем писать свой шабонизатор стоит изучить существующие, например шаблоны на чистом PHP и twig. Иначе с большой вероятностью у тебя получится очень низкокачественный результат (откуда я знаю? я видел велосипеды написанные другими людьми).

Для изучения MVC ты можешь попробовать сделать задачу на список студентов из ОП-поста.
#178 #518553
>>518209
ой, не знаю, я наверное сделаю свой динамичный сайт, может еще какой фреймворк освою и перекачусь в шарписты. Требования к вебпрогерам какие-то запредельные, нужно быть человком-оркестром, знать ВСЕ цмс, битриксы, вордпрессы, фронтенд, кучу фреймворков, а еще логиниться во всяких яндексаналитиках. я уж не говорю про опыт работы. не, не мое это по ход.
#179 #518555
>>518543
ну так я с шаблонами-то и делаю. я наверное не то слово употребил
#180 #518556
>>518543
для того, чтобы сделать задачу про студентов, я сначала должен понять, как мвк работает, классы энти.
#181 #518563
>>518553

Если для тебя требования к PHP/веб-разработчику запредельные то какими же тебе покажутся требования к разработичикам других языков? На собеседовании по Java тебя попросят как минимум написать сортировку, а может даже алгоритм балансировки бинарного дерева, и поверь, ты его замучаешься писать.

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

>>518556

Классы изучаются в моем учебнике, если ты его прошел то должен знать ООП. MVC можно изучать по ходу дела, это всего лишь раделение кода на 3 части и ничего там особого нет.
#182 #518590
>>518563

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


Знаешь, вот это вот все хотя бы входит в область чистого программирования, а ТЗ уровня ОЙ ПОДПРАВЬТЕ ТУТ КОД на какой-то цмски, которую я в глаза не видел, или необходимость качать платный битрикс, а фреймворков-то больше, чем пальцев на моих руках и каждую неделю выходит новый, в шарпе один .NET.
Как раз говорю тебе об опыте вирт. собеседований.
#183 #518591
>>518563
ну вот я и буду разделять на три части и писать контроллеры КАК МНЕ УГОДНО. ОПП знаю на уровне синтаксиса.
46 Кб, 625x583
#184 #518592
Привет всем, решаю задачки ОПа и как обычно я даун не могу справиться самостоятельно и понять в чем ошибка.

Вопросы:
1. Не уебищный ли случаем у меня код? Можно ли его как-то уменьшить и сделать более лаконичным?

2. Где ошибка? Почему вот когда вывожу переменные, то некоторые из них проебываются и каждый раз разные.

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

> слово1 слово2 слово3


> слово1 слово2 слово3


> Я слово4 слово5

#185 #518593
>>518592
Гениально. Я думал я видел всё, код на пастэбине и тому подобное, но код на лоурезных скриншотах еще никто не выкладывал.
#186 #518596
>>518593
Ну блять, иначе код бы не влез, я мог бы скопировать в ворд, но тогда он бы похожу проебал подсветку и прочие плюшки.

Поэтому я уменьшил масштаб, но код между прочим вполне читабельный если приблизить.
#187 #518597
>>518590

Ну да, есть такая фигня, что в вебе нужно быть постоянно в курсе дела, особенно это касается фронтэнда. Во всяких C++ или прочих подобных языках порог вхождения пусть и выше, но зато там по сути выучил что-то и в идеале и все, кодишь на этом до усрачки.
#188 #518599
>>518596

Ссылку на свой код кинь и все. Сайт для этого и предназначен собственно.
#189 #518600
>>518596
Не перестаю проигрывать, продолжай.
#190 #518603
>>518593
Я выкладывал. Правда они были не лоурезные. И скринил я текст из редактора десктопного.
#192 #518630
>>518597

Сидеть в уютном болоте?

>>518592

В массиве индексы начинаются не с 1 а с нуля. Также, есть функция array_rand выбирвающая случайный индекс, может с ней получится покороче.

>>518596

У скриншотов преимущество что не надо никуда переходить, а у ссылки на ideone что можно копировать код, править и перезапускать.

И списывать со скриншота другим анона сложнее (это плюс).
#193 #518652
>>518630
http://ideone.com/V5qQTE код таким образом стал еще больше, но зато теперь все нормально работает и генерирует слова, правда интересно почему в том случае не работало, вродь все правильно же было.

Спасибо в общем
#194 #518654
>>518652
Что значит всё правильно было? Тебе же сказали: индексы в массивах с нуля начинаются, а значит у тебя в коде могло быть обращение к несуществующему элементу массива.
#195 #518658
>>518654
ну смотри, там было так
$name1 = $word1[mt_rand(1,count($word1))];

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

Ведь не обязательно выбрать рандомное число от 0 до максимальных чисел массива, я ведь могу например взять рандомное число от 3 до 6?
#196 #518659
>>518658
Посмотри какое число возвращает функция count с твоим массивом, затем какой последний индекс в этом массиве.
#197 #518664
>>518659
так вот в чем ошибка то была, count указывала индекс 4, когда в массиве было [0, 1, 2, 3]

все равно проблема была не в том, что я 1 вместо нуля,а в том, что count не совсем дает то, что нужно

блин, мне нравится программирование, сидишь тут задачки решаешь, находишь ошибки, чувство прям как будто что-то важное делаю
#198 #518665
>>518664
А то. А когда баги вылавливаешь, вообще как в детективе каком-то.
#199 #518666
>>518659

>все равно проблема была не в том


а нет, ты мне все это время обьяснял, только я только что допер, сорян
#200 #518668
>>518665
ну вот вообще когда код, допустим на работе пишешь во сколько раз он больше этой задачки и сложнее?
#201 #518672
>>518668
Откуда ж мне знать, я у мамы иждивенец.
#202 #518676
>>518672
я тож, а мне всего-то 21
#203 #518678
>>518676
Прямо как мне.
#204 #518680
>>518678
И мне.
#205 #518690
>>518470
Оп ты посмотришь чего я наворотил?
#206 #518703
>>518676
Охуеть, как представлю, что мне до 21 года ещё туева хуча времени, так сразу радостно на душе становится. Столько времени для изучения.
#207 #518705
>>518703
ну ну. Жизнь тока начинается. До 30 успеешь. бла бла бла. Начинай ебашить с сегодня, даже лучше сейчас.
#208 #518710
>>518703
Та же хуйня когда читаю про всяких 26+ кунов, но уже хуево конечно, что 21, столько всего упустил, ну и похуй, ничего уже не вернёшь, поэтому остаётся только наверстывать

кун-21
#209 #518739
>>516349 - кун репортинг ин
Сходил на собеседование, спрашивали по очереди mysql, ооп, магические методы, git, трейты, новые фичи в пхп, отличие интерфейса от абстрактного класса и прочее в таком духе. Завалился на mysql, спрашивали про разные движки mysql кроме innodb и myisam, транзакции, ну я это и не знал. Еще спросили, что такое динамический вебсайт, а я и не в курсе, думал это сайт с javascriptом.
#210 #518743
>>518739

Это на джуна? Что за город?
1579 Кб, 2592x1456
#211 #518782
Ебашу ООП. Второй заход. Первый был неудачный, потому что после процидурок понять нахуй нужно это ООП ебаное так и не вышло. Набижал после того как наигрался с JS, jQuery, AJAX. Теперь-то понятно что в html вообще не должно быть php-кода, а сама html-страница лишь принимает результат, который вернул php с помощью AJAX (в XML) и js это дело интерпретирует. Ну кароче вот. Думаю еще чуть-чуть и сам случайно придумаю паттерн программирования, естественно который уже есть в природе, лал. Про паттерны ниебу ниче, думаю если не понятно, значит пиздуй учить основы, а если сам выдумал, то уже можно браться и за них. Ну вот, типа опытом поделился. Если кто застрял - имейте ввиду, может пригодится кому. Вот.
#212 #518783
>>518739

Кстати практически все изучается в нашем треде.

Если тебе интересны двидки в MySQL: https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

Из сколько-нибудь полезных там движок MEMORY который хранит данные в памяти (например для временных данных или для тестов).
#213 #518785
>>518782

> Теперь-то понятно что в html вообще не должно быть php-кода, а сама html-страница лишь принимает результат, который вернул php с помощью AJAX (в XML) и js это дело интерпретирует.


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

По ООП есть глава в учебнике из Оп поста, там вроде все просто объясняется.
#214 #518801
>>518743
На джуна, ДС.

>>518783
Спасибо, потренируюсь. Ну я хоть теперь представляю, о чем на собеседованиях вообще спрашивают. Еще спрашивали, как сайт заливать на сервак, я сказал по FTP, но они сказали что устарело давно и теперь там какая то бодяга, которая сама из git все вытаскивает, запускает тесты, проверяет и формирует архив сайта, а он потом на сеть серваков заливается хз чем и разворачивается там. Ну я про это вообще не в курсах был. Еще сказали весь сайт поделен на домены по набору фич/классам, у каждого домена своя команда и репозиторий. И когда они эти домены между собой связать пытаются, вечно глюки возникают, которые год уже пилят толпой.
#215 #518803
В SQL-задаче на лайки двух таблиц хватит же?
#216 #518804
>>518801
А ссыль на вакансию не выложишь?
#217 #518807
>>518803

Да, хватит. И двух джойнов в запросе.
111 Кб, 1920x976
#218 #518811
Не, я все-таки не могу понять логику МВК в ООП, вот хоть убей. попробую, подглядывая у того чувака, сделать задачку на студентов, может тогда пойму. Вот по мануалу могу сделать, а если начинаю свой массив разбивать, то все нахуй, только первая переменная выводится.
#219 #518814
>>518804
Деанон же. Меня туда взять обещали, если никто лучше за неделю не придет.
#220 #518816
>>518739

>Еще спросили, что такое динамический вебсайт, а я и не в курсе, думал это сайт с javascriptом.


ахаха блять.
#221 #518817
>>518807
В первой (users) у меня поля id, name. Во второй (likes) -- лайкер и лйкнутый, оба ссылаются как внешние ключи на users.id. В правильном направлении мыслю?
#222 #518821
>>518785

> Рендеринг на клиенте нужен только для веб-приложений


Я так и хочу. Веб-приложения, Site as Service (или как оно там правильно). Статейники и магазины можно и мышкой с помощью друпала наклацать. Да там и до мобильных приложений, чую, рукой подать.
#223 #518823
>>518814
А какие требования в ней были можешь рассказать? И что сам вообще умеешь, какие задачи из оп-поста решал?
Ну и удачи тебе.
#224 #518826
Между прочим, 30 лет - считается ранним для программиста, забугром все в этом возрасте только в джуны идут.
#225 #518837
>>518811

«тот чувак» немного переусложнил код и попытался там чуть ли не Юи написать.

Проще сделать так:

- контроллер = скрипт в корневой папке, например index.php или profile.php
- модель — класс Студент + data mapper для загрухзки/сохранения его в БД + класс для валидации
- вью = шаблоны

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


Не копируй код. Ты должен написать его сам от начала до конца. Да и там приложение простейшее.

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

Также почитай комментарии к заданию. Там очень много полезного написано.

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

Также, включи отображение ошибок (display_errors = 1) на своем компьютере или смотри лог ошибок — наверняка там есть ошибки которые ты не видишь.

>>518817

Норм

>>518821

> Site as Service (или как оно там правильно).


SaaS значит Software as a Service и ты по моему что-то путаешь.

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

> Да там и до мобильных приложений, чую, рукой подать.


Их пишут на Java/Obj-C/Swift и там своя атмосфера.
#225 #518837
>>518811

«тот чувак» немного переусложнил код и попытался там чуть ли не Юи написать.

Проще сделать так:

- контроллер = скрипт в корневой папке, например index.php или profile.php
- модель — класс Студент + data mapper для загрухзки/сохранения его в БД + класс для валидации
- вью = шаблоны

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


Не копируй код. Ты должен написать его сам от начала до конца. Да и там приложение простейшее.

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

Также почитай комментарии к заданию. Там очень много полезного написано.

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

Также, включи отображение ошибок (display_errors = 1) на своем компьютере или смотри лог ошибок — наверняка там есть ошибки которые ты не видишь.

>>518817

Норм

>>518821

> Site as Service (или как оно там правильно).


SaaS значит Software as a Service и ты по моему что-то путаешь.

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

> Да там и до мобильных приложений, чую, рукой подать.


Их пишут на Java/Obj-C/Swift и там своя атмосфера.
#226 #518838
>>518826

За бугром в 25 становятся миллиардерами (Цукерберг)
#227 #518839
>>518823
В требованиях были опыт высоконагруженных вебсайтов, memcached (про нее тоже на собеседовании спрашивали подробно), ООП, бэкенд и фронтенд. По фронтенду спрашивали как jquery работает, зачем там селекторы, что делают, что вообще она делает, по ооп много вопросов было, которые в мануале с php.net в разделе ООП все есть, еще интересовались умею ли в elastic search, я про это тоже хз. Сказали, что часто к ним приходит народ с институтов и находит у них в коде паттерны и даже называют их по именам, а их программеры под 40 и не знали, что это паттерны, сами удивляются, а потом уходят, ибо кодить с институтов никто толком не могет.
#228 #518842
Парни, пытаюсь включить класс в проект, а итог - белый экран.
Как отловить ошибку?

require_once('cat1/lol.class.php');
require_once('cat2\cat3\NextClass.php');
#229 #518845
>>518842

Включить отображение ошибок (если дело на твоем компьютере, display_errors = 1) или смотреть логи ошиьок (если дело на сервере).

Если конечно в коде не стоит error_reporting(0) (игнорировать любые ошибки), тогда надо заменить там 0 на E_ALL.
#230 #518850
>>518839

Судя по твоим ответам, у тебя нет нужного опыта (хотя может им он и не очень требуется). Опыт в хайлоаде подразумевает хорошее знание особенностей mysql, индексы, explain и оптимизацию запросов, кеши/nosql хранилища, понимание сетевых технологий, знакомтсво с nginx, понимание как работает масштабирование, ну и знание самого PHP должно быть на высоком уровне.

Так что если тебя возьмут то сможешь многому научиться.
#231 #518851
Что быстрее будет:
Изучить фреймворк пхп и все что он за собой тянет, или изучить питон?
По пхп знаний побольше будет, чем по питону, хотя с синтаксисом обоих знаком. Применяться будет для веба. Очень сильно не бейте.
#232 #518853
>>518851

А на Питоне без фреймворков и библиотек (и разумеется SQL/HTML/JS/CSS) что-нибудь пишут? Скрипты для переименования файлов разве что.

Я не вижу в каком месте изучение Питона проще. Более того требования к Питон разработчикам выше, а вакансий меньше (а также за них могут меньше платить потому что они более «интересные», не с каким-нибудь пхп возиться).
#233 #518856
>>518850
Ну да, я в mysql плавал вообще, я дальше joinов и where/having его не проходил же, только по ООП и фронтенду все норм ответил, по сетевым технологиям не спрашивали, сказали у них админы этим занимаются. Еще сказали нужно линукс на уровне пользователя знать, заебало их всех приходящих линуксу обучать.
#234 #518857
>>518838
Паша раньше стал же. И зачем приводить единичные случае, я говорю об обстановке в целом.
#235 #518859
>>518857
Паша не миллиардер. И никогда им не был. Рублёвым разве что только.
#236 #518861
>>518850

>понимание как работает масштабирование


А про это где почитать можно? Я как раз не понимаю.
#237 #518862
>>518853
C SQL/HTML/JS/CSS в разной степени годдности знаком.
Читал статейку про создание простого приложения на джанге(гостевая), другой уровень разработки, генерация админки. Ну у Laravel примерно такой же уровень, хороший фреймворк, но путаницы больше.
#238 #518863
>>518856

По линуксу конечно хорошо бы сделать «Путь линукса», из задач. Хотя конечно аноны что-то не рвутся проходить путь HTML/CSS, но пусть хотя бы те кто хочет, получить возможность научиться командной строке.
#239 #518865
>>518863
C Yii вообще нечего сравнивать, хотя и про уии говорят что не очень сложен в освоении, по уровню ниже чем ларавел к примеру, намного.
#240 #518866
>>518861

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

Почитать можно например на хайлоаде: http://ruhighload.com/scale

Это скорее обзорные статьи, чтобы знать что вообще бывает. Хорошо бы это дополнить практикой, если у тебя есть желание, мы можем какую-нибудь распределенную борду или анонимный твиттер запилить, с кешами и шардингом. А потом нагрузочными тестами помучать (хотя конечно для этого надо бы несколько серверов иметь). Чтобы делать задание разумеется надо хорошее знание SQL и индексов. Задание долгое, месяца на 2-3 легко может затянуться пока ты со всем будешь разбираться.

>>518862

В Сифмони тоже есть Соната для создания админки, причем нормально, без кодогенерации.
#241 #518874
>>518866
Да тоже склоняюсь к РНР, знаний побольше о нем, питон еще думаю потом успею освоить.
#242 #518876
>>518866
Было бы интересно. Я пока статьи по оптимизации sql запросов осваиваю, какие в прошлом треде были.
#243 #518878
>>518876

Ок, я продумаю задание и завтра тогда может напишу.
#244 #518901
>>518837

>display_errors = 1)


у меня это включено
#245 #518904
>>518839
а ты без института?
#246 #518932
Аноны, поясните, почему не работает?

У меня уже голова не варит.
http://ideone.com/n9ZGn8
#247 #518937
>>518904
Ну да, но опыт эникейства в другой шараге есть.
#248 #518972
>>518932
$i==$halfLength
Я не ОП, но думаю вот это.
#249 #519014
>>518200
бамп вопросу
#250 #519015
>>518932
1. У тебя условие цикла ($i==$halfLength). Это значит, что цикл выполнится только когда $i = полудлинне строки. То есть всего 1 раз.
2. Чтобы выбрать последний символ в строке, в mb_substr() надо передать следующие аргументы: mb_substr($text, -1, 0). Отсчёт с конца начинается с единицы. Ты же, приравнивая $o к $i, передаёшь туда -0, который становится нулём и указывает на первый символ строки. А дальше у тебя будет сравниваться второй с последним, третий с предпоследним и т. д.
3. Также, в теле цикла у тебя неверное условие определения палиндрома. По такой логике получается, что если одна пара букв с противоположными индексами совпадает, то слово -- палиндром.
#251 #519016
>>519015

>надо передать следующие аргументы: mb_substr($text, -1, 0)


Вернее, mb_substr($text, -1, 1).

самопочин
#252 #519036
>>519015
Да я так заебался с этой задачей, блять, это вообще нормально, что я ее так долго решаю?
Вот взгляни, вроде как по идее все правильно сделано. Беру по символу с конца и начала, если они одинаковы, то добавляю к $word1 начальный символ и к word2 - конечный, если нет, то выдать "Не палиндром". И так по кругу. В итоге если $word1==$word2, то выдать результат.
https://ideone.com/oU9vfw

Но мне какого-то хуя выдает всегда "Палиндром". Оказывается потому что если я хочу вывести $comparison1 и $comparison2, то выводит пустоту, поэтому наверное сравнивает пустоту с пустотой, то и выдает.

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

Вот пример кода без всяких дальнейших сравнений, просто взять первую и последнюю букву и вывести, но почему не воводит то??
https://ideone.com/Z5E4eX
#253 #519037
>>519036
Потому-что у тебя условие какое-то дурацкое. $i == $halfLength ты понимаешь, что твой код в скобках не будет выполняться, потому-что в условии стоит проверка на равенство между счетчиком и половиной длинны?
#254 #519041
>>519036
Вот рабочее решение под твою логику: http://ideone.com/c0hkG0
#255 #519043
>>519041
А вот так не надо делать. Сейчас он бы ебался с этой задачей весь день, но зато понял бы как её решать. Теперь он просто посмотрит готовое решение.
#256 #519045
>>519043
Оно плохое, можно сделать лучше.
44 Кб, 706x692
13 Кб, 613x137
#257 #519047
>>519043
>>519041

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

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

>>519037

>Потому-что у тебя условие какое-то дурацкое. $i == $halfLength


пик1
#258 #519049
>>519036

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


>https://ideone.com/Z5E4eX


Каждая итерация цикла выполняется только после проверки условия на истинность. Если оно не истинно, цикл прерывается. Посмотри теперь на своё условие.
#259 #519050
>>519047
И что пик1? На пике 1 нормальное условие, у тебя нет.
#260 #519051
>>519037
а действительно, на пике укзаано <=

но почему по логике же, если $i не равно $halfLength, то увеличиваем на 1, а $halfLength у нас равно 9, то есть цикл должен выполниться 9 раз
#261 #519052
>>519051
Увеличение счётчика на 1 происходит после выполнения тела цикла. Выполнение тела цикла происходит после проверки условия, в случае, если оно истинно. Твоё условие: $i == $halfLength. $i в начале равно 0. То есть, $i != $halfLength, и цикл сразу прервётся.
19 Кб, 450x263
27 Кб, 459x442
32 Кб, 639x490
31 Кб, 644x447
#262 #519070
Пытаюсь разобраться с задачей на лайки.
Первые два пика -- мои таблицы.
Когда считаю, сколько лайков пользователь поставил/получил, проблем не возникает (3-й пик с запросом).
Когда пытаюсь прицепить подсчёт взимных лайков (4-й пик), результаты подсчёта с 3-го пика портятся. Число взаимных лайков, при этом, считается верно.
Что делаю не так? Что стоит изучить из SQL конкретно для этой задачи?
#263 #519133
>>519070

Сразу же совет: структуру таблиц надо постить не скриншотом пхпмайадмина а SQL кодом. Потому что я например не понимаю разрешен ли NULL, какие значения по умолчанию, как именно выглядят индексы и тд (и ты скорее всего тоже). А SQL код это универальная вещь кторую все понимают (ну ии должны понимать) и которая документирована.

Удобно постить код на sqlfiddle где его сразу можно посмотреть и запустить.

Далее, у тебя странный код. Объясни-ка как работает

COUNT(CASE WHEN .. THEN .. END)

Ибо это можно написать короче.

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

Ошибка и в 3-м и в 4-м скриншоте в том что ты используешь не тот тип джойна. Также в 4-м скриншоте по моему неправильные условия джойнов. Ты можешь объяснить как они должны работать и что ты должен получить по задумке (что приджойнится к одной строчке с каким-то пользователем)?
#264 #519137
>>519070

> Что стоит изучить из SQL конкретно для этой задачи?


Типы джойнов и особенности COUNT: http://www.mysql.ru/docs/man/Group_by_functions.html
#265 #519138
>>519133

SQL код таблицы можно увидеть сдеаав SHOW CREATE TABLE x (а лучше конечно создавать таблицы написав его вручную).
#266 #519140
>>519070

> GROUP BY


> ORDER BY


ORDER тут лишний так как GROUP BY делает и сортировку тоже
#267 #519183
http://codepad.org/nm9jPcpd
Никак не могу решить задачу с процентами, посмотрел ответ и все равно не понял, бросать нахуй PHP?
#268 #519201
>>519133

>Далее, у тебя странный код. Объясни-ка как работает


Я толком не уверен как что работает. Только догадываюсь.
Ладно, покурю теорию по ссылке, что-нибудь рожу и снова дам тебе на растерзание.
Go #269 #519209
Похапе говно, Golang - сила!
#270 #519236
http://sandbox.onlinephpfunctions.com/code/80850fe6d1c511adb6691cf75e2df3c4a67f5c65
А в пехапе есть анонимные функции. И если бы вы знали более одного языка, то обрадовались. Но куда там. Сидите, ковыряетесь в хуйне какой-то три года. ОП, ну чому ты такой дегенерат, который не удосужился за три года сбацать свой законченный инфопродукт экспериментируя над нуфагами ИТТ от А до Я. М?
#271 #519260
>>519236

>А в пехапе есть анонимные функции.


Я знаю и каждый день радуюсь. Echo там не нужно.
#272 #519270
>>519236
Это функции для настоящих анонимусов?
#273 #519274
>>519270
Напиши поиск в дереве каталогов, не выёбывайся, тут все евреи.
#274 #519286
>>519236

>законченный инфопродукт


define this
#275 #519299
>>518838
Перестаньте уже читать биографию Масков/Цукербергов/Джобсов(вот этот вообще ТП с хуем, умер, а эппл живет дальше, ибо пиздобольствовать умеют многие и на этом поприще всегда найдется подмена), это результат типичной предпринимательской деятельности(хотя Рыжий хуй и Джобс - это просто удача, парни изобрели штуку, а нам быдлу она внезапно понравилась) + внезапный спрос на это дерьмо, который нельзя было спрогнозировать(вообще никак), тобишь по сути это новый рынок, на котором у вас все шансы стать монополистом, ведь вы и есть этот рынок. Году в 2010 хабрапомойка была переполнена статьями в духе - "Зацените мой никому не нужный сервис по поиску друга для вашей мамки", миллионы их было, такое называют "Пузырь".
#276 #519301
>>518206
Пфф, вот эти железячники же все как правило сидят на одном месте, в какой-нибудь конторке. Небось какой-нибудь АСУ'шник или около этого. И, нет, ебать байтики - не более интеллектуальная деятельность, чем веб-погроммирование.
#277 #519306
Юзаю вот этот мануал => http://phpclub.ru/mysql/doc/tutorial.html
Но он по ходу устарел.
Вот тут проблема: http://phpclub.ru/mysql/doc/loading-tables.html
Создаю файлик со значения полей, чтобы не вбивать ручками(у меня в качестве разделителя ";"). Чтобы подставить NULL в поле death, пишу \n в нужных местах. Получается такой файл.
Fluffy;Harold;cat;f;1993-02-04;\N
Claws;Gwen;cat;m;1994-03-17;\N
Buffy;Harold;dog;f;1989-05-13;N
Fang;Benny;dog;m;1990-08-27;\N
Bowser;Diane;dog;m;1998-08-31;1995-07-29
Chirpy;Gwen;bird;f;1998-09-11;\N
Whistler;Gwen;bird;\N;1997-12-09;\N
Slim;Benny;snake;m;1996-04-29;\N
У автора все получилось, и заместо \N вставилось NULL, у меня и других парней с форума, на котором я искал решение другой проблемы с этим примером тоже самое(последний пост, там в конце почемуто NULL присутствует): http://sqlinfo.ru/forum/viewtopic.php?id=4087
То есть вместо NULL значение становится 0000-00-00, через select NULL вставляется. Я хз, что тут делать. Нет я могу забить все руками и пойти по мануалу дальше(так и сделаю пока), но хочу разобраться.
#278 #519333
>>519133

> странный код


Нормальный это код. Count подсчитывает кол-во неNULLевых результатов внутреннего выражения.
#279 #519335
>>519070
Убери GROUP BY, посмотри на результат, подумай.
#280 #519339
ОП, скажи сколько решается твоя задачка "айпад в кредит", та что с функциями. Вообще какой по сложности она считается?

Только что сделал, мозг кипит, глаза болят. Но все-таки удалось ее решить самому, прям горжусь за себя.

Рейтани мое решение http://ideone.com/zQGppR
#281 #519344
Попросили написать сайт-визитку, цену предварительно назвал маленькую 1к рублей наваял за час на вордпрессе http://vihnich.890m.com/ и теперь думаю, что это вроде как слишком дорого за час работы, стоит ли с нуля сделать? Хотя вроде и лень. Кто делал сайты-визитки, что там должно быть обязательно?
#282 #519345
>>519344
Хохол, ты же за отзив делать был должен.
#283 #519347
>>519345
За что?
#284 #519348
>>519347
за отзыв
#285 #519349
>>519348
А что мне с ним делать потом с этим отзывом? Это если бы я с нуля его делал тогда может быть, а так это же цмс с натянутой темой.
#286 #519352
>>519349
Надпись MH SQUARED LITE BY MH THEMES убери и можешь смело 1к брать.
186 Кб, 1600x1230
sage #287 #519365
Парни, есть функция, использующая чутка бибиотек Laravel:
function fn_ct_getLists(){

$tmp = new Fc(Registry::get('zzzzzzz));
$retval= $tmp->request('lists', [
\t'fields' => 'lists.name'
\t]);
var_dump($retval->take(1));
\treturn $retval['lists.name'];
}

И мне приходить ответ

object(Illuminate\Support\Collection)#76 (1) { ["items":protected]=> array(1) { [0]=> object(stdClass)#71 (1) { ["name"]=> string(10) "ApiCreated" } } }

А хочу я собственно, прлучать название листа через $retval->function(name);
или что-то вроде того. Листов у меня много.
Задачка на SQL #288 #519370
Аноны, я тут зашел на один сайт и увидел там примерно такое: http://govnokod.ru/18425

> Сегодня на продакшене было обнаружено гениальное выражение в одном из запросов.


> (ss_1<>'SS0001' or ss_1<>'SS0002' or ss_1<>'SS0010')



Так как посетители того сайта примерно та же аудитория что и посетители двачей (то есть школьники и аутисты), разумеется, в комментариях написан либо бред не по теме, либо заведомо неверные утвеждения:

> inkanus-gray 01.07.2015 12:15 # +4


> А ничего страшного, что результат всегда TRUE?



Комментатор наверно хотел показать какой он умный, но он сам сел в лужу, потому что он не прав. Это выражение не всегда равно TRUE (точнее 1 так как в MySQL нет TRUE/FALSE, а используется 1/0).

Но аудитория нашего треда конечно же гораздо умнее и легко решит задание:

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

То есть если вы верите комментатору и счиатете что условие всегда истинно, разумеется его можно заменить на цифру 1 (но это не так).

Считайте это проверкой вашей эрудиции и знания SQL. Если вы честно ломали голову и так и не нашли ответ, напишите ход своих мыслей и я дам подсказку.
#289 #519374
>>518083

> Только с неймспейсами и PSR-4 не разобрался ещё. Можешь привести пример, как правильно раскидать классы по неймспейсам?


PSR-4 задает соответствие между полным именем класса и путем к файлу, то есть как должен называться файл с тем или иным классом.

В твоем случае логично разбить классы на неймспейсы:

Controller\... (контроллеры)
Model\... (модель абитуриента)
Service\... (сюда кидаем мапперы, сервисы, валидаторы, контейнер, при желании можно раскидать их по вложенным неймспейсам, но их немного так что не стоит заморачиваться)
Util\ (сюда кидаем хелперы, пагинатор)

Также в PSR-4 рекоментуется в качестве корневого неймспейса делать имя приложения. Ну например ты бы мог сделать корневым неймспейсом AbiturientList или AL. Но это не обязательно.

В соотвествии с PSR-4 классы в разных неймспейсах будут также лежать в разных папках, например:

Controller\Front -> app/Controller/Front.php

или

AL\Controller\Front -> app/Controller/Front.php

(папку classes можно выпилить за ненадобностью).

После этого надо будет чуть подправить автозагрузчик. Вот образцы:

https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-4-autoloader-examples.md

Когда ты в следующем задании изучишь composer, ты узнаеь что в него встроен автозагрузчик PSR-4 и свой тебе больше писать не требуется, достаточно лишь в конфиге композера указать корневой неймспейс и папку с классами.
#289 #519374
>>518083

> Только с неймспейсами и PSR-4 не разобрался ещё. Можешь привести пример, как правильно раскидать классы по неймспейсам?


PSR-4 задает соответствие между полным именем класса и путем к файлу, то есть как должен называться файл с тем или иным классом.

В твоем случае логично разбить классы на неймспейсы:

Controller\... (контроллеры)
Model\... (модель абитуриента)
Service\... (сюда кидаем мапперы, сервисы, валидаторы, контейнер, при желании можно раскидать их по вложенным неймспейсам, но их немного так что не стоит заморачиваться)
Util\ (сюда кидаем хелперы, пагинатор)

Также в PSR-4 рекоментуется в качестве корневого неймспейса делать имя приложения. Ну например ты бы мог сделать корневым неймспейсом AbiturientList или AL. Но это не обязательно.

В соотвествии с PSR-4 классы в разных неймспейсах будут также лежать в разных папках, например:

Controller\Front -> app/Controller/Front.php

или

AL\Controller\Front -> app/Controller/Front.php

(папку classes можно выпилить за ненадобностью).

После этого надо будет чуть подправить автозагрузчик. Вот образцы:

https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-4-autoloader-examples.md

Когда ты в следующем задании изучишь composer, ты узнаеь что в него встроен автозагрузчик PSR-4 и свой тебе больше писать не требуется, достаточно лишь в конфиге композера указать корневой неймспейс и папку с классами.
https://github.com/blackberryJam/abiturients #290 #519380
>>518083

Интересно, мой редактор пишет что тут 13000 символов, но двач не дает их отправить одним постом. Эта зараза считает байты почему-то.

> https://github.com/blackberryJam/abiturients/blob/master/app/bootstrap.php#L10


> require __DIR__ . '/exceptionHandler.php';


> set_exception_handler('exceptionHandler');


Зачем это? PHP и так сам логгирует информацию об исключениях и (если включен display_errors) выводит ее на экран. Свой обработчик тебе нужен только если ты хочешь при исключении например выводить страницу-заглушку с кодом 503.

Причем PHP логгирует подробную информацию, с именем файла и стектрейсом а ты только огрызок:

> error_log($exception->getMessage());



То есть ты зачем-то сделал фиксацию информации об исключениях менее подробной.

Если ты не видишь информации об исключениях на экране то надо просто включить display_errors (на локалхосте) или смотреть логи (на хостинге) а не изобретать странные вещи.

Надо либо удалить этот код либо сделать чтобы в нем был смысл и он давал какие-то дополнительные преимущества.

> error_reporting(-1);


> mb_internal_encoding('utf-8');


Это надо перенести в bootstrap

> define("SITE_ROOT", "/var/www/site.local");


Это неправильно, так как у меня например путь будет другой. И что мне делать, править код? Нет, так не пойдет. Надо определять путь автоматически например через dirname(_ _ DIR _ _ )

> define("ROOT_URI", $_SERVER['HTTP_HOST']);


Это тоже неправильно. Зачем тебе имя хоста в URL? Это надо вынести в конфиг, чтобы если сайт установлен в папке типа /al можно было заменить в конфиге

$rootUri = '/';

на

$rootUri = '/al/';

И все работало. Тебе не нужно имя хоста, ссылка вида

<a href="/asdasd/asdad">

И так использует текущее имя хоста.

Также, мне не нраится использование тут константы. Что это за константа которая может меняться? Замени-ка это на функцию getRootUri().

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Abiturient.php#L23


> foreach ($this as $property => $value) {


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

> if (isset($values[$property])


Если значение в массиве === null то isset вернет false. Надо использовать array_key_exists в таких случаях.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientService.php#L34


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


> elseif ($i == 4) {


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

for (...) {
если сгенерировался хороший код, выходми из функции;
}

выбрасваем исключение;

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L103


> public function getAbiturients($parameters, $page, $perPage)


Я не понимаю, какая выгода от замены простого и понятного кода:

getAbiturients($orderBy, $orderDir, $page, $perPage)

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

> $offset = ($page - 1) $perPage;


Лучше сразу передавать offset и limit. А высчитывать offset можно в контроллере или пагинаторе.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L116


> protected function inspectParameters($parameters)


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

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L169


> $words = preg_split('/\\s/ui', $string);


Что если строка $string содержит пробелы с краев? В $words тогда будет что-то вроде

['', 'text', '']

И ты будешь искать по пустой строке. Это плохая идея, надо игнорировать пустые строки.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L184


> foreach ($tokens as $key => $token) {


> ...


> $searchResult[] = $this->getByToken($token);


Это очень плохо и неэффективно, делать запросы в цикле. Вместо этого ты должен делать запрос с использованием IN, например

SELECT .. WHERE id IN (1, 2, 3, 6) ORDER BY ...

Значения для IN не получится вставить через плейсхолдеры (это ограничение PDO), так что придется формировать строку с id вручную. Да, вместо token удобнее использовать id так как это числа и они короче.

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

Также, я тут подумал, не проще ли генерировать условие вида:

SELECT ...
WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?
ORDER BY ... LIMIT ...

И пусть база объединяет результаты.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L26


> public function save(Abiturient $abiturient)


> {


> if ($this->isTokenReserved($abiturient->token)) {


Вместо того чтобы делать SQL запрос можно просто проверить проставлен ли id в абитуриенте.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L54


> if ($this->isTokenReserved($token)) {


> $stmt = $this->pdo->prepare("SELECT FROM abiturients WHERE token =


:token");
Незачем тут делать 2 SQL запроса когда можно сразу делать SELECT а уже потом проверять вернул он что-нибудь или нет.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L97


> public function getNumberOfPages($perPage)


> $offset = ($page - 1) × $perPage;


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

> " LIMIT " . $perPage . " OFFSET " . $offset;


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

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L108


Тут слишком длинный SQL запрос, разбей его на несклоько строк чтобы он помещался в 80 символов по ширине.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Container.php#L10


> public function getPDO($dsn, $username, $password, $options)


Это неправильно, полуается чтобы получить где-то в коде PDO мы должны знать параметры соединения? а зачем они нужны если объект pdo уже есть в контейнере?

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

Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):

(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html
(рус) http://symfony-gu.ru/documentation/ru/html/book/service_container.html

Как ты видишь, там сервисы можно опиывать в yml-конфиге примерно так:

abiturient_service:
class: AbiturientService
arguments: [@abiturient_mapper, @abiturient_validator]

И исплоьзовать так:

$service = $container->get('abiturient_service');

Да, эти 4 строчки кода это все, что требуется чтобы добавить в симфониевский контейнер одну службу. Это быстрее чем писать свой контейнер.

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

pdo:
class: PDO
arguments: [%db.dsn%, %db.user%, %db.pass%, %db.options%]

Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L15


> } catch (Exception $e) {


> $errors['tokenGenerateError'] = $e->getMessage() . " Обновите страницу.";


Тут ты ловишь вообще любые исключения. Это неправильно, так как они могут возникнуть не только из-за того что не удалось сгенерировать токен (а например PDO может выкинуть исключение). Да и обновлять страницу нет смысла, там вероятность что с 5 попыток токен не сгенерируется, ничтожна и если это произошло то скорее всего ошибка в коде и ничего не поможет.

Если ты хочешь ловить исключение, сделай свой класс исключений для этой цели. Но лучше вообще тут убрать try/catch.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22


> if ($token) {


> $abiturient = $mapper->getByToken($token);


А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L36


> header("Location: {$_SERVER['HTTP_REFERER']}");


Согласно стандарту браузеры не обязаны передавать реферер. Более того, его может не быть если мы перешли из закладок или ввели адрес руками. Его может вырезать прокси или антивирус.

Короче вот этот код:

> header("Location: {$_SERVER['HTTP_REFERER']}");



100% неправильный. Указывай явный адрес для редиректа.
https://github.com/blackberryJam/abiturients #290 #519380
>>518083

Интересно, мой редактор пишет что тут 13000 символов, но двач не дает их отправить одним постом. Эта зараза считает байты почему-то.

> https://github.com/blackberryJam/abiturients/blob/master/app/bootstrap.php#L10


> require __DIR__ . '/exceptionHandler.php';


> set_exception_handler('exceptionHandler');


Зачем это? PHP и так сам логгирует информацию об исключениях и (если включен display_errors) выводит ее на экран. Свой обработчик тебе нужен только если ты хочешь при исключении например выводить страницу-заглушку с кодом 503.

Причем PHP логгирует подробную информацию, с именем файла и стектрейсом а ты только огрызок:

> error_log($exception->getMessage());



То есть ты зачем-то сделал фиксацию информации об исключениях менее подробной.

Если ты не видишь информации об исключениях на экране то надо просто включить display_errors (на локалхосте) или смотреть логи (на хостинге) а не изобретать странные вещи.

Надо либо удалить этот код либо сделать чтобы в нем был смысл и он давал какие-то дополнительные преимущества.

> error_reporting(-1);


> mb_internal_encoding('utf-8');


Это надо перенести в bootstrap

> define("SITE_ROOT", "/var/www/site.local");


Это неправильно, так как у меня например путь будет другой. И что мне делать, править код? Нет, так не пойдет. Надо определять путь автоматически например через dirname(_ _ DIR _ _ )

> define("ROOT_URI", $_SERVER['HTTP_HOST']);


Это тоже неправильно. Зачем тебе имя хоста в URL? Это надо вынести в конфиг, чтобы если сайт установлен в папке типа /al можно было заменить в конфиге

$rootUri = '/';

на

$rootUri = '/al/';

И все работало. Тебе не нужно имя хоста, ссылка вида

<a href="/asdasd/asdad">

И так использует текущее имя хоста.

Также, мне не нраится использование тут константы. Что это за константа которая может меняться? Замени-ка это на функцию getRootUri().

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Abiturient.php#L23


> foreach ($this as $property => $value) {


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

> if (isset($values[$property])


Если значение в массиве === null то isset вернет false. Надо использовать array_key_exists в таких случаях.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientService.php#L34


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


> elseif ($i == 4) {


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

for (...) {
если сгенерировался хороший код, выходми из функции;
}

выбрасваем исключение;

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L103


> public function getAbiturients($parameters, $page, $perPage)


Я не понимаю, какая выгода от замены простого и понятного кода:

getAbiturients($orderBy, $orderDir, $page, $perPage)

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

> $offset = ($page - 1) $perPage;


Лучше сразу передавать offset и limit. А высчитывать offset можно в контроллере или пагинаторе.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L116


> protected function inspectParameters($parameters)


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

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L169


> $words = preg_split('/\\s/ui', $string);


Что если строка $string содержит пробелы с краев? В $words тогда будет что-то вроде

['', 'text', '']

И ты будешь искать по пустой строке. Это плохая идея, надо игнорировать пустые строки.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L184


> foreach ($tokens as $key => $token) {


> ...


> $searchResult[] = $this->getByToken($token);


Это очень плохо и неэффективно, делать запросы в цикле. Вместо этого ты должен делать запрос с использованием IN, например

SELECT .. WHERE id IN (1, 2, 3, 6) ORDER BY ...

Значения для IN не получится вставить через плейсхолдеры (это ограничение PDO), так что придется формировать строку с id вручную. Да, вместо token удобнее использовать id так как это числа и они короче.

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

Также, я тут подумал, не проще ли генерировать условие вида:

SELECT ...
WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?
ORDER BY ... LIMIT ...

И пусть база объединяет результаты.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L26


> public function save(Abiturient $abiturient)


> {


> if ($this->isTokenReserved($abiturient->token)) {


Вместо того чтобы делать SQL запрос можно просто проверить проставлен ли id в абитуриенте.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L54


> if ($this->isTokenReserved($token)) {


> $stmt = $this->pdo->prepare("SELECT FROM abiturients WHERE token =


:token");
Незачем тут делать 2 SQL запроса когда можно сразу делать SELECT а уже потом проверять вернул он что-нибудь или нет.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L97


> public function getNumberOfPages($perPage)


> $offset = ($page - 1) × $perPage;


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

> " LIMIT " . $perPage . " OFFSET " . $offset;


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

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/AbiturientsMapper.php#L108


Тут слишком длинный SQL запрос, разбей его на несклоько строк чтобы он помещался в 80 символов по ширине.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Container.php#L10


> public function getPDO($dsn, $username, $password, $options)


Это неправильно, полуается чтобы получить где-то в коде PDO мы должны знать параметры соединения? а зачем они нужны если объект pdo уже есть в контейнере?

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

Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):

(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html
(рус) http://symfony-gu.ru/documentation/ru/html/book/service_container.html

Как ты видишь, там сервисы можно опиывать в yml-конфиге примерно так:

abiturient_service:
class: AbiturientService
arguments: [@abiturient_mapper, @abiturient_validator]

И исплоьзовать так:

$service = $container->get('abiturient_service');

Да, эти 4 строчки кода это все, что требуется чтобы добавить в симфониевский контейнер одну службу. Это быстрее чем писать свой контейнер.

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

pdo:
class: PDO
arguments: [%db.dsn%, %db.user%, %db.pass%, %db.options%]

Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L15


> } catch (Exception $e) {


> $errors['tokenGenerateError'] = $e->getMessage() . " Обновите страницу.";


Тут ты ловишь вообще любые исключения. Это неправильно, так как они могут возникнуть не только из-за того что не удалось сгенерировать токен (а например PDO может выкинуть исключение). Да и обновлять страницу нет смысла, там вероятность что с 5 попыток токен не сгенерируется, ничтожна и если это произошло то скорее всего ошибка в коде и ничего не поможет.

Если ты хочешь ловить исключение, сделай свой класс исключений для этой цели. Но лучше вообще тут убрать try/catch.

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22


> if ($token) {


> $abiturient = $mapper->getByToken($token);


А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L36


> header("Location: {$_SERVER['HTTP_REFERER']}");


Согласно стандарту браузеры не обязаны передавать реферер. Более того, его может не быть если мы перешли из закладок или ввели адрес руками. Его может вырезать прокси или антивирус.

Короче вот этот код:

> header("Location: {$_SERVER['HTTP_REFERER']}");



100% неправильный. Указывай явный адрес для редиректа.
https://github.com/blackberryJam/abiturients #291 #519381

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L44


> protected function isPost()


> protected function isCookieSet($cookieKey)


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

http://symfony-gu.ru/documentation/ru/html/book/http_fundamentals.html
http://symfony.com/doc/current/book/http_fundamentals.html

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/MainPageController.php#L48


> $queryTemplate = Util::buildQueryTemplate('page');


зачем строить URL из текущего запроса? Это не очень надежно и трудно для чтения. Лучше явно сформировать и передать массив параметров. Ты ведь знаешь какая сортировка, какое поисковое слово и тд. Сделай массив параметров и передавай его в шаблон. А потом этот массив можно передавать во всякие функции, которые удаляют из него или заменяют некоторые параметры и формируют ссылку.

Наример функция генерирующая ссылку на сортировку, удаляет номер страницы и заменяет параметры отвечающие за сортировку.

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

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Validator.php#L49


> $regexp = '/^19[0-9]{2}$/';


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

> https://github.com/blackberryJam/abiturients/blob/master/templates/404.html.php#L11


> <a href="http://site.local" class="btn btn-primary btn-lg"><span class="glyphicon glyphicon-home"></span> На главную </a>


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

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

У этих серверов разные адреса, потому имя хоста надо хранить в конфиге (или брать HTTP_HOST) а не прописывать жестко, так как это доставит потом множество неудобств.

Также, у тебя там жестко прописан домен в установке кук. Из-за этого у меня на другом домене они не ставятся и не работает ни регистрация ни flash сообщения.

------

При поиске надо выводить в поле поиска текущий поисковый запрос. Также, стоит писать

«Показаны только результаты поиска по словам xxxx. Показать всех абитуриентов».

> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L20


> required pattern="[-`а-яА-ЯёЁ\\s]{2,40}" autofocus>


Тут ошибочка, в HTML не надо удваивать бекслеш и надо просто писать \s. А то, что у тебя интепретируется как «бекслеш или буква s». Удваиваем мы в PHP-строках так как они воспринимают 2 бекслеша как один (мануал: http://php.net/manual/ru/language.types.string.php )

Кстати, я тут почитал MDN, оказывается ^ и $ в pattern можно не писать, браузер это как-то сам проверяет.

Также я прочел еще одну интересную фишку. Если ты укажешь для input атрибут title, например «Имя может содержать ....» то браузер включит его в сообщение об ошибке заполнения (а также покажет при наведении на инпут). Давай-ка, чтобы ты это запомнил, напиши title хотя бы для нескольких инпутов, а то иногда непонятно что именно я заполнил не так.

Также, слишком длинные строчки в HTML, которые не влезают в ширину гитхаба, надо бы перенести.

Для года наверно стоит использовать input type="number" и указать для него min/max (max стоит указать лет на 100 в будущее чтобы оно было актуально). На мобильных устройствах это приведет к тому, что клавиатура будет содержать только цифры, и у input появятся стрелочки увеличения/уменьшения. Увы, специально для года поля ввода нет (а вот для года + месяца например есть).
https://github.com/blackberryJam/abiturients #291 #519381

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L44


> protected function isPost()


> protected function isCookieSet($cookieKey)


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

http://symfony-gu.ru/documentation/ru/html/book/http_fundamentals.html
http://symfony.com/doc/current/book/http_fundamentals.html

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/MainPageController.php#L48


> $queryTemplate = Util::buildQueryTemplate('page');


зачем строить URL из текущего запроса? Это не очень надежно и трудно для чтения. Лучше явно сформировать и передать массив параметров. Ты ведь знаешь какая сортировка, какое поисковое слово и тд. Сделай массив параметров и передавай его в шаблон. А потом этот массив можно передавать во всякие функции, которые удаляют из него или заменяют некоторые параметры и формируют ссылку.

Наример функция генерирующая ссылку на сортировку, удаляет номер страницы и заменяет параметры отвечающие за сортировку.

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

> https://github.com/blackberryJam/abiturients/blob/master/app/classes/Validator.php#L49


> $regexp = '/^19[0-9]{2}$/';


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

> https://github.com/blackberryJam/abiturients/blob/master/templates/404.html.php#L11


> <a href="http://site.local" class="btn btn-primary btn-lg"><span class="glyphicon glyphicon-home"></span> На главную </a>


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

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

У этих серверов разные адреса, потому имя хоста надо хранить в конфиге (или брать HTTP_HOST) а не прописывать жестко, так как это доставит потом множество неудобств.

Также, у тебя там жестко прописан домен в установке кук. Из-за этого у меня на другом домене они не ставятся и не работает ни регистрация ни flash сообщения.

------

При поиске надо выводить в поле поиска текущий поисковый запрос. Также, стоит писать

«Показаны только результаты поиска по словам xxxx. Показать всех абитуриентов».

> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L20


> required pattern="[-`а-яА-ЯёЁ\\s]{2,40}" autofocus>


Тут ошибочка, в HTML не надо удваивать бекслеш и надо просто писать \s. А то, что у тебя интепретируется как «бекслеш или буква s». Удваиваем мы в PHP-строках так как они воспринимают 2 бекслеша как один (мануал: http://php.net/manual/ru/language.types.string.php )

Кстати, я тут почитал MDN, оказывается ^ и $ в pattern можно не писать, браузер это как-то сам проверяет.

Также я прочел еще одну интересную фишку. Если ты укажешь для input атрибут title, например «Имя может содержать ....» то браузер включит его в сообщение об ошибке заполнения (а также покажет при наведении на инпут). Давай-ка, чтобы ты это запомнил, напиши title хотя бы для нескольких инпутов, а то иногда непонятно что именно я заполнил не так.

Также, слишком длинные строчки в HTML, которые не влезают в ширину гитхаба, надо бы перенести.

Для года наверно стоит использовать input type="number" и указать для него min/max (max стоит указать лет на 100 в будущее чтобы оно было актуально). На мобильных устройствах это приведет к тому, что клавиатура будет содержать только цифры, и у input появятся стрелочки увеличения/уменьшения. Увы, специально для года поля ввода нет (а вот для года + месяца например есть).
#292 #519382
>>519370
всегда тру.
#293 #519383
>>518188

Если можно то лучше не делать.

>>518192

Драйвер pdo mysql установил? Базу создал? Дамп залил? В конфиг прописал?

>>518200

Изучи CSS селекторы и jQuery чтобы узнать ответ на этот вопрос. ТЫ не можешь пользоваться библиотекой если не изучил ее как следует.

>>518469

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

Вот мануал например (это если ты уже знаешь сам PHP): http://php.net/manual/ru/tutorial.forms.php
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse #294 #519385
>>518470

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L5


> \Application\CatMouse\models\Mouse;


По PSR-4 надо называть неймспейсы как и классы, с большой буквы:

CatMouse\Model\Mouse

(Application можно выкинуть так как оно тут смысла не добавляет).

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L19


> $mouse1 = new Mouse(9, 1, "Mouse1", $fieldSize);


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

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L34


> $mouse1->setLocation(["x" => $x, "y" => $y]);


Зачем тут массив? Не проще ли сделать 2 аргумента x и y? А то в твоем массиве можно не указать поле или наоборот опечататься и это ведь никто не проверяет.

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

> spl_autoload_extensions('.php');


Это задает настройки встроенного в PHP автозугручзика (spl_autoload) и тут ничего не делает.

Animal это тоже модель и должна лежать в том же неймспейсе.

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L8


Тут слишком много свойств. Большинство из них ( private $seeAnimals;private $hashOfAnimal; ) устаревают на следующем ходе и их не имеет смысла вообще хранить.

> private $location = ["x" => 0, "y" => 0];


По моему удобнее и надежнее иметь свойства x и y чем мучаться с массивом. зачем тут этот массив? и почему массив а не например объект?

> private $fieldSize;


Это свойство карты, а не свойство кошки. Незачем дублировать информацию.

> public function __construct($fieldOfVision, $cruisingRange, $name, $fieldSize)


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

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L23


> $this->hashOfAnimal = spl_object_hash($this);


А зачем это? Если ты хочешь сравнить объекты на совпадение достаточно использовать $a === $b: http://php.net/manual/ru/language.oop5.object-comparison.php

> public function setFieldOfVision($fieldOfVision)


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

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L72


> public function lookAround(SplObjectStorage $listOfAnimals)


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

Алгоритм выбора хода лучше сделать универсальным:

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

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

Подсчет очков для хода зависит от животного. Мышка оценивает безопасность клетки (чем ближе кошка, тем меньше баллов; чем меньше из клетки выходов, тем меньше баллов; чем больше видно кошек рядом с клеткой, тем меньше баллов), кошка — возможность поживиться (ну например чем ближе к клетке мышка тем больше баллов).

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

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

Твой алгоритм: https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/models/Cat.php#L20 очень неуниверсален, громоздок, не позволяет делать ход в зависимости от нескоьких факторов (например идти в сторону большего скопления мышей).

> echo "Can't see where is Mouse\n";


Тут стоит писать имя животного а то потом не разберешь кто что сказал.
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse #294 #519385
>>518470

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L5


> \Application\CatMouse\models\Mouse;


По PSR-4 надо называть неймспейсы как и классы, с большой буквы:

CatMouse\Model\Mouse

(Application можно выкинуть так как оно тут смысла не добавляет).

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L19


> $mouse1 = new Mouse(9, 1, "Mouse1", $fieldSize);


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

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/index.php#L34


> $mouse1->setLocation(["x" => $x, "y" => $y]);


Зачем тут массив? Не проще ли сделать 2 аргумента x и y? А то в твоем массиве можно не указать поле или наоборот опечататься и это ведь никто не проверяет.

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

> spl_autoload_extensions('.php');


Это задает настройки встроенного в PHP автозугручзика (spl_autoload) и тут ничего не делает.

Animal это тоже модель и должна лежать в том же неймспейсе.

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L8


Тут слишком много свойств. Большинство из них ( private $seeAnimals;private $hashOfAnimal; ) устаревают на следующем ходе и их не имеет смысла вообще хранить.

> private $location = ["x" => 0, "y" => 0];


По моему удобнее и надежнее иметь свойства x и y чем мучаться с массивом. зачем тут этот массив? и почему массив а не например объект?

> private $fieldSize;


Это свойство карты, а не свойство кошки. Незачем дублировать информацию.

> public function __construct($fieldOfVision, $cruisingRange, $name, $fieldSize)


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

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L23


> $this->hashOfAnimal = spl_object_hash($this);


А зачем это? Если ты хочешь сравнить объекты на совпадение достаточно использовать $a === $b: http://php.net/manual/ru/language.oop5.object-comparison.php

> public function setFieldOfVision($fieldOfVision)


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

> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L72


> public function lookAround(SplObjectStorage $listOfAnimals)


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

Алгоритм выбора хода лучше сделать универсальным:

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

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

Подсчет очков для хода зависит от животного. Мышка оценивает безопасность клетки (чем ближе кошка, тем меньше баллов; чем меньше из клетки выходов, тем меньше баллов; чем больше видно кошек рядом с клеткой, тем меньше баллов), кошка — возможность поживиться (ну например чем ближе к клетке мышка тем больше баллов).

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

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

Твой алгоритм: https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/models/Cat.php#L20 очень неуниверсален, громоздок, не позволяет делать ход в зависимости от нескоьких факторов (например идти в сторону большего скопления мышей).

> echo "Can't see where is Mouse\n";


Тут стоит писать имя животного а то потом не разберешь кто что сказал.
#295 #519386
>>518537
>>518556

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

>>518590

Да это не так сложно, чем больше ты знаешь концепций тем проще понять новй фреймворк. Да и я бы не сказал что их много, симфони 2 да Yii2 уж который год юзаем (а раньше был ZF1).

С CMS можно разобраться по докуиентации или по коду, если ты хорошо знаешь PHP то это не проблема.

>>518591

Пиши, сдавай на проверку, я скажу если что не так.

>>519014

Изучай jquery/css селекторы.

Я даже ссылочек могу дать:

CSS селекторы http://htmlbook.ru/test/selektory-css

Соответственно смотри как найти нужный блок. Также, можно использлвать у jquery метод find для поиска изображений только в одном блоке.

>>519036

Это нормально.

> for ($i=0; $i==$halfLength; $i++) {


Смотри, у тебя в начале

$i = 0;
$halfLength допустим равно 8

Он смотрит, что условие $i==$halfLength не выполняется и цикл заканчивается ни разу не выполнившись. Надо заменить == на <=. Это не условие завершения цикла, а условие «выполнять пока условие верно».

>>519047

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


Верно. Точки с запятой должно быть всегда две, но самое первое действие и последнее действие могут быть пустыми (то условие что посередине тоже - тогда цикл будет выполняться вечно). Это все правильные конструкции:

for (; $i < 10; ) { ... } - равносильно while ($i < 10) { .. }
for ($i = 0; $i < 10; ) ...
for ($i = 0, $k = 0; $i < 10; $i++, $k++ ) ...

Мануал http://php.net/manual/ru/control-structures.for.php

>>519051

Это условие выполнения цикла, а не условие останова. Цикл выполняется только пока оно истинно.
#295 #519386
>>518537
>>518556

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

>>518590

Да это не так сложно, чем больше ты знаешь концепций тем проще понять новй фреймворк. Да и я бы не сказал что их много, симфони 2 да Yii2 уж который год юзаем (а раньше был ZF1).

С CMS можно разобраться по докуиентации или по коду, если ты хорошо знаешь PHP то это не проблема.

>>518591

Пиши, сдавай на проверку, я скажу если что не так.

>>519014

Изучай jquery/css селекторы.

Я даже ссылочек могу дать:

CSS селекторы http://htmlbook.ru/test/selektory-css

Соответственно смотри как найти нужный блок. Также, можно использлвать у jquery метод find для поиска изображений только в одном блоке.

>>519036

Это нормально.

> for ($i=0; $i==$halfLength; $i++) {


Смотри, у тебя в начале

$i = 0;
$halfLength допустим равно 8

Он смотрит, что условие $i==$halfLength не выполняется и цикл заканчивается ни разу не выполнившись. Надо заменить == на <=. Это не условие завершения цикла, а условие «выполнять пока условие верно».

>>519047

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


Верно. Точки с запятой должно быть всегда две, но самое первое действие и последнее действие могут быть пустыми (то условие что посередине тоже - тогда цикл будет выполняться вечно). Это все правильные конструкции:

for (; $i < 10; ) { ... } - равносильно while ($i < 10) { .. }
for ($i = 0; $i < 10; ) ...
for ($i = 0, $k = 0; $i < 10; $i++, $k++ ) ...

Мануал http://php.net/manual/ru/control-structures.for.php

>>519051

Это условие выполнения цикла, а не условие останова. Цикл выполняется только пока оно истинно.
#296 #519391
>>519183

Можешь бросать, но другие тоже тут по несколько днйе мучались.

> посмотрел ответ


Что такое? Где это ответы лежат? Придется менять условия задачек видимо.

Тут надо написать внутри цикла примерно такой код (а то что сейчас стереть так как оно неприавльное):

- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.

>>519201

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

COUNT подсчитывает число не равных NULL значений в группе.

CASE очевидно возвращает NULL если не выполнено ни одно условие WHEN и не NULL если выполнено.

Это можно записать лучше и короче.

>>519274

напиши. Там анонимные функции не нужны, а вот нужен RecurisveDirectoryIterator.

>>519299

Нужно уметь искать ниши и возможности. Ну и у Джобса не так все просто было, почитай хотя бы в википедии, его компания должго была нишевой, были убытки, были непроданные продукты, его увольняли из совета директоров. Большой успех началася только с выхода айпода (плеера с колесиком), а до этого почти 20 лет все было очень шатко.

> Году в 2010 хабрапомойка была переполнена статьями в духе - "Зацените мой никому не нужный сервис по поиску друга для вашей мамки", миллионы их было,


Потому что разработчики реализуют не потребности рынка, а свои фантазии.

>>519301

Более того, качество кода там как правило днище, тестов нет и тд.

>>519306

Ты что-то напутал. Может у тебя колонки в другом порядке идут? Сделай-ка

DESCRIBE pet;

И покажи что он выведет. Также попробуй после LOAD INFILE сделать команду

SHOW WARNINGS;

И напиши что она выведет.

На форуме

> Варианты с подстановкой вместо /N, //N и NULL приводили к аналогичным результатам.


Там перепутали прямой и обратный cлеш. Надо писать \N иначе MySQL понимает это как строку "/N" и при попытке вставить вместо даты всталвяются нули.

Если ты перед вставкой сделаешь команду

SET sql_mode = 'STRICT_ALL_TABLES';

То MySQL не позволиит остатся ошибке незамеченной и громко сообщит о ней.

>>519333

Ну так а у нас цель считать лайки а не число не-NULL результатов. Код должен быть логичным а не запутанным.
#296 #519391
>>519183

Можешь бросать, но другие тоже тут по несколько днйе мучались.

> посмотрел ответ


Что такое? Где это ответы лежат? Придется менять условия задачек видимо.

Тут надо написать внутри цикла примерно такой код (а то что сейчас стереть так как оно неприавльное):

- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.

>>519201

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

COUNT подсчитывает число не равных NULL значений в группе.

CASE очевидно возвращает NULL если не выполнено ни одно условие WHEN и не NULL если выполнено.

Это можно записать лучше и короче.

>>519274

напиши. Там анонимные функции не нужны, а вот нужен RecurisveDirectoryIterator.

>>519299

Нужно уметь искать ниши и возможности. Ну и у Джобса не так все просто было, почитай хотя бы в википедии, его компания должго была нишевой, были убытки, были непроданные продукты, его увольняли из совета директоров. Большой успех началася только с выхода айпода (плеера с колесиком), а до этого почти 20 лет все было очень шатко.

> Году в 2010 хабрапомойка была переполнена статьями в духе - "Зацените мой никому не нужный сервис по поиску друга для вашей мамки", миллионы их было,


Потому что разработчики реализуют не потребности рынка, а свои фантазии.

>>519301

Более того, качество кода там как правило днище, тестов нет и тд.

>>519306

Ты что-то напутал. Может у тебя колонки в другом порядке идут? Сделай-ка

DESCRIBE pet;

И покажи что он выведет. Также попробуй после LOAD INFILE сделать команду

SHOW WARNINGS;

И напиши что она выведет.

На форуме

> Варианты с подстановкой вместо /N, //N и NULL приводили к аналогичным результатам.


Там перепутали прямой и обратный cлеш. Надо писать \N иначе MySQL понимает это как строку "/N" и при попытке вставить вместо даты всталвяются нули.

Если ты перед вставкой сделаешь команду

SET sql_mode = 'STRICT_ALL_TABLES';

То MySQL не позволиит остатся ошибке незамеченной и громко сообщит о ней.

>>519333

Ну так а у нас цель считать лайки а не число не-NULL результатов. Код должен быть логичным а не запутанным.
#297 #519392
>>519339

Если ты афйон в кредит верно решил то айпад решается за 5 минут.

Решение должно писать сколько всего денег выполчено. Твоя программа не пишет. Ответ во втором банке должен быть около 61270.

Так что пока гордиться рано.

И я не понимаю, откуда взялась цифра 11? А если я сумму кредита поменяю, добрый волшебник придет и за меня поменяет эту цифру?
#298 #519395
>>519344

А ты учел время на поиск заказчика, переговоры с ним? На исправление замечаний? 1к рублей в час ты получаешь если при работе по 8 часов в день ты за месяц набираешь 160К. Сомневаюсь, что у тебя уже есть список из 160 аналогичных заказов. Так что реальная почасовая оплата наверно меньше выходит.

Ну и нет такого понятия как «справедливая» цена. Это как? Если я бы был заказчиком то для меня «справедливая» цена это ноль рублей + может быть отзыв (хотя не, сорри, мне некогда ставить отзывы, надо задачки проверить анонам).

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

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

Вот тут есть статья, она не совсем про фриланс, но про формирование цен, от Джоэла Спольски, он раньше работал в майкрософт (над экселем) и очень умный (хотя вы молодежь наверно про него не слышали, но он кроме автора блога еще и сооснователь StackOverflow): http://russian.joelonsoftware.com/Articles/CamelsandRubberDuckies.html

> Кто делал сайты-визитки, что там должно быть обязательно?


То, что хочет видеть заказчик.

А, еще кое-что. Если у тебя хорошее настроение и ты думаешь что провернул выгодную сделку, не спеши радоваться. Может быть заказ отдал тебе посредник который взял с заказчика допустим 5 или 10К.

>>519349

Распечатать, на стенку повесить и смотреть на него когда кушать захочется.
#299 #519397
>>519365

Документация по Lavarel (и по Illuminate\Support\Collection) что на это говорит?

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

>>519382

Неверно.
#300 #519399
>>519365
говорит, что есть метод toArray(), однако когда я его выполняю ничего не меняется. И у меня все равно объект.
Печаль какая -то, не знаю как поступить.
#301 #519400
>>519370
Unknown, если ss_1 is null. Так как обычно Unknown считается также как false в логических выражениях, то достаточно заменить на ss_1 is not null, но тут на код надо смотреть.
104 Кб, 1280x720
#302 #519402
>>518083

И да анон, все же не могу удержаться. Тени у тебя ужасные. У меня от них глаза вытекают, когда я на них смотрю.
#303 #519403
>>519400

В SQL нет значения unknown. Ты можешь легко проверить это:

SELECT NULL <> 'adas'
#304 #519406
>>519365

Fc это класс какого-то апи? Почитай доки по нему и изучи его исходный код.

У Illuminate\Support\Collection наверняка не только toArray есть, посомтри внимаительно.
#305 #519409
>>519403
В твоём sql может быть и нет, а в нормальном - троичная логика с true, false и null unknown. И в том же нормальном sql твоё выражение всегда будет равняться unknown.
#306 #519411
>>519409

Cравнение с NULL возвращает NULL (а не UNKNOWN), по крайней мере в MySQL.

Вики показывает что во многих БД с ним тоже все не просто: https://en.wikipedia.org/wiki/Null_(SQL)#Data_typing_of_Null_and_Unknown

Что-то у меня ощущение что это только в стандарте работает а не на практике.

В Postgres тоже NULL: http://sqlfiddle.com/#!15/3d4f6/4
#307 #519423
>>519395

И мне тут еще одна мысль в голову пришла (по поводу ценообразования). Иногда я вижу акции типа «2 по цене одной». Если магазин может позволить себе продавать 2 вещи по цене одной значит он накручивает на цену закупки не менее 100%!

Также, я допустим видел вещь которая продается со скидкой (за 1300) при том что старая цена была 2400. То есть они продают вещь со скидкой и остаются в плюсе, а сколько же они накрчивали когда цена была без скидки?
#308 #519425
>>519423

Дык товар залеживается и чтобы хоть какие-то деньги получить они продают его со скидкой, т.к. иначе они вообще никакие деньги не получат.
#309 #519432
>>519425

Тем не менее в убыток они продавать не будут, мне кажется. Особенно если речь об одежде, которая не портится и которую можно в случае неудач продать в магазин распродаж.
#310 #519434
>>519432

Ну там убыток в случае какого-то определенного товара не так критичен. Обычно он включен в расчеты. Да и скидки зачастую делают фиктивными, т.е. цену оставляют прежнюю, но пишут, мол скидка 50%. Чистая игра на психологии, чтобы людям казалось, что они выгодно очень что-то покупают.
#311 #519435
>>519392
Ну в условии задачи сказано "определить каким банком выгоднее пользоваться".

Я посчитал и вышла, что выгоднее всего третьим банком, так как за 11 месяцев школьник уже ничего не должен банку, 11 месяцев я сам написал. Условие просто не понятное то ли я должен к сумме кредита прибавлять процент и комиссию и вычитать ежемесячную оплату анона, то ли что, хрен пойми
#312 #519441
>>519435

Каждый месяц ты прибавляешь к долгу процент от него и комиссию. Затем анон платит сколько может. И так пока долг больше нуля.
#313 #519456
>>519411
В db2 unknown, в оракле на работе проверю. Но вообще iunknown это тако аналог null для sql boolean
#314 #519457
>>519441
Ну так? Долг 40 000 + процент + комиссия - оплата анона.

Выходит та формула, что у меня в коде.
#315 #519466
>>519441
Да, кстати, я не совсем понимаю как сумма кредита может почти вверх, если школьник отдаёт больше чем ему начисляет банк
#316 #519467
>>519466

> быстрофикс


Рости* вверх
#317 #519469
>>519456

Я хотел на sqlfiddle проверить но не смог составить запрос (с ораклом особо не работал, а гугл не помог): http://sqlfiddle.com/#!4/9eecb7d/2177

> SELECT NULL <> 1 FROM dual;


> ORA-00923: FROM keyword not found where expected



Что ему не нравится?

>>519457

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

>>519466

Она и не растет вверх.
#318 #519470
>>519456

И вообще, у оракла такие информативные сообщение об ошибках! Он пишет только ошибку но не пишет где она произошла и когда у тебя огромный запрос это совсем не весело.
#319 #519477
>>519469
Проверил, у оракла нет unknown. У него вообще нет boolean для sql, лол, есть только в pl/sql.
>>519470
Там невозможно просто так вывести значение булеана в запросе. Булеан в оракле есть только в pl/sql, в sql-запросе надо пользоваться case-when/decode или условиями в where.

И вывод строчки с ошибкой тоже только в pl/sql, но даже там, если ошибка в запросе, то он укажет только в каком запросе. Но обычно простые ошибки ещё sqldeveloper показывает, а сложные более-менее из текста ошибки понятны(если это только не ora-600)
#320 #519479
>>519477
Забыл сказать, вместо unknown в хоракле null.
129 Кб, 750x658
#321 #519497
>>519469
блять, я что-то нихуя не понимаю
определи наиболее выгодный кредит. Платить школьник, как и прежде, может не более 5000 р. в месяц. Сначала начисляются проценты и комиссия, а только потом происходит выплата.

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

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

Можешь хотя бы примерно намекнуть, что я должен сделать?

Я вот в душе не ебу как эту задачу с первого раза можно решить за 5 минут.
#322 #519502
>>519497

61270 это общая сумма выплат по кредиту. КАк могло получиться? 39999 + проценты + комиссии за время выплаты.

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


Посчитать общую сумму выплат по кредиту и посмотреть где меньше.
#323 #519553
>>519013

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


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

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

>>519121

> http://ideone.com/Chstwl


Все правильно

> http://ideone.com/yddJ6y


Верно решено.

> http://ideone.com/xgdIm2


Верно, но эти повторяющиеся строки стоит вынести за пределы ифа:

>\t$creditBalance = $creditBalance - $monthlyPayment;


> $paymentTotal = $paymentTotal + $monthlyPayment;


> echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {



> http://ideone.com/gmkUEV


Тут все правильно.
#324 #519555
>>519139

> я должен гсч задать число от 100000 до 999999 а затем делить его на 10 и в итоге получиться последняя цифра поста, то есть нужно задать что выводить при получении чисел от 0 до 9 так?


Да, надо поставить например блок if/elseif/else который для разных цифр выводит разные тексты.

> А для задания с кубиками код так должен выглядеть конечный в итоге или можно лучше было?


Если это твой код http://ideone.com/yddJ6y то все верно

>>519153

Да, верно.
#325 #519646
>>519380

>Также, я тут подумал, не проще ли генерировать условие вида:


>


>SELECT ...


>WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?


>ORDER BY ... LIMIT ...


>


>И пусть база объединяет результаты.


Наверное так и сделаю. Странно, что это сразу мне в голову не пришло.

>Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):



>(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html


Вообще, мне нравится, как эта штука реализована в Symfony. Даже без yaml-конфига всё кратко, читаемо и понятно. Алсо, не знал, что в PHP можно вызвать несколько методов объекта, написав его ссылку-переменную всего один раз.

>Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).


Уже ощутил это, когда игрался с контейнером.

>> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22


>> if ($token) {


>> $abiturient = $mapper->getByToken($token);


>А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?


Предлагаешь перенести проверку наличия токена в базе из getByToken() в контроллер? Так-то сейчас маппер, если не находит токен, то возвращает объект Abiturient с пустыми полями.

С остальными замечаниями всё понятно, спасибо, исправлю.

>>519402
Зачем удерживаться, лол? Буду рад, если укажешь на все ошибки, даже те, которые не касаются основного кода. Всё равно, как подучу HTML/CSS, планирую все шаблоны переделать.
А в каком смысле "ужасные"? Они тут не уместны? Мне просто белые бутстраповские таблички на белом фоне показались скучными. Или тени как-то неправильно сделаны?
#325 #519646
>>519380

>Также, я тут подумал, не проще ли генерировать условие вида:


>


>SELECT ...


>WHERE (field1 LIKE '%word1%' OR field2 LIKE '%word1%' ... ) AND (.... LIKE '%word2%') AND (.... LIKE '%word3%') ?


>ORDER BY ... LIMIT ...


>


>И пусть база объединяет результаты.


Наверное так и сделаю. Странно, что это сразу мне в голову не пришло.

>Кстати, если тебе интересно, можешь почитать как сделан DI Container в симфони (он может использоваться и без симфони как отдельный компонент):



>(англ) http://symfony.com/doc/current/components/dependency_injection/introduction.html


Вообще, мне нравится, как эта штука реализована в Symfony. Даже без yaml-конфига всё кратко, читаемо и понятно. Алсо, не знал, что в PHP можно вызвать несколько методов объекта, написав его ссылку-переменную всего один раз.

>Я не знаю, видишь ли ты это или нет, но при правильном DI твои классы не привязаны к конкретной реализации контейнера. То есть если твой AbiturientMapper и AbiturientService написаны правильно то ты можешь использовать их с любым другим контейнером, не меняя эти классы (в твоем случае это так, потому что ты следуешь принципам DI, и это хорошо).


Уже ощутил это, когда игрался с контейнером.

>> https://github.com/blackberryJam/abiturients/blob/master/app/classes/UserpageController.php#L22


>> if ($token) {


>> $abiturient = $mapper->getByToken($token);


>А что если по каким-то причинам (ошибка в куке, удален из базы) такой абитуриент не найден?


Предлагаешь перенести проверку наличия токена в базе из getByToken() в контроллер? Так-то сейчас маппер, если не находит токен, то возвращает объект Abiturient с пустыми полями.

С остальными замечаниями всё понятно, спасибо, исправлю.

>>519402
Зачем удерживаться, лол? Буду рад, если укажешь на все ошибки, даже те, которые не касаются основного кода. Всё равно, как подучу HTML/CSS, планирую все шаблоны переделать.
А в каком смысле "ужасные"? Они тут не уместны? Мне просто белые бутстраповские таблички на белом фоне показались скучными. Или тени как-то неправильно сделаны?
#326 #519660
Блин, не могли создать тред с нормальым оп постом? Я охренел искать тред, в итоге нашел ПРЕДЫДУЩИЙ АЖ НА 5й СТРАНИЦЕ, и в нем увидел перекат в этот.

В общем а теперь к делу. Работаю я можно сказать джуном, пилим 1 проект для внутреннего использования. Там есть свой поиск, всякие сортировки, постраничка и прочая годнота. Суть в том, что сначала там было все просто со url
Например сначала были только ссылки типа:
базовый_урл/контроллер/метод/тип
например:
host.ru/admin/user/add
или
host.ru/admin/event/add

Но потом добавились всякие сортировки и поиск, и вскоре ссылка стала выглядеть уже так:
host.ru/account/index?sort=user_name&order=asc

А с прикрученным поиском и

host.ru/account/index?sort=status&order=asc&find=test

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

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

Поэтому было принято решение сделать это дело через сессию.
То есть в сессию кидать простую переменную $hideStuff, и соответственно, если юзер нажимает кнопочку спрятать, то значение меняется на true, и взависимости от неё контроллер передает модели доп аргумент и всё сейчас вообще выглядит просто прекрасно.

Объясните мне почему это может быть ошибочным вариантом? У меня вообще идея перенести туда и сортировку и поиск, что бы избавиться от get - мишуры в url и кучи условий при отрисовки ссылок во вьюхе. Такие дела.

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

Буду рад ответам.
#326 #519660
Блин, не могли создать тред с нормальым оп постом? Я охренел искать тред, в итоге нашел ПРЕДЫДУЩИЙ АЖ НА 5й СТРАНИЦЕ, и в нем увидел перекат в этот.

В общем а теперь к делу. Работаю я можно сказать джуном, пилим 1 проект для внутреннего использования. Там есть свой поиск, всякие сортировки, постраничка и прочая годнота. Суть в том, что сначала там было все просто со url
Например сначала были только ссылки типа:
базовый_урл/контроллер/метод/тип
например:
host.ru/admin/user/add
или
host.ru/admin/event/add

Но потом добавились всякие сортировки и поиск, и вскоре ссылка стала выглядеть уже так:
host.ru/account/index?sort=user_name&order=asc

А с прикрученным поиском и

host.ru/account/index?sort=status&order=asc&find=test

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

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

Поэтому было принято решение сделать это дело через сессию.
То есть в сессию кидать простую переменную $hideStuff, и соответственно, если юзер нажимает кнопочку спрятать, то значение меняется на true, и взависимости от неё контроллер передает модели доп аргумент и всё сейчас вообще выглядит просто прекрасно.

Объясните мне почему это может быть ошибочным вариантом? У меня вообще идея перенести туда и сортировку и поиск, что бы избавиться от get - мишуры в url и кучи условий при отрисовки ссылок во вьюхе. Такие дела.

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

Буду рад ответам.
7 Кб, 329x231
#327 #519689
Решал задачи по CSS https://gist.github.com/codedokode/58ebc90bd006baf4b35c
Дошел до 5й. Решил ее. Но вот одно но. На пикче которую дал автор, текст окрашен в фоновый цвет, а это означает, что полупрозрачный фон находится поверх текста. Как это было сделано? Я потратил пару часов на поиск решения, да так и не нашел.
#328 #519756
#329 #519759
>>519689
>>519756
Это обычный бэкграунд, зачем тут прозрачный текст, лол?
#330 #519760
>>519759

>прозрачный фон


фастфикс
#331 #519762
>>519689
Если у тебя ушло на поиск пару часов и ты так и не нашел ответа, у меня для тебя плохие новости. Потому-что в подсказке к задачке все доходчиво написано.
#332 #519813
Что-то долбить проекты вообще стимула нет, раз за это не платят, по правде говоря. Сколько вообще надо проектов сделать и фреймворков вызубрить, чтобы получить заказ на апворке каком-нить?
#333 #519823
>>519813
Дохуя. Поэтому в офис и идут на пару лет, если хотят на апворках работать. В офисе проще всю эту гору фреймворков, библиотек и сопутствующих технологий освоить.
#334 #519824
Осваиваю HTML/CSS.
Задание №1: https://jsfiddle.net/medq405y/
Задание №2: https://jsfiddle.net/xuof3v2n/
#335 #519826
>>519386
>>519386
ну вот так я не понимаю, как выводится массив данных в мвк - вон вверху скрин приведен. единственный гайд, по которому смогу сделать - английские, все остальные русские говно с хабра, у меня даже не получается переделать (потому что там непонятно какие-то скрины что куда втыкатеся нихуя не понятно) даже распаковать готовый пример и установить не поулчается. переделал только одни английский гайд с ютуба ну так там только дна переменая выводится а массив нихуя. так что да мвк - это ракета хуй пойми как работает.
#336 #519828
>>519824
Более лучшее задание №2: https://jsfiddle.net/xuof3v2n/2/
#337 #519830
>>519826
Массив выводится классом view, которую создает controller, сам массив вытаскивается контроллером из модели, которую тоже создает контроллер. Еще контроллер проверяет все инпуты. Так же и со всеми остальными данными.
#338 #519852
>>519823
но я живу в деревне, у меня нет офиссов, чо не догоняешь?
>>519830
а у меня не вытаскивается.
#339 #519874
>>519502
http://ideone.com/TU0wFc

ОП, подскажи, сейчас то где ошибка? Все вроде правильно написал.
#340 #519891
Про айпад и школьника, рейтаните.
http://ideone.com/oLTBYc
216 Кб, 2000x2700
#341 #519913
>>519646

> Даже без yaml-конфига всё кратко, читаемо и понятно.


А с конфигом компактнее и быстрее писать. В симфони вообще интересная архитектура. Приложение там состоит из бандлов — например, может быть бандл с твоим кодом + бандлы сторонних библиотек. И каждый бандл может доьавлять в контейнер свои сервисы, свои правила роутинга в роутер и тд.

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

> Алсо, не знал, что в PHP можно вызвать несколько методов объекта, написав его ссылку-переменную всего один раз.


Это назвается method chaining, и для этого надо делать чтобы в конце метода стояла return $this; Мне кстати это не особо нравится, так как надо всюду пихать этот return $this. Да и на практике не так уж часто оно нужно.

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


Лучше наверно перенести это в контроллер так как традиционно методы вроде getById врозвращают null если объект не найден (я читая код подумал именно так). Ну или назвать метод getAbiturientOrCreateNew чтобы название соответствовало тому что он делает.

> А в каком смысле "ужасные"? Они тут не уместны? Мне просто белые бутстраповские таблички на белом фоне показались скучными. Или тени как-то неправильно сделаны?


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

Также, в желтом заголовке не хватает вертикального паддинга, тексту там тесно.

Отступы и поля тоже важны при оформлении страницы.

Вот пикрелейтед, я тут решил поиграть с цветами/шрифтами.
#342 #519919
>>519660

Ты решаешь не ту проблему. В чем проблема что в ссылке будет не 3, а 4 параметра? Query string как раз и предназначена для их передачи. Тебе место в адресной строке жалко что ли?

Твоя проблема — плохой код в вью, если я правильно тебя понял:

> Но глянув во вьюху, где отрисоввываются ссылки, я охуел от того сколько говна там накручено и от того сколько надо будет еще наворотить, если и это сделать через get



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

Идея использовать сессии, в общем плохая. Сессия общая для всех вкладок, сессия не передается если ты сохранишь ссылку в закладки/перешлешь кому-то, сессия не меняется если ты жмешь кнопку «назад» в браузере. То есть заменяя параметры в URL на сессию ты делаешь использование сайта менее удобным и ломаешь встроенные в браузер механизмы.

Ну и это не соответствует принципам REST.

Однако в некоторых случаях сессии/куки удобнее чем сылки. Они нужны для постоянных настроек которые оченб редко меняются и которые не надо передавать вместе со ссылкой. Например, громкость на ютубе: куки — идеальное место для нее, в то время как допсиывать ее в каждый URL неудобно и бессмысленно (так как когда ты отпрваляешь ссылку на видео, пользователю не интересно на какой громкости ты его смотришь).

Аналогично, выбор языка интерфейса — это тоже удобнее хранить в куках.

Заметь, я пишу куки, а не сессия. Сессия это временное хранилище и она умировает через 20 минут неактивности и мы не хотим терять настройки языка или громкости так быстро.

Для сортировки разумеется сессия и куки не подходят, если только нет надобности навсегда сохранять эту настройку. То есть надо смотреть на сценарий использования сайта.

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


Ты решаешь не ту проблему, городишь костыли и при этом все равно получаешь менее удобное решение.
#342 #519919
>>519660

Ты решаешь не ту проблему. В чем проблема что в ссылке будет не 3, а 4 параметра? Query string как раз и предназначена для их передачи. Тебе место в адресной строке жалко что ли?

Твоя проблема — плохой код в вью, если я правильно тебя понял:

> Но глянув во вьюху, где отрисоввываются ссылки, я охуел от того сколько говна там накручено и от того сколько надо будет еще наворотить, если и это сделать через get



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

Идея использовать сессии, в общем плохая. Сессия общая для всех вкладок, сессия не передается если ты сохранишь ссылку в закладки/перешлешь кому-то, сессия не меняется если ты жмешь кнопку «назад» в браузере. То есть заменяя параметры в URL на сессию ты делаешь использование сайта менее удобным и ломаешь встроенные в браузер механизмы.

Ну и это не соответствует принципам REST.

Однако в некоторых случаях сессии/куки удобнее чем сылки. Они нужны для постоянных настроек которые оченб редко меняются и которые не надо передавать вместе со ссылкой. Например, громкость на ютубе: куки — идеальное место для нее, в то время как допсиывать ее в каждый URL неудобно и бессмысленно (так как когда ты отпрваляешь ссылку на видео, пользователю не интересно на какой громкости ты его смотришь).

Аналогично, выбор языка интерфейса — это тоже удобнее хранить в куках.

Заметь, я пишу куки, а не сессия. Сессия это временное хранилище и она умировает через 20 минут неактивности и мы не хотим терять настройки языка или громкости так быстро.

Для сортировки разумеется сессия и куки не подходят, если только нет надобности навсегда сохранять эту настройку. То есть надо смотреть на сценарий использования сайта.

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


Ты решаешь не ту проблему, городишь костыли и при этом все равно получаешь менее удобное решение.
#343 #519923
>>519660

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

А вот громкость надо хранить в куках так как на разных устройствах разные звуковые карты и устройства вопросзведения звука.

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

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

Подсказка: используй свойство color (как альтернатива ты можешь сделать текст прозрачным укзав rgba-цвет или opacity, но по моему проще пипеткой померять цвет и задать его).

>>519762

Он начинающий, все нормально.

>>519813

Это нужно для того чтобы освоить какие-то технологии. Если не хочешь, можешь не учить, но кем ты будешь работать? Верстальщиком? Поддерживать сайты с кучей быдлокода? Тебе быстро надоест.

>>519826

Просто передеаешь свой массив в шаблон и все. Допустим ты подключаешь шаблон через require:

$users = []; // пример массива
$users[] = new User('Иван', 1980);
$users[] = new User('Вася', 1970);

// подключаем шаблон, передавая массив
require _ _ DIR _ _ . '/templates/users.phtml';

В шаблоне соответсвнно выводим их через foreach.

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


Давай поменьше негатива. Это пользы не даст ни тебе ни мне.

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


В чем проблема посмотреть почему не работает и исправить ошибки? Если ты это сделать не можешь то тебе рано браться за MVC и стоит вернуться к решению более простых задач на PHP для закрепления знаний.

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

> ну вот так я не понимаю, как выводится массив данных в мвк - вон вверху скрин приведен.


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

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

И переписывание/копирование кода пользы не дает. Польза будет если ты MVC приложения напишешь сам от начала и до конца.

Например, решая задачу про список студентов.
#344 #519931
>>519689

Подсказка: используй свойство color (как альтернатива ты можешь сделать текст прозрачным укзав rgba-цвет или opacity, но по моему проще пипеткой померять цвет и задать его).

>>519762

Он начинающий, все нормально.

>>519813

Это нужно для того чтобы освоить какие-то технологии. Если не хочешь, можешь не учить, но кем ты будешь работать? Верстальщиком? Поддерживать сайты с кучей быдлокода? Тебе быстро надоест.

>>519826

Просто передеаешь свой массив в шаблон и все. Допустим ты подключаешь шаблон через require:

$users = []; // пример массива
$users[] = new User('Иван', 1980);
$users[] = new User('Вася', 1970);

// подключаем шаблон, передавая массив
require _ _ DIR _ _ . '/templates/users.phtml';

В шаблоне соответсвнно выводим их через foreach.

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


Давай поменьше негатива. Это пользы не даст ни тебе ни мне.

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


В чем проблема посмотреть почему не работает и исправить ошибки? Если ты это сделать не можешь то тебе рано браться за MVC и стоит вернуться к решению более простых задач на PHP для закрепления знаний.

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

> ну вот так я не понимаю, как выводится массив данных в мвк - вон вверху скрин приведен.


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

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

И переписывание/копирование кода пользы не дает. Польза будет если ты MVC приложения напишешь сам от начала и до конца.

Например, решая задачу про список студентов.
#345 #519932
>>519852

Ну так натыкай var_dump и разберись почему не втаскивается.
#346 #519940
>>519919
>>519923
Спасибо за развернутый ответ. В целом сейчас я думаю, что это дело вообще можно хранить в базе, как настраиваемые параметры пользователя. И не придется писать костыли для перепроверки и перегенерации всего этого снова.
#347 #520012
ОП, планирую перенести свой говносайт с ужасным кодом на yii2, а вернее, переписать его с нуля.
Можно я иногда буду кидать тебе контроллеры, модели и так далее чтобы ты сказал, что там не так? С фреймворками имею небольшой опыт, так что у меня всё получится, хотелось бы только сделать всё по канонам. Поможешь советами?
#348 #520014
Что лучше, Yii2, Laravel или Zend?
#349 #520096
>>520014
Пыхопе говно, лучше Golang!
82 Кб, 610x400
sage #350 #520213
>>519397
>>519399
>>519406
Ребят, спасибо проблему решил.
#351 #520227
нихуяси я смог в динамическое создание страниц по шаблону.
349 Кб, 640x359
#352 #520228
Ребята, год пыху учу, мне 18. Попробовал свой микрофреймворк запилить. Оцените, пожалуйста? Критика приветствуется.
https://github.com/DmitryMachavariani/micro
#353 #520300
>>520228
но зачем?
#354 #520319
>>520228
И более того, нахуй код? Ты для начала апи своего фреймворка покажи, чтобы вообще понимать, нужно ли это писать.
#355 #520336
>>519824
>>519828

> Задание №1


Ок, хорошо, хоть ты и не сделал там бордер, но в общем сделано правильно.

> Задание №2:


Слишком много дивов и max-width, попробуй обойтись одним.

>>519874

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

$i — это что? Из названия понять невозможно.
$credit — это что?

Причем увеличиваешь ты одну переменную, а уменьшаешь другую. Для обозначения текущего долга должна быть ровно одна переменная.

Также, это никуда не годится:

> if ($payment==7777) {


> ..


> $payment++;


Что за костыли? Почему увеличивается payment на один? Почему число 7777 написано в программе 2 раза, а не один? Что это за ерунда? Если тебе надо в первый месяц прибавить эту сумму то просто прибавь ее к долгу перед циклом.

Также, пропусти код через phpformatter.com
#355 #520336
>>519824
>>519828

> Задание №1


Ок, хорошо, хоть ты и не сделал там бордер, но в общем сделано правильно.

> Задание №2:


Слишком много дивов и max-width, попробуй обойтись одним.

>>519874

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

$i — это что? Из названия понять невозможно.
$credit — это что?

Причем увеличиваешь ты одну переменную, а уменьшаешь другую. Для обозначения текущего долга должна быть ровно одна переменная.

Также, это никуда не годится:

> if ($payment==7777) {


> ..


> $payment++;


Что за костыли? Почему увеличивается payment на один? Почему число 7777 написано в программе 2 раза, а не один? Что это за ерунда? Если тебе надо в первый месяц прибавить эту сумму то просто прибавь ее к долгу перед циклом.

Также, пропусти код через phpformatter.com
#356 #520338
>>519891

Считает правильно. Хотя по моему тут нет особого смысла разбивать параметры на передаваемые в конструктор и функцию, проще наверно все передавать сразу в функцию.

> if ($this->payout <= $creditSum)


> else // $this->payout > $creditSum


Можно бы заменить if/else на min или max.

> // endwhile


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

> echo '<pre>';


Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

>>520012

Конечно, скидывай.

>>520014

Zend по моему старый. Это фреймворки разного уровня:

Yii2, lavarel — среднего уровня
Zend (который по моему сдает по популярности Symfony 2) — навороченные
#356 #520338
>>519891

Считает правильно. Хотя по моему тут нет особого смысла разбивать параметры на передаваемые в конструктор и функцию, проще наверно все передавать сразу в функцию.

> if ($this->payout <= $creditSum)


> else // $this->payout > $creditSum


Можно бы заменить if/else на min или max.

> // endwhile


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

> echo '<pre>';


Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

>>520012

Конечно, скидывай.

>>520014

Zend по моему старый. Это фреймворки разного уровня:

Yii2, lavarel — среднего уровня
Zend (который по моему сдает по популярности Symfony 2) — навороченные
#357 #520388
>>520300

>но зачем?


Ради интереса и практики, что ты как маленький. Никогда не пробовал что-то своё писать?

>>520319

>нахуй код?


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

>Ты для начала апи своего фреймворка покажи


Во-первых, приставку микро я добавил не просто так. Во-вторых, какое ещё API у фреймворка?
#358 #520492
Как в верстке принято называть длинные классы и айди? Кэмел кейсом или через дефис/подчеркивание?
В html кажется нет регистрочувствительности, значит кэмел кейс не очень уместен.

class="container-narrow"
class="containerNarrow"
class="container_narrow"

Как лучше? (имею ввиду общепринятые практики)
55 Кб, 519x492
#359 #520504
>>520336

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


>Причем увеличиваешь ты одну переменную, а уменьшаешь другую. Для обозначения текущего долга должна быть ровно одна переменная.



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

>$i — это что? Из названия понять невозможно.


$credit — это что?

там было написанно $i=$credit, а $credit это сумма которую осталось выплатить анону, с каждой итерацией она уменьшалась постепенно уменьшалась и когда становилось меньше 0, то цикл заканчивался.

> if ($payment==7777) {


> ..


> $payment++;


>Также, пропусти код через phpformatter.com



http://ideone.com/7NQzEP

В общем смотри, что получилось, во втором банке вышло конечно не 61270, а 61268. Почему, хер его знает.

Сравни ответы со своими, правильно решил?
#360 #520534
Стоит ли идти на стажировку в конторку, чтобы потом писать под битрикс?
19 Кб, 450x300
#361 #520540
http://phpclub.ru/mysql/doc/date-calculations.html
Поясните, зачем вычитать единичку, сам синтаксис и работа функций мне понятна, а вот все эти даты и прочее я никогда не понимал, даже по порядку месяцы не смогу назвать на память, ибо не обращаю на это внимание в жизни.
#362 #520557
Перекину вопрос из общего, вроде за этим к вам.

Есть задание: запилить одностраничный сайт с опросом, после прохождения которого выводится статистика по все ответам на опрос. Как делать? Я только страницу написал, как данные передадются, обрабаываются и выводятся (не цифрами, а графиками) вообще понятия не имею.
А если найдётся кто-то, кто объяснит как дауну, скину почту и тонны нефти
24 Кб, 278x200
#363 #520558
Вбросьте каноничное(или любое другое) руководство по git для нубов.
#365 #520561
>>520557
Если одностраничный, то здесь даже сессии не нужны. Человек выставляет чекбоксы и отправляет форму.
Php выводит в ответ html и графики с результатами, а также выдернутую из базы данных статистику.
Это элементарно, если ты не понимаешь как это работает, то нужно сначала выучить основы php и sql.
Делать за тебя это конечно никто бесплатно не будет. Так что прикрепляй почту и пиши бюджет, может кто и согласится.

>>520558 https://git-scm.com/book/ru/v1
#366 #520571
Ребята, ответьте на такой вопрос. Я сейчас перед выбором какой язык учить. PHP или Java. Ознакомился с областями применения обоих языков. Обе области меня устраивают. Я бы сказал так 60% PHP и 40% Java. Но выбираю все-таки Java только из-за того, что все говорят о смерти PHP, о том что в будущем уже его не будет и что Java будет самым востребованным. Так вот собственно вопрос. Сейчас мне осталось 2 года учебы в универе а потом нужно будет искать место работы. Смогу ли я через 2 года нормально зарабатывать или даже устроиться на постоянную работу изучая PHP или все эти слухи о смерти PHP правда?
#367 #520574
>>520561
Спасибо.

wannabetattoist@yandex.ru
#368 #520583
>>520571
Ты - это я. Двачую вопрос.
#369 #520609
>>520571
Платят за PHP меньше, чем за Java. Но работ больше. Умрет вряд ли, слишком популярный, легкий в освоении, тулзов кучи и сайтов на нем уже много написано.
#370 #520613
>>520571

Смерть PHP это что-то уровня развала США.
#371 #520615
>>520613
Значит всё-таки учить дважу?
#372 #520616
>>520388

>что ты как маленький.


написал 18летний мальчик :3
#373 #520620
>>520615
Мне кажется, что наоборот, хотели сказать что PHP не умрет.
Кун, который задавал первым вопрос.
#374 #520621
>>520615

Пидоран, плиз.
#375 #520622
>>520615
Больше одного языка выучить нереально, да?

>>520616

>18летний мальчик


> :З

#376 #520627
>>520621
Либерахен, не рвись.
#377 #520630
>>520627
На домбасс, быдло.
#378 #520633
>>520630
Почему еще не в котле, свынья?
#379 #520647
Что-то когда оп пропадает, лалки начинают от скуки тралиться.

ОП, как появишься, посоветуй как правильно стилизировать поле для загрузки файла. Я полистал какие-то левые статьи, там советую фигню. В одном месте говорят тянуть jquery, в другом какие-то дикие пляски с псевдоэлементами типа ::after и ::before
Может есть какой-то универсальный и "правильный", т.е. наиболее оптимальный способ?
Прежде всего камнем преткновения является невозможность отредактировать текст на кнопке загрузки (или я читал устаревшие материалы?).
Поэтому предлагают кнопку вообще нафиг убрать, и вместо нее присобачить какие-то костыли.
Короче, мне нужна тупо круглая кнопочка с плюсиком в центре, а название подгруженного файла должно отображаться где-то в другом месте, в списке ниже например.
#380 #520664
>>520492

Через дефис, маленькими буквами:

menu-header
menu-item-active

Также тебе стоит почитать про именование в БЭМ: https://ru.bem.info/articles/bem-for-small-projects/ (только про именование, остальное по моему дурь: блоки и виджеты прекрасно делаются на серверном языке программирования вроде PHP без всяких BEM tree которые только все усложняют. Хотя с другой строны блоки на клиентских технологиях не привязаны к языку на сервере. Но мне они все равно не нравятся, выглядит как костыль какой-то).

>>520504

Лучше, но пока не достаточно хорошо.

> $total = $total + $credit × $percent + $comission;


> $credit = $credit + $credit × $percent + $comission;


это выражение аж 4 раза повторяется. Избавься от копипасты.

Число 39999 повторяется 6 раз, надо вынести его в переменную чтобы было удобно менять.

> getBalanceInFuture(39999, 0.04, 500, 0, 5000, 39999);


Почему ты передаешь число 39999 2 раза? Передавай один раз.

Что хранится в переменной total? Если это сумма выплаченная школьником то почему ее начальне знаечние 39999? Что это значит? Школьник в первый месяц заплатил 39999 сразу?

> Сравни ответы со своими,


Совпадения ответа недостаточно. Код должен быть понятен и логичен. Очевидно что в самом начале полная сумма выплат равна нулю.

>>520540

Вася родился в 2001 году. Сейчас 2015. Сколько Васе лет? Можно ли ответить на этот вопрос не зная день и месяц рождения?

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

> RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)


Это как раз и есть костыльный способ сравнить день/месяц рождения с текущими. даты в MySQL выглядят как 2015-07-25 потому последние 5 цифр хранят месяц и день.
#380 #520664
>>520492

Через дефис, маленькими буквами:

menu-header
menu-item-active

Также тебе стоит почитать про именование в БЭМ: https://ru.bem.info/articles/bem-for-small-projects/ (только про именование, остальное по моему дурь: блоки и виджеты прекрасно делаются на серверном языке программирования вроде PHP без всяких BEM tree которые только все усложняют. Хотя с другой строны блоки на клиентских технологиях не привязаны к языку на сервере. Но мне они все равно не нравятся, выглядит как костыль какой-то).

>>520504

Лучше, но пока не достаточно хорошо.

> $total = $total + $credit × $percent + $comission;


> $credit = $credit + $credit × $percent + $comission;


это выражение аж 4 раза повторяется. Избавься от копипасты.

Число 39999 повторяется 6 раз, надо вынести его в переменную чтобы было удобно менять.

> getBalanceInFuture(39999, 0.04, 500, 0, 5000, 39999);


Почему ты передаешь число 39999 2 раза? Передавай один раз.

Что хранится в переменной total? Если это сумма выплаченная школьником то почему ее начальне знаечние 39999? Что это значит? Школьник в первый месяц заплатил 39999 сразу?

> Сравни ответы со своими,


Совпадения ответа недостаточно. Код должен быть понятен и логичен. Очевидно что в самом начале полная сумма выплат равна нулю.

>>520540

Вася родился в 2001 году. Сейчас 2015. Сколько Васе лет? Можно ли ответить на этот вопрос не зная день и месяц рождения?

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

> RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)


Это как раз и есть костыльный способ сравнить день/месяц рождения с текущими. даты в MySQL выглядят как 2015-07-25 потому последние 5 цифр хранят месяц и день.
#381 #520666
>>520647
В общем, из того что я прочитал, мне больше всего понравился следующий способ:
1. Кнопку загрузки сделать прозрачной (именно opacity, а не display:none или visibility), чтобы она по прежнему оставалась рабочей.
2. А "под ней" отпозиционировать пустышечку кнопки той самой формы, цвета и текста, что нам нужны.
Как идея? Ну я пока так делаю, потом может кто-нибудь опытный нарисуется, прокомментирует это дело.
#382 #520682
>>520557

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

>>520571

О смерти PHP говорят уже лет 10.

>>520613

И смерти виндоуз.

>>520647

Делаем поле прозрачным на 100% и под ним выводим все что угодно. Также, придется добавить яваскрипта чтобы выводить имя выбранного файла (не забудь проверить на очень длинных именах). Также, проверь свой CSS чтобы во всех браузерах невидимое поле выводилось ровно над нарисованным.

> говорят тянуть jquery


Можно и без jQUery, это всего лишь обертка над DOM. Разумеется JS и DOM надо знать. Но без них ты и jQUery не выучишь.

> в другом какие-то дикие пляски с псевдоэлементами типа ::after и ::before


У input нет содержимого и потому нет псевдоэлементов.

> Может есть какой-то универсальный и "правильный", т.е. наиболее оптимальный способ?


Мое имхо лучше вообще не стилизовать. Или брать хороший готовый плагин.

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

Вот например статья: http://habrahabr.ru/post/189570/

Имей в виду что это:

> Поместить прозрачный input[type=file] внутрь элемента label,


> Использовать имитацию клика по скрытому input[type=file] средствами JavaScript.


Работает не везде и мне потому не нравится.

И вообще я не понимаю, зачем его стилизовать?

> Ключевой задачей было поставлено создание «резинового» input[type=file]


Резиновость создается средствами CSS

Код разумеется копипастить из статьи не стоит. И код и верстку лучше сделать самому, чтобы добавиться более стабильной работы и большей кроссбраузерности. Также, мне кажется, стоит предусмотреть что-нибудь на случай отсустсвия яваскрипта.
#382 #520682
>>520557

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

>>520571

О смерти PHP говорят уже лет 10.

>>520613

И смерти виндоуз.

>>520647

Делаем поле прозрачным на 100% и под ним выводим все что угодно. Также, придется добавить яваскрипта чтобы выводить имя выбранного файла (не забудь проверить на очень длинных именах). Также, проверь свой CSS чтобы во всех браузерах невидимое поле выводилось ровно над нарисованным.

> говорят тянуть jquery


Можно и без jQUery, это всего лишь обертка над DOM. Разумеется JS и DOM надо знать. Но без них ты и jQUery не выучишь.

> в другом какие-то дикие пляски с псевдоэлементами типа ::after и ::before


У input нет содержимого и потому нет псевдоэлементов.

> Может есть какой-то универсальный и "правильный", т.е. наиболее оптимальный способ?


Мое имхо лучше вообще не стилизовать. Или брать хороший готовый плагин.

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

Вот например статья: http://habrahabr.ru/post/189570/

Имей в виду что это:

> Поместить прозрачный input[type=file] внутрь элемента label,


> Использовать имитацию клика по скрытому input[type=file] средствами JavaScript.


Работает не везде и мне потому не нравится.

И вообще я не понимаю, зачем его стилизовать?

> Ключевой задачей было поставлено создание «резинового» input[type=file]


Резиновость создается средствами CSS

Код разумеется копипастить из статьи не стоит. И код и верстку лучше сделать самому, чтобы добавиться более стабильной работы и большей кроссбраузерности. Также, мне кажется, стоит предусмотреть что-нибудь на случай отсустсвия яваскрипта.
#383 #520686
Анон с микрофреймворком, я гляну код, но чуть позже. У тебя кстати непонятно где именно фреймворк, а где само приложение так как все идет в одном проекте. Неудобно. index.php это часть фреймворка или нет? Как его вообще устанавливать? Он поддерживает установку через композер в папку vendor? как добавить твой фрейморк в существующее приложение?
#384 #520688
>>520682
То есть при хорошем самообучении (у меня действительно есть большое желание PHP изучать и мне это нравится) я могу в будущем рассчитывать на то, что найду заработок на этом или постоянную работу в офисе? Если взять хотя бы ближайшие лет 10.
#385 #520693
>>520688
Нет, не сможешь.
#386 #520694
>>520693
И по какой причине?
#387 #520695
>>520688

Да. Спрос на хороших программистов высок.
15 Кб, 445x238
#388 #520708
>>520682

>У input нет содержимого и потому нет псевдоэлементов.


А?
http://habrahabr.ru/post/255919/

>И вообще я не понимаю, зачем его стилизовать?


Ну блин дизайн такой нужен. Пикрелейтед.

Ну хорошо, я понял. Нужно только разобраться, как вывести название подгружаемого файла, желательно без js.
24 Кб, 694x484
24 Кб, 685x492
23 Кб, 682x498
#389 #520715
>>520688
Найдешь, но платят PHPшникам стабильно меньше остальных языков. Гляди графики на пикрелейтед, по всем странам PHP программеры самые нищенки из всех.
#390 #520718
>>520715
В деньгах потеря не в разы. Зато нравится. По-моему это неплохо.
#391 #520720
>>520708

Ты в скольки браузерах проверил? Это странная особенность вебкита а не стандарт.

В стандарте явно это не написано:

http://www.w3.org/TR/css-pseudo-4/#treelike

> When their computed content value is not none, these pseudo-elements generate boxes as if they were immediate children of their originating element



Но у элементов вроде input нет детей и потому не может быть псевдоэлементов.

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


Без JS никак
#392 #520721
>>520715

Пох, переучиться всегда можно. Как будто один язык на всю жизнь выбираете, ей Б-гу.
#393 #520725
>>520715

Какое нам дело до USA? Мы не в США живем. Также, графики не учитывают уровень типа джуниор/сениор и компанию.

Тут например http://hh.ru/search/vacancy?text=php&clusters=true&enable_snippets=true первая вакансия от 120 000

Плюс, число вакансий на PHP гораздо больше, особенно без опыта.
#394 #520727
>>520715

ну и никто не запрещает тебе вкатиться в отрасль PHP программистом а потом учить любые другие языки, почему нет?
#395 #520748
>>520725
Последний график страны совка же. PHP там тоже нищенки.
#396 #520749
>>520727
С опытом php тебя и будут потом только в php брать.
#397 #520754
>>520749

Не только

>>520748

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

Ну и вообще, так как на PHP гораздо больше вакансий то понятно что среднее будет меньше. Так как на ноде среднее берется из 3 хипстерских вакансий в Москве, а на PHP среднее из хороших московских вакансий и вакансии натягивателя шаблонов в Урюпинске.

Это явно непраивльные графики. Хорошо оплачиваются и востребованы C#, Java, PHP. Недоязыки вроде ноды никому не нужны, ты много знаешь банков где софт на ноде рабоатет?
#398 #520755
>>520749

Схуяли?
#399 #520758
>>520748

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

http://habrahabr.ru/company/changellenge/blog/196664/

> Java Школа была создана для того, чтобы обучить талантливых кандидатов языку Java практически с азов, а затем растить их внутри Центра Разработки Дойче Банка как профессионалов.



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



для ноды есть аналогичные возможности обучения? Нет и никогда не будет потому что ничего сложнее чатика на ней написать нельзя. А на Яве можно.
#400 #520815
>>520755
Считается, что пхпшники неисправимы.
#401 #520816
>>520815

Ну благо долбоебов-снобов с предрассудками немного и они обычно никакого успеха в IT-сфере не достигают. Так что думаю их мнением можно пренебречь и пойти работать в нормальные фирмы.
#402 #520831
Как корректнее писать стили? Я имею ввиду, если у меня кусок кода повторяется для разных элементов, может вынести его в отдельную кучку? Это будет компактнее, но с другой стороны, тогда будет сложно собрать из разных правил общее описание для одного элемента.

Например, у меня есть стили вида
.class1 {
height: 100px;
width: 400px;
background: linear-gradient ....... // здесь десяток строк с кроссбраузерным градиентом
}
.class2 {
height: 20px;
width: 50px;
// снова те же градиенты
}

Вынести ли в одно место общий код, или строго писать полный набор правил для каждого конкретного объекта?
#403 #520850
>>520831
Учи LESS. Переменные и миксины позволяют использовать одни и те же куски кода по много раз. Просто один раз пишешь кусок кода, а потом ставишь в стилях ссылку на этот кусок.
#404 #520853
>>520831
Я пишу как у тебя в примере. Потому что может понадобится изменить класс2, например, бэкграунд. Придет выковыривать и удалять куски кода. Лишний геморрой. А вообще да, двачну вот этого >>520850 прогрессивного гуя.
#405 #520859
>>520831
В отдельный класс вынеси, потом всем элементам его назначай и твои отдельные вдобавок.
#406 #520860
>>520850
Подробнее прочитал про ЛЕСС - параша. Нужна лишь в разработке.
Не плохо бы было юзать его в готовом проекте, вносить правки, например.
#407 #520861
>>520688
Лучше фронтенд-разработчиком/дизайнером быть, чем пхп-макакой, денег больше будет. Да и работка творческая.
#408 #520864
>>520861

>денег больше будет


Не факт, дизайнеров как собак нерезанных.
#409 #520865
>>520861
>>520864
Везде зарплата пропорциональна квалификации. И не только в айти, кстати.
#410 #520872
>>520831

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

>>520850

Не нужен, если нет задачи делать несколько почти одинаковых тем. И к тому же добавляет лишнее звено в процесс деплоя и разработки (если речь о сайте из нескольких страниц и одного css файла), замедляя их.
#411 #520875
>>520861

> фронтенд


> творческая


Что ж ты делаешь, содомит.
#412 #520947
>>519940
В общем такие дела ребят.

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

Теперь вопрос следующий. Например у меня будет большая кучка настроек. В принципе мне удобно, для каждого конкретного места проверять свою конкретную куку, и её же менять. Но зато в браузере будет иметься куча разных кукисов вида:
name: hide_user, value: yes

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

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

Просто это выглядит слишком громоздко как-то, и немного костыльно.
#413 #520961
>>520947
У тебя так получатся очень жирные куки, ОП этого не одобрит. Хочешь использовать куки, можешь пихать в неё строку-последовательность цифр, где положение в строке означает настройку, а сама цифра представляет значение этой настройки.
#414 #520976
http://ideone.com/s2juBv
Прошу помощи с опечаточником, все остальные задачи сделал, а на этой встал и не понимаю, где ошибка.
#415 #521033
>>520976
PHP Parse error: syntax error, unexpected ')', expecting ';' in /home/f6absi/prog.php on line 11
#416 #521049
ОП, я, наконец, решил задачу про лайки: http://sqlfiddle.com/#!9/5da51/1
Использовал только 2 джойна и группировку. Только не допёр, как подсчитать взаимные лайки через COUNT(), поэтому использовал SUM().
127 Кб, 570x460
#417 #521079
Решаю задачи по CSS, дошел до 10й и не совсем понимаю, что от меня требуется. https://gist.github.com/codedokode/58ebc90bd006baf4b35c#Задание-10
С картинкой все ясно, но что делать с цифрами сбоку?
#418 #521135
Интересный момент с взаимодействием стилей hover с пользовательским яваскриптом.
Суть такова: если менять стили яваскриптом напрямик, то они побеждают hover. Онклик такого яваскрипта сильнее ховера от css.
А вот если написать функцию, которая добавляет класс со стилями, то стили прописанные в ховер почему-то сильнее.

Не могу внятно выразить мысль, так что накидал небольшой пример: http://jsfiddle.net/8jx5bpt0/
Объясните, почему так происходит? И чем по-сути является срабатывание hover? Это как я понимаю намертво встроенный в браузер скрипт? Почему тогда в css нет других событий типа onclick или onmouseover?
#419 #521138
Посоны, а как живут веб программисты после 40?
#420 #521139
>>521138
Также, как и в любой другой сфере после 40. Ты либо создаешь себе "имя", либо становишься мамкиным начальником. Иначе будешь обычным хуем 40летним, как и в любой другой сфере.
Впрочем, если тебе 20-30, загадывать что будет через 10 лет - полная хуйня. Всё очень быстро меняется сейчас.
#421 #521141
>>521138
Хз, тут все в 2 раза младше.
Наверное кто шарит, становится начальником, а кто не шарит, уходит из отрасли.
>>521139
Опердил.
#422 #521142
>>520336

>> Задание №2:


>Слишком много дивов и max-width, попробуй обойтись одним.


Ещё более лучшее задание №2: http://jsfiddle.net/84v309mb/
Задание №3: http://jsfiddle.net/a98mcd5z/
Задание №4: http://jsfiddle.net/yvr7hj3j/
Задание №5: http://jsfiddle.net/2xjouzwn/
#423 #521145
Привет, ребята. Можете скинуть код кредитного калькулятора вашего с заданий? Мне задали такое же, но на другом языке, не хочу тратить время на еблю с алгоритмами просчета кредитной ставки.
Буду очень благодарен.
#424 #521150
>>520961
Серьезно? Мне надо что бы куки были после дешифровки стройным массивом, понимаешь? В массиве у меня могут быть значения как угодно выстроены. А если я буду строку использовать как куки, то надо будет её дербанить, что бы привести к общему виду. В общем понимаешь? Алсо я тут посмотрел, куки вообще получаются небольшие. Даже если я добавлю больше настроек чем пока ожидаю.

http://ideone.com/mFs0tl

Ну вот, получается строка хорошо если пол килобайта. В куки вроде бы до 4х спокойно может лежать.
#425 #521385
>>521142
Задание №6: http://jsfiddle.net/j5741y6e/
Задание №7: http://jsfiddle.net/u0rjy061/
Задание №8: http://jsfiddle.net/Lcvzv2rt/
Задание №9: http://jsfiddle.net/y38g3apr/ (до меня так и не дошло, как сделать так, чтобы текст не обтекал левый блок, а шёл отдельной колонкой)
#426 #521480
https://github.com/V3N0m21/Uppu3

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

Есть вопрос по самому файлообменнику, что там не так, что еще допиливать нужно.
#427 #521497
Очередной выпуск новостей из мира PHP (подписывайтесь, ставьте лайки итд, чтобы не оставать от новинок): http://m.habrahabr.ru/company/zfort/blog/263601/
#428 #521516
Аноны подскажите, кто дружил phpstorm с xdebug? Вроде, все делаю, как надо. Однако стоит нажать кнопку "debug", как открывается линк localhost:9000/session-там-чего-то-id=xxxxx
И ничего не происходит. Просто бесконечно открывается эта ссылка, без всяких ошибок. Слушалку дебаггера включаю, настроено по-моему все верно.Ставил xdebug на убунту с помощью apt-get install
#429 #521538
#430 #521542
>>511116

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

Не совсем понимаю как подключить его базу данных studentBackup.sql

Все файлы из github кинул в Apache25\htdocks. Установлен по инструкции Apache, PHP, Mysql, этого достаточно чтобы запустить его список студентов, или что то еще надо?
#431 #521545
И еще вопрос вдогонку, начал изучать php, двигаясь по http://archive-ipq-co.narod.ru. Для удобства прикрутил NetBeans в качестве IDE, и вот делая задания на циклы внезапно вспомнил, как в Delphi можно было поставить точку останова и пошагово прогнать выполнение программы. Очень мне помогало.

Нет ли возможности так же отлаживать программы для php? Я пробовал ставить какие то точки останова, но пошаговой трассировки так и не смог достичь.
#433 #521550
>>521547
Заработало, спасибо.
>>521516
У меня в браузере вообще ничего не происходит, все происходит в окне IDE, там можно смотреть как программа выполняется и значение переменных.

Может быть у тебя все работает, но ты не туда смотришь?
#434 #521551
>>521550
какая у тебя ось?
#435 #521552
>>521545
Юзай Chrome Netbeans Connector.
#436 #521553
>>521551
Windows.
#437 #521555
>>521550
дело в том, что я тыкаю дебаг, открывается автоматические браузер, и сторм пытается бесконечно присоединиться к сессии.
#438 #521570
>>521555
Юзай netbeans, в нем включи php - debugging - port 9000, session id netbeans-xdebug. В php.ini включи xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.remote_port=9000.
Поставь расширение xdebug helper в chrome и включи в нем в настройках интеграцию с netbeans. Все работает тогда.
#439 #521571
>>521570
но я привык к сторму
#440 #521578
>>521550

Я спросил тебя прочел ли ты документацию и разобрался ли как работает xdebug? Это не такая штука которую достаточно поставить и она работает. Она должна успешно соединиться с IDE и если у тебя например сервер в виртуалке то разумется соединиться изнутри с хостом может быть невозможно.

Напиши какая у тебя ОС, где установлен Апач и тд. Без этой информации тебе никто не поможет, телепатов тут нет.

>>521552

Нет. Юзать надо документацию в первую очередь.
#441 #521579
Аноны, вечером попробую найти время все проверить, пока много дел.

>>521542

Тут куча людей которые делают список студентов, ты про какой говоришь? Там обычно надо:

- создать базу данных
- закачать в нее дамп (например консольной командой mysql -uusername -p database_name < dump.sql , вот гайд по консоли: https://gist.github.com/codedokode/10539213 )
- найти конфиг и вписать туда свои реквизиты доступа к БД
- включить отображение ошибок в PHP, display_errors
- если используется композер (если есть файл composer.json), то установить его, открыть консоль, перейти в папку с проектом и сделать composer install
- открыть сайт в браузере и посмотреть есть ли ошибки, если есть то исправить
#442 #521584
>>520947

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

Вместо нее безопасно использовать json_decode.
#443 #521587
>>521578>

У меня все хорошо, прочитал о xdebug и сразу же все через 10 минут заработало. Проблемы у другого анончика, он как я понял на linux сидит и у него phpstrom, а не Netbeans.
#444 #521589
>>521135

Ховер это не явскрипт. Это псевдокласс CSS. При наведении мыши на элемент к нему применяются дополнительно свойства, описанные в селекторе с псевдоклассом hover.

То есть если есть стили

.element { ... }
.element:hover { .. }

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

Подробнее: http://htmlbook.ru/css/hover

:hover можно применять в сочетании с другими правилами, например:

tr:hover td .some-class { ... }

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


Потому что правила в атрибуте style имеют больший приоритет чем описанные в CSS файле. Почитай про приоритеты селекторов:

http://www.quizful.net/post/specificity-of-css-selectors
http://htmlbook.ru/samcss/kaskadirovanie
http://habrahabr.ru/post/137588/

У нас в ОП посте есть задания на HTML/CSS которые помогут тебе углубить знания по этой теме. Я бы советовал их пройти (а может и наши задачи по JS) так как вижу что у тебя тут есть непонимание.
#445 #521594
>>521049
Ещё я думаю, что если во втором джойне исключить повторяющиеся пары, то взаимные лайки можно подсчитать и через COUNT(). Правда, как это реализовать -- не знаю.
#446 #521595
>>521079

Эти цифры прописаны в атрибутах. Тебе надо как-то сделать чтобы они отображались на странице. Для этого тебе нужен «сгенерированный контент», то есть элементы которые создаются с помощью css-правил. В CSS для этого есть псевдоэлементы, например ::before и ::after

http://habrahabr.ru/post/154319/
http://htmlbook.ru/css3/after
http://htmlbook.ru/css3/before
http://css.yoksel.ru/content/ (эта статья подробно описывает что можно вписать в свойство content)

Помни что у псевдоэлементов есть подвохи:

- они не выделяются и не копируются в буфер обмена в некоторых браузерах
- они могут не читаться программами чтения текста
- их нету у одиночных элементов вроде img, input
#447 #521602
>>521049

> AND l2.userLiked = l1.userLiker


А это нужно? Там ведь стоят условия джойна:

> ON u.id = l1.userLiker


> ON u.id = l2.userLiked



которые делают то же самое.

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

А еще, ты хочешь получше SQL изучить? У меня есть задачка про борду (кстати хорошая задача для собеседоваия — жаль что таких не дают, она 99.9% кандидатов отсеивает):

- сделай базу для анонимного форума, форум состоит из тредов, треды из постов, пост состоит из id, даты и текста. Сделай вывод первых N тредов, каждый тред выводится как ОП пост + 3 последних поста если они есть. Сначала надо решить задачу на идельной нормализованной базе (запрос получается адски сложный), потом предложить способы денормализации (хранения избыточных данных) чтобы максимально упростить запрос, избавиться от кучи джойнов и заставить его использовать индексы.
#448 #521605
>>514869
Пиханы, хелп.

Пытаюсь заставить загрузчик загружать помимо трёх типов картинок ещё и видео тип webm, но при попытке загрузки выскакивает ошибка "Не удалось прочитать размер файла"..
В чём трабла?
<?php
// Менеджер загрузок
if (isset($_FILES['file'])) {
if ($_FILES['file']['name'] != "") {
validateFileUpload();
if (!is_file($_FILES['file']['tmp_name']) || !is_readable($_FILES['file']['tmp_name'])) {
fancyDie("Файл не передался. Повторите попытку.");
}
$post['file_original'] = substr(htmlentities($_FILES['file']['name'], ENT_QUOTES), 0, 50);
$post['file_hex'] = md5_file($_FILES['file']['tmp_name']);
$post['file_size'] = $_FILES['file']['size'];
$post['file_size_formatted'] = convertBytes($post['file_size']);
$file_type = strtolower(preg_replace('/.*(\..+)/', '\1', $_FILES['file']['name']));
if ($file_type == '.jpeg') { $file_type = '.jpg'; }
$file_name = time() . mt_rand(1, 99);
$post['thumb'] = $file_name . "s" . $file_type;
$post['file'] = $file_name . $file_type;
$thumb_location = "db/" . $post['thumb'];
$file_location = "db/" . $post['file'];
if (!($file_type == '.jpg' || $file_type == '.gif' || $file_type == '.png' || $file_type == '.webm')) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
if (!@getimagesize($_FILES['file']['tmp_name'])) {
fancyDie("Не удалось прочитать размер файла. Повторите попытку.");
}
$file_info = getimagesize($_FILES['file']['tmp_name']);
$file_mime = $file_info['mime'];
if (!($file_mime == "image/jpeg" || $file_mime == "image/gif" || $file_mime == "image/png"|| $file_mime == "video/webm")) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
checkDuplicateImage($post['file_hex']);
if (!move_uploaded_file($_FILES['file']['tmp_name'], $file_location)) {
fancyDie("Не удалось сохранить загруженный файл.");
}
if ($_FILES['file']['size'] != filesize($file_location)) {
fancyDie("Файл не загружен. Вернитесь и попробуйте снова.");
}
$post['image_width'] = $file_info[0]; $post['image_height'] = $file_info[1];
list($thumb_maxwidth, $thumb_maxheight) = thumbnailDimensions(
$post['image_width'], $post['image_height'], $post['parent'] != '0'
);
if (!createThumbnail($file_location, $thumb_location, $thumb_maxwidth, $thumb_maxheight)) {
fancyDie("Could not create thumbnail.");
}
$thumb_info = getimagesize($thumb_location);
$post['thumb_width'] = $thumb_info[0]; $post['thumb_height'] = $thumb_info[1];
}
}
if (!CLAIRE_TEXTMODE) {
if ($post['file'] == '') {
// No file uploaded
if ($post['parent'] == '0') {
fancyDie("Для создания треда нужно прикрепить картинку.");}}}
if (str_replace('<br>', '', $post['message']) == "") {
fancyDie("Вы не ввели сообщение поста.");
}
$post['id'] = insertPost($post);
$redirect = '?do=thread&id=' . ($post['parent']=='0' ? $post['id'] : $post['parent']) . '#'. $post['id'];
trimThreads();
if ($post['parent'] != '0' && $bump) bumpThreadByID($post['parent']);
}
?>
#448 #521605
>>514869
Пиханы, хелп.

Пытаюсь заставить загрузчик загружать помимо трёх типов картинок ещё и видео тип webm, но при попытке загрузки выскакивает ошибка "Не удалось прочитать размер файла"..
В чём трабла?
<?php
// Менеджер загрузок
if (isset($_FILES['file'])) {
if ($_FILES['file']['name'] != "") {
validateFileUpload();
if (!is_file($_FILES['file']['tmp_name']) || !is_readable($_FILES['file']['tmp_name'])) {
fancyDie("Файл не передался. Повторите попытку.");
}
$post['file_original'] = substr(htmlentities($_FILES['file']['name'], ENT_QUOTES), 0, 50);
$post['file_hex'] = md5_file($_FILES['file']['tmp_name']);
$post['file_size'] = $_FILES['file']['size'];
$post['file_size_formatted'] = convertBytes($post['file_size']);
$file_type = strtolower(preg_replace('/.*(\..+)/', '\1', $_FILES['file']['name']));
if ($file_type == '.jpeg') { $file_type = '.jpg'; }
$file_name = time() . mt_rand(1, 99);
$post['thumb'] = $file_name . "s" . $file_type;
$post['file'] = $file_name . $file_type;
$thumb_location = "db/" . $post['thumb'];
$file_location = "db/" . $post['file'];
if (!($file_type == '.jpg' || $file_type == '.gif' || $file_type == '.png' || $file_type == '.webm')) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
if (!@getimagesize($_FILES['file']['tmp_name'])) {
fancyDie("Не удалось прочитать размер файла. Повторите попытку.");
}
$file_info = getimagesize($_FILES['file']['tmp_name']);
$file_mime = $file_info['mime'];
if (!($file_mime == "image/jpeg" || $file_mime == "image/gif" || $file_mime == "image/png"|| $file_mime == "video/webm")) {
fancyDie("Допустимые форматы: GIF, JPG, PNG, WEBM.");
}
checkDuplicateImage($post['file_hex']);
if (!move_uploaded_file($_FILES['file']['tmp_name'], $file_location)) {
fancyDie("Не удалось сохранить загруженный файл.");
}
if ($_FILES['file']['size'] != filesize($file_location)) {
fancyDie("Файл не загружен. Вернитесь и попробуйте снова.");
}
$post['image_width'] = $file_info[0]; $post['image_height'] = $file_info[1];
list($thumb_maxwidth, $thumb_maxheight) = thumbnailDimensions(
$post['image_width'], $post['image_height'], $post['parent'] != '0'
);
if (!createThumbnail($file_location, $thumb_location, $thumb_maxwidth, $thumb_maxheight)) {
fancyDie("Could not create thumbnail.");
}
$thumb_info = getimagesize($thumb_location);
$post['thumb_width'] = $thumb_info[0]; $post['thumb_height'] = $thumb_info[1];
}
}
if (!CLAIRE_TEXTMODE) {
if ($post['file'] == '') {
// No file uploaded
if ($post['parent'] == '0') {
fancyDie("Для создания треда нужно прикрепить картинку.");}}}
if (str_replace('<br>', '', $post['message']) == "") {
fancyDie("Вы не ввели сообщение поста.");
}
$post['id'] = insertPost($post);
$redirect = '?do=thread&id=' . ($post['parent']=='0' ? $post['id'] : $post['parent']) . '#'. $post['id'];
trimThreads();
if ($post['parent'] != '0' && $bump) bumpThreadByID($post['parent']);
}
?>
#449 #521606
Добрый вечер, намного ли сложнее написать инет-магазин по сравнению с сайтом абитуриентов из задания ОПа? Стоит ли делать это с нуля или воспользоваться wordpress или другими cms?
#450 #521607
>>521594

> взаимные лайки можно подсчитать и через COUNT()


Это вряд ли, так как джойн делает полное декартово произведение. То есть если юзер поставил лайки a, b, c и получил от a, d, e то мы получаем все возможные их комбинации при джойне:

a a
a d
a e
b a
b d
b e
c a
c d
c e

Взаимный лайк тут (a a) и считать их удобнее через SUM.

Не могу не похвалить себя, какую я хорошую и развивающую задачу придумал. Простая, а так просто не решишь.
#451 #521614
>>521605

А ты скопировал код или написал сам? Если скопировал то вопросы лучше задавать его автору.

>>521606

Хороший — намного сложнее, сам подумай, у нас одна таблица и одна форма, а в хорошем магазине пара десятков таблиц и сложная админка. Объем работы намного больше (хотя знания полученные в ходе решения задачи и помогут в написании магазина. но магазин лучше писать на фреймворке вроде Yii или Symfony 2). Лучше не писать его с нуля, а взять любую готовую CMS коих десятки.
#452 #521616
>>521602

>А еще, ты хочешь получше SQL изучить? У меня есть задачка про борду (кстати хорошая задача для собеседоваия — жаль что таких не дают, она 99.9% кандидатов отсеивает):


Конечно хочу. Попробую решить, параллельно допиливая абитуриентов.
#453 #521617
>>521614

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


Посоветуй если можешь, если бы ты создавал инет-магазин какой cms выбрал бы?
#454 #521618
>>521614

>А ты скопировал код или написал сам? Если скопировал то вопросы лучше задавать его автору.


Ну с автором никак не связаться, да и это загрузчик от тиниборды, вроде, но оптимизированный.
#455 #521622
>>521617

В мое время была модной Simpla (платная) — у нее админка красивая. Но вообще у меня опыта в создании ИМ нет, я не знаю например какие фичи нужны заказчикам и насколько их сложно/легко допиливать. На западе популярна Magento, которую по моему в Украине делают, Opencart (по моему это плагин к Друпалу, если так то представляю какой там код).

потому дам ссылки на рейтинги CMS — читай обзоры, смотри демоверсии, выбирай:

http://www.cmsmagazine.ru/catalogue/
http://www.ratingruneta.ru/cms/

>>521618

Тогда попробуй разобрать код построчно, например ты пишешь, что выводится ошибка. Посмотри в каком случае она выводится, почему, что к этому приводит. Наставь echo и var_dump чтобы увидеть что в переменных, может там что-то не то.
#456 #521630
>>521587
да, у меня phpstorm. проблему решил. я какого-то хрена создал run/debug configuration web application еще давно, и через него как раз скрипт пытался открыться в браузере. как только удалил нафиг все конфигурации - заработало. спасибо, чем-то ты даже натолкнул меня на мысль, упомянув, что у тебя браузер не открывается а дебажится все в консольке
#457 #521631
>>521578
>>521630
спасибо, ребята. вы очень помогли, сирсли
#458 #521639
>>521497
У нас теперь есть строгая типизация, как во взрослых языках? Ну почти.
sage #459 #521653
Парни, подскажите. Что за 'data' возвращает функция, не могу понять. В массиве, который получается, такого сочитания симвлов нету.

print_r($lol = arr());

function Arr(){
тут получение данных типа array
return $retval['data'];
}
Запуск скрипта при авторизации Патя #460 #521668
Всем прива!
Есть скрипт /admin/index.php
В нем форма авторизации. Если пользователь авторизировался, то инклудится /admin/vasya/admin.php
Суть вопроса: как заставить скрипт /admin/vasya/admin.php, не работать, при переходе по прямой ссылке на него?
#461 #521670
>>521668
НАЧААААЛЬНИК
#462 #521675
>>521668
Никак.
#463 #521677
>>521668
Можно сделать vasya длинным и рандомным, как пароль
#464 #521679
>>521668
$_SERVER['HTTP_REFERER']
#465 #521682
>>521668
В .htaccess в папке /admin/vasya добавить:
AuthType Basic
AuthName "restricted area"
AuthUserFile ./.htpasswd
require valid-user

В .htpasswd написать логин и пароль в такой форме vasya:dGRkPurkuWmW2
Аноним #466 #521684
>>521682
Благодарю!
5 Кб, 418x107
#467 #521690
Что почитать чтобы решить задачу 11 по CSS? Гугл перерыл, но так и не нашел как изменять форму радиокнопки.
Я еще новичок а в задаче такие требования будто я уже специалист и размяться зашел.
https://gist.github.com/codedokode/58ebc90bd006baf4b35c#Задание-11
#468 #521723
>>521690

Там есть подсказки, читал?

> подсказка: http://habrahabr.ru/post/154719/


> подсказка: http://habrahabr.ru/post/105267/



Ты не можешь изменить форму радиокнопки но ты можешь ее поместить внутрь label и скрыть, и менять вид дива или спана рядом с ней.
#469 #521724
>>521690

Гуглить если что, надо по словам «кастомизация радиокнопок css3»
#470 #521727
>>521584
Поясни пожалуйста глубже мне эту уязвимость? Я вижу максимум эррор, при попытке подсунуть в куку какой-нибудь бред.
#471 #521740
>>521727

Прочитай замечание в мануале для начала: http://php.net/manual/ru/function.unserialize.php

Далее можешь почитать статьи из гугла http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=php+unserialize+vuln
#472 #521819
$result=mysqli_query($connect, "SELECT FROM articlesmain WHERE id=7");
$data = mysqli_fetch_array($result);
do {

$title7=$data['title'];
$description7=$data['description'];
}

while($data = mysqli_fetch_array($result));

$result=mysqli_query($connect, "SELECT
FROM articlesmain WHERE id=8");
$data = mysqli_fetch_array($result);
do {

$title8=$data['title'];
$description8=$data['description'];
}

while($data = mysqli_fetch_array($result));

$parse->set_tpl('{TITLE6}',$title6); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION6}',$description6);

$parse->set_tpl('{TITLE7}',$title7); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION7}',$description7);

$parse->set_tpl('{TITLE8}',$title8); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION8}',$description8);

$parse->tpl_parse(); //Парсим

Господа, как это можно автоматизировать? Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать, поэтому просто %s не подходит. Пробовал for, но выводит только последнюю строку.
#472 #521819
$result=mysqli_query($connect, "SELECT FROM articlesmain WHERE id=7");
$data = mysqli_fetch_array($result);
do {

$title7=$data['title'];
$description7=$data['description'];
}

while($data = mysqli_fetch_array($result));

$result=mysqli_query($connect, "SELECT
FROM articlesmain WHERE id=8");
$data = mysqli_fetch_array($result);
do {

$title8=$data['title'];
$description8=$data['description'];
}

while($data = mysqli_fetch_array($result));

$parse->set_tpl('{TITLE6}',$title6); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION6}',$description6);

$parse->set_tpl('{TITLE7}',$title7); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION7}',$description7);

$parse->set_tpl('{TITLE8}',$title8); //Установка переменной {TITLE}
$parse->set_tpl('{DESCRIPTION8}',$description8);

$parse->tpl_parse(); //Парсим

Господа, как это можно автоматизировать? Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать, поэтому просто %s не подходит. Пробовал for, но выводит только последнюю строку.
#473 #521823
Есть ли на свете что-то более зашкварное и бесполезное, чем фронтенд и js-фреймворки? риторический вопрос.
#474 #521852
>>521823
а в чем бесполезность? можно ведь обернуть в обертку и создать мобильное приложение
#475 #521853
>>521823
Без них ты будешь javascript и css писать вручную, выйдет по объему сильно больше, читается хуже. Разбираться через год тебе будет в коде, написанном под фреймворк проще.
#476 #521945
Аноны, что со мной за хуйня. Вот решаю задачки ОПа и постепенно дошел до больших задачек и вот есть задание, а у меня мышление как будто очень узкое и я просто не могу представить как буду его решать, вроде все выучил до этого и багаж знаний есть, но вот когда доходит до задачки, то я просто втыкаю в задание и блять даже план решения составить не могу как его решать.

Мне не надо освоить язык программирования?
#477 #521946
>>521945

>дополню



А вот всякий раз когда мне показывают готовое решения, то у меня появляется мысль " Почему я так не додумался, это же так просто"
#478 #521947
>>521945

>быстрофикс


>мне не надо


мне не дано*
#479 #521951
>>521947

>мне не дано


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

>вроде все выучил до этого и багаж знаний есть


Не делай так больше.
12 Кб, 679x213
#480 #521957
Вот такой код, чомуто не работает(это упрощенный вариант, это задание от специалиста, я делал эту лабу раньше и все работало):
<?
define('PATH_LOG', 'path.log');
$dt = time();
$page = $_SERVER['REQUEST_URI'];
$ref = pathinfo($_SERVER['HTTP_REFERER'], PATHINFO_BASENAME);
$path = "$dt|$page|$ref\n";
$handle = fopen('log/' . PATH_LOG, "a+") or die("Не могу открыть файл!");
fputs($handle, $path);
fclose($handle);
Выдает:
Warning: fopen(log/path.log): failed to open stream: No such file or directory in C:\Users\Public\OpenServer\OpenServer\domains\mysite2.local\inc\log.inc.php on line 6
Попробовал создать в директории папку через mkdir, все окей, тобишь с правами все в порядке. Нехуя не понимаю тогда.
#481 #521958
>>521957
ну, то есть этот код в index.php и должен если папки log и файла path.log нет, сам их создать.
#482 #521982
Претендую на платину, вопрос следует добавить в шапку. Понятное дело, что это сугубо индивидуально, но сколько обычно проходит времени от начала изучения до работы джуном / возможности иметь копейку с фриланса? Допустим, если уделять по 4-5 часов в день изучению языка.
#484 #522001
Где можно найти API для яндекс каталога, мне нужно отобрать определённые сайты которые есть в яндекс каталоге, можно конечно попробовать сделать это через http запросы и при помощи дальнейшего парсинга, ну это как-то не очень, наверняка у него есть АПИ подскажите где найти?
#485 #522024
Исходники крупнейшего российского фриланс-сайта fl.ru: https://github.com/veryEvilMan/fl-ru-damp

Пост: http://m.habrahabr.ru/post/263703/

Изучайте, пока не прикрыли, если кому любопытно. Хотя это скорее сборник антипаттернов, как писать не надо (такой большой проект сделан в виде кучи процедурной лапши).
#486 #522026
>>522024
Оп, а почему ты все время постишь ссылку на m.habrhabr.ru? Не удобно этот вырвиглаз с пэка читать.
#487 #522027
>>521945

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

>>521957

Папка не создается автоматически, только сам файл. Если папки log нет то будет ошибка.

>>521958

Нет, создается только файл а не папка.

>>522001

Если тут https://tech.yandex.ru/ нет то значит нет.
#488 #522029
>>522026

Я привык читать мобильную версию так как на ней меньше лишнего и нет этих дурацких блоков ссылок сбоку и дурацкой панели слева. Но ты прав, у других людей могут быть другие предпочтения, наверно лучше постить обычную ссылку.
#489 #522043
Алсо, на российских сайтах этого нет, но на Hacker News уже целый день висит новость о том что андроид взламывается через отправку MMS (взлом происходит при попытке телефона проиндексировать видеофайл без участия пользователя). Честно говоря, я всерьез подумываю, не стоит ли вместе со смартфоном покупать отдельную симку, ведь к номеру могут быть привязаны электронные кошельки, банковские карты. Тот же сбербанк по моему по умолчанию позволяет завладев телефоном, выводить деньги. В сочетании с удаленным выполнением кода это позволяет просто грабить всех подряд. Это просто неправильно, такого быть не должно, ведь в этом случае если вы потеряли (или у вас отобрали телефон, или перевыпустили сим карту, или вы установили троян), вы можете еще и денег лишиться.

Статья: https://news.ycombinator.com/item?id=9954686
http://www.npr.org/sections/alltechconsidered/2015/07/27/426613020/major-flaw-in-android-phones-would-let-hackers-in-with-just-a-text
#490 #522059
>>522024
Меня так в 2004 учили писать. Неудивительно, что уволился через 6 месяцев.
#491 #522062
>>522059

Там правда классы есть, только как-то очень беспорядочно накиданы: https://github.com/veryEvilMan/fl-ru-damp/tree/master/classes
#492 #522067
Вот хороший пример где надо использовать классы вместо массивов: https://github.com/veryEvilMan/fl-ru-damp/blob/master/classes/seo.php#L308

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

Еще и переменную назвали бессмысленно: $info.

Кстати, те, аноны, кто учатся в нашем треде и делают задание на студентов, используют именно ООП-подход, как в лучших домах фреймворках.
#493 #522068
>>522067

Ну и дополню, в случае использования ORM библиотеки Doctrine 2 им бы не пришлось вообще писать функци и insert/update — доктрина предоставляет готовые функции для этого.
#494 #522074
>>522068
ОП, а в больших проектах используют вообще фреймворки и всякие ОРМ библиотеки, или все с нуля пишется для оптимизации под себя и все такое?
#495 #522075
>>522068
Говорят, что ORM не дружат с высокими нагрузками.
#496 #522081
>>522074

Большой проект не всегда значит highload, а значит большой по объему. Потому использование фреймворка как правило оправданно. Ну вот возьмем тот же сайт фриланс.ру. Можно ли считать его высоконагруженным? Я считаю, что не очень.

Если погуглить, то мы видим такие данные: https://roem.ru/29-03-2013/117912/molodye-frilans-birji-upustili-shans-vo-vremya-krizisa-free-lanceru/

Там 76 000 человек в день (в 2013 году), допустим сейчас их стало 150 000, допустим каждый в среднем просматривает 20 страниц, тогда это выходит около 3 млн запросов в день. Один сервер такое может и потянуть, наверно у них их несколько, но это еще не такая посещаемость, когда тебе приходится шардить базу (ну и судя по их коду шардинга у них нет).

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

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

Потому начинать все же стоит с фреймворка. Просто надо разобраться какие там есть возможности для оптимизации кода, в той же доктрине их немало.
#497 #522082
>>522075

Хотелось бы вместо разговоров увидеть тесты. Кто-нибудь хочет потестировать доктрину в сравнении с чистыми запросами?
#498 #522090
>>521852
в не функциональности. сам по суди, человеку нужен сайт для продажи товара, что он выберет уродливый и криво сверстанный сайт с админкой, каталогом и бд или красивенький чисто информационный лэндинг со стразиками? конечно первое.
#499 #522093
>>522024
фл.ру еще та параша. прям глаза открыл тоже мне.
#500 #522095
>>522024
Без випов на заказ даже заявку не подать, випы для ньюфани грабительские, личку с заказчиками прикрыли. на фл.ру происходит полный беспредел. может собраться и норм биржу сделать?
#501 #522096
>>522095

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

В принципе платить за размещение или получение заказа нормально. Но вот платить за возможность может быть получить, а может не получить заказ — это нехорошо.
83 Кб, 394x500
#502 #522097

>class LoginController extends CController


>CC

#503 #522098
>>522096
Брать процент от сделки, очевидно.
#504 #522099
>>514869
День добрый, есть ли что-то подобное learn.javascript.ru по CSS или HTML, с чего начать, умею только в питон немного, но это пока что хобби, хочу начать фрилансить, яваскрипт, думаю, быстро освою, а вот вёрстка это же не программирование, поэтому реквестирую что-то, что поможет мне поднять знания подставове.
#505 #522103
>>522098

Как ты узнаешь реальную сумму сделки? И исполнитель, и заказчик будут ее занижать.

>>522099

В ОП посте есть задачки на HTML/CSS, как насчет них? Там есть ссылки на туториалы и гайды.
#506 #522104
>>522067

>ООП-подход


ага и MVC, в которые я до сих пор не могу въехать.
#507 #522108
>>522104

MVC заключается в том что мы не смешиваем все в кучу, а разбиваем на 3 части. Контроллер зарашивает данные у модели и передает их вью для вывода. Попробуй написать код задачи про студентов и посмотрим его насколько он соответствует MVC.
#508 #522109
>>522103
Ага, увидел, не открывал эту ссылку ибо написано "задачки", а на самом деле там много другой инфы, помимо самих задачек. Спасибо.
#509 #522119
>>522096
Все нормальные биржи берут процент с выполненных заказов с заказчика - этим и зарабатывают.
#510 #522121
>>522103
а оплата же через биржу начисляется.
#511 #522131
>>522108
я это понимаю, хоть ты и повторяешь как попугай одно и то же, я не понимаю принцип ООП в МВК, пальчиками перепечатать пример, чтобы работало я могу, а вот изменения или правка мне не даются, ибо не понимаю принципа.
#512 #522141
>>522131

Пиши с нуля, а не перепечатывай примеры. Напиши напрмер 20 строчек для задачи про студентов и спроси, все ли верно и как сделать лучше.
#513 #522147
>>522103
А зачем знать сумму сделки? Тот же moneybookers берет за вывод на карту и перевод 3 доллара 85 центов, с этого и живет.

Понятное дело у биржи фрилансеров транзакций будет меньше чем у платежной системы, ну так можно брать за 1 сделку больше.
#514 #522168
>>521982
Года 2-3.
#515 #522177
>>522043
Хех, всегда знал, что идея привязки аутентификации на сайтах к сотовому говно. Теперь это начало подтверждаться.
#516 #522216
>>521982
я уже год изучаю, не работал ни разу.
#517 #522217
>>522141
Если я с нуля напишу, то это уже будет не совсем МВК и ООП. Вот я сейчас так свой проект пишу, пока что даже не знаю, как через шаблон добавлять новые статьи и осуществить пагинацию, сделал вывод 8 статей на странице и усе. потом покажу.
#518 #522220
>>522216
А что умеешь? И пробовал ли найти работу?
#519 #522225
>>521982
Я устроился джуном на внезапно ПИТОН через 3 недели после прохождения кодеакадеми. Увидел вакансию со стажировочкой и обучением, прислали задание калькулятор кредитов на sinatra, потратил пару вечерков на изучение синатры, написал калькулятор, отправил вместе с резюме.

2 месяца практики, потом взяли джуном. ДС 40к зарплата
#520 #522227
>>522225
Блядь, на руби. Фикс. Просто питонотред читал, совсем мозги скомкались, пойду пожру.
#521 #522235
>>522220
Пробовал удаленно - одни отказы, уже не пробую. Простой сайт с админкой и бд могу написать, что там еще можно уметь? фреймворки еще не учил.
#522 #522240
>>522235
А задания из ОП-поста делал? Студенты и файлообменник.
#523 #522245
>>522240
Еще нет, но я не думаю, что они сложные. Любая инфа гуглится в два счета.
#524 #522281
>>522245
а что же ты целый год учишь то?
#525 #522286
>>522281
Пол-года учил верстку и фронтенд, потом напейсал свою мини-борду, ща новостной сайт делаю, плюс копирайтю и фильмы смотрю, а шо?
#526 #522287
Поясните, почему у меня не качается 1С битрикс бесплатная версия которая. Ставлю на закачку, проходит час, два - 1%.
#527 #522317
>>522287
Юзай нормальную CMS же, а не эту поделку.
#528 #522370
Когда мне нужно сделать связь между таблицами в базе данных, то есть ввести внешний ключ, я всегда делаю это не явно, то есть не пишу команду Foreign key при создании базы данных, а просто завожу поле где будет хранится нужный мне ключ и потом использую его когда мне надо в каком-либо запросе.

1. Так делать не стоит?

2. Сейчас начал учить YII там так не прокатит?
#529 #522385
>>522370

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

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

Ссылка http://denis.in.ua/foreign-keys-in-mysql.htm

2) Смотри пункт 1
#530 #522386
>>521480
https://github.com/V3N0m21/Uppu3

Доделал чтоб форма ответа открывалась под комментом, пол дня голову ломал чтоб понять как это правильно сделать. Пока что выглядит не оче, но потом дизайн допилю.
ОП, посмотри что у меня там вообще и что нужно переделать
#531 #522424
>>522317
но многие требуют знание этой хрени.
#532 #522425
что если вместо внешних ключей исползовать join by id?
2 Кб, 292x140
#533 #522427
\t\tinput[type="radio"] {
\tdisplay:none;
}

Пытаюсь скрыть радиокнопку но этот ксс не помогает, в чем причина?
#534 #522428
>>522427
input[type="radio"] {
display:none;
}
#535 #522430
Вкатываюсь к вам.

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

Задание номер 10:

https://jsfiddle.net/zn8w7yo3/

На форматировании внимания не акцентировал, так как заелся с висящими примечаниями, конкретно с их правильным позиционированием. Повторить вроде удалось, но решение очень хрупкое, изменения ширины не выдержит. Что я делаю не так?
#536 #522510
ОП, ServiceManager в Zend Framework 2 это Registry паттерн или Service Locator?
#537 #522511
>>522510

В доке http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.intro.html на первой строчке написано:

> The Service Locator design pattern is implemented by the ServiceManager

#538 #522512
>>522510

Registry это более примитивная штука, которая только отдает то что в нее положено и как правило делается статически:

Registry::set('x', new X());
$x = Regsitry::get('x');

А ServiceLocator умеет создавать или доставать объекты-сервисы по заранее настроенным правилам.
#539 #522514
>>522511
О, спасибо, не видел. А чому там не Dependency Injection? Программеры у Zenda не осилили, или там в этом качестве только Service Locator подходит?
#540 #522516
>>522514

DI там ты делаешь ручками в фабрике или коллбеке. Вот еще есть на русском статья: http://habrahabr.ru/post/241471/

Мне что-то не особо нравится, как-то они перемудрили по моему, посмотри лучше как в Symfony DI Container сделан если хочешь хороший пример (его можно использовать и отдельно от самой симфони).

Хотя DI в ZF вроде бы тоже есть: http://framework.zend.com/manual/2.3/en/modules/zend.di.introduction.html
#541 #522518
>>522516
Все, понял. В Zend\DI выходит не сам DI (его ручками пишут для всех нужных классов), а какой-то умный DI Container, который в код смотрит, все DI находит и сам где надо классы инициализирует и injection делает.
#542 #522702
Как сделать так, чтобы после нажатия на див, он поменял свой цвет?
Пытаюсь сделать из дива кнопку.
#543 #522707
>>522702
Так ты сделай чекбокс или радио с лейблом. Задачку >>522427 не решал что-ли из учебника ОПа?
#544 #522713
>>522707
Вот как раз и решаю. Сделал радиокнопку с лейблом. Уже все работает кроме того, что див не меняется после нажатия на него. При наведении и клипе сделал изменения.
#545 #522717
>>522713
Ну во первых надо проверить, нажимаются ли у тебя кнопки. Если у тебя стоит дисплей:нон, поставь отображение кнопок и посмотри нажимаются ли они. Если да, то остается дело за малым, добавить нужное свойство селектору с псевдоклассом :checked
38 Кб, 550x277
#546 #522722
>>522717
Да, работает. нон с дисплея кнопок убрал. Вот как все выглядит.
:checked на что вешать? На див? Если на него, то у меня не работает. Если на радиокнопку то работает, но вокруг кнопки а не дива и если дисплей нон на кнопку вернуть то ничего не видно.
#547 #522726
>>522722
Но ведь работает же, судя по картинке. Скинь код на jsfidle.
#548 #522729
>>522726
Работает, но если кнопки убрать, то непонятно, что выбрано.
#549 #522731
>>522729
http://jsfiddle.net/ скинь код, я что-то не могу понять, что там у тебя.
#550 #522738
>>522731
http://jsfiddle.net/tc80cwco/
В первый раз воспользовался этим сайтом, затупил немножко.
#551 #522739
Хотя я понял, ты же вешаешь checked на сам див, это не будет работать. Псевдокласс :checked работает только с инпутами, ты ведь не можешь нажать на див. Тебе нужно поставить такой селектор, который бы связывал нажатую кнопку и сопутствующий ей див (или лэйбл).
Кури "селекторы и их комбинации": http://htmlbook.ru/css
#552 #522744
>>522738
Твоя задача легко решается, но только если инпут поставить перед дивом и поставить правильный селектор, связав input:checked и div.
#553 #522748
>>522744
Спасибо, решил. Вот только не понял пока почему не сработало то же самое, но в обратном порядке.
#554 #522751
>>522748
Потому-что селектор + применяет правила ко второму элементу, а не первому. То есть в div + input правило будет применяться к input, а не див, значит если мы хотим, чтобы правило применялось к диву, нужно сперва, чтобы див шел после инпута в хтмл коде, а потом нужно сделать селектор iput+div
#555 #522752
>>522751
Все понятно стало, спасибо.
#556 #522759
>>522702

Либо засунуть в нее чекбокс + css3 либо яваскриптом при клике делать toggleClass (добавлять/убирать CSS класс).

>>522722

> :checked на что вешать? На див?


:checked относится только к радиокнопкам и чебоксам. Ты пробовал посмотреть его описание например тут: http://htmlbook.ru/css/checked ? Там в самом начале написано:

> Псевдокласс :checked применяется к элементам интерфейса, таким как переключатели (checkbox) и флажки (radio), когда они находятся в положение «включено».



Также, ты читал внимательно статьи на которые тебе я давал ссылки? В CSS есть такие селекторы как + и ~ (поддерживается в меньшем числе браузеров). Изучи эти селекторы.

Соответственно идея примерно такая, делаем такое дерево DOM:

div.switch
....label // чтобы ловить клики по всей области кнопки
........input type=radio // сам инпут
........span.switch-body // сама кнопка, которая содержит текст и меняет цвет

После чего остается лишь написать правило вроде

.switch input:checked + .switch-body { выделить нажатую кнопку цветом }

Я вижу что у тебя явно не хватает знаний про селекторы CSS и про псевдоклассы. Изучай:

http://htmlbook.ru/css/cat/pseudoclass
http://htmlbook.ru/metki/selektory
http://htmlbook.ru/samcss/sosednie-selektory
https://learn.javascript.ru/css-selectors

Ну и сразу же предупрежу что не надо злоупотреблять сложными селекторами. 99% правил в твоем CSS должны состоять из одного-двух-трех классов разделенных пробелом или > .
#556 #522759
>>522702

Либо засунуть в нее чекбокс + css3 либо яваскриптом при клике делать toggleClass (добавлять/убирать CSS класс).

>>522722

> :checked на что вешать? На див?


:checked относится только к радиокнопкам и чебоксам. Ты пробовал посмотреть его описание например тут: http://htmlbook.ru/css/checked ? Там в самом начале написано:

> Псевдокласс :checked применяется к элементам интерфейса, таким как переключатели (checkbox) и флажки (radio), когда они находятся в положение «включено».



Также, ты читал внимательно статьи на которые тебе я давал ссылки? В CSS есть такие селекторы как + и ~ (поддерживается в меньшем числе браузеров). Изучи эти селекторы.

Соответственно идея примерно такая, делаем такое дерево DOM:

div.switch
....label // чтобы ловить клики по всей области кнопки
........input type=radio // сам инпут
........span.switch-body // сама кнопка, которая содержит текст и меняет цвет

После чего остается лишь написать правило вроде

.switch input:checked + .switch-body { выделить нажатую кнопку цветом }

Я вижу что у тебя явно не хватает знаний про селекторы CSS и про псевдоклассы. Изучай:

http://htmlbook.ru/css/cat/pseudoclass
http://htmlbook.ru/metki/selektory
http://htmlbook.ru/samcss/sosednie-selektory
https://learn.javascript.ru/css-selectors

Ну и сразу же предупрежу что не надо злоупотреблять сложными селекторами. 99% правил в твоем CSS должны состоять из одного-двух-трех классов разделенных пробелом или > .
#557 #522764
>>522738

Надо сделать нормальные имена классов, k и lk разумеется годятся для проверки но как решение не годятся. Имена лучше всего делать вида «блок-элемент», например:

.switch
.switch-body
.button-selector
.button-selector-label

В таком стиле.
#558 #522779
>>522722

Кстати судя по http://www.quirksmode.org/css/selectors/ селектор ~ поддерживается начиная с ИЕ7, раз так, твой код должен работать в максимально большом числе браузеров.
#559 #522786
Те из вас кто решает наши задания и внимательно читает все примечания и ссылки, наверняка прочли мой урок про CSRF (отправка формы с одного домена на другой): https://github.com/codedokode/pasta/blob/master/security/xsrf.md

Так написано что в банках такое (обычно) не работает.

А вот новые сервисы, работающие с биткойнами, пока видимо ни про CSRF ни про смс-подтверждение не в курсе и в них эту уязвимость можно применить: https://news.ycombinator.com/item?id=9966123

Всегда защищайте ваши формы CSRF токенами. ну и читайте внимательно наши уроки.
#560 #522788
Аноны, там много непроверенных задач, постараюсь сегодня проверить. Не ждите меня, решайте дальше.
#561 #522905
Как узнать, какие варианты написания значения могут быть у поля для загрузки файлов?
У меня даже на убунту выдает почему-то "C:\fakepath\filename". Эта строка всегда такого вида вне зависимости от ос и браузера?

Подскажите, где смотреть такие моменты. Научите гуглить, короче.
Вот перешел на сайт w3.org, там в поиске вбил input file.
Попадаю на страницу http://www.w3.org/TR/html-markup/input.file.html
Так, тут есть раздел DOM Interface, и ссылка на http://www.w3.org/TR/2012/WD-html5-20121025/common-input-element-apis.html#dom-input-value
Нет, про value здесь говорится только в общих чертах. Но чуть ниже о свойстве filename (хотя я вообще-то всегда обращался для получения этой строки через "value", это неправильно?)

>On getting, it must return the string "C:\fakepath\" followed by the filename of the first file in the list of selected files, if any, or the empty string if the list is empty.


>Note: This "fakepath" requirement is a sad accident of history. See the example in the File Upload state section for more information.


По ссылке

>For historical reasons, the value IDL attribute prefixes the filename with the string "C:\fakepath\". Some legacy user agents actually included the full path (which was a security vulnerability). As a result of this, obtaining the filename from the value IDL attribute in a backwards-compatible way is non-trivial. The following function extracts the filename in a suitably compatible manner:


дают какую-то свою универсальную функцию

В целом почти сам разобрался. На всякий случай уточню, правильно ли я понял, что в современных браузерах всегда используется эта виндовая строка, которую можно спокойно сплитить по бекслешу? Можно ли использовать fileInput.value, или же предпочтительнее что-то другое, там в документации говорится о каком-то filename, я не понял, к какому вообще дом-объекту относится это свойство?
Переверни дерево #562 #522907
Аноны, те из вас, кто читает всякие It-сайты, наверно уже натыкались на упоминание задачи про переворот бинарного дерева. Если вам интересно, то на одном из западных сайтов или в твиттере человек возмущался тем, что его, уважаемого разработчика, пришедшего на собеседование в гугл завалили этой идиотской задачей вместо того чтобы поговорить про его опыт и знания.

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

Но вы пока не профессиональные разработчики, почему бы не поломать голову? Вот задача:

- напишите функцию, переворачивающую бинарное дерево.

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

https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)

http://www.intuit.ru/studies/courses/648/504/lecture/11458

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

С деревьями связано много интересных алгоритмов и задач:

http://algolist.manual.ru/ds/btree.php
http://algolist.manual.ru/ds/walk.php

Бинарное (двоичное) дерево — это дерево, у каждого узла которого может быть не более 2 детей. Их обычно называют «левый» и «правый» ребенок.

«Перевернуть» дерево значит пройтись по всем узлам в дереве и поменять местами «левого» и «правого» детей.

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

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

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

http://learnc.info/adt/binary_tree_traversal.html
http://hci.fenster.name/304y/lab3/
https://sohabr.net/post/232669/

Ну а имея его, перевернуть дерево, труда, думаю, не составит.

Аноны, попробуйте порешать. Даже если вы будете натягивать шаблоны на битрикс, все равно для мозгов полезно.
Переверни дерево #562 #522907
Аноны, те из вас, кто читает всякие It-сайты, наверно уже натыкались на упоминание задачи про переворот бинарного дерева. Если вам интересно, то на одном из западных сайтов или в твиттере человек возмущался тем, что его, уважаемого разработчика, пришедшего на собеседование в гугл завалили этой идиотской задачей вместо того чтобы поговорить про его опыт и знания.

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

Но вы пока не профессиональные разработчики, почему бы не поломать голову? Вот задача:

- напишите функцию, переворачивающую бинарное дерево.

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

https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)

http://www.intuit.ru/studies/courses/648/504/lecture/11458

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

С деревьями связано много интересных алгоритмов и задач:

http://algolist.manual.ru/ds/btree.php
http://algolist.manual.ru/ds/walk.php

Бинарное (двоичное) дерево — это дерево, у каждого узла которого может быть не более 2 детей. Их обычно называют «левый» и «правый» ребенок.

«Перевернуть» дерево значит пройтись по всем узлам в дереве и поменять местами «левого» и «правого» детей.

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

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

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

http://learnc.info/adt/binary_tree_traversal.html
http://hci.fenster.name/304y/lab3/
https://sohabr.net/post/232669/

Ну а имея его, перевернуть дерево, труда, думаю, не составит.

Аноны, попробуйте порешать. Даже если вы будете натягивать шаблоны на битрикс, все равно для мозгов полезно.
#563 #522910
>>522905

> У меня даже на убунту выдает почему-то "C:\fakepath\filename".


Браузер в целях защиты пользовательской информации не передает полный путь к файлу. Имеет право.

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


Ненадежно. Я бы сделал более надежный алгоритм, который принимает любое из имен:

file.txt
/tmp/file.txt
c:\test\file.txt

> Можно ли использовать fileInput.value, или же предпочтительнее что-то другое, там в документации говорится о каком-то filename, я не понял, к какому вообще дом-объекту относится это свойство?


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

Можно использовать value если нужно только имя. Также, в новых браузерах есть объект File (в свойстве input.files) который содержит информацию о выбранном файле:

https://developer.mozilla.org/ru/docs/Web/API/File
https://developer.mozilla.org/ru/docs/Using_files_from_web_applications
#564 #522911
>>522905

> там в документации говорится о каком-то filename, я не понял, к какому вообще дом-объекту относится это свойство?


Это не свойство, а режим, прочти что написано выше:

> The value IDL attribute allows scripts to manipulate the value of an input element. The attribute is in one of the following modes, which define its behavior:


> ...


> filename


> On getting, it must return the string ...



Это просто значит что у файловых инпутов свойство value находится в режиме (?) filename и хранит путь или имя выбранного файла.
#565 #522914
>>522911
Понятия не имею, что такое "режим", лучше действительно буду обращаться через api объекта file, files[0].name или лучше в цикле если выбрано несколько файлов.
#566 #522921
>>522907
пиздец, что это за деревья такие? примеры на шарпе что ли? нахуй они нужны?
#567 #522924
Срочно надо выучить Wordpress для того что бы взяли на работу, посоветуйте каких-нибудь хороших уроков Вордпресс как для разработчика, создание тем и плагинов и прочее там.
#568 #522927
>>522907

>Для начала, вам, конечно, надо реализовать само дерево. Для этого в PHP надо сделать класс (любители массивов идут в какой-нибудь другой тред)


А само дерево в виде массива хранить можно?
#569 #522929
>>522924
Мы не умеем.
#571 #522936
Для javascript актуальны требования psr, или может есть что аналогичное?
#572 #522946
>>522927

Это как? Массивы там не нужны, так как дерево состоит из узлов и мы можем ссылки на них в самих же узгах и хранить. Ну вот пример:

// создаем первый узел
$n1 = new Node;
// второй
$n2 = new Node;
// Добавляем второй как ребенка первого
$n1->setLeftChild($n2);

>>522921

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

>>522924

А документация?

>>522936

Нет, не актуальны, PSR для PHP.

Есть такие ссылки:

https://learn.javascript.ru/coding-style
http://learn.javascript.ru/write-unmain-code
#572 #522946
>>522927

Это как? Массивы там не нужны, так как дерево состоит из узлов и мы можем ссылки на них в самих же узгах и хранить. Ну вот пример:

// создаем первый узел
$n1 = new Node;
// второй
$n2 = new Node;
// Добавляем второй как ребенка первого
$n1->setLeftChild($n2);

>>522921

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

>>522924

А документация?

>>522936

Нет, не актуальны, PSR для PHP.

Есть такие ссылки:

https://learn.javascript.ru/coding-style
http://learn.javascript.ru/write-unmain-code
#574 #522968
>>520228

Ок, вот мои мысли.

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

В качестве пример микрофрйемворка стоило бы посомтреть на SLim или Silex. Они сделаны совем по-другому и их архитектура лучше подходит для крошечных проектов. А Юи-подобная архитектура подходит плохо, она громоздкая и избыточная.

Далее, твой фреймворк нельзя подключить через композер. Его нельзя установить в отдельную папку, и он тянет с собой какой-то index.php с кодом. Вот допустим я бы решил написать под него приложение. Как отличать где код фрйемворка, а где мой код? Твой фреймворк предполагает что все это надо перемешать в кучу, это неправильно. Сторонний код должен ставиться через композер и лежать в отдельной папке.

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

Далее, это абсолютный пример как делать неправильно: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php

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

Ты абсолютно непраивльно реализовал автозагрузчик: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php#L15

Зачем ты примешиваешь код автозагрузки во все классы? Он должен быть отдельно, а в случае фреймворка он вообще должен быть реализован через композер. Каждый класс должен заниматься своим делом. Это не задача Валидатора заниматься автозагрузкой. Ну и я не понимаю, зачем подключать файлы через require когда в PHP есть настоящая автозагрузка: http://habrahabr.ru/post/136761/

По всему коду размазаны функции типа loadClass:

https://github.com/DmitryMachavariani/micro/blob/master/framework/Rain.php#L53

Это надо все удалить и сделать нормальную автозагрузку через композер по PSR-4.

Тут в контроллере тоже смешана куча разной логики: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php

Обычно контроллер реализуют так: на вход он получает запрос Request и отдает на выходе ответ, Response:

$response = $controller->handle($request);

В некоторых фрйемворках заготовка ответа передается как аргуимент, а контроллер его заполняет:

$controller->handle($request, $response);

Соответственно вся работа с GET/POST вынесена в объект Request.

Также, у тебя зачем-то заложено использование каких-то странных параемтров:

> $data = isset($_GET['d']) ? explode("/", $_GET['d']) : explode("/", self::$default_base);


Что еще за d? Что это? Почему я должен это использовать?

> https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php#L34


> exit("Not found file " . app . "/views/" . $this->getController() . "/" . $file . ".php" . "");


В мире ООП надо использовать исключения, урок: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a

Ты же пишешь пользователю непонятную ему информацию, и не логгируешь информацию об ошибке. Администратор сайта о ней никогда не узнает. ДОЛжно быть наоборот, пользователю — заглушка, администратору — запись в лог (и исключения позволяют это сделать).

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L28


> } catch (PDOException $e) {


> die($e->getMessage());


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

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L58


> $this->result = $this->database->query("SELECT * FROM " . $table_name . " LIMIT " . $from . ", " . $to)->fetchAll();


Нельзя вставлять переменные прямо в запрос, это во-первых некачественный код, во-вторых вероятность SQl инъекции. Надо использовать плейсхолдеры: http://habrahabr.ru/post/137664/

Сам класс базы данных тоже спроектирован неудачно, ты смешал в одном классе и довольно бесполезный построитель запросов, и обертку над PDO. Посмотри например как устроен Doctrine DBAL, там все разнесено в отдельные классы.

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

> public function where($where = null, $type = 'AND') {


Функция не экранирует данные при сборке, это SQL инъекция.

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Router.php#L40


РОутер не занимается редиректами. Его задача лишь проанализировать и разобрать URL. Редиректы делаются через объект Response.

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Session.php


Смысл этого класса непонятен. Что мешает напрямую работать с SESSION?

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/User.php


> class User extends Session {


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

- класс работы с сессией
- класс для авторизации/разгогинивания
- класс, хранящий информацию о пользователе

Должно быть 3 отдельных класса.

> https://github.com/DmitryMachavariani/micro/blob/master/framework/helper/FormHelper.php#L17


Непраивльно смешивать PHP логику и HTML. HTML должен быть в шаблоне.

Также, у тебя не экранируются данные при вставке в HTML. Это XSS уязвимость.

> https://github.com/DmitryMachavariani/micro/blob/master/index.php


Константы пишутся большими буквами, смысл их неясен. зачем нужна константа "url" если логичнее сделать такой метод в объекте Request? Какой смысл в константе "FILEPATH" и почему это константа а не метод?

В общем, на этом, думаю, можно проверку закончить и остальное не проверять. Потому что все эти ошибки разбираются в нашем задании про студентов и я тут начинаю пересказывать комментарии к этому заданию, лучше ты прочти их сам: https://github.com/codedokode/pasta/blob/master/student-list.md

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

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

Вот краткий список вещей которые стоит тебе посмотреть:

- ООП и наследование
- composer
- автозагрузка в PHP
- фреймворк Slim
- плейсхолдеры в SQL запросах
- htmlspeciaclahrs и XSS

Если тебе что-то непонятно или есть вопросы, задавай, я поясню и дам ссылочки.
#574 #522968
>>520228

Ок, вот мои мысли.

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

В качестве пример микрофрйемворка стоило бы посомтреть на SLim или Silex. Они сделаны совем по-другому и их архитектура лучше подходит для крошечных проектов. А Юи-подобная архитектура подходит плохо, она громоздкая и избыточная.

Далее, твой фреймворк нельзя подключить через композер. Его нельзя установить в отдельную папку, и он тянет с собой какой-то index.php с кодом. Вот допустим я бы решил написать под него приложение. Как отличать где код фрйемворка, а где мой код? Твой фреймворк предполагает что все это надо перемешать в кучу, это неправильно. Сторонний код должен ставиться через композер и лежать в отдельной папке.

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

Далее, это абсолютный пример как делать неправильно: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php

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

Ты абсолютно непраивльно реализовал автозагрузчик: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/Component.php#L15

Зачем ты примешиваешь код автозагрузки во все классы? Он должен быть отдельно, а в случае фреймворка он вообще должен быть реализован через композер. Каждый класс должен заниматься своим делом. Это не задача Валидатора заниматься автозагрузкой. Ну и я не понимаю, зачем подключать файлы через require когда в PHP есть настоящая автозагрузка: http://habrahabr.ru/post/136761/

По всему коду размазаны функции типа loadClass:

https://github.com/DmitryMachavariani/micro/blob/master/framework/Rain.php#L53

Это надо все удалить и сделать нормальную автозагрузку через композер по PSR-4.

Тут в контроллере тоже смешана куча разной логики: https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php

Обычно контроллер реализуют так: на вход он получает запрос Request и отдает на выходе ответ, Response:

$response = $controller->handle($request);

В некоторых фрйемворках заготовка ответа передается как аргуимент, а контроллер его заполняет:

$controller->handle($request, $response);

Соответственно вся работа с GET/POST вынесена в объект Request.

Также, у тебя зачем-то заложено использование каких-то странных параемтров:

> $data = isset($_GET['d']) ? explode("/", $_GET['d']) : explode("/", self::$default_base);


Что еще за d? Что это? Почему я должен это использовать?

> https://github.com/DmitryMachavariani/micro/blob/master/framework/base/BaseController.php#L34


> exit("Not found file " . app . "/views/" . $this->getController() . "/" . $file . ".php" . "");


В мире ООП надо использовать исключения, урок: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a

Ты же пишешь пользователю непонятную ему информацию, и не логгируешь информацию об ошибке. Администратор сайта о ней никогда не узнает. ДОЛжно быть наоборот, пользователю — заглушка, администратору — запись в лог (и исключения позволяют это сделать).

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L28


> } catch (PDOException $e) {


> die($e->getMessage());


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

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/DataBase.php#L58


> $this->result = $this->database->query("SELECT * FROM " . $table_name . " LIMIT " . $from . ", " . $to)->fetchAll();


Нельзя вставлять переменные прямо в запрос, это во-первых некачественный код, во-вторых вероятность SQl инъекции. Надо использовать плейсхолдеры: http://habrahabr.ru/post/137664/

Сам класс базы данных тоже спроектирован неудачно, ты смешал в одном классе и довольно бесполезный построитель запросов, и обертку над PDO. Посмотри например как устроен Doctrine DBAL, там все разнесено в отдельные классы.

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

> public function where($where = null, $type = 'AND') {


Функция не экранирует данные при сборке, это SQL инъекция.

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Router.php#L40


РОутер не занимается редиректами. Его задача лишь проанализировать и разобрать URL. Редиректы делаются через объект Response.

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/Session.php


Смысл этого класса непонятен. Что мешает напрямую работать с SESSION?

> https://github.com/DmitryMachavariani/micro/blob/master/framework/kernel/User.php


> class User extends Session {


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

- класс работы с сессией
- класс для авторизации/разгогинивания
- класс, хранящий информацию о пользователе

Должно быть 3 отдельных класса.

> https://github.com/DmitryMachavariani/micro/blob/master/framework/helper/FormHelper.php#L17


Непраивльно смешивать PHP логику и HTML. HTML должен быть в шаблоне.

Также, у тебя не экранируются данные при вставке в HTML. Это XSS уязвимость.

> https://github.com/DmitryMachavariani/micro/blob/master/index.php


Константы пишутся большими буквами, смысл их неясен. зачем нужна константа "url" если логичнее сделать такой метод в объекте Request? Какой смысл в константе "FILEPATH" и почему это константа а не метод?

В общем, на этом, думаю, можно проверку закончить и остальное не проверять. Потому что все эти ошибки разбираются в нашем задании про студентов и я тут начинаю пересказывать комментарии к этому заданию, лучше ты прочти их сам: https://github.com/codedokode/pasta/blob/master/student-list.md

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

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

Вот краткий список вещей которые стоит тебе посмотреть:

- ООП и наследование
- composer
- автозагрузка в PHP
- фреймворк Slim
- плейсхолдеры в SQL запросах
- htmlspeciaclahrs и XSS

Если тебе что-то непонятно или есть вопросы, задавай, я поясню и дам ссылочки.
#575 #522971
>>520388

Я думаю, под «АПИ» он имел в виду пример простого приложения, использующего фреймворк.

>>520534

Можно, но имей в виду что битрикс это то еще дно. Его пишут студенты работающие за 20 000 руб и качество кода соответствующее.

>>520557

Для графиков есть JS библиотеки либ оможно рисовать их средствами PHP на сервере либо рисовать в SVG файле. А в твоем случае график вообще можно из дивов сделать.

>>520583

С PHP проще будет. Яву потом тебе никто не запрещает изучать.

>>520666

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

>>520947

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

Для сериализации можно использовать json_encode, лучше наверно просто отдельные куки.

>>520976

Регулярка слишком сложная. Там достаточно поиска 2 ситуаций:

- любые буквы, латинская, русская, любые буквы
- любые буквы, русская, латинская, любые

Чтобы найти неправильные слова.

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


Используй foreach, он удобнее.

Алсо, что-то программа выводит непонятный ответ:

> Опечатка в слове мяc:[]



Ты учел что в preg_replace $1, $2, $3 относятся именно к трем самым первым парам скобок в регулярке?
#575 #522971
>>520388

Я думаю, под «АПИ» он имел в виду пример простого приложения, использующего фреймворк.

>>520534

Можно, но имей в виду что битрикс это то еще дно. Его пишут студенты работающие за 20 000 руб и качество кода соответствующее.

>>520557

Для графиков есть JS библиотеки либ оможно рисовать их средствами PHP на сервере либо рисовать в SVG файле. А в твоем случае график вообще можно из дивов сделать.

>>520583

С PHP проще будет. Яву потом тебе никто не запрещает изучать.

>>520666

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

>>520947

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

Для сериализации можно использовать json_encode, лучше наверно просто отдельные куки.

>>520976

Регулярка слишком сложная. Там достаточно поиска 2 ситуаций:

- любые буквы, латинская, русская, любые буквы
- любые буквы, русская, латинская, любые

Чтобы найти неправильные слова.

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


Используй foreach, он удобнее.

Алсо, что-то программа выводит непонятный ответ:

> Опечатка в слове мяc:[]



Ты учел что в preg_replace $1, $2, $3 относятся именно к трем самым первым парам скобок в регулярке?
#576 #522981
>>521135

Вот ответ, спамфильтр не пропускает: http://pastebin.com/ziK5KHmU

>>521138

А люди как живут?

>>521142

> Ещё более лучшее задание №2:


Теперь все верно

> Задание №3


Надо отключить курсив в теге em, а то вот что может получиться: https://jsfiddle.net/3cgrz53j/

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

> Задание №4


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

> Задание №5


Ок, все верно.

>>521145

Нет.

>>521150

Надо исользовать json_encode либо отдельные куки. если ты хочешь чтобы настройки привязывались не к компьютеру, а к аккаунту, лучше вообще их в базе хранить.
#576 #522981
>>521135

Вот ответ, спамфильтр не пропускает: http://pastebin.com/ziK5KHmU

>>521138

А люди как живут?

>>521142

> Ещё более лучшее задание №2:


Теперь все верно

> Задание №3


Надо отключить курсив в теге em, а то вот что может получиться: https://jsfiddle.net/3cgrz53j/

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

> Задание №4


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

> Задание №5


Ок, все верно.

>>521145

Нет.

>>521150

Надо исользовать json_encode либо отдельные куки. если ты хочешь чтобы настройки привязывались не к компьютеру, а к аккаунту, лучше вообще их в базе хранить.
#577 #522986
>>521385

> Задание №6


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

> src: url("http://www.xfont.ru/files/fonts/5/247509.ttf");


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

Заголовок там по моему надо сделать не-жирным.

Текст и меню тоже надо сделать требушетом, этот шрифт можно прописать как основной на теге html или body.

> Задание №7


Ок, хорошо, я вижу что ты указал для кнопки и input разную height. Я советую тебе еще почитать про свойство box-sizing если ты о нем еще не знаешь.

> Задание №8


Когда указываешь font-size всегда указывай и line-height иначе он наследуется и поулчится не то что надо. Основной размер и стиль шрифта надо указывать не на p (это как минимум странно, почему размер применяется только к тексту внутри абзацев, а как же другие теги? ), а на html или body.

div там лишний и его надо убрать. Мне кажется тегов p и aside вполне достаточно. clear можно перенести на aside.

Отступ для абзацев надо задавать не маргином на детях, а паддингом на родителе, посмотри даже в задании написано:

> не задавай поля с помощью margin на <p>. Поля задаются с помощью padding на родительском элементе



Вот какие проблемы получаются из-за маргина:

http://jsfiddle.net/oz48zgcw/1/

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

>Задание №9



>div {


>\tborder: 1px solid #a3a3a3;


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

> .greyBlock:after {


>\tcontent: " ";


Это старый clearfix, сейчас похитрее штука есть, microclearfix, ссылка на нее в подсказке к заданию. Но твой вариант тоже подходит.

> <p class="inside text">


У p надо убрать классы, так как на практике у нас есть кусок HTML который надо вывести, например, текст поста из базы данных, и мы не хотим в нем искать теги и добавлять в них классы, а хотим просто вывести как есть. То есть на p не должно быть никаких классов.

Опять же шрифт должен применяться не только к абзацам, а к любому содержимому, спискам, тексту вне тегов.

> до меня так и не дошло, как сделать так, чтобы текст не обтекал левый блок, а шёл отдельной колонкой


Сделать большой padding-left на .greyBlock. желтый квадрат можно загнать влево отрицательным маргином: https://gist.github.com/codedokode/3f6063edf0a2227eb313
#577 #522986
>>521385

> Задание №6


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

> src: url("http://www.xfont.ru/files/fonts/5/247509.ttf");


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

Заголовок там по моему надо сделать не-жирным.

Текст и меню тоже надо сделать требушетом, этот шрифт можно прописать как основной на теге html или body.

> Задание №7


Ок, хорошо, я вижу что ты указал для кнопки и input разную height. Я советую тебе еще почитать про свойство box-sizing если ты о нем еще не знаешь.

> Задание №8


Когда указываешь font-size всегда указывай и line-height иначе он наследуется и поулчится не то что надо. Основной размер и стиль шрифта надо указывать не на p (это как минимум странно, почему размер применяется только к тексту внутри абзацев, а как же другие теги? ), а на html или body.

div там лишний и его надо убрать. Мне кажется тегов p и aside вполне достаточно. clear можно перенести на aside.

Отступ для абзацев надо задавать не маргином на детях, а паддингом на родителе, посмотри даже в задании написано:

> не задавай поля с помощью margin на <p>. Поля задаются с помощью padding на родительском элементе



Вот какие проблемы получаются из-за маргина:

http://jsfiddle.net/oz48zgcw/1/

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

>Задание №9



>div {


>\tborder: 1px solid #a3a3a3;


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

> .greyBlock:after {


>\tcontent: " ";


Это старый clearfix, сейчас похитрее штука есть, microclearfix, ссылка на нее в подсказке к заданию. Но твой вариант тоже подходит.

> <p class="inside text">


У p надо убрать классы, так как на практике у нас есть кусок HTML который надо вывести, например, текст поста из базы данных, и мы не хотим в нем искать теги и добавлять в них классы, а хотим просто вывести как есть. То есть на p не должно быть никаких классов.

Опять же шрифт должен применяться не только к абзацам, а к любому содержимому, спискам, тексту вне тегов.

> до меня так и не дошло, как сделать так, чтобы текст не обтекал левый блок, а шёл отдельной колонкой


Сделать большой padding-left на .greyBlock. желтый квадрат можно загнать влево отрицательным маргином: https://gist.github.com/codedokode/3f6063edf0a2227eb313
#578 #522993
>>522927
нет, массивы же линейные блеать, они не ветвятся.
#579 #522994
>>522946
я пост прочел, нахуя ты даешь примеры на си в треде про похапе? совсем ебнулся уже со своим преподаванием?
#580 #522995
>>521653

Тебе надо сначала изучить основы PHP. Если в массиве нет элемента то функция вернет null и выдаст ошибку.

>>521668

Ты непраивльно делаешь авторизацию. ты должен в защищенном файле проверять залогинен ли пользователь, если нет то выводить форму логина.

> как заставить скрипт /admin/vasya/admin.php, не работать, при переходе по прямой ссылке на него?


Никак.

>>521690

И внимательно читай все замечания и подсказки под заданиями. Там иногда и полезные советы написаны.

>>521819

> Господа, как это можно автоматизировать?


Массивом.

> Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать


Его надо выкинуть и переписать на твиге, вот мое мнение.

Код кошмарный. Не пишите так, хорошие дети.

Интересно, что заставляет людей писать этот ад? Почему они не хотят изучить Slim, twig, doctrine, symfony или хотя бы Yii2 и сделать нормально? Ведь все равно с таким кодом ни в одну нормальную компанию не возьмут.

> $title8


> $parse->set_tpl('{TITLE8}',$title8);


8-е название! Восьмое! Поэтому вы никогда не должны изобретать свой шаблонизатор, а должны взять твиг.

>>521823

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

>>521946

В следующий раз на аналогичной задаче додумаешься. Потому надо решать сейчас как можно больше задачек. Программирование во многом состоит из написания того что ты уже видел раньше.
#580 #522995
>>521653

Тебе надо сначала изучить основы PHP. Если в массиве нет элемента то функция вернет null и выдаст ошибку.

>>521668

Ты непраивльно делаешь авторизацию. ты должен в защищенном файле проверять залогинен ли пользователь, если нет то выводить форму логина.

> как заставить скрипт /admin/vasya/admin.php, не работать, при переходе по прямой ссылке на него?


Никак.

>>521690

И внимательно читай все замечания и подсказки под заданиями. Там иногда и полезные советы написаны.

>>521819

> Господа, как это можно автоматизировать?


Массивом.

> Оно у меня потом в шаблон парситься, там особая структура, ее нельзя нарушать


Его надо выкинуть и переписать на твиге, вот мое мнение.

Код кошмарный. Не пишите так, хорошие дети.

Интересно, что заставляет людей писать этот ад? Почему они не хотят изучить Slim, twig, doctrine, symfony или хотя бы Yii2 и сделать нормально? Ведь все равно с таким кодом ни в одну нормальную компанию не возьмут.

> $title8


> $parse->set_tpl('{TITLE8}',$title8);


8-е название! Восьмое! Поэтому вы никогда не должны изобретать свой шаблонизатор, а должны взять твиг.

>>521823

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

>>521946

В следующий раз на аналогичной задаче додумаешься. Потому надо решать сейчас как можно больше задачек. Программирование во многом состоит из написания того что ты уже видел раньше.
#581 #522998
http://jsfiddle.net/oxdd2fks/

Подскажите как сделать анимацию текста, чтобы он плавно переливался из одного в другой при переключении табов.
#582 #523001
>>522097

Раньше почему-то было принято называть классы начиная с C: CUser, CWindow. Сейчас это не пишут, так как классы видно по заглавной букве в начале.

>>522147

Чтобы брать больше с тех кто побогаче.

> можно брать за 1 сделку больше.


Тогда 10-долларовые заказчики огорчатся.

>>522168

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

>>522225

Странно даже, кодеакадеми это ведь ознакомительный уровень. Ты наверно и до этого знал что-то.

>>522235

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

> Простой сайт с админкой и бд могу написать, что там еще можно уметь?


Может код людям не нравится, который без фреймворков? Может он еще и без ООП? И выглядит как в учебниках 10-летней давности?

>>522245

Что же до сих пор Yii2/Symfony 2 не освоил?

>>522287

Ctrl + Shift + I нажми в браузере и попробуй разобраться

>>522425

JOIN это не замена внешних ключей, это способ объединения таблиц. Перечитай пост и ссылку в нем: >>522385

Не использовать внешние ключи = быдлокодить

>>522427

Код запости куда-нибудь вроде jsfiddle или codepen.
#582 #523001
>>522097

Раньше почему-то было принято называть классы начиная с C: CUser, CWindow. Сейчас это не пишут, так как классы видно по заглавной букве в начале.

>>522147

Чтобы брать больше с тех кто побогаче.

> можно брать за 1 сделку больше.


Тогда 10-долларовые заказчики огорчатся.

>>522168

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

>>522225

Странно даже, кодеакадеми это ведь ознакомительный уровень. Ты наверно и до этого знал что-то.

>>522235

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

> Простой сайт с админкой и бд могу написать, что там еще можно уметь?


Может код людям не нравится, который без фреймворков? Может он еще и без ООП? И выглядит как в учебниках 10-летней давности?

>>522245

Что же до сих пор Yii2/Symfony 2 не освоил?

>>522287

Ctrl + Shift + I нажми в браузере и попробуй разобраться

>>522425

JOIN это не замена внешних ключей, это способ объединения таблиц. Перечитай пост и ссылку в нем: >>522385

Не использовать внешние ключи = быдлокодить

>>522427

Код запости куда-нибудь вроде jsfiddle или codepen.
#583 #523007
>>522995
Ладно, сделаю ваши задачки и пойду учить твиг тогда.
#584 #523009
>>522995

>Как фронтенд может быть бесполезным


Фронтенд макак итак как говна расплодилось, их неохотно берут на работу за пределами дс по крайней мере. потому что бэкэнд важнее
#585 #523011
>>522914

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

>>522994

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

>>522998

Можно расположить все тексты друг над другом, сделать их прозрачными и при переключении анимировать opacity. Можно сделать чтобы текст уезжал влево и другой выезжал справа, за счет свойств left или transform. Можно вообще трехмерные трансформации сделать:

http://habrahabr.ru/company/nordavind/blog/209462/
http://habrahabr.ru/post/135816/
http://habrahabr.ru/post/159161/
http://habrahabr.ru/post/151300/

Я советую разобраться с transition (переходы), transform и transform 3d, пригодится. Можно на них красивые штуки делать.
#586 #523013
>>522998

> input:checked + label + input + label + article + article + article {


> \t\t\t\tdisplay: block;


А можно ли обойтись без таких адских селекторов? Вот тут пост например на тему есть: http://chikuyonok.ru/2009/04/dl-tabs/ хотя он со своими недостатками.
#587 #523017
Аноны, там я пока не посмотрел файлообменник и еще задачку про опечатки, позже наверно гляну, мне еще надо в магазин съездить и поработать сегодня.
#588 #523021
Анон с файлооюбменником, пока к тебе такое замечание:

> https://github.com/V3N0m21/Uppu3/compare/master@%7B7day%7D...master#diff-fa70fc8f0351c0557cddd3c2e89fc43eR73


> div.innerHTML = '<h4><b> Ответить: </b></h4>' +


> + '<form action="/send/{{ file.id }}" method="post">'+


> + '<label for="name">Ваше имя</label><br>'+


> + '<input type="text" name="name" value="Anonymous"><br>'+


Вот это плохо, засовывать HTML в JS. ты можешь засунуть шаблон в HTML код в script-блок как описано тут:

https://learn.javascript.ru/template-lodash#хранение-шаблона-в-документе
https://learn.javascript.ru/templates

Вот так вот: <script type="text/x-template" id="menu-template">

Заметь, я пишу x-template так как MIME типа text/template нет, а для своих придуманных типов принято приписывать x-.

Для js-test.html можно было не писать маршрут, а кинуть его в public и обращаться напрямую.

> commentButton.onclick = function(){


не полагайся на то что браузер создает глобальные переменные по id, используй getElementById явно.

> onclick="appendPostForm({{comment.id}}, '{{comment.user}}', postForm{{comment.id}})"


Используй json_encode для надежной подстановки данных в скрипт. Что если в user встретится кавычка или перевод строки? Как минимум, скрипт сломается.
#588 #523021
Анон с файлооюбменником, пока к тебе такое замечание:

> https://github.com/V3N0m21/Uppu3/compare/master@%7B7day%7D...master#diff-fa70fc8f0351c0557cddd3c2e89fc43eR73


> div.innerHTML = '<h4><b> Ответить: </b></h4>' +


> + '<form action="/send/{{ file.id }}" method="post">'+


> + '<label for="name">Ваше имя</label><br>'+


> + '<input type="text" name="name" value="Anonymous"><br>'+


Вот это плохо, засовывать HTML в JS. ты можешь засунуть шаблон в HTML код в script-блок как описано тут:

https://learn.javascript.ru/template-lodash#хранение-шаблона-в-документе
https://learn.javascript.ru/templates

Вот так вот: <script type="text/x-template" id="menu-template">

Заметь, я пишу x-template так как MIME типа text/template нет, а для своих придуманных типов принято приписывать x-.

Для js-test.html можно было не писать маршрут, а кинуть его в public и обращаться напрямую.

> commentButton.onclick = function(){


не полагайся на то что браузер создает глобальные переменные по id, используй getElementById явно.

> onclick="appendPostForm({{comment.id}}, '{{comment.user}}', postForm{{comment.id}})"


Используй json_encode для надежной подстановки данных в скрипт. Что если в user встретится кавычка или перевод строки? Как минимум, скрипт сломается.
#589 #523025
>>523001

>Что же до сих пор Yii2/Symfony 2 не освоил?


Как бы не видел необходимости, ведь все что угодно можно нагуглить и написать на чистом пхп.
#590 #523026
ОП хуй я твой рот ебал)) Чо важным себя таким считаешь, да скотинка? Сам поди какой-то престарелый пидор, работающий преподом в какой-то шараге, лысеющий с пивным пузом и появляющейся сединой в голове, еще и совращающий студентов в перерывах между парами. Прямо женоподобный манерный снобизм так и пыщет в твоих убогих портянках. Как можно быть таким лузером, вынужденным к 40 годам работать в шараге и давать советы шольникам на сосаче, лол?
#591 #523027
>>523025

Это будет как минимум дольше. В коде будет разбираться и поддерживать дольше и сложнее. По моему опыту, в 99% случаев это будет быдлокод (смотри дамп фриланса выше по треду). Заказчик очевидно окажется в проигрыше от сотруюничества с таким велосипедистом.

Потому советую изучать.
#592 #523032
>>522027

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


Спасибо, позже попробую написать что-нибудь типа простенького файлового менеджера, чтобы лучше покрыть эту тему, или задание на файлообменник сделаю ваше, если доберусь.
#593 #523039
>>523021

>Вот это плохо, засовывать HTML в JS. ты можешь засунуть шаблон в HTML код в script-блок как описано тут



До этой главы в книге я еще не дошел, посмотрю
#594 #523049
>>514869
Ну что, ребята, проверьте: http://ideone.com/YZcuW6 .
Решение задачи про кредиты на АйПад.
#595 #523076
>>522993
Массивы массивов очень хорошо ветвятся.
#596 #523078
>>522430
Бампану вопрос.
#597 #523098
>>522907
ОП, посмотри, что я наваял: http://ideone.com/WTp9IM
#598 #523107
>>522907
>>523098
Так это что, и была упомянутая выше балансировка бинарного дерева?
#599 #523137
>>523076

Но превращают код в кашу. Потому мы будем ветвить не массивы, а объекты.

>>523107

Балансировка слишком круто, для начала надо просто перевернуть дерево. А тем кто повернул, дадим балансировку.

>>523098

> public function createChilds()


Этой функции тут не должно быть, как мне кажется. Она лишает нас возможности управлять созданием узлов, например какого он должен быть класса и что передать ему в конструктор. Удобнее сделать методы вроде задатьЛевогоРебенка().

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

- проверить что этот узел не имеет родителя
- прописать себя в parent узла
- прописать узел в одного из детей
- если на его месте был другой узел, надо его удалить

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

> if (!empty($base->leftChild) && !empty($base->rightChild)) {


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

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

- напиши методы добавления/удаления детей с сбалансировкой дерева

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

Дерево называется сбалансированным если в нем нет длинных ветвей из одиночных узлов (точное определние: если взять глубину левой и правой ветвей любого узла, они отличаются не более чем на единицу):

1
...2
......3
.........4

Выше пример несбалансированного деерва. Если посмотреть на узел 1 то слева у него нет потомков, там глубина ветки 0. А справа аж 3 потомка, глубина ветки 3. Непорядок. Если его сбалансировать, получится пирамидка:

.....2
1.........3
.................4

Есть разные алгоритмы балансировки: АВЛ и красно-черные деревья. Говорят, первое проще.

https://ru.wikipedia.org/wiki/%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Статья с описанием алгоритма балансировки АВЛ-деревьев: http://habrahabr.ru/post/150732/

Про красно-черные деревья: https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE-%D1%87%D1%91%D1%80%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE

Поломай голову еще немного.

Если решишь это и будет желание, я дам задачку на поиск слова с ошибками в словаре с помощью деревьев (это примерно то же что делает ворд, когда предлагает варианты исправления опечатки).
#599 #523137
>>523076

Но превращают код в кашу. Потому мы будем ветвить не массивы, а объекты.

>>523107

Балансировка слишком круто, для начала надо просто перевернуть дерево. А тем кто повернул, дадим балансировку.

>>523098

> public function createChilds()


Этой функции тут не должно быть, как мне кажется. Она лишает нас возможности управлять созданием узлов, например какого он должен быть класса и что передать ему в конструктор. Удобнее сделать методы вроде задатьЛевогоРебенка().

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

- проверить что этот узел не имеет родителя
- прописать себя в parent узла
- прописать узел в одного из детей
- если на его месте был другой узел, надо его удалить

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

> if (!empty($base->leftChild) && !empty($base->rightChild)) {


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

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

- напиши методы добавления/удаления детей с сбалансировкой дерева

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

Дерево называется сбалансированным если в нем нет длинных ветвей из одиночных узлов (точное определние: если взять глубину левой и правой ветвей любого узла, они отличаются не более чем на единицу):

1
...2
......3
.........4

Выше пример несбалансированного деерва. Если посмотреть на узел 1 то слева у него нет потомков, там глубина ветки 0. А справа аж 3 потомка, глубина ветки 3. Непорядок. Если его сбалансировать, получится пирамидка:

.....2
1.........3
.................4

Есть разные алгоритмы балансировки: АВЛ и красно-черные деревья. Говорят, первое проще.

https://ru.wikipedia.org/wiki/%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
Статья с описанием алгоритма балансировки АВЛ-деревьев: http://habrahabr.ru/post/150732/

Про красно-черные деревья: https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE-%D1%87%D1%91%D1%80%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE

Поломай голову еще немного.

Если решишь это и будет желание, я дам задачку на поиск слова с ошибками в словаре с помощью деревьев (это примерно то же что делает ворд, когда предлагает варианты исправления опечатки).
#600 #523141
>>523026
Ой, не пизди. Сидел с таким престарелым преподом-пидором, он мне хуету всякую советовал, давно устаревшую. Сам примеры писал, хуже чем тут в треде постят. Преподы вообще не шарят ничего в программировании. Так бы и прозябал в неведении, если бы не ОП.
#601 #523160
>>523137

>Может сделаешь задание чуть посложнее?


>Поломай голову еще немного.



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



Конечно попробую решить, но позже. Сначала абитуриентов добью, а то уже неделю ничего в них не правил, всё статейки в сети читаю да задачки решаю. Скоро и забуду уже что и как там (в абитуриентах) устроено.
#602 #523193
>>522971
Foreach почитаю, попробую, но пытался сделать способами, которые выдавались в уроках. На счет регулярного выражения и скобок, видимо запутался, думал, что после | отсчет заново начинается. Спасибо за помощь
#603 #523201
>>523193
Нашел, где в уроках говорилось про foreach. Мельком было и как-то не отложилось в памяти
#604 #523220
function makeFirstLetterUppercase($text) {
\t$regexp = "/[!.?]/u";
\t$sent = preg_split($regexp, $text, 0, PREG_SPLIT_NO_EMPTY);
\tforeach ($sent as &$s) {
\t\t$s = trim($s);
\t\t$s = ucfirst($s);
\t}
\treturn $sent;
}
$k = makeFirstLetterUppercase($text);
var_dump($k);

Решаю первую задачу из раздела "Повторим?". Почему не получается сделать первую букву заглавной. Я чего-то не понимаю про функцию ucfrist?
#605 #523243
>>523220

ucfirst не работает с кириллицей в utf-8. Ее лучше вообще никогда не использовать. Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8

Используй mb_substr и mb_strtoupper.
#606 #523295
Добрый день. Меня сюда послали из руби треда. Суть такова, я хочу овладеть ЯП, чтобы иметь некий более-менее постоянный и главное удаленный заработок. Я пришел куда надо?
#607 #523300
>>523295

Да, читай оп-пост
#608 #523349
В чем отличие php_self от script_mamę?
#610 #523351
>>523349
URL: http://example.com/test.php/foo/bar
[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php
#611 #523363
>>523349
SCRIPT_NAME - путь к обрабатываемому файлу на web сервере (может быть include файл)
PHP_SELF - путь на web сервере к запрошенному юзером файлу (не include, только что юзер запросил)
__FILE__ - путь к обрабатываемому файлу в файловой системе (в том числе include )
#612 #523385
ОП, у меня есть вопрос. Я один из анонов который делает файлообменник на слиме (с доктриной и твигом).
И вот стоит у меня вопрос что мне делать дальше. Есть маленькая конторка в которую я могу пойти, там вроде в основном работают на зенде, но из того что я вижу быдлокод и велосипеды там цветут буйным цветом и я не уверен что смогу научиться там чему-нибудь хорошему. С другой стороны я могу продолжить обучаться сам и здесь в треде вместе со всеми, освоить yii и symfony и потом пробовать вкатываться во фриланс или в конторку посерьезней.

Короче не знаю я пока какой стул выбрать.
Сам я быдлоадмин в банке за три копейки 25го лвла, могу посвящать учебе большую часть рабочего дня. Жду советов мудрых
#613 #523388
>>523349

Мануал не отвечает на твой вопрос? http://php.net/manual/ru/reserved.variables.server.php

Попробуй сделать такой скрипт под именем test.php:

<?php

var_dump($_SERVER);

Вызови его так:

http://localhost/test.php/a/b/c

Посмотри на результат. В PHP_SELF и SCRIPT_NAME будут разные значения, как заметил выше >>523351

Ты можешь спросить, эй, а что это за /a/b/c ты приписал? Разве так можно? Да, можно, это древняя фича протокола CGI (которую перенял Апач) и она задумывалась для создания человекопонятных URL вроде /index.php/news/today

То, то дописано после имени скрипта (/a/b/c), идет в PATH_INFO.

>>523363

> путь к обрабатываемому файлу на web сервере (может быть include файл)


Ты ошибаешься.

>>523385

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

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

Файлообменник, если это ты скидывал, тоже постараюсь глянуть.
#613 #523388
>>523349

Мануал не отвечает на твой вопрос? http://php.net/manual/ru/reserved.variables.server.php

Попробуй сделать такой скрипт под именем test.php:

<?php

var_dump($_SERVER);

Вызови его так:

http://localhost/test.php/a/b/c

Посмотри на результат. В PHP_SELF и SCRIPT_NAME будут разные значения, как заметил выше >>523351

Ты можешь спросить, эй, а что это за /a/b/c ты приписал? Разве так можно? Да, можно, это древняя фича протокола CGI (которую перенял Апач) и она задумывалась для создания человекопонятных URL вроде /index.php/news/today

То, то дописано после имени скрипта (/a/b/c), идет в PATH_INFO.

>>523363

> путь к обрабатываемому файлу на web сервере (может быть include файл)


Ты ошибаешься.

>>523385

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

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

Файлообменник, если это ты скидывал, тоже постараюсь глянуть.
#614 #523437
#615 #523497
ПЕРЕКОТ
ПЕРЕКОТ
ПЕРЕКОТ
ПЕРЕКОТ
https://2ch.hk/pr/res/523494.html
#616 #523508
Кек, какому-то малолетнему недоумку понравилось чувствовать себя "опом".
Иди лучше на бе считалочку создай, тугосеря.
#617 #523517
>>523497
Как ты заебал.
#618 #523519
>>523497

Нет, перекатываться мы туда не будем. Хватит уже недотредов которые только сбивают всех с толку и содержат неправильные ссылки на предыдущий пост. Завтра сделаем нормальный тред. Картинку с котом впрочем может быть возьмем.
#619 #523520
>>523508

Не надо так говорить, может у него хорошие намерения и он просто пытался помочь треду. Но блин, ссылка на предыдущий пост указывает не туда, заголовка нет, привычной картинки нет, это людей только с толку сбивает. Лучше я чуть позже сделаю нормальный тред.
#620 #523537
>>523508
>>523517
>>523519
>>523520
Что ты разсеменился, тормоз? Картинка ему непривычная, ну ахуеть.
#621 #523539
>>523537
А вот это жирно уже. Нахуй послан, имбецил.
#622 #523615
>>523539
А это вообще жирнее некуда. Теперь точно нахуй, нахуй.
#623 #523623
>>514869 (OP)
Привет, аноны. Мне стало интересно, вот вы тут учите:

>PHP (а также JS/CSS/HTML/SQL)


Разделение труда вообще существует? Допустим я хочу фрилансить, что-бы успешно этим заниматься мне нужно учить и вёрстку и пхп?
162 Кб, 1000x377
#624 #523629
>>523623
Бэкенд программерам нужны только основы верстки и базовые знания javascript/jquery. Обычно бэкендам верстку уже готовую дают, и самому верстать из psd не нужно. Фронтендам нужно хорошо знать верстку, углубленно javascript и кучу javascript библиотек для фронтенда. Если тебе в фронтенды, то лучше в треде по верстке сиди. Алсо, пикрелейтед. Синим там, что бэкенду нужно знать, остальное фронтендам.
#625 #523632
>>523629
А про бекенд такая картинка есть?
#626 #523634
>>523632
Бэкенда полно разного же, в зависимости от выбранного языка/cms/фреймворка/библиотек. Там все в картинку не влезло бы. В треде тут стандартным для PHP программера инструментам учат, почитай сайт ОПа, поделай задания, понятнее станет.
#627 #523654
>>523623
Back-end это по большей части серверные дела, которые клиент не видит, front-end это уже то, что непосредственно видит клиент, и с чем взаимодействует, как мне думается
#628 #523698
>>523654

frontend это код работающий в браузере, а бекенд — на сервере.
33 Кб, 400x487
#629 #523887
Привет, котаны, два вопроса:
1. Это легитимный тред? Если нет, то киньте линк.
2. В общем, освоил основы пыхи, джс, джиквери, мускуль, теперь пора учить, то, что принесет мне трудоустройство и соответственно профит. План такой - делаю как говорят, в прочессе учусь\разбираюсь и следующим делаю уже свой проект. Вот решил по этому гайду заниматься https://github.com/githubjeka/yii2-tutorial
Кто что думает, особенно ОП, что можешь сказать после беглого взгляда.
#630 #523901
>>523887

Пока мы в этом треде, сегодня-завтра сделаем новый.

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

Также, заметь, у нас в Оп посте есть задачки на SQL.

Туториал это неплохо но я бы параллельно читал официальную документацию.

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

Если хочешь, можешь потом показать код на проверку.
#631 #523931
>>518739
>>516349-кун снова репортинг ин
Взяли на работу с хайлоадом все-таки, хоть я вообще в нем ни в зуб ногой и половину вопросов на собеседовании завалил. Срочно им добить отдел программерами надо было, подходящих кандидатов мало. Через пару недель выходить. Сказали, что недостающему доучат, главное что основы знаю (тут отдельное спасибо ОПу за хорошие задания и внятные объяснения). Сижу теперь повторяю все перед работой, потом еще отпишусь.
#632 #523932
>>523931
Тебе что, поговорить не с кем?
#633 #523933
>>523901
Все что ты перечислил я знаю с гуглом и работал с этим. Даже свой минифреймворк написал, просто думаю вкатиться в ии2, потому интересно не пробовал ли кто по сей ссылке ходить до меня.
#634 #523934
>>523932
Пусть пишет, тут такие истории приветствуются.
#635 #523938
>>523931

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

Ты там выше писал что в SQL не очень разбираешься, я бы советовал прорешать наши задачки на SQL + для хайлоада обязательно конечно надо почитать про индексы:

https://gist.github.com/codedokode/10539213#Индексы
http://ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%D0%B8+%D0%B2+MySQL

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

База данных зачастую это сердце приложения и надо в них хорошо разбираться.

Это если ты планируешь работать с SQL конечно. Если у вас NoSQL то стоит сделать упор на изучение того что там используется.

>>523933

Я этот туториал первый раз вижу.

>>523932

нет, тебе
#636 #523939
>>523938
Спасибо, порешаю. Нет, там не NoSQL, обычный MySQL, nginx и memcached.
#637 #523953
>>523931

>Сказали, что недостающему доучат, главное что основы знаю (тут отдельное спасибо ОПу за хорошие задания и внятные объяснения).


Ну тогда я спокоен за свою судьбу, лол. И спасибо тебе, что отписался.
#638 #523981
>>523931
хоть один фреймворк знаешь?
#639 #523982
Ссу на лузеров, проматывающих нулевую до самого конца, чтобы найти тред, когда создан новый.
#640 #523983
Куда в html можно спрятать айдишник? Допустим, у меня есть список каких-то записей, по клике на запись должен идти аякс-запрос и сбоку выводиться подробная информация из базы по этой записи. Дело за малым, нужно передать айдишник, чтобы по нему выдернуть нужную информацию.
Первая мысль естественно сохранять его в какой-нибудь невидимый элемент (или добавить свой атрибут).
Но может быть есть более корректные способы?
Я бы загуглил, не знаю что писать в поиске.
#641 #523984
>>523983
array $_GET?
#642 #523989
>>523984
Какой гет в html? Я говорю о клике по дом-элементу.

Ну ладно, положу айдишник в какой-нибудь дополнительный атрибут. Подозреваю, что оп назовет это говнокодом, и мне придется переписывать.
Кстати, если прописать свои атрибуты в html, валидаторы будут ругаться?
...
Мне даже пришло в голову проверить: будут.
Error: Attribute fid not allowed on element div at this point.
Куда же тогда его засунуть?
#643 #523991
>>523982

А ты сам как сюда попал?

>>523983

Либо в data- аттрибуты либо в код вызова обработчика:

<button data-id="121212" data-name="asdada">Нажать!</button>

<button onclick="sendSomething(123, 'sadad')">Нажать!

При вставке данных в HTML/JS не забывай про грамотное испльзование htmlspecialchars/json_encode.

>>523989

Data-атрибуты специально для этого придуманы и HTML5 валидатор должен их пропускать.
#644 #523992
>>523991
О, действительно, я не знал.
http://htmlbook.ru/blog/atribut-data

>htmlspecialchars


Ну это как я понял только если мы собираемся выводить данные, записанные в базу от пользователя.
Я думаю, что в случае с айди или временной меткой это можно опустить (?полувопрос)
#645 #524006
>>523992

Нет, ты должен любые данные обрабатывать с помощью htmlspecialchars. Например символ & ты должен выводить как &amp; а < как < — это правила HTML.

> Я думаю, что в случае с айди или временной меткой это можно опустить


Если число то можно пропустить их через intval, но с htmlspecialchars будет логичнее. И это для тебя должно быть привычкой. А если ты будешь использовать современный шаблонизатор вроде twig, он делает это сам.

Прочитай-ка мой урок про XSS:

https://github.com/codedokode/pasta/blob/master/security/xss.md

А также про html сущности:

http://www.w3.org/International/questions/qa-escapes.ru.php#use
#646 #524008
>>524006

> А > как & lt ;

#647 #524009
>>524008

Опять перепутал < и >, ну и фиг с ним.
#648 #524022
Смотрите, я ОП-хуй, я настолько уебок, что не в состоянии создать новый тред ранее, чем неделя после бамплимита, все потому что я криворукий тормоз. Поэтому сижу и как обоссыха отписываюсь в упавшем в бамплимит треде, лол, каждый раз прокручивая до десяти страниц вниз, вот это я лузерок, дети, смотрите внимательнее, во что превратитесь лет через десять безрезультативной дрочки пхп.
#649 #524023
>>523991
специально вниз проматал, чтобы тыкнуть тебя носом в лужу.
#650 #524025
>>524022
Ты из дурки пишешь что ли?
650 Кб, 1344x813
#651 #524061
>>524022
Ты так не умеешь?
#652 #524230
ОП, я допилил, наконец, абитуриентов: https://github.com/blackberryJam/abiturients
#653 #524231
>>523931
А у тебя что-то вроде портфолио было? Ну там задачки ОПовские, файлообменники, студенты и т.п.
#654 #524234
>>524231
Нет, ничего не было. Опыт эникеем был пару лет в шараге. Взяли только потому что хорошо на интервью отвечал про все эти отличия абстрактных классов от интерфейсов и трейтов от closures. Вопросов было реально много, практически по всем темам, БД, ООП, новые фичи PHP, css/html, javascript, jquery, git, системы деплоймента, юниттесты, линукс, memcached всякие, nginx, фреймворки, библиотеки, jira. Плавал я только в БД и фреймворках, остальное из ОПовых объяснений и чтения документации более-менее знал. В итоге сказали, что знаю больше, чем средний выпускник института, который к ним приходит, поэтому берут. Сказали еще, что не любят учить всему по сто раз заново с азов, поэтому когда готовый уже приходит и можно сразу сажать с заданиями в трекер разбираться, это плюс большой.
#655 #524250
>>523981
Нет. Wordpress ковырял под темплейты. Ну у них сказали фреймворка сейчас тоже не будет, избавляются постепенно, переписывая модули на чистый php.
#656 #524262
Только что доделал последнее задание по CSS, а именно сверстал макет. В каком виде мне нужно прислать его на проверку. Загрузить зипом на ргхост или записать код на каком-либо сайте?
#657 #524263
>>524262
https://jsfiddle.net
там css и html в соответствующие поля вбиваешь
#658 #524264
>>524262
jsfiddle, github
#659 #524265
>>524263
Это тупо, лучше github pages. там довольно легко залить.
#660 #524328
>>524262

http://maketi.esy.es/

В общем я попытался разобраться сначала с гитхамбом, но не смог, на jsfiddle я не понял как картинки добавлять, да и экран там не полный (или можно на полный развернуть, но я ни тем, ни другим сервисом не пользовался до этого), поэтому я решил сразу прислать вам в виде сайта, а вы уже сможете открыть код и посмотреть.
css я в индексном файле оставил, но ясное дело, что для него отдельный файл нужно создавать. Так же я не смог разобраться со словами в шапке, при большом уменьшении
экрана они скатываются вниз, так же я резко смещается вверх блок с серым фоном, который находится под портфолио, если уменьшается количество отображаемых работ в портфолио (при выборе категории работ ALL GRAPHIC и т.д.).
Хотелось бы услышать замечания по работе, так же помощь по устранению тех ошибок которые я совершил, но больше всего я хочу услышать о том как я пишу. Многое слышал о требованиях к читаемости кода. Вот и хочу знать читаем он у меня или нет. А то я просто новичок и это моя первая работа, перед этим только делал остальные 12 заданий из ссылки в ОП посте (сюда их правда не присылал, показывал их другу студенту-программисту, ОПа лишний раз нагружать уже не хотел).
#661 #524357
>>524328

><div style="height: 50px">


За такое в продакшне руки отрывают. Вам дали css файл, так нет, вылавливайте разрабы потом по коду эти инлайны.

><center>


>The <center> tag is not supported in HTML5. Use CSS instead.

#662 #524393
http://hh.ru/vacancy/14151832
Как думаете, это битрикс-параша или нет?
#663 #524403
>>524393

>http://appatbox.com/processing/bitrix/


Ясное дело. К тому же жмотистая веб-студия без перспектив, судя по объяве. Идти стоит, только если совсем отчаялся работу найти.
#664 #524407
Так, походу сначала отписал в "неканоничный" тред, сказали, что истиный ОП там не сидит.
Так что вот так : >>524402 .

Решение одной из задач.
#665 #524409
>>524403
Но ведь битрикс используется даже в студии Лебедева.
#666 #524415
>>524393
>>524403

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

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

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

Программированию нельзя обучиться, повторяя чьи-то действия, это (пока еще) не работа сборщика на конвеере. Здесь надо уметь думать.

Справедливости ради, мой учебник тоже пытается выглядеть простым, чтобы заманить побольше читателей. Но в дальнейшем более сложные задачи отсеивают тех кто просто хочет повторять увиденное.
#667 #524416
Я вот не пойму как вообще с этими цмс работают вручную. Довелось с одной столкнуться, я даже не смог найти где храниться хтмл код страницы, хотя казалось бы, что может быть проще? Но нет, все инклюды прочекал в пхп файле главной страницы, нигде ничего нет.
#668 #524417
>>524230
Упс, а про неймспейсы-то забыл!
Скоро доделаю.
#669 #524420
>>524416

Содержание страницы обычно в базе, шаблоны на диске. Надо было почитать докуменацию наверно.
#670 #524422
>>524416
html код обычо можно найти через админку цмс. Там он не всегда в явной форме написан, иногда бывает собственный язык разметки, который в админке прикрепляется к страничке в виде ее темплейта. Вот этот темплейт открываешь и редактируешь на языке цмс, по нему длинная дока есть. А цмс уже его преобразует в html при выводе.
#671 #524423
>>524415
А ты бы советовал туда сходить? Или лучше подтянуть свой уровень и искать места получше?
#672 #524426
>>524423
В дешевой веб-студии обычно под копирку за пару дней лепят однотонные сайты на битриксе или вордпрессе каком-нибудь. Особо многому ты там не научишься, потому что ни ООП, ни работы с БД, ни оптимизаций там не будет, будет сплошной копипаст одного и того же шаблона изо дня в день. Идти стоит, если бывают проекты, которые от месяца занимают и где в самом деле программировать надо. Так что если пойдешь, разузнавай на интервью, чем именно они занимаются, что за тулзы используют и какого типа проекты бывают.
#673 #524430
>>524426

Может он будет какие-то внтренние тулзы писать. Стоит идти или не стоит, зависит от твоей ситуации, с другой стороны слишком долго учиться тоже не очень полезно.
#674 #524432
Таки слишком резкий переход от задачек к базе абитуриентов. Я щас задание прочел и сижу ахуеваю.
Как я понимаю в маппер нужно запихнуть все функции, которые работают с БД напрямую. А в классе абитуриента тогда что останется, только переменные? В маппере для обновления каждого свойства абитуриента нужно делать разные функции, или это все можно объединить в одну функцию? И не совсем понятно как выводить поля с абитуриентами в таблицу. Их всех нужно будет в один массив запихнуть или перебирать по одному и выводить?
Или может еще что-то можно почитать или сделать, прежде чем начинать это задание делать?
#675 #524433
>>524432

>Как я понимаю в маппер нужно запихнуть все функции, которые работают с БД напрямую.


Маппер это объект который загружает и сохраняет другие объекты (Студентов) в/из базы. Так что да, работать с базой надо через него.

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


да

> В маппере для обновления каждого свойства абитуриента нужно делать разные функции, или это все можно объединить в одну функцию?


Можно объединить. На практике тебе не нужно обновлять отдельные свойства, тебе надо обновить все и функция выглядит примерно так:

$mapper->save($abiturient);

> И не совсем понятно как выводить поля с абитуриентами в таблицу. Их всех нужно будет в один массив запихнуть или перебирать по одному и выводить?


Что значит отдельные поля? У тебя есть массив объектов-абитуриентов, в шаблоне перебираешь их в цикле и выводишь:

<?php foreach (...): ?>
Имя: <?= htmlspeialchars($abiturent->name) ?>

И так далее.

> Или может еще что-то можно почитать или сделать, прежде чем начинать это задание делать?


Прочитать внимательно примечания к задаче.
#676 #524438
>>524415

Эмм, а в чем принципиальное отличие видеоуроков от текстовых? Все тоже самое, только более подробно и наглядно. Ну и плюс иногда наблюдать за тем как шарящий человек работает гораздо полезнее, чем зубрить голую теорию.
#677 #524469
Поясните мне пожалуйста за хостинг сайтов. Вот сделал я например свой первый сайт и хочу, чтобы его увидел весь мир. Как это организовать? Могу я например для этого выделить дома системный блок и хостить с него?
#678 #524472
>>524469
На heroku.com зарегай бесплатный акк и погоняй там свой сайт, так проще всего. Потом проапгрейдишь до платного, если понадобится. Кроме heroku еще горы бесплатных хостингов есть, вот тебе целая куча http://www.free-webhosts.com/free-php-webhosting.php Дома скорее всего не сможешь, многие провайдеры блочат порт 80, скорость на отдачу низкая, ip меняется, домашний роутер кучу одновременных запросов не выдержит.
#679 #524474
Где можно почитать про всякие dhcp, mac-адреса и прочие сисадминские вещи? А то стыдно такое не знать.
Что происходит, если в настройках роутера поменять мак-адрес wan?
#680 #524478
>>524474
http://linkmeup.ru/blog/11.html

>Что происходит, если в настройках роутера поменять мак-адрес wan?


Сменится мак роутера. Если провайдер привязывает акк к маку, то не сможешь больше зайти в инет, пока провайдеру новый мак-адрес не сообщишь. Если не привязывает, то просто будет оборудование провайдера новый мак-адрес видеть. В инет твой мак-адрес не уходит, теряется на первом же роутере.
#681 #524479
>>524415

>видеокурсы для программиста это абсурд


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

У тебя в универе была высшая математика? Что, сразу после лекций гнали на экзамен решать интегралы? Или может все-таки были практические занятия?
В конце концов психически здоровым людям всегда приятнее воспринимать информацию на слух, слышать голос другого человека.
#682 #524482
>>524479

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



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

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


О типах людей слышал? Есть визуалы, есть аудиалы, есть кинестетики. Программисты как раз чаще визуалы. На слух воспринимаются подобные темы визуалами довольно тяжело.
#683 #524483
>>524478

> http://linkmeup.ru/blog/11.html


Задротская нечитабельная херня.

>Мы понимаем, что для новичков «OSI» и «TCP/IP» — это страшные слова.


Самоутверждение.

>Начнём с постановки задачи. Есть некая фирма, занимающаяся, допустим, производством лифтов, идущих только вверх, и потому называется ООО «Лифт ми ап». Расположены они в старом здании на Арбате, и сгнившие провода, воткнутые в пожжёные и прожжёные коммутаторы времён 10Base-T не ожидают подключения новых серверов по гигабитным карточкам. Итак, у них катастрофическая потребность в сетевой инфраструктуре и денег куры не клюют, что даёт вам возможность безграничного выбора. Это чудесный сон любого инженера. А вы вчера выдержали собеседование, и в сложной борьбе по праву получили должность сетевого администратора. И теперь вы в ней первый и единственный в своём роде. Поздравляем!



Что за галиматью я читаю? Я спросил про основные термины из области системного администрирования, ты мне подсунул какую-то парашу.
#684 #524484
>>524482

>аудиалы


Самоназвание аутистов?
Любой человек, неспособный к общению и информационному обмену, это больной человек.
#686 #524493
>>524487
О, это уже получше. Сразу видно, профессиональные преподаватели, снисходят до объяснения тех терминов, которые употребляют, а не посылают на гугл или в википедию.
Вот допустим в википедии я хочу почитать про эту самую модель OSI, о которой я так много слышал. Что я вижу?

>Сетевая модель OSI (базовая эталонная модель взаимодействия открытых систем, сокр. ЭМВОС; 1978 год) — сетевая модель стека сетевых протоколов OSI/ISO (ГОСТ Р ИСО/МЭК 7498-1-99).


Ну офигеть теперь. Я не знаю, что они подразумевают под "моделью", что такое "открытые системы", что такое "стек", что такое "протокол" понимаю смутно, имея базовые знания только по http. Как ты думаешь, полезна для меня эта статья?
У интуита по крайней мере делаются попытки объяснять те важные термины, которые они употребляют.
В первой же лекции например дается определение открытой системы. http://www.intuit.ru/studies/courses/2/2/lecture/28
Так что здесь ни к чему не могу придраться. Придется читать.
Жаль только, что в текстовом виде. В аудио/видеоформате я мог бы послушать и на толчке, и за едой.
#687 #524495
>>524493
В аудио вот это можешь послушать
http://nnm-club.me/forum/viewtopic.php?t=869128
#688 #524501
>>524495
Спасибо, остановлюсь таки на интуите.
У специалиста действительно то, что ты говорил: затягивание времени с целью выкачать деньги, много пауз, разговоры не по теме, иногда сёрбанье кофейка и сморкание в микрофон.
И это у Борисова, который там лучший лектор.

Но объясняет хорошо, без его курсов я бы не осилил самостоятельно учиться по документации, как ты советуешь.
#689 #524502
>>524493

> что такое "открытые системы"


https://ru.wikipedia.org/wiki/Открытая_система_(информатика)

> что они подразумевают под "моделью"


https://ru.wikipedia.org/wiki/Эталонная_модель

>что такое "стек"


https://ru.wikipedia.org/wiki/Стек

> что такое "протокол" понимаю смутно


https://ru.wikipedia.org/wiki/Протокол_передачи_данных

Все ответы есть в той же википедии.
#690 #524516
>>524493

Протокол это описание способа и языка передачи данных. Ну в случае интернета, описывается например формат пакета с данными, из каких байтов он состоит и что они обозначают. Какие пакеты можно передавать и как. Вот например в статье про протокол IP приведен пример IP-пакета: https://ru.wikipedia.org/wiki/IP#.D0.9F.D0.B0.D0.BA.D0.B5.D1.82

Стек это вот такая штука:

http://www.usaypt.org/USIYPT%202014/USIYPT14%20Problems/USIYPT14problems%20images/Magnet%20Stack.png

Есть еще структура данных стек, вот такая: http://www.cs.cmu.edu/~adamchik/15-121/lectures/Stacks%20and%20Queues/pix/stack.bmp которая тут отношения никакого не имеет.

В данном случеа «стек протоколов» значит что один протокол работает поверх другого, а другой поверх третьего. Например протокол HTTP соединяется с сервером с помощью TCP, а тот использует IP для передачи пакетов по интернету, а IP использует какой-то протокол физического уровня (например Ethernet, передающий данные в виде электрических сигналов в кабеле).

Модель OSI соответсвтенно разделяет стек (набор использующих друг друга) протоколов на уровни, начиная от низкоуровневых, физичсеских, опсиывающий принципы передачи данныех по кабелю, оптоволокну или телефонной сети, и до высокоуровневых, с которыми работает приложение.

OSI это абстрактная модель, и в реальности часть уровней из нее может не использоваться.

Мы разбиваем протоколы на уровни чтобы разбить на части описание способа передачи данных по сети (иначе все будет слишком сложно) и дать возможность подменять нижележащие протоколы не трогая вышележащие. Например, если мы заменим кабель на оптоволокно, меняется только протокол физического уровня (который определяет как биты кодируются электрическими сигналами или лазерными импульсами), а вышележащие протоколы мы используем те же так как они не знают по какой среде передается сигнал, а просто передают протоколу физического уровня набор байт которые надо передать.
#691 #524520
Проверь мой файлообменник. Боюсь, я там сильно наговнокодил, особенно когда изобретал регистрацию. Но в целом я доволен, хоть и написал велосипед, но появилось хоть какое-то понимание.
https://github.com/nsdvw/file-sharing

Пробовал выложить на бесплатный хостинг, но там (hostinger) куча проблем. InnoDB видите ли они не поддерживают. Пришлось убрать внешние ключи и транзакции. Все равно почему-то не работает (я имею ввиду, нельзя загрузить файл). Залил пока несколько файлов по ftp, залил базу, чтобы было хоть что смотреть. Библиотека gd, которая у меня рисует превью для картинок, у них тоже походу какая-то неправильная.
Короче, ОНО НЕ РАБОТАЕТ, а куда смотреть и что исправлять не знаю. phpinfo очевидно, но мне эта информация ни о чем не говорил. А хотелось бы разбираться в этих наскальных надписях.
http://filesharing.pe.hu/info.php
В логах ничего нет. Про логгирование я кстати тоже не в курсе. Мне нужно что-то прописывать в коде, чтобы велись логи, или они всегда есть у администратора, только нужно ждать когда их скопируют мне в папку?

В чем может быть причина? Какие еще кроме транзакций и внешних ключей отличия InnoDB от MyISAM?
Что я еще использовал:
finfo, getId3, mod_rewrite
Да нет, эти вещи вроде не могут вызвать проблем.
Там что-то именно с загрузкой файлов. Только что отключил джаваскрипт, который аяксом отправлял запрос, выдает теперь голую страницу с надписью
Access denied.
Интересно.

О, теперь слим выдает ошибку Only variables should be passed by reference
При чем тут передача переменных по ссылке? Нету там такого.

Файлы не скачиваются, вернее сохраняются пустышки по 0 байт.

Хуйня короче какая-то.
31 Кб, 1361x241
#692 #524524
>>524520
О, да у нас тут 500 ошибка. Черт его знает, что это значит.
#693 #524525
>>524520
На heroku.com попробуй.
81 Кб, 997x507
99 Кб, 861x658
#695 #524539
>>524528
А, ну в целом как я и думал, прежде всего транзакции и внешние ключи.

Так что тут не в этом дело.
Тут именно что-то с загрузкой файлов. Не понимаю. Где там у меня ссылка?

ААА.... в bindParam передается в качестве аргумента результат работы другой ф-ции, в данном случае json_encode.
Кажется, оп говорил мне об этом когда-то, но я прослушал. Да и у меня на локалочке все работает, а у этих редисок видите ли нет. Где находится настройка, которая отвечает за это дело? Как вообще привести свой локальный сервер к "стандартному" что ли виду?
Ставил апт-гетом на убунту, ничего не менял.
#696 #524547
>>524328

UPD: Переделал сайт. Исправил многие ошибки. Сделал контент статичным и задал ему ширину в 900 пикселей. Многие проблемы исчезли из-за этого.

>>524357

><div style="height: 50px">


Убрал все такое. Больше не буду использовать.

><center>


Заменил, использовать не буду больше.
#697 #524555
>>524539
Короче, теперь все работает, кроме скачивания.
Потому что сторонний модуль x-sendfile.
Плюс у них оказывается upload_max_filesize целых 8Mb. Какая щедрость. Там наверное еще лимит использования диска в районе 1gb. Нет, целых 2gb.
>>524525
Надо будет попробовать это ваше облако.
#698 #524566
>>524516
Ну вот, нормально объяснил, это я понимаю. Если бы так везде писали.

Ты эти пасты сохраняй, а еще лучше добавляй к своему бложику на гитхабе или народ.ру.
Я например физически не в состоянии запоминать все с первого раза, нужно перечитывать по несколько раз.
#699 #524570
Нужно реализовать встраивание ютуб видео на сайт, как лучше это делать?
#700 #524577
>>524570
Под самим видео на ютубе есть ссылка поделиться->html-код. Там получаешь готовый айфрейм, который можно скопипастить. Если автор видео не запретил встраивание, конечно.
В cms должны быть всякие виджеты, или как они там называются. В вордпресс это шорткод embed https://codex.wordpress.org/%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2
#701 #524580
Аноны, я не успею сегодня уже ничего проверить, решайте пока задачки, давайте я завтра попробую, очень занят сейчас, буду сейчас до вечера сидеть работать и завтра может тоже.

>>524520

> В логах ничего нет. Про логгирование я кстати тоже не в курсе


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

Но бесплатный хостинг на то и бесплатный чтобы не заморачиваться такими вещами: http://www.hostinger.ru/baza-znaniy/615.html

Но судя по phpinfo это неверно и логи все же ведутся.

Ты можешь попробовать задать путь к логу явно, указав в начале index.php:

ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/log.txt');

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

> InnoDB видите ли они не поддерживают.


Бесплатный хостинг такой бесплатный.

> а куда смотреть и что исправлять не знаю


Либо в логи либо на крайний случай включить display_errors, поставить error_reporting(-1) и отлаживать.

> Какие еще кроме транзакций и внешних ключей отличия InnoDB от MyISAM?


http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D1%8F+innodb+myisam

> О, теперь слим выдает ошибку Only variables should be passed by reference


Посмотри в каокй строке и какой там код. Это может быть вызвано старой версией php например.

> Файлы не скачиваются, вернее сохраняются пустышки по 0 байт.


Потому что нет модуля sendfile. Можешь сделать проверку есть ли такое расширение на сервере ( функция http://php.net/manual/ru/function.apache-get-modules.php но она может быть запрещена администратором) и если нет то отдавать файл через readfile.

> А хотелось бы разбираться в этих наскальных надписях.


Это просто информация о конфигурации, включенныхмодулях, и настройках, заданных для php. Они описаны например тут: http://php.net/manual/ru/ini.php

http://filesharing.pe.hu/info.php
Сделай поиск по слову error:

> error_log\t/home/u448009642/.logs/php_error.log


Вот и ответ где логи. Имей в виду что папки с точки в линуксе невидимые и могут не везде показываться (на доступ это не влияет).

> error_reporting\t32759


Я бы поставил E_ALL на всякий случай

>>524524

500 ошибка это как правило ошибки или запрещенные директивы в .htaccess

>>524539

В bindParam нельзя передавать выражения. Иди почитай мануал для начала: http://php.net/manual/ru/pdostatement.bindparam.php

Вообще в 99% случаев нужен bindValue (в которой можно передавать любые выражения), зачем ты вообще тут bindParam используешь? Он используется обычно для вызова хранимых процедур, чтобы база могла вернуть какое-то значение, а оно бы записалось обратно в привязанную переменную. тебе это вообще не нужно.

В многих статьях в интернете тоже кстати bindParam вместо bndValue используют — их авторы неучи-копипастеры.

> . Да и у меня на локалочке все работает, а у этих редисок видите ли нет.


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

> Как вообще привести свой локальный сервер к "стандартному" что ли виду?


Настройки по умолчанию, можно включить display_errors либо читать логи, error_reporting поставить в E_ALL или -1 (фиксировать любые ошибки).

>>524547

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

>>524555

Для тестирования 8 мб хватит

>>524570

1) https://developers.google.com/youtube/player_parameters?hl=ru
2) универсальный способ с использованием стандарта oembed: http://oembed.com/ http://habrahabr.ru/post/141303/
#701 #524580
Аноны, я не успею сегодня уже ничего проверить, решайте пока задачки, давайте я завтра попробую, очень занят сейчас, буду сейчас до вечера сидеть работать и завтра может тоже.

>>524520

> В логах ничего нет. Про логгирование я кстати тоже не в курсе


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

Но бесплатный хостинг на то и бесплатный чтобы не заморачиваться такими вещами: http://www.hostinger.ru/baza-znaniy/615.html

Но судя по phpinfo это неверно и логи все же ведутся.

Ты можешь попробовать задать путь к логу явно, указав в начале index.php:

ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/log.txt');

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

> InnoDB видите ли они не поддерживают.


Бесплатный хостинг такой бесплатный.

> а куда смотреть и что исправлять не знаю


Либо в логи либо на крайний случай включить display_errors, поставить error_reporting(-1) и отлаживать.

> Какие еще кроме транзакций и внешних ключей отличия InnoDB от MyISAM?


http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D1%8F+innodb+myisam

> О, теперь слим выдает ошибку Only variables should be passed by reference


Посмотри в каокй строке и какой там код. Это может быть вызвано старой версией php например.

> Файлы не скачиваются, вернее сохраняются пустышки по 0 байт.


Потому что нет модуля sendfile. Можешь сделать проверку есть ли такое расширение на сервере ( функция http://php.net/manual/ru/function.apache-get-modules.php но она может быть запрещена администратором) и если нет то отдавать файл через readfile.

> А хотелось бы разбираться в этих наскальных надписях.


Это просто информация о конфигурации, включенныхмодулях, и настройках, заданных для php. Они описаны например тут: http://php.net/manual/ru/ini.php

http://filesharing.pe.hu/info.php
Сделай поиск по слову error:

> error_log\t/home/u448009642/.logs/php_error.log


Вот и ответ где логи. Имей в виду что папки с точки в линуксе невидимые и могут не везде показываться (на доступ это не влияет).

> error_reporting\t32759


Я бы поставил E_ALL на всякий случай

>>524524

500 ошибка это как правило ошибки или запрещенные директивы в .htaccess

>>524539

В bindParam нельзя передавать выражения. Иди почитай мануал для начала: http://php.net/manual/ru/pdostatement.bindparam.php

Вообще в 99% случаев нужен bindValue (в которой можно передавать любые выражения), зачем ты вообще тут bindParam используешь? Он используется обычно для вызова хранимых процедур, чтобы база могла вернуть какое-то значение, а оно бы записалось обратно в привязанную переменную. тебе это вообще не нужно.

В многих статьях в интернете тоже кстати bindParam вместо bndValue используют — их авторы неучи-копипастеры.

> . Да и у меня на локалочке все работает, а у этих редисок видите ли нет.


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

> Как вообще привести свой локальный сервер к "стандартному" что ли виду?


Настройки по умолчанию, можно включить display_errors либо читать логи, error_reporting поставить в E_ALL или -1 (фиксировать любые ошибки).

>>524547

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

>>524555

Для тестирования 8 мб хватит

>>524570

1) https://developers.google.com/youtube/player_parameters?hl=ru
2) универсальный способ с использованием стандарта oembed: http://oembed.com/ http://habrahabr.ru/post/141303/
#702 #524581
>>524577

Еще есть спецификация oembed, если ее поддерживать то можно видео с любого совместимого сайта встраивать:

http://habrahabr.ru/post/141303/
#703 #524584
>>524580
Все 12 задач по CSS у меня решены, только решения я сюда не присылал, их проверял мой знакомый студент-программист. А насчет 4го блока странно, у меня ни в одном браузере такого нету и у двух моих друзей которых я просил проверить работоспособность тоже ничего не крашилось.
#704 #524590
>>524547

Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние. Можно использовать невидимые радиокнокпи + css3.

Код из блока style надо вынести в внешний css-файл и подключать через тег <link>

> <img src="img/rss.png" class="boll1">


Все картинки относящиеся к дизайну надо делать через background-image в CSS. Тег img используется только для картинок в содержимом статьи (фото, иллюстрации) или в твоем случае, для каритинок в портфолио.

Мелкие однотипные иконки желательно объединить в css спрайт.

Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons

> "bb_first_line


Обычно через дефисы пишут идентификаторы в CSS

> <div class="text1">


>\t\t\t<b>Our Features Works</b>


Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6

> overflow-x:hidden;


Либо объясняй зачем это либо удаляй

> .shapka {


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

> font: 12px "Open Sans", Arial, sans-serif;


Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.

> .second_block


Нужно более понятное и объясняющее название

> <p><a name="link_portfolio"></a></p>


Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?

> GRAPHIC


Капс лок надо делать не в тексте а через text-transform

В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.

> <div class="clear"></div>


Почитай про clearfix и microclearfix hack: http://nicolasgallagher.com/micro-clearfix-hack/

В общем, тебе тут еще много чего исправлять.
#704 #524590
>>524547

Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние. Можно использовать невидимые радиокнокпи + css3.

Код из блока style надо вынести в внешний css-файл и подключать через тег <link>

> <img src="img/rss.png" class="boll1">


Все картинки относящиеся к дизайну надо делать через background-image в CSS. Тег img используется только для картинок в содержимом статьи (фото, иллюстрации) или в твоем случае, для каритинок в портфолио.

Мелкие однотипные иконки желательно объединить в css спрайт.

Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons

> "bb_first_line


Обычно через дефисы пишут идентификаторы в CSS

> <div class="text1">


>\t\t\t<b>Our Features Works</b>


Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6

> overflow-x:hidden;


Либо объясняй зачем это либо удаляй

> .shapka {


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

> font: 12px "Open Sans", Arial, sans-serif;


Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.

> .second_block


Нужно более понятное и объясняющее название

> <p><a name="link_portfolio"></a></p>


Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?

> GRAPHIC


Капс лок надо делать не в тексте а через text-transform

В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.

> <div class="clear"></div>


Почитай про clearfix и microclearfix hack: http://nicolasgallagher.com/micro-clearfix-hack/

В общем, тебе тут еще много чего исправлять.
#705 #524591
>>524584

А ты выложи на jsfiddle или jsbin или codepen, мы может заметим что-нибудь пропущенное.

>>524584

Я потом посмотрю почему. У меня шрифта open sans нет и может быть текст имеет другие размеры.
#706 #524592
>>524547

я имею в виду, кнопки фильтра должны оставиться черными после нажатия.
#707 #524595
>>524539

> mime_type


> mediaInfo



Надо быть последовательным и использовать единый стиль
#708 #524616
Чем Mongodb от Mysql отличается?
#710 #524734
ОП, ты ведь наверняка наслышан про ElasticSearch, а может даже сам использовал.

Собираюсь пилить faceted search на базе примерно 150к записей. Но не знаю на чем, ElasticSearch или Sphinx.

Можешь что-то посоветовать? Я пока склоняюсь к первому, но материала кроме официальной документации хрен найдешь.
#711 #524805
>>524230
>>524417
Всё, перекроил под неймспейсы: https://github.com/blackberryJam
#712 #524869
>>524734

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

С ES не работал.
#713 #524906
>>524650
Выходит MongoDB вообще нигде не нужен? Практически везде же есть реляционность данных и все преимущества перед MySQL исчезнут.
#714 #524957
>>524906

Вот тут описаны преимущества монго дб: http://www.mongodb-is-web-scale.com/

А вообще, на монге можно выжать большую производительность (пожертвовав надежностью, транзакциями и связями) и она масштабируется на несколько серверов, если например ты делаешь высоконагруженную игру для соцсети то может быть она тебе поможет, хотя я не использовал ее в таких сценариях (но данные о платежах я бы все же хранил в SQL базе). Тут стоит почитать доклады компаний типа мэйл ру или разработчиков игр которые такие нагруженные приложения делают и посмотреть что они исопльзуют. Справедливости ради, у MySQL тоже есть какой-то драйвер для испльзования ее в режиме NoSQL и работы с InnoDB напрямую:

HandlerSocket - http://habrahabr.ru/post/239637/

Ну и у MySQL тоже есть кластер и он выдает неплохие цифры в бенчмарках в NoSQL режиме (и он вроде бесплатный): http://www.mysql.com/why-mysql/benchmarks/mysql-cluster/

Вообще по моему монга это больше какая-то хипстерская и экспериментальная штука (мое оценочное суждение).
#715 #524965
>>524957

перевод текста про преимущества монги: http://habrahabr.ru/post/204392/
#716 #524973
>>524957
>>524965
Спасибо, все понятно с монгой теперь. А что про Postgresql? Лучше он Mysql с дополнениями или сравнимы? Вот тут пишут Postgresql монгу по производительности уделал и всем его теперь юзать
http://www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality

Чому тогда до сих пор везде Mysql в основном в объявлениях?
#717 #525061
Аноны, тут вакансию вбросили, может кого из вас заинтересует или вы просто прокомментировать захотите (внезапно, вакансия запощена вконтакте): https://vk.com/topic-91062134_31717797
#718 #525062
>>525061

>Senior


Тут даже мидлов нет, кому это пригодится?
#719 #525064
>>525062

Ну держи миддила: http://e4e5group.com/#vacancies

Просто мне эти ссылки в рекламе показываются, я подумал, что людям деньги зря тратить, я их бесплатно (увы:( ) попиарю.
#720 #525066
>>525062

Можешь оценить например какие технологии стоит изучать, посмотреть что другие кандидаты пишут.
#721 #525096
Имеется строчка кода.

<input type="radio" name="odin" checked="checked" id="vkl1"><label for="vkl1"><span class="b_all">ALL</span></label>

Как мне сделать ксс спана при чекнутом инпуте?

input:nth-of-type(1):checked + label > span не помогает, хотя с виду все выглядит рабочим.

Полный код здесь maketi.esy.es
#722 #525098
>>525096
Вопрос отменяется. Починил, проблема была в другом.
#723 #525121
Котаны, эта мразь не хочет на скобки реагировать, если их нет - не прокатывает, если есть - всё заебись. http://ideone.com/x8z04P
#724 #525124
>>525121
Скобки нужно экранировать бекслешем, как и любой спецсимвол типа \?, \.
Выучи сначала синтаксис, не хватайся за задачи, если не знаешь языка регулярных выражений.
Задачи нужно решать только для закрепления знаний.
#725 #525128
>>525124
Понял, спасибо. А вообще там так же написано что скобки можно искать так-же загнав их в квадратные, вот я и пытался с помощью квадратных.
#726 #525142
О, пока последние посты не далеко ушли от темы регулярных выражений, то спрошу: http://ideone.com/D4oFyu .

Как вытащить значение таблицы в таблице?
#727 #525266
Каноничный, не каноничный, совсем пизданулись.

ОП, или кто бы то ни было, что у вас есть по вордпресс? Хочу серьезно разобраться с этой сучкой, нужно все что есть.
#729 #525363
Может кто - нибудь подсказать почему не выводит число, только начал учить пхп и не могу понять в чем ошибка. http://ideone.com/DUDAu0
#730 #525364
>>525363

Ты значение функции mt_rand никуда не записал.
#731 #525368
>>525364
Извиняюсь за свою тупость, но можно чуть подробнее пожалуйста.
Все тот же школьник пытающийся в пхп
#732 #525369
>>525368

У тебя функция mt_rand () генерирует случайное число, но оно никуда не записывается. Запиши ее в переменную и тогда уже можешь выводить. Выглядеть это должно примерно так:

$mt_rand = mt_rand (1, 6);
#733 #525370
>>525369
Благодарю
#734 #525377
Оп нужна консультация по твоей задаче про кошек-мышек.
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse
Подскажи как реализовать поедание кошки мышкой?
Придется передавать ссылку на объект Field в объект Cat?
#735 #525378
>>525377

> Придется передавать ссылку на объект Field в объект Cat?


Эта ссылка нужна, как без нее кошка будет ориентироваться и знать кто где находится?

У тебя сдеално вот так:

> public function lookAround(SplObjectStorage $listOfAnimals)


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

Поедание можно сделать так: кошка при ходе на клетку, проверяет какое животное на ней нахолится:

- мышка — снимаем ее с карты и съедаем
- кошка или собака - значит ошибка в программе
#736 #525379
>>525377

> if (spl_object_hash($animal) === $this->hashOfAnimal) continue;


Объекты можно сравнивать через ===, тебе не нужны хеши: http://php.net/manual/ru/language.oop5.object-comparison.php
#737 #525441
>>524520
бамп

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

Первые пять заданий на html.
1) 1 задание.
Вариант 1 с дивами-обертками:
http://jsfiddle.net/c62zkf53/3/
Вариант 2 с box-sizing:
http://jsfiddle.net/c62zkf53/2/
Насколько я понял, первый вариант предпочтительнее, потому что префиксы браузеров -moz-, -webkit- и им подобные не любит валидатор.
2) http://jsfiddle.net/2zpm9mqa/
3) http://jsfiddle.net/t5pmcLb5/1/

>из тегов можно использовать только <em>


Это почему? При чем тут вообще em? Чтобы показать, что стили любого элемента можно переопределить?
Не понял задание.
4) http://jsfiddle.net/frksyugb/
Чего мне jsfiddle подсвечивает красным закрывающие теги </div>? А, у них там принято писать <br/> под xhtml, поэтому разметка ломается.
Не понял, как должен по заданию себя вести синий блок при малой ширине браузера.
5) http://jsfiddle.net/pnm2jrto/
#738 #525477
>>525441
6) http://jsfiddle.net/8mk9bc62/
7) Откуда-то берется один лишний пиксель. Пришлось поставить дробное число в паддинг. http://jsfiddle.net/3z6zpu9b/2/
8) > верстка должна позволять без изменения CSS дописать или убрать любое число абзацев, списков, заголовков, картинок и примечаний
Не понимаю, что имеется ввиду. Намек на выпадение плавающего блока? Решается заданием padding у параграфа.
http://jsfiddle.net/vhm7wnh7/
#739 #525498
Пагни, знакомлюсь с PHP по книжке Роберта Никсона "Создаем динамические вэб сайты с помощью..." и один пример у меня не работает :

?php
function longdate($timestamp)
{
\treturn date("l F jS Y", $timestamp);
}
?>
Аффтар грит, что функция должна вернуть дату в определенном формате, а у меня пусто (может пропущен echo или print в этом коде)?
#740 #525500
>>525498

>Пагни, знакомлюсь с PHP по книжке Роберта Никсона "Создаем динамические вэб сайты с помощью


Выбрасывай её нахуй.
#741 #525506
>>525500
Чому? ОРайли же и все такое.
#742 #525511
>>525506
Устаревший код, устаревший подход к программированию. ООП нет, паттернов нет, примеры кода - процедурная каша.
#744 #525516
>>525511
А как же тогда учиться?
#745 #525517
>>525516
В оп-посте есть учебник.
#746 #525527
>>525498
>>525500>>525511
>>525517
А все же, что не так в >>525498
коде? кроме лишних символов \t и недостающего<?
#747 #525529
>>525527
В коде описывается функция. Описывается, но нигде не вызывается. Сперва ты описал функцию, потом её надо вызвать, например хотя-бы так echo имяфункции(аргумент);
#748 #525530
>>525498

Надо вызвать функцию например написать ниже:

echo longdate(time());

В учебнике из Оп поста кстати это объясняется + есть урок по датам/времени в PHP: https://gist.github.com/codedokode/10539805
#749 #525588
http://learn.javascript.ru/number
Песец, просто песец! Сплошные "не баг, а фича".
#750 #525632
ОП, почему задачки по JS не в пример сложнее пхпшных?
#751 #525656
>>525632

Я бы не сказал что они сложные для знающего JS программиста. Может просто к ним не прилагается уроков которые постепенно ко всему подводят? А ты читаешь учебник на learn.javascript.ru? В нем все что нужно для решения задач, объясняется.
#752 #525657
>>525632

Если зашел в тупик, запости код и напиши где остановился, дадим подсказку или ссылку на мануал.
#753 #525663
>>525657
Ссылок на мануал будет достаточно. Я прочёл только первые три главы (Введение..Качество кода).
Смог родить только вот что: https://jsfiddle.net/xc616ono/

Это чудо работает только если выполняются следующие условия: 1) у нас один генератор; 2) его имя "generator".
#754 #525679
>>525663

Прочитай про локальные переменные и слово var: https://learn.javascript.ru/variables

Также, придется прочитать про замыкания. Это немного сложно но ты ведь не полный ноль, ты php знаешь и тебе можно давать вещи посложнее чем новичкам: https://learn.javascript.ru/closures

Если кратко то в JS любая функция в момент создания захватывает (замыкает в себе) ссылки на переменные снаружи нее. Вот пример:

function createNewFunc()
{
var i = 5; // внешняя по отношению к testFunc переменная
var testFunc = function () { return i; }; // создаем новую функцию
return testFunc;
}

var x = createNewFunc();
// в x лежит функция testFunc которая захватила ссылку на переменную i
var y = x(); // вызываем функцию
console.log(y); // 5

При этом разумеется в месте вызова функции переменная i не видна (так как это локлаьная переменная в createNewFunc):

console.log(i); // ошибка о несуществующей переменной

Прочти про замыкания и разбери этот пример.

То есть тебе придется пока начать с теории, прежде чем хотя бы первую задачу решить. Зато если ты это пройдешь то будешь хорошо понимать JS и он не будет вызыват удивления.
#754 #525679
>>525663

Прочитай про локальные переменные и слово var: https://learn.javascript.ru/variables

Также, придется прочитать про замыкания. Это немного сложно но ты ведь не полный ноль, ты php знаешь и тебе можно давать вещи посложнее чем новичкам: https://learn.javascript.ru/closures

Если кратко то в JS любая функция в момент создания захватывает (замыкает в себе) ссылки на переменные снаружи нее. Вот пример:

function createNewFunc()
{
var i = 5; // внешняя по отношению к testFunc переменная
var testFunc = function () { return i; }; // создаем новую функцию
return testFunc;
}

var x = createNewFunc();
// в x лежит функция testFunc которая захватила ссылку на переменную i
var y = x(); // вызываем функцию
console.log(y); // 5

При этом разумеется в месте вызова функции переменная i не видна (так как это локлаьная переменная в createNewFunc):

console.log(i); // ошибка о несуществующей переменной

Прочти про замыкания и разбери этот пример.

То есть тебе придется пока начать с теории, прежде чем хотя бы первую задачу решить. Зато если ты это пройдешь то будешь хорошо понимать JS и он не будет вызыват удивления.
#755 #525683
>>524590

>Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние.


Готово.

>Код из блока style надо вынести в внешний css-файл и подключать через тег <link>


Готово.

>Все картинки относящиеся к дизайну надо делать через background-image в CSS


Готово.

>Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons


Заменил.

>Обычно через дефисы пишут идентификаторы в CSS


Переделал.

>Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6


Переделал.

>overflow-x:hidden; Либо объясняй зачем это либо удаляй


Весь контент сайта я сделал шириной 900px, с ноутбука спокойно могу увеличить масштаб до 150% (дальше уже никому и не надо). Но при 150% появляется нижний бегунок который переводит влево-вправо на пару пикселей которые даже незаметны. Вот я и убрал его чтобы при 150% он не появлялся т.к. по сути не нужен, а только мешает. Но все-таки убрал эту строку и вернул бегунок.

>Не пиши транслитом


Все переписано, далее все буду писать на английском.

>Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.


Посмотрел как его подключить. Нужно добавить в папку с сайтом папку шрифтов которая весит 1.2мб. Стоит ли того или я делаю что-то не так? Смотрел здесь http://fonts4web.ru/opensans.html

>Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?


Заменил где возможно. Осталось только это
<input type="radio" name="button" checked="checked" id="button1"></input><label for="button1"><span class="button_all">All</span></label>
Не понимаю как отсюда убрать name, т.к. без него крашится.
Читал все в htmlbook.ru

>Капс лок надо делать не в тексте а через text-transform


Переделал.

>В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.


Переделал.

>Почитай про clearfix и microclearfix hack


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

Напомню, что загрузил все прямо на сайт maketi.esy.es
#755 #525683
>>524590

>Кнопки ALL GRAPHIC ILLUSTRATION MOTION надо сделать нажимающимися, чтобы они сохраняли свое состояние.


Готово.

>Код из блока style надо вынести в внешний css-файл и подключать через тег <link>


Готово.

>Все картинки относящиеся к дизайну надо делать через background-image в CSS


Готово.

>Имена классов мне не нравятся. Что за bool1? Давай нормальные читабельные имена вроде social-icons


Заменил.

>Обычно через дефисы пишут идентификаторы в CSS


Переделал.

>Тег b не используется так как внешний вид текста должен задаватся в CSS, а теги задают смысл этого текста. В днном случае текст это заголовок и должен использоваться один из тегов h1-h6


Переделал.

>overflow-x:hidden; Либо объясняй зачем это либо удаляй


Весь контент сайта я сделал шириной 900px, с ноутбука спокойно могу увеличить масштаб до 150% (дальше уже никому и не надо). Но при 150% появляется нижний бегунок который переводит влево-вправо на пару пикселей которые даже незаметны. Вот я и убрал его чтобы при 150% он не появлялся т.к. по сути не нужен, а только мешает. Но все-таки убрал эту строку и вернул бегунок.

>Не пиши транслитом


Все переписано, далее все буду писать на английском.

>Нужен @font-face инае шрифт не будет работать у тех у кого не установлен на компьютере.


Посмотрел как его подключить. Нужно добавить в папку с сайтом папку шрифтов которая весит 1.2мб. Стоит ли того или я делаю что-то не так? Смотрел здесь http://fonts4web.ru/opensans.html

>Уже лет 10 можно вместо name просто приписвыать атрибут id к любому тегу. Старый учебник читал?


Заменил где возможно. Осталось только это
<input type="radio" name="button" checked="checked" id="button1"></input><label for="button1"><span class="button_all">All</span></label>
Не понимаю как отсюда убрать name, т.к. без него крашится.
Читал все в htmlbook.ru

>Капс лок надо делать не в тексте а через text-transform


Переделал.

>В портфолио, лучше не делать по несколько копий каждой картинки, а помечать css классами к каким разделам она относится.


Переделал.

>Почитай про clearfix и microclearfix hack


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

Напомню, что загрузил все прямо на сайт maketi.esy.es
#756 #525686
>>525663

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

Также, ты делаешь странные вещи по моему, ты после вызова функции заменяешь ее на новую:

> generator = function() {


...

> generator = function() {


Это как-то неправильно и я толком сам не понимаю как это вообещ может работать.

Вместо alert лучше привыкай использовать console.log а то руки отвалятся на кнопки нажимать.
#757 #525689
>>525683

> Не понимаю как отсюда убрать name, т.к. без него крашится.


Я говорил что тег-якорь <a name> устарел. Сейчас любой элемент с атрибутом id является якорем.

Если ты откроешь исходный код например этой страницы https://ru.wikipedia.org/wiki/%D0%AF%D0%BA%D0%BE%D1%80%D1%8C то увидишь:

> <h2><span class="mw-headline" id=".D0.A3.D1.....D0.B9">Устройство и классификация якорей</span>



То есть id используется для обозначения якоря.

Сам атрибут name не устарел и в input конечно ничем заменить его нельзя и не требуется.

>>Почитай про clearfix и microclearfix hack


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


Твой способ требует добавлять отдельный див. Клеарфикс позволяет просто добавить класс на элеиент чтобы тот охватывал (растягивался по высоте) все флоаты внутри него. Это достигается за счет создания в конце дива псевдоэлемента ::after со свойством clear: both. То есть тоже добавляется элемент с clear, но средствами CSS, не загрязняя HTML лишними служебными элементами.

Раньше, до CSS3, HTML был загрязнен всеми добавочными элементами. Например, чтобы сделать тень или скругление, часто в код добавляли кучу дивов:

<div class="wrap">
<span class="top-left"></span>
<span class="top"></span>
<span class="top-right"></span>
<p>Контент</p>
</div>

Я помню, сам так делал давно.

Но с CSS3 большинство этих дивов не нужны и мы можем писать чистый HTML:

<h1>...</h1>
<p>....</p>

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

Кстати, иконку адреса и телефона в подвале можно сделать через псевдоэлемент :before. Сделай-ка, ты же с ними знаком по предыдущим задачам, верно?

> Напомню, что загрузил все прямо на сайт maketi.esy.es


Молодец, что так делаешь, удобно смотреть и проверять.
#757 #525689
>>525683

> Не понимаю как отсюда убрать name, т.к. без него крашится.


Я говорил что тег-якорь <a name> устарел. Сейчас любой элемент с атрибутом id является якорем.

Если ты откроешь исходный код например этой страницы https://ru.wikipedia.org/wiki/%D0%AF%D0%BA%D0%BE%D1%80%D1%8C то увидишь:

> <h2><span class="mw-headline" id=".D0.A3.D1.....D0.B9">Устройство и классификация якорей</span>



То есть id используется для обозначения якоря.

Сам атрибут name не устарел и в input конечно ничем заменить его нельзя и не требуется.

>>Почитай про clearfix и microclearfix hack


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


Твой способ требует добавлять отдельный див. Клеарфикс позволяет просто добавить класс на элеиент чтобы тот охватывал (растягивался по высоте) все флоаты внутри него. Это достигается за счет создания в конце дива псевдоэлемента ::after со свойством clear: both. То есть тоже добавляется элемент с clear, но средствами CSS, не загрязняя HTML лишними служебными элементами.

Раньше, до CSS3, HTML был загрязнен всеми добавочными элементами. Например, чтобы сделать тень или скругление, часто в код добавляли кучу дивов:

<div class="wrap">
<span class="top-left"></span>
<span class="top"></span>
<span class="top-right"></span>
<p>Контент</p>
</div>

Я помню, сам так делал давно.

Но с CSS3 большинство этих дивов не нужны и мы можем писать чистый HTML:

<h1>...</h1>
<p>....</p>

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

Кстати, иконку адреса и телефона в подвале можно сделать через псевдоэлемент :before. Сделай-ка, ты же с ними знаком по предыдущим задачам, верно?

> Напомню, что загрузил все прямо на сайт maketi.esy.es


Молодец, что так делаешь, удобно смотреть и проверять.
#758 #525690
>>525689

Кстати, говоря про добавочные элементы: в коде википедии спан это явно лишний добавочный элемент (возможно он для чего-то нужен). Чистый код выглядел бы так:

<h2 id="....">Устройство и классификация якорей</h2>

<p>текст</p>

Ты должен стремиться именно к такому.
#759 #525693
>>525683

Ну и я тебе напомню что HTML служит для семантической (смысловой) разметки текста. А оформление дложно быть в CSS. Потому когда ты ради оформления (иконки телефона) добавляешь спан или див, это не очень правильно. Правильнее использовать только CSS. Понятно, что иногда без лишних элементов никак, но тут простая ситуация и они не нужны.
#760 #525696
>>525679
>>525686
Ок, спасибо. Подучу JS и снова возьмусь за задачи.
331 Кб, 896x746
#761 #525697
>>525683

Если открыть инспектор в браузере (Ctrl + Shift + I) то можно увидеть что у тебя ссылки внизу криво спозиционированы. У ссылки есть активная невидимая область справа от кнопок (если навести мышь, она меняет форму). Это значит, ты что-то криво там сверстал, я как доберусь, посмотрю что именно.
#762 #525699
>>525696

А ты используешь робота-проверяльщика? Если используешь и обнаружишь что-то странное (например он принимает программу с ошибками) — пиши мне, я поправлю его.
#763 #525703
>>525699
Да, я собирался его использовать, но только в том случае, если мне кажется, что написанная программа удовлетворяет условиям (а такого пока не было).
74 Кб, 992x423
#764 #525753
1) Оп, почему такая реализация избавления от пробелов не работает(код и результат на пикче)? Я подозреваю, что конструкция вида $text{$i} обращается к байту, а не к символу и по счастливой случайности половина строки действительно избавляется от пробелов.
2) Продолжаю натыкаться на разные интересные особенности php, вот например если создать массив вида:
$arr = [1 => 3, '1' => 5], то будет создан массив с одним элементом 5 и ключом 1 типа int, тобиш '1' и 1 для массива одинаковые ключи как при создании так и при обращении.
#765 #525754
Вкину и прошлые, проверять все не надо, но если что-то бросается в глаза, то, ОП, покритикуй плиз.
http://ideone.com/Chstwl
http://ideone.com/yddJ6y
http://ideone.com/xgdIm2
http://ideone.com/gmkUEV
http://ideone.com/bfVMjf
http://ideone.com/E1jPIE
http://ideone.com/KpOWul
http://ideone.com/0sOa41
анон_выше
#766 #525755
>>525754
в смысле, тот, что с вырезанием пробелов, лол.
#767 #525791
>>525753

> Я подозреваю, что конструкция вида $text{$i} обращается к байту, а не к символу и по счастливой случайности половина строки действительно избавляется от пробелов.


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

Урок про строковые функции если ты его не видел: https://gist.github.com/codedokode/ff99e357e9860ea169b8

> Продолжаю натыкаться на разные интересные особенности php, вот например если создать массив вида:


$arr = [1 => 3, '1' => 5], то будет создан массив с одним элементом 5 и ключом 1 типа int, тобиш '1' и 1 для массива одинаковые ключи как при создании так и при обращении.
Да. если строка-ключ выглядит как число то PHP преобразует ее в число. Иначе бы такой код не работал:

$a = ['1' => 'test'];
echo $a[1]; // была бы ошибка

Вот тут описано: http://php.net/manual/ru/language.types.array.php

> Строки, содержащие целое число будут преобразованы к типу integer. Например, ключ со значением "8" будет в действительности сохранен со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым.



> Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8



И так далее.
#768 #525792
>>525753

Ну и еще в цикле у тебя стоит mb_strlen которая возвращает число символов, а оно меньше чем число байт (кириллица = 2 байта) и ты в итоге проходишь только полстроки.
#769 #525799
Почему нельзя в href у ссылки писать javascript:void()? Гугленул, пишут можно, чтобы ссылка нерабочая была.
#770 #525800
>>525799

Потому что ссылка должна куда-то вести, в ней должен быть указан адрес страницы. А какая польза от ссылки javascript:vioid( ? Куда она ведет?

Тебе нужна не ссылка, а кнопка. А внешеий вид меняется средствами CSS.
#771 #525811
>>516879

>Советую "Изучаем PHP и MySQL" Мишель Е. Дэвис, Джон А. Филлипс.



скачал, а пишет, что она 2008 года, не сильно старая?

посоветуйте годную литературу на русском по php ну и вдобавок что там надо html css js mysql

Буду читать когда буду не дома, а дома буду решать задачки ОПа
93 Кб, 650x962
#772 #525819
>>525811
Пикрелейтед же, самая грамотная книга.
86 Кб, 608x880
#773 #525824
>>525819
Уже новая есть, 5я.
#774 #525829
>>525824
годно, наконец-то что-то новое по php и на русском
#775 #525833
>>525829
Это помойка, а не книга.
#776 #525837
Чому все так плохо с utf-8 в пхп? И добавят ли его в php7 на уровне ядра? Я кстати, не совсем понял, что значит на уровне ядра, лол. Вот например вызвал phpinfo(), там есть раздел - mbstring. То есть это наше расширение для работы с мультибайтной кодировкой, support стоит в enabled, тобишь по умолчанию работает, у меня php 5.4, к слову. В чем отличие между "на уровне ядра" и в качестве врубленного по умолчанию расширения? Что мешает добавить функции mb_ в сам php? Или у них какая-то принципиально различная реализация?
#777 #525849
В css есть селектор, который позволит выбрать только тот элемент, у которого есть определенный дочерний?
Например
<p>Раз</p>
<p><span>Два</span></p>
<p>Три</p>

Стиль нужно применить только к тому p, который содержит span.
#778 #525851
>>525833
Не пизди, читал ее, все довольно подробно разъясняется, не хуже официальной документации.
#779 #525855
>>525851
Ты мне кидаешь предъяву, что я пиздабол?
#780 #525856
>>525855
Ты вообще крокодил анонимный, я откуда знаю. Я книгу читал, там все норм, лучше других туториалов, какие попадались.
#781 #525857
>>525856
Говноед.
#782 #525858
>>525856
Ты с темы не съезжай, на вопрос ответь прямо: я пиздабол по твоему или нет?
#783 #525861
>>525857
>>525858
Встречайте, трали теперь и к нам приехали из другого тредика.
#784 #525863
>>525861

>тредика


Ты голубой?
#785 #525864
>>525863
Какой такой голубой?
#786 #525865
>>525864
Ну ты пидор?
#787 #525866
>>525865
Не, меня считали некоторые ребята пидором. Даже в 1с контору позвали один раз.
150 Кб, 554x921
#788 #525872
Начал искать работу в Новосибе, чет все печально. Разослал вчера резюме куче фирм, большинство вообще еще даж не прочитало его еще. Несколько прочитало, но ничего не ответило. Одни ответили стандартным отказом, и лишь одни нормально ответили, что им нужен человек, который хорошо знает современный MVC-фреймворк. А я только начал Yii2 изучать. Кстати заметил, что почти все на первом yii сидят. Мне сразу учить вторую или все же первую выучить сначала? И какая между ними разница вообще?

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

Кстати посмотрел резюме своих "конкурентов", чет там вообще какие-то Васяны со знанием синтаксиса. Либо фирмы зажрались, либо я резюме как-то не так составил.
#789 #525874
>>525872
В быдло-конторы берут по знакомству.
В хорошем месте естественно требуют знания.
Сиди и учись, хуле ноешь?
#790 #525875
>>525819
>>525824
Можно начинать сразу с пятого издания или сначала читать предыдущую?
#791 #525877
>>525874

Проблема в том, что у меня нет возможности сидеть. Нужно работать идти. И чет мне кажется от джуна требовать миддловские знания это слишком.
#792 #525878
>>525872
Я 5 месяцев рассылал пока взяли. Зато сейчас в нормальной конторе.
#793 #525879
>>525877
Ты джуниора путаешь со стажером.
Джуниор должен уметь все то же, что миддл, разница только в объеме возлагаемых работ и ответственности.

Иди тогда работать в макдак за пряники, а вечером учись.
#794 #525880
>>525875
С 5го читай, там все более новое. Эта книжка каждые пару лет заново издается, походу убирают устаревшее в языке и добавляют обновленное.
#795 #525881
>>525878

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

>>525879

Я не могу позволить себе за пряники работать. Мне нужна зарплата тысяч в 20, чтобы квартиру оплачивать.
#796 #525882
>>525879
Все эти джуниоры-миддлы от конторы зависят. В некоторых и на джуниора такое требуют, что сениор только знает, а в других на джуниора любого дауна берут, который видеолекцию php с ютуба посмотрел.
#797 #525887
>>525881
Ну я тоже не понял, рассылал вроде одно и то же везде, в итоге в нормальную фирму взяли, в остальных всех отфутболили, даже в парашных. Видно от удачи зависит.
#798 #525888
>>525882

Ну я очень надеюсь на фирму НГС, которая еще мое резюме не прочитала. У них там вроде вполне демократичные требования. А знание Yii требовала Noveo. Вернее у них там это было "желательно" знать. Но судя по всему это "желательно" надо читать как "требуется".
#799 #525889
>>525887

Тебя на какой стадии отфутболивали? До собеседования часто доходило?
#800 #525892
>>525889
До собеседований редко, 3 раза всего пригласили. С 2х потом не позвонили, с 3й через неделю согласились.
#801 #525896
>>525892

А знания у тебя какие были на тот момент?
#802 #525901
>>525896
На джуниора же и были. Простые запросы с JOIN в mysql, на javascriptе аякс запрос написать, в jquery там элемент подвинуть, в PHP класс с конструктором и mvc паттерн, в таком духе.
#803 #525905
>>525901

Ну это все я знаю. Даже больше. Плюс есть пара проектов на гитхабе, написанных на MVC, один из них на фреймворке. Походу единственное, что мне не хватает это Yii. Но у меня сейчас нет возможности его учить, нужно ехать уже.
#804 #525906
>>525905
Ну все норм у тебя значит, засылай дальше просто.
#805 #525907
>>525905
от нас че надо-то? съеби в алкотред с этим нытьем нахуй
#806 #525910
>>525907

Обсуждаю джунопроблемы. А ты пошел нахуй отсюда, мелкобуквенный петух.
Архитектор-кун !T5MuanW1QE #807 #525913
Я архитектор в конторе где в стеке 90% PHP.

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

Спрашивайте ответы, мои няши :3
#808 #525914
>>525913
Когда у меня будет тян?
#809 #525916
>>525913
Как код на сервак деплоите? Как тестите?
Архитектор-кун !T5MuanW1QE #810 #525918
>>525914
Видимо, никогда.

>>525916
У нас CI.
#811 #525920
скорее бы мне школу закончить, пока тут всякие 30-летние лузеры устраиваются джуниорами за еду
55 Кб, 403x604
#812 #525921
>>525913

>архитектор в конторе


>PHP

Архитектор-кун !T5MuanW1QE #813 #525922
>>525921
Да, к счастью, она и там есть.
#814 #525923
>>525914
Сам становись тян. Заодно и деньги появятся.
48 Кб, 943x716
#815 #525925

>Твой способ требует добавлять отдельный див. Клеарфикс позволяет просто добавить класс на элеиент чтобы тот охватывал (растягивался по высоте) все флоаты внутри него.


Все понятно. Переделал, с технологией разобрался.

>Кстати, иконку адреса и телефона в подвале можно сделать через псевдоэлемент :before. Сделай-ка, ты же с ними знаком по предыдущим задачам, верно?


Знаком, переделал.

>Напомню, что загрузил все прямо на сайт maketi.esy.es Молодец, что так делаешь, удобно смотреть и проверять.


Надеюсь это был не сарказм, а то мне самому это удобно, я все сразу на сайт загружаю.

>Если открыть инспектор в браузере (Ctrl + Shift + I) то можно увидеть что у тебя ссылки внизу криво спозиционированы. У ссылки есть активная невидимая область справа от кнопок (если навести мышь, она меняет форму).


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

Хотелось бы еще услышать ответ насчет @font-face, стоит ли загружать папку 1.2 мегабайта ради одного шрифта? http://fonts4web.ru/opensans.html

Так же еще возник вопрос насчет шрифтов. Выставляю все в px (например 16px) но при большом уменьшении масштаба текст явно становится больше, я не могу понять в чем дело. Скрины на пике. Как видно в 1 случае блоки с текстом становятся длиннее, а во втором строчка с адресом становится настолько большой, что вытесняет строчку с телефоном.
#816 #525927
>>524520
>>525441
>>525477

9) http://jsfiddle.net/9grpj1hf/
10) Не имею понятия, как это решить. Например, сноска слева от курсивного текста должна ведь оставаться на той же высоте, что и текст, к которому она относится? То есть если текст переедет на новую строку при изменении ширины окна, то сноска должна быть всегда на том же уровне по вертикали. Напрашивается какой-нибудь ::before, но тогда вопрос, как зафиксировать положение этого псевдоэлемента по горизонтали.
Как сделать полупрозрачную надпись на картинке, тоже не знаю. То есть непонятно как ее пристыковать к нижнему краю изображения. Если бы я знал хотя бы высоту этого блока, то мог бы использовать отрицательный margin.
11) http://jsfiddle.net/9tLfgyej/1/
Как-то коряво получается. Уголки вылезают наружу при выделении.
Все-таки логичнее было бы использовать label с атрибутом for. Не понимаю, на каком основании это запрещено? Только чтобы сделать задачу "интереснее", или есть все же практические причины?
#817 #525928
>>525925

> Выставляю все в px (например 16px) но при большом уменьшении масштаба текст явно становится больше, я не могу понять в чем дело. Скрины на пике. Как видно в 1 случае блоки с текстом становятся длиннее, а во втором строчка с адресом становится настолько большой, что вытесняет строчку с телефоном.



1) в браузере может быть задан минимальный размер шрифта меньше которого он не уменьшается

2) шрифт в некоторых системах рендерится с привязкой к границам пикселей, соответсвенно при уменьшении масштаба он уменьшается непропорционально

Более того, один и тот же шрифт в разных ОС/браузерах рендерится чуть-по разному и там легко может набраться разница 1-2px на слово. Ты не должен делать какие-то предположения, что этот текст займет ровно стольуо пикселей, ты должен делать максимально надежную и прочную верстку.
#818 #525930
>>525927

label с атрибутом for доставляет небольшие неудобства когда ты не верстаешь инпуты руками, а например имеешь php код который их генерирует. В случае использования for мы должны правильно генерировать уникальные id, и заботиться чтобы они не сопадали.

Если ты верстаешь руками то

Впрочем, даже без for нам приходится беспокоиться об атрибутах name.

>>525927

А еще некоторые линии между кнопками почему-то двойные: https://jsfiddle.net/bc71zb8n/1/
#819 #525934
>>525930

>линии между кнопками почему-то двойные


Поправил. https://jsfiddle.net/bc71zb8n/2/
Ты лучше подскажи общее решение, очевидно там неправильно из-за выпадающих уголков.
#820 #525938
>>525928
Действительно есть какая-то граница. Крашится не постепенно, а с определенного момента уменьшения масштаба, при 50% и далее. При ширине 900, думаю, можно и не думать над этим, кому вообще нужно будет уменьшать ниже 450px, да и я так посмотрел, многие большие сайты крашатся подобным образом при сильном уменьшении масштаба.
#821 #525946
>>525938
Решил проверить на всех установленных браузерах и вот какой результат.
Есть предельно мелкий шрифт:
Opera
Yandex
Chrome
Отсутствует, а следовательно даже при уменьшении сайта до 1х1 пиксель все отображается абсолютно нормально:
IE
* Mozilla
#822 #525948
Может кто дать ссылку на книгу на этом пике >>525824 в пдф. Облазил весь интернет, вообще нихуя не нашел, только 4-е издание
#825 #525954
>>525951
я нищееб, какой купи. Да и придет она не скоро, а я уже хочу начать

>>525952
лол)))
19 Кб, 450x300
#826 #525955
Я сделал, я сделал! http://ideone.com/ESQ3HR
#828 #525957
>>525913
Может есть что годное почитать по ООП? как раз к нему преступаю. Статейки, ламповые бложики которые не кто не спалил, или годное чтиво про ООП но на примере другого языка?
#829 #525959
>>525946

В этом ограничении нет ничего плохого, оно сделано чтобы текст гарантированно оставался читаемым. Молодец, что делаешь такие эксперименты.
#830 #525960
>>525956
Ну если выбирать беслпатно или за 5$, то ясен хуй я выберу бесплатно. Зачем тратиться если можно и не тратиться?
#831 #525965
>>525960
Качай 4-е издание и учи по нему пока. 5е вышло недавно, нет еще в торрентах.
Архитектор-кун !T5MuanW1QE #832 #525967
>>525957
Если быстро подумать то: APPP, Clean code, OOAD.

Вообще список для чтения я успешно проебал, т.к. забыл засунуть его в облако.
#833 #525971
>>525957
Оп где-то раньше вот эту ссылку по ООП давал, я там много годноты нашел
http://sergeyteplyakov.blogspot.ru/2013/10/articles.html
#834 #525972
Решил начать изучать яваскрипты. Что читать?
#835 #525975
>>525972
с ОП поста:
- JS: learn.javascript.ru
#836 #525976
>>525972
На инглише еще
http://www.w3schools.com/js/default.asp неплохой универсальный.
#837 #525981
>>525965
Я вот очкую, что буду старье учить. Может рассмотреть другого автора? Есть варианты?
#838 #525982
Яваскрипт это ведь полноценный язык программирования как и PHP? Мне нужно учить его весь или только часть? Учитывая что язык программирования я выбрал PHP.
#839 #525983
Как на document.write() писать, чтобы весь предыдущий текст не удалялся?
#840 #525984
>>525982

Полноценный. Придется весь, няша. В ОП посте также есть задачки для проверки и закрепления знаний. Не бойся, второй язык изучать проще чем первый.
#841 #525985
>>525983

После загрузки страницы document.write вызывать уже нельзя. Лучше его не использовать, а создавать и вставлять DOM элементы в страницу.
#842 #525986
>>525981
4-е издание 2013 года, там почти ничего не устарело.
#843 #525987
>>525983

Для отладки можно выводить текст в консоль через console.log()
#844 #525990
>>525982
Только часть. Обычно от PHP программистов не требуют полноценные тулы, использующие все фичи языка писать, достаточно простейших действий по манипуляции элементами и отсылке запросов. Часть пхпшников вообще одним jquery и готовыми тулами к нему обходится.
#845 #525992
>>525984
Получается яваскрипт будет первым. Я ведь пока только HTML/CSS овладел.

А вообще по объему яваскрипт каков по сравнению с PHP? А то не хочется надолго затягивать с обучением того языка, который даже не основной у меня.
#846 #525995
>>525992

Хуй знает, мне JS легче показался, чем PHP. Правда учил я его вторым. Но количество скобок это пиздец какой-то. До сих пор в них путаюсь.
#847 #525998
>>525992
Почти как PHP, минус работа c БД.
Архитектор-кун !T5MuanW1QE #848 #526000
>>525998

>Почти как PHP


Проиграл.
#849 #526003
>>525992
Учи по w3schools сайту тогда, там в сжатом виде все, одни основы и с наглядными примерами. На learn.javascript.ru все более подробно и основательно разжевывают, но учить долго будешь.
#850 #526005
<p id="moidiv"></p>
<script>
var vasya;
if (vasya == 'undefined')
alert('vasya undefined');
document.getElementById("moidiv").innerHTML = vasya;
</script>

чому код не работает? alert не выдает на undefined, но в div пишет undefined
#851 #526007
>>526003
Все таки начал учить на http://learn.javascript.ru. Думаю разжевывание мне на пользу только пойдет. А насчет времени, ну по крайней мере до конца лета я собираюсь все по хардкору учить, как и CSS/HTML перед этим, тратя по ~10 часов в сутки. Ну а дальше как время свободное от универа будет, но думаю часов по 5 буду находить.
И кстати, платиновый вопрос, при таком раскладе вообще долго я буду учить все это дело?
#852 #526008
>>526007
года 2
#853 #526010
>>526007
Нет, не долго. У меня брат за неделю выучил, теперь работает синьором и получает 4килобакса.
#854 #526011
>>526007

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


Зависит от тебя. От того, насколько ты обучаем.
ОП называет примерные сроки 4-8 месяцев для нахождения работы джуном/стажёром в крупном городе.
#855 #526013
>>526005

Ты путаешь строку 'undefined' и значение undefined. Это кстати показывает почему лучше потратить чуть больше времени и почитать хороший учебник, а не прыгать по верхам.

>>526007

Правильно делаешь.

Обычно у людей занимает от 4 до 8 месяцев изуение HTML/CSS/PHP/JS/SQL но все индивидуально.
#856 #526014
>>526005
Надо так:
if (typeof(vasya) == 'undefined')
alert('vasya undefined');
#857 #526018
>>526013
Все понял. Просто имею в запасе 2 года, пока учусь в универе гуманитарий, потом планирую переехать из своей мухосрани 250к в Питер. Судя по всему времени мне хватит. Желание учить программирование у меня действительно есть.
#858 #526019
>>526014

Лучше так:

if (v === undefined)

Зачем усложнять?
#859 #526036
Раз никто не задает вопросы, пожалуюсь тут. У меня слишком громкие наушники. Я люблю слушать музыку негромко, чтобы она не отвлекала и уши не уставали, и этого непросто добиться. В системе у меня микшер стоит на нескольких процентах, и на сайтах я тоже ставлю громкость на минимум. Но у них (что ютуб, что вконтакте) такие крошечные полоски громкости что поставить нелольшую громкость сложно — ты либо ставишь ее на ноль, либо слишком громко. А в том же вконтакте вообще полоска микроскопическая. Причем, я подозреваю, они еще звук как-то вкручивают чтобы он был громче. Куда громче? Как же неудобно.

Пойду-ка лучше с торрентов что-нибудь скачаю, в плеере громкость нормиально регулируется.
#860 #526046
>>526036
Как в гите откатиться на определенную версию (коммит) проекта? Допустим, у меня десять коммитов, и тут я обнаружил косяк, который пошел с девятой версии. Как откатиться на восьмую? (Гитбук читаю, дошел только до третьей главы пока)
(и файлообменник мой проверь, блджад)
#861 #526051
>>526036
Бери наушники с регулятором громкости.
#862 #526064
>>524520
https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php
Такую верификацию ты сам придумал, или где-то подсмотрел? Я сейчас тоже регистрацию делаю в файлообменнике, ОП все-равно пока ничего не проверяет, и встал вопрос верификации, я эту тему пока еще не вскрывал, пока только посмотрел твою, хотел узнать что ты на эту тему читал, откуда черпал информацию. Твое решение мне выглядит каким-то совсем непрозрачным
#863 #526070
>>526064
Правила для проверки полей формы, заданные массивом, подсмотрел в yii.
Велосипед с циклами для обхода этого массива изобретал сам.
Хз, может и выглядит как говно, но по крайней мере хвалю себя за попытку вникнуть в принципы реализации таких штук.
#864 #526075
>>526046

Язык вероятного противника понимаешь? http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=git+revert+to+commit

>>526064

В больших фреймворках типа Симфони все еще сложнее, там каждый валидатор — отдельный объект: http://symfony-gu.ru/documentation/ru/html/book/forms.html

Но зато там крутые формы, они без всяких массивов прямо в твою модель данные пишут и читают.
#865 #526077
>>526046

В общем, git revert SHA как я понимаю
https://github.com/V3N0m21/Uppu3 #866 #526115
>>521480
>>522386

> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L47


> protected $fileId;


Тут можно (и нужно) прописать связь с файлом. А в файле — обратную связь. Зачем нам id файла когда мы можем прописать связь и доктрина будет возвращать нам сущность-файл? Тогда мы сможем делать такие вещи:

$file = $comment->getFile();
$comments = $file->getComments();

Соответственно setFileId надо выпилить. Заметь, что в доктрине можно для установки связи вместо загрузки полноценного объекта использовать легкую Reference которая содержит только id и не обращается к базе при создании: http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies (впрочем, это оптимизация которая очень редко когда нужна, в твоем случае не нужна).

> static public function saveComment($post, $em, self $parent = null)


self в качестве тайп хинта точно работает? Это не будет воспринято как «объект класса self»?

> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L121


> static public function saveComment($post, $em, self $parent = null)


вот это неправильно. Комментарий не должен сам себя сохранять, у нас же data mapper.Сохранением занимается репозиторий либо класс-сервис. Если тебе нужны доаолнительные методы работы с базой, ты можешь сделать свой репозиторий, унаследовав стандартный:

http://habrahabr.ru/post/130275/
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#custom-repositories (офиц. док.)

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

То есть примерно так:

$comment = new Comment;
$comment->... = $app->request->post(...);
...

if ($validator->isValidComment($comment)) {
...
} else {
...
}

Там кстати надо бы сделать нормальное добавление комментариев, с проверкой данных и выдачей ошибок. И наверно с аяксом, ты же изучаешь JS? Вот и сделай чтобы аяком отправлялся запрос на добавление комментария, запрос проверялся, и возвращались в JSON либо ошибки либо что все ок. При использовании аякса не забывай про такие вещи:

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

Также можно добавить легкую клиентскую валидацию (вроде проверки что текст введен или проверки на длину) с помощью клиентской HTML5 валидации.

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

Ну и аякс сейчас часто используется, тебе это пригодится. Если ты изучал jQuery, можно ее тут применить, можно без нее, на XMLHttpRequest и DOM.Если ты совсем JS не знаешь, то сделай отправку без JS, но с валидацией на сервере, как описано в моем уроке про формы.

Что с именами классов? Resource\File и Resourse\FileResource только путают. Я бы сделал папку Entity или Model для моделей. А остальное засунул в Helper.

Имена моделей обычно пишут в единственном числе, не Comments а Comment.Ведь у тебя в одном объекте хранится информация об одном комментарии.

> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php


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

Также, пара замечаний по инициализации доктрины:

> $config->setAutoGenerateProxyClasses(false);


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

> $deleted = $cache->deleteAll();


Если ты хочешь откючить кеш, ты можешь просто к качестве драйвера указать ArrayCache (кеширование описано тут на англ: http://doctrine-orm.readthedocs.org/en/latest/reference/caching.html ). Также есть VoidCache который ничего вообще никуда не сохраняет.

Заметь что кеширование относится только к метаданным (распарсенным аннотациям) и DQL запросам, сами данные из базы доктрина не кеширует (и это хорошо).

> $cache = new \Doctrine\Commmon\Cache\MemcacheCache();


Лучше в качестве альтернативы поставить файловый кеш, он есть в доктрине: https://github.com/doctrine/cache/tree/master/lib/Doctrine/Common/Cache

> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L53


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

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/app/templates/layout.html#L6


> {{ app.request.getRootUri() }}


Чтобы не копипастить это во всех шаблонах, можно в начале index.php проставлять переменную во view.

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L17


> <label for="name">Ваше имя</label><br>


br верный признак того что тебе надо как-нибудь пройти наш Путь CSS/HTML. У тебя же там бутстрап используется, можно с его помощью форму оформить.

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L32


> '{{comment.user}}'


Вставлять данные в JS надежнее через json_encode так как она правильно сохраняет любые спецсимволы. В твоем примере, если в имени есть символы ' или \ то JS-код сломается. Надо писать так:

в атрибутах {{ x | json_encode }}
в теге script: {{ x | json_encode | raw }}

Кавычки не требуются.

> style="margin-left:{{ (comment.level -1) × 25 }}px;">


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

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L78


> '<textarea name="comment" id="commentBody"></textarea><br>'+


id не могут повторяться. Но после вставки второй формы на странице будет 2 одинаковых id

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L83


> commentButton.onclick = function(){


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

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

Кстати, тебе не обязательно иметь вторую копию формы. Ты можешь взять существующую на странице форму и переместить, если ты изучал DOM то метод appendChild переносит DOM-элемент в новое место:

var commentForm = document.getElementById(..)

function appendForm(...) {
var comment = ...;
comment.appendChild(commentForm);
}

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

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/comments.sql#L34


> `children` int(11) DEFAULT NULL,


Что хранится в children? Комментария нет, непонятно.

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L8


> php_value max_execution_time 1000


Это зачем? Ограничение по времени защищает от расходования ресурсов зациклившимися скриптами.

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L14


> RewriteRule ^download/[^/]+/[^/]+$ index.php


По моему это правило дублирует последнее.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L4


> use Uppu3\Helper\FormatHelper as FormatHelper;


as ... не нужен тут

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L12


> $app->container->singleton('em',


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

$app->container->singleton('em', function() {
$entityManager = configureEntityManager();
return $entityManager;
});

Тогда доктрина инициализировалась бы не всегда, а только если она нужна.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L34


> if (file_exists($_FILES['load']['tmp_name'])) {


При загрузке надо проверять поле error, а то вдруг например файл не дозакачался? http://php.net/manual/ru/features.file-upload.errors.php

> https://github.com/V3N0m21/Uppu3/tree/master/.idea


Эту папку надо удалить из репозитория. Для этого надо убрать ее из gitignore, убрать папку, закоммитить, вернуть в gitignore, вернуть папку.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L50


> $helper = new FormatHelper();


Это не нужно, там же все методы статические

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L73


> exit;


Используй return, а то не вызовется код, выполняющийся после обработки запроса (вдруг ты что-нибудь добавишь).

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L103


> isset($_POST['parent']) ? $parentID = $_POST['parent'] : $parentID = false;


?: предназначен для использования в выражениях, а не как замена для if. Правильнее писать так:

$parentId = ... ? ..: ..

Тогда мы явно видим что это присваивание значения переменной. А в данном случае вместо isset используй $app->request.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L107


> $parent = $app->em->find('Uppu3\Resource\Comments', $parentID);


Если parentId пуст незачем вызывать это.

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

Пока я сам файлообменник не смотрел, давай ты пока исправишь замечания. Если какие-то вопросы, уточняй, я более развернуто напишу.
https://github.com/V3N0m21/Uppu3 #866 #526115
>>521480
>>522386

> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L47


> protected $fileId;


Тут можно (и нужно) прописать связь с файлом. А в файле — обратную связь. Зачем нам id файла когда мы можем прописать связь и доктрина будет возвращать нам сущность-файл? Тогда мы сможем делать такие вещи:

$file = $comment->getFile();
$comments = $file->getComments();

Соответственно setFileId надо выпилить. Заметь, что в доктрине можно для установки связи вместо загрузки полноценного объекта использовать легкую Reference которая содержит только id и не обращается к базе при создании: http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies (впрочем, это оптимизация которая очень редко когда нужна, в твоем случае не нужна).

> static public function saveComment($post, $em, self $parent = null)


self в качестве тайп хинта точно работает? Это не будет воспринято как «объект класса self»?

> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L121


> static public function saveComment($post, $em, self $parent = null)


вот это неправильно. Комментарий не должен сам себя сохранять, у нас же data mapper.Сохранением занимается репозиторий либо класс-сервис. Если тебе нужны доаолнительные методы работы с базой, ты можешь сделать свой репозиторий, унаследовав стандартный:

http://habrahabr.ru/post/130275/
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#custom-repositories (офиц. док.)

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

То есть примерно так:

$comment = new Comment;
$comment->... = $app->request->post(...);
...

if ($validator->isValidComment($comment)) {
...
} else {
...
}

Там кстати надо бы сделать нормальное добавление комментариев, с проверкой данных и выдачей ошибок. И наверно с аяксом, ты же изучаешь JS? Вот и сделай чтобы аяком отправлялся запрос на добавление комментария, запрос проверялся, и возвращались в JSON либо ошибки либо что все ок. При использовании аякса не забывай про такие вещи:

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

Также можно добавить легкую клиентскую валидацию (вроде проверки что текст введен или проверки на длину) с помощью клиентской HTML5 валидации.

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

Ну и аякс сейчас часто используется, тебе это пригодится. Если ты изучал jQuery, можно ее тут применить, можно без нее, на XMLHttpRequest и DOM.Если ты совсем JS не знаешь, то сделай отправку без JS, но с валидацией на сервере, как описано в моем уроке про формы.

Что с именами классов? Resource\File и Resourse\FileResource только путают. Я бы сделал папку Entity или Model для моделей. А остальное засунул в Helper.

Имена моделей обычно пишут в единственном числе, не Comments а Comment.Ведь у тебя в одном объекте хранится информация об одном комментарии.

> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php


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

Также, пара замечаний по инициализации доктрины:

> $config->setAutoGenerateProxyClasses(false);


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

> $deleted = $cache->deleteAll();


Если ты хочешь откючить кеш, ты можешь просто к качестве драйвера указать ArrayCache (кеширование описано тут на англ: http://doctrine-orm.readthedocs.org/en/latest/reference/caching.html ). Также есть VoidCache который ничего вообще никуда не сохраняет.

Заметь что кеширование относится только к метаданным (распарсенным аннотациям) и DQL запросам, сами данные из базы доктрина не кеширует (и это хорошо).

> $cache = new \Doctrine\Commmon\Cache\MemcacheCache();


Лучше в качестве альтернативы поставить файловый кеш, он есть в доктрине: https://github.com/doctrine/cache/tree/master/lib/Doctrine/Common/Cache

> https://github.com/V3N0m21/Uppu3/blob/master/app/bootstrap.php#L53


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

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/app/templates/layout.html#L6


> {{ app.request.getRootUri() }}


Чтобы не копипастить это во всех шаблонах, можно в начале index.php проставлять переменную во view.

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L17


> <label for="name">Ваше имя</label><br>


br верный признак того что тебе надо как-нибудь пройти наш Путь CSS/HTML. У тебя же там бутстрап используется, можно с его помощью форму оформить.

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L32


> '{{comment.user}}'


Вставлять данные в JS надежнее через json_encode так как она правильно сохраняет любые спецсимволы. В твоем примере, если в имени есть символы ' или \ то JS-код сломается. Надо писать так:

в атрибутах {{ x | json_encode }}
в теге script: {{ x | json_encode | raw }}

Кавычки не требуются.

> style="margin-left:{{ (comment.level -1) × 25 }}px;">


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

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L78


> '<textarea name="comment" id="commentBody"></textarea><br>'+


id не могут повторяться. Но после вставки второй формы на странице будет 2 одинаковых id

> https://github.com/V3N0m21/Uppu3/blob/master/app/templates/view.html#L83


> commentButton.onclick = function(){


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

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

Кстати, тебе не обязательно иметь вторую копию формы. Ты можешь взять существующую на странице форму и переместить, если ты изучал DOM то метод appendChild переносит DOM-элемент в новое место:

var commentForm = document.getElementById(..)

function appendForm(...) {
var comment = ...;
comment.appendChild(commentForm);
}

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

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/comments.sql#L34


> `children` int(11) DEFAULT NULL,


Что хранится в children? Комментария нет, непонятно.

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L8


> php_value max_execution_time 1000


Это зачем? Ограничение по времени защищает от расходования ресурсов зациклившимися скриптами.

> https://github.com/V3N0m21/Uppu3/blob/dca0566ea2c3bec8062b2ec140010fd393ca6690/public/.htaccess#L14


> RewriteRule ^download/[^/]+/[^/]+$ index.php


По моему это правило дублирует последнее.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L4


> use Uppu3\Helper\FormatHelper as FormatHelper;


as ... не нужен тут

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L12


> $app->container->singleton('em',


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

$app->container->singleton('em', function() {
$entityManager = configureEntityManager();
return $entityManager;
});

Тогда доктрина инициализировалась бы не всегда, а только если она нужна.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L34


> if (file_exists($_FILES['load']['tmp_name'])) {


При загрузке надо проверять поле error, а то вдруг например файл не дозакачался? http://php.net/manual/ru/features.file-upload.errors.php

> https://github.com/V3N0m21/Uppu3/tree/master/.idea


Эту папку надо удалить из репозитория. Для этого надо убрать ее из gitignore, убрать папку, закоммитить, вернуть в gitignore, вернуть папку.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L50


> $helper = new FormatHelper();


Это не нужно, там же все методы статические

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L73


> exit;


Используй return, а то не вызовется код, выполняющийся после обработки запроса (вдруг ты что-нибудь добавишь).

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L103


> isset($_POST['parent']) ? $parentID = $_POST['parent'] : $parentID = false;


?: предназначен для использования в выражениях, а не как замена для if. Правильнее писать так:

$parentId = ... ? ..: ..

Тогда мы явно видим что это присваивание значения переменной. А в данном случае вместо isset используй $app->request.

> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L107


> $parent = $app->em->find('Uppu3\Resource\Comments', $parentID);


Если parentId пуст незачем вызывать это.

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

Пока я сам файлообменник не смотрел, давай ты пока исправишь замечания. Если какие-то вопросы, уточняй, я более развернуто напишу.
#867 #526117
Привет, ОП. Я снова запрострировал и забросил программирование. Мне очень тяжело даются сложные вещи, но я вновь готов их преодолеть. Я очень рад вновь оказаться в твоем треде. Я чуть не расплакался когда долго не мог найти его.

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

Надеюсь, ты не думаешь, что я легкомысленно отношусь к этому, напротив - мне очень важно знать программирование, и я очень ценю твою помощь. Просто иногда бывает очень сложно.
#868 #526118
>>526075
Плохо понимаю.
Скачал даже какой-то школьный учебник
McKinlay S., Hastings B. - New Success - 2012
(Pre-intermediate и Intermediate уровни). Там есть аудио, упражнения на грамматику, вроде неплохо пошел.

Git-book не нравится, чувствуется что они старались как могли, но получилось как всегда, какая-то мутная хрень, и не документация, и не мануал.

Качнул несколько книжек, может какая-то из них пойдет.
Ferdinando Santacroce | Git Essentials (2015) рутрекер. Судя по оглавлению, тоже сухое перечисление фактов, которые я видимо должен заучивать наизусть.
Mike MqQuaid | Git in practice (2015) на трекерах не нашел, файлообменник http://nitroflare.com/view/B7637D869441A00/1617291978git.pdf
Пролистал, вроде неплохо, автор даже снисходит до того, чтобы объяснять и показывать примеры.
#869 #526124
>>521545

Есть, надо xdebug настроить и IDE с его поддержкой исплоьзовать.

>>522386

Вот кстати, ты файлообменник доделываешь, самое время за HTML, JS и SQL взяться, если ты их еще не решал. Ну и далее фреймворки мучать.

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

Ну а SQL тебе нужен в любом случае, даже чистые бекендщики хоошо должны его знать. И у нас есть задачки, помогающие в нем разобраться.
#870 #526137
>>522430
>>523078

Цвет подчеркивания сильно не тот (там ближе к оранжевому). Верстаьщик не должен путать цвета и должен уметь пользоваться пипеткой или программой определения цветов.

Далее, если убрать width 500 и попробовать поменять ширину страницы то примечания слева съезжают. ПРоблема очевидно кроется в неправильном позиционировании:

> position: absolute;


> right: 90%;



Нет никаких гарантий что 90% ширины страницы это нужная ширина. Это неправильное решение. Давай попробуем сначала словами сформуоировать, как должно быть?

Примечание должно правым краем почти примыкать к левому краю текста, то есть к линии расположенной на 90px от левого края

Как это реализовать? Я вижу 2 варианта:

- прижать правый край примечания к левому краю страницы c помощью right (оно станет невидимо), затем вытянуть вправо с помощью отрицательного margin-right. Этот трюк, использование right + margin-right часто исплоьзуется когда надо использовать и проценты и пиксели (например, центрирование). В новом CSS3 можно будет писать вещи вроде right: calc(100% - 90px) и трюк окажется не нужен. подробнее: http://habrahabr.ru/post/243821/

Пока это не очень поддерживается, так что применять пока не стоит.

- прижать левый край примечания к левому краю страницы. Сделать примечание фиксированной ширины (90px). Задать выравнивание текста в нем вправо.

Второй способ мне кажется более надежным.

В остальном, неплохо.

>>522958

> там долго сидели. А скажу сразу


Тут ошибки нет, а пишет что есть. Это из-за завездочки в регулярке:

> [а-яё]× а [а-я]×


Звездочка значит что буквы перед «а» могут и отсутствовать.

> foreach($val as $index => $val) {


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

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

Выражения для а/но можно объединить так: ... (а|но) ...

Так, вообще, неплохо.
#870 #526137
>>522430
>>523078

Цвет подчеркивания сильно не тот (там ближе к оранжевому). Верстаьщик не должен путать цвета и должен уметь пользоваться пипеткой или программой определения цветов.

Далее, если убрать width 500 и попробовать поменять ширину страницы то примечания слева съезжают. ПРоблема очевидно кроется в неправильном позиционировании:

> position: absolute;


> right: 90%;



Нет никаких гарантий что 90% ширины страницы это нужная ширина. Это неправильное решение. Давай попробуем сначала словами сформуоировать, как должно быть?

Примечание должно правым краем почти примыкать к левому краю текста, то есть к линии расположенной на 90px от левого края

Как это реализовать? Я вижу 2 варианта:

- прижать правый край примечания к левому краю страницы c помощью right (оно станет невидимо), затем вытянуть вправо с помощью отрицательного margin-right. Этот трюк, использование right + margin-right часто исплоьзуется когда надо использовать и проценты и пиксели (например, центрирование). В новом CSS3 можно будет писать вещи вроде right: calc(100% - 90px) и трюк окажется не нужен. подробнее: http://habrahabr.ru/post/243821/

Пока это не очень поддерживается, так что применять пока не стоит.

- прижать левый край примечания к левому краю страницы. Сделать примечание фиксированной ширины (90px). Задать выравнивание текста в нем вправо.

Второй способ мне кажется более надежным.

В остальном, неплохо.

>>522958

> там долго сидели. А скажу сразу


Тут ошибки нет, а пишет что есть. Это из-за завездочки в регулярке:

> [а-яё]× а [а-я]×


Звездочка значит что буквы перед «а» могут и отсутствовать.

> foreach($val as $index => $val) {


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

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

Выражения для а/но можно объединить так: ... (а|но) ...

Так, вообще, неплохо.
https://github.com/blackberryJam/abiturients #871 #526154
>>523049

Хорошо решено, считает верно, но неплохо бы избавиться от повтора этого кода:

> \t$creditSum = $creditSum - $payout;


> $totalPay = $totalPay + $payout;



Также было бы хорошо если программа говорила какой банк выгоднее.

>>524230
>>524805

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L39


> throw new Exception('Ошибка генерации токена.');


Это надо поставить после цикла, а то фактически у тебя получается только одна попытка генерации.

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L35


> if ($this->mapper->isTokenReserved($string) == false) {


мне кажется, генерацию и простановку токена стоило бы сделать 2 разными функциями, а не объединять

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L135


> $orderBy = $this->inspectParameter($orderBy, 'by');


Проще было сделать 2 функции (checkOrder, checkBy), они бы оказались проще и не пришлось бы использовать switch. В общем, в твоем решении особо ничего плохого нет, но можно было сделать проще.

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L146


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

Использовать $orExpr = implode(' OR ', $parts); для вставки OR.

Еще можно генерировать запрос так:

WHERE CONCAT(name, ' ', surname, ...) LIKE :word1
AND CONCAT(....) LIKE :word2

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

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L34


> $regexp = '/[-`а-яА-ЯёЁ\\s]{2,40}/u';


Нет привязки к началу и концу строки ^ и $

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L65


> $string = mb_strtolower(strval($sex));


Тут неправильно делать strtolower так как мы не знаем в каком регистре буквы в константе. Может у нас const MALE = 'MALE';

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L88


> if ($email != $abiturient->email) {


Проверку уникальности можно сделать проще, без лишнего запроса на выборку. Надо проверять по условию WHERE email = ... AND token <> ....

Хотя твой способ тоже годится конечно.

> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/MainPageController.php#L16


> $this->render($abiturients, $numOfPages, $_GET);


лучше бы в пагинатор не передавать GET где может быть все, что угодно, а формировать массив параметров явно или хотя бы отбирать из GET разрешенные параметры через array_intersect_key.

>https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L36


Тут какой-то переусложненный код. Тернарные операторы можно заменить на min/max, упростить и сделать код более линейным.

2 цикла, for ($i = 0; $i < $numOfPrevious; $i++) { и for ($i = 1; $i <= $numOfNext; $i++) { и код посередине можно объединить в один цикл.

> https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L69


> $params = Util::evalQueryParams


По моему в твоем случае это делается проще:

$params['page'] = $page;

Или

$params = array_merge($params, $additional) если надо заменить несколько

> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L73


Если ты вкладываешь input внутрь label то id и for можно не указывать.

В пагинации хорошо бы всегда иметь кнопки перехода к первой и последней страницам: 1 ... 3 4 (5) 6 7 ... 98

> https://github.com/blackberryJam/abiturients/blob/master/templates/searchTopMessage.html.php#L2


> Показаны только результаты поиска по запросу: <?=$string?>.


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

> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L11


Когда ты изучишь twig, узнаешь что там есть макросы и эту копипасту можно будет сократить в объеме. Также тут по моему не хватает htmlspecialchars для ссылки в href.

> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L66


> <td colspan=100%>


Что это? colspan это не ширина колонки.

Так вообще, пока неплохо. Я надеюсь в следующем задании ты познакомишься с фреймворком Slim и увидишь что он поудобнее твоего велосипеда. Ну и с шаблонизатором twig.
https://github.com/blackberryJam/abiturients #871 #526154
>>523049

Хорошо решено, считает верно, но неплохо бы избавиться от повтора этого кода:

> \t$creditSum = $creditSum - $payout;


> $totalPay = $totalPay + $payout;



Также было бы хорошо если программа говорила какой банк выгоднее.

>>524230
>>524805

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L39


> throw new Exception('Ошибка генерации токена.');


Это надо поставить после цикла, а то фактически у тебя получается только одна попытка генерации.

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L35


> if ($this->mapper->isTokenReserved($string) == false) {


мне кажется, генерацию и простановку токена стоило бы сделать 2 разными функциями, а не объединять

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L135


> $orderBy = $this->inspectParameter($orderBy, 'by');


Проще было сделать 2 функции (checkOrder, checkBy), они бы оказались проще и не пришлось бы использовать switch. В общем, в твоем решении особо ничего плохого нет, но можно было сделать проще.

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientsMapper.php#L146


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

Использовать $orExpr = implode(' OR ', $parts); для вставки OR.

Еще можно генерировать запрос так:

WHERE CONCAT(name, ' ', surname, ...) LIKE :word1
AND CONCAT(....) LIKE :word2

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

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L34


> $regexp = '/[-`а-яА-ЯёЁ\\s]{2,40}/u';


Нет привязки к началу и концу строки ^ и $

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L65


> $string = mb_strtolower(strval($sex));


Тут неправильно делать strtolower так как мы не знаем в каком регистре буквы в константе. Может у нас const MALE = 'MALE';

> https://github.com/blackberryJam/abiturients/blob/master/app/Service/Validator.php#L88


> if ($email != $abiturient->email) {


Проверку уникальности можно сделать проще, без лишнего запроса на выборку. Надо проверять по условию WHERE email = ... AND token <> ....

Хотя твой способ тоже годится конечно.

> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/MainPageController.php#L16


> $this->render($abiturients, $numOfPages, $_GET);


лучше бы в пагинатор не передавать GET где может быть все, что угодно, а формировать массив параметров явно или хотя бы отбирать из GET разрешенные параметры через array_intersect_key.

>https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L36


Тут какой-то переусложненный код. Тернарные операторы можно заменить на min/max, упростить и сделать код более линейным.

2 цикла, for ($i = 0; $i < $numOfPrevious; $i++) { и for ($i = 1; $i <= $numOfNext; $i++) { и код посередине можно объединить в один цикл.

> https://github.com/blackberryJam/abiturients/blob/master/app/Util/Paginator.php#L69


> $params = Util::evalQueryParams


По моему в твоем случае это делается проще:

$params['page'] = $page;

Или

$params = array_merge($params, $additional) если надо заменить несколько

> https://github.com/blackberryJam/abiturients/blob/master/templates/form.html.php#L73


Если ты вкладываешь input внутрь label то id и for можно не указывать.

В пагинации хорошо бы всегда иметь кнопки перехода к первой и последней страницам: 1 ... 3 4 (5) 6 7 ... 98

> https://github.com/blackberryJam/abiturients/blob/master/templates/searchTopMessage.html.php#L2


> Показаны только результаты поиска по запросу: <?=$string?>.


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

> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L11


Когда ты изучишь twig, узнаешь что там есть макросы и эту копипасту можно будет сократить в объеме. Также тут по моему не хватает htmlspecialchars для ссылки в href.

> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L66


> <td colspan=100%>


Что это? colspan это не ширина колонки.

Так вообще, пока неплохо. Я надеюсь в следующем задании ты познакомишься с фреймворком Slim и увидишь что он поудобнее твоего велосипеда. Ну и с шаблонизатором twig.
#872 #526156
>>526118

Что именно тебе показалось непонятным в git book? Мне он показался как раз кратким и понятным.

>>526117

Не беда, мы никого не торопим тут. Если сложно то лучше задавать вопросы. Тролли конечно доберутся до них первыми, но рано или поздно я их тоже увижу.
#873 #526165
>>526154

> https://github.com/blackberryJam/abiturients/blob/master/templates/table.html.php#L66


> <td colspan=100%>


Что это? colspan это не ширина колонки.
Это я так выводимое сообщение на всю ширину таблицы растянул.

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


То есть почти зачёт, после исправленных перечисленных тобой недочётов можно переходить к файлообменнику?
Я уже и JS начал учить, хочу там всё с аяксом красиво сделать.
http://maketi.esy.es/ #874 #526186
>>524328

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

> <div class="header-words">


><a class="header-word" href="HOME">Home</a>


Традиционно меню делают с помощью списка ul/li (типа меню это список ссылок). Также, можно делать его через тег <nav>

> We are <b>Webpaint</b></div>


Сейчас используют тег strong. Так как в HTML не должно быть кода отвечающего за оформление, то тег strong имеет значение «акцентированный текст»: http://htmlbook.ru/html/strong

<b> правда не удалили, ему в HTML5 дали новый, не связанный с внешним видом, смысл: http://habrahabr.ru/post/129147/

> class="button1"


Лучше сделать нормальное имя без цифры, например large-button

> <div class="pic-android"></div>


Я думаю этот пустой див можно либо заменить на padding + backgorund либо (если используется спрайт) на псевдоэлемент. А класс обозначающий картинку перенести на родителя.

> <b>Consectetur</b>


Это подзаголовок

> <h1>Our Features Works</h1>


h1 это единственнвй и главный заголовок. Тут явно заголовок второго уровня (так как он описывает не всю страницу а только секцию на ней). Я думаю, на этой странице главный заголовок это «We are Webpaint».

> <p><a id="link_portfolio"></a></p>


P значит абзац текста. Текста тут нет значит и p быть не должно быть. А атрибут id можно повесить на <section class="portfolio-buttons-and-works"> где ему самое место.

> <input type="radio" name="button" checked="checked" id="button1"></input>


У input нет закрывающего тега.

> <a href="#" class="all graphic">


all наверно можно не писать, если оно у всех картинок есть?

> <h4>Vestibulum id ligula porta felis euismod semper, malesuada euismod.</h4>


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

> <a href="#rss"><div id="rss"></div></a>


Див-то зачем? И без него наверно можно сделать ведь? Опять же, я бы сделал тут списком, но можно и просто теги <a> поставить. Вместо id лучше использовать класс так как они удобнее и их можно повторять.

> <h5>@ 2013 Webpaint. All Rights Reserved.</h5>


Это не заголовок. hN это не тег для задания размера текста.

Теперь перйдем к CSS. Начнем с вопроса про шрифты.

Подключать их можно 2 способами: вручную (рекомендую, чтобы получше разобраться) и через Google Fonts (слишком просто для учебного задания).

Для начала прочти статью про font-face: http://habrahabr.ru/post/113136/
И это более новую версию: https://css-tricks.com/snippets/css/using-font-face/ (англ, но код ты поймешь)

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

Вот тут информация про поддержку браузерами разных форматов шрифтов:

http://caniuse.com/#feat=woff2
http://caniuse.com/#feat=eot
http://caniuse.com/#feat=ttf
https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face

Заметь,я упомянул разные форматы. Это значит, тебе надо сконвертировать шрифт в них. Руками делать это гиблое дело, потому топай на http://www.fontsquirrel.com/tools/webfont-generator и создавай.

Заметь что там можно вырезать из шрифта лишние символы и сильно уменьшить его вес. Также этот сервис генерирует CSS для подключения шрифта. Попробуй им воспользоваться. Имей в виду что для генерируемого пользователем контента (комментарии) трудно угадать какие символы можно вырезать. Но у нас этой проблемы нет.

Также, тебе не нужен весь мегабайт шрифтов. Тебе нужны толкьо те начертания (того веса и наклона) которые реально используются на сайте. Особое внимание удели весам. Open Sans имеет по моему 5 или 6 вариантов разного веса (вес это степень жирности букв) и тебе надо выбрать правильные: https://www.google.com/fonts/specimen/Open+Sans

Имей в виду что не все шрифты можно свободно распространять. Не скачивай пиратские шрифты, особенно если работаешь с иностранными заказчиками. Вот к примеру одна российская студия преследует тех кто использует ее шрифты: http://www.artlebedev.ru/studio/legal/ Шрифты на Google Fonts разрешены к бесплатному использованию и с ними проблем быть на должно.

Для проверки что шрифт загружается из сети, ты можешь заменить его имя (временно) в CSS например на OpenSans2.

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

Что у тебя за странные отступы перед селектором в CSS? Обычно пишут так:

.class {
....x: y;
}

Или так:

.class { x: y; w: z; }

Также, сохрани css файл в utf-8.

> header {


> width: 100%;


> min-width: 900px;


У блочных элементов ширина 100% по умолчанию. min-width лучше указывать на html, чтобы это действовало на всю страницу а не на отдельные части

Насчет ширины — давай сделаем так. На совсем узкой странице пусть допустим ширина серединки будет 900px + 10px поля с краев. На более широкой странице ширина середины увеличивается до 1100px, а дальше растут уже поля с краев. Это достигается с помощью min (на html) и max-width (на wrapper).

Также, чтобы научиться адаптивному дизайну, попробуй сделать версию страницы для малекнькой (<= 800) ширины, когда страница перестраивается в виде вертикальной цепочки из блоков. Такие страницы удобно смотреть на смартфоне например. Для этого надо использовать media queries и @media. После того как это сделаешь, добавь meta viewport чтобы мобильные устройства знали что страница под них оптимизирована и не отображали ее в уменьшенном виде.

Для лого можно объединить теги div и a.

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

> .top-dark-gray-block {


> height: 350px;


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

Ну и править код в котором нет фиксированных размеров, тоже проще выходит.

> .first-line-top-dark-gray-block {


> width: 900px;


Вот это плохо, что ты копипастишь эти width 900px. Ты представляешь сколько труда придется приложить чтобы поменять это? Убирай-ка эту копипасту. Тем более, блочные элементы по умолчанию занимают всю ширину родителя и писать width тут вообще не надо. Почитай-ка: http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/

Логотип у тебя по моему меньше чем в макете. Кнопка See Portfolio не соответтвует размерами макету, возможно из-за отстутствия шрифта у меня.

> .first-line-top-dark-gray-block


Вот это все равно плохое имя для класса. Неправильно в общем называть классы по внешнему виду. Ведь при редизайне они потеряют свой смысл. Достаточно добавить одну строку и first-line перестанет быть first. Надо давать такие названия: top-menu, jumbotron (блок с большим текстом), advantages, advantages-block (блок с 4 колонками), portfolio, portfolio-categories, portfolio-item. Это делает твой код долговечнее и читабельнее.

> box-sizing: border-box;


Для расширения охвата браузеров добавь версии с вендорными префиксами, -webkit-box-sizing и -moz-box-sizing. Аналогично с border-radius и transition.

Например старый фаерфокс (до версии 29) не понимает box-sizing, а -moz-box-sizing должен понять.

> width: 25%;


Если будешь делать 3 колонки помни про округление и что в итоге ширина в сумме может получиться больеш 100%

Проверь отступы. На макете например под 4 колонками есть паддинг снизу, пикселей 70-80, у тебя нет.

text-before-portfolio и portfolio-buttons-and-works это одна секция, не две.
http://maketi.esy.es/ #874 #526186
>>524328

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

> <div class="header-words">


><a class="header-word" href="HOME">Home</a>


Традиционно меню делают с помощью списка ul/li (типа меню это список ссылок). Также, можно делать его через тег <nav>

> We are <b>Webpaint</b></div>


Сейчас используют тег strong. Так как в HTML не должно быть кода отвечающего за оформление, то тег strong имеет значение «акцентированный текст»: http://htmlbook.ru/html/strong

<b> правда не удалили, ему в HTML5 дали новый, не связанный с внешним видом, смысл: http://habrahabr.ru/post/129147/

> class="button1"


Лучше сделать нормальное имя без цифры, например large-button

> <div class="pic-android"></div>


Я думаю этот пустой див можно либо заменить на padding + backgorund либо (если используется спрайт) на псевдоэлемент. А класс обозначающий картинку перенести на родителя.

> <b>Consectetur</b>


Это подзаголовок

> <h1>Our Features Works</h1>


h1 это единственнвй и главный заголовок. Тут явно заголовок второго уровня (так как он описывает не всю страницу а только секцию на ней). Я думаю, на этой странице главный заголовок это «We are Webpaint».

> <p><a id="link_portfolio"></a></p>


P значит абзац текста. Текста тут нет значит и p быть не должно быть. А атрибут id можно повесить на <section class="portfolio-buttons-and-works"> где ему самое место.

> <input type="radio" name="button" checked="checked" id="button1"></input>


У input нет закрывающего тега.

> <a href="#" class="all graphic">


all наверно можно не писать, если оно у всех картинок есть?

> <h4>Vestibulum id ligula porta felis euismod semper, malesuada euismod.</h4>


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

> <a href="#rss"><div id="rss"></div></a>


Див-то зачем? И без него наверно можно сделать ведь? Опять же, я бы сделал тут списком, но можно и просто теги <a> поставить. Вместо id лучше использовать класс так как они удобнее и их можно повторять.

> <h5>@ 2013 Webpaint. All Rights Reserved.</h5>


Это не заголовок. hN это не тег для задания размера текста.

Теперь перйдем к CSS. Начнем с вопроса про шрифты.

Подключать их можно 2 способами: вручную (рекомендую, чтобы получше разобраться) и через Google Fonts (слишком просто для учебного задания).

Для начала прочти статью про font-face: http://habrahabr.ru/post/113136/
И это более новую версию: https://css-tricks.com/snippets/css/using-font-face/ (англ, но код ты поймешь)

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

Вот тут информация про поддержку браузерами разных форматов шрифтов:

http://caniuse.com/#feat=woff2
http://caniuse.com/#feat=eot
http://caniuse.com/#feat=ttf
https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face

Заметь,я упомянул разные форматы. Это значит, тебе надо сконвертировать шрифт в них. Руками делать это гиблое дело, потому топай на http://www.fontsquirrel.com/tools/webfont-generator и создавай.

Заметь что там можно вырезать из шрифта лишние символы и сильно уменьшить его вес. Также этот сервис генерирует CSS для подключения шрифта. Попробуй им воспользоваться. Имей в виду что для генерируемого пользователем контента (комментарии) трудно угадать какие символы можно вырезать. Но у нас этой проблемы нет.

Также, тебе не нужен весь мегабайт шрифтов. Тебе нужны толкьо те начертания (того веса и наклона) которые реально используются на сайте. Особое внимание удели весам. Open Sans имеет по моему 5 или 6 вариантов разного веса (вес это степень жирности букв) и тебе надо выбрать правильные: https://www.google.com/fonts/specimen/Open+Sans

Имей в виду что не все шрифты можно свободно распространять. Не скачивай пиратские шрифты, особенно если работаешь с иностранными заказчиками. Вот к примеру одна российская студия преследует тех кто использует ее шрифты: http://www.artlebedev.ru/studio/legal/ Шрифты на Google Fonts разрешены к бесплатному использованию и с ними проблем быть на должно.

Для проверки что шрифт загружается из сети, ты можешь заменить его имя (временно) в CSS например на OpenSans2.

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

Что у тебя за странные отступы перед селектором в CSS? Обычно пишут так:

.class {
....x: y;
}

Или так:

.class { x: y; w: z; }

Также, сохрани css файл в utf-8.

> header {


> width: 100%;


> min-width: 900px;


У блочных элементов ширина 100% по умолчанию. min-width лучше указывать на html, чтобы это действовало на всю страницу а не на отдельные части

Насчет ширины — давай сделаем так. На совсем узкой странице пусть допустим ширина серединки будет 900px + 10px поля с краев. На более широкой странице ширина середины увеличивается до 1100px, а дальше растут уже поля с краев. Это достигается с помощью min (на html) и max-width (на wrapper).

Также, чтобы научиться адаптивному дизайну, попробуй сделать версию страницы для малекнькой (<= 800) ширины, когда страница перестраивается в виде вертикальной цепочки из блоков. Такие страницы удобно смотреть на смартфоне например. Для этого надо использовать media queries и @media. После того как это сделаешь, добавь meta viewport чтобы мобильные устройства знали что страница под них оптимизирована и не отображали ее в уменьшенном виде.

Для лого можно объединить теги div и a.

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

> .top-dark-gray-block {


> height: 350px;


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

Ну и править код в котором нет фиксированных размеров, тоже проще выходит.

> .first-line-top-dark-gray-block {


> width: 900px;


Вот это плохо, что ты копипастишь эти width 900px. Ты представляешь сколько труда придется приложить чтобы поменять это? Убирай-ка эту копипасту. Тем более, блочные элементы по умолчанию занимают всю ширину родителя и писать width тут вообще не надо. Почитай-ка: http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/

Логотип у тебя по моему меньше чем в макете. Кнопка See Portfolio не соответтвует размерами макету, возможно из-за отстутствия шрифта у меня.

> .first-line-top-dark-gray-block


Вот это все равно плохое имя для класса. Неправильно в общем называть классы по внешнему виду. Ведь при редизайне они потеряют свой смысл. Достаточно добавить одну строку и first-line перестанет быть first. Надо давать такие названия: top-menu, jumbotron (блок с большим текстом), advantages, advantages-block (блок с 4 колонками), portfolio, portfolio-categories, portfolio-item. Это делает твой код долговечнее и читабельнее.

> box-sizing: border-box;


Для расширения охвата браузеров добавь версии с вендорными префиксами, -webkit-box-sizing и -moz-box-sizing. Аналогично с border-radius и transition.

Например старый фаерфокс (до версии 29) не понимает box-sizing, а -moz-box-sizing должен понять.

> width: 25%;


Если будешь делать 3 колонки помни про округление и что в итоге ширина в сумме может получиться больеш 100%

Проверь отступы. На макете например под 4 колонками есть паддинг снизу, пикселей 70-80, у тебя нет.

text-before-portfolio и portfolio-buttons-and-works это одна секция, не две.
http://maketi.esy.es/ #875 #526187
>>524328

Далее, вот этот вот элемент: <label for="button1">. Открой инспектор (ctrl + shift + i) и посмотри какую область он занимает на странице. Это происходит потому что это у тебя на дочернем элементе стоит margin-left 200px. Кстати, это тоже ошибка. Кнопки надо центрировать, а не подбирать отступ на глаз, который развалится как только мы добавим еще кнопку или поменяем текст. Вряд ли твои коллеги будут рады этому.

Тут надо просто сделать блок с text-align center, а внутри кнопки сделать инлайн-блоками. Чувствую, у тебя тут пробелы в знаниях имеются.

Почему инлайн-блоки, а не инлайн элементы? Потому что сейчас у тебя label по высоте меньше чем кнопка.

> border: 1px solid #FF6760;


по моему тут проще вообще отключить бордер

> transition: 0.5s;


Укажи анимируемые свойства явно.

> line-height: 3;


не очень понятно зачем тут это если есть паддинг

> input:nth-of-type(1):checked + label > span, .portfolio-buttons-and-works > input:nth-of-type(2):checked + label > span


По моему тут не нужны nth-of-type.

> input:nth-of-type(1):checked ~ .all, .portfolio-buttons-and-works > input:nth-of-type(2):checked ~ .all.graphic


Я думаю вместо номеров удобнее и читабельнее исплоьзовать класс на инпуте, например portfolio-btn-all:checked

> .work {


> width: 225px;


> float: left;


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

> font-size: 0;


Что за грязные трюки?

Социальные иконки надо выводить без img. Ты просто выводишь ссылки в виде квадратиков, и им задаешь background с отрицательным отступом, почитай:

https://learn.javascript.ru/css-sprite
http://webo.in/articles/habrahabr/08-all-about-css-sprites/
http://habrahabr.ru/post/159027/

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

Также для них надо сделать эффект при наведении. Например потемнение или осветление.

> #bottom-dark-gray-block-h5-1:before {


> content: url(../img/kap.png);


Эти мелкие иконки тоже надо засунуть в спрайт. И темные иконки с андроидом в блоке преимуществ тоже в спрайт.

> .social-icons {


> margin-left: 365px;


Используй text-align для центрирования.

> <a href="#rss"><div id="rss">


div можно выпилить. Ты всегда можешь сделать <a> блоком или инлайн-блоком или чем угодно.

У тебя есть скругление при наведении на картинку портфолио. Но там какое-то странно скругление, как будто оно обрезано как-то.
http://maketi.esy.es/ #875 #526187
>>524328

Далее, вот этот вот элемент: <label for="button1">. Открой инспектор (ctrl + shift + i) и посмотри какую область он занимает на странице. Это происходит потому что это у тебя на дочернем элементе стоит margin-left 200px. Кстати, это тоже ошибка. Кнопки надо центрировать, а не подбирать отступ на глаз, который развалится как только мы добавим еще кнопку или поменяем текст. Вряд ли твои коллеги будут рады этому.

Тут надо просто сделать блок с text-align center, а внутри кнопки сделать инлайн-блоками. Чувствую, у тебя тут пробелы в знаниях имеются.

Почему инлайн-блоки, а не инлайн элементы? Потому что сейчас у тебя label по высоте меньше чем кнопка.

> border: 1px solid #FF6760;


по моему тут проще вообще отключить бордер

> transition: 0.5s;


Укажи анимируемые свойства явно.

> line-height: 3;


не очень понятно зачем тут это если есть паддинг

> input:nth-of-type(1):checked + label > span, .portfolio-buttons-and-works > input:nth-of-type(2):checked + label > span


По моему тут не нужны nth-of-type.

> input:nth-of-type(1):checked ~ .all, .portfolio-buttons-and-works > input:nth-of-type(2):checked ~ .all.graphic


Я думаю вместо номеров удобнее и читабельнее исплоьзовать класс на инпуте, например portfolio-btn-all:checked

> .work {


> width: 225px;


> float: left;


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

> font-size: 0;


Что за грязные трюки?

Социальные иконки надо выводить без img. Ты просто выводишь ссылки в виде квадратиков, и им задаешь background с отрицательным отступом, почитай:

https://learn.javascript.ru/css-sprite
http://webo.in/articles/habrahabr/08-all-about-css-sprites/
http://habrahabr.ru/post/159027/

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

Также для них надо сделать эффект при наведении. Например потемнение или осветление.

> #bottom-dark-gray-block-h5-1:before {


> content: url(../img/kap.png);


Эти мелкие иконки тоже надо засунуть в спрайт. И темные иконки с андроидом в блоке преимуществ тоже в спрайт.

> .social-icons {


> margin-left: 365px;


Используй text-align для центрирования.

> <a href="#rss"><div id="rss">


div можно выпилить. Ты всегда можешь сделать <a> блоком или инлайн-блоком или чем угодно.

У тебя есть скругление при наведении на картинку портфолио. Но там какое-то странно скругление, как будто оно обрезано как-то.
#876 #526188
>>526165

Почитай про colspan: http://htmlbook.ru/html/td/colspan

там надо указать число колонок, а не проценты.

> То есть почти зачёт, после исправленных перечисленных тобой недочётов можно переходить к файлообменнику?


> Я уже и JS начал учить, хочу там всё с аяксом красиво сделать.


Исправь замечания и сдай снова на проверку. делать файлообменник можно не дожидаясь меня. Аякс будет на файлообменнике (добавление комментария).
#877 #526190
>>524469

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

>>524474

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

>>524479

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


По моему только лекции + экзамен потом. ПРичем лекции такие что все равно надо самому разбираться.

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

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

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


И рискует им так и не стать.

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


Это приемлемо.
#878 #526194
>>526186
>>526187
Спасибо за подробное объяснение моих ошибок, с завтрашнего для буду все исправлять. Сегодня и так 14й час за ноутбуком сижу.
О Боги, да здесь же работы на годы! Все больше накатывает чувство стыда от того, что мой друг студент-программист сказал, что этот макет отнял бы у него максимум 4 часа.
#879 #526196
>>524484

Почему аутисты? Текст банально удобнее так как ты можешь его осмотреть в общем, можешь читать по диагонали, на слух (по моему) банально неудобнее.

>>524483

> Задротская нечитабельная херня.


Просто это рассчитано на тех уто уже знает сети, там в самом начале стоит предупрежедние.

> Я спросил про основные термины из области системного администрирования, ты мне подсунул какую-то парашу.


да, не то

>>524493

Я наверно немного опоздал но все же.

> что такое "открытые системы",


Это концепция что устройства разных производителей можно подключить к одной сети. Сейчас это кажется естественным и очевидным, но в 70-х каждый производитель компьютера изобретал свои форматы файлов, форматы дискет, свое сетевое оборудование, свои разъемы, свои клавиатуры, свои принтеры. И сам писал программы к своему компьютеру. Потому современному человеку не очень понятно что значит «открытый» и как может быть по-другому. Это как если бы например пользователи айфонов сидели в одном интернете, а поьзоатели андроидов в другом.

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

>>524502

Там все же не очень понятно объясняется. Это лекции в интуите предполагают видимо уже какие-то начальные знания.

>>525121

Вот еще кое-что:

Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('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');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
#879 #526196
>>524484

Почему аутисты? Текст банально удобнее так как ты можешь его осмотреть в общем, можешь читать по диагонали, на слух (по моему) банально неудобнее.

>>524483

> Задротская нечитабельная херня.


Просто это рассчитано на тех уто уже знает сети, там в самом начале стоит предупрежедние.

> Я спросил про основные термины из области системного администрирования, ты мне подсунул какую-то парашу.


да, не то

>>524493

Я наверно немного опоздал но все же.

> что такое "открытые системы",


Это концепция что устройства разных производителей можно подключить к одной сети. Сейчас это кажется естественным и очевидным, но в 70-х каждый производитель компьютера изобретал свои форматы файлов, форматы дискет, свое сетевое оборудование, свои разъемы, свои клавиатуры, свои принтеры. И сам писал программы к своему компьютеру. Потому современному человеку не очень понятно что значит «открытый» и как может быть по-другому. Это как если бы например пользователи айфонов сидели в одном интернете, а поьзоатели андроидов в другом.

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

>>524502

Там все же не очень понятно объясняется. Это лекции в интуите предполагают видимо уже какие-то начальные знания.

>>525121

Вот еще кое-что:

Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('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');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
#880 #526200
>>525142

Не в таблице, а в массиве наверно?

Вот так: $x = $m[0][1];

Ты задачи на массивы все решил?

>>525441

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

> Вариант 1 с дивами-обертками:


Ок, будем считать что верно.

> Вариант 2 с box-sizing:


А на что влияет box-sizing? Он никак не взаимодействует с margin и учитывает разве что 1px у бордера, то есть практически не влияет на верстку.

> потому что префиксы браузеров -moz-, -webkit- и им подобные не любит валидатор.


Охват браузеров все же важнее валидатора, да и код с одним дивом лучше чем с двумя.

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

> http://jsfiddle.net/2zpm9mqa/


> font: 14px/1.2 #000 arial;


В конец списка шрифтов надо писать стандартный sans, sans-serif, monospace или cursive для тех у кого нет ариала.

В остальном верно.

> http://jsfiddle.net/t5pmcLb5/1/


> Это почему-то не работает:


Нельзя указывать цвет в font

> font-size: 40px;


Вместе с fnt-size всегда указывай line heght, иначе оно наследуется от родителя

> font-family: "Times New Roman";


Нужен стандартный шрифт в конце: http://htmlbook.ru/css/font-family

> При чем тут вообще em? Чтобы показать, что стили любого элемента можно переопределить?


Да

> Не понял задание.


Задание на умение переопределять стили и HTML мнемоники.

> 4 задание


Там не 10px между блоками, смотри сам: https://jsfiddle.net/3jok8w7k/1/

Почитай-ка подказки к задаче.

> ? А, у них там принято писать <br/> под xhtml, поэтому разметка ломается.


Ага до сих пор в параллельной реальности (в которой используют XHTML) живут

> Не понял, как должен по заданию себя вести синий блок при малой ширине браузера.


Занимать все доступное место по ширине, как у тебя и сделано

> 5) http://jsfiddle.net/pnm2jrto/



line-height и стандартного шрифта не хватает, а так все верно.
#880 #526200
>>525142

Не в таблице, а в массиве наверно?

Вот так: $x = $m[0][1];

Ты задачи на массивы все решил?

>>525441

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

> Вариант 1 с дивами-обертками:


Ок, будем считать что верно.

> Вариант 2 с box-sizing:


А на что влияет box-sizing? Он никак не взаимодействует с margin и учитывает разве что 1px у бордера, то есть практически не влияет на верстку.

> потому что префиксы браузеров -moz-, -webkit- и им подобные не любит валидатор.


Охват браузеров все же важнее валидатора, да и код с одним дивом лучше чем с двумя.

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

> http://jsfiddle.net/2zpm9mqa/


> font: 14px/1.2 #000 arial;


В конец списка шрифтов надо писать стандартный sans, sans-serif, monospace или cursive для тех у кого нет ариала.

В остальном верно.

> http://jsfiddle.net/t5pmcLb5/1/


> Это почему-то не работает:


Нельзя указывать цвет в font

> font-size: 40px;


Вместе с fnt-size всегда указывай line heght, иначе оно наследуется от родителя

> font-family: "Times New Roman";


Нужен стандартный шрифт в конце: http://htmlbook.ru/css/font-family

> При чем тут вообще em? Чтобы показать, что стили любого элемента можно переопределить?


Да

> Не понял задание.


Задание на умение переопределять стили и HTML мнемоники.

> 4 задание


Там не 10px между блоками, смотри сам: https://jsfiddle.net/3jok8w7k/1/

Почитай-ка подказки к задаче.

> ? А, у них там принято писать <br/> под xhtml, поэтому разметка ломается.


Ага до сих пор в параллельной реальности (в которой используют XHTML) живут

> Не понял, как должен по заданию себя вести синий блок при малой ширине браузера.


Занимать все доступное место по ширине, как у тебя и сделано

> 5) http://jsfiddle.net/pnm2jrto/



line-height и стандартного шрифта не хватает, а так все верно.
#881 #526202
>>525477

> 6) http://jsfiddle.net/8mk9bc62/


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

> .menu li {


> list-style-type: none;


Это можно поставить на ul, оно наследуется

> По умолчанию


> margin-before: 1em;


> padding-start: 40px;


Более того, раньше ИЕ использовал для отступа одно свойтво, а остальные браузеры другое.

> .menu a:visited,


> color: inherit;


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

> Тут должен начаться педантичный холивар,


> какой способ лучше использовать: паддинги,


> overflow или clear.


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

http://nicolasgallagher.com/micro-clearfix-hack/ (англ)
http://webknowledge.ru/novaya-mikro-versiya-haka-clearfix/ (рус)

> 7)


> Откуда-то берется один лишний пиксель.


Это не фаерфокс случаем? http://davidwalsh.name/firefox-buttons

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

Дробные числа не советую, разные браузеры округляют по разному, это лишние проблемы на твою голову: http://habrahabr.ru/post/31392/

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

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

Между кнопкой и инпутом больше чем 10px

> 8 задача


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


Один анон сделал классы .note1, .note2 пришлось добавить намек что блоков может быть больше.

> Не понимаю, что имеется ввиду. Намек на выпадение плавающего блока?


Это значит что если мы засунем туда стандартный текст вида

<h1>...</h1>

<p>...</p>

<ul><li>...</li></ul>

Все должно работать. А у тебя? https://jsfiddle.net/vhm7wnh7/1/

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

Почитай также подсказки к задаче.

> <div class="paragraph">


Ты только что изобрел тег <p>. Зачем?

> Решается заданием padding у параграфа.


Нет, padding добавлять надо на контейнере или body. Иначе он будет применяться не ко всем тегам в содержимом.
#881 #526202
>>525477

> 6) http://jsfiddle.net/8mk9bc62/


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

> .menu li {


> list-style-type: none;


Это можно поставить на ul, оно наследуется

> По умолчанию


> margin-before: 1em;


> padding-start: 40px;


Более того, раньше ИЕ использовал для отступа одно свойтво, а остальные браузеры другое.

> .menu a:visited,


> color: inherit;


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

> Тут должен начаться педантичный холивар,


> какой способ лучше использовать: паддинги,


> overflow или clear.


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

http://nicolasgallagher.com/micro-clearfix-hack/ (англ)
http://webknowledge.ru/novaya-mikro-versiya-haka-clearfix/ (рус)

> 7)


> Откуда-то берется один лишний пиксель.


Это не фаерфокс случаем? http://davidwalsh.name/firefox-buttons

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

Дробные числа не советую, разные браузеры округляют по разному, это лишние проблемы на твою голову: http://habrahabr.ru/post/31392/

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

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

Между кнопкой и инпутом больше чем 10px

> 8 задача


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


Один анон сделал классы .note1, .note2 пришлось добавить намек что блоков может быть больше.

> Не понимаю, что имеется ввиду. Намек на выпадение плавающего блока?


Это значит что если мы засунем туда стандартный текст вида

<h1>...</h1>

<p>...</p>

<ul><li>...</li></ul>

Все должно работать. А у тебя? https://jsfiddle.net/vhm7wnh7/1/

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

Почитай также подсказки к задаче.

> <div class="paragraph">


Ты только что изобрел тег <p>. Зачем?

> Решается заданием padding у параграфа.


Нет, padding добавлять надо на контейнере или body. Иначе он будет применяться не ко всем тегам в содержимом.
#882 #526203
>>525513

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

Должна быть выделенная изолированная сеть.

>>525588

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

>>525754

> Бросаем кубик.


Верно

> кубики


правильно

> кредит


Хорошо бы убрать копипасту:

> $creditBalance = $creditBalance - $monthlyPayment;


> \techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal}



Дублирование кода это главное зло.

> вклад на миллион


Все верно

> средний балл


Верно

> рост


Правильно

> могу лт выучить php


Тут все хорошо. Насчет 5.4, эта версия уже считается старьем так что используй смело.

> стихи


> $word2[mt_rand(0,6)]


нехорошо, что надо руками считать числа. Надо чтобы само сичталось. Также посмотри функцию array_rand в мануале.
#882 #526203
>>525513

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

Должна быть выделенная изолированная сеть.

>>525588

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

>>525754

> Бросаем кубик.


Верно

> кубики


правильно

> кредит


Хорошо бы убрать копипасту:

> $creditBalance = $creditBalance - $monthlyPayment;


> \techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal}



Дублирование кода это главное зло.

> вклад на миллион


Все верно

> средний балл


Верно

> рост


Правильно

> могу лт выучить php


Тут все хорошо. Насчет 5.4, эта версия уже считается старьем так что используй смело.

> стихи


> $word2[mt_rand(0,6)]


нехорошо, что надо руками считать числа. Надо чтобы само сичталось. Также посмотри функцию array_rand в мануале.
#883 #526212
>>525837

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


На уровне ядра — значит все функции (их в PHP очень много, сотни) работы со строками правильно режут строки на буквы.

Сейчас PHP не поддерживает специально никакие кодировки а строки рассматривает как набор байт (то есть абстрактных чисел), а не букв. Строки в памяти хранятся в том же виде и кодировке, в какой вписаны в коде. strlen возвращает число байт в строке. Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8

Более того, разница будет например при сравнении строк. Сейчас строки сравниваются по кодам символов и например буква «ё» меньше чем «а» так как идет в юникоде раньше. Вот мой урок про сравнение строк: https://gist.github.com/codedokode/ea09d0224a4df0c4442f

Как видишь, там много разных интересных особенностей.

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

PHP сам не знает какую кодировку ты используешь для программы. Это нигде не задается. Если у тебя все в utf-8, все хорошо. Если не все в utf-8 — начинаются проблемы и необходимость ставить барьеры для перекодировки, и легко сделать где-то ошибку.

Как я помню, поддержка требовала перелопатить весь код php и от нее отказались в итоге.

Другие языки, напрмер, JS, java, python, знают в какой кодировке они хранят строки.

> В чем отличие между "на уровне ядра" и в качестве врубленного по умолчанию расширения?


У тебя правильно со строками работают толко mb функции, а все остальные — нет.

Вот история от разработчиков, пытавшихся сделать поддержку unicode в ядре на англ. : http://www.slideshare.net/andreizm/the-good-the-bad-and-the-ugly-what-happened-to-unicode-and-php-6

Про Юникод что-то написано в вики: https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4

> И добавят ли его в php7 на уровне ядра?


Нет скорее всего

> Что мешает добавить функции mb_ в сам php?


Надо переделать сотни других существующих функций. Включая расширения.

>>525849

Нету.
#883 #526212
>>525837

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


На уровне ядра — значит все функции (их в PHP очень много, сотни) работы со строками правильно режут строки на буквы.

Сейчас PHP не поддерживает специально никакие кодировки а строки рассматривает как набор байт (то есть абстрактных чисел), а не букв. Строки в памяти хранятся в том же виде и кодировке, в какой вписаны в коде. strlen возвращает число байт в строке. Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8

Более того, разница будет например при сравнении строк. Сейчас строки сравниваются по кодам символов и например буква «ё» меньше чем «а» так как идет в юникоде раньше. Вот мой урок про сравнение строк: https://gist.github.com/codedokode/ea09d0224a4df0c4442f

Как видишь, там много разных интересных особенностей.

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

PHP сам не знает какую кодировку ты используешь для программы. Это нигде не задается. Если у тебя все в utf-8, все хорошо. Если не все в utf-8 — начинаются проблемы и необходимость ставить барьеры для перекодировки, и легко сделать где-то ошибку.

Как я помню, поддержка требовала перелопатить весь код php и от нее отказались в итоге.

Другие языки, напрмер, JS, java, python, знают в какой кодировке они хранят строки.

> В чем отличие между "на уровне ядра" и в качестве врубленного по умолчанию расширения?


У тебя правильно со строками работают толко mb функции, а все остальные — нет.

Вот история от разработчиков, пытавшихся сделать поддержку unicode в ядре на англ. : http://www.slideshare.net/andreizm/the-good-the-bad-and-the-ugly-what-happened-to-unicode-and-php-6

Про Юникод что-то написано в вики: https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4

> И добавят ли его в php7 на уровне ядра?


Нет скорее всего

> Что мешает добавить функции mb_ в сам php?


Надо переделать сотни других существующих функций. Включая расширения.

>>525849

Нету.
#884 #526214
http://career.ru/vacancy/14218095
Очень хорошие условия. Но чому-то отталкивающе действуют.
#885 #526215
>>525877

У миддла есть не только знания но и опыт. Знание Юи это не миддловские знания.

>>525927

> 9) http://jsfiddle.net/9grpj1hf/


> <div class="clear-dummy"></div>


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

> font-size: 14px;


Вместе с font-size указывай line-height

> <div class="description">


Я думаю, тут можно обойтись без этого дива. Попробуй его убрать.

> 10)



> Если бы я знал хотя бы высоту этого блока


то это было бы задание не для нашего треда, а для /web

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


Абсолютное позиционирование без указания top/bottom. Если не укзать положение то элеимент располагается там же где он был бы в потоке.

> То есть непонятно как ее пристыковать к нижнему краю изображения


Абсолютное позиционирование конечно

http://softwaremaniacs.org/blog/2005/08/03/css-layout-positioning/
http://htmlbook.ru/samlayout/blochnaya-verstka/pozitsionirovanie-elementov

Кстати, раз ты не смог с первого раза сделать задачу, тебе дополнительное задание: сделай чтобы при наведении мыши на картинку надпись плавно сворачивалась, а при уведении восстанавливалась. Тебе поможет transition.
#885 #526215
>>525877

У миддла есть не только знания но и опыт. Знание Юи это не миддловские знания.

>>525927

> 9) http://jsfiddle.net/9grpj1hf/


> <div class="clear-dummy"></div>


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

> font-size: 14px;


Вместе с font-size указывай line-height

> <div class="description">


Я думаю, тут можно обойтись без этого дива. Попробуй его убрать.

> 10)



> Если бы я знал хотя бы высоту этого блока


то это было бы задание не для нашего треда, а для /web

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


Абсолютное позиционирование без указания top/bottom. Если не укзать положение то элеимент располагается там же где он был бы в потоке.

> То есть непонятно как ее пристыковать к нижнему краю изображения


Абсолютное позиционирование конечно

http://softwaremaniacs.org/blog/2005/08/03/css-layout-positioning/
http://htmlbook.ru/samlayout/blochnaya-verstka/pozitsionirovanie-elementov

Кстати, раз ты не смог с первого раза сделать задачу, тебе дополнительное задание: сделай чтобы при наведении мыши на картинку надпись плавно сворачивалась, а при уведении восстанавливалась. Тебе поможет transition.
#886 #526216
>>525927

> 11) http://jsfiddle.net/9tLfgyej/1/



> input[type="radio"] {


> display: none;


Это влияет на все кнопки на странице. Сделай чтобы действовало только на кнопки внутри твоего виджета иначе его нельзя добавить к существующей форме.

> Уголки вылезают наружу при выделении.


Ты поверх скругленного label выводишь квадратный серый span вот он и закрывает уголки. Увеличь масштаб и увидь.

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

> Все-таки логичнее было бы использовать label с атрибутом for.


Чем логичнее? Лишний код писать надо.

ну и тут https://jsfiddle.net/dug3ju1b/1/ двойные линии
#887 #526218
>>525934

Там квадратный спан их закрывает.

>>525938

Для маленькой ширины сделать можно вертикальную версию.

>>525955

Все верно

>>526051

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

>>526064

Оно работает на массивах, а не объектах и это конечно не очень хорошо.

>>526118

http://uleming.github.io/gitbook/4_%D0%9E%D1%82%D0%BC%D0%B5%D0%BD%D0%B0_%D0%B2_git_-_%D0%A1%D0%B1%D1%80%D0%BE%D1%81,_%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%9E%D1%82%D0%BA%D0%B0%D1%82.html

git revert SHA должно сработать

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

>>526194

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

Так что не на годы, на пару недель максимум.

>>526214

Ну сходил бы проверил. Или ты боишься что паспорт отберут и в подвале закроют?
#887 #526218
>>525934

Там квадратный спан их закрывает.

>>525938

Для маленькой ширины сделать можно вертикальную версию.

>>525955

Все верно

>>526051

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

>>526064

Оно работает на массивах, а не объектах и это конечно не очень хорошо.

>>526118

http://uleming.github.io/gitbook/4_%D0%9E%D1%82%D0%BC%D0%B5%D0%BD%D0%B0_%D0%B2_git_-_%D0%A1%D0%B1%D1%80%D0%BE%D1%81,_%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%9E%D1%82%D0%BA%D0%B0%D1%82.html

git revert SHA должно сработать

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

>>526194

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

Так что не на годы, на пару недель максимум.

>>526214

Ну сходил бы проверил. Или ты боишься что паспорт отберут и в подвале закроют?
#888 #526221
Увидим ли мы перекат? Скоро узнаем.
#889 #526232
Я все же решил перекатиться в существующий тред. да, там много троллей, но ведь есть добропорядочные аноны, которые пришли учиться, которые решают задачки и задают вопросы, и мы не можем бросить их. Потому телепортируйтесь за мной: >>526228\t
#890 #526258
https://gist.github.com/codedokode/ce30e7a036f18f416ae0

>Задания на яваскрипт (простые)


а есть еще сложные??
#891 #526277
>>526005
var vasya = 'undefined';
if (vasya == 'undefined')
alert('vasya undefined');
Так надо было.
#892 #526303
Перекатывайтесь в >>526228

>>526258

Пока нету. Это больше мотивирующая надпись чтобы люди не пугались.

>>526277

Нет не так
#893 #526421
>>526200

>не работает font: 40px/1.5 #333 "Times New Roman";


>потому что нельзя указывать цвет в font


Что? А почему тогда работает font: 14px/1.2 #000 arial; ?
Ну ладно, мне все равно привычнее писать правила по-отдельности: font-size, font-family, line-height и т.д.

Вопрос не по теме: я недавно пересел на эту вашу убунту, и последнее время стал дико тормозить то ли рабочий стол (xfce), то ли проводник (thunar, иногда вылетает, особенно если быстро кликнуть несколько раз кнопку переходу в папку выше).
Может кто сталкивался, как там его лечить.
Потому что кликаю правой кнопкой по значку на рабочем столе, и жду секунд пять, пока появится контекстное меню. Винчестер скрипит в это время, будто я запускаю yoba-игру.
#894 #526456
Реквестирую топовые гайды или хотя бы годные по yii2(начиная с mvc и т.д). + Плейлисты на ютубе. Если не ответят, в следующем треде задам этот же вопрос. Спасибо
#895 #526462
>>526456
Нету таких, сами в ахуе.
Читай руководство, смотри код демок, которые идут вместе с фреймворком. Поищи простые проекты на гитхабе, написанные на yii.

На ютубе есть пара видеообзоров, практически нулевого качества. Но если хочешь составить общее представление о фреймворке, то может и сгодится для начала.
Тут какой-то заикающийся колхозник с дешевым микрофоном и денвером.
https://www.youtube.com/watch?v=sPPNbGTz_wA&list=PLqJ6zVC9hND8GqR31EcKVlDAeUh6m6z0m
Вот небольшой обзор от более-менее компетентных кодеров, но опять-таки ценности в нем мало.
https://www.youtube.com/user/BioWareSonic/videos
Все это по первому yii, по второму вообще ничего нет.

Привыкай читать техническую документацию (мне самому от этого дико печет), хороших материалов вообще нет.
60 Кб, 1156x695
23 Кб, 702x533
#896 #527294
Пагни в задании опечаточники как сделать всё как на картинке?7 Ну чтоб выводилось слово в котором произошла замена буквы и эта буква выделялась. У меня просто находит две буквы одна инглиш другая русская.
#897 #527383
#898 #527662
>>527294

Вообще мы уже в другом треде.

Ищешь регляркой слова, в которых есть буквы из разных алфавитов, а затем через preg_replace заменяшь неправильные буквы на буквы в скобках.
#899 #528989
Всем привет. Я тут новенький, не кидайте ссаными тряпками.
Погружаюсь в SQL, решаю задачки на sql-ex.ru
Теория там написана сложным для меня языком, наверно я дебил, и она в большинстве случаев мне не помогает.
Сейчас решаю задачу, видел, что некоторые запихивают в FROM скобки с SELECTом. Почему при таком вложении возникает ошибка? Где вообще почитать правила вложения в FROM? В примере я пытаюсь присвоить переменную avg_p первым скобкам и avg_l вторым чтобы позже сложить SUM'ом значения из этих двух переменных в одну. Если интересно, это задание №26 с вышеупомянутого сайта.

SELECT SUM(AVG_Price)
FROM (
SELECT AVG(price) AS AVG_Price
FROM pc p
JOIN product pr ON p.model=pr.model
WHERE maker='A') avg_p, (SELECT AVG(price)
FROM laptop l
JOIN product pr ON l.model=pr.model
WHERE maker='A'
) avg_l

No column name was specified for column 1 of 'avg_l'.
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 29 августа 2015 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски