jqGridPHP - таблицы на ajax без головной боли

acanthis

Новичок
Можно. Из-за особенностей CSS таблиц, проще всего в parseRow вызывать php-функцию wordwrap и явно переносить символом \n.
Есть и другие варианты, но с этим меньше всего проблем.


Конечно - это же jQuery.
Через editoptions.dataInit вешаем jQuery UI Autocomplete или любой другой плагин на элемент формы.
Еще раз огромное спасибо!
У меня тут странный глюк появился, ничего понять не могу. Создаю новую таблицу, все как положено, но после добавления или редактирования записи таблица оказывается пустой, пока не сделаешь F5, после этого все записи видны новые\измененные. всю голову сломал уже... ничего не понимаю. нажатие кнопки Обновить тоже не дает результатов. В firebug-е все ок
 

~WR~

Новичок
Вероятно, добавлен какой-то обработчик события, который завершается некорректно, либо возвращает не то, что ожидается.
Например, есть события, которые ожидают массив из 2-3 элементов, а получают, например, false.

Вытаскивайте пример в интернет - посмотрим. :)
 

acanthis

Новичок
Вероятно, добавлен какой-то обработчик события, который завершается некорректно, либо возвращает не то, что ожидается.
Например, есть события, которые ожидают массив из 2-3 элементов, а получают, например, false.

Вытаскивайте пример в интернет - посмотрим. :)
таблица:
PHP:
<?php
class driver extends jqGrid
{
    protected function init()
    {	
		$this->nav = array(
			'add'       => true,
			'edit'      => true,
			'del'       => true,
			'addtext'   => 'Добавить',
			'edittext'  => 'Редактировать',
			'deltext'   => 'Удалить',
		);
		
		$this->render_filter_toolbar = true;
		$this->table                   = 'driver_table';
		$this->cols_default            = array('editable' => true);
		$this->options                 = array('caption' => 'Таблица водителей');
		
        $this->cols         = array(
			'id'    => array(
								   'hidden' => true,
                                   ),
            'driver'   => array('label' => 'Водитель',
                                   'width' => 40,
								   'editrules' => array('required' => true),
                                   'editable' => true,
                                   ),
        );
		
		 $this->render_filter_toolbar = true;
    }
}
?>
скрипт:
PHP:
<script>
<?= $rendered_grid ?>
$grid.filterToolbar();
</script>
Собственно и всё.
 

acanthis

