CGridView ajax редактирование
CGridView ajax редактирование
Я не смог найти в интернете решение проблемы. У меня есть таблица построенная с помощью CGridView. И там много записей.
Если возможность при клике на запись в строке делать из нее input и после редактирования убрав курсор с поля отправить ajax запрос с измененными данными.
Как можно так сделать?
Если возможность при клике на запись в строке делать из нее input и после редактирования убрав курсор с поля отправить ajax запрос с измененными данными.
Как можно так сделать?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: CGridView ajax редактирование
Где-то тут было расширение на тему: http://www.yiiframework.com/extensions/
Нравится Yii? Давайте сделаем его лучше!.
Re: CGridView ajax редактирование
Хотя бы немного подскажите как и где искать. Там много очень расширений
Re: CGridView ajax редактирование
Я сделал без расширений:
В view
ниже в view
jquery.jeditable.mini.js брать тут http://www.appelsiini.net/projects/jeditable
Класс Tools лежит в components
Action
Вот как-то так
В view
Код: Выделить всё
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'modelGrid',
'dataProvider' => $provider,
'afterAjaxUpdate'=>'function(id, data) { setInlineEdit(); }',
'columns' => array(
array('name'=>'name', 'type'=>'raw', 'value'=>'Tools::inlineEdit($data, "name")'),
array('name'=>'description', 'type'=>'raw', 'value'=>'Tools::inlineEdit($data, "description", "textarea")'),
// и так далее
Код: Выделить всё
<?php $cs = Yii::app()->getClientScript();
$cs->registerScriptFile(Yii::app()->baseUrl.'/js/jquery.jeditable.mini.js');
?>
<?php $cs->registerScript('inline', "
function setInlineEdit() {
$('.inlineEdit').each(function(){
var params = {field: $(this).attr('field')};
var type = $(this).attr('type');
var s = '', c = '';
if(type=='textarea' ) {
s = 'OK';
c = 'Cancel';
}
$(this).editable('/backend/item/field', {
placeholder : '---',
indicator : 'Сохраняем...',
tooltip : 'Кликните, чтобы редактировать',
type : type,
rows: 3,
cols: 30,
submit : s,
cancel : c,
width: '100px',
submitdata : params,
callback : function(value, settings) {
$.fn.yiiGridView.update('modelGrid',{data:{ }});
}
});
});
}
$(function(){
setInlineEdit();
});
");
?>
Класс Tools лежит в components
Код: Выделить всё
class Tools {
static public function inlineEdit($data, $field, $type='text') {
return '<div class="inlineEdit" id="' . $data['id'] . '" field="'.$field.'" type="'.$type.'">' . $data[$field] . '</div>';
}
}
Код: Выделить всё
public function actionField() {
if (isset($_POST['field'])) {
$field = $_POST['field'];
if (isset($_POST['id'])) {
$model = CActiveRecord::model($this->modelName)->resetScope()->findByPk($_POST['id']);
if ($model != null) {
$model->$field = $_POST['value'];
$model->save();
Yii::app()->end();
}
}
}
}
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: CGridView ajax редактирование
Тоже использую jeditable, но получается что для каждого атрибута нужно будет заводить свой экшн, как-то это накладно вы не находите? Как с этим справляетесь?
Re: CGridView ajax редактирование
Так мне нужно что бы вся строка с данными "превратилась" в inputs. А не по отдельности каждая ячейка в строке
Re: CGridView ajax редактирование
Экшн один, я же передаю имя атрибута, и используюnizsheanez писал(а):Тоже использую jeditable, но получается что для каждого атрибута нужно будет заводить свой экшн, как-то это накладно вы не находите? Как с этим справляетесь?
Код: Выделить всё
$model->$field = $_POST['value'];
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: CGridView ajax редактирование
ARACOOL - можно сделать это с jeditable, просто нужно отключить сохранение по onblur и добавить сохранение по клику на какую-нибудь кнопку. В примерах jeditable есть сэйв по кнопке.
Вот только вопрос целесообразности: если никто не собирается одновременно редактировать 2 инпута, зачем нужны 2 инпута? Кликнул отредактировал. В чем смысл сразу всю строку превращать в инпут?
Еще обходной вариант: Можно в popup вывести форму редактирования.
navy - Вообще что смущает в таком подходе: я могу откуда угодно отредактировать любое поле любой записи для заданной модели - это как бы не есть гуд с точки зрения безопасности. А если еще и название модели передовать, так тогда можно вообще все что угодно изменить, хоть пароль админа.
Вот и вопрос: можно ли как-то заткнуть эту дырку и одновременно сделать возможность не плодить одинаковые экшены в каждом контроллере админском?
Вот только вопрос целесообразности: если никто не собирается одновременно редактировать 2 инпута, зачем нужны 2 инпута? Кликнул отредактировал. В чем смысл сразу всю строку превращать в инпут?
Еще обходной вариант: Можно в popup вывести форму редактирования.
navy - Вообще что смущает в таком подходе: я могу откуда угодно отредактировать любое поле любой записи для заданной модели - это как бы не есть гуд с точки зрения безопасности. А если еще и название модели передовать, так тогда можно вообще все что угодно изменить, хоть пароль админа.
Вот и вопрос: можно ли как-то заткнуть эту дырку и одновременно сделать возможность не плодить одинаковые экшены в каждом контроллере админском?
Re: CGridView ajax редактирование
Для безопасности этот экшн разрешен только админам, а чтобы не плодить его в каждом классе, нужно сделать его в виде отдельного класса и подключать в нужных контроллерах.nizsheanez писал(а): navy - Вообще что смущает в таком подходе: я могу откуда угодно отредактировать любое поле любой записи для заданной модели - это как бы не есть гуд с точки зрения безопасности. А если еще и название модели передовать, так тогда можно вообще все что угодно изменить, хоть пароль админа.
Вот и вопрос: можно ли как-то заткнуть эту дырку и одновременно сделать возможность не плодить одинаковые экшены в каждом контроллере админском?
Re: CGridView ajax редактирование
Или не в popup выводить, а при клике на любое поле в гриде, вместо текущей строки подгружать форму для редактирования, как сделано, например, в chive. Но тоже небезпроблемно получается, так как с валидацией придется заморочитсяnizsheanez писал(а):ARACOOL - можно сделать это с jeditable, просто нужно отключить сохранение по onblur и добавить сохранение по клику на какую-нибудь кнопку. В примерах jeditable есть сэйв по кнопке.
Вот только вопрос целесообразности: если никто не собирается одновременно редактировать 2 инпута, зачем нужны 2 инпута? Кликнул отредактировал. В чем смысл сразу всю строку превращать в инпут?
Еще обходной вариант: Можно в popup вывести форму редактирования.
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: CGridView ajax редактирование
Не только админам. Например есть редакторы у новостных порталов, которым разрешено редактировать свой раздел сайта.navy писал(а): Для безопасности этот экшн разрешен только админам
Это само сабой. Но, даже этот подключаемый экшн таскать с собой не хочется. Это тоже повторяемость кода, хоть и оправданная.navy писал(а): а чтобы не плодить его в каждом классе, нужно сделать его в виде отдельного класса и подключать в нужных контроллерах.
Есть еще идеи?
Re: CGridView ajax редактирование
Скажем так, любому необходимому подмножеству пользователейnizsheanez писал(а): Не только админам. Например есть редакторы у новостных порталов, которым разрешено редактировать свой раздел сайта.
Какой-то код все равно нужно писать, можно создать его в контроллере от которого наследуются backend контроллеры, тогда и подключать не придется, но тут другая проблема, как отключить там где этот экшн не нужен.nizsheanez писал(а): Это само сабой. Но, даже этот подключаемый экшн таскать с собой не хочется. Это тоже повторяемость кода, хоть и оправданная.
Есть еще идеи?
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: CGridView ajax редактирование
Ладно, с этим ясно.
А как разрешить редактировать данной роли, один атрибут и запретить другой?
А как разрешить редактировать данной роли, один атрибут и запретить другой?
Re: CGridView ajax редактирование
Например завести в контроллере массив атрибутов, которые можно редактировать и при попытке редактировать проверять на наличие атрибута в списке, это кстати и решит проблему с запрещением там где не нужно.nizsheanez писал(а):Ладно, с этим ясно.
А как разрешить редактировать данной роли, один атрибут и запретить другой?
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: CGridView ajax редактирование
че-нить вида attribute=>role.... может быть.
Re: CGridView ajax редактирование
atribut->array(role,...) так наверноеnizsheanez писал(а):че-нить вида attribute=>role.... может быть.
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: CGridView ajax редактирование
я бы реализовал через сценарии, они очень хороши для обеспечения безопасности, безопасными атрибутами защищаете поля которые нельзя редактировать по сценарию jeditеtable, ну и проверку в экшене на то может ли данный юзер чтото делать в этом экшене
Re: CGridView ajax редактирование
Использую jeditеtable, как в примере выше.Все работает отлично, но после $.fn.yiiGridView.update('modelGrid',{data:{ }}); , компонент перестает работать. Т.е. когда на него нажимаешь то ничего не происходит.подскажи в чем может быть проблема???