This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "quickfw".
The branch, master has been updated
via b4f8c135aa485ee9aaf59a9514b8eafd04ff3e48 (commit)
via c24eaf6eaa50759fdf80ea677f837f12f8c63010 (commit)
via 92f0b2ae8ccb77d0701da3f1f9f3b608fd5aef27 (commit)
via 30a43b067f81887ad53957a6713559f6b6d044e6 (commit)
via 25e4c4979ca9815bc8594882b0b08edd3075ca78 (commit)
via d8e6daceb0f469cd8259fb1a1208f7b52d8eb880 (commit)
via 4aa9bded18576e6974e1f839688d02a51227c36d (commit)
via 60e25d354d1b089d382053d4e6eca22842445075 (commit)
via 46e8cece03258ca756c2942bf9c8ed169b5fd4b2 (commit)
via 6d2685713e4329172fb79f5bfbaf14a454958c70 (commit)
via 9249c6aa2a062279ed5ee7bacf20322a775ca6ab (commit)
via 8eac6a03dc867bc53918df0262aed8d2ad5301ee (commit)
via c43822d8b9dabd38c21a193b6e5d4aa7b25cf980 (commit)
via 80978b34317acf68a717fa595169b15b0e6b73a6 (commit)
via 64b69b3247c13721cc452d039a5e43d7216c5051 (commit)
from d551551f5e9ca0c115506e8ffbf6112cea97ae35 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b4f8c135aa485ee9aaf59a9514b8eafd04ff3e48
Author: Ivan Borzenkov <iva...@li...>
Date: Wed Dec 1 16:22:41 2010 +0300
Обработка из обычного edit в функцию
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 3ac0db1..68d54a2 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -322,46 +322,9 @@ abstract class ScaffoldController extends Controller
if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST['data'][$id])>0)
{
- //Обработка результата редактирования
- $data = $_POST['data'][$id];
- foreach ($data as $k=>$v)
- {
- if (isset($this->methods['validator_'.ucfirst($k)]))
- $res = call_user_func(array($this, 'validator_'.ucfirst($k)), $v, $id);
- else
- $res = $this->fields[$k]->validator($id, $v);
- if ($res !== true)
- $errors[$k] = $res;
- if ($res === false)
- $errors[$k] = 'Поле '.$this->fields[$k]->title.' имеет некорректное значение';
- }
- //Если ошибок нет, то записываем в базу изменения
- if (count($errors))
- $this->messages['error'] = $errors;
- else
+ $res = $this->multiEditPost($_POST['data']);
+ if ($res)
{
- $old = $this->getOldVars($id);
- //Обработка данных после POST
- foreach ($this->fields as $k=>$class)
- if ($k == $this->primaryKey && !isset($data[$k]))
- continue; //не трогаем первичный ключ
- elseif (isset($this->methods['proccess_'.ucfirst($k)]))
- $data[$k] = call_user_func(array($this, 'proccess_'.ucfirst($k)),
- isset($data[$k]) ? $data[$k] : $old[$k], $id, $old[$k]);
- else
- $data[$k] = $class->proccess($id,
- isset($data[$k]) ? $data[$k] : $old[$k], $old[$k]);
-
- if ($id == -1)
- $ins_id = QFW::$db->query('INSERT INTO ?#(?#) VALUES(?a)',
- $this->table, array_keys($data), array_values($data));
- else
- QFW::$db->query('UPDATE ?# SET ?a WHERE ?#=?',
- $this->table, $data, $this->primaryKey, $id);
-
- if (isset($this->methods['postEdit']))
- call_user_func(array($this, 'postEdit'), $id == -1 ? $ins_id : $id);
-
//редирект назад
if (!empty($this->sess['return']))
{
@@ -371,7 +334,6 @@ abstract class ScaffoldController extends Controller
}
else
QFW::$router->redirect(Url::C('index'));
-
}
}
commit c24eaf6eaa50759fdf80ea677f837f12f8c63010
Author: Ivan Borzenkov <iva...@li...>
Date: Wed Dec 1 15:50:00 2010 +0300
Починил зависимую таблицу - POST
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 4663a47..3ac0db1 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -196,6 +196,11 @@ abstract class ScaffoldController extends Controller
//обработка выбора мультиедита и мультидела
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
+ if (isset($_POST['parent']))
+ {
+ $this->sess['parent'] = $_POST['parent'];
+ QFW::$router->redirect(Url::A());
+ }
if (empty($_POST['id']))
QFW::$router->redirect(Url::C('index'));
if (empty($_POST['edit']) && empty($_POST['delete']))
@@ -224,11 +229,6 @@ abstract class ScaffoldController extends Controller
$parent = QFW::$db->selectCol('SELECT ?# AS ARRAY_KEY, ?# FROM ?# ?s',
$this->parentData['key'], $this->parentData['field'],
$this->parentData['table'], $this->parentData['other']);
- if (isset($_POST['parent']))
- {
- $this->sess['parent'] = $_POST['parent'];
- QFW::$router->redirect(Url::A());
- }
if (empty($this->sess['parent']))
$this->sess['parent'] = count($parent) ? key($parent) : 0;
commit 92f0b2ae8ccb77d0701da3f1f9f3b608fd5aef27
Author: Ivan Borzenkov <iva...@li...>
Date: Wed Dec 1 15:26:19 2010 +0300
Мультиедит
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 164e65e..4663a47 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -163,7 +163,7 @@ abstract class ScaffoldController extends Controller
),
'messages' => $this->messages,
));
- }
+ }
/**
* Востанавливает данные сессии по умолчанию
@@ -246,9 +246,9 @@ abstract class ScaffoldController extends Controller
WHERE ?s ?s '.$this->where, $this->table, $filter['where'], $parentWhere);
$foreign = $this->getForeign();
- $data = QFW::$db->select('SELECT ?# ?s FROM ?# ?s
+ $data = QFW::$db->select('SELECT ?# AS ARRAY_KEY, ?# ?s FROM ?# ?s
WHERE ?s ?s '.$this->where.' ?s LIMIT ?d, ?d',
- array($this->table=>array_merge($this->order, array('*'))),
+ $this->primaryKey, array($this->table=>array_merge($this->order, array('*'))),
$foreign['field'], $this->table, $foreign['join'],
$filter['where'], $parentWhere,
$this->getSort(),
@@ -457,6 +457,105 @@ abstract class ScaffoldController extends Controller
))->fetch('scaffold/multidel.php');
}
+ public function multiEditAction()
+ {
+ if (empty($this->sess['multi']['ids']))
+ QFW::$router->redirect(Url::C('index'));
+ $ids = $this->sess['multi']['ids'];
+ require_once LIBPATH.'/HTML/FormPersister.php';
+ ob_start(array(new HTML_FormPersister(), 'process'));
+ $errors = array();
+ if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['edit']))
+ {
+ $res = $this->multiEditPost($_POST['data']);
+ if ($res)
+ {
+ $this->messages['success'][] = 'Выбранные записи отредактированы';
+ unset($this->sess['multi']['ids']);
+ QFW::$router->redirect(Url::C('index'));
+ }
+ QFW::$view->assign('messages', $this->messages);
+ }
+ if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['cancel']))
+ {
+ $this->messages['message'][] = 'редактирование отменено';
+ unset($this->sess['multi']['ids']);
+ QFW::$router->redirect(Url::C('index'));
+ }
+
+ $state = new TemplaterState(QFW::$view);
+ QFW::$view->setScriptPath(dirname(__FILE__));
+
+ $foreign = $this->getForeign();
+ $data = QFW::$db->select('SELECT ?# AS ARRAY_KEY, ?# ?s FROM ?# ?s
+ WHERE ?# IN (?a) ?s',
+ $this->primaryKey, array($this->table=>array_merge($this->order, array('*'))),
+ $foreign['field'], $this->table, $foreign['join'],
+ $this->primaryKey, $ids,
+ $this->getSort());
+ return QFW::$view->assign(array(
+ 'data' => $data,
+ ))->fetch('scaffold/multiedit.php');
+ }
+
+ /**
+ * Редактирование данных
+ *
+ * @param array $alldata данные
+ * @return bool успешно отредактировано
+ */
+ private function multiEditPost($alldata)
+ {
+ $errors = array();
+ //Обработка результата редактирования
+ foreach($alldata as $id => $data)
+ foreach ($data as $k=>$v)
+ {
+ if (isset($this->methods['validator_'.ucfirst($k)]))
+ $res = call_user_func(array($this, 'validator_'.ucfirst($k)), $v, $id);
+ else
+ $res = $this->fields[$k]->validator($id, $v);
+ if ($res !== true)
+ $errors[$k] = $res;
+ if ($res === false)
+ $errors[$k] = 'Поле '.$this->fields[$k]->title.' имеет некорректное значение';
+ }
+
+ //Если ошибок нет, то записываем в базу изменения
+ if (count($errors))
+ {
+ $this->messages['error'] = $errors;
+ return false;
+ }
+
+ foreach($alldata as $id => $data)
+ {
+ $old = $this->getOldVars($id);
+ //Обработка данных после POST
+ foreach ($this->fields as $k=>$class)
+ if ($k == $this->primaryKey && !isset($data[$k]))
+ continue; //не трогаем первичный ключ
+ elseif (isset($this->methods['proccess_'.ucfirst($k)]))
+ $data[$k] = call_user_func(array($this, 'proccess_'.ucfirst($k)),
+ isset($data[$k]) ? $data[$k] : $old[$k], $id, $old[$k]);
+ else
+ $data[$k] = $class->proccess($id,
+ isset($data[$k]) ? $data[$k] : $old[$k], $old[$k]);
+
+ //вообще при редактировании быть не может, но для вставки
+ if ($id == -1)
+ $ins_id = QFW::$db->query('INSERT INTO ?#(?#) VALUES(?a)',
+ $this->table, array_keys($data), array_values($data));
+ else
+ QFW::$db->query('UPDATE ?# SET ?a WHERE ?#=?',
+ $this->table, $data, $this->primaryKey, $id);
+
+ if (isset($this->methods['postEdit']))
+ call_user_func(array($this, 'postEdit'), $id == -1 ? $ins_id : $id);
+ }
+ return true;
+ }
+
/**
* Вызывает действие, привязанное к определенному полю
*
@@ -732,8 +831,8 @@ abstract class ScaffoldController extends Controller
private function getOldVars($id)
{
if ($id != -1)
- return QFW::$db->selectRow('SELECT ?# FROM ?# WHERE ?#=?',
- array($this->table=>array_merge($this->order, array('*'))),
+ return QFW::$db->selectRow('SELECT ?# AS ARRAY_KEY, ?# FROM ?# WHERE ?#=?',
+ $this->primaryKey, array($this->table=>array_merge($this->order, array('*'))),
$this->table, $this->primaryKey, $id);
//получение дефолтовых значений для новой записи
diff --git a/lib/Modules/Scaffold/scaffold/index.php b/lib/Modules/Scaffold/scaffold/index.php
index 34e549b..547a41d 100644
--- a/lib/Modules/Scaffold/scaffold/index.php
+++ b/lib/Modules/Scaffold/scaffold/index.php
@@ -8,12 +8,12 @@
<?php echo $pager; ?>
<?php if (count($data)>0) { $cols = 3 + (empty($actions) ? 0 : 1); // с чекбоксами, редактирование+удаление, действия ?>
-<form action="" method="post">
+<form action="" method="post" enctype="multipart/form-data">
<table id="table_<?php echo $table ?>" class="scaffoldTable">
<thead>
<tr>
<th><input type="checkbox" class="multiSelect" /></th>
- <?php foreach($data[0] as $key=>$v) {
+ <?php foreach(current($data) as $key=>$v) {
$i = $fields[$key];
if ($i->hide)
continue;
@@ -37,7 +37,7 @@
<tbody>
<?php foreach($data as $id=>$row) { ?>
<tr>
- <td><input type="checkbox" name="id[]" value="<?php echo $row[$primaryKey] ?>" /></td>
+ <td><input type="checkbox" name="id[]" value="<?php echo $id ?>" /></td>
<?php foreach($row as $key=>$v) {
$i = $fields[$key];
if ($i->hide)
@@ -45,9 +45,9 @@
?>
<td<?php if ($i->class) {?> class="<?php echo $i->class===true ? 'col_'.$key : $i->class ?>"<?php } ?>><?php //отображение обычного не связанного поля
if (isset($methods['display_'.ucfirst($key)]))
- echo call_user_func($class.'::display_'.ucfirst($key), $row[$primaryKey], $v);
+ echo call_user_func($class.'::display_'.ucfirst($key), $id, $v);
else
- echo $i->display($row[$primaryKey], $v);
+ echo $i->display($id, $v);
?></td>
<?php } ?>
<td><a href="<?php echo Url::C('edit/'.$row[$primaryKey]) ?>">ред.</a></td>
diff --git a/lib/Modules/Scaffold/scaffold/multidel.php b/lib/Modules/Scaffold/scaffold/multidel.php
index 6116d02..1d2c7f3 100644
--- a/lib/Modules/Scaffold/scaffold/multidel.php
+++ b/lib/Modules/Scaffold/scaffold/multidel.php
@@ -1,11 +1,11 @@
<?php require dirname(__FILE__).'/info.php' ?>
<?php $cols = 0; // при удалении дополнительных колонок нет ?>
-<form action="" method="post">
+<form action="" method="post" enctype="multipart/form-data">
<table id="table_<?php echo $table ?>" class="scaffoldTable">
<thead>
<tr>
- <?php foreach($data[0] as $key=>$v) {
+ <?php foreach(current($data) as $key=>$v) {
$i = $fields[$key];
if ($i->hide)
continue;
@@ -25,9 +25,9 @@
?>
<td<?php if ($i->class) {?> class="<?php echo $i->class===true ? 'col_'.$key : $i->class ?>"<?php } ?>><?php //отображение обычного не связанного поля
if (isset($methods['display_'.ucfirst($key)]))
- echo call_user_func($class.'::display_'.ucfirst($key), $row[$primaryKey], $v);
+ echo call_user_func($class.'::display_'.ucfirst($key), $id, $v);
else
- echo $i->display($row[$primaryKey], $v);
+ echo $i->display($id, $v);
?></td>
<?php } ?>
</tr>
diff --git a/lib/Modules/Scaffold/scaffold/multiedit.php b/lib/Modules/Scaffold/scaffold/multiedit.php
new file mode 100644
index 0000000..f783b4b
--- /dev/null
+++ b/lib/Modules/Scaffold/scaffold/multiedit.php
@@ -0,0 +1,50 @@
+<?php require dirname(__FILE__).'/info.php' ?>
+
+<?php $cols = 0; // при удалении дополнительных колонок нет ?>
+<form action="" method="post" enctype="multipart/form-data">
+<table id="table_<?php echo $table ?>" class="scaffoldTable">
+<thead>
+<tr>
+ <?php foreach(current($data) as $key=>$v) {
+ $i = $fields[$key];
+ if ($i->hide)
+ continue;
+ if (!$i->primaryKey && !($i->hide === false))
+ continue;
+ //по умолчанию первичный ключ не редактируем, но если принудительно установим показ
+ $cols++;
+ ?>
+ <th><?php echo $i->title ?></th>
+ <?php } ?>
+</tr>
+</thead>
+<tbody>
+<?php foreach($data as $id=>$row) { ?>
+<tr>
+ <?php foreach($row as $key=>$v) {
+ $i = $fields[$key];
+ if ($i->hide)
+ continue;
+ if (!$i->primaryKey && !($i->hide === false))
+ continue;
+ //по умолчанию первичный ключ не редактируем, но если принудительно установим показ
+ ?>
+ <td<?php if ($i->class) {?> class="<?php echo $i->class===true ? 'col_'.$key : $i->class ?>"<?php } ?>>
+ <?php
+ if (isset($methods['editor_'.ucfirst($key)]))
+ echo call_user_func($class.'::editor_'.ucfirst($key), $id, $v);
+ else
+ echo $i->editor($id, $v);
+ ?></td>
+ <?php } ?>
+</tr>
+<?php } ?>
+</tbody>
+<tfoot>
+<tr><td colspan="<?php echo $cols ?>">
+ <input type="submit" name="edit" value="Редактировать" />
+ <input type="submit" name="cancel" value="Отменить" />
+</td></tr>
+</tfoot>
+</table>
+</form>
commit 30a43b067f81887ad53957a6713559f6b6d044e6
Author: Ivan Borzenkov <iva...@li...>
Date: Wed Dec 1 14:11:54 2010 +0300
Мультидел
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 3f78628..164e65e 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -43,6 +43,8 @@ abstract class ScaffoldController extends Controller
protected $addOnBottom = true;
/** @var bool Показывать картинки при сортировке */
protected $sortImages = false;
+ /** @var bool Подключить JS и jquery */
+ protected $useJs = true;
/** @var array Массив методов */
private $methods;
@@ -103,7 +105,12 @@ abstract class ScaffoldController extends Controller
*/
public function __construct()
{
- QFW::$view->P->addCSS('built-in/scaffold.css');
+ Hlp::addCSS('built-in/scaffold.css');
+ if ($this->useJs)
+ {
+ Hlp::addJS('js/jquery.js');
+ Hlp::addJS('built-in/scaffold.js');
+ }
$this->session();
//Создаем сессию для таблицы и ссылаемся на нее
if (!isset($_SESSION['scaffold'][$this->table]))
@@ -186,6 +193,25 @@ abstract class ScaffoldController extends Controller
*/
public function indexAction($page=1)
{
+ //обработка выбора мультиедита и мультидела
+ if ($_SERVER['REQUEST_METHOD'] == 'POST')
+ {
+ if (empty($_POST['id']))
+ QFW::$router->redirect(Url::C('index'));
+ if (empty($_POST['edit']) && empty($_POST['delete']))
+ QFW::$router->redirect(Url::C('index'));
+ $this->sess['multi']['ids'] = $_POST['id'];
+ if (!empty($_POST['edit']))
+ QFW::$router->redirect(Url::C('multiEdit'));
+ elseif (!empty($_POST['delete']))
+ QFW::$router->redirect(Url::C('multiDelete'));
+ else
+ {
+ unset($this->sess['multi']);
+ QFW::$router->redirect(Url::C('index'), true);
+ }
+ }
+
// считаем страницы с нуля и убираем отрицательные
$page = max($page-1, 0);
$state = new TemplaterState(QFW::$view);
@@ -293,7 +319,7 @@ abstract class ScaffoldController extends Controller
require_once LIBPATH.'/HTML/FormPersister.php';
ob_start(array(new HTML_FormPersister(), 'process'));
$errors = array();
-
+
if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST['data'][$id])>0)
{
//Обработка результата редактирования
@@ -380,10 +406,58 @@ abstract class ScaffoldController extends Controller
$v->proccess($id, false, $old[$k]);
QFW::$db->query('DELETE FROM ?# WHERE ?#=?',
$this->table, $this->primaryKey, $id);
+ $this->messages['success'][] = 'Запись успешно удалена';
QFW::$router->redirect(Url::C('index'), true);
}
/**
+ * Удаление множества строк
+ *
+ * <br>Если нужно обработать удаление как-то нестандартно,
+ * то функция должна быть перегружена
+ *
+ * @param string $id значение первичного ключа удаляемой строки
+ */
+ public function multiDeleteAction()
+ {
+ if (empty($this->sess['multi']['ids']))
+ QFW::$router->redirect(Url::C('index'));
+ $ids = $this->sess['multi']['ids'];
+ if ($_SERVER['REQUEST_METHOD'] == 'POST')
+ {
+ if (isset($_POST['delete']))
+ {
+ $olds = QFW::$db->select('SELECT ?# AS PRIMARY_KEY, ?# FROM ?# WHERE ?# IN (?a)',
+ $this->primaryKey, array($this->table=>array_merge($this->order, array('*'))),
+ $this->table, $this->primaryKey, $ids);
+ foreach($olds as $id=>$old)
+ foreach($this->fields as $k=>$v)
+ $v->proccess($id, false, $old[$k]);
+ QFW::$db->query('DELETE FROM ?# WHERE ?# IN (?a)',
+ $this->table, $this->primaryKey, $ids);
+ $this->messages['success'][] = 'Выбранные записи удалены';
+ }
+ elseif (isset($_POST['cancel']))
+ $this->messages['message'][] = 'Удаление отменено';
+ unset($this->sess['multi']['ids']);
+ QFW::$router->redirect(Url::C('index'));
+ }
+ $state = new TemplaterState(QFW::$view);
+ QFW::$view->setScriptPath(dirname(__FILE__));
+
+ $foreign = $this->getForeign();
+ $data = QFW::$db->select('SELECT ?# ?s FROM ?# ?s
+ WHERE ?# IN (?a) ?s',
+ array($this->table=>array_merge($this->order, array('*'))),
+ $foreign['field'], $this->table, $foreign['join'],
+ $this->primaryKey, $ids,
+ $this->getSort());
+ return QFW::$view->assign(array(
+ 'data' => $data,
+ ))->fetch('scaffold/multidel.php');
+ }
+
+ /**
* Вызывает действие, привязанное к определенному полю
*
* @param string $name имя поля
diff --git a/lib/Modules/Scaffold/scaffold/index.php b/lib/Modules/Scaffold/scaffold/index.php
index 6aeff32..34e549b 100644
--- a/lib/Modules/Scaffold/scaffold/index.php
+++ b/lib/Modules/Scaffold/scaffold/index.php
@@ -7,13 +7,17 @@
<?php echo $pager; ?>
-<?php if (count($data)>0) { ?>
+<?php if (count($data)>0) { $cols = 3 + (empty($actions) ? 0 : 1); // с чекбоксами, редактирование+удаление, действия ?>
+<form action="" method="post">
<table id="table_<?php echo $table ?>" class="scaffoldTable">
+<thead>
<tr>
+ <th><input type="checkbox" class="multiSelect" /></th>
<?php foreach($data[0] as $key=>$v) {
$i = $fields[$key];
if ($i->hide)
continue;
+ $cols++;
?>
<th><a href="<?php echo Url::C('sort/'.$key) ?>"><?php echo $i->title ?></a>
<?php if (isset($order) && $order['field'] == $key) { ?><span class="scaffoldSort">
@@ -29,8 +33,11 @@
<th colspan="2"><a href="<?php echo Url::C('edit/-1') ?>">доб.</a></th>
<?php if (count($actions)) { ?><th>действия</th><?php } ?>
</tr>
+</thead>
+<tbody>
<?php foreach($data as $id=>$row) { ?>
<tr>
+ <td><input type="checkbox" name="id[]" value="<?php echo $row[$primaryKey] ?>" /></td>
<?php foreach($row as $key=>$v) {
$i = $fields[$key];
if ($i->hide)
@@ -51,7 +58,16 @@
<?php } ?></td><?php } ?>
</tr>
<?php } ?>
+</tbody>
+<tfoot>
+<tr><td colspan="<?php echo $cols ?>">
+ <input type="submit" name="edit" value="Редактировать выбранных" />
+ <input type="submit" name="delete" value="Удалить выбранных" />
+ <?php echo $this->block(Url::C('multiPost')); ?>
+</td></tr>
+</tfoot>
</table>
+</form>
<?php } else { ?>
Записей нет
<?php if (!$options['addOnBottom']) {?>
diff --git a/lib/Modules/Scaffold/scaffold/multidel.php b/lib/Modules/Scaffold/scaffold/multidel.php
new file mode 100644
index 0000000..6116d02
--- /dev/null
+++ b/lib/Modules/Scaffold/scaffold/multidel.php
@@ -0,0 +1,43 @@
+<?php require dirname(__FILE__).'/info.php' ?>
+
+<?php $cols = 0; // при удалении дополнительных колонок нет ?>
+<form action="" method="post">
+<table id="table_<?php echo $table ?>" class="scaffoldTable">
+<thead>
+<tr>
+ <?php foreach($data[0] as $key=>$v) {
+ $i = $fields[$key];
+ if ($i->hide)
+ continue;
+ $cols++;
+ ?>
+ <th><?php echo $i->title ?></th>
+ <?php } ?>
+</tr>
+</thead>
+<tbody>
+<?php foreach($data as $id=>$row) { ?>
+<tr>
+ <?php foreach($row as $key=>$v) {
+ $i = $fields[$key];
+ if ($i->hide)
+ continue;
+ ?>
+ <td<?php if ($i->class) {?> class="<?php echo $i->class===true ? 'col_'.$key : $i->class ?>"<?php } ?>><?php //отображение обычного не связанного поля
+ if (isset($methods['display_'.ucfirst($key)]))
+ echo call_user_func($class.'::display_'.ucfirst($key), $row[$primaryKey], $v);
+ else
+ echo $i->display($row[$primaryKey], $v);
+ ?></td>
+ <?php } ?>
+</tr>
+<?php } ?>
+</tbody>
+<tfoot>
+<tr><td colspan="<?php echo $cols ?>">
+ <input type="submit" name="delete" value="Удалить" />
+ <input type="submit" name="cancel" value="Отменить" />
+</td></tr>
+</tfoot>
+</table>
+</form>
diff --git a/www/built-in/scaffold.css b/www/built-in/scaffold.css
index 2b52f05..10f5fd4 100644
--- a/www/built-in/scaffold.css
+++ b/www/built-in/scaffold.css
@@ -16,7 +16,7 @@ table.scaffoldTable
margin: 0;
}
-.scaffoldTable td:last-child, .scaffoldTable td:nth-last-child(2)
+.scaffoldTable td:last-child, .scaffoldTable td:nth-last-child(2), .scaffoldTable td:first-child
{
width: 25px;
}
diff --git a/www/built-in/scaffold.js b/www/built-in/scaffold.js
new file mode 100644
index 0000000..a548fd8
--- /dev/null
+++ b/www/built-in/scaffold.js
@@ -0,0 +1,9 @@
+$(function() {
+ cb = $('.scaffoldTable .multiSelect');
+ if (cb.length == 0)
+ return;
+ cb.click(function(){
+ $("input[name^=id]", $('.scaffoldTable')).attr("checked", $(this).attr("checked"));
+ });
+});
+
commit 25e4c4979ca9815bc8594882b0b08edd3075ca78
Author: Ivan Borzenkov <iva...@li...>
Date: Wed Dec 1 14:09:46 2010 +0300
Переписаны сообщения в скафолдинге
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 3bed522..3f78628 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -50,6 +50,8 @@ abstract class ScaffoldController extends Controller
private $setup = false;
/** @var array Порядок столбцев */
private $order = array();
+ /** @var array сообщения для вывода */
+ private $messages;
/**
* Получает данные о полях
@@ -108,6 +110,14 @@ abstract class ScaffoldController extends Controller
$_SESSION['scaffold'][$this->table] = array();
$this->sess = &$_SESSION['scaffold'][$this->table];
+ $this->messages = &$this->sess['messages'];
+ if (empty($this->messages))
+ $this->messages = array(
+ 'error' => array(),
+ 'success' => array(),
+ 'message' => array(),
+ );
+
$this->setup = true;
parent::__construct();
$this->methods = array_flip(get_class_methods($this));
@@ -144,6 +154,7 @@ abstract class ScaffoldController extends Controller
'addOnBottom' => $this->addOnBottom,
'sortImages' => $this->sortImages,
),
+ 'messages' => $this->messages,
));
}
@@ -300,7 +311,7 @@ abstract class ScaffoldController extends Controller
}
//Если ошибок нет, то записываем в базу изменения
if (count($errors))
- QFW::$view->assign('errors', $errors);
+ $this->messages['error'] = $errors;
else
{
$old = $this->getOldVars($id);
@@ -400,7 +411,6 @@ abstract class ScaffoldController extends Controller
if (empty($_POST['filter']) || empty($_POST['apply']))
QFW::$router->redirect(Url::C('index'), true);
$this->sess['filter'] = $_POST['filter'];
-
QFW::$router->redirect(Url::C('index'), true);
}
@@ -736,7 +746,6 @@ abstract class ScaffoldController extends Controller
'direction' => $dir,
);
return true;
-
}
/**
diff --git a/lib/Modules/Scaffold/scaffold/info.php b/lib/Modules/Scaffold/scaffold/info.php
index ed57025..4582d5c 100644
--- a/lib/Modules/Scaffold/scaffold/info.php
+++ b/lib/Modules/Scaffold/scaffold/info.php
@@ -1,10 +1,9 @@
-<?php
-$messages_types = array(
- 'error' => 'errors',
-);
-foreach($messages_types as $type => $v)
-{
- if (!empty($$v)) foreach($$v as $key=>$message) { ?>
+<?php foreach($messages as $type => $messages_t) {
+ if (!empty($messages_t)) foreach($messages_t as $key=>$message) { ?>
<span class="<?php echo $type ?>"><b></b><?php echo $message; ?></span>
+ <?php } ?>
<?php } ?>
-<?php } ?>
+<?php
+ //вывели сообщения, очищаем
+ $session['messages']=array();
+?>
\ No newline at end of file
commit d8e6daceb0f469cd8259fb1a1208f7b52d8eb880
Author: Ivan Borzenkov <iva...@li...>
Date: Wed Dec 1 12:49:27 2010 +0300
Правки к мультиедиту
diff --git a/lib/Modules/Scaffold/Fields.php b/lib/Modules/Scaffold/Fields.php
index 2bbba26..e3e3169 100644
--- a/lib/Modules/Scaffold/Fields.php
+++ b/lib/Modules/Scaffold/Fields.php
@@ -91,7 +91,7 @@ class Scaffold_Field extends Scaffold_Field_Info
*/
public function editor($id, $value)
{
- return '<input type="text" name="data['.$this->name.']"
+ return '<input type="text" name="'.$this->editName($id).'"
default="'.QFW::$view->esc($value).'" />';
}
@@ -197,7 +197,7 @@ class Scaffold_Field extends Scaffold_Field_Info
*/
protected function editName($id)
{
- return 'data['.$this->name.']';
+ return 'data['.$id.']['.$this->name.']';
}
}
@@ -477,11 +477,11 @@ class Scaffold_File extends Scaffold_Field
if ($res !== true)
return $res;
//оставляем старый файл
- if ($_FILES['fdata']['error'][$this->name] == 4)
+ if ($this->postField($id, 'error') == 4)
return true;
- if ($_FILES['fdata']['error'][$this->name] != 0)
+ if ($this->postField($id, 'error') != 0)
return 'Ошибка при загрузке файла '.$this->title;
- return is_uploaded_file($_FILES['fdata']['tmp_name'][$this->name]);
+ return is_uploaded_file($this->postField($id, 'tmp_name'));
}
public function proccess($id, $value, $old)
@@ -490,7 +490,7 @@ class Scaffold_File extends Scaffold_Field
if ($value === false && is_file($this->path.'/'.$old))
unlink($this->path.'/'.$old);
//оставляем старое значение
- if ($_FILES['fdata']['error'][$this->name] == 4 && !$value)
+ if ($this->postField($id, 'error') == 4 && !$value)
return $old ? $old : '';
//удяляем старый
if (is_file($this->path.'/'.$old))
@@ -499,11 +499,11 @@ class Scaffold_File extends Scaffold_Field
if ($value)
return '';
//генерим новое имя
- $info = pathinfo($_FILES['fdata']['name'][$this->name]);
+ $info = pathinfo($this->postField($id, 'name'));
if ($id == -1)
$id = time();
$new_name = $this->genFunc ? call_user_func($this->genFunc, $this->name, $id, '.'.$info['extension']) : $this->name.'_'.$id.'.'.$info['extension'];
- move_uploaded_file($_FILES['fdata']['tmp_name'][$this->name], $this->path.'/'.$new_name);
+ move_uploaded_file($this->postField($id, 'tmp_name'), $this->path.'/'.$new_name);
return $new_name;
}
@@ -516,6 +516,19 @@ class Scaffold_File extends Scaffold_Field
return $value;
}
+ /**
+ * Имя поля для формы
+ *
+ * @param string $id первичный ключ
+ * @param string $field имя поля в массиве files
+ * @return mixed значение
+ */
+ protected function postField($id, $field)
+ {
+ return $_FILES['fdata'][$field][$id][$this->name];
+ //return 'data['.$id.']['.$this->name.']';
+ }
+
}
class Scaffold_Image extends Scaffold_File
@@ -538,9 +551,9 @@ class Scaffold_Image extends Scaffold_File
//флаг что удалили
if ($value)
return true;
- if ($_FILES['fdata']['error'][$this->name] == 4)
+ if ($this->postField($id, 'error') == 4)
return true;
- $ext = $this->getImgType($_FILES['fdata']['tmp_name'][$this->name]);
+ $ext = $this->getImgType($this->postField($id, 'tmp_name'));
if (!$ext)
return 'Картинка должна быть';
return true;
@@ -556,7 +569,7 @@ class Scaffold_Image extends Scaffold_File
return '';
}
//оставляем старое значение
- if ($_FILES['fdata']['error'][$this->name] == 4 && !$value)
+ if ($this->postField($id, 'error') == 4 && !$value)
return $old ? $old : '';
//удяляем старый
if (is_file($this->path.'/'.$old))
@@ -565,11 +578,11 @@ class Scaffold_Image extends Scaffold_File
if ($value)
return '';
//генерим новое имя
- $ext = $this->getImgType($_FILES['fdata']['tmp_name'][$this->name]);
+ $ext = $this->getImgType($this->postField($id, 'tmp_name'));
if ($id == -1)
$id = time();
$new_name = $this->genFunc ? call_user_func($this->genFunc, $this->name, $id, $ext) : $this->name.'_'.$id.$ext;
- move_uploaded_file($_FILES['fdata']['tmp_name'][$this->name], $this->path.'/'.$new_name);
+ move_uploaded_file($this->postField($id, 'tmp_name'), $this->path.'/'.$new_name);
return $new_name;
}
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 438ede1..3bed522 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -283,10 +283,10 @@ abstract class ScaffoldController extends Controller
ob_start(array(new HTML_FormPersister(), 'process'));
$errors = array();
- if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST['data'])>0)
+ if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST['data'][$id])>0)
{
//Обработка результата редактирования
- $data = $_POST['data'];
+ $data = $_POST['data'][$id];
foreach ($data as $k=>$v)
{
if (isset($this->methods['validator_'.ucfirst($k)]))
commit 4aa9bded18576e6974e1f839688d02a51227c36d
Author: Ivan Borzenkov <iva...@li...>
Date: Tue Nov 30 19:41:25 2010 +0300
valign
diff --git a/www/built-in/scaffold.css b/www/built-in/scaffold.css
index b579234..2b52f05 100644
--- a/www/built-in/scaffold.css
+++ b/www/built-in/scaffold.css
@@ -21,7 +21,7 @@ table.scaffoldTable
width: 25px;
}
-.scaffoldTable tr {vertical-align:top;}
+.scaffoldTable tr > * {vertical-align:top;}
.scaffoldTable th { background-color:#eec0c0; }
.scaffoldTable tr td { background-color:#ddd; text-align:left;}
.scaffoldTable tr:nth-child(odd) td { background-color:#c0ffc0; }
commit 60e25d354d1b089d382053d4e6eca22842445075
Author: Ivan Borzenkov <iva...@li...>
Date: Tue Nov 30 19:28:04 2010 +0300
Верстка и пагинатор
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 18577d0..438ede1 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -39,8 +39,8 @@ abstract class ScaffoldController extends Controller
protected $sess = array();
//Опции
- /** @var bool Ссылка добавить внизу страницы */
- protected $addOnBottom = false;
+ /** @var bool|string Добавить внизу страницы (заголовок) */
+ protected $addOnBottom = true;
/** @var bool Показывать картинки при сортировке */
protected $sortImages = false;
@@ -243,7 +243,6 @@ abstract class ScaffoldController extends Controller
//инициализация FormPersister
/*require_once LIBPATH.'/HTML/FormPersister.php';
ob_start(array(new HTML_FormPersister(), 'process'));*/
- $errors = array();
//получение дефолтовых значений для новой записи
$data = array();
@@ -269,7 +268,6 @@ abstract class ScaffoldController extends Controller
return QFW::$view->assign(array(
'id' => -1,
'data' => $data,
- 'errors' => $errors,
))->fetch('scaffold/edit.php');
}
@@ -297,9 +295,13 @@ abstract class ScaffoldController extends Controller
$res = $this->fields[$k]->validator($id, $v);
if ($res !== true)
$errors[$k] = $res;
+ if ($res === false)
+ $errors[$k] = 'Поле '.$this->fields[$k]->title.' имеет некорректное значение';
}
//Если ошибок нет, то записываем в базу изменения
- if (count($errors) == 0)
+ if (count($errors))
+ QFW::$view->assign('errors', $errors);
+ else
{
$old = $this->getOldVars($id);
//Обработка данных после POST
@@ -347,7 +349,6 @@ abstract class ScaffoldController extends Controller
return QFW::$view->assign(array(
'id' => $id,
'data' => $data,
- 'errors' => $errors,
))->fetch('scaffold/edit.php');
}
diff --git a/lib/Modules/Scaffold/scaffold/edit.php b/lib/Modules/Scaffold/scaffold/edit.php
index abee257..732b7a0 100644
--- a/lib/Modules/Scaffold/scaffold/edit.php
+++ b/lib/Modules/Scaffold/scaffold/edit.php
@@ -1,8 +1,4 @@
-<?php if (count($errors)) foreach($errors as $k=>$err) { ?>
- <?php if ($err) echo $err; else {?>
- Поле <?php echo $fields[$k]->title ?> имеет некорректное значение<br />
- <?php } ?>
-<?php } ?>
+<?php require dirname(__FILE__).'/info.php' ?>
<?php echo $this->block(Url::C('preForm'), $id); ?>
<form action="<?php echo Url::C('edit/'.$id) ?>" class="scaffoldEdit"
method="post" id="form_<?php echo $table ?>" enctype="multipart/form-data">
@@ -37,5 +33,6 @@
<dd><input type="submit" value="Отправить" name="send" /></dd>
</dl>
<?php echo $this->block(Url::C('postEdit'), $id); ?>
+ <div></div>
</form>
<?php echo $this->block(Url::C('postForm'), $id); ?>
diff --git a/lib/Modules/Scaffold/scaffold/index.php b/lib/Modules/Scaffold/scaffold/index.php
index 5ea4b79..6aeff32 100644
--- a/lib/Modules/Scaffold/scaffold/index.php
+++ b/lib/Modules/Scaffold/scaffold/index.php
@@ -1,3 +1,4 @@
+<?php require dirname(__FILE__).'/info.php' ?>
<?php if (isset($parent)) echo $parent; ?>
<?php if (isset($filter)) {
@@ -51,11 +52,19 @@
</tr>
<?php } ?>
</table>
-<?php if ($options['addOnBottom']) {?><a href="<?php echo Url::C('edit/-1') ?>">добавить</a><?php } ?>
<?php } else { ?>
Записей нет
+ <?php if (!$options['addOnBottom']) {?>
<a href="<?php echo Url::C('edit/-1') ?>">добавить</a>
+ <?php } ?>
<?php } ?>
-
<?php echo $pager; ?>
<?php echo $this->block(Url::C('postTable')); ?>
+
+<?php if ($options['addOnBottom']) {?>
+<div>
+<?php if ($options['addOnBottom']!==true) echo $options['addOnBottom'] ?>
+<?php echo $this->block(Url::C('new')) ?>
+<p> </p>
+</div>
+<?php } ?>
\ No newline at end of file
diff --git a/lib/Modules/Scaffold/scaffold/info.php b/lib/Modules/Scaffold/scaffold/info.php
new file mode 100644
index 0000000..ed57025
--- /dev/null
+++ b/lib/Modules/Scaffold/scaffold/info.php
@@ -0,0 +1,10 @@
+<?php
+$messages_types = array(
+ 'error' => 'errors',
+);
+foreach($messages_types as $type => $v)
+{
+ if (!empty($$v)) foreach($$v as $key=>$message) { ?>
+ <span class="<?php echo $type ?>"><b></b><?php echo $message; ?></span>
+<?php } ?>
+<?php } ?>
diff --git a/www/built-in/scaffold.css b/www/built-in/scaffold.css
index db373b6..b579234 100644
--- a/www/built-in/scaffold.css
+++ b/www/built-in/scaffold.css
@@ -1,4 +1,7 @@
-div.pageslist {text-align:center;}
+.pageslist {margin: 15px; text-align: center}
+.pageslist b {padding: 5px 10px; margin: 2px; border: 1px solid #eee; font-weight: bold }
+.pageslist a {padding: 5px 10px; margin: 2px; border: 1px solid #eee; text-decoration: none }
+.pageslist a:hover {background: #f0f0ff}
table.scaffoldTable
{
@@ -62,3 +65,8 @@ form.scaffoldEdit small
margin-left: 20px;
color: #999;
}
+
+form.scaffoldEdit > :last-child
+{
+ clear:left;
+}
commit 46e8cece03258ca756c2942bf9c8ed169b5fd4b2
Author: Ivan Borzenkov <iva...@li...>
Date: Tue Nov 30 18:00:25 2010 +0300
Спан для обязательного поля при редактировании
diff --git a/lib/Modules/Scaffold/scaffold/edit.php b/lib/Modules/Scaffold/scaffold/edit.php
index 6e14b70..abee257 100644
--- a/lib/Modules/Scaffold/scaffold/edit.php
+++ b/lib/Modules/Scaffold/scaffold/edit.php
@@ -20,7 +20,9 @@
?>
<label>
<dt<?php if (isset($errors[$k])) echo ' class="err"'; ?>>
- <?php echo $i->title ?></dt>
+ <?php echo $i->title ?><?php
+ if ($i->required) {?><span class="required"></span><?php }
+ ?></dt>
<dd><?php
if (isset($methods['editor_'.ucfirst($k)]))
echo call_user_func($class.'::editor_'.ucfirst($k), $id, $v);
commit 6d2685713e4329172fb79f5bfbaf14a454958c70
Author: Ivan Borzenkov <iva...@li...>
Date: Tue Nov 30 17:55:23 2010 +0300
Обязательное поле и label
diff --git a/lib/Modules/Scaffold/Fields.php b/lib/Modules/Scaffold/Fields.php
index 73392c5..2bbba26 100644
--- a/lib/Modules/Scaffold/Fields.php
+++ b/lib/Modules/Scaffold/Fields.php
@@ -38,8 +38,10 @@ class Scaffold_Field_Info
public $title = '';
/** @var string Описание колонки */
public $desc = '';
- /** @var bool|string добавить класс колонке */
+ /** @var bool|string Добавить класс колонке */
public $class = false;
+ /** @var bool Обязательная колонка */
+ public $required = false;
}
@@ -104,6 +106,9 @@ class Scaffold_Field extends Scaffold_Field_Info
*/
public function validator($id, $value)
{
+ var_dump($this->required);
+ if ($this->required && empty($value))
+ return false;
return true;
}
@@ -211,6 +216,9 @@ class Scaffold_Parent extends Scaffold_Field
public function validator($id, $value)
{
+ $res = parent::validator($id, $value);
+ if ($res !== true)
+ return $res;
//если у нас будет потеря сессии, то случится фигня
return isset($_SESSION['scaffold'][$this->table]['parent']);
}
@@ -250,6 +258,9 @@ class Scaffold_Foreign extends Scaffold_Field
public function validator($id, $value)
{
+ $res = parent::validator($id, $value);
+ if ($res !== true)
+ return $res;
return $this->isnull || !empty($value);
}
@@ -334,6 +345,9 @@ class Scaffold_Varchar extends Scaffold_Field
public function validator($id, $value)
{
+ $res = parent::validator($id, $value);
+ if ($res !== true)
+ return $res;
return mb_strlen($value) <= $this->size;
}
}
@@ -459,6 +473,9 @@ class Scaffold_File extends Scaffold_Field
public function validator($id, $value)
{
+ $res = parent::validator($id, $value);
+ if ($res !== true)
+ return $res;
//оставляем старый файл
if ($_FILES['fdata']['error'][$this->name] == 4)
return true;
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 71b9359..18577d0 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -552,6 +552,21 @@ abstract class ScaffoldController extends Controller
}
/**
+ * Устанавливает флаг, что поле обязательно для заполнения
+ *
+ * <br><br> Вызывается только в конструкторе
+ *
+ * @param string|array $colum Колонка<br>
+ * Или массив ключи - колонки, значения заголовки
+ * @param string $title Заголовок
+ * @return ScaffoldController
+ */
+ protected function required($colum, $required=true)
+ {
+ return $this->setColumOpt('required', $colum, $required);
+ }
+
+ /**
* Устанавливает css класс для столбца
*
* <br><br> Вызывается только в конструкторе
diff --git a/lib/Modules/Scaffold/scaffold/edit.php b/lib/Modules/Scaffold/scaffold/edit.php
index b72d88f..6e14b70 100644
--- a/lib/Modules/Scaffold/scaffold/edit.php
+++ b/lib/Modules/Scaffold/scaffold/edit.php
@@ -18,6 +18,7 @@
if (!$i->primaryKey && !($i->hide === false))
continue;
?>
+ <label>
<dt<?php if (isset($errors[$k])) echo ' class="err"'; ?>>
<?php echo $i->title ?></dt>
<dd><?php
@@ -27,6 +28,7 @@
echo $i->editor($id, $v); ?>
<?php if ($i->desc) {?><small><?php echo $i->desc ?></small><?php } ?>
</dd>
+ </label>
<?php } ?>
<?php echo $this->block(Url::C('preSend'), $id); ?>
<dt></dt>
diff --git a/lib/Modules/Scaffold/scaffold/fields/dateedit.php b/lib/Modules/Scaffold/scaffold/fields/dateedit.php
index e604139..061f28e 100644
--- a/lib/Modules/Scaffold/scaffold/fields/dateedit.php
+++ b/lib/Modules/Scaffold/scaffold/fields/dateedit.php
@@ -4,7 +4,7 @@ Hlp::addJs('js/jquery.js');
Hlp::addJs('timepicker/jquery-ui-1.8.custom.min.js');
Hlp::addJs('timepicker/jquery-ui-timepicker-addon.min.js');
Hlp::addJs('timepicker/jquery-ui-datepicker-ru.js');
-?><input type="text" name="<?php echo $name ?>" value="<?php echo $value?>" class="datepicker" />
+?><input type="text" name="<?php echo $name ?>" default="<?php echo $value?>" class="datepicker" />
<?php Hlp::sJSe() ?>
$('.datepicker').datetimepicker({
showSecond: true,
commit 9249c6aa2a062279ed5ee7bacf20322a775ca6ab
Author: Ivan Borzenkov <iva...@li...>
Date: Tue Nov 30 17:08:41 2010 +0300
Поправил меню - текущий элемент - класс
diff --git a/application/helper/controllers/NavController.php b/application/helper/controllers/NavController.php
index d7d11b9..a631ede 100644
--- a/application/helper/controllers/NavController.php
+++ b/application/helper/controllers/NavController.php
@@ -68,19 +68,14 @@ class NavController
{
if (isset($v['show']) && $v['show'] === false)
continue;
- $result.='<li>';
+ $self = $cur == ($v['url'] instanceof Url ? $v['url']->intern() : $v['url']);
+ $result.='<li'.($self?' class="cur"':'').'>';
if ($v['url'] === false)
$result.=$v['title'];
else
- {
- if ($v['url'] instanceof Url)
- $self = $cur == $v['url']->intern();
- else
- $self = $cur == $v['url'];
$result.= $self ? '<b>'.$v['title'].'</b>' : '<a href="'.$v['url'].'">'.$v['title'].'</a>';
- }
if (isset($v['childNodes']))
- $result.='<ul>'.$this->menuTreeNodes($v['childNodes'], $cur).'</ul>';
+ $result.="\n<ul>".$this->menuTreeNodes($v['childNodes'], $cur).'</ul>';
$result.="</li>\n";
}
return $result;
commit 8eac6a03dc867bc53918df0262aed8d2ad5301ee
Author: Ivan Borzenkov <iva...@li...>
Date: Mon Nov 29 15:48:02 2010 +0300
filter true по умолчанию
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index 167b726..71b9359 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -516,7 +516,7 @@ abstract class ScaffoldController extends Controller
* mixed - произвольный параметр
* @return ScaffoldController
*/
- protected function filter($colum, $filter='')
+ protected function filter($colum, $filter=true)
{
return $this->setColumOpt('filter', $colum, $filter);
}
commit c43822d8b9dabd38c21a193b6e5d4aa7b25cf980
Author: Ivan Borzenkov <iva...@li...>
Date: Mon Nov 29 15:41:20 2010 +0300
Скафолдинг добавление класса столбца
diff --git a/lib/Modules/Scaffold/Fields.php b/lib/Modules/Scaffold/Fields.php
index 3a29b1c..73392c5 100644
--- a/lib/Modules/Scaffold/Fields.php
+++ b/lib/Modules/Scaffold/Fields.php
@@ -38,6 +38,8 @@ class Scaffold_Field_Info
public $title = '';
/** @var string Описание колонки */
public $desc = '';
+ /** @var bool|string добавить класс колонке */
+ public $class = false;
}
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index d3a8719..167b726 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -552,6 +552,21 @@ abstract class ScaffoldController extends Controller
}
/**
+ * Устанавливает css класс для столбца
+ *
+ * <br><br> Вызывается только в конструкторе
+ *
+ * @param string|array $colum Колонка<br>
+ * Или массив ключи - колонки, значения заголовки
+ * @param bool|string $class имя класса или true (col_$key)
+ * @return ScaffoldController
+ */
+ protected function setClass($colum, $class='')
+ {
+ return $this->setColumOpt('class', $colum, $class);
+ }
+
+ /**
* Принудительно устанавливает класс для поля
*
* <br><br> Вызывается только в конструкторе
diff --git a/lib/Modules/Scaffold/scaffold/index.php b/lib/Modules/Scaffold/scaffold/index.php
index 8ad66a5..5ea4b79 100644
--- a/lib/Modules/Scaffold/scaffold/index.php
+++ b/lib/Modules/Scaffold/scaffold/index.php
@@ -35,7 +35,7 @@
if ($i->hide)
continue;
?>
- <td><?php //отображение обычного не связанного поля
+ <td<?php if ($i->class) {?> class="<?php echo $i->class===true ? 'col_'.$key : $i->class ?>"<?php } ?>><?php //отображение обычного не связанного поля
if (isset($methods['display_'.ucfirst($key)]))
echo call_user_func($class.'::display_'.ucfirst($key), $row[$primaryKey], $v);
else
commit 80978b34317acf68a717fa595169b15b0e6b73a6
Author: Ivan Borzenkov <iva...@li...>
Date: Mon Nov 29 14:30:51 2010 +0300
Генерация имени загружаемого файла
diff --git a/lib/Modules/Scaffold/Fields.php b/lib/Modules/Scaffold/Fields.php
index 033510b..3a29b1c 100644
--- a/lib/Modules/Scaffold/Fields.php
+++ b/lib/Modules/Scaffold/Fields.php
@@ -421,6 +421,8 @@ class Scaffold_File extends Scaffold_Field
protected $prim;
/** @var bool Скачиваемый (доступен извне) */
protected $download;
+ /** @var function Генерит имя файла */
+ protected $genFunc;
/**
* Проверяет параметры для файлового поля
@@ -437,6 +439,7 @@ class Scaffold_File extends Scaffold_Field
if (!is_writable($info->typeParams['path']))
throw new Exception('Нельзя писать в директорию файлов '.$info->typeParams['path'], 1);
$this->path = $info->typeParams['path'];
+ $this->genFunc = !empty($info->typeParams['genFunc']) ? $info->typeParams['genFunc'] : false;
$this->prim = $info->primaryKey;
if (strpos($info->typeParams['path'], DOC_ROOT) === 0)
$this->download = substr($info->typeParams['path'], strlen(DOC_ROOT) );
@@ -480,7 +483,7 @@ class Scaffold_File extends Scaffold_Field
$info = pathinfo($_FILES['fdata']['name'][$this->name]);
if ($id == -1)
$id = time();
- $new_name = $this->name.'_'.$id.'.'.$info['extension'];
+ $new_name = $this->genFunc ? call_user_func($this->genFunc, $this->name, $id, '.'.$info['extension']) : $this->name.'_'.$id.'.'.$info['extension'];
move_uploaded_file($_FILES['fdata']['tmp_name'][$this->name], $this->path.'/'.$new_name);
return $new_name;
}
@@ -516,6 +519,8 @@ class Scaffold_Image extends Scaffold_File
//флаг что удалили
if ($value)
return true;
+ if ($_FILES['fdata']['error'][$this->name] == 4)
+ return true;
$ext = $this->getImgType($_FILES['fdata']['tmp_name'][$this->name]);
if (!$ext)
return 'Картинка должна быть';
@@ -544,7 +549,7 @@ class Scaffold_Image extends Scaffold_File
$ext = $this->getImgType($_FILES['fdata']['tmp_name'][$this->name]);
if ($id == -1)
$id = time();
- $new_name = $this->name.'_'.$id.$ext;
+ $new_name = $this->genFunc ? call_user_func($this->genFunc, $this->name, $id, $ext) : $this->name.'_'.$id.$ext;
move_uploaded_file($_FILES['fdata']['tmp_name'][$this->name], $this->path.'/'.$new_name);
return $new_name;
}
commit 64b69b3247c13721cc452d039a5e43d7216c5051
Author: Ivan Borzenkov <iva...@li...>
Date: Mon Nov 29 13:34:24 2010 +0300
Правки скафолдинга
diff --git a/lib/Modules/Scaffold/Fields.php b/lib/Modules/Scaffold/Fields.php
index 3f891be..033510b 100644
--- a/lib/Modules/Scaffold/Fields.php
+++ b/lib/Modules/Scaffold/Fields.php
@@ -416,11 +416,11 @@ class Scaffold_Timestamp extends Scaffold_Datetime {}
class Scaffold_File extends Scaffold_Field
{
/** @var string Путь к директории, где хранятся файлы */
- private $path;
+ protected $path;
/** @var string Первичный ключ таблицы */
- private $prim;
+ protected $prim;
/** @var bool Скачиваемый (доступен извне) */
- private $download;
+ protected $download;
/**
* Проверяет параметры для файлового поля
@@ -448,8 +448,8 @@ class Scaffold_File extends Scaffold_Field
{
return '<input type="file" name="f'.$this->editName($id).'" />
<input type="hidden" name="'.$this->editName($id).'" value="0" />
- <input type="checkbox" name="'.$this->editName($id).'" value="1" label="Удалить" /> '.
- $this->display($id, $value);
+ <input type="checkbox" name="'.$this->editName($id).'" value="1" label="Удалить" />'.
+ '<div>'.$this->display($id, $value).'</div>';
}
public function validator($id, $value)
@@ -496,4 +496,68 @@ class Scaffold_File extends Scaffold_Field
}
+class Scaffold_Image extends Scaffold_File
+{
+
+ public function display($id, $value)
+ {
+ if (!$value || !is_file($this->path.'/'.$value))
+ return '-нет-';
+ if ($this->download)
+ return '<img src="'.$this->download.'/'.$value.'" />';
+ return $value;
+ }
+
+ public function validator($id, $value)
+ {
+ $res = parent::validator($id, $value);
+ if ($res !== true)
+ return $res;
+ //флаг что удалили
+ if ($value)
+ return true;
+ $ext = $this->getImgType($_FILES['fdata']['tmp_name'][$this->name]);
+ if (!$ext)
+ return 'Картинка должна быть';
+ return true;
+ }
+
+ public function proccess($id, $value, $old)
+ {
+ //если запись удалили
+ if ($value === false)
+ {
+ if (is_file($this->path.'/'.$old))
+ unlink($this->path.'/'.$old);
+ return '';
+ }
+ //оставляем старое значение
+ if ($_FILES['fdata']['error'][$this->name] == 4 && !$value)
+ return $old ? $old : '';
+ //удяляем старый
+ if (is_file($this->path.'/'.$old))
+ unlink($this->path.'/'.$old);
+ //флаг что удалили
+ if ($value)
+ return '';
+ //генерим новое имя
+ $ext = $this->getImgType($_FILES['fdata']['tmp_name'][$this->name]);
+ if ($id == -1)
+ $id = time();
+ $new_name = $this->name.'_'.$id.$ext;
+ move_uploaded_file($_FILES['fdata']['tmp_name'][$this->name], $this->path.'/'.$new_name);
+ return $new_name;
+ }
+
+ private function getImgType($name)
+ {
+ $info = getimagesize($name);
+ if (!$info)
+ return false;
+ $ext = image_type_to_extension($info[2]);
+ return $ext;
+ }
+
+}
+
?>
diff --git a/lib/Modules/Scaffold/ScaffoldController.php b/lib/Modules/Scaffold/ScaffoldController.php
index e99c5ec..d3a8719 100644
--- a/lib/Modules/Scaffold/ScaffoldController.php
+++ b/lib/Modules/Scaffold/ScaffoldController.php
@@ -241,10 +241,10 @@ abstract class ScaffoldController extends Controller
public function newBlock()
{
//инициализация FormPersister
- /* require_once LIBPATH.'/HTML/FormPersister.php';
+ /*require_once LIBPATH.'/HTML/FormPersister.php';
ob_start(array(new HTML_FormPersister(), 'process'));*/
$errors = array();
-
+
//получение дефолтовых значений для новой записи
$data = array();
$fields = array();
@@ -301,19 +301,17 @@ abstract class ScaffoldController extends Controller
//Если ошибок нет, то записываем в базу изменения
if (count($errors) == 0)
{
- $old = QFW::$db->selectRow('SELECT ?# FROM ?# WHERE ?#=?',
- array($this->table=>array_merge($this->order, array('*'))),
- $this->table, $this->primaryKey, $id);
+ $old = $this->getOldVars($id);
//Обработка данных после POST
foreach ($this->fields as $k=>$class)
if ($k == $this->primaryKey && !isset($data[$k]))
continue; //не трогаем первичный ключ
elseif (isset($this->methods['proccess_'.ucfirst($k)]))
$data[$k] = call_user_func(array($this, 'proccess_'.ucfirst($k)),
- isset($data[$k]) ? $data[$k] : $class->def(), $id, $old[$k]);
+ isset($data[$k]) ? $data[$k] : $old[$k], $id, $old[$k]);
else
$data[$k] = $class->proccess($id,
- isset($data[$k]) ? $data[$k] : $class->def(), $old[$k]);
+ isset($data[$k]) ? $data[$k] : $old[$k], $old[$k]);
if ($id == -1)
$ins_id = QFW::$db->query('INSERT INTO ?#(?#) VALUES(?a)',
@@ -341,29 +339,7 @@ abstract class ScaffoldController extends Controller
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'index'))
$this->sess['return'] = $_SERVER['HTTP_REFERER'];
- if ($id == -1)
- {
- //получение дефолтовых значений для новой записи
- $data = array();
- $fields = array();
- //сортированные поля
- foreach($this->order as $f)
- $fields[] = $f;
- //остальные поля
- foreach ($this->fields as $f=>$info)
- if (!isset($fields[$f]))
- $fields[] = $f;
- //вынимаем с учетом default_*
- foreach($fields as $f)
- if (isset($this->methods['default_'.ucfirst($f)]))
- $data[$f] = call_user_func(array(get_class($this), 'default_'.ucfirst($f)));
- else
- $data[$f] = $this->fields[$f]->def();
- }
- else
- $data = QFW::$db->selectRow('SELECT ?# FROM ?# WHERE ?#=?',
- array($this->table=>array_merge($this->order, array('*'))),
- $this->table, $this->primaryKey, $id);
+ $data = $this->getOldVars($id);
$state = new TemplaterState(QFW::$view);
QFW::$view->setScriptPath(dirname(__FILE__));
@@ -385,8 +361,11 @@ abstract class ScaffoldController extends Controller
*/
public function deleteAction($id=0)
{
+ $old = $this->getOldVars($id);
+ if (!$old)
+ QFW::$router->redirect(Url::C('index'), true);
foreach($this->fields as $k=>$v)
- $v->proccess($id, false);
+ $v->proccess($id, false, $old[$k]);
QFW::$db->query('DELETE FROM ?# WHERE ?#=?',
$this->table, $this->primaryKey, $id);
QFW::$router->redirect(Url::C('index'), true);
@@ -628,11 +607,44 @@ abstract class ScaffoldController extends Controller
return $this->fields[$name];
}
+
+ /**
+ * Получает старые значения для записи или дефолтовые для новой
+ *
+ * @param integer $id ID записи
+ * @return array значения
+ */
+ private function getOldVars($id)
+ {
+ if ($id != -1)
+ return QFW::$db->selectRow('SELECT ?# FROM ?# WHERE ?#=?',
+ array($this->table=>array_merge($this->order, array('*'))),
+ $this->table, $this->primaryKey, $id);
+
+ //получение дефолтовых значений для новой записи
+ $data = array();
+ $fields = array();
+ //сортированные поля
+ foreach($this->order as $f)
+ $fields[] = $f;
+ //остальные поля
+ foreach ($this->fields as $f=>$info)
+ if (!isset($fields[$f]))
+ $fields[] = $f;
+ //вынимаем с учетом default_*
+ foreach($fields as $f)
+ if (isset($this->methods['default_'.ucfirst($f)]))
+ $data[$f] = call_user_func(array(get_class($this), 'default_'.ucfirst($f)));
+ else
+ $data[$f] = $this->fields[$f]->def();
+ return $data;
+ }
+
/**
* Генерирует фильтр для запроса
*
* @return array(<br>
- * 'where' => DbSimple_SubQuery сгенерерованное условие с учетом фильтров<br>
+ * 'where' => DbSimple_SubQuery сгенерерованное условие с учетом фильтров<br>
* 'form' => array инпуты формы<br>
* );
*/
-----------------------------------------------------------------------
Summary of changes:
application/helper/controllers/NavController.php | 11 +-
lib/Modules/Scaffold/Fields.php | 129 +++++++-
lib/Modules/Scaffold/ScaffoldController.php | 355 ++++++++++++++++-----
lib/Modules/Scaffold/scaffold/edit.php | 13 +-
lib/Modules/Scaffold/scaffold/fields/dateedit.php | 2 +-
lib/Modules/Scaffold/scaffold/index.php | 39 ++-
lib/Modules/Scaffold/scaffold/info.php | 9 +
lib/Modules/Scaffold/scaffold/multidel.php | 43 +++
lib/Modules/Scaffold/scaffold/multiedit.php | 50 +++
www/built-in/scaffold.css | 14 +-
www/built-in/scaffold.js | 9 +
11 files changed, 551 insertions(+), 123 deletions(-)
create mode 100644 lib/Modules/Scaffold/scaffold/info.php
create mode 100644 lib/Modules/Scaffold/scaffold/multidel.php
create mode 100644 lib/Modules/Scaffold/scaffold/multiedit.php
create mode 100644 www/built-in/scaffold.js
hooks/post-receive
--
quickfw
|