Показаны сообщения с ярлыком tips and tricks. Показать все сообщения
Показаны сообщения с ярлыком tips and tricks. Показать все сообщения

понедельник, 25 ноября 2013 г.

Using Grep command for search in project sources

Problem: fast search some code blocks in big projects with lots of nested directories using command-line tools.

Solving: you need grep command. Its really great tool for search text in files with regular expressions, coming from Unix OS and now available on Windows, *nix and Mac OS. All you need is:

grep -rin --include="*.php" "function Action(" /path/to/directory/

So, let's consider parameters passed to grep command:

  • -r — the search will be recursive, that is in all subdirectories in our main directory
  • -i — the search will be case insensitive
  • -n — output will contain line numbers
  • --include="*.php" — search will be only in files that has php extension. Of course, available all regular expressions for describing needed file names
  • "function Action(" — needed text
  • /path/to/directory — directory for search accordingly

If you need just filenames without in-line matches, you can use parameter -l:

grep -rinl --include="*.php" "function Action(" /path/to/directory/

That's all - good luck in your search:)

среда, 28 марта 2012 г.

Search & delete thumbs.db commands for Windows

Search all hidden Thumbs.db in current folder and its subfolders:
dir Thumbs.db /s /ah
Recursively delete all Thumbs.db in current folder:
del / S / AR / AS / AA / AA Thumbs.db

понедельник, 15 августа 2011 г.

ExtJS: разработка интерфейса независимо от источников данных. Кросс-доменный AJAX для загрузки хранилищ

Удаленные источники для хранилищ ExtJS - это источники, расположенные в другом домене или, как их еще называют, кросс-доменные источники. Вероятно, вы знаете о том, что традиционные XMLHttpRequest запросы (известные в народе как AJAX запросы) имеют ряд ограничений, связанных в первую очередь с безопасностью - в частности, XMLHttpRequest запросы могут быть посланы только к адресу с одноименным протоколом, доменом и портом по отношению к запрашивающей странице. Таким образом, нельзя сделать традиционный AJAX запрос с сайта site1.com к сайту site2.com.

Тем не менее, такая необходимость часто возникает, в таких случаях используется так называемый cross-domain  (кросс-доменный) AJAX. Стоит отметить, что непосредственно к AJAX эти технологии уже не относятся, название в данном случае - не более, чем дань традиции. О методах, используемых в кросс-доменных запросах, можно почитать, например, в статье на javascript.ru.

Одной из проблем разработки интерфейсов на ExtJS является зависимость от динамически загружаемых данных: фактически, большинство компонентов фреймворка используют те или иные данные, получаемые при помощи AJAX запросов. Например, так выглядит традиционное описание хранилища:

myStore = new Ext.data.JsonStore({
    url:    'getUsers',
    method: 'POST',
    root: 'items',
    fields: [{name:"id"},{name:"name"}]
});

URL, указанный первым параметром, ссылается на страницу того же домена, в котором должна находиться разрабатываемая страница, иначе AJAX запрос на загрузку данных не сможет быть произведен. Таким образом, разрабатываемая html страница и javascript код в ее составе должны быть частью домена-источника данных. Это не всегда удобно и не всегда возможно.

Использование кросс-доменных запросов в таких случаях - отличное решение. Посмотрите, как просто можно заставить работать ExtJS приложение с данными любого домена:

myStore = new Ext.data.JsonStore({
    proxy: new Ext.data.ScriptTagProxy({
            url:    'http://vasilij.com/getUsers',
    }),
    method: 'POST',
    root: 'items',
    fields: [{name:"id"},{name:"name"}]
});

В код сервлета необходимо добавить отслеживание GET параметра callback. Дело в том, что при использовании ScriptTagProxy, ExtJS добавляет в строку запроса параметр callback, таким образом, что в нашем случае запрос будет иметь вид:

http://vasilij.com/getUsers&callback=stcCallback10

Возвращаемый JSON должен быть обернут в функцию, название которой соответствует переданному параметру callback. В случае сервлета:

String callback = request.getParameter("callback");
if (callback == null){
  response.setContentType("text/javascript");
  out.println(jsonString);
}
else{
  response.setContentType("application/x-json");
  out.println(callback.concat("(").concat(jsonString).concat(")"));
}

