[Семинар] [Кохана: Легкий PHP Framework] [Брэндон Лю] [Гарвардский университет] [Это CS50.] [CS50.TV] Привет всем. Меня зовут Брэндон. Я младший здесь в колледже делать информатики, и сегодня мы будем говорить о Кохана, который является основой веб-разработки PHP. Сегодня будет живой семинар кодирования, так что я в основном собираются потратить 5-10 минут объясняя, что Кохана является, а потом я буквально собирается построить супер простой блог для вас прямо здесь буквально с нуля. Мы собираемся загрузить код с веб-сайта Kohana, и мы собираемся начать строительство блог, и, надеюсь, это будет очень поучительно, потому что вы увидите, может быть, может быть, я сделаю некоторые ошибки, и вы увидите меня оправиться от них, или вы увидите мой мыслительный процесс, как я строю через этот блог, а между тем, вы также получите знакомы с самой базы. Надеюсь, что это будет очень поучительно упражнения. Во-первых, что же такое база? Если вы принимали CS50 до сих пор, как вы на самом деле не работал ни с одним рамки еще и такое дело. Вы, наверное, сделал 1 PSET веб-разработки уже, и предположим, что вы по-прежнему создавать веб-сайты и держать создания веб-сайтов. Вы начнете замечать некоторые вещи. Первое, что вы заметите, что вы, вероятно, делать то же самое снова и снова все время, вещи, как уборка входных данных пользователя, вещи, как организации файлов определенным образом. Другая вещь, вы также, вероятно, заметите, что ваш код может начать, чтобы стать очень, очень грязный, и вы можете оставить его грязным и просто очень нелегко поддерживать ее, или вы можете начать структурировать ваш код и делает его модульная определенным образом, чтобы сделать ее более управляемой. Это где веб-рамки в основном вошли Эти люди, которые построили много веб-сайтов, они сказали, "Мы не должны повторить это каждый раз мы строим веб-сайта." "Почему бы нам просто не сделать пакет, который делает все эти вещи для вас каждый раз, когда вы хотите создать свой сайт? " И так, что, когда вы делаете новый веб-сайт, Вы просто сосредоточиться на том, что именно этот конкретный веб-сайт о. Вам не нужно повторять все различные конфигурации и разделение кодов и переписывания кода что вам часто приходится делать, когда вы делаете веб-сайтов. Идея состоит в том, что рамочное позволяет писать код более высокого уровня не беспокоясь о деталях более низкого уровня. Деталь нижнего уровня может быть что-то вроде дело с очистки входных данных пользователя. Это то, что вы не должны действительно нужно беспокоиться о. Вы должны сосредоточиться на том, что ваша распределение веб самом деле о. Он устраняет много шаблонного кода. Это архитектура, для вашего проекта. Самый популярный из них будет модель-представление-контроллер, которые я собираюсь говорить в секунду. И много раз эти рамки воплощают набор процедур, правила и практические рекомендации для вас использовать так что, когда вы принять веб-фреймворк вы должны написать свой код в определенном смысле, и это, как правило согласованы набор принципов сообществом, что, как правило, принимается равным хороший способ написания кода. Это делает ваш код более легким в обслуживании, более удобным, так далее и тому подобное. И, наконец, что я хочу подчеркнуть, о рамках по сравнению с библиотеками эта идея о инверсии контроля, и такое дело. Разница между библиотекой и рамках, что с библиотекой вы все еще пишу основной программы, и вы вроде вызова библиотеки и призывая в библиотеку, чтобы сделать что-то для вас. Разница между библиотекой и рамках является то, что база начинается с контроля, и это вызывает ваш код, так что вы можете думать об этом как - вот почему это называется база - каркас обеспечивает этот кадр и структуру вашего кода, и вы заполните отверстия, и это станет более очевидным в секунду когда вы видите меня начинают писать код в контексте рамках. Вы увидите, что я заполнения пробелов, и каркас вид контроля всех движущихся частей, и я должен положить кусочки в нужных местах. Сегодня мы будем говорить о Кохана, который является одним из многих фреймворков. Есть веб-рамки, и есть те, практически в каждом языке, и я выбираю Кохана потому Кохана, возможно и общепризнанными как самый простой рамках PHP, чтобы забрать. Это самый легкий. Есть и другие них там, которые приходят со многими, многие другие функции, но они имеют тенденцию быть более сложно подобрать. И, наконец, Кохана использует архитектуру MVC. Это достаточно легкий, что мы можем буквально построить проект прямо здесь прямо перед вашими глазами, и вы можете в значительной степени следовать довольно легко. Что такое архитектура MVC? Она выступает за Model-View-Controller, и, возможно, если вы думаете о коде вы писали до сих пор для некоторых из ваших psets веб-разработки Вы можете быть в состоянии видеть некоторые из этого, но, как правило, когда вы начинаете писать более сложный веб-приложений, разделение между этими 3 сегментов становится все более и более очевидным. Я выложил MVC здесь вроде как стек, и часто вы будете слышать люди говорят о стеков в веб-разработке, и это, чтобы проиллюстрировать идею, что каждый слой, каждый компонент на самом деле пытается взаимодействовать только между 2 другими компонентами. Кто-то обращается свой сайт в качестве клиента или браузера. Они взаимодействуют с вашей программой через вид кода. Вид код взаимодействует с контроллером. Контроллер взаимодействует с моделью и модель взаимодействует с базой данных SQL. И нет прыжковый между если вы пишете код правильно. Что означают эти вещи делать? Модель существу является кусок кода, который имеет дело с вашими данными. Все, что имеет дело с базой данных, с объектами, которые вы храните, или извлечения этих объектов в базе данных, что все обрабатывается с помощью модели. Может быть, у вас есть объекты в базе данных. Мы собираемся создать модель, имеющую отношение к должности, так пост может иметь некоторые атрибуты к нему. Вы можете иметь функции вокруг хранения этих сообщений или получения сообщения или фильтрации сообщения и так далее и так далее, и это весь код, который обрабатывается с помощью модели. Контроллер является своего рода логики приложения, и много разных вещей может пойти в логике приложения. Если вы разговариваете с другом API, , которые могут быть там, где вы имеете дело с логикой приложения. Если вы пытаетесь должны принести в данные из нескольких различных моделей и должны объединить их в некотором роде, что часто может быть обработано с помощью контроллера. Например, на Facebook, если вы друг кто-то, то, возможно, что акт установления этих отношений может быть сделано с помощью контроллера. И, наконец, вид код, который генерации, что вы на самом деле видите. Много раз я думаю, что в CS50 psets они действительно не поощрять вас, ребята, чтобы отделить эти 3 вещи. Вы, вероятно, этот большой, длинный файл, где в верхней Вы сделать некоторые SQL-запрос и, возможно, сделать некоторую обработку от данных, извлекаются из базы данных, а затем вы должны все ваши HTML в нижней части. И вы можете обнаружить, что, как вы создаете новые и новые страницы что вы собираетесь иметь некоторые повторения кода, а также, Дело в том, ваш файл становится действительно большой и длинный и становится громоздким в управлении. Причина, почему MVC настолько хорошо считать для ряда причин. Первое, что нечто, называемое разделение интересов которая является идея, что когда у вас есть - идеально 1 кусок кода должен делать 1, а делают это очень хорошо, и вы не должны объединить куски кода, которые делают разрозненные вещи. Например, код и код модели посмотреть, они действительно не должны быть связаны. Они не должны быть в одних и тех же файлов, поэтому, когда вы можете, разделить их так что легко в обслуживании. Другое дело, повторное использование кода. Вы можете найти себе писать тот же запрос SQL или делать аналогичные запросы, которые могут быть забираемой в 1 функции, и это идея моделей и контроллеров, положить его в отдельную функцию, что вы можете использовать в разных местах в проекте. И, наконец, что привязан к сушке код, или не повторяя себя, не повторить себя. Это очень понятной в развитии. Всякий раз, когда вы можете, вы не хотите повторить себя, потому что если вы повторить себя,  это гораздо дороже в обслуживании. Если вы хотите изменить 1 вещь, вы должны изменить его везде, и это приводит к ошибкам, и это ужасно. Хорошо. Любые вопросы до сих пор около Кохана вообще? Великий. Теперь мы собираемся, чтобы погрузиться в живой сессии кодирования, и, надеюсь, все будет хорошо. Я собираюсь в основном построить этот сайт на одном из моих удаленных серверах, и таким образом вы, ребята, можете также см. веб-сайт и получить доступ к веб-сайт, а также окружающая среда лучше выполнен с чем мой удаленной машине, потому что это работает Linux вместо OS X. Мы буквально собирается начать. KohanaFramework.org. Я собираюсь загрузить код с веб-сайта. Я собираюсь копировать адрес ссылки, перейти к моему серверу, загрузить его, и я собираюсь извлечь его. [Студент] Ваш самый большой вы можете сделать текст? [Брэндон Лю] Так лучше? [Студент] Это выполнимо? [Брэндон Лю] Да, это нормально. Я скачал ZIP файл и расстегнула, что в каталог под именем Кохана, и мы собираемся переименовать эту CS50-Кохана, и давайте входить Потрясающе. Здесь вы видите кучу разных файлов. Большинство из вас может игнорировать - we're не собираюсь идти через каждый файла, который здесь из-за наших временных ограничений, но в целом при установке Кохана, первое, что вы делаете это вы перейдите в каталог, и вы будете в основном, делают некоторые тесты среды и еще много чего чтобы убедиться, что ваша среда правильно настроен для запуска Кохана и убедитесь, что все в порядке. Вы можете видеть, большинство вещей прошло, но как правило, вы всегда столкнулись с этой проблемой 1 где он жалуется, что некоторые каталог не доступен для записи, и это потому, что из некоторых разрешений. Я не знаю, сколько вы, ребята узнали о правах доступа к файлам в CS50, но если вы делаете веб-разработки, вы собираетесь столкнуться с этой проблемой много. Я собираюсь сделать его для записи и я думаю, я также должен - там мы идем. Итак, теперь вы можете видеть все прошло, и теперь он расскажет вам, чтобы переименовать файл install.php. Я собираюсь переместить файл install.php, чтобы installed.php, и теперь, если я обновить, это дает мне ошибку, и это, когда отладка приходит дюйма Это где вы можете увидеть, что на самом деле произойдет. Дело в том, по умолчанию, Кохана предполагает, что ваш проект в корневом каталоге вашего домена, так что это ожидает, чтобы вы были в demo.brandonkliu.com. Мы должны сказать ей, что это на самом деле в папке. Это в папке под названием CS50 Кохана. Дело в том, что это неверно истолковав CS50-Кохана как что-то еще, что я объясню вам в секунду. Но я должен сказать вам, это то, что и следовало ожидать. То, что мы собираемся сделать, это мы собираемся идти в эту папку под названием bootstrap.php, что папка конфигурации, где много разных вещей устанавливаются. Я открываю, что до. Тогда, возможно, одним из первых вещей, которые я сделаю это изменить часовой пояс. А потом посмотрим. Ага! Прямо здесь. Есть куча разных высказываний конфигурации здесь, но тот, который я смотрю на это, что называется база URL, и по умолчанию я получить его в Кохана, но я собираюсь изменить, что CS50-Кохана, и я думаю, что должны это исправить. Да, отлично. По умолчанию, чтобы увидеть, что он работает, он говорит: "Hello World". Откуда это взялось? Как мы дошли до Hello World? Где именно это код, который на самом деле написал это? Чтобы понять это, я познакомлю эту концепцию под названием маршрутизации. Практически все структуры веб иметь концепцию под названием маршрутизации, который является частью программного обеспечения, которое будет отображать определенную URL в определенной части кода в пределах вашего рамках. Например, если у вас есть URL, и вы пойти на некоторые URL, как foo.com / блог / все то, что каркас собирается делать - или по крайней мере то, что Кохана собирается делать - будет он собирается найти класс с именем контроллера блог, и он собирается запустить функцию с именем действия все. Я знаю, я говорю о классе и функций, и я знаю, вы, ребята, не распространяется классы и функции в CS50 пока нет, но на данный момент, вы можете думать о классах как просто группа функций, способ группировки функции вместе. Это действительно все, что вам нужно знать. Теперь, если мы посмотрим на нашу структуру папок, внутри папки приложения есть и другая папка под названием классы, и другие папки называются контроллер и модель. Если вы посмотрите в папке Controller, мы видим, что есть файл под названием Добро пожаловать, и вы можете увидеть здесь является классом называется контроллер Добро пожаловать, и есть функция называется Индекс Действие, и то, что она делает это задает тело вашего ответа на Hello World. Вот где код написан. Другой вопрос, ну, я не пошел на бла, бла, бла, / Добро пожаловать / индекс. Как я здесь оказался? Ну, это просто потому, что здесь в нижней части нашего загрузочного файла где мы положили наши маршруты Вы можете видеть, что они устанавливают некоторые значения по умолчанию для вас. Контроллер по умолчанию Добро пожаловать. Действие по умолчанию Индекс. Вот почему, когда мы ничего не поместите в там, это автоматически пошли в желанную контроллера а индекс Действие. Все смысла до сих пор? Теперь вы можете сделать больше, чем просто пойти к контроллеру и конкретные действия. Вы также можете передавать параметры в контроллер. Просто в качестве примера, Я собираюсь добавить еще меры для этого контроллера, чтобы показать вам. Давайте назовем это действие Эхо, потому что это собираюсь рассказать вам все, что вы даете ему, и поэтому я в основном собирается захватить параметр, который собирается быть отправлены через меня в программу маршрутизации, и как вы можете видеть здесь, эта линия прямо здесь, вы можете увидеть, что это в основном означает, что вы должны контроллер, и у вас есть /, и у вас есть действия, и у вас есть другой /, и что будет параметры, и потому что у нас это название ID в угловых скобках, что означает, что мы назвав это идентификатор параметра. Позже в своем коде контроллера, если я хочу взять в руки этого параметра, Я могу использовать код, который я написал, найти параметр с именем ID. Это то, что я сделал здесь, и я собираюсь вернуться и сказать, "Вы сказали," что. И вот теперь, если я иду на нашем сайте, Я иду в cs50-kohana/welcome/echo/Helloooo-- о, это так. Существует 1 шаг, который я опущены. Это является частью живой идеи кодирования. Вот 1 вещь. Давайте посмотрим. Так обычно по умолчанию с большим количеством этих веб-приложений Вы должны включить этот index.php вещь в вашей URL, потому что идея index.php является своего рода точкой входа вашего приложения, но, конечно, это вроде раздражает придется. Вы же не хотите, чтобы иметь index.php появится в вашем URL, и почти каждый веб-фреймворк из коробки имеет эту проблему index.php, и поэтому вы должны принять некоторые меры, чтобы иметь возможность удалить это. Итак, в этом случае что мы собираемся сделать, это мы собираемся использовать файл с именем. Htaccess, и это то, что это специфичные для веб-сервера Apache, и он может делать вещи, как переписывание URL-адресов и перенаправить URL-адреса и так далее и так далее, и Кохана достаточно хорош, чтобы обеспечить шаблона. файл Htaccess, что мы можем использовать. Как вы можете видеть, есть файл там называется example.htaccess, и мы собираемся, чтобы скопировать, что. Htaccess. Я собираюсь открыть это и редактировать его, и в основном это делает кучу разных вещей. Ключевым направлением вы можете смотреть на это прямо здесь. Идея состоит в том, что это настраивает правило, которое гласит, "Хорошо, что вы вводите в, добавьте перед index.php к этому." Вы можете видеть, что. . * Стоит ни за что, все пакеты, а затем вторая часть index.php / $ 0, и $ 0 ссылается на то, что был подобран ранее. Имеет ли это смысл? Но на самом деле ключевая вещь я хочу изменить это изменить эту перезаписи базы, которая является URL базы. Это своего рода предполагает, где вы работаете с. Я собираюсь добавить CS50 Кохана к тому, что, и, таким образом сейчас, если я удалить index.php, он должен работать, и я собираюсь добавить некоторые цифры чтобы показать вам, что это действительно не работал. Звучит хорошо. Есть вопросы до сих пор? [Студент] Как это знать, чтобы сделать 123? Это аргумент? Именно так. Вы можете думать об этом так же, как аргумент. Но странная вещь, хотя, является то, что способ Кохана делает это , они не делают это так же, как аргумент. У вас есть, чтобы схватить его, как это. Вы должны захватить объект запроса и задать для параметра, который по имени ID, и что имя ID исходит от этого загрузочного файла что я показал ранее, и имя ID в те угловые скобки, и это, как вы захватить эти параметры. Потрясающе. Любые другие вопросы? Как я уже сказал, контроллеры, они обращаются логику приложения, так вот 1 случай, когда вы можете видеть that's - это очень основное, но это все еще логика приложения, идея захвата параметр и создания новой строки что говорит: "Вы сказали, бла", а затем плевать, что с вами. И вообще, что вы делаете это вы создаете различные контроллеры. Вы создать отдельные контроллеры для различных частей вашего сайта. Сегодня мы собираемся сделать очень простой веб-сайт, и это будет очень простой блог. Мы собираемся сделать новый контроллер только для сообщений в блоге. Но тогда, если бы я также добавлять комментарии к сообщению в блоге, то я бы, наверное, хотите, чтобы сделать новый контроллер для этих замечаний. Если бы я хотел, чтобы добавить пользователей, я бы, наверное добавления нового контроллера для тех пользователей, и вообще, идея в том, что всякий раз, когда у вас есть новая модель, новый объект данных, вы имеете дело с, у вас есть один контроллер для этого объекта данных. Сегодня мы только собираемся работать с 1 объекта данных, и что будет сообщений, а также вы можете думать об объектах данных как соответствующий таблиц. Вообще каждая таблица соответствует 1 типа объекта данных, поэтому сообщение таблица будет иметь 1 сообщение модель, который будет иметь 1 сообщение контроллер, соответствующий того, и то же самое для комментариев, то же самое для пользователей, и так далее и тому подобное. И это общее правило. Там будут специальные случаи, когда вы может отличаться от того, но 90% времени, это то, что вы собираетесь делать, и я покажу вам, что то, что мы собираемся делать сегодня. 1 более понятие прежде чем мы углубимся обратно в код, эта идея объектно-реляционного сопоставления. Вы, ребята уже сделали PSET веб-разработки, и вы видели, что вы делаете SQL запрос, и все, что он возвращает к вам строк. Вы получаете эти строки, а вы индексировать их каким-то именем, Имя столбца и таблицы, и это, как вы с ним работать, и это может быть немного громоздким. Но кроме того, если у вас есть отношения в вашей базе данных, как, например, если у меня есть замечания и сообщения, то, возможно, я хочу, чтобы захватить родительский пост комментарий. Если я использую только строки в SQL, то все, что я могу получить это идентификатор родительского сообщению и не сам пост. Но когда мы кодирования, то, что мы на самом деле хотим, чтобы на самом деле захватить  родитель прикреплять себя иногда. Какой объект реляционные отображения делает, он принимает результаты запроса к базе данных и помещает его в объекты для вас, которые гораздо приятнее работать с чем простой массивов и строк. Например, сейчас, когда у меня есть комментарий, возможно, и я хочу, чтобы захватить его родительский пост, и я, может быть, комментировать стрелкой пост, то он будет на самом деле дать мне объект сообщению что соответствует фактической материнской сообщению, а не только некоторые ID, который я иначе пришлось бы использовать и сделать еще один SQL запрос, чтобы захватить пост, которая является громоздким и ненужным. И, кроме того, путем сопоставления всех этих строк данных в объекты, Вы можете также приложить больше функций к объектам, так, например, я говорил о том, как классы, по существу группировки функций. Вы можете думать о нем, как, что. Например, может быть, у меня есть этот объект сообщению, и может быть, я хотел бы иметь какую-то функцию, прилагается к нему , что в основном говорит мне было это недавно опубликовал? Было ли это отвечал в течение последней недели, верно или неверно? И это функция я могу приложить на этом объекте, и это действительно удобно иметь его в том же месте, и есть множество различных функций, которые можно создать для этих объектов, и это действительно приятно иметь возможность, чтобы прикрепить ее к классу, на объект, в то время как, если вы только что строки, поступающие из базы данных, то вы не можете на самом деле придал этому функциональные возможности, что. Это буквально только данные. Любые вопросы о том, что вообще? ORMs очень распространены веб-разработки, и есть много различных типов ORMs, и Кохана имеет свой собственный ORM. Это очень основное, но вы получите вкус, как он выглядит. Давайте создадим модель для наших блогах, и первое, что мы, очевидно, нужно сделать, это создать реальную таблицу в нашей базе на самом деле хранить наши данные для этих должностей. Первое, что я собираюсь сделать, это зайти в PHPMyAdmin. Ребята, вы использовали PHPMyAdmin раньше? Хорошо, удивительным, чтобы вы, ребята, уже знаете, что это такое, и я собираюсь создать новую таблицу с именем Kohana Сообщений, и это будет очень просто. Я должен буду снова войдите Все, что мы собираемся сделать сегодня есть автор и тело, просто держать его просто. Я собираюсь создать эту таблицу, и теперь мы просто есть таблица, представляющая наши сообщения с 2 полями для нашего автора и нашего тела. Другая вещь, я собираюсь сделать сейчас, это настроить свой веб-приложения, так что знает, как подключиться к базе данных, и это, опять же, это то, что вам придется делать со всеми веб-приложений. Вы должны сказать ему имя пользователя и пароль и имя базы данных и так далее и тому подобное чтобы выяснить, как на самом деле подключения к базе данных. В Кохана, у нас есть то, что называется модуль базы данных, и в папке конфигурации у нас есть эта папка под названием База данных, и как вы можете видеть, есть куча настроек вы должны установить здесь сказать ему, что имя пользователя и пароль для базы данных, чтобы я мог на самом деле подключиться к нему. И так как я не хочу, чтобы вы, ребята, на самом деле знаем имя пользователя и пароль моей базе данных, У меня есть файл, где я уже установить все это, и я собираюсь скопировать и вставить его. Потрясающе. Хорошо. Я думаю, что это все, что конфигурация мне нужно сделать, но давайте посмотрим. Мы будем продолжать работать в нем, и если что-то выходит из строя, тогда мы будем это исправить. Теперь то, что я собираюсь сделать, это я собираюсь создать новый контроллер. Или на самом деле, жаль. Сначала я должен создать новую модель. Я создам новую модель под названием Post.php, и то, что мы собираемся сделать, это мы собираемся называть это класс Model_Post. Получить некоторые подсветка синтаксиса на, и поэтому, когда я говорю: "расширяет ОРМ," это в основном еще немного объектно-ориентированного программирования, которые, к сожалению, вы, ребята еще не научились в CS50 еще, но это довольно легко подобрать. Это дает мне всю эту дополнительную функциональность, которая поставляется в этой ORM пакета, и поэтому я получаю кучу дополнительных функций и еще много чего бесплатно, которые вы увидите немного в секунду. Сейчас на самом деле все, что нужно сделать, это создать этот класс. Я даже не нужно делать какие-либо функции или ничего, но я создал класс, представляющий таблицу, и потому, что я продлил этот класс ORM, Я получаю кучу вещей бесплатно, так что сейчас вы не должны установить ничего более вверх. А теперь то, что я собираюсь сделать, это я собираюсь создать новый контроллер, которые я собираюсь назвать blog.php, и я собираюсь скопировать приветствия контроллера поэтому я не придется перепечатывать некоторые вещи, и теперь я должен переименовать этот. Теперь то, что я собираюсь сделать, чтобы проверить, чтобы убедиться, что все разработки, Я собираюсь захватить первый пост с моей базе данных и распечатать тело сообщению на экране. Чтобы сделать это, что я собираюсь делать в первую очередь это я иду, чтобы спасти должности переменной так, что мы собираемся сделать, это - в Кохана, что вы делаете, чтобы захватить объект сообщению это вроде громоздкой, но вы должны сделать то, что называется ORM :: завода, а затем вы проходите в названии модели вы хотите, и это возвращает объект ORM, представляющий эту модель. А потом, как я уже сказал, когда мы расширяем объект ORM, мы получаем все эти методы бесплатно, так, например, мы получаем эта новая функция называется "найти все" которая автоматически возвращает каждый пост в базе данных, который довольно удобно. И теперь в теле Я собираюсь вернуться первый пост и возвращает его тело. И, конечно, мне нужно создать пост, так что давайте вставить новую должность. Я скажу: "Брендон, мой самый первый пост." Потрясающе. И теперь мы собираемся пойти в блогах и если все работает хорошо - о, это какой-то другой немой прав доступа к файлам, что снова. Держись 1 секунды. Это своего рода абсурд. Там мы идем. Хорошо. Я установил эту проблему разрешений. Это пытался создать некоторые файлы и некоторые журнал, и разрешений, опять же, не были должным образом установлены, и я сделал это так что эти файлы были доступны для записи и исполняемый поэтому он может на самом деле войти на вещи. Теперь это дает мне еще один исключений поговорку: "Класс ORM не найден," и это потому, что я забыл еще один шаг. Это очень плохо. В файле папки начальной загрузки, есть эти модули здесь, которые вы можете выбрать для включения или отключения. Это куча разных функций, которые вы можете использовать в Кохана, который является своего рода хорошим. Например, они имеют модуль аутентификации , который можно использовать для аутентификации пользователей. У них есть модуль кэширования, если вы хотите реализовать своего рода кэширование назад конец, чтобы сделать работу приложения быстрее и еще много чего. Мы должны дать базу данных и модуль ORM, потому что, как я уже сказал, мы используем базу данных, очевидно, и мы также должны включить модуль ORM, , потому что мы хотели бы иметь дополнительную функциональность, что приятно иметь. Все, что я должен сделать, это раскомментируйте эти 2 строки, и теперь, если я обновить, он дал мне другую ошибку. Там сказано: «Класс Model_Post не найден." Теперь это хорошая проблема есть. Давайте посмотрим. Сделать общественности. Кол-Подожди. О, дорогой. Я не знаю, почему это не в состоянии найти, что. Это действительно странно. У меня есть этот класс прямо здесь. Я предполагаю, что, возможно, придется - о. Я так глупо. Я забыл добавить PHP тег. Вот почему. Теперь я должен отменить, что 1 изменение, которое я только что сделал. Хорошо. Там мы идем. Это было действительно глупо. У меня не было вступительное PHP тег. Но как вы можете видеть, теперь он работает правильно, не так ли? У нас есть 1 сообщение. Мы захватили первый пост, и теперь мы распечатали его тело. Великий. Фантастика. Любые вопросы до сих пор? Не-а? Есть вопросы? Итак, мы только что создали почтовое модель, очень простой, и мы собираемся добавить некоторые функции в дальнейшем. Мы можем добавить проверок и фильтрация. Проверки являются одной из вещей, что рамки решить для вас очень, очень хорошо, и я не думаю, что вы, ребята, должны были сделать это для вашего CS50 PSet, но если вы делаете веб-разработки для вашего окончательного проекта, вы, вероятно, будете хотеть, чтобы сделать своего рода проверки, как не имеющие пустые имена пользователей, может быть, имея пароль, по крайней мере довольно подробно, и тому подобное. И это действительно громоздким реализовать эти вещи сами, и в значительной степени каждый веб-фреймворк сделает это за вас и позволяет сделать это в очень чистом пути. И модель, где вы обычно выражать эти правила проверки, потому что это проверка, является ли модель справедлива или нет. Но сейчас, мы собираемся, чтобы положить, что позже, и сейчас мы собираемся работать на другой части, и мы собираемся, чтобы попытаться сделать новое представление , в котором перечислены все сообщения. Этапы создания нового действия для включения в перечень все посты является, чтобы захватить список всех сообщений а затем сделать список всех сообщений через представление. Прямо здесь, достаточно, к счастью, мы уже схватил все сообщения используя эту первую линию, найти все функции, и теперь, что мы собираемся сделать, это до сих пор Я непосредственно установив текст ответа передав строку, но теперь я хочу использовать представление, и разница между целью и просто делает это является, с тем я могу иметь хороший, большой шаблон HTML, и что я могу сделать, это передать его некоторые переменные и тогда вид автоматическое заполнение его шаблон используя эти переменные. Что я буду делать это я создам новый взгляд, и я буду называть вид что-то вроде "блоге / индекс" и я собираюсь в основном связывают это - о, что я пишу? Мой мозг где-то в другом месте. Я собираюсь связать сообщения переменных к мнению, так что способ вид имеет доступ к этой записи переменной. И вот теперь мне нужно создать эту точку зрения, так вот у нас есть эта папка под названием "Просмотров", и первый, я собираюсь создать новую папку под этим названием "Дневник". Это хорошо. Таким образом, мы можем иметь хороший иерархию для наших взглядов. А потом я собираюсь создать еще один файл в там под названием "index.php". Потрясающе. На самом деле, давайте их обоих здесь. Создание файл представления, вероятно, самая простая часть всего этого, и это, вероятно, вещи, которые вы уже знакомы с. Мы собираемся сделать что-то действительно просто, начинают говорить: «Мой список сообщений в блоге." Тогда мы можем пройти, и мы можем итерацию массива сообщений, захватить каждый пост и сказать что-то вроде - может быть, добавить строку а затем распечатать автора и тело. Это имеет смысл до сих пор? И давайте посмотрим, работает ли он. Ничего не произошло. Я удивляюсь, почему. О, я пропустил один шаг. Очень глупо с моей стороны. Я создал вид, но я не ставил мнение как ответ, так что вам нужно сделать еще 1 вещь. Вы должны сделать "это тело ответа" и установить его, чтобы быть вид. Там мы идем. У нас есть заголовок, а затем у нас есть пост, и только для ударов, давайте вставить другую должность так что мы можем увидеть список. И вставить эти 2 сообщения, и теперь, если я обновить страницу, мы видим все эти сообщения здесь. Имеет ли это смысл до сих пор? Да, вопрос? О, хорошо. Как вы можете видеть, мы были в состоянии отделить все эти коды из на различные секции, а затем вы можете видеть, что это наиболее ясно с видом кода. Этот файл здесь, представляющий точку зрения, оно заботится только о представлении данных, отображения данных. Это передается какой-то данных, и все это делает просто показать его вам. Во всех других частей кода, вам не придется беспокоиться об одном из этого, и точно так же, на ваш взгляд код не придется беспокоиться ничего о как получить доступ к базе данных и так далее и так далее, который действительно хорош и делает ваш код намного более легким в обслуживании. Как я уже сказал, просмотров, они динамическими, это 1 файл, но он будет генерировать различные представления на основе переменных вы на самом деле проходят в, и, кроме того, есть много различных вспомогательных функций что вы можете использовать, чтобы помочь вам написать свой код быстрее, которые я покажу вам, всего за секунду. Да. [Студент] Так $ 0 является контроллером, не так ли? Это второе. Вопрос в том, будет $ 0 контроллер? $ 0 является переменной я создал здесь. Я создал вид в первую очередь. Я назначен его некоторой переменной. Тогда я передал его в этой функции, установить его в качестве теле ответа. Имеет ли это смысл? [Студент] Так взгляд :: завод, вид как класс или библиотека [неразборчиво] Завод функция? Речь идет о функции взгляд :: завода, и в основном это какая-то более объектно-ориентированное программирование существу. Посмотреть это класс вид, и у него есть метод, называемый "Фабрика" и это способ, чтобы захватить объект, который под названием "блог / индекс". И вот еще немного объектно-ориентированное программирование материал что я не буду вдаваться в здесь слишком много. Теперь очевидно, что мы хотим создать новые сообщения, но мы не хотим, чтобы это сделать через базу данных, поэтому мы собираемся создать новое действие для создания новой записи, и есть много вещей, что мы должны сделать. Первое, что мы собираемся сделать - давайте возьмемся эти вещи одну за другой. Первое, что мы сделаем, это мы должны создать форму для вставки новой записи, но я также собираюсь добавить новое действие первая, так что добавление нового действия так же просто, как добавлением новой функции с вашим контроллером, и теперь я собираюсь сделать что-то очень простой, просто захватить эту точку зрения и опубликовать его, просто показать его для вас. И то теперь я собираюсь создать новый файл представления, и я собираюсь начать писать некоторые вещи. Что приятно о Кохана, что они дают много различных вспомогательных функций для вас, чтобы написать вид код более легко, и 1 из тех вспомогательных функций или вспомогательных модулей составляет около написания формы. Для написания формы, я действительно не должны напрямую написать любой HTML себя. Вы, ребята написали HTML формы. Вы знаете, как это может быть очень, очень больно и громоздкой, чтобы написать формы. Это не забава, так, к счастью, мы можем в основном написать форму с помощью Kohana'S образуют вспомогательные функции, чтобы сделать это для нас. Мы собираемся в основном имеют поля для каждой вещи у нас есть, так что для авторов и один для органов. Мы собираемся иметь этикетку, и мы собираемся иметь вход. И, наконец, мы собираемся иметь представление. И как вы можете видеть, это намного чище написать чем все, что грязный HTML, который является отчасти хорошо. Конечно, есть и другие веб-рамки, которые имеют его еще чище, чем, что, но по крайней мере это лучше, чем писать HTML-код самостоятельно. Удивительный, так это то, что вы видите. Это отчасти грязный, так что я собираюсь добавить разрыв строки есть сделать, которые выглядят немного лучше. Ну, конечно, это все еще выглядит очень, очень плохо, но мы просто сосредоточены по своей функциональности на данный момент, а не на эстетику. Нет времени, чтобы сделать все. И как вы можете видеть, теперь у нас есть супер основную форму, который отчасти хорош. Этот код я бы сказал, чище, чем пытаюсь написать HTML сформировать себя, так что это приятно. Что дальше? Теперь нам нужно сделать что-то с действием. Обычно, когда вы пишете HTML формы, вы должны сказать ему, где он собирается отправить форму. По умолчанию в большинстве веб-платформами, он представляет в ту же самую URL, так что все дело в том, если вы отправляете запрос добраться до / блог / новый, он должен показать вам форму, но если вы посылаете запрос сообщению в / блог / новый с данными, он на самом деле должны попытаться сохранить этот пост и что-то с ним сделать. То, что мы собираемся сделать, это в основном все, что мы должны сделать, чтобы проверить, является ли это запрос сообщение или запрос Get , чтобы проверить, каковы передаваемые переменные, которые можно установить. И если переменная сообщение установлен, то, что мы собираемся, чтобы попытаться создать новое сообщение. Опять же, мы просто это сделать, и это создает новую должность, и мы буквально собирается его поля, как это, а затем мы собираемся сохранить его. А потом я собираюсь перенаправить на страницу-указатель, чтобы они могли увидеть наш список сообщений снова. Давайте попробуем это. Я скажу: "Брэндон" , а затем представить этот пост, и если все пойдет хорошо, как вы можете видеть, это перенаправлены меня в индексной страницы, и если я прокрутите вниз, у нас есть новой записи. Ура! Да, вопрос. [Студент] Что делать, если вы вошли в одно и то же Вы ввели раньше? Значит ли это проверить, чтобы убедиться, что вы не дублируются то же самое представление? Будьте умолчанию, нет, потому что по умолчанию - жаль, вопрос в том, если вы введете в тех же данных в форме и представить, что, будет ли он позволит вам вставить дубликат объекта, дублировать запись, по сути? Прямо сейчас, да, это позволит вам сделать это, потому что в базах данных это вполне допустимо иметь полностью повторяющиеся строки, но если это имеет значение, то вы можете добавить проверок, например, чтобы убедиться, что, если это точно так же, как то, что уже существует, то говорят, что это неверный объект, а затем вы можете даже сформулируйте Ваши сообщения об ошибке и сказать: "Неверный потому что это уже существует" или что-то в этом роде. Но в данном случае, я мог бы просто создать что-то дубликат. Теперь давайте попробуем и добавить некоторые проверок. Проблема с этим прямо сейчас, что Я мог буквально представить совершенно пустую пост. Я могу нажать эту кнопку прямо сейчас, и там мы идем. Вы не можете действительно видеть это, но эта дополнительная линия здесь показывает, что я буквально новую должность. У него есть только пустой автора и пустой тело, и мы не хотим, чтобы люди могли сделать это. Это где проверка приходит дюйма Я могу пойти в моей модели объекта, и теперь я могу добавить новую функцию, которая определяет что правила проверки я должен добавить к этой модели чтобы убедиться, что это действительно или указать, что это значит быть допустимым сообщение? И я хочу сказать, что это только действительный сообщение, если оба автор и тело не пустой, и это, как вы делаете это в Кохана. Вы создаете новую функцию под названием "Правила", а затем вы в основном вернуть ассоциативный массив , который определяет правила проверки для этого объекта. Мы собираемся вернуть массив, а затем то, что мы собираемся сделать, это сказать "автор", она идет к массиву, который идет в другой массив под названием "не является пустым." А потом я собираюсь сказать "тело". Ладно, и синтаксис для этого и структура для этого может выглядеть немного громоздким и немного сложнее. Если вы прочитали документацию, это довольно просто выяснить, Но по существу это то, что вам нужно сделать, чтобы указать некоторые правила проверки, и есть много разных правил что Кохана даст вам бесплатно, как вы можете добавить правила сказать он должен быть не менее эта длина. Может быть, он должен быть числовым. Может быть, он должен быть буквенно-цифровой. Может быть, он должен быть не более эта длина, так далее и тому подобное. Есть много разных правил, которые предоставляет Кохана для вас, и вы можете пойти на их сайте, посмотрите документацию, и вы можете увидеть все различные вещи, которые вы можете сделать. Но это все, что я должен сделать, а теперь давайте посмотрим, что произойдет если я представить пустой пост. Что произойдет? О, нет, я получаю ошибку. Я получаю исключение проверки. Ну, это хорошо. Это сказал мне, что моя модель является недействительным, но я не хочу, чтобы отобразить исключение в моих пользователей, когда они пытаются представить что-то недопустимое, не так ли? Я хочу дать им какую-то дружественный сообщения об ошибке когда что-то пойдет не так. То, что мы собираемся сделать, это мы собираемся обернуть все в попытка поймать цикла. На самом деле, я думаю, что это также то, что вы еще не научились в CS50, потому что С, язык программирования C, не имеет исключений, но почти каждый другой язык есть исключения, так на самом деле, действительно кратко, Исключением является то, что кусок кода можно бросить исключение, когда что-то идет не так, но то, возможно, некоторые другие кусок кода выше может поймать это исключение и что-то с ним сделать. Например, в этом случае кусок кода, который пытается сохранить модель, он проверяет модель, и если он говорит: "Хорошо, эта модель является недействительным," он собирается бросить исключение, и это своего рода эквивалент в С вы можете вернуться -1 или что-то в этом роде. А потом для меня, эта функция, мой код на более высоком уровне, я могу попытаться поймать это исключение и в основном говорят: "Хорошо, если я поймать исключение, что я буду делать?" Или я мог выбрать, чтобы не поймать это исключение, и пусть кто-то выше поймать исключение, или если никто не ловит его, то вся программа завершает работу и говорит, "Что-то пошло не так, и я не мог справиться с этим." Но что мы делаем, вы обернуть кусок кода в блока проверки, и тогда вы также добавить то, что называется блок поймать, которая является своего рода код, который будет пытаться перехватывать исключения, которые могут возникнуть. И поэтому, если я ловлю эту конкретную исключение или недействительными исключение, то, что я собираюсь сделать, это Я собираюсь установить ошибки - я думаю, что это, как я это делаю - и я собираюсь установить ошибки в какой-то объект. А потом, что я собираюсь сделать, это если она попадает это исключение, он не собирается перенаправить, и если он не перенаправить, он собирается выйти из, если блог и ударил этот блог / новый, который хотите я хочу сделать. Если есть ошибка, то я хочу, чтобы вернуться в форму и отображать эти ошибки. Теперь то, что я хочу сделать, это я хочу передать в этих ошибок в представление. Хорошо, я думаю, у меня мнение прямо здесь, и в основном я хочу, чтобы отобразить эти ошибки, если они существуют. Прежде, чем я писать HTML для этого, я собираюсь очень быстро показать вам, что структура этой ошибки переменная выглядит, и это является хорошей практикой в ​​целом. Много раз вы получаете что-то от некоторого метода, некоторая функция в веб-базы, и вы не знаете, что переменная выглядит, так что вы не знаете, как с ней работать. Я собираюсь использовать метод печати г в основном распечатать его. А как вы можете видеть, он говорит мне, что это ассоциативный массив, и у вас есть ключ, автор, указывает на эту строку, Автор не должен быть пустым, а другой ключ, тело, указывает на другой строки, тела не должно быть пустым. Я, как, хорошо, прохладно. Тогда я могу перебора массива и распечатать каждую сообщение. Это в основном как ассоциативный массив с кучей сообщений. То, что я собираюсь сделать, это "если ошибки," и я собираюсь создать неупорядоченный список, и я собираюсь для перебора всех ошибок. И это, и теперь я собираюсь попробовать подачи это снова, и давайте посмотрим, что мы получаем. Теперь мы получаем этот хороший список ошибок, и это все еще довольно уродливые, но это, очевидно, может быть отформатирован, чтобы хорошо выглядеть, но основная идея как раз через несколько строк кода, мы смогли проверить нашу модель, убедиться, что некоторые поля не были пусты, и если что-то пошло не так, а затем вернуться какую-то сообщения об ошибке Тогда я мог бы представить обратно пользователю. Вы также можете настроить свой проверку так что вы можете на самом деле имеют сообщение об ошибке что более специфичные для вашего приложения или что-то вроде этого. Все, что, как правило, настраиваемый. К сожалению, мы мало времени, так что я буду иметь, чтобы отрезать живую сессию кодирования здесь. Есть куча других функций, которые я хочу показать вам в этом примере. Например, вы можете добавить шаблоны для вашего сайта, так может быть, есть какой-то HTML код, который вы хотите применить к каждой отдельной странице на вашем сайте, и вместо вставки, что в каждом отдельном файле зрения у вас есть, что, очевидно, было бы плохой практикой, вы можете в основном определяют эти шаблоны, а затем в контроллере сказать: "Хорошо, я с помощью этого шаблона." "Все ли мои взгляды использовать этот шаблон." И тот, последнее, что я хочу показать вам, а также что у нас нет времени для кросс-сайт скриптинг, и в основном я думаю, вы, ребята, наверное, видели в CS50 - Я думаю, что Дэвид Малан, вероятно, говорили о том, как можно, как правило, вводят JavaScript код в - вы говорили об этом? Может быть? Может быть, нет? Но много раз, вы можете внедрить вредоносный JavaScript код в базу данных чьей-то, и если они не избежать, что должным образом, Затем, когда они представляют, что данные обратно пользователю, то это может запустить какую-то случайного кода JavaScript вы не хотите чтобы это произошло, и я собирался продемонстрировать, как вы могли бы сделать, что в Кохана. Это на самом деле очень, очень легко. Я мог сделать это прямо сейчас за 2 секунды буквально. Все, что вам нужно сделать, это в основном обернуть эти вещи в то, что называется HTML сущности. И это автоматически избежать все символы правильно и убедитесь, что вы не получите эту проблему. [Студент] Вы неправильно пишется первый тест. [Брэндон Лю] О, ой. Ладно, это все, что я должен был разделить с вами на сегодняшний день. Эти слайды будут размещены, но они, как правило, единственные ресурсы, которые вы должны действительно нужно, чтобы начать с Кохана. Вы можете перейти на сайт. У них есть руководство пользователя, и они также имеют API исследователь. Мы можем изучить все различные функции и вспомогательные функции, которые они имеют для вас. Как правило, они имеют достаточно информации на веб-сайте что вы можете использовать, чтобы начать работу и начать работать с Кохана. Есть не так много учебников, я думаю, для Кохана, за пределами то, что они имеют на веб-сайте здесь, так что это, вероятно, ваш лучший выбор. Но если вы хотите, чтобы пойти с веб рамках и вы не хотите, чтобы подобрать новый язык, и вы хотите что-то, что относительно легкий и имеет легкий кривой обучения, Я определенно предложил бы Кохана. Это, вероятно, лучший предлагая за это. Самое смешное, однако, является если бы мы использовали Рубин на рельсы, мы могли бы воспроизвести то, что мы только что сделали и, вероятно, больше в возрасте до 3 минут. Шутка ли, но, узнав, Рубин на рельсы не занимает гораздо больше чем это было бы предпринять, чтобы узнать Кохана. Это в основном ваш выбор того, что вы хотите выбрать, чтобы узнать, но если вы хотите получить и работает быстрее, Кохана, безусловно, очень хороший выбор. Любые последние вопросы прежде чем мы закончим? Да. [Студент] Как бы мы интегрируем, что в рамках CSS, как вы использовали, когда вы были инструктаж? Вопрос в том, как бы мы интегрируем, что с рамках CSS? То, что мы, вероятно, сделать, это мы, вероятно, включают новая папка, где мы бы свалить все наши файлы CSS, и тогда мы бы также добавить новый шаблон. В шаблоне мы включить эти CSS файлы чтобы убедиться, что они ссылаются на каждой странице, а затем, когда вы на самом деле пишете HTML, вы просто добавить соответствующие классы и еще много чего, и, например, когда вы используете что-то вроде форме вспомогательная функция, вы можете добавить больше параметров после указать, какие классы вы хотите быть прикреплены к различным вещам чтобы они могли укладывать его должным образом, и это в основном, как вы пошли бы. Любые другие вопросы? Потрясающе. Спасибо за ваше время, и спасибо, что пришли. Я не собирался добавить очень многое другое, но 1 очень быстро, что является у нас нет ссылку в форму. Действительно немой. Давайте добавим - на самом деле, по мнению, блог, индекс, давайте уж быстро добавить ссылку, которая идет на новую страницу, страница, на которой мы можем вставить новую должность. Мы собираемся сделать это. Что приятно, есть вся эта группа HTML вспомогательных функций которые делают разные вещи для вас, так что вы уже видели сущностей функционировать здесь, но они также имеют функцию с именем "якорь", который вы можете ввести в блог / новый и сказать: "Дать новый блог". И было бы создать эту связь для вас, и это, кажется довольно простое сделать, но это приятно, потому предположим, что вы движетесь свой сайт из домена 1 в другую. И если вы просто выписал URL-адреса себя, то вам придется изменить все URL-адреса. Или может быть, вы переместили его с 1 вложенной в другую подпапку. Вы должны были бы изменить все те, URL-адреса себя, и это не весело. Вы можете использовать этот якорь прямо здесь, и вы можете изменить домен или вложенных папок префикс в файле конфигурации один раз, а затем оно будет применять, что везде, и это, опять же, отличный пример не повторять себя, сушки код из. Везде, где вы повторяя себя, попытаться извлечь в какой-то файл конфигурации или на другую функцию и она справиться с этим для вас. А самая последняя вещь, что я хотел показать вам, был Предположим, мы вернулись на этом посту, и я сочинил некоторые действительно длинное эссе, но я забыл включить мою автор. Теперь, когда я нажимаю "Отправить сообщение" Я просто потерял все. Нет! Действительно грустно. Итак, как вы справляетесь с этим? Это то, что мы делаем. Что мы делаем здесь для этих входных и текстовой области функций, если включить второй параметр, то значение этого второго параметра будет то, что поле будет изначально заполняется. То, что мы могли сделать, это в нашем контроллере блоге, мы могли связать другую переменную. Назовите это «ценностей» может быть. И пройти в почтовом массива, в буквальном смысле. Это означает, что если при проверке произошел сбой, пройти ко мне на почту массив, я представил от последнего запроса, и, таким образом, я могу использовать значения из моего последнего представления для повторного заполнения поля. Теперь я могу сделать что-то вроде значений автора и ценности тело, и таким образом теперь, если я сделать некоторые случайные вещи и нажмите кнопку "Отправить сообщение", то он остается там. Но мы собираемся столкнуться с другой проблемой. Это работает, но если я перейти на страницу в самый первый раз, это будет крах, и это потому, что в самый первый раз мы идем на страницу, этот пост переменная не определена. Это нуль. Он не существует. А то, что мы хотим сказать, если существует этот ключ, затем возвращает значение этого массива, но если ключ не существует, то я получил пустую строку. Это функциональность мы хотим здесь. Мы хотим, чтобы проверить, существует ли ключ, прежде чем пытаться получить доступ к массиву, и достаточно к счастью, Кохана также дает нам вспомогательную функцию для этого. У них есть весь этот набор функций под названием ARR, сокращение от массива, и у них есть 1 функцию под названием "получить", и вы можете передать в массиве, и вы можете передать в имени ключа. Затем, в основном то, что он будет делать это он будет пытаться получить этот ключ, но если что ключ не существует в массиве, затем он вернется пустым, или мы можем также указать значения по умолчанию, я считаю, , и это приятно. Теперь, если мы делаем то же самое еще раз, Затем вы видите сейчас он работает в первый раз вокруг, и опять же, если мы наберем в некоторых случайных вещей и попытаться представить, то он остается там. И я думаю, я могу также показать вам, как добавить шаблон очень быстро. Что мы можем сделать в первую очередь, мы можем добавить новый вид под названием "template.php" в папке Views, и то, что я собираюсь сделать, это я собираюсь распечатать то, что называется "Содержание" который будет моим основным содержанием. А может быть, в самом низу я собираюсь добавить, скажем, Авторские права. [Неразборчиво студент вопрос] [Брэндон Лю] Может быть, это супер базовый шаблон я хочу использовать. Я хочу есть папка с моим авторским правом на каждой странице, и теперь то, что я собираюсь сделать в моей контроллера Сейчас вместо того чтобы сказать: "расширяет контроллер" Я собираюсь сказать, "расширяет Controller_Template," и теперь вместо того чтобы сказать: "тело ответа равна этой точки зрения," Я собираюсь сказать, "это содержание шаблон -" и я думаю, - мне поставить знак равенства? Я забываю. Да, я так и думал. А теперь я установил, что содержимое переменной равным вид. Я могу сделать то же самое здесь. И теперь, если я обновить, вы можете видеть теперь этот авторских добавляется там, и просто сделать некоторые случайные пост, а затем, опять же, вы должны увидеть, что авторское право является в самом низу страницы. Великий. Вот все, что я хотел показать вам, ребята. [Аплодисменты] Есть вопросы? [CS50.TV]