[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Курс PHP. Урок №6 от IRBIS-team
twin
Если ты тут впервые, прочитай это!!!

Урок здесь.



Спустя 1 день, 9 часов, 57 минут, 12 секунд (26.12.2009 - 18:51) Хозяин Огня написал(а):
twin, а как сделать редирект с контроллера на индекс модуля?
Например добавил юзер запись в гостевую и мы его сразу перенаправляем на индекс, чтобы он сразу увидел своё сообщение и мог спокойно нажимать кнопку обновить.
header("location:") что-то не прокатило.

Спустя 5 минут, 7 секунд (26.12.2009 - 18:56) Хозяин Огня написал(а):
И ещё - насчёт имён пост-переменных, по-моему value всё-таки неудобно. ИМХО, лучше добавлять префикс принадлежности к модулю - gb_name(имя автора сообщения в гостевой книге), nl_name(имя автора коммента в новостной ленте) и т.д.

Спустя 48 минут, 52 секунды (26.12.2009 - 19:45) twin написал(а):
Цитата
И ещё - насчёт имён пост-переменных, по-моему value всё-таки неудобно. ИМХО, лучше добавлять префикс принадлежности к модулю - gb_name(имя автора сообщения в гостевой книге), nl_name(имя автора коммента в новостной ленте) и т.д.

Это с непривычки. На самиом деле не так страшно. А вот когда там скапливается 50 - 100 имен, из которых требуется всего два - очень плохо.

Цитата
header("location:") что-то не прокатило.

Почему... Я обычно обертку юзаю:
   function redirect()
{

$arguments = func_get_args();

if(count($arguments))
{
header('location: '. href($arguments));
exit();
}
else
{
header('location: '. str_replace("/index.php", "", $_SERVER['HTTP_REFERER']));
exit();
}
}

Спустя 1 день, 23 часа, 59 минут, 15 секунд (28.12.2009 - 19:45) A.V. написал(а):
Мой вариант функции:




if(!empty($_POST['ok']))
{
/**
* Create POST-values array
* Создаём массив с POST-данными
*/


$arrAdminPosts = array(
'title' => $POST['value1'],
'description' => $POST['value2'],
'keywords' => $POST['value3']
);


//print_r($arrAdminPosts);

/**
* Open a file to write the array values
* Открываем файл для записи значений.
*/


$file = IRB_ROOT.'/skins/setup/meta.txt';
if(!file_exists($file))
die('Error');

$f = fopen($file, "r+");

/**
* Clean the file and record array
* Очищаем файл и пишем в него массив.
*/


ftruncate($f, 0);
fseek($f, 0, SEEK_SET);
fwrite ($f, serialize($arrAdminPosts));
fclose($f);

echo "The meta-values are... В общем успешно занесены в 'реестр'";
}


Спустя 8 минут, 16 секунд (28.12.2009 - 19:53) twin написал(а):
Совсем тему читал невнимательно. Она восновном инициализации POST посвещена, а у тебя прямые обращения.
Потом, раз уж мы решили писать для php не ниже 5-й версии, то лучше сразу юзать безопасную file_put_contents()
Ну и самое главное. Если это функция, то и должна быть оформлена функцией. А если контроллер, то как записывать тайтлы для разных страниц?

Спустя 1 день, 9 часов, 41 минута, 1 секунда (30.12.2009 - 05:34) AmberLEX написал(а):
Т.е. мы делаем один главный раздел админки Установки или Настройки сайта (ну и разделы для модулей). А в этом разделе будет своя навигация типа: Метаданные для определенных модулей, Названия сайта, Редактирование robot.txt, sitemap?

Спустя 7 минут, 5 секунд (30.12.2009 - 05:41) twin написал(а):
Ну примерно так. Фишка в том, что кто делает основной модуль, тот и делает для него модуль админки. А установки - дело общее. И лучше это решить сразу на уровне ядра.

Спустя 7 дней, 9 часов, 42 минуты, 4 секунды (7.01.2010 - 15:23) Хозяин Огня написал(а):
Ну вот значит:

setup_controller.рнр


if (file_exists(IRB_ROOT .'/skins/setup/meta.txt'))
{
$metta = unserialize(file_get_contents(IRB_ROOT .'/skins/setup/meta.txt'));
irbdebug($metta);
}
$option = '';
$keys = array_keys($metta);
foreach($keys as $val)
{
$option .= '<OPTION value='."$val".'>'."$val".'';
}


if($ok)
{
irbdebug($POST);
$page = $POST['value5'];
$new_page = $POST['value4'];
$title = $POST['value1'];
$keywords = $POST['value2'];
$description = $POST['value3'];

if(!empty($new_page))
{
$metta["$new_page"] = array(
'title' => $title,
'keywords' => $keywords,
'description' => $description
);

$f = file_put_contents(IRB_ROOT .'/skins/setup/meta.txt', serialize($metta));
if($f = true)
{
header('Location: '. href('mod=setup'));
}

}

elseif(!empty($page))
{
$metta["$page"] = array(
'title' => $title,
'keywords' => $keywords,
'description' => $description
);

$f = file_put_contents(IRB_ROOT .'/skins/setup/meta.txt', serialize($metta));
if($f = true)
{
header('Location: '. href('mod=setup'));
}

}
}


skins/tpl/admin/setup.tpl:


<form action="" method="POST">



<
table border="1">

<
tr>
<
td>
<
h4><?php echo $language['page_name']; ?>:
</
td>
<
td>
<
select name="form[value5]">
<?php echo $option; ?>
</select></h4>
</
td>
</
tr>

<
tr>
<
td>
<
h4><?php echo $language['new_page_name']; ?>:
</
td>
<
td>
<
input name="form[value4]" type="text" size="66" /></h4>
</
td>
</
tr>

<
tr>
<
td>
<
h4><?php echo $language['title']; ?>:
</
td>
<
td>
<
input name="form[value1]" type="text" size="66" /></h4>
</
td>
</
tr>

<
tr>
<
td>
<
h4><?php echo $language['keywords']; ?>
</td>
<
td>
<
textarea name="form[value2]" cols="50" rows="8"></textarea></h4>
</
td>
</
tr>

<
tr>
<
td>
<
h4><?php echo $language['description']; ?>
</td>
<
td>
<
textarea name="form[value3]" cols="50" rows="8"></textarea></h4><br />
</
td>
</
tr>

<
tr>
<
td>
<
input name="ok" type="submit" />
</
td>
</
tr>

</
form>


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

Спустя 1 день, 22 часа, 48 минут, 56 секунд (9.01.2010 - 14:12) Хозяин Огня написал(а):
Если вставить в меню получается наложение надписей.
А можно сделать так в ru.php
 
if (defined('IRB_ADMIN'))
{
define('IRB_LANG_SITE_SLOGAN', 'Администраторская панель');
}
else
{
define('IRB_LANG_SITE_SLOGAN', 'Официальный сайт каршинского филиала ТУИТ');
}


twin, ещё вопрос. Собрался делать админку для гостевой. Получается, что мне понадобятся 6 контроллеров:

answer_controller.php
delete_controller.php
edit_controller.php
hide_controller.php
show_controller.php
read_controller.php

Это ничего что так много? Может для этого какие-то особые решения существуют..?

Спустя 20 минут, 28 секунд (9.01.2010 - 14:32) twin написал(а):
Плохо, когда одновременно подключается несколько контроллеров. Допустим у тебя на странице две кнопки - удалить и редактировать. Если подгружать сразу оба - плохо. Лучше в один. А если по очереди - нормально. Тут должен быть разумный баланс между дискретностью программы (то есть количеством частей) и функциональностью.
Гораздо легче ориентироваться, когда контроллер отвечает за действие. Удалить - значит delete_controller.php Все ясно и понятно. Но если слишком дробить, плохо для файловой системы. Это уже оптимизация и приходит с опытом. Дерзай, посмотрим что выйдет.

Спустя 1 день, 3 часа, 16 минут, 24 секунды (10.01.2010 - 17:49) Хозяин Огня написал(а):
Вот, собсно)
Переделал всё под дизайн AmberLEX'а.

з.ы. А куда все подевались?

Спустя 9 часов, 48 минут, 34 секунды (11.01.2010 - 03:37) AmberLEX написал(а):
Хотелось бы сделать групповое удаление новостей.
Но тогда с переменными $POST не очень хорошо - чтобы отмечать public и те новости, которые на удаление, понадобились два вида переменных value и del, чтобы отличать для кого галочки установлены. Все одной кнопкой. В общем смотреть нужно, может как-то переделать, чтоб выбирать действие.
Архив прикрепил.

