Помощник
|
Урок: основы PHP программирования с нуля |
alexperec
|
Сообщение
#1
|
|||
|
|
|||
|
||||
Innulia |
1.8.2011, 0:00;
Ответить: Innulia
Сообщение
#2
|
|
Мануал получился достаточно простенький, этих основ вполне достаточно для создания скриптов.
Есть только несколько вопросов: вы указали пример цикла с счетчиком. Данный тип циклов часто бывает неудобным для выполнения программ, чаще используются с условием и постусловием. Почему вы выбрали для описания именно цикл со счетчиком? про массивы: вы указываете, что в массиве могут содержаться разные значения. Обычно массив содержит однотипную информацию: только символы, только числа, только текстовая инфа и тд. У вас в примере данные разных типов - это особенность массивов в php? То есть можно в один массив пихать разные данные? Вы указали в тексте, что такое функции. Почему не были описаны процедуры? Они часто бывают намного удобнее. Есть ли процедуры в php? У меня все :) -------------------- |
|
|
pro-fast |
1.8.2011, 17:32;
Ответить: pro-fast
Сообщение
#3
|
|
Спасибо за мануал!
Жду продолжения... Да, хотел спросить, что делает функция file_get_hmtl? |
|
|
alexperec
|
Сообщение
#4
|
|
(Innulia) Мануал получился достаточно простенький, этих основ вполне достаточно для создания скриптов. Есть только несколько вопросов: вы указали пример цикла с счетчиком. Данный тип циклов часто бывает неудобным для выполнения программ, чаще используются с условием и постусловием. Почему вы выбрали для описания именно цикл со счетчиком? про массивы: вы указываете, что в массиве могут содержаться разные значения. Обычно массив содержит однотипную информацию: только символы, только числа, только текстовая инфа и тд. У вас в примере данные разных типов - это особенность массивов в php? То есть можно в один массив пихать разные данные? Вы указали в тексте, что такое функции. Почему не были описаны процедуры? Они часто бывают намного удобнее. Есть ли процедуры в php? У меня все :) Innulia, давайте по порядку) Цикл со счетчиком на мой взгляд, наоборот намного приминимее. Например для перебора массивов и много еще для чего) Да и его синтаксис, и действия несколько сложнее для понимания, на мой взгляд, нежели циклы с условиями. И если понять цикл for, то остальные понять уже не составит труда ИХМО Да в массиве могут содержаться одновременно данные разных типов. Создайте данный массив, а потом обратитесь к элементам - все они будут доступны и работает все корректно! Другое дело, что на практике так обычно не делают, данные чаще однотипные. Но описал массивы так, я специально, чтобы наглядно показать все его возможности процедуры? такого в php нет. или возможно оно носит какое-то другое название Я не описывал классы и объекты, т.к. это уже более сложно и не каждый это сразу поймет. Но все же упомянул что такое есть) |
|
|
Innulia |
1.8.2011, 19:18;
Ответить: Innulia
Сообщение
#5
|
|
Спасибо за исчерпывающий ответ :)
Насчет циклов могу поспорить: цикл со счетчиком применим только в том случае, если наперед известно число операций, что бывает далеко не всегда. -------------------- |
|
|
alexperec
|
Сообщение
#6
|
|
(pro-fast) Спасибо за мануал! Жду продолжения... Да, хотел спросить, что делает функция file_get_hmtl? Незачто ;) Продолжение скоро будет, чуть позже, сейчас немного слег с температурой. По поводу функции, не встречал такую. Справочники и яндекс о ней умалчивают. От куда вы её взяли? Такая вообще существует? Но если судить по её имени, то скорее всего эта функция читает хтмл код страницы. Возможно в одну строку. Но это мои догадки. Хотя для чтения всего файла в строку есть другая функция file_get_contents и разницы нет хтмл это документ или любого другого расширения |
|
|
alexperec
|
Сообщение
#7
|
|
(Innulia) Спасибо за исчерпывающий ответ :) Насчет циклов могу поспорить: цикл со счетчиком применим только в том случае, если наперед известно число операций, что бывает далеко не всегда. А я и не говорил что другие циклы бестолковые :) безусловно, различные ситуации бывают А еще причина рассмотрения цикла for то, что я использовал его в примере :) Таким примером я убил несколько зайцев, задействовав практически все описанное в статье :) |
|
|
alexperec
|
Сообщение
#8
|
|
Вот дошли руки до описания второго примера.
Скачать его можно в этой ветке Мой модуль для DLE - блоки для определенных страниц там же инструкция по установке. Это , в отличии от первого примера, уже полноценный модуль для сайтов на движке DLE. У данного модуля есть админка. В установку модуля и специфику движка я вдаваться не буду, если администрация не против дам ссылку, где все это описывается Немного истории. Суть проблемы заключалась в том, что мне нужно было чтобы для каждой категории новостей было свое «меню категории», где бы были ссылки на материалы именно этого раздела сайта. И при том, на корневых страницах самого раздела чтоб можно было написать статичный неизменяемый текст, оптимизированный под свой ключ. Т.к. обычно бывает так, что разделы содержат краткие описания новостей, и постоянно изменяются из-за того что новые новости публикуются, а старые уходят вниз. А ведь ИХМО у сайта должна прослеживаться иерархия страниц. Ведь у разделов больше шансов подняться по конкурентному ключу, чем у обычных страниц, ведь УВ разделов ниже. А значит важность выше в глазах поисковиков. И этим надо пользоваться. Да и к тому же так можно добиться своего рода постоянства, т.к. у раздела содержание меняться не будет, значит и в выдаче он должен сидеть ровнее. Теперь о попытках решения задачи. Как часто бывает, то что видится легким, на самом деле в сто раз сложнее. Тогда писать модули на ДЛЕ я еще не умел, и мне казалось что решать проблему программно – это очень тяжко. И ломал голову как сделать это с помощью огромной системы шаблонов. Но в любом случае чем-то приходилось жертвовать, все и сразу сделать не получалось. Благо, я хоть не додумался действительно сидеть и эту груду шаблонов делать, все ограничилось теорией Потом я наткнулся на материал по созданию модулей и привязке их к движку (см. выше). Ведь главной загвоздкой для меня было не сколько как написать модуль, а как его интегрировать в движок. Суть работы модуля. А суть такова, что мы, с помощью переменной окружения получим урл адрес текущей страницы, просматриваемой пользователем. Далее этот урл будем сравнивать со всеми имеющимися страницами сайта, при помощи оператора switch case, при обнаружении совпадения, загрузим нужный нам файл с меню. Как работает оператор switch case: switch ($url) { // в скобках указываются данные которые мы будем искать. в данном случае это данные из переменной. case '': // то что в кавычках это данные которые мы будем проверять на совпадения. те с которыми мы будем сравнивать код; // код который будет выполнятся в случае если данные из switch, совпали с данными из этого case break; // не обязательный оператор, он как бы относится к коду оператора case. но я его выделил отдельно специально чтоб обратить внимание. оператор break означает остановку. т.е. дальше искать совпадения мы не будем. если оператор не указать, то будут проверены все предложенные варианты. default: // default - это действия по умолчанию, т.е. те действия которые мы выполним если не будет найден искомый оператор case код; // код который будет выполнятся break; } Следует заметить что операторов case в одной конструкции switch case может быть бесконечно много, а может и не быть совсем, например только default ( Но так делать смысла нет, но все же чтоб вы знали). Теперь разберем сам код исполняющего скрипта: if(!defined('DATALIFEENGINE')){ //условный оператор, проверяет как мы подключились к скрипту. не взломщики ли мы :) Это присуще всем файлам в движке DLE die("Hacking attempt!"); // die останавливает работу скрипта, и выводит сообщение из скобок. там обычно указывают причину остановки. в данном случае скипт остановится в случае подозрения на взлом } $url=$_SERVER['REQUEST_URI']; // переменной $url присваиваем значение текущего адреса страницы без домена. его содержит переменная окружения REQUEST_URI. обратиться к ней мы могли бы и так как я писал в уроке, там описывается универсальный вариант, если мы не знаем чему так сказать эта переменная принадлежит. все глобальные (доступные в любом месте сценария без объявления и присвоения значений) переменные есть элементы глобальных массивов. в данном случае это элемент ассоциативного $_SERVER, к нему мы и обращаемся. switch ($url) { // будем искать нужное выражение (в данном случае выводящее нужный блок) для текущего урла case '': // в одинарных кавычках следует записать урл адрес страницы, без домена. т.к. в переменной $url так же содержится адрес без домена, чтобы совпадение вообще могла быть возможным. $tpl->load_template(''); // это обращение к объекту класса. про классы я не писал ибо это очень очень много и всего я сам не знаю. $tpl - это объект стандартного класса DLE для работы с шаблонами (шаблонизатора). вообще классы это как бы набор функций, и их смысл примерно тот же, только больше возможностей. load_template загружает файл шаблона. он должен быть .tpl формата. В данном случае мы его немного обманули, там у нас не шаблон а код нашего меню :) в кавычки надо указать путь к файлу .tpl относительно корневой папки шаблона сайта $tpl->compile('menu'); // compile обрабатывает наш файл загруженный через load_template. в скобках по всей видимости указывается его идентификатор, я точно сам не знаю. но обычно он совпадает с название модуля или файла шаблона. break; // останавливаем поиск, ведь мы уже нашли что нам надо. default: // меню для всех остальных страниц сайта, не указанных в операторах case $tpl->load_template(''); $tpl->compile('menu'); break; } Оператор case для примера я указал только один. На самом же дела их может быть бесконечно много, по всей логике столько сколько и страниц. Отличия в них будут, только в содержании сравниваемого выражения (урла) и загрузке разных меню. Теперь файл админки (он посложнее, и тут я применял несколько более широкий функционал PHP, нежели описано в мануале). В админке мы можем редактировать файл модуля menu.php. Сделал я это просто для удобства. Смысл работы. У нас есть хтмл форма. Данные из форм получаем методом POST. Есть два метода POST и GET. POST это значит что данные будут передаваться как бы скрыто, а GET через адресную строку. Например адрес админки /admin.php?mod=menu мы файлу admin.php методом GET передали значение переменной mod. Теперь переменная mod равняется menu и движок загрузил нам необходимую страницу. GET используется для передачи вот таких коротких незначительных данных. А для передачи файлов, ПАРОЛЕЙ, текста и т.д. используется POST. Рассмотрим форму. У нас есть текстовая область, туда мы вначале загружаем содержимое из файла /modules/menu.php, а потом при нажатии кнопки отправляем содержимое области, скрипту который перезапишет это все в тот же файл /modules/menu.php. Так же в форме есть независимый переключатель. Если стоит галочка, то он передаст скрипту переменную is со значением yes (name=is value=yes) имя переменной и значение произвольны. Для нас главное чтоб переменная была передана, т.е. существовала. С помощью нее скрипт будет знать что ему делать. Как вы видите основой является условие. Если переменная is не существует, не передана сценарию, то мы выведем форму для редактирования и инструкцию. А если существует, то значит в форме уже отредактировали текст и его необходимо записать в файл и вывести отчет. В этом отчете передать переменную is невозможно, а следовательно опять при возвращении назад у нас будет форма редактирования, что нам и нужно. Сам код: if( ! defined( 'DATALIFEENGINE' ) ) { // см. выше
die( "Hacking attempt!" ); } echoheader("menu", 'Управление динамическим меню'); // тоже стандартный "набор" DLE. выводит на экран шапку админки, в скобках указывается имя файла модуля и описание (по всей видимости для себя, т.к. нигде не выводится) // начинается сам "рабочий код" if (!isset($_POST['is'])) { // функция isset() проверяет существование чего либо. а восклицательный знак означает "не". т.е. прочитать код можно так "если переменная is НЕ передана, то.." $_POST это глобальный массив. в не содержатся переменные принятые методом POST $file_prog = fopen (ROOT_DIR . '/engine/modules/menu.php', "r+") or die ("не открывается файл"); // функция fopen() открывает файл, просто открывает, ей мы указываем путь к файлу (ROOT_DIR . '/engine/modules/menu.php') и права доступа к этому файлу (r+). в данном случае нам нужно файл только прочитать. но r+ позволяет большее. кстати ROOT_DIR . это премудрости движка, если вы будите писать просто скрипт, не для движков, то это не нужно, нужен только путь в кавычках. or die означает "если ошибка" while (!feof($file_prog)) { // вот и пригодился нам цикл с условием, за который говорила Innulia)) суть его в том что код будет выполняться пока условие верно. feof() проверяет достигнут ли конец файла. этой функции мы передаем переменную содержащую идентификатор самого файла (что он открыт, как открыт, путь к нему. все это содержит теперь наше переменная когда мы ей присвоили значение функции fopen) Пока НЕ достигнут конец файла, мы продолжаем его считывать $text_prog = $text_prog . fread ($file_prog,50); // в переменную $text_prog записываем содержимое файла. точка обозначает что к уже имеющемуся в $text_prog будет записано то что прочитает функция fread (читает файл, ей надо передать идентификатор файла и число символов которые на прочитать. мы читаем по 50 символов. можно было просто указать 9999999999999999999 и не париться с циклом, но вдруг у кого то будет содержимое файла еще больше. все надо делать еще и универсально, красиво). } $menu_1 = fopen (ROOT_DIR . '/engine/inc/menu_1.txt', "r"); // открываем файл, в котором содержаться пояснения в текстовых областях. в них есть php код. и чтоб он вывелся как есть, а не был выполнен, я его подгружаю как обычный текст из файла. можно было это выполнить и по другому. но это на мой взгляд проще $menu_2 = fopen (ROOT_DIR . '/engine/inc/menu_2.txt', "r"); // аналогично $menu_1 = fread ($menu_1,100); // читаем текст из файла. тут я уж знаю сколько там символов и цикла нам не нужно $menu_2 = fread ($menu_2,100); // аналогично // в переменную $forma_red записываем хтмл код нашей страницы со всеми формами и пояснениями. в двойные кавычки, т.к. в коде нам нудно вывести содержимое переменных $text_prog, $menu_1 и $menu_2 $forma_red = "<table width=100%> <tr> <td><form action=http://xxx/admin.php?mod=menu method=post> <textarea cols=80 rows=20 wrap=virtual name=phptext>$text_prog </textarea><br> <input type=checkbox name=is value=yes />сохранить<br> <input type=submit value=отправить /> </form></td> <td width=30></td> <td><h2>Для присвоения блоков новым страницам, замените конструкцию вида:</h2> <textarea cols=30 rows=4> $menu_1 </textarea> <h3>конструкцией (а в дальнейшем просто добавляйте ниже между break; и default:):</h3> <textarea cols=30 rows=4> $menu_2 </textarea> <h3>где:</h3> <p> /mypage.html - адрес страницы (без доменного имени, т.е. полный урл выглядел бы так: http://my-domen.ru/mypage.html ) которой мы присваиваем меню. Модуль будет работать для абсолютно любого урла, даже вида: /admin.php?mod=menu&mod=menu&mod=menu&mod=menu&mod=menu&%QR%QP%QPO%/ </p> <p>file.tpl - имя файла, содержимое блока которое должно будет выводиться на искомой странице. Предварительно, вы естественно должны этот файл создать. ВАЖНО - файл должен быть именно формата .tpl </p> <p>строки $tpl-&gt;compile('menu'); break; оставить без изменений </p> <p>оператор default: задает значении по умолчанию, т.е. блок который будет выводиться на всех остальных страницах</p> <p>*******************************</p> <p>Для сохранения изменений поставьте флажок &quot;сохранить&quot; и нажмите &quot;отправить&quot;. Без флажка &quot;сохранить&quot; изменения внесены не будут! После успешной отправки формы, файл модуля будет безвозвратно перезаписан - БУДЬТЕ ВНИМАТЕЛЬНЫ! </p> <p>&nbsp;</p></td> </tr> </table>"; echo $forma_red; // выводим код на страницу } else { //если переменная is передана, т.е. форма заполнена, пользователь хочет изменить файл скрипта. $text_prog = $_POST['phptext']; // получаем новое содержание файла модуля из формы и записываем это в переменную $s = fopen (ROOT_DIR . '/engine/modules/menu.php', "w") or die ("не открывается файл"); // опять открываем файл /engine/modules/menu.php, но только уже с другими правами. которые нам больше всего подходят для данных нужд fwrite ($s, $text_prog ); // функция fwrite() записывает информацию в файл. ей нужно передать идентификатор файла и саму информацию соответственно echo "<h3><a href=http://xxx/admin.php?mod=menu>вернуться назад </a></h3>"; //выводим ссылку, для возвращения назад к редактированию } // условный оператор закончился echofooter(); // выводим футер админки |
|
|
alexperec
|
Сообщение
#9
|
|
P.S. Кто-нибудь может подумать что тут воды больше чем сути. но это не так. Эта вся вода для того что бы понять мотивацию все действий, чтоб вырисовывалась ясная картина. Опытный программист все поймет и без пояснений. А этот же урок "основы", для тех кто только начинает. Что бы все разложить по полочкам и проследить ход мыслей , понять от куда что взялось - надо писать все с самого начала, а не только готовый код.
Что то народ вялый, наверное жара утомляет :) Пишите активнее - не стесняйтесь! Задавайте вопросы, приводите примеры своих попыток - будем вместе все разбирать, искать ошибки :) |
|
|
alexperec
|
Сообщение
#10
|
|
В продолжение к этому уроку написал бонусную статью, так же со всеми пояснениями и разбором полетов Легкая CMS для малостраничных сайтов :)
буду ждать коментариев в той ветке :swoon: |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое | 5 | CULA | 3397 | 19.12.2023, 18:55 автор: CULA |
|
Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery Разработка сайтов и сервисов под-ключ |
0 | alexey | 1241 | 24.11.2023, 14:46 автор: alexey |
|
Веб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP) | 56 | qpPeW | 44902 | 19.7.2023, 10:03 автор: qpPeW |
|
Есть спецы по php/laravel? | 3 | Mixatraider | 1889 | 26.5.2023, 20:48 автор: Mixatraider |
|
Опытный PHP\Python разработчик в поиске интересных задач | 6 | daikzlex | 3402 | 25.5.2023, 13:55 автор: daikzlex |
Текстовая версия | Сейчас: 19.4.2024, 6:27 |