X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
> Урок: основы PHP программирования с нуля
alexperec
alexperec
Topic Starter сообщение 31.7.2011, 14:51; Ответить: alexperec
Сообщение #1


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

Как это относится к сео? Да очень даже прямо. Порой бывает нужно выполнить груду однотипной рутинной работы, и не большой скриптик мог бы очень помочь и сэкономить кучу времени. Я уже не говорю за то, что порой бывают, нужны более серьезные модули или программы, заказывать которые стоит порой не по карману. Но это уже более сложные задачи, которые тут мы рассматривать не будем. Если вы действительно заинтересуетесь, то в Интернет полно умных книжек, которые так и просятся чтоб их прочли) Здесь же мы рассмотрим только основы, помогающие вникнуть в суть и перейти к самостоятельному обучению более сложных этапов.

Речь пойдет о программировании на языке PHP.
Ну приступим…

Что же такое программирование? Чем оно отличается, например от языков разметки?
Разметка – это правила, применяемые к содержимому тега .
< a href="">текст</a>
Т.е. правила показывает браузеру, что содержимое тега <a> - ссылка. И оформлять и выводить пользователю её следует тоже как ссылку.
Языком разметки мы можем только применять какие любо правила, но не можем динамически изменять данные. Т.е. мы меняем только одежду, но сделать из человека обезьяну мы не можем.

Программирование же – это написание скриптов, или иначе сценариев. Сценариев по которым будут обрабатываться входящие данные (данные которые мы предоставим программе). Писать сценарии намного сложнее чем форматировать текст. Ведь для этого мало знать синтаксис языка, нужно самому этот сценарий спланировать и реализовать средствами языка.

Перед началом изучения, нам нужно обзавестись веб сервером, с установленным PHP интерпритатором. Интерпретатор – это программа, которая читает наш код и «переводит» его на машинный язык. В качестве сервера может быть хостинг. А лучше скачать и установить денвер, тот тот же хостинг только локальный (доступен только вашему компьютеру, или вашей локальной сети). Скачать можно тут http://www.denwer.ru/ там же почитать про установку и инструкцию по работе с ним.

Теперь перейдем к началу изучения PHP.

В php, как и в других языках все, так сказать, инструменты можно разделить на несколько групп:

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

$peremennaya –это переменная
peremennaya –а это просто бессмысленный набор символов

Переменные чувствительны к регистру (заглавным и строчным символам). Т.е. $a и $A совсем разные вещи. Тип переменной PHP определяет сам, поэтому во избежание путаницы не делайте действий с переменными разных типов. Например не прибавляйте число к массиву, ибо результат не предсказуем.

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

Операторы – действия. Например: +, -, *, /, = и т.д. Полный список можно почитать справочник. Следует заметь что выражение:

$a = $b

Означает не то, что значение переменной «а» равно значению переменной «b». А то что значению переменной «a» присвоили значение «b». То есть если было:
$a = 1;
$b = 2;
$a = $b;

То в итоге выполнения этой программы значение $a будет равно 2.

А для сравнивания есть другие операторы: == и ===

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

Оператор вывода: echo "" или echo'', одинарные и двойные кавычки имеют несколько разный смысл. Для вывода значений переменных кавычки не используются (одних переменных без текста). Покажу на примере:

$a = "привет";
echo $a; // выведет на экран: привет
echo "$a"; // Тоже выведет: привет. Но делать так не правильно
echo "$a друг";  // выведет на экран: привет друг
echo '$a друг' //  выведет на экран: $a друг


Т.е. то что в одинарных кавычках воспринимается как простой текст.

Оператор условия:
If (условие) {
Код1;
}
else {
Код1;
}


Смысл его таков, если (if) условие верно (существует, имеет смысл) то выполняется код1, если не верно (else), то выполняется код2. Подробнее можно почитать в книжках, ибо тут писать много.

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

for ($i=0; $i<6; $i+2) {
Код;
}


Как это работает. Переменная $i это счетчик. Первым выражением $i=0 мы задаем начальное значение, второе выражение $i < 6 – это условие, т.е пока i меньше шести мы продолжаем выполнять код. Третье выражение $i+2 это действие которое выполняется после выполнения кода. Т.е. порядок действий таков (переменную $i буду писать «и», чтоб на русс. Англ. Не переключать каждый раз:)):