Таким образом, при отсутствии callback параметра в строке запроса возвращается обычный JSON, в противном случае JSON оборачивается в функцию.

После внесения в код приложения описанных изменений можно разрабатывать интерфейс абсолютно независимо от всей остальной части приложения; сервлеты-поставщики данных могут находиться в любом домене, и даже простая html страница на рабочем столе с подключенным ExtJS сможет получать данные и корректно их обрабатывать и отображать. После окончания процесса разработки и тестирования можно заменить Ext.data.ScriptTagProxy на Ext.data.HttpProxy для использования AJAX запросов.

Приятного кодинга вам!

среда, 3 августа 2011 г.

Использование dbms_output в SQL*Plus и производных продуктах

При разработке на PL/SQL в SQL*Plus или продуктах, его использующих, часто возникает необходимость использования вывода результатов не в табличном, а простом, текстовом виде. Для этого используется PL/SQL пакет dbms_output.

Например, чтобы вывести строку 'Hello, World!', необходимо написать следующий код:

dbms_output.put_line('Hello, World!');

Код корректен - однако, приветствие миру вы, вероятно, не увидите. Для включения вывода пакета dbms_output необходимо добавить следующую строку:

set serveroutput on

Теперь можно использовать dbms_output на всю катушку:

set serveroutput on
begin
  for x in (select id, name from authors) loop
    dbms_output.put_line('Автор ' || rpad(x.name, 30) || ' имеет идентификатор ' || x.id);
  end loop;
end;

При выводе больших строк, возможно, вы столкнетесь с ошибкой buffer overflow, limit of 20000 bytes, сообщающую о переполнении буфера в 20000 байт. Для увеличения размера буфера можно использовать следующую команду:

DBMS_OUTPUT.ENABLE(500000);

Удачного дебага!

среда, 29 июня 2011 г.

Парсим текст из .doc файла


Задача получения текста из .doc файла возникает нередко и способов решения масса - это и COM объекты под Windows, и сухие реализации на чистом php (хорошие и не очень), и разнообразные библиотеки для всех мыслимых и нет языков программирования. Однако хакерский подход, как известно, заключается в максимальной простоте, универсальности и обходе большинства проблем в лоб:). Поэтому воспользуемся готовым проверенным временем и миллионами мух решением - Antiword.

Antiword - консольная утилита для получения plain текста из файлов Microsoft Word версий 2, 6, 7, 97, 2000, 2002 и 2003. Иными словами, с новым форматом docx Antiword не работает, и если есть необходимость интегрирации с ним, придется искать другое решение. Я писал парсер doc файлов для загрузки данных в БД, поэтому мою задачу утилита решает на ура.

Итак, скачать Antiword можно на официальном сайте - есть версии для Windows и Linux. Качаем архив, распаковываем его в C:\Antiword\ (я буду рассматривать Windows, Linux команды аналогичны), запускаем консоль. Тестим!

C:\Antiword\antiword.exe C:\myDocument.doc

Собственно все уже работает - неплохо для одной простой команды, верно? Здесь C:\myDocument.doc это документ, текст которого нас интересует. При таком вызове команды результат работы будет полностью выведен в консоль, причем не всегда в приятной кодировке. Чтобы настроить вывод текста в кодировке cp1251 (стандартная кодировка для кириллицы в Windows), необходимо модифицировать команду следующим образом:

C:\Antiword\antiword.exe -m cp1251.txt C:\myDocument.doc

Теперь текст выводится в кодировке cp1251. Все равно крякозябры? Да у вас не настроена консоль, батенька! Исправляем установкой шрифта терминала Lucida Console и выполнением команды:

chcp 1251

Теперь все ок? Так-то. Хорошо, но как вывести plain текст в файл? О, да вы еще и о перенаправлении стандартного вывода в файл не слышали:)

C:\Antiword\antiword.exe -m cp1251.txt C:\myDocument.doc >> C:\plainText.txt

Теперь текст из вордовского файла C:\myDocument.doc магическим образом помещен в txt документ C:\plainText.txt.

В процессе конвертирования Antiword старается сохранить форматирование текста максимально близко к оригиналу. В частности, он вставляет переносы строк в соответствии со стандартной шириной страницы, изменить это поведение можно указанием параметра -w, который принимает количество символов в одной строке. Указав 0, мы отключаем режим переноса строк и все абзацы будут помещены в одну длинную строку:

C:\Antiword\antiword.exe -m cp1251.txt -w 0 C:\myDocument.doc >> C:\plainText.txt

В случае необходимости использования функционала Antiword в своей программе, просто вызывайте эту команду с подстановкой нужных параметров и считывайте результат из текстового файла или стандартного вывода. В случае php:

$fileContent = shell_exec("C:\Antiword\antiword.exe -m cp1251.txt -w 0 C:\myDocument.doc");

Таким образом, в переменную $fileContent будет загружен полный текст документа в виде строки. Для вашего языка программирования воспользуйтесь аналогичной функцией вызова системных команд.

И не забывайте принцип KISS - Keep It Simple, Stupid:)

Настройка кодировки консоли Windows


Проблема: полностью описана на картинке выше. Задача формулируется в получении из картинки слева картинки справа:). Предполагается, что выводимый текст находится в кодировке Windows-1251 (cp1251), вывод текста в соответствующей кодировке из программы является задачей непосредственно программы, в статье рассматривается вопрос отображения текста консолью.

Решение.

1. Выполните в консоли следующую команду

chcp 1251

2. Смените шрифт консоли на Lucida Console.

Вуаля!

Windows: deletion of service

Problem: some ugly Windows programs (such as Mail.ru Guard, i hate it!) use technology of services for permanent keeping its own code in RAM. It means that useless program spends your memory and it is a natural desire to delete it. But in case of mentioned Mail.ru Guard (and some other soft) simple operation of program removing don't removes the service and it will start every time with Windows.

But dont worry! There is simple method to stop and delete haunting service:)

Solution.

Run terminal as Administrator and perform this code:

sc delete service_name

where service_name is name of ugly service. For example:

sc delete "Guard.Mail.ru"

Be happy!

вторник, 21 июня 2011 г.

Vim: separate .swp files and sources of project


Do you want separate .swp files of Vim and source files of your project? Nothing is easier! Simple add in your .vimrc file this line:
set directory=C:\Temp\

четверг, 9 июня 2011 г.

ExtJS 3 grid colspan или группировка колонок



Задача: необходимо объединить несколько колонок таблицы grid. В чистом HTML для этого существует атрибут colspan, но как реализовать это в элементах ExtJS?
В данной статье рассматривается третья версия ExtJS.

Решение.

Необходимо воспользоваться плагином ColumnHeaderGroup, пример использования которого можно посмотреть здесь.

Итак, для осуществления группировки колонок, необходимо:

  1. подключить js файл плагина (ColumnHeaderGroup.js)
  2. в коде Ext.onReady() описать заголовок таблицы следующим образом:

    // объявляем массив для хранения первой строки заголовка
    var row1 = [];
    // заполняем его
    row1.push({
      header: ''
    });
    row1.push({
      header: 'Ставка, руб./1 GT',
      colspan: '3',   // да-да, это аналог того самого colspan
      align: 'center' // выравнивание текста в ячейке
    });
  3. создать заголовок таблицы, используя плагин:

    groupedRows = new Ext.ux.grid.ColumnHeaderGroup({
      rows: [ row1 ]
    });

    В случае, если таких строк с объединенными колонками будет несколько - просто перечислите их черех запятую в массиве rows:

    groupedRows = new Ext.ux.grid.ColumnHeaderGroup({
      rows: [ row1, row2, row3 ]
    });


  4. подключить инициализированный плагин к таблице grid:

    grid = new Ext.grid.GridPanel({                
      xtype: 'grid',
      store: companiesStore,
      plugins: [ groupedRows ],
      border: false, frame: false,
      columns: columnModel
    });

Таким образом, заголовок таблицы делится на 2 типа строк - самая нижняя строка, описываемая в параметре columns модели GridPanel согласно всем стандартным правилам описания колонок таблицы grid, и все остальные строки, располагающиеся выше и объединяющие колонки при помощи плагина. Закомментируйте строку plugins: [ groupedRows ] и в заголовке останется только одна строка, нижняя, все верхние строки должны описываться как показано выше при инициализации плагина.

Описанный способ позволяет создавать сколь угодно сложные структуры заголовков таблиц.

понедельник, 23 мая 2011 г.

ExtJS 3 суммирование строк таблицы Grid