Спустя 8 часов, 36 минут, 52 секунды (11.01.2010 - 12:14) AmberLEX написал(а):
Че-то неясно. Если в форме 30 значений, то инициализировать $POST = array(); от 1 до 30 что-ли?

Спустя 47 минут, 39 секунд (11.01.2010 - 13:02) twin написал(а):
Да. Если 100 полей, значит от 1 до 100. Так или иначе придется все переменные инициализировать.

Спустя 1 день, 1 час, 56 минут, 40 секунд (12.01.2010 - 14:59) A.V. написал(а):
Если я правильно понял, то требуется подобное:

в файле meta.txt должны храниться засериализованные многомерные массивы, с именами GET-параметра mod, которому они принадлежат, из состоящий из массивов с параметрами id.
То есть имеются, к примеру, массивы:

$news = array (
id_1 => array (
"title" => "Новости 01",
"keywords" => "Новости 01",
"description" => "Здесь находятся новости"
),
id_2 => array (
"title" => "Новости 02",
"keywords" => "Новости 02",
"description" => "Здесь находятся новости"
)
);


$gallery = array (
id_1 => array (
"title" => "Изображение 01",
"keywords" => "Изображение 01",
"description" => "Здесь находится изображение"
),
id_2 => array (
"title" => "Изображение 02",
"keywords" => "Изображение 02",
"description" => "Здесь находится изображение"
)
);



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

А для изменения meta-тегов...
Нужно, как я понимаю, создать нечто вроде карты сайта. По щелчку на ссылке с нужной страницей открывается шаблон с формой. Читается массив, извлекаются mod и id. Потом туда и загоняются изменяемые параметры. Массив переписывается и сохраняется.
Самый главный вопрос: как создать эту самую карту?

Я правильно понял?..



Спустя 7 дней, 21 час, 6 минут, 41 секунда (20.01.2010 - 12:05) Хозяин Огня написал(а):
Твин, вопрос - для каждой странице должны быть прописаны метатеги ключевые слова и описание? Это нужно, скажем, для страницы, в которой открывается одна конкретная новость? Если да, то папка skins/tpl/pages не решает эту проблему.

Спустя 6 минут, 38 секунд (20.01.2010 - 12:12) twin написал(а):
Не нужно так далеко. Достаточно основных страниц.

Спустя 7 часов, 15 минут, 28 секунд (20.01.2010 - 19:27) Хозяин Огня написал(а):
Хотя можно в фул-контроллерах прописывать:

$keywords = $data['subtitle'];


Твин, я так понял все эти нововведения только для того, чтобы сканировать страницы в директории и ставить им метатеги? Или есть ещё что-то?

Спустя 51 минута, 30 секунд (20.01.2010 - 20:19) twin написал(а):
Ну не только метатеги. Мы поставим редактор и можно будет контент статичных страниц менять легко и непринужденно. А чтоб добавить страницу, достаточно будет положить в папку static нужный файл и прописать ссылку в менюшку.
Автоматическое добавление страниц мы делать не станем. По крайней мере на этом движке. Потому что так мы спозем в сторону CMS, а мы не её делаем а просто основу для разработки. Но минимальное удобство для разработчика стоит сделать. В следующем уроке это все будет.

Спустя 5 дней, 3 часа, 12 минут, 43 секунды (25.01.2010 - 23:32) Wollff написал(а):
Цитата
$POST = array_merge($_POST['form'], array_diff_key($POST, $_POST['form']));
Она как раз заменяет одноименные элементы, не трогая остальные.

а есть вариант как реализуется это чудо на РНР 4?

Спустя 30 минут, 53 секунды (26.01.2010 - 00:02) twin написал(а):
Я не пробовал, у нас все на пятерку заточено... При желании можно все сделать)))

Спустя 16 дней, 21 час, 4 минуты, 57 секунд (12.02.2010 - 21:07) AmberLEX написал(а):
На счет description и keywords, в шаблоне
    <meta name="keywords" content="<?php echo $keywords; ?>" />
<
meta name="description" content="<?php echo $description; ?>" />
Т.е. если описание такое: "Фирма "MEGA" - самая классная", то в исходном коде страницы будет типа:
<meta name="keywords" content="Фирма &_quot;MEGA&_quot; - самая классная" />
Так? Может эти энд_квоты вырезать нужно?

Спустя 4 часа, 46 минут (13.02.2010 - 01:53) twin написал(а):
Зачем? энд_квоты они и в африке читаются энд_квотами. smile.gif А без них смысл теряется. А если не преобразовывать, то сам видишь - капец будет.
Нормально тут всё.

Спустя 22 минуты, 19 секунд (13.02.2010 - 02:16) AmberLEX написал(а):
Я к тому, что ключевое слово энд_квота;MEGAэнд_квота; не равно слову MEGA.
Т.е. если набираю в поиске: "Фирма MEGA" то не найдет, т.к. прописано Фирма энд_квота;MEGAэнд_квота; это же разное получается.
Может &quot убрать preg_replace -ом. Получается чистый список без htmlspecialchars.

Спустя 10 минут, 3 секунды (13.02.2010 - 02:26) twin написал(а):
Вот это задача не наша. Это СЕОшников задача, решать что там равно, а что нет. На сколько я знаю, как раз равно.
Наша задача тег не порвать.
А поправлять кого то жутким - preg_replace -ом неэтично и вообще зря.
Он же будет ресурс жрать, что гораздо серьёзнее ошибки СЕОшника. Последний её и исправить сможет запросто.

Спустя 18 дней, 9 часов, 30 минут, 30 секунд (3.03.2010 - 11:56) KonstantinK написал(а):
twin, а в уроке там где представлен вид файла variables.php почему то отсутствует блок
/**
* Generation of page of an error at access out of system
* Генерация страницы ошибки при доступе вне системы
*/

так наверное не должно быть?

Спустя 6 минут, 46 секунд (3.03.2010 - 12:03) twin написал(а):
Факт. Не должно. Исправлю.

Спустя 21 час, 8 минут, 25 секунд (4.03.2010 - 09:11) KonstantinK написал(а):
twin, еще вопрос - а можно пояснить как работает эта конструкция

if(!empty($_POST['form']))
$POST = array_merge($_POST['form'], array_diff_key($POST, $_POST['form']));

че то никак не врублюсь

Спустя 21 минута, 23 секунды (4.03.2010 - 09:33) Lenarfate написал(а):
если $_POST['form'] не пустая, то $POST = объединяем массивы $_POST['form'] и $POST, вычисляя в них расхождения сравниванием ключей biggrin.gif

Спустя 5 минут, 39 секунд (4.03.2010 - 09:38) twin написал(а):
$ПОЧТА = соединить_массивы($_ПОЧТА['форма'] с массивом $ПОЧТА не содержащим ключи массива $_ПОЧТА['форма']);

То есть мы смотрим, что есть в массиве $_POST['form']:
$_POST = 
Array
(
[form] => Array
(
[value1] => 'значение1'
[value2] => 'значение2'
)
)


и добавляем недостающие из массива $POST

$POST = 
Array
(
[value1] => ''
[value2] => ''
[value3] => ''
[value4] => ''
)


В результате имеем полный массив, где все элементы определены:
$POST = 
Array
(
[value1] => 'значение1'
[value2] => 'значение2'
[value3] => ''
[value4] => ''
)


и не боимся нотисов.



Спустя 5 часов, 21 минута, 20 секунд (4.03.2010 - 15:00) KonstantinK написал(а):
Благодарю Lenarfate, тут я смотрю и twin выложил в урок разъяснение для таких как я, теперь механизм понял.

Спустя 1 час, 14 минут, 25 секунд (4.03.2010 - 16:14) twin написал(а):
Побольше вопросов, понятнее будет курс. smile.gif
Ведь для меня очень сложно понять, чего вам не ясно. Глаз замылен, кажется что это все прописные истины. А так я по ходу дела вношу изменения.

Спустя 1 день, 2 часа, 39 минут, 41 секунда (5.03.2010 - 18:54) LindonAlex написал(а):
У меня вопрос возник с функцией href().
Может я где то что то не правильно использовал - но вот в чем у меня косяк получился:
Сначала мы делаем так:
global $GET;
$tmp = $GET;
$href = '';
$arg = func_get_args();

if(defined('IRB_ADMIN'))
$href = '/admin';

if($arg[0][0] == 'host')
return IRB_HOST . $href;

Т.е. в переменной $href уже есть значение "/admin". Дальше мы добавляем значения GET параметров. И вот потом завершающая стадия функции:
if(IRB_REWRITE == 'on')
return IRB_HOST . trim($href, '/');
else
return
IRB_HOST .'?'. trim($href, '&');