«и» равно нулю. Ноль меньше шести? – да. Выполняем код. К «И» прибавляем два. «и» рано 2. 2 меньше шести? – да. Выполняем код. К «И» прибавляем два. «и» рано 4. 4 меньше шести? – да. Выполняем код. К «И» прибавляем два. «и» рано 6. 6 меньше шести? – нет. Цикл останавливается.

Одно полное действие цикла - одна ступень («и» равно нулю. Ноль меньше шести? – да. Выполняем код. К «И» прибавляем два.) называется итерация.
Так же бывают другие типы циклов: с условием, пост условием. Понять их тоже не трудно.

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

$a = 1;
сos($a);


то эта функция вернет, высчитает нам значения косинуса из единицы.
Кстати о слове «вернет». Вернет значит передаст. Т.е. мы может значения косинуса передать например переменной.

$b = cos($a);

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

В запасе языка PHP есть множество встроенных функций. Они различаются по типам, по области применения и т.д. полный список и синтаксисом и описанием можно узреть тут http://php.su/functions/?page=cat

А тут можно прочитать про создание собственных (пользовательских) функций http://php.su/functions/custom/?1

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

Есть еще переменные окружения. Эти переменные пользователю изменять нельзя. Можно только пользоваться данными. Их значение изменяет сам интерпретатор. Для получения данных из таких переменных есть специальная функция getenv(). Переменная SERVER_ADDR содержит айпи адрес пользователя исполняющего сценарий, например просматривающего например сайт. Например мы хотим чтоб на нашем сайте пользователи могли видеть свой IP, то мы создадим «модуль» примерно такого содержания:

$ip = getenv("SERVER_ADDR");
echo "ваш IP: $ip";


мы сначала присвоили переменной $ip значение IP адреса пользователя, а потом его вывели на экран с помощью оператора.

В функции getenv() имя переменной нужно указывать в кавычках, как в примере.

Таких переменных очень много, найти можно в справочниках.

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

Прикрепленное изображение


Создать такой массив можно с помощью функции array(), назовем его mass:
$mass = array ("привет", "пока",2+3, $ip = getenv("SERVER_ADDR") , cos($a));

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

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

Элементы массива нумеруются с нуля. Не один, два ,три. А ноль, один, два и т.д.

Обращаться к элементам массива можно так:
Echo $mass[4];

На экран будет выведено значение косинуса, а не строка «cos($a);».

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

Например в файле test.txt у на такое содержание:
Вася
Пошел
В магазин


То:

$text = file('text.txt');

Переменная $text становится массивом из трех элементов. Элемент с индексом 0, содержит «вася», с индексом 1 «пошел», и 2 «в магазин». Функции file() мы передаем путь к файлу. Путь должен быть верным! Данный путь действителен, только если файл лежит в одной папке со скриптом!

Вроде бы все..

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

Пример 1.

На днях я столкнулся с небольшой проблемой. Мне нужно было скачать все изображении со страницы http://www.volgograd.org.ru/maps/maps/rostov/ . их там очень много. По одной я бы сидел очень долго. С учетом моей скорости интернета. Подумав как можно автоматизировать задачу, вспомнил что в тоталкомандере можно автоматически загружать файлы по списку ссылок. Но опять загвоздка, как этот список от сюда вытащить. Сидеть выделять столько ссылок мышкой из исходного кода мучительно, в конце обязательно на нервах рука дрогнет и все насмарку. Посмотрев исходный код мы видим что содержание страницы – таблица. А значит, зажав кнопку ctrl мы сможем выделить столбец. Нас больше интересует столбец имен файлов.

Предварительно наведя на имя(ссылку) мы видим что имена совпадают с именами на сервере. Это уже очень хорошо. Теперь скопировав столбец имен в блокнот, получаем текстовый файл, где с каждой строки имя файла с расширением. Сохраняем файл к примеру text.txt. все фотки находятся в одном каталоге, что уже облегчает работу. Теперь нам нужно понять что же нам надо дальше делать. А делать надо следующее, с помощью функции file() мы прочитаем документ и имя каждого файла окажется в своей ячейке. потом с помощью цикла в каждый элемент массива в начало допишем адрес докаталога, и получим массив с готовыми ссылками. А потом опять циклом этот массив выведем на экран. И у нас готов список ссылок на загрузку! В блокноте глянем сколько получилось имен (строк). Их 137. И приступим.

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

echo "это код, который исполняется интерпретатором"; // а это просто комментарий


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

Писать код можно в блокноте или специальных программах с подсветкой синтаксиса. Файл должен быть с расширением .php Начинаться и заканчиваться код должен так:

<?php
Наш код;
?>


Теги <?php и ?> показывают границы нашего кода. Все что вне них, интерпретатор выполнять не будет и просто выведет их на экран текстом.
Код с комментариями:
<?php
$name=file('base.txt'); // создали массив имен
for ($i=0; $i<=136; $i++) { // оператор <= значит меньше или равною. 136, то что массив начинается с 0, а не единицы. и последний элемент равен кол-во элементов минус один. а оператор ++ прибавляет единицу. в циклах использовать +1 некорректно
    $name[$i]="http://www.volgograd.org.ru/maps/maps/rostov/$name[$i]"; //обращаемся к каждому элементу по порядку, в качестве индекса используем счетчик $i. и дописываем в начало путь к каталогу.
}
for ($i=0; $i<=136; $i++) {
echo $name[$i]; //выводим поочередно каждый элемент массива
echo "<br>";  // выводим тег <br>, чтобы каждая ссылка была с новой строки
}
echo "<br>Готово! А все оказывается просто!"; // от себя добавил ))
?>


Данную программу можно немного оптимизировать, убрав лишний цикл. Т.к. оба цикла выполняют одну и туже работу, мы все действия перенесем в первый цикл, а второй удалим:
<?php
$name=file('base.txt'); // создали массив имен
for ($i=0; $i<=136; $i++) { // оператор <= значит меньше или равною. 136, то что массив начинается с 0, а не единицы. и последний элемент равен кол-во элементов минус один. а оператор ++ прибавляет единицу. в циклах использовать +1 некорректно
    $name[$i]="http://www.volgograd.org.ru/maps/maps/rostov/$name[$i]"; //обращаемся к каждому элементу по порядку, в качестве индекса используем счетчик $i. и дописываем в начало путь к каталогу.
    echo $name[$i]; //выводим поочередно каждый элемент массива
    echo "<br>";  // выводим тег <br>, чтобы каждая ссылка была с новой строки
}
echo "<br>Готово! А все оказывается просто!"; // от себя добавил ))
?>


в итоге за считанные секунды я получил список урлов, поставил их на загрузку, а сам пошел пить кофе :wacko: и заниматься другими делами

файлы программы можете скачать тут http://dl.dropbox.com/u/16037749/primer.rar
можете запустить её и убедиться, что все работает.

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

Во втором примере я опишу как я писал свой модуль http://ruseo.net/moy-modul-dlya-dle-bloki-dlya-opredelennih-stranic-t2535.html. Он уже имеет самое что именно есть прямое отношение к сео и оптимизации. Но это чуть позже, а то утомился :)

Помните порой легче создать свой &quot;мини сео софт&quot;, чем искать готовое. Его кстати может и не существовать вовсе <_<


Если вы действительно заинтересовались программированием на PHP, советую почитать книгу &quot;PHP 5/6 и MySQL 6. Разработка Web-приложений&quot; Дениса Колисниченко. Там очень много хорошего материала. Все понятно излагается. Читайте справочники, и главное учитесь думать и все себе представлять, и будет вам счастье! А все остальное как говорится придет с опытом :)

Буду ждать комментариев :)
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Innulia
Innulia
сообщение 1.8.2011, 0:00; Ответить: Innulia
Сообщение #2


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

У меня все :)


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
pro-fast
pro-fast
сообщение 1.8.2011, 17:32; Ответить: pro-fast
Сообщение #3


Спасибо за мануал!

Жду продолжения...

Да, хотел спросить, что делает функция file_get_hmtl?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexperec
alexperec
Topic Starter сообщение 1.8.2011, 19:15; Ответить: alexperec
Сообщение #4


(Innulia)
Мануал получился достаточно простенький, этих основ вполне достаточно для создания скриптов.
Есть только несколько вопросов: вы указали пример цикла с счетчиком. Данный тип циклов часто бывает неудобным для выполнения программ, чаще используются с условием и постусловием. Почему вы выбрали для описания именно цикл со счетчиком?
про массивы: вы указываете, что в массиве могут содержаться разные значения. Обычно массив содержит однотипную информацию: только символы, только числа, только текстовая инфа и тд. У вас в примере данные разных типов - это особенность массивов в php? То есть можно в один массив пихать разные данные?
Вы указали в тексте, что такое функции. Почему не были описаны процедуры? Они часто бывают намного удобнее. Есть ли процедуры в php?

У меня все :)