Рассматриваемая сегодня задача встречается очень часто: необходимо добавить в таблицу Grid дополнительную строку, которая будет выводить сумму значений из расположенных выше строк. В статье рассматривается ExtJS 3, в новой четвертой версии описанный функционал уже включен в ядро и хорошо документирован.


Создано несколько версий плагина GridSummary с различными доработками, они описаны здесь. Примеры использования плагина можно посмотреть в исходном варианте плагина здесь, но в проекте лучше использовать финальную на момент написания статьи версию. Да, для загрузки файлов необходимо зарегистрироваться на официальном форуме разработчкиков ExtJS (http://www.sencha.com/forum/), если вы до сих пор этого не сделали.

Ниже описан процесс подключения и конфигурирования плагина.

Первым шагом является подключение css и js файлов:

<link rel="stylesheet" href="gridsummary.css"/>
<script src='./js/gridsummary.js'></script>

Обратите внимание, что оба файла необходимо подключать после всех файлов самого ExtJS.

Вторым шагом является подключение плагина в теле функции onReady():

var summary = new Ext.ux.grid.GridSummary();
formDataGrid = new Ext.grid.EditorGridPanel({
  plugins: [ summary ],  store: myStore,
  cm: [
    {
      header: 'Компания',
     dataIndex: 'comp',
      summaryRenderer: function(){ return 'Всего: ';}
    }
    {
      header: 'Цена',
      dataIndex: 'price' ,
      summaryType: 'sum'
    },
    {
      header: 'Цифра какая-то',
      dataIndex: 'someInt',
      summaryType: 'avg'
    }
    //...
  ]

Как вы видите, все довольно просто. Вы указываете плагин summary и в описание ColumnModel добавляете описание параметров работы плагина. Основных параметра два - это summaryType, определяющий тип обработки данных (суммирование sum, вычисление среднего avg, подсчет количества строк count и др.) и summaryRenderer - функция-рендер для ячейки строки суммы, в случае указания  она определяет итоговый состав и стиль выводимых данных.

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

...
summaryRender: function pctChange(val) {
  if (val > 0) {
    return '<span style="color: green;">' + val + '%</span>';
  } else if(val < 0) {
    return '<span style="color: red;">' + val + '%</span>';
  }
  return val;
}
...

Успехов!

ExtJS найти элемент и изменить его содержимое

Задача: необходимо на лету по ID элемента изменить его содержимое. Например, моей задачей было изменение текста ссылки, позволяющей сворачивать и разворачивать элемент на странице. Когда элемент свернут, текст ссылки должен быть "развернуть", когда развернут - соответственно, "свернуть".

Подобные задачи легко решаются любым современным Javascript фреймворком. В случае ExtJS изменение содержимого элемента с id area будет выглядеть так:

Ext.fly('toggleLink').update('Свернуть описание');

Найти элемент по его классу также несложно, можно воспользоваться полноценным CSS селектором:

var parent = Ext.get("IdOfParent");
var aHrefs = parent.select("div.myCoolDivClass a").elements;

среда, 18 мая 2011 г.

Vim переместить вкладку



Проблема: в GVim необходимо переместить вкладку (таб) вправо или влево.

Решение:

tabmove 3

Здесь 3 - номер, куда необходимо переместить вкладку. Вместо tabmove можно использовать сокращение tabm.

Перемещаться между вкладками можно сочетанием gt и gT (вправо и влево соответственно) или Ctrl+Page_Down и Ctrl+Page_Up.

PS. Я люблю vim, да.

понедельник, 25 апреля 2011 г.

Грамотно убиваем Backdoor.Win32.Shiz

Мой рабочий ноутбук поразил неизвестный мне вирус:) Знаете, ковырять вирусы для меня - это как решать некую головоломку или, скажем, японский кроссворд разгадывать. Весьма увлекательное занятие, стоит сказать!

На ноутбуке стоит корпоративный Symantec, который, как оказалось, не предоставляет должной защиты. Все началось с пресловутого подтормаживания компьютера. Зайдя в процессы, я увидел много незнакомых, и первая мысль была - проверить все незнакомые на virustotal.com, что я и сделал. Однако, тот молчал как рыба и уверенно указывал на отсутствие вредоносного кода в моих  запущенных приложениях. Кто не в курсе - Virustotal это бесплатный онлайн инструмент для проверки добросовестности любых ваших файлов: вы загружаете файл и система проверяет его множеством антивирусов, выводя отчет по каждому. Очень и очень полезный сервис для всех интересующихся информационной безопасностью.

Итак, вторая мысль - скачать on demand версию Kaspersky и drWeb (virus removal tool и cureIT соответственно). Virus removal tool и CureIT - бесплатные утилиты для удаления вирусов, не предоставляющие защиты в реальном времени, но использующие последние вирусные базы, это лучшее решение для лечения разного рода вредоносных программ и именно с них следует начинать.

Каково же было мое удивление, когда, вбив в поисковике kaspersky, я наблюдал стремительно закрывающийся браузер! Так, это что-то новенькое, проверим в другом... При попытке зайти на kaspersky.ru вылетели все установленные у меня версии браузеров - Chrome, IE, Opera, Firefox. Скачать бесплатную антивирусную утилиту AVZ также не удалось.

Меня эта уловка вирусописателей порядком порадовала, и я недолго думая пошел в обход - благо, что у меня есть свои сервера в интернете и я могу воспользоваться ими для выкачивания любых объектов из сети с целью последующей передачи на рабочий компьютер. Зайдя по SSH на сервер, я тремя командами загружаю на него необходимые утилиты:

wget avz
wget virus_removal_tool
wget cureIT

здесь вместо avz, virus_removal_tool и cureIT, разумеется, необходимо подставить URL адреса этих программ. Затем через SFTP я слил скачанные утилиты к себе на комп и продолжил головоломку:) Если вы ничего не знаете не знаете о серверах, unix'ах и wget, но попали в аналогичную ситуацию - просто скачайте названные утилиты с незараженного компьютера.

Тааак, устанавливаем касперского, запускаем... Хрен! Программа вылетает. Хм, это начинает казаться интересным. Лезу опять в процессы, пересматриваю их. Решаю убить explorer.exe - это оболочка windows, отвечающая за работу проводника, отрисовку меню ПУСК и т.д. Совершенно ненужная вещь в общем-то=).