В итоге у меня в админке ссылка на скрипт уничтожения сессии к примеру выглядит так "http://localhost/saite/?/admin&mod=exit&rem=read" (главный индекс у меня лежит по адресу "http://localhost/saite/") . Т.е. мы возвращаем к значению корневого пути скрипта "?" а затем "/admin/....". В чем может быть проблема, где я мог ошибиться?

Спустя 40 минут, 12 секунд (5.03.2010 - 19:34) Lenarfate написал(а):
 if($arg[0][0] == 'host')
return IRB_HOST . $href;


может в этом дело?? должно быть
 if($arg[0] == 'host')
return IRB_HOST . $href;

Спустя 8 минут, 55 секунд (5.03.2010 - 19:43) twin написал(а):
Это моя ошибка, недогляд. sad.gif
Вот так должна быть функция.
/**  
* Function of formation of GET-parametres
* Функция формирования GET-параметров
*/

function href()
{
global $GET;
$tmp = $GET;
$href = '';
$host = IRB_HOST;

$arg = func_get_args();

if(is_array($arg[0]))
$arg = $arg[0];

if(defined('IRB_ADMIN'))
$host .= 'admin/';

if($arg[0] == 'host')
return IRB_HOST . $href;

foreach($arg as $var)
{
$param = explode('=', $var);

if(array_key_exists($param[0], $tmp))
$tmp[$param[0]] = $param[1];
else
die('The variable <b>'. $param[0] .'</b> is not defined');
}

foreach($tmp as $var => $val)
if(IRB_REWRITE == 'on')
$href .= '/'. $val;
elseif(!empty($val))
$href .= '&'. $var .'='. $val;


if(IRB_REWRITE == 'on')
return $host . trim($href, '/');
else
return
$host .'?'. trim($href, '&');
}


Сейчас везде поправлю.

Спустя 1 месяц, 7 дней, 17 часов, 37 минут, 31 секунда (13.04.2010 - 12:21) A.V. написал(а):
twin,

при создании админки в папке admin/раздел просто заново создаются новые контроллеры (то есть, собственно, для клиентской части свои, а для админки, пусть и почти идентичные,
но свои)?
Так ведь?..

Спустя 4 минуты, 36 секунд (13.04.2010 - 12:25) twin написал(а):
Да. Только совсем не идентичные. Совершенно другие они обычно. smile.gif

Спустя 10 дней, 6 часов, 59 минут, 39 секунд (23.04.2010 - 19:25) ohxxx написал(а):
Добрый день г-н twin

По уроку Nr-6

1.Архив у урока Nr-6 явно не от него (больше похоже на архив конца урока 7 по содержанию хотя не уверен т.к. я ещё до конца не дошол)
Ну если от него тогда я слепой но я три раза архив качнул и распаковал и посмотрел....

2. Текст урока :
И так, в корне создаем папку admin, а в ней повторяем структуру: главный индекс и модули. Конфигу, языки, библиотеки и прочая будем пользовать общие, чтоб не повторяться. Вот главный индекс админки:
Эм сильно расплывчато так и надо написать что создаём папку ADMIN и в неё переносим index .php (ну и на первых порах туда то больше ничего и не надо)
Все равно потом же будет создана пака meta и нужные файлы внутри.

3. Тут моё мнение. Не соглашусь по структуре админки если если директория админки почему внутри не создать директорию tpl . Ведь директория модулей находится внутри админки.
1. Для мне непонятно тогда почему файлы админки tpl валяются по всей структуре
2. Ведь можно же создать директорию tpl внутри админки
3. Хочтся узать почему так сделанон что tpl админки не находится внутри админки

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

5. Текст урока
То есть сразу организуем массив, в котором все элементы определены. Это избавит нас от забот постоянно следить за инициализацией, а так же поможет обрабатывать данные скопом, то есть не расписывая по отдельности.
Ну а чтобы в этом массиве заменить нужные элементы из суперглобального массива $_POST применим такю конструкцию:

    if(!empty($_POST['form']))
$POST = array_merge($_POST['form'], array_diff_key($POST, $_POST['form']));
Тут лучше расписать код на несколько строчек чем вкладывать всё в одну . Прочесть можно будет легче новичку.

6 НУ и самое БООЛЬШОЕ по всем курсу нужно за комментировать весь код как это сделано в уроке Nr-3.


/**
* Function of formation of GET-parametres
* Функция формирования GET-параметров
*/