Innulia, давайте по порядку)

Цикл со счетчиком на мой взгляд, наоборот намного приминимее. Например для перебора массивов и много еще для чего) Да и его синтаксис, и действия несколько сложнее для понимания, на мой взгляд, нежели циклы с условиями. И если понять цикл for, то остальные понять уже не составит труда ИХМО

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

процедуры? такого в php нет. или возможно оно носит какое-то другое название

Я не описывал классы и объекты, т.к. это уже более сложно и не каждый это сразу поймет. Но все же упомянул что такое есть)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Innulia
Innulia
сообщение 1.8.2011, 19:18; Ответить: Innulia
Сообщение #5


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


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexperec
alexperec
Topic Starter сообщение 1.8.2011, 19:28; Ответить: alexperec
Сообщение #6


(pro-fast)
Спасибо за мануал!

Жду продолжения...

Да, хотел спросить, что делает функция file_get_hmtl?


Незачто ;)

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

По поводу функции, не встречал такую. Справочники и яндекс о ней умалчивают. От куда вы её взяли? Такая вообще существует?

Но если судить по её имени, то скорее всего эта функция читает хтмл код страницы. Возможно в одну строку. Но это мои догадки. Хотя для чтения всего файла в строку есть другая функция file_get_contents и разницы нет хтмл это документ или любого другого расширения
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexperec
alexperec
Topic Starter сообщение 1.8.2011, 19:33; Ответить: alexperec
Сообщение #7


(Innulia)
Спасибо за исчерпывающий ответ :)
Насчет циклов могу поспорить: цикл со счетчиком применим только в том случае, если наперед известно число операций, что бывает далеко не всегда.


А я и не говорил что другие циклы бестолковые :) безусловно, различные ситуации бывают

А еще причина рассмотрения цикла for то, что я использовал его в примере :) Таким примером я убил несколько зайцев, задействовав практически все описанное в статье :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexperec
alexperec
Topic Starter сообщение 2.8.2011, 11:11; Ответить: alexperec
Сообщение #8


Вот дошли руки до описания второго примера.

Скачать его можно в этой ветке Мой модуль для DLE - блоки для определенных страниц там же инструкция по установке.

Это , в отличии от первого примера, уже полноценный модуль для сайтов на движке DLE. У данного модуля есть админка.

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

Немного истории. Суть проблемы заключалась в том, что мне нужно было чтобы для каждой категории новостей было свое &laquo;меню категории&raquo;, где бы были ссылки на материалы именно этого раздела сайта. И при том, на корневых страницах самого раздела чтоб можно было написать статичный неизменяемый текст, оптимизированный под свой ключ. Т.к. обычно бывает так, что разделы содержат краткие описания новостей, и постоянно изменяются из-за того что новые новости публикуются, а старые уходят вниз. А ведь ИХМО у сайта должна прослеживаться иерархия страниц. Ведь у разделов больше шансов подняться по конкурентному ключу, чем у обычных страниц, ведь УВ разделов ниже. А значит важность выше в глазах поисковиков. И этим надо пользоваться. Да и к тому же так можно добиться своего рода постоянства, т.к. у раздела содержание меняться не будет, значит и в выдаче он должен сидеть ровнее.

Теперь о попытках решения задачи. Как часто бывает, то что видится легким, на самом деле в сто раз сложнее. Тогда писать модули на ДЛЕ я еще не умел, и мне казалось что решать проблему программно &ndash; это очень тяжко. И ломал голову как сделать это с помощью огромной системы шаблонов. Но в любом случае чем-то приходилось жертвовать, все и сразу сделать не получалось. Благо, я хоть не додумался действительно сидеть и эту груду шаблонов делать, все ограничилось теорией Потом я наткнулся на материал по созданию модулей и привязке их к движку (см. выше). Ведь главной загвоздкой для меня было не сколько как написать модуль, а как его интегрировать в движок.

Суть работы модуля. А суть такова, что мы, с помощью переменной окружения получим урл адрес текущей страницы, просматриваемой пользователем. Далее этот урл будем сравнивать со всеми имеющимися страницами сайта, при помощи оператора 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(&quot;Hacking attempt!&quot;); // die останавливает работу скрипта, и выводит сообщение из скобок. там обычно указывают причину остановки. в данном случае скипт остановится в случае подозрения на взлом
}