Новичок
Ребят, помогите, пожалуйста, примером с autocomplete-ом на ввод данных. Нигде не могу найти пример для jqGridPHP ((
 

acanthis

Новичок
Можно. Из-за особенностей CSS таблиц, проще всего в parseRow вызывать php-функцию wordwrap и явно переносить символом \n.
Интересно, а как узнать когда переносить строку, если autowidth установлено в true? Другими словами ширина таблицы меняется в зависимости от разрешения.
 

~WR~

Новичок
Добавьте CSS куда-нибудь после основой таблицы стилей.
PHP:
.ui-jqgrid tr.jqgrow td {white-space: pre-wrap;}
или
PHP:
.ui-jqgrid tr.jqgrow td {white-space: pre-line;}
В IE 6 не работает и может быть причиной проблем при использовании хитрых форматтеров или функции scroll rows.
Но, в общем случае, все должно быть ок.
 

~WR~

Новичок
Про автокомплит. Как вариант - возьмите пример отсюда:
http://jqueryui.com/demos/autocomplete/

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

acanthis

Новичок
Ничего не выходит (((

получилось сделать рабочий autokomplete, вставляю код в грид и получаю ошибку что не хватает ")" в посл. строке.

PHP:
 'editoptions' =>  array( 'dataInit' => '
$(function() {
  $("#customer").autocomplete({
    source: function(request,response) {
      $.ajax({
        url: "get_empl.php",
        dataType: "json",
        data: {
          term: request.term
        },
        success: function(data){
         response( $.map( data, function( item ) {
            var text = item
            if (text="Ничего не найдено") { text='' }
            return{
               label: item,
               value: text
            }
         }));
      }
      });
    },
    minLength: 1
  });
});'
Или я не правильно делаю, может нужно делать по аналогии с календарем? Если да, то там черт ногу сломит...
 

~WR~

Новичок
PHP:
$ac_code = <<<'JS'
function(el) {
    $(el).autocomplete({...});
}
JS;

...

'dataInit' => new jqGrid_Data_Raw($ac_code);
 

acanthis

Новичок
get_empl.php
PHP:
header('Content-Type: text/html; charset=utf-8');
if ($_GET["term"]) {

	$host = "localhost";
    $user = "root";
    $password = "";
    $database = "rashod";
    $param = $_GET["term"];
   
   $server = mysql_connect($host, $user, $password) or die('error');
   $connection = mysql_select_db($database, $server) or die('error');
   mysql_query("SET CHARACTER SET 'utf8'") or die('error');
   
   $query = mysql_query("SELECT * FROM `driver_table` WHERE `driver` LIKE '".$param."%'") or die('error');
   
   for ($x = 0, $numrows = mysql_num_rows($query); $x < $numrows; $x++) {
      $row = mysql_fetch_assoc($query);
      $array[$x] = $row['driver'];
   }
   
  // if ($array == NULL) $array[0] = "Ничего не найдено";
   echo json_encode($array);
   
   mysql_close($server);
   
}
JS
PHP:
	function(el) {
    $(el).autocomplete({
    source: function(request,response) {
      $.ajax({
        url: "get_empl.php",
        dataType: "json",
        data: {
          term: request.term
        },
        success: function(data){
         response( $.map( data, function( item ) {
            var text = item
            return{
               label: item,
               value: text
            }
         }))
      }
      })
    },
 })
  }
Вроде все работает пока не начнем искать кириллицой (возвращает null). Подозреваю что какие то заморочки с кодировкой в JSON....
 

acanthis

Новичок
get_empl.php
PHP:
header('Content-Type: text/html; charset=utf-8');
if ($_GET["term"]) {

	$host = "localhost";
    $user = "root";
    $password = "";
    $database = "rashod";
    $param = $_GET["term"];
   
   $server = mysql_connect($host, $user, $password) or die('error');
   $connection = mysql_select_db($database, $server) or die('error');
   mysql_query("SET CHARACTER SET 'utf8'") or die('error');
   
   $query = mysql_query("SELECT * FROM `driver_table` WHERE `driver` LIKE '".$param."%'") or die('error');
   
   for ($x = 0, $numrows = mysql_num_rows($query); $x < $numrows; $x++) {
      $row = mysql_fetch_assoc($query);
      $array[$x] = $row['driver'];
   }
   
  // if ($array == NULL) $array[0] = "Ничего не найдено";
   echo json_encode($array);
   
   mysql_close($server);
   
}
JS
PHP:
	function(el) {
    $(el).autocomplete({
    source: function(request,response) {
      $.ajax({
        url: "get_empl.php",
        dataType: "json",
        data: {
          term: request.term
        },
        success: function(data){
         response( $.map( data, function( item ) {
            var text = item
            return{
               label: item,
               value: text
            }
         }))
      }
      })
    },
 })
  }
Вроде все работает пока не начнем искать кириллицой (возвращает null). Подозреваю что какие то заморочки с кодировкой в JSON....
Такс, с кодировкой разобрался, теперь застрял на чувствительности к регистру у autocomplete :)
 

acanthis

Новичок
Такс, с кодировкой разобрался, теперь застрял на чувствительности к регистру у autocomplete
Всё!!! Победил я автокомплит )) Оказывается для регистронезависимого поиска у поля должна быть кодировка 'utf8_general_ci'
~WR~ Вам, еще раз огромное спасибо за помощь и за jqGridPHP. Действительно очень мощный инструмент вы сделали ):))
 

MiksIr

miksir@home:~$
А как дела обстоят с один-ко-многим, eсть какие-то наработки? Т.е. понятно, что для вывода можно джойн нарисовать. Интересует возможность добавления/редактирования с выбором по связанной таблице, ну и добавлению в эту связанну таблицу новых значений.
 

acanthis

Новичок
Уважаемый ~WR~. Подскажите, как же все таки решить проблему с календарем? Вот код:
PHP:
	'editoptions' => array('defaultValue' => date("d.m.Y") ,'dataInit' => $this->initDatepicker(array(
											'dateFormat'      => 'dd.mm.yy',	
											'changeMonth'     => true,
											'changeYear'      => true,
											'showOn'          => "button",
											'buttonImage'     => "client/calendar.gif",
											'buttonImageOnly' => true,
											'firstDay'        => '1', 
											'monthNamesShort' => array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"),
											'dayNamesMin'     => array("Вс","Пн","Вт","Ср","Чт","Пт","Сб"),
									))),