function href()
{
global $GET; // Объявляем массив $GET, сформированный ранее, глобальным
$tmp = $GET; //Переписываем переменную, что бы не влиять на глобальный массив
$href = '';
$arg = func_get_args(); // Получаем массив аргументов переданных в функцию href(тут_вот)

if($arg[0] == 'host') // Это для того, что бы сделать ссылку без параметров
return IRB_HOST;

foreach($arg as $var) // Перебираем полученные аргументы
{
$param = explode('=', $var); // Разделяем имя переменной и значение (page=gallery, например)

// Если в массиве $GET ($tmp) есть ключ, полученный выше (в данном случае 'page')

if(array_key_exists($param[0], $tmp))
$tmp[$param[0]] = $param[1]; // То этому ключу присваеваем полученное значение
else
die('The variable <b>'. $param[0] .'</b> is not defined'); // Иначе...
}

foreach($tmp as $var => $val) // Теперь поочередно вставяем значения из $GET ($tmp) в ссылку
if(IRB_REWRITE == 'on')
$href .= '/'. $val; // Если реврайт включен, через слэш
elseif(!empty($val))
$href .= '&'. $var .'='. $val; // Если нет = обычные GET параметры


if(IRB_REWRITE == 'on')
return IRB_HOST . trim($href, '/');
else

Расставить максимум коментариев . Зачем это нужно.
1. КОд будет читаться легче новичьку
2. В коде будет полно подсказок
3. Если даже забыл что то по пройдясь по коду быстро вспомнит
4. Есть некоторые строчки которые я понимаю что делает но как прочеть её правильно не знаю например
if(get_magic_quotes_gpc())  

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

Вроде всё. спасибо за внимание. cool.gif
С уважением Ohxxx
З.Ы. Да я знаю скайпом чуть позже займуся и своим оформлением.

З.Ы.З.Ы. Эм если я что то непонятно сформулировал переформулирую чтобы было понятно

Спустя 2 часа, 25 минут, 22 секунды (23.04.2010 - 21:50) twin написал(а):
Ага. smile.gif Ну по порядку.
1. Проверю... Странно.

2. Тут факт, надо подробнее, займусь

3. Вот тут вопрос серьёзный. Для чего вообще необходима структура, так для того, что бы было легко обслуживать сайт. Основная ошибка начинающих в том, что они привыкли делать удобно только для себя. Так как все делают сами. Однако в жизни часто бывает иначе - сайт обслуживают несколько человек. Программист и верстальщик к примеру. Так вот что бы верстальщик не бегал по всему сайту, все отображение должно быть в одном месте. Там папка не зря называется skins, то есть их может быть несколько. И хозяин сайта может настроить FTP доступ верстальщику в эту папку и спать относительно спокойно, что тот не набуробит где-нибудь с функционалом. По этому на первый взгляд нелогично, но нужно привыкать мыслить профессионально, а не так, как удобно себе-любимому. smile.gif

4 - 6. Полностью согласен, придется попыхтеть. smile.gif

Спустя 4 минуты, 59 секунд (23.04.2010 - 21:55) ohxxx написал(а):
Цитата (twin @ 23.04.2010 - 17:50)
3. Вот тут вопрос серьёзный. Для чего вообще необходима структура, так для того, что бы было легко обслуживать сайт. ....



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

Спустя 4 дня, 20 часов, 50 секунд (28.04.2010 - 17:56) ohxxx написал(а):
День добрый Twin
Вопросик на засыпку про админку
Я так понял что meta это тоже самое что и modules а смысл тогда называть по разному ?

Просто моё мнения я бы назвал также но всем директориям админки присвоил индекс например ad_(directory) сразу понятно что это относится к админке даже несмотря полный пусть в скрипте.
Правда туту на вкус и цвет и количество опыта.

Или я чего то не понимаю...

Спустя 9 минут, 47 секунд (28.04.2010 - 18:06) twin написал(а):
Нет, это совсем не тоже самое. Дело в том, что слишком большая вложенность тоже ничего хорошего не имеет. По этому в админке нет одного уровня (modules) и модули лежат прямо в её корне.
Там нет ни библиотек, ни языков, ни других каталогов. Все выше. По этому нет смысла делать еще один уровень.

Спустя 47 минут, 35 секунд (28.04.2010 - 18:53) ohxxx написал(а):
День добрый Twin

По поводу урока 6
1.
Вообщето отличатся больший кусок чем в уроке написано что меняем

кусок из урока

  if(is_array($arg[0])) 
$arg = $arg[0];
// Добавим префикс, если функция вызвана из админки
if(defined('IRB_ADMIN'))
$host .= 'admin/';

if($arg[0] == 'host')
return IRB_HOST . $href; // а можно поянить зачем это дописывать насколько я помню если $arg[0] == 'host' то $href пустой или я туплю ?


и то что у нас есть до урока 6

$arg = func_get_args(); // Получаем массив аргументов переданных в функцию href(тут_вот)

if($arg[0] == 'host') // Это для того, что бы сделать ссылку без параметров
return IRB_HOST;


И там ещё поменялись строчьки

были

if(IRB_REWRITE == 'on')
return IRB_HOST . trim($href, '/');
else
return
IRB_HOST .'?'. trim($href, '&');


стали
 if(IRB_REWRITE == 'on')
return $host . trim($href, '/');
else
return
$host .'?'. trim($href, '&');


И добавилась переменная
$host = IRB_HOST;  


Думаю что это надо как то обыграть чтобы не было просто copy paste .А человек прочитал и подумал что добавилось и куда и зачем
А то вычислять гораздо сложнее.

Да я понимаю что разжёвывать всё не очень хорошо но всё же это ядро (с ним потом работать) и у нас курс обучения. Ведь не ребус найди 10 отличий wink.gif . Да кому надо прочитает по диагонали а остальные будут всё читать.


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

2.
Кстати а почему Ф-я function stripslashesDeep($data)
находится у нас в variables.php а не libs/default.php

Вроде ведь все функции у нас в default.php а тут одна в файл переменных залезла.

3. ошибочка
/** 
* Подключаем контроллер
* Includes the controller
*/

include IRB_ROOT .'admin/meta/controller.php';


должнобыть

/** 
* Подключаем контроллер
* Includes the controller
*/

include IRB_ROOT .'admin/meta/read_controller.php';


С уважением Ohxxx

Спустя 1 час, 22 минуты, 59 секунд (28.04.2010 - 20:16) ohxxx написал(а):
Цитата (twin @ 28.04.2010 - 14:06)
Нет, это совсем не тоже самое. Дело в том, что слишком большая вложенность тоже ничего хорошего не имеет....

А вот отсюда если можно по подробней. В чём собственно проблема слишком большой вложенности это аппаратная или просто считается плохим тоном в программировании.

Спустя 47 минут, 1 секунда (28.04.2010 - 21:03) twin написал(а):
Ага, понял. Посмотрю.

Цитата
А вот отсюда если можно по подробней. В чём собственно проблема слишком большой вложенности это аппаратная или просто считается плохим тоном в программировании.

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

Спустя 20 дней, 1 час, 22 минуты, 57 секунд (18.05.2010 - 22:26) Igrok написал(а):
Здравствуйте, twin!
По тексту урока сказано:
Цитата
И так, в корне создаем папку admin, а в ней повторяем структуру: главный индекс и модули. И добавим еще один - для установки мета-данных. Остальные контроллеры пока пустые.

Т.е. папки admin\main и admin\second оставил пустыми.
В результате в конце получил 2 Ворнинга:
Цитата
Warning: include(Z:/home/my-site.ru/www/admin/main/router.php) [function.include]: failed to open stream: No such file or directory in Z:\home\my-site.ru\www\admin\index.php on line 79


Цитата
Warning: include() [function.include]: Failed opening 'Z:/home/my-site.ru/www/admin/main/router.php' for inclusion (include_path='.;/usr/local/php5/PEAR') in Z:\home\my-site.ru\www\admin\index.php on line 79


Скачал архив www6.zip из которого стало ясно заполнение папок admin\main и admin\second.
Просто по тексту урока не совсем понятно заполнение обозначенных папок.
Хотя, может быть я что-то не так понял.

И в файле admin\meta\router.php написано:
Цитата
/**
* Подключаем контроллер
* Includes the controller
*/
    include IRB_ROOT .'admin/meta/controller.php';

вместо:
Цитата
/**
* Подключаем контроллер
* Includes the controller
*/
    include IRB_ROOT .'admin/meta/read_controller.php';

А так, все очень грамотно и хорошо написано.
Спасибо!

Спустя 10 дней, 23 часа, 45 минут, 8 секунд (29.05.2010 - 22:11) copchic написал(а):
Дебаггинг или поиск и устранение ошибок
Цитата
Не стоит пока пытаться понять как она устроена. Это просто инструмент, облечающий поиск логических ошибок. Пользоваться ей просто. Нужно положить её в рядом со скриптом и подключить в самом начале, первой строчкой после заголовков.
Вернее второй, первой нужно определить константу, которая будет включать и отключать трассировку.
Если кто то не знает, что такое "подключить первой строчкой", смотрим здесь.

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

Какие три буквы нужно прописывать и где об этом поподробнее почитать?

Спустя 2 часа, 36 минут, 15 секунд (30.05.2010 - 00:48) twin написал(а):
dbg()


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

Спустя 6 дней, 11 часов, 1 минута, 43 секунды (6.06.2010 - 11:49) copchic написал(а):
Спасибо!

Спустя 1 месяц, 6 дней, 43 минуты, 16 секунд (12.07.2010 - 12:33) X L написал(а):
Привет мудрые программисты.
Пара глупых вопросов:
Первый - с какой кодировкой сохранять index.html
Второй - почему не работает index.php с такой строкой:
include 'index.tpl'; пишет , что

Warning: include(index.tpl) [function.include]: failed to open stream: No such file or directory in Z:\home\...\www\index.php on line 11

Warning: include() [function.include]: Failed opening 'index.tpl' for inclusion (include_path='.;/usr/local/php5/PEAR') in Z:\home\...\www\index.php on line 11

а с такой работает include 'index.html'; это мне значит надо index.html -
сохранять как index.tpl пока сайт ещё не готов полностью ??? blink.gif

Спустя 35 минут, 30 секунд (12.07.2010 - 13:08) twin написал(а):
Цитата
Первый - с какой кодировкой сохранять index.html

Все файлы должны быть UTF-8
Цитата
это мне значит надо index.html -
сохранять как index.tpl пока сайт ещё не готов полностью ???

Да.

Спустя 25 минут, 4 секунды (12.07.2010 - 13:33) X L написал(а):
При-много благодарен biggrin.gif

Спустя 3 часа, 14 минут, 15 секунд (12.07.2010 - 16:47) X L написал(а):
И снова я задаюсь ужасным количеством вопросов в которых без Вашей квалифицированной помощи - как лапоть blink.gif

So, вышло так что при организации структуры сайта на 4-м шаге шестого урока
мне на монитор вышли вот такие загадочные строки:

Notice: Undefined variable: page in Z:\home\...\www\index.php on line 23

[Денвер: показать возможную причину ошибки]
Это предупреждение, вероятнее всего, возникает вследствие высокого уровня контроля ошибок в PHP, по умолчанию установленного в Денвере (E_ALL). Такой режим вывода ошибок является рекомендуемым и сильно помогает при отладке скриптов. Однако множество готовых скриптов требуют более низкого уровня ошибок.
Вы можете установить более слабый контроль ошибок одним из следующих способов:
Впишите в скрипты строчку:
Error_Reporting(E_ALL & ~E_NOTICE);
Этот способ особенно удобен, если в скрипте есть один файл (конфигурационный), который подключается всеми остальными.
Рекомендуемый способ. Создайте в директории со скриптом файл .htaccess следующего содержания:
php_value error_reporting 7
Исправьте в /usr/local/php/php.ini значение error_reporting на E_ALL &
~E_NOTICE. Этот способ не является рекомендуемым и может привести к серьезным неудобствам при отладке!


Notice: Undefined variable: page in Z:\home\...\www\index.php on line 31

Ооо! доблестные созидатели Интернет ресурсов - Как ? мне это исправить
подскажите, пожалуйста.

А вот и та страница с кодом

<?php
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

ob_start();

/**
* Подключаем меню
* Includes the menu
*/

include './skins/tpl/menu.tpl';

/**
* The switch of modules
* Переключатель страниц
*/

switch($page)
{
/**
* Подключаем модуль приветствия
* Includes the greeting module
*/

case 'main':
include './modules/main/index.php';
include './skins/tpl/main/show.tpl';
break;
/**
* Подключаем модуль второй страницы
* Includes the module of the second page
*/

case 'second':
include './modules/second/index.php';
include './skins/tpl/second/show.tpl';
break;
/**
* Подключаем модуль приветствия по умолчанию
* Includes the greeting module
*/

default:
include './modules/main/index.php';
include './skins/tpl/main/show.tpl';
break;
}

$content = ob_get_contents();
ob_end_clean();
/**
* Подключаем главный шаблон
* Includes the basic template
*/

include './skins/tpl/index.tpl';
?>

Спустя 39 минут, 13 секунд (12.07.2010 - 17:27) twin написал(а):
Это моё упущение. Исправил.

Спустя 11 часов, 50 минут, 26 секунд (13.07.2010 - 05:17) X L написал(а):
А теперь - так:

Datalife Engine not installed. Please run install.php

ЧТО же делать ??????!!! laugh.gif Эт чё мне теперь Denwer - переустанавливать wacko.gif ?

Спустя 2 часа, 56 минут, 49 секунд (13.07.2010 - 08:14) twin написал(а):
Похоже на то. И ставь сразу полный пакет, там есть на официальном сайте.

Спустя 44 минуты, 5 секунд (13.07.2010 - 08:58) X L написал(а):
Сегодня 14 июля 2010 года
Главная страница
Вторая страница
Привет, Вася!


TRACE № 1.
File: Z:\home\...ru\www\modules\main\view.php
Function: include
Line: 9

$page =
string 'main' (length=4)

А это что?

Спустя 17 дней, 15 часов, 26 минут, 56 секунд (31.07.2010 - 00:25) uhans написал(а):
НЕ критично конечно, но для утоления любопытства. Это ОЧЕПЯТКА или специально так?

Спустя 8 минут, 36 секунд (31.07.2010 - 00:34) uhans написал(а):
Цитата (X L @ 13.07.2010 - 04:58)
TRACE № 1.
File: Z:\home\...ru\www\modules\main\view.php
Function: include
Line: 9

$page =
string 'main' (length=4)

А это что?

Это включенный трасировщик. Показывает что в файле Z:\home\...ru\www\modules\main\view.php, в строке 9 переменная $ page имеет значение main длинной в 4 символа. biggrin.gif

Спустя 4 минуты, 59 секунд (31.07.2010 - 00:39) twin написал(а):
Очепятка конэшно))) Сеньк.