При отключении explorer'а браузеры стали стабильно работать с сайтами антивирусных производителей - агааа! Вот ты где, красавчик наш:) Не запуская explorer, открываю касперского и запускаю проверку. Тот довольно быстро находит зараженные файлы, лечит их и перезагружает уже здоровый комп.

Вирус побежден. Не все уж так и сложно оказалось;)

Итак, мои советы по борьбе с Backdoor.Win32.Shiz:

  1. Запускаем браузер
  2. жмем WIN+R, вводим cmd и жмем Enter. Откроется окно командной строкой windows. Да, кто не в курсе - кнопка WIN - это клавиша на вашей клавиатуре в нижнем ряду с нарисованным флажком.
  3. ALT+CTRL+DELETE, вкладка Процессы. Находим explorer.exe, правой кнопкой мыши - завершить, соглашаемся. Пропала кнопка ПУСК и нижняя панель - это нормально, не пугаемся. Все вернется после перезагрузки или после применения описанных ниже действий.
  4. зажимаем ALT и жмем TAB несколько раз для переключения в окно браузера
  5. скачиваем антивирусные утилиты от Касперского и DrWeb (мне, впрочем, помог Virus removal tool и CureIT не понадобился)
  6. устанавливаем Virus removal tool (он не интегрируется в систему и, как правило, устанавливается в директорию на рабочем столе), запускаем его. Чтобы запустить, перейдите в окно командной строки и введите там полный адрес к установленной программе, в моем случае "d:\Documents and Settings\AGoloburdin\Рабочий стол\Virus Removal Tool\setup_9.0.0.722_25.04.2011_10-16\setup_9.0.0.722_25.04.2011_10-16.com". Если вы не знаете, в какое место поставилась программа - запустите explorer.exe, найдите программу и скопируйте путь до нее и затем остановите explorer.exe снова.

    Для запуска остановленного процесса в окне диспетчера задач нужно выбрать пункт меню Файл->Новая задача, в открывшемся окне ввести explorer.exe и назжать Ок, программа запустится. Для останова - выберите ее на вкладке Процессы, нажмите правой кнопкой мыши и выберите Завершить процесс.
  7. в запустившемся Virus removal tool жмем Начать проверку.
На этом все. Здоровых компьютеров вам:).