$url=$_SERVER['REQUEST_URI']; // переменной $url присваиваем значение текущего адреса страницы без домена. его содержит переменная окружения REQUEST_URI. обратиться к ней мы могли бы и так как я писал в уроке, там описывается универсальный вариант, если мы не знаем чему так сказать эта переменная принадлежит. все глобальные (доступные в любом месте сценария без объявления и присвоения значений) переменные есть элементы глобальных массивов. в данном случае это элемент ассоциативного $_SERVER, к нему мы и обращаемся.

switch ($url) { // будем искать нужное выражение (в данном случае выводящее нужный блок) для текущего урла
case '': // в одинарных кавычках следует записать урл адрес страницы, без домена. т.к. в переменной $url так же содержится адрес без домена, чтобы совпадение вообще могла быть возможным.
   $tpl-&gt;load_template(''); // это обращение к объекту класса. про классы я не писал ибо это очень очень много и всего я сам не знаю. $tpl - это объект стандартного класса DLE для работы с шаблонами (шаблонизатора). вообще классы это как бы набор функций, и их смысл примерно тот же, только больше возможностей. load_template загружает файл шаблона. он должен быть .tpl формата. В данном случае мы его немного обманули, там у нас не шаблон а код нашего меню :) в кавычки надо указать путь к файлу .tpl относительно корневой папки шаблона сайта
   $tpl-&gt;compile('menu'); // compile обрабатывает наш файл загруженный через load_template. в скобках по всей видимости указывается его идентификатор, я точно сам не знаю. но обычно он совпадает с название модуля или файла шаблона.
   break; // останавливаем поиск, ведь мы уже нашли что нам надо.

default: // меню для всех остальных страниц сайта, не указанных в операторах case
   $tpl-&gt;load_template('');
   $tpl-&gt;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( &quot;Hacking attempt!&quot; );
}

echoheader(&quot;menu&quot;, 'Управление динамическим меню'); // тоже стандартный &quot;набор&quot; DLE. выводит на экран шапку админки, в скобках указывается имя файла модуля и описание (по всей видимости для себя, т.к. нигде не выводится)

// начинается сам &quot;рабочий код&quot;