Спустя 32 минуты, 13 секунд (31.07.2010 - 01:11) uhans написал(а):
Будь ласка! И это не только в этом месте, практически везде где есть комментарий. biggrin.gif

Спустя 15 дней, 8 часов, 42 минуты, 44 секунды (16.08.2010 - 09:53) keo написал(а):
Доброе время суток всем!

Возник вопрос после урока 6 "Обработка POST данных".
Функция href() (генерация линка) возвращает вторую часть линка в виде "/read/0/0" независимо от аргумента. Т.е. всегда возвращается линк вида: http://myhost/read/0/0 (или http://myhost/admin/read/0/0).

Я на форуме не увидел, чтобы кто либо сталкивался с подобными проблемами, поэтому подозреваю косяки в настройках PHP/Apache.

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

Apache: 2.0 Handler
PHP: 5.2.6
MySQL: 5.0.51a

Спустя 6 часов, 38 минут, 12 секунд (16.08.2010 - 16:32) safiullin.at написал(а):
В разделе Ядро (Light) В 6 уроке (Паттерн MVC. Вид.)
Цитата

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

Напомню:
<input name="value1" type="text" value="<?php echo $POST['value1'] ?>"/>


После прохождения данного урока возврат так и не стал работать smile.gif
Итог все тот же, как и после 5 урока...

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

А когда оба поля заполнены, возврат не работает, это скорее всего потому что там сброс параметров идет!

Спустя 8 минут, 22 секунды (16.08.2010 - 16:40) safiullin.at написал(а):
И зачастую, код который написан на странице, не соответствует коду, который можно скачать в архиве, в конце каждого урока.

Вот например после прохождения 6 урока Паттерн MVC. Вид. в разделе Ядро (Light)

скрипт выдает ошибку...
Fatal error: Call to undefined function htmlChars() in Z:...\www\modules\second\read_controller.php on line 73

Спустя 39 минут, 7 секунд (16.08.2010 - 17:19) Evilsoul написал(а):
А ты бы в свою очередь, поучился бы разбирать то, что тебе пишет "Скрипт".

Пытаемся вызвать не известную функцию.

Посмотри в главном индексе или подключён файл с этой функцией, посмотри или или у тебя вообще существует эта функция и наконец можешь написать так: htmlspecialchars();

Спустя 2 минуты, 17 секунд (16.08.2010 - 17:21) keo написал(а):
Да у меня и тот код который на странице и загруженный готовый, ведет себя одинаково - после URL-а вместо GET параметров присоединяет /read/0/0.
Речь идет про раздел Ядро, а не Ядра Light..

В принципе я переписал функцию href() чтобы она возвращала нормальную GET строку (уполовинил код).. Но у меня получилась не задействованной константа IRB_REWRITE, а мне хотелось бы разобраться, какую общую логику преследовали авторы..

Спустя 16 минут, 36 секунд (16.08.2010 - 17:38) safiullin.at написал(а):
Цитата (Evilsoul @ 16.08.2010 - 13:19)
А ты бы в свою очередь, поучился бы разбирать то, что тебе пишет "Скрипт".

Пытаемся вызвать не известную функцию.

Посмотри в главном индексе или подключён файл с этой функцией, посмотри или или у тебя вообще существует эта функция и наконец можешь написать так: htmlspecialchars();

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

Спустя 24 минуты, 18 секунд (16.08.2010 - 18:02) Evilsoul написал(а):
Не парся, там не большая разница smile.gif user posted image

Спустя 30 минут, 27 секунд (16.08.2010 - 18:33) twin написал(а):
keo
Цитата
Функция href() (генерация линка) возвращает вторую часть линка в виде "/read/0/0" независимо от аргумента.
Странно... Не должно так быть. И настройки тут непричем. Где то что то сбилось просто. Можно попробовать запустить функцию отдельно и попытаться отдебажить. Посмотреть где и что происходит. Передаются ли аргументы в частности.

safiullin.at
Цитата
После прохождения данного урока возврат так и не стал работать

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

Цитата
Вот например после прохождения 6 урока Паттерн MVC. Вид. в разделе Ядро (Light)

скрипт выдает ошибку...
Скорее всего ты пропустил функцию htmlChars(), которая описывается в этом же шаге.

keo
Цитата
Но у меня получилась не задействованной константа IRB_REWRITE, а мне хотелось бы разобраться, какую общую логику преследовали авторы..
Логика простая - можно изменив значение этой константы, изменить вид всех ссылок приложения. И использовать либо ЧПУ, либо простые GET параметры.


Спустя 9 минут, 31 секунда (16.08.2010 - 18:42) safiullin.at написал(а):
Цитата (twin @ 16.08.2010 - 14:33)
Ну для того и возврат, чтобы не переписывать все заново в случае ошибки. А если все нормально - форму нужно очистить.


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

возврат в случае ошибки и до этого (6) урока работал smile.gif

Спустя 9 минут, 42 секунды (16.08.2010 - 18:52) twin написал(а):
Да, работал. А теперь просто изменился принцип обработки данных, возвращаемых в форму.

Спустя 37 минут, 12 секунд (16.08.2010 - 19:29) safiullin.at написал(а):
Нашел еще 2 отличия, в 6 шаге, раздела - ядро (лайт).

Первое
Константа определяющая выводимое число записей, в архиве называется по другому.

В коде, взятом из архива она называется NUM_POST
А в коде который на самом сайте IRB_NUM_POST

Второе отличие уже более существенно можно сказать ошибка. В этом же шаге.
Цитата

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


На сайте написан код верно.
/**   
* The block of reading of the information
* Блок чтения информации
*/

$posts = getData('./data/'. $GET['num']);
include './libs/bb_tags.php';

$rows = '';

foreach($posts as $id => $post)
{
$post = htmlChars($post);
$post['mess'] = nl2br(bbTags($post['mess']));
$rows .= parseTpl('./skins/tpl/second/rows.tpl', $post);
}



А в архиве никаких изменений после данного шага нету. Там по прежнему фигурируют html тэги.

/**  
* The block of reading of the information
* Блок чтения информации
*/

$posts = getData('./data/'. $GET['num']);
include './libs/bb_tags.php';

$rows = '';