понедельник, 18 апреля 2011 г.

ExtJS проблемы в Internet Explorer

ExtJS, как гласит официальный сайт, является кроссплатформенным фреймворком для построения Rich Internet Application - "богатых интернет приложений", то есть, приложений, обладающих функциональностью обычных настольных программ. И это действительно так.

Однако, нередко при работе с ExtJS некоторые проблемы с кроссбраузерностью все-таки наблюдаются. Тем не менее, стоит отдать должное разработчикам фреймворка, эти проблемы обусловлены в первую очередь разными реализациями Javascript в разных браузерах и для их устранения следует всего лишь следовать хорошему тону программирования.

Нередко наблюдается, когда интерфейс отлично функционирует в Firefox, но даже не отрисовывается в Internet Explorer и браузер выдает многочисленные сообщения об ошибках.
Как правило, причина такого поведения заключается в разной реализации массивов Javascript. Известно, что в ExtJS для конфигурирования элементов используются исключительно объекты и массивы объектов, например:

vp = new Ext.Viewport({
    layout: 'border',
    renderTo: Ext.getBody(),
    items: [
        firstElement,
        secondElement,
        thirdElement
    ]
});

Здесь создается Viewport, элементами которого являются firstElement, secondElement и thirdElement - и этот код будет работать одинаково во всех заявленных разработчиками ExtJS реализациях браузеров. Однако, попробуйте выполнить этот код:

vp = new Ext.Viewport({
    layout: 'border',
    renderTo: Ext.getBody(),
    items: [
        firstElement,
        secondElement,
        thirdElement, // запятая
    ]
});

Internet Explorer выдаст ошибку. Проблема в реализации массивов Javascript: если после последнего элемента стоит запятая, IE считает, что в конце массива присутствует еще один, пустой, элемент. ExtJS пытается обработать этот элемент, но, так как он фактически пуст, генерируется ошибка.

Другие реализации Javascript (в Firefox, например) на запятую после последнего элемента массива внимания не обращают, однако завершать последний элемент запятой считается дурным тоном программирования.

Приведенная ошибка - наиболее часто встречающаяся при разработке на ExtJS, и ее необходимо всегда иметь в виду. Будьте внимательны к последним элементам массивов и объектов, и это упростит вам жизнь при последующем тестировании кроссбраузерности ваших интерфейсов.

Вторая проблема - использование в коде конструкции console.log() для вывода сообщений в консоль Firebug или Chrome. Internet Explorer, к сожалению, не имеет консоли как таковой, поэтому попытки ее использования генерируют ошибку; необходимо помнить, что после окончания тестирования и отладки интерфейса, если вы использовали вывод сообщений в консоль, их необходимо удалить или закомментировать. Впрочем, эта ошибка, в отличие от вышеописанной, легко определяется.

понедельник, 11 апреля 2011 г.

ExtJS выделить строку в таблице grid

Проблема: выделить одну строку (например, первую) в таблице grid сразу после ее загрузки. Казалось бы, проблемы как таковой здесь нет - получили SelectionModel таблицы и сделали selectRow(rowIndex). По сути - все действительно так, однако необходимо выбрать нужный момент для выполнения этого кода. Попробуйте, например, выделить строку в событии afterrender или render - увы, выделение не сработает. Решение, тем не менее, безусловно есть.

Решение: необходимо воспользоваться событием viewready, возникающим, когда таблица grid полностью отрисована на странице и готова к манипуляциям. Как гласит документация, viewready используется как раз для осуществления выделения строки по умолчанию.

Предположим, что нам нужно выделить первую строку таблицы:

grid = new Ext.grid.EditorGridPanel({
  store: myStore,
  height: 500,
  border: false, frame: false,
  cm: myColumnModel,
  selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),
  listeners: {
    viewready: function(g){
      g.getSelectionModel().selectRow(0);
    }
  }

Обратите внимание, что в случае необходимости использования так называемой модели выделений SelectionModel необходимо явно указывать selModel в конфигурации таблицы, в противном случае вызов метода grid.getSelectionModel() вызовет ошибку.

пятница, 8 апреля 2011 г.

ExtJS убрать обрезку строк в таблице Grid

Таблицы ExtJS (GridPanel и EditorGridPanel) отлично подходят для отображения и удобного редактирования различных типов данных. Однако по умолчанию ячейки таблицы не показывают большие строки полностью, обрезая их до видимой части, как видно на рисунке ниже.

Иногда такое поведение неприемлемо и необходимо предоставить пользователю возможность видеть всю текстовую информацию целиком.
 

Сделать это чрезвычайно просто - необходимо перезаписать CSS параметр .x-grid3-cell-inner для редактирования стиля ячейки и свойства .x-grid3-hd-inner для редактирования стиля заголовка таблицы соответственно. Таким образом, чтобы включить режим просмотра всего текста (wrap) в ячейке, необходимо обозначить следующий стиль:

.x-grid3-cell-inner { white-space: normal; }

Аналогичный эффект заголовкам таблицы придаст следующий CSS код:

.x-grid3-hd-inner { white-space: normal; }

Спасибо.

Вообще говоря, подобным образом можно править все стили, используемые в ExtJS интерфейсе - узнать названия стилей и посмотреть их текущие параметры можно в Firebug'е.

ExtJS сделать ячейку/столбец Editor Grid нередактируемой

Проблема: на входе имеем таблицу Editor Grid (EditorGridPanel), в которой необходимо запретить редактирование некоторых ячеек, строк или столбцов. Известно, что по умолчанию все ячейки таблицы EditorGridPanel являются редактируемыми.

Решение. Как всегда, разработчики ExtJS продумали все за нас - необходимо перезаписать конфигурационную функцию isCellEditable модели колонок ColumnModel, определяющую возможность редактирования конкретной ячейки по индексу ее колонки и строки.

var store = new Ext.data.Store({...});
var colModel = new Ext.grid.ColumnModel({
  columns: [...],
  isCellEditable: function(col, row) {
    if (col == 2) return false; else return true;
  }
});
var grid = new Ext.grid.GridPanel({
  store: store,
  colModel: colModel,
  ...
});

В приведенном примере разрешается редактировать всю таблицу, кроме третьей колонки - строки и колонки начинают нумерацию с нуля, поэтому в теле функции isCellEditable проверяется значение col, равное 2.

Неплохо, не так ли? Усложним задачу. Что, если нам нужно решить, стоит ли позволять редактировать ячейку в зависимости от данных в другой колонке? Нет ничего проще!

var store = new Ext.data.Store({...});
var colModel = new Ext.grid.ColumnModel({
  columns: [...],
  isCellEditable: function(col, row) {
    if (col == 2){
      rec = store.getAt(row);
      if (rec.get('notEdit') === true)
        return false;
      else
        return true;
    } else
      return true;
  }
});
var grid = new Ext.grid.GridPanel({
  store: store,
  colModel: colModel,
  ...
});

В данном случае проверяется значение поля notEdit рассматриваемой записи, и если в нем хранится true - ячейка в третьем столбце становится нередактируемой. Остальные столбцы и ячейки при этом продолжают нормально функционировать.

четверг, 7 апреля 2011 г.

ExtJS получить параметры URL/GET параметры

Проблема: необходимо использовать GET параметры, содержащиеся в URL. Например, по каким-то причинам клиенту на JS необходимо получить доступ к параметру id запроса http://site/page.php?id=132.

Решение. Двухстрочная функция, расширяющая возможности ExtJS.

Ext.getUrlParam = function(param) {
    var params = Ext.urlDecode(location.search.substring(1));
    return param ? params[param] : params;
};

Использование:

id = Ext.getUrlParam('id');

воскресенье, 3 апреля 2011 г.

Конвертирование PDF в Word [doc, rtf]

Лучший онлайн инструмент для конвертирования PDF в Word (на выбор - doc или rtf) - здесь.

Загружаете pdf, вводите свой email и через пару минут получаете письмо с doc файлом. Уличная магия и только.




Да, как снять защиту с PDF документов на копирование, печать и т.п. я писал здесь.

Снятие ограничений с PDF файла


Простите, но меня чрезвычайно раздражает, когда я не могу распечатать скачанный PDF документ или скопировать текст из оного! К чему все эти ограничения?

Онлайн решение hack-pdf.com поможет решить описанную проблему. Никаких регистраций и требований, просто загружаете PDF документ, ожидаете его обработки - мой 120 страничный pdf был разблокирован не более чем за 5 секунд.

Да, как легко и просто сконвертировать PDF в doc я писал здесь.