if (!isset($_POST['is'])) { // функция isset() проверяет существование чего либо. а восклицательный знак означает &quot;не&quot;. т.е. прочитать код можно так &quot;если переменная is НЕ передана, то..&quot; $_POST это глобальный массив. в не содержатся переменные принятые методом POST

$file_prog = fopen (ROOT_DIR . '/engine/modules/menu.php', &quot;r+&quot;) or die (&quot;не открывается файл&quot;); // функция fopen() открывает файл, просто открывает, ей мы указываем путь к файлу (ROOT_DIR . '/engine/modules/menu.php') и права доступа к этому файлу (r+). в данном случае нам нужно файл только прочитать. но r+ позволяет большее. кстати ROOT_DIR . это премудрости движка, если вы будите писать просто скрипт, не для движков, то это не нужно, нужен только путь в кавычках. or die означает &quot;если ошибка&quot;

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', &quot;r&quot;); // открываем файл, в котором содержаться пояснения в текстовых областях. в них есть php код. и чтоб он вывелся как есть, а не был выполнен, я его подгружаю как обычный текст из файла. можно было это выполнить и по другому. но это на мой взгляд проще
$menu_2 = fopen (ROOT_DIR . '/engine/inc/menu_2.txt', &quot;r&quot;); // аналогично
$menu_1 = fread ($menu_1,100); // читаем текст из файла. тут я уж знаю сколько там символов и цикла нам не нужно
$menu_2 = fread ($menu_2,100); // аналогично

// в переменную $forma_red  записываем хтмл код нашей страницы со всеми формами и пояснениями. в двойные кавычки, т.к. в коде нам нудно вывести содержимое переменных $text_prog, $menu_1 и $menu_2

$forma_red = &quot;&lt;table width=100%&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;form action=http://xxx/admin.php?mod=menu method=post&gt;
&lt;textarea cols=80 rows=20 wrap=virtual name=phptext&gt;$text_prog
&lt;/textarea&gt;&lt;br&gt;
&lt;input type=checkbox name=is value=yes /&gt;сохранить&lt;br&gt;
&lt;input type=submit value=отправить /&gt;
&lt;/form&gt;&lt;/td&gt;
    &lt;td width=30&gt;&lt;/td&gt;
    &lt;td&gt;&lt;h2&gt;Для присвоения блоков новым страницам, замените конструкцию вида:&lt;/h2&gt;
      &lt;textarea cols=30 rows=4&gt;
$menu_1
      &lt;/textarea&gt;
      &lt;h3&gt;конструкцией (а в дальнейшем просто добавляйте ниже между break; и default:):&lt;/h3&gt;
      &lt;textarea cols=30 rows=4&gt;
$menu_2
&lt;/textarea&gt;

    &lt;h3&gt;где:&lt;/h3&gt;
    &lt;p&gt; /mypage.html - адрес страницы (без доменного имени, т.е. полный урл выглядел бы так: http://my-domen.ru/mypage.html ) которой мы присваиваем меню. Модуль будет работать для абсолютно любого урла, даже вида: /admin.php?mod=menu&amp;mod=menu&amp;mod=menu&amp;mod=menu&amp;mod=menu&amp;%QR%QP%QPO%/ &lt;/p&gt;
    &lt;p&gt;file.tpl - имя файла, содержимое блока которое должно будет выводиться на искомой странице. Предварительно, вы естественно должны этот файл создать. ВАЖНО - файл должен быть именно формата .tpl &lt;/p&gt;
    &lt;p&gt;строки $tpl-&amp;gt;compile('menu');
break; оставить без изменений &lt;/p&gt;
&lt;p&gt;оператор default: задает значении по умолчанию, т.е. блок который будет выводиться на всех остальных страницах&lt;/p&gt;
    &lt;p&gt;*******************************&lt;/p&gt;
    &lt;p&gt;Для сохранения изменений поставьте флажок &amp;quot;сохранить&amp;quot; и нажмите &amp;quot;отправить&amp;quot;. Без флажка &amp;quot;сохранить&amp;quot; изменения внесены не будут! После успешной отправки формы, файл модуля будет безвозвратно перезаписан - БУДЬТЕ ВНИМАТЕЛЬНЫ! &lt;/p&gt;
    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&quot;;

echo $forma_red; // выводим код на страницу
}

else { //если переменная is передана, т.е. форма заполнена, пользователь хочет изменить файл скрипта.
$text_prog =  $_POST['phptext']; // получаем новое содержание файла модуля из формы и записываем это в переменную
$s = fopen (ROOT_DIR . '/engine/modules/menu.php', &quot;w&quot;) or die (&quot;не открывается файл&quot;); // опять открываем файл /engine/modules/menu.php, но только уже с другими правами. которые нам больше всего подходят для данных нужд
fwrite ($s, $text_prog ); // функция fwrite() записывает информацию в файл. ей нужно передать идентификатор файла и саму информацию соответственно

echo &quot;&lt;h3&gt;&lt;a href=http://xxx/admin.php?mod=menu&gt;вернуться назад &lt;/a&gt;&lt;/h3&gt;&quot;; //выводим ссылку, для возвращения назад к редактированию
} // условный оператор закончился

echofooter(); // выводим футер админки
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexperec
alexperec
Topic Starter сообщение 2.8.2011, 11:49; Ответить: alexperec
Сообщение #9


P.S. Кто-нибудь может подумать что тут воды больше чем сути. но это не так. Эта вся вода для того что бы понять мотивацию все действий, чтоб вырисовывалась ясная картина. Опытный программист все поймет и без пояснений. А этот же урок &quot;основы&quot;, для тех кто только начинает. Что бы все разложить по полочкам и проследить ход мыслей , понять от куда что взялось - надо писать все с самого начала, а не только готовый код.

Что то народ вялый, наверное жара утомляет :)

Пишите активнее - не стесняйтесь! Задавайте вопросы, приводите примеры своих попыток - будем вместе все разбирать, искать ошибки :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexperec
alexperec
Topic Starter сообщение 22.8.2011, 19:39; Ответить: alexperec
Сообщение #10


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

буду ждать коментариев в той ветке :swoon:
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое
5 CULA 3291 19.12.2023, 18:55
автор: CULA
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1170 24.11.2023, 14:46
автор: alexey
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыВеб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP)
56 qpPeW 44765 19.7.2023, 10:03
автор: qpPeW
Открытая тема (нет новых ответов) Есть спецы по php/laravel?
3 Mixatraider 1856 26.5.2023, 20:48
автор: Mixatraider
Открытая тема (нет новых ответов) Опытный PHP\Python разработчик в поиске интересных задач
6 daikzlex 3360 25.5.2023, 13:55
автор: daikzlex


 



RSS Текстовая версия Сейчас: 28.3.2024, 23:15
Дизайн