Эта тема на forum.dklab.ru


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

// Data table name
$table = 'articles';

// Edit schema
$edit_schema = array(
'title' => array(
'name' => 'Название',
'type' => 'TEXT',
'value' => 'htmlspecialchars($title)'
),
'descr' => array(
'name' => 'Описание',
'type' => 'TEXT',
'value' => 'htmlspecialchars($descr)'
),
'author_id' => array(
'name' => 'Автор',
'type' => 'JUMPBOX',
'value' => 'jumpbox(\'authors\', \'name\', $author_id)'
),
'cat_id' => array(
'name' => 'Категория',
'type' => 'JUMPBOX',
'value' => 'jumpbox(\'articles_categories\', \'title\', $cat_id)'
),
'text' => array(
'name' => 'Текст',
'type' => 'TEXTAREA',
'value' => 'htmlspecialchars($text)'
)
);

Так выглядит ф-я jumpbox:

/***************************************************************************
*
* name: jumpbox
*
* action: generates jumpbox
*
* input: $table - data table name
* $option_field - option title field
* $wanted - option to select (can be left empty)
*
* output: jumpbox html code
*
***************************************************************************/

function jumpbox($table, $option_field, $wanted = '')
{
$jb = '<option value=-1>--- Выберите ---</option>' . "\n";

$sql = 'SELECT id,' . $option_field . ' FROM ' . $table;
$result = mysql_query($sql);

while ( $option = mysql_fetch_row($result) )
{
$jb .= '<option value=' . $option[0];
$jb .= ($option[0] == $wanted) ? ' selected' : '';
$jb .= '>' . $option[1] . '</option>' . "\n";
}

return $jb;
}

// Generates authors jumpbox, $wanted is selected
function authors_jumpbox($wanted)
{
return jumpbox('author_id', 'authors', 'id', 'name', $wanted);
}


Собственно о том, как это работает. title, descr - это названия переменных, которые будут подвергаться редактированию. Для каждой из таких переменных имеется массив, для которого:

'name' => 'Название', - текст отображаемый в форме редактирования рядом с полем вводы для кокретной переменной
'type' => 'TEXT', - тип поля ввода - анализируется при генерации шаблона
'value' => 'htmlspecialchars($title)' - правило генерации содержимого поля, представляет собой php-код

Вот что представляет собой скрипт, работающий в соответствии с такой схемой:


// Common variables setup
$schema_elements = count($edit_schema);

// Creating variables for editing
$variables_code = '$variables = array(';
for ($cnt = 0; $cnt < $schema_elements; $cnt++)
{
$variables_code .= '\'\',';
}
$variables_code = substr($variables_code, 0, -1) . ');';
eval($variables_code);

if ($article_exists)
// Editing existing record
{
// Extracting data from the db
$sql = 'SELECT * FROM ' . $table . ' WHERE id = ' . $id;
$result = mysql_query($sql);
$record_data = mysql_fetch_assoc($result);

// Setting new editing variables
reset($edit_schema);
for ($cnt = 0; $cnt < $schema_elements; $cnt++)
{
$name = current($edit_schema);
$variables[$cnt] = $record_data[key($edit_schema)];
next($edit_schema);
}
}

// Data preparation
$data_code = '$article = array(';
foreach ($edit_schema as $name => $field)
{
$data_code .= '\'' . $name . '\' => ' . $field['value'] . ',';
}
$data_code = substr($data_code, 0, -1);
$data_code .= ');';
eval($data_code);

Кто что думает по поводу такой стратегии в общем и по поводу использования eval() в частности? Показал одному знакомому приятелю - говорит юзать eval - дурной тон.

id, article_exists - внешние переменные, первая обозначает ид записи, вторая показывает, новая ли это статья или нет (булева).

Несколько собственных мыслей...
1) ООП юзать не хочу вследствие большой тормознутости
2) Почему такая концепция - имхо так проще... лучше схему накатать, чем 3-4 файла переписывать, добавлять разделы проще.
3) Вроде все...

В общем пишите все что можете и желаете... Надеюсь мой код и подход приступов рвоты ни у кого не вызывают...
Дмитрий Котеров:
В глаза бросаются 2 вещи:
1. eval там вообще ни к чему, то же самое можно (и нужно) сделать и без него. Почитайте про массивы в PHP, хотя бы мою наблу на http://dklab.ru/chicken/
2. Отступов в программе нет вообще, это не дела.
Йорик:
Дмитрий Котеров:
Сам маэстро пожаловал... очень приятно!
Отступы вставил, к сожалению они улетучились при копировании кода...
Наблу я читал, более того - у меня и книга ваша есть и еще несколько книг...
Проблема заключается в следующем: в схеме может быть n полей и во-вторых над значением каждого поля может потребоваться выполнить уникальное действие (у меня таковым является генерация jumpbox-ов), а вот от htmlspecialchars я впринципе могу избавиться. Тем более, действия необходимо выполнять после генерации данных по схеме, а для генерации данных нужна схема :) , так что просто убиранием кавычек от того же jumpbox я не обойдусь... Потому и использую eval. Может подход просто в корне неверный?
Дмитрий Котеров:

// Common variables setup
$schema_elements = count($edit_schema);

// Creating variables for editing
$variables_code = '$variables = array(';
for ($cnt = 0; $cnt < $schema_elements; $cnt++)
{
$variables_code .= '\'\',';
}
$variables_code = substr($variables_code, 0, -1) . ');';
eval($variables_code);

эквивалентно

for ($variables=array(), $i=0; $i<count($edit_schema); $i++) $variables[] = '';

А дальше я, честно говоря, даже и читать не стал.
Йорик:
Дмитрий Котеров:
Это уже кому как нравится, и потом не в этом суть проблемы, хотя ваш кусок кода безусловно выглядит красивее и оптимальнее. Но не это стало для меня основной загвоздкой, основной загвоздкой стало использование eval() в данном коде:

// Data preparation
$data_code = '$article = array(';
foreach ($edit_schema as $name => $field)
{
$data_code .= '\'' . $name . '\' => ' . $field['value'] . ',';
}
$data_code = substr($data_code, 0, -1);
$data_code .= ');';
eval($data_code);

Вот тут его вроде как точно никак не избежать... :(
Anonymous:
$data_code = array();
foreach ($edit_schema as $name => $field) {
$data_code[$name] = $field;
}
не мучайтесь изобретением треугольных колес...
Anonymous:
замените $data_code на $article - и получите то что вам требуется
Дмитрий Котеров:
Точнее, даже так:

$data_code = array();
foreach ($edit_schema as $name => $field) {
$data_code[$name] = $field['value'];
}

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

Эта тема на forum.dklab.ru