foreach($posts as $id => $post)
{
$date = $post['date'];
$name = htmlspecialchars($post['name']);
$mess = nl2br(bbTags(htmlspecialchars($post['mess'])));
$rows .= '<div class="guest_post">'. $date .' / <strong>
'
. $name .'</strong><hr width="30%" align="left" />
'
. $mess .'</div>';

}

Спустя 12 дней, 17 часов, 42 минуты, 59 секунд (29.08.2010 - 13:12) Omega написал(а):
Можно вопросик? А почему в главном индексе админки ob_start() стоит в начале файла, а не непосредственно перед switch? Может я что-то пропустил?

Спустя 42 минуты, 13 секунд (29.08.2010 - 13:54) twin написал(а):
Да нет особой разницы.

Спустя 7 дней, 4 часа, 26 минут, 37 секунд (6.09.2010 - 18:21) ShamanV написал(а):
Здравствуйте. У меня вопрос по оптимизации кода. Есть такой фрагментик в файле .\modules\second\read_controller.php:

if(count($posts)) 
{
$keys = array_keys($posts);
$id = max($keys) + 1;
$num = count($posts);
}


здесь count($posts) выполняется 2 раза. Можно ли тут написать так:

if($num = count($posts)) 
{
$keys = array_keys($posts);
$id = max($keys) + 1;
}

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

Спустя 14 минут, 9 секунд (6.09.2010 - 18:35) twin написал(а):
Можно. Вообще можно писать по разному, тот кто хорошо владеет синтаксисом, может написать очень коротко и вроде оптимально. Меня самого часто тянет на такие выкрутасы:

     return ($i & 1) ? ++$i : !empty($s) ? $s : 0;  

Но нужно думать и о читабельности.
Выигрышь тут минимальный, а путаницу внесет приличную. Очень неуютно с присвоением (одним знаком равенства) в условии if. Кажется, что ошибка.

Тогда как то так:
$num = count($posts);
if($num)
{
$keys = array_keys($posts);
$id = max($keys) + 1;
}

Спустя 5 часов, 5 минут, 25 секунд (6.09.2010 - 23:41) Слава написал(а):
function href()   
{
global $GET;
$tmp = $GET;
$href = '';
$host = IRB_HOST;

$arg = func_get_args();

if(is_array($arg[0]))
$arg = $arg[0];
// Добавим префикс, если функция вызвана из админки
if(defined('IRB_ADMIN'))
$host .= 'admin/';

if($arg[0] == 'host')
return IRB_HOST . $href;


При вызове функция принимает параметры href(), а дальше в самой функции прописано
$href = '';
, это очистка записи наверно??? Не вкурю...

Дальше, допустим если href("main=1", "read=11") то выходит $arg принимает значение: $arg[main] = 1, $arg[read] = 11; Я правильно понимаю???

Если да, то откуда взяться массиву $arg[0]

Ну а это меня вообще на лопатки положило:
 if($arg[0] == 'host')   
return IRB_HOST . $href;

Если можно поясните мои глупые вопросы

Спустя 6 минут, 51 секунда (6.09.2010 - 23:47) twin написал(а):
Цитата
При вызове функция принимает параметры href(), а дальше в самой функции прописано
$href = '';
в первом случае это функция, во втором - переменная. Ей просто задается начальное условие. Ибо конкатенацию нельзя делать с ничем. С пустой переменной можно.
А вообще это слишком сложно сейчас тебе понять наверно. Оставь на потом, когда получше освоишься, поймешь.

Спустя 37 минут, 11 секунд (7.09.2010 - 00:25) Слава написал(а):
Вроде начинаю понимать. Только не пойму откуда возмется массив $arg[0]:
if(is_array($arg[0]))  
$arg = $arg[0];

Спустя 8 часов, 3 минуты, 48 секунд (7.09.2010 - 08:28) twin написал(а):
Сделай так:
$arg = func_get_args();
dbg($arg);
только функцию вызови не в ссылке, а просто отдельно. Там все увидишь. И почитай про func_get_args()


Спустя 4 часа, 27 минут, 58 секунд (7.09.2010 - 12:56) ShamanV написал(а):
Цитата (twin @ 6.09.2010 - 14:35)
Но нужно думать и о читабельности.
Выигрышь тут минимальный, а путаницу внесет приличную. Очень неуютно с присвоением (одним знаком равенства) в условии if. Кажется, что ошибка.

Согласен, спасибо.

Мне тут подумалось, вот есть такая табличка со структурой:

user posted image

Хорошая штука, полезная. Но вот если бы ее улучшить всплывающими подсказками, было бы вообще здорово. Навел курсор на файл - получил сведения: какие у него задачи, какими файлами подключается, какие файлы подключает. Папки тоже подписать.
После того, как я исследовал облегченную версию "Ядра", в голове была каша. Пришлось проследить все связи, начиная с index.php, чтобы врубиться в логику построения. Мне кажется, подобная табличка с подсказками о связях и функциях была бы хорошим помощником в освоении структурной логики. И отличной подсказкой для тех, кто это уже прошел, но хочет свериться с эталоном.

Спустя 2 часа, 37 минут, 44 секунды (7.09.2010 - 15:34) twin написал(а):
Спасибо) Отличная идея.

Спустя 1 час, 53 минуты, 38 секунд (7.09.2010 - 17:28) ShamanV написал(а):
Здесь:
"empty - проверяет переменную на пустоту. Возвращает FALSE, если переменная пустая (или имеет нулевое значение) или не определена. В противном случае возвращает TRUE"
хотя, вроде должно быть наоборот wink.gif

Спустя 42 минуты, 1 секунда (7.09.2010 - 18:10) twin написал(а):
точно))) столько висит уже и никто не заметил

Спустя 1 день, 3 часа, 20 минут, 11 секунд (8.09.2010 - 21:30) Слава написал(а):
Анука глянте, разобрался ли я с функцией href():

Допустим в меню прописанно так,
href('page=main', 'rem=one');
href('page=main', 'rem=two');
href('page=second', 'rem=one');

Значит у нас есть такой массив:
$arg = func_get_args();

$arg => [0] [0] = 'page=main';
[
1] = 'rem=one';
[
1] [0] = 'page=main';
[
1] = 'rem=two';
[
2] [0] = 'page=second';
[
1] = 'rem=one';

дальше это,
 if(is_array($arg[0]))
$arg = $arg[0];

[php]$arg => [0]  = 'page=main';
[
1] = 'page=main';
[
2] = 'page=second';

дальше это,
if($arg[0] == 'host') 
return IRB_HOST . $href;

пока что не пойму зачем???...

Спустя 2 часа, 7 минут, 42 секунды (8.09.2010 - 23:38) twin написал(а):
Начал правильно. Потом немного недотянул.
 if(is_array($arg[0]))
$arg = $arg[0];
в обратную сторону работает.
Если в функцию передали массив

echo href(array('page=main', 'rem=one'));

то разбираться будет он, а не массив из func_get_args()
Это нужно для функции редиректа. Ты еще не дошел до неё.

Цитата
пока что не пойму зачем???...

Да это так, пригодится. Ссылку без параметров сделать.
Вот так:
echo href('host');


Спустя 28 минут, 41 секунда (9.09.2010 - 00:06) Слава написал(а):
То есть с помощью функции func_get_args() мы просто собираем в массив все ссылки. А дальше с помощью конструкции if...else выбираем из этого массива элементы отправленные в саму функцию формирования ссылок... ну и дальше формируем ссылки, выходит что так?

Спустя 23 минуты, 37 секунд (9.09.2010 - 00:30) twin написал(а):
Ну в общих чертах.

Спустя 1 день, 17 часов, 51 минута, 42 секунды (10.09.2010 - 18:22) ShamanV написал(а):
Приветствую!

Четко следовал инструкциям и все же пролезли ошибки. Поковырялся, и вот:

/**   
* The switch of modules
* Переключатель страниц
*/

switch($GET['page'])
{
case 'main':
include IRB_ROOT .'admin/main/router.php';
break;

case 'second':
include IRB_ROOT .'admin/second/router.php';
break;

case 'meta':
include IRB_ROOT .'admin/meta/router.php';
break;

default:
include IRB_ROOT .'admin/main/router.php';
break;
}

$content = ob_get_contents();
ob_end_clean();


по дефолту подключается страница admin/main/router.php, которой мы вроде как не создавали (просмотрел урок и не нашел). Может, нужно admin/meta/router.php по дефолту включать?
ЗЫ: но и это не помогает, у нас ведь $GET['page'] по дефолту содержит значение 'main'...

Второй момент:

Цитата
И контроллер. В нем включим дебаггер, чтоб не простаивал и для наглядности:
admin/meta/read_controller.php