Но картинка справа не появляется. такое ощущение что эти три параметра, отвечающие за отображение кнопки\картинки игнорируются... Помогите разобраться.
P.S. Картинка по этому пути есть 100%. По идеи к календарю должен добавляться тэг <img> с этой картинкой, но этого не происходит.
 

4aki.zp

Новичок
Уважаемый ~WR~. Подскажите, как же все таки решить проблему с календарем? Вот код:
PHP:
	'editoptions' => array('defaultValue' => date("d.m.Y") ,'dataInit' => $this->initDatepicker(array(
											'dateFormat'      => 'dd.mm.yy',	
											'changeMonth'     => true,
											'changeYear'      => true,
											'showOn'          => "button",
											'buttonImage'     => "client/calendar.gif",
											'buttonImageOnly' => true,
											'firstDay'        => '1', 
											'monthNamesShort' => array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"),
											'dayNamesMin'     => array("Вс","Пн","Вт","Ср","Чт","Пт","Сб"),
									))),
Но картинка справа не появляется. такое ощущение что эти три параметра, отвечающие за отображение кнопки\картинки игнорируются... Помогите разобраться.
P.S. Картинка по этому пути есть 100%. По идеи к календарю должен добавляться тэг <img> с этой картинкой, но этого не происходит.
Попробуйте в 'buttonImage' => "", указать полный путь к файлу
 

acanthis

Новичок
Как можно реализовать копирование записи? Т.е. чтобы при нажатии кнопки открывалось окошко добавление записи с заполнеными полями из запроса типа:
PHP:
$this->dbQuery("INSERT INTO {$this->tblName} SELECT * FROM {$this->tblName} WHERE id = 2");
 

4aki.zp

Новичок
проблема с setColoms, делаю так
PHP:
jQuery("#list").jqGrid('navButtonAdd','#pager',{
												  caption : '',
	                                              title: 'Выбрать столбцы',
	                                              buttonicon: 'ui-icon-wrench',
	                                              onClickButton: function() {
															var params = {width:500,modal:true,drag:true};
															jQuery("#list").setColumns(params);
															},
	                                              position:'last'
									});
по нажатию на кнопку ничего не происходит в чем может быть проблема?
 

~WR~

Новичок
А как дела обстоят с один-ко-многим, eсть какие-то наработки?
Вот прямо готового решения, чтобы указать пару настроек, и всё с ходу работает - нет.
Но есть два возможных варианта реализации.

1. При двойном клике на строке основной таблицы открываем диалоговое окно с другой таблицей, в которой уже редактируем связи.
2. Subgrid: http://jqgrid-php.net/examples/?render=jqMiscSubgrid (кликните на первом плюсике)

Если речь просто о том, чтобы работать с join'ами, то еще проще.
Перегружаем стандартные операции opEdit, opIns и opDel - добавляем в них свою логику, чтобы они обновляли сразу несколько таблиц так, как нужно вам.
В формах редактирования можно динамически формировать select'ы, в том числе ajax-запросом. Где-то выше по теме описано, как это можно сделать.

Какое-то общее "silver bullet" решение тут не имеет смысла, т.к. всем нужно разное.

acanthis, все как и раньше. Сначала делаем ручками в консоли firebug. Смотрим, появилась ли иконка. Если не появилась, то почему.
Когда вручную все будет работать - только тогда переносим код в php.
Хотя, на мой взгляд, лучше клиент-сайд оставить на клиенте, а на сервере пусть будет только сервер. Потом сильно проще поддерживать.

Как можно реализовать копирование записи? Т.е. чтобы при нажатии кнопки открывалось окошко добавление записи с заполнеными полями из запроса типа:
Лучше всего повесить event на открытие формы. И в нем делать либо ajax-запрос на сервер, либо выбирать уже загруженную строку из самого грида, если она есть - функция getRowData, кажется.
После получения данных - заполняем форму через jQuery. Прямо $(form).find('#foo').val(foo);

PHP:
проблема с setColoms, делаю так
setColumns помечены как deprecated с версии 4.0. Используйте современную замену - columnChooser.
Почитать можно здесь: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:jquery_ui_methods
Не забудьте подключить jQuery UI.
 
Сверху