а в 25-й строке файла admin/meta/router.php подключаем файл с другим названием:
include IRB_ROOT .'admin/meta/controller.php'; 

Спустя 14 часов, 11 минут, 14 секунд (11.09.2010 - 08:33) twin написал(а):
Спасибо. Посмотрю, в чем там косяк...
Вот побольше бы таких вопросов, глядишь и получилось бы чего-нить путнее.))

Спустя 8 дней, 14 часов, 24 минуты, 48 секунд (19.09.2010 - 22:58) Guest_Zakhar написал(а):
Ядро. Легкая версия.
Шаг 6.


Тут отсутствует функция htmlspecialchats(). Это все неспроста.

Дело в том, что данные у нас хранятся не в разрозненных переменных, а в массиве $POST (не путать с $_POST). А раз они в массиве, то и обработать их можно одним махом. Для этого сочиним специальную функцию-обертку, которая заставит htmlspecialchats() работать с массивами.



Спустя 9 часов, 18 минут, 33 секунды (20.09.2010 - 08:16) twin написал(а):
Благодарю smile.gif

Спустя 1 день, 2 часа, 13 минут, 51 секунда (21.09.2010 - 10:30) Гость_Алексей написал(а):
Шаг 6
Обработка POST данных.
1)
Цитата
2.  Его же вид: admin/meta/viev.php


По моему ошибочка в имени файла.

2)
Цитата
admin/meta/router.php
/** 
* Подключаем контроллер
* Includes the controller
*/
    include IRB_ROOT .'admin/meta/controller.php';


Может read_controller.php ?

3) Так и не понял почему вот так:

if(!empty($_POST['form']))   
$POST = array_merge($_POST['form'], array_diff_key($POST, $_POST['form']));


а не:
 if(!empty($_POST['form']))   
$POST = array_merge($POST, $_POST['form']);


Результат один и тот же.

Спустя 16 минут, 15 секунд (21.09.2010 - 10:46) twin написал(а):
Действительно, перемудрили чего то...

Спустя 1 месяц, 2 дня, 1 час, 29 минут, 51 секунда (23.10.2010 - 12:16) kovaldm написал(а):
Вот тут (Обработка POST данных).
В измененной функции href() появилась конструкция

if(is_array($arg[0]))
$arg = $arg[0];

Зачем это?
Мы в функцию передаем аргументы в виде строк, как $arg[0] может быть массивом? И если $arg[0] все-таки массив, то остальные аргументы останутся "без внимания".

Спустя 32 минуты, 19 секунд (23.10.2010 - 12:48) twin написал(а):
Тебе нужно почитать про функцию func_get_args()

Спустя 2 часа, 21 минута, 55 секунд (23.10.2010 - 15:10) kovaldm написал(а):
func_get_args -- Возвращает массив аргументов функции
Если мы передаем функции параметры в таком виде href('page=main', 'rem=read'),
то
$arg[0] => 'page=main'
$arg[1] => 'rem=read';
Зачем что-то проверять, если мы сами не передаем функции массив.

Спустя 5 часов, 23 минуты, 57 секунд (23.10.2010 - 20:34) twin написал(а):
закономерно. значит выкини это все взарвется поди.
Если все это лишнее - обоснуй. Ведь из этого и складывается курс smile.gif

Спустя 47 минут, 41 секунда (23.10.2010 - 21:22) kovaldm написал(а):
Я не утверждаю, что там что-то лишнее. Но, так как я не ясновидящий (к сожалению), то не видел что данная конструкция понадобится в будущем. Теперь разобрался.

Спустя 3 часа, 29 минут, 28 секунд (24.10.2010 - 00:52) Guest написал(а):
Я убрал эту конструкцию, пока что все работает нормально. КовальДМ если тебе стало ясно зачем эта конструкция то раскажи и мне. Я что то не понимаю...

Спустя 37 минут, 20 секунд (24.10.2010 - 01:29) kovaldm написал(а):
Цитата (Guest @ 24.10.2010 - 00:52)
Я убрал эту конструкцию, пока что все работает нормально. КовальДМ если тебе стало ясно зачем эта конструкция то раскажи и мне. Я что то не понимаю...

Откроешь "Интерактив" поймешь.

Спустя 1 день, 19 часов, 29 минут, 35 секунд (25.10.2010 - 20:58) Guest написал(а):
Цитата (kovaldm @ 23.10.2010 - 21:29)
Откроешь "Интерактив" поймешь.

Для редиректа что ли она нужна???

Спустя 55 минут, 3 секунды (25.10.2010 - 21:53) kovaldm написал(а):
Да.

Спустя 1 день, 22 часа, 48 минут, 58 секунд (27.10.2010 - 20:42) Гость_Noob написал(а):
Так как POST данные обрабатываются в одном месте, может ли произойти такая ситуация:

Два пользователя одновременно отправили сообщение(одни комментарий, а второй обратную связь), может произойти конфликт имен?

Ведь получается в обработку придет два массива $form.

Или сервер как-то делает очередь? blink.gif

Спустя 2 минуты, 4 секунды (27.10.2010 - 20:45) twin написал(а):
Конечно очередь. На каждого юзера свой процесс со своими переменными и прочим.

Спустя 35 минут, 5 секунд (27.10.2010 - 21:20) AlmazDelDiablo написал(а):
Ну по идее ПХП исполняется для каждого юзера отдельно.

(сори, не заметил ответа Твина).

Спустя 2 дня, 6 часов, 9 минут, 49 секунд (30.10.2010 - 03:29) myconstitution написал(а):
Вопрос касается админки, редактирование мета данных для шаблонов модуля.
Не понимаю, как обращаться к шаблонам модуля(вложенным страницам page=main&rem=about)
т.е. страница "о нас" является подстраницей "галавная страница"

Возьмем модуль:

/**
* Function of generation of a menu of modules
* Функция генерации меню модулей
*/

function getMenu()
{
// Получаем массив названий модулей
global $CONFIG_SETTING;

// Форимируем меню ввиде списка
$menu = "<ul class=\"pages_menu\">\n";

// Разбираем предустановленный массив
foreach($CONFIG_SETTING as $link => $name)
$menu .= '<li>
<a href="'
. href('rem='. $link) .'" >'. $name ."</a>
</li>
\n";

return $menu . "</ul>\n";
}


- не совсем ясна ситуации с разбиранием предустановленного массива

в $CONFIG_SETTING
main => 'главная страница'

а что если есть страница index.php?page=main&rem=about.
В $CONFIG_SETTING эта страница тоже явл-ся главной, но она называется' о нас'.

    
$CONFIG_SETTING = array(
'main' => 'Главная страница',
'about' => 'о нас',
'second' => 'Вторая страница' ,
);


Есть сделать так, тогда она становится вроде как отдельным модулем, что не так.
Как её правильно записать в $CONFIG_SETTING?

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

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

Спустя 1 час, 6 минут, 43 секунды (30.10.2010 - 04:36) twin написал(а):
Если чесно - понятия не имею...
Тут было показаено как делать подстраницы. Если нужно для каждой подстраницы свои метаданные, знать такая схема не годится. Нужно делать свою.
Как - я показал. Как именно... Ну всех вариантов предусмотреть нельзя.
Думайте)

Спустя 29 дней, 7 часов, 23 минуты, 27 секунд (29.11.2010 - 13:00) sixpoundeeer написал(а):
Вот тут не указано, что в файлах папок admin/main и admin/second нужно изменить пути на родные. Ведь не все качают готовое smile.gif

Спустя 11 дней, 6 часов, 54 минуты, 8 секунд (10.12.2010 - 19:54) T1mer написал(а):
Похоже на опечатку в комментарии:

<!-- skins/tpl/second/rows.html begin -->

<div class="guest_post">
<?php
echo $date; ?> / <strong><?php echo $name; ?></strong>
<hr
width="30%" align="left" />
<?php
echo $mess; ?>
</div>


<!-- skins/tpl/second/rows.tpl end -->


Разное расширение
вот тут.

Спустя 1 месяц, 28 дней, 22 часа, 14 минут, 52 секунды (9.02.2011 - 18:09) kent666 написал(а):
Объясниет для чего в суперглобальный массив пост вписано значение "form"

if(!empty($_POST['form']))   
$POST = array_merge($POST, $_POST['form']);


если у нас в форме есть только значение типа value 1 и т.д.
А для определения пустой массив $_POST у нас есть кнопка ок
/** 
* Buttons
* Кнопки
*/

$ok = !empty($_POST['ok']) ? true : false;


Или это какое-то специальное значение?
Может есть какое то описание

Спустя 17 минут, 15 секунд (9.02.2011 - 18:26) twin написал(а):
Нет, не специальное. Прсто удобно данные, получаемые из форм, иметь в отдельном массиве. Проще инициализировать и обрабатывать.

Спустя 34 минуты, 14 секунд (9.02.2011 - 19:00) kent666 написал(а):
Ну то что удобнее работать с массивом это понятно.
Просто не подумает сервер что если в массиве $_POST есть данные с ключом 'form' и они не пустые то заполнить ими массив $POST

if(!empty($_POST['form']))   
$POST = array_merge($POST, $_POST['form']);

Спустя 12 минут, 10 секунд (9.02.2011 - 19:12) twin написал(а):
Не понял... Сервер не может думать. Какие ему данные дашь, те и обработает.

Спустя 8 минут, 31 секунда (9.02.2011 - 19:21) kent666 написал(а):
Просто как я понимаю в квадратных скобках после названия массива идет наименование ключа. В данном случае это 'form'

$_POST['form']


Будет ли корректна данная операция

if(!empty($_POST['form']))   
$POST = array_merge($POST, $_POST['form']);


можно ли написать так

if(!empty($_POST))   
$POST = array_merge($POST, $_POST);

Спустя 2 минуты, 42 секунды (9.02.2011 - 19:23) twin написал(а):
Правильно, как у меня. Это не просто наименование ключа. Это двухмерный массив.
Если сделать так

print_r($_POST['form']);
то можно его увидеть.

Спустя 13 минут, 4 секунды (9.02.2011 - 19:37) kent666 написал(а):
Все разобрался. Просто не заметил что в форме идет наименование переменных как массив form[value1]

<input name="form[value1]" type="text" size="70" value="<?php echo $POST['value1']; ?>" />


Спасибо :)

Спустя 1 месяц, 13 дней, 4 часа, 50 минут, 32 секунды (23.03.2011 - 00:27) AmberLEX написал(а):
А можно подробней объяснить почему в БД для даты используется тип данных timestamp, а не datetime? В каких случаях какой тип лучше использовать и какие нюансы.

Спустя 1 час, 13 минут, 10 секунд (23.03.2011 - 01:40) sharki написал(а):
AmberLEX
Это удобнее для форматирования даты на выходе, например тебе нужно вывести в таком виде на стороне сервера PHP echo date("Y-d-m",$datestamp);
добавлено 25 числа 2011 года в 3 часа и в 34 минуты


ну и например увеличить время или наоборот отнять намного проще чем с datetime

Хотя и datetime тоже прост только там используются функции на стороне сервера SQL т.е прям в запросе SELECT YAER(date) FROM table и т.п

Спустя 10 часов, 52 минуты, 33 секунды (23.03.2011 - 12:33) twin написал(а):
AmberLEX
timestamp иеняет дату автоматически при каждом изменени строчки. Это удобно именно тогда, когда нужна последняя дата и время изменения. Тогда не нужно писать в запрос что то типа

Цитата
SET `date` = NOW()

Спустя 22 минуты, 13 секунд (23.03.2011 - 12:55) AmberLEX написал(а):
А если нужно ввести руками то в таком формате вводить 2011-03-14 21:15:23?
т.е. с "-", ":" и пробелом?

Спустя 1 час, 1 минута, 54 секунды (23.03.2011 - 13:57) twin написал(а):
Да.

Спустя 22 дня, 10 часов, 11 минут, 7 секунд (15.04.2011 - 23:08) Rendell написал(а):
Что это за файл в архиве basa.sql ?

Спустя 33 минуты, 18 секунд (15.04.2011 - 23:41) mxwuser написал(а):
Rendell
Там таблица MYSQL с прайсом на сапоги и самовар.

Спустя 26 минут, 8 секунд (16.04.2011 - 00:07) Rendell написал(а):
Где этот файл должен помещаться?

Спустя 2 часа, 26 минут, 43 секунды (16.04.2011 - 02:34) twin написал(а):
Ну наверное нужно не просто скачать пример, а еще и почитать описание...

Спустя 13 часов, 52 минуты, 7 секунд (16.04.2011 - 16:26) Guest написал(а):
Rendell
в PMA импортируй его или скопируй дамп туда же, чтобы вручную не забивать.

Спустя 24 дня, 30 минут, 10 секунд (10.05.2011 - 16:56) m4a1fox написал(а):
Господа! У меня вопрос по поводу уроков про ЯДРО от Twin'a. Делема вот в чем. Пункт 6 - передача POST переменных. А точнее в меню. Если перейти по ссылкам Метеданные то идет переброс на главную страницу. Если есть ответ скажите, будьте так любезны. Если необходимо смогу подробнее все рассказать.

Спустя 11 минут, 32 секунды (10.05.2011 - 17:08) m4a1fox написал(а):
Извините. Пока что вопрос выше - снимается. Вроде работает. Но БЛИН! Реально так ЗАПУТАНО! Аж башню сносит НАФИГ!

Спустя 8 дней, 4 часа, 55 секунд (18.05.2011 - 21:09) Vseonet написал(а):
Не совсем понятен следующий момент.
У вас в листинге написано:
// Добавим префикс, если функция вызвана из админки 
if(defined('IRB_ADMIN'))
$host .= 'admin/';

В этом случае выскакивает нотис, мол переменная хост не определена: Undefined variable: host in Z:/home/localhost/www/Irbis/libs/default.php on line 39
В архиве к этому уроку:
if(defined('IRB_ADMIN'))
$host = IRB_HOST .'admin/';
else
$host = IRB_HOST;

В таком случае скрипт работает, но к ссылкам из админки не подставляется /admin, т.е. как я понимаю константа IRB_ADMIN не существует. Вопрос, а где мы ее определяли? Что то я пропустил...

Спустя 38 минут, 49 секунд (18.05.2011 - 21:48) twin написал(а):
В админке есть индекс. Вот в нем и надо.
/**
* The administrator-panel identifier
* Идентификатор админ-панели
*/

define('IRB_ADMIN', true);

Спустя 9 часов, 19 минут, 16 секунд (19.05.2011 - 07:07) Vseonet написал(а):
Константа установлена была.
Ошибку свою таки нашел.
Когда в уроке показывался листинг функции формирования GET параметров, то я его не копировал, а только лишь добавил эти строки к старой версии
if(is_array($arg[0]))  
$arg = $arg[0];
// Добавим префикс, если функция вызвана из админки
if(defined('IRB_ADMIN'))
$host = IRB_HOST .'admin/';
else
$host = IRB_HOST;

Оказалось. что это не все что нужно добавить.
Еще по сравнению с предыдущей версией в этих строках
if(IRB_REWRITE == 'on') 
return $host . trim($href, '/');
else
return $host .'?'. trim($href, '&');

константа IRB_HOST поменялась на переменную $host

Отразите это как нибудь в уроке, а то по тексту создается ощущение, что поменялся только префикс: Теперь функция, вызванная из админки, поставит всем ссылкам префикс /admin Мб стоит поставить не один комментарий, а 2?

Спустя 10 дней, 12 часов, 51 минута, 7 секунд (29.05.2011 - 19:58) Pirat_BillY написал(а):
    function stripslashesDeep($data)     
{
if(is_array($data))
$data = array_map("stripslashesDeep", $data);
else
$data = stripslashes($data);
return $data;
}

if(get_magic_quotes_gpc())
{
$_GET = stripslashesDeep($_GET);
$_POST = stripslashesDeep($_POST);
$_COOKIE = stripslashesDeep($_COOKIE);
$_REQUEST = stripslashesDeep($_REQUEST);
}

Можете растолковать смысл этого дела? И что будет в переменной $data в том или в ином случае? Только не нужно отвечать односложной фразой - убить магические кавычки, а лучше в каком конкретном случае дата может оказаться не массивом. Спасибо.

Спустя 10 месяцев, 11 дней, 2 часа, 38 минут, 25 секунд (10.04.2012 - 22:36) GhostSt написал(а):
У меня возникла проблема:
В 6 шаге , мы добавили раздел /admin изменили .htaccess и функцию href(), соответственно когда я перехожу на вторую страницу у меня должен быть адрес вида : http://garden.yalta/admin/second , вылезает постоянно :
http://garden.yalta/admin/second/?route=second , то есть вылезает лишнее ?route=second . Но если я зайду на вторую страницу не из админ панели :
http://garden.yalta/second данной проблемы не будет. В чем может заключаться беда?


Спустя 29 дней, 21 час, 35 минут, 40 секунд (10.05.2012 - 20:12) pulsar написал(а):
какая-то путаница возникает


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

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

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.