Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi for PHP > Delphi for PHP (RAD PHP XE, HTML5 Builder ): FAQ


Автор: ViktorXP 22.08.09, 16:36
Запуска проекта на удаленном сервере
Когда вы закончите разрабатывать свой проект нужно сформировать рабочий проект
Для этого в делфи есть «Deployment Wizard» (вызвать можно Tools-> Deployment Wizard или соответствующую кнопку в тулбаре)
Мастер скопирует ваш проект в папку (которую вы ему укажите) и в ней папку vcl, в которой будут находится необходимые компоненты и файлы.
Копируете это все на сервер с помощью ftp клиента. Заходим на сайт и смотрим результат.

Бывает что мастер может не доложить какой-то файл. В этом случае его нужно поискать в vcl библиотеки
%Program Files%\CodeGear\Delphi for PHP\2.0\vcl\
%Program Files%\Embarcadero\RadPHP\3.0\rpcl
и положить в соответствующую папку в своем сформированном проекте.
Для 3-й версии актуально не vcl, а папка rcpl

Добавлено
Проблема:
Иногда возникает ошибка при использовании шаблона Smart
Цитата
Fatal error: Smarty error: the $compile_dir '/tmp' does not exist....

Решение:
Открываем файл smartytemplate.inc.php
Находим строчку
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    $this->_smarty->compile_dir = '/tmp';

И указываем полный путь к темповой папке
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    $this->_smarty->compile_dir = 'C:/WINDOWS/Temp'; //'C:/tmp'

Автор: ViktorXP 22.08.09, 16:38
Советы:
При создании шаблона в теле документа нужно незабыть указать три параметра {$HeaderCode} (В это месте будут формироватся JavaScript вставки), {$StartForm} и {$EndForm} (в этих местах будет вставлены теги начала и конца формы соответственно)


Чтобы заставить обновится какойто контрол достаточно нажать по нему правой кнопкой мыши и вызвать control->repain или нажать Shift+Ctrl+F12

Автор: ViktorXP 22.08.09, 16:41
Проблема:
При использовании DBGrida и Smarty с формы исчезает скрол.

Решение:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Unit1JSLoad($sender, $params)
    {
     
    ?>
    //Add your javascript code here
    d.setOverflow("scroll");
    <?php
     
    }

Автор: ViktorXP 22.08.09, 16:43
Тут есть процентное соотношение но подано слегка не стандартным для нас способом.

Каждай компонент-контейнер можно поделить виртуально сеткой на квадраты.
Для этого в компонента есть свойства Layout.Cols и Layout.Rows
Способ выравнивания определяется свойством Layout.Type
После установки размера сетки растягиваем внутренний компонент на столько квадратов сколько нам

нужно.
Когда будет компнент-контейнер менятся то он будет автоматически менать размер и внутренних

компонентов в соответствии занятых квадратов.

Автор: ViktorXP 22.08.09, 16:44
Проблема:
Как удалять из "Welcome Page" уже не существующие проекты?

Решение:
Записи о проектах лежат в реестре
HKEY_CURRENT_USER\Software\CodeGear\Delphi for PHP\1.0\mru {в первой версии}
HKEY_CURRENT_USER\Software\CodeGear\Delphi for PHP\2.0\mru {во второй версии}

Автор: ViktorXP 22.08.09, 16:44
Проблема:
В базу при помощи цикла записывал 100000 записей. При выполнении выдало ошибку
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Fatal error: Maximum execution time of 30 seconds exceeded in T:\home\localhost\ryterna\vcl\adodb\adodb.inc.php on line 831


Решение:
В настройках по умолчанию стоит максимальное время выполнение скрипта 30 сикунд.
изменить его можно в файл в php.ini.template. В секции "Resource Limits" есть параметр max_execution_time

Автор: ViktorXP 22.08.09, 16:45
Проблема:
Как изменить размер шрифта у ListView ?

Решение:
1)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Button1JSClick($sender, $params)
    {
      ?>
      //Add your javascript code here
      document.getElementById('ListView1').style.font = "bold small-caps 12pt/14pt sans-serif";
    // document.getElementById('ListView1').style.font = " 12pt/14pt sans-serif top";
      <?php
    }
2)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    document.all['ListView1'].style.left = 0;
    document.all['ListView1'].style.position = 'relative';
    document.all['ListView1'].style.font = '20px verdana,arial,helvetica';
    document.all['ListView1'].style.textAlign = 'right';
    document.all['ListView1'].style['color'] = 'blue';
    document.all['ListView1'].style['size'] = '18px';
    document.all['ListView1'].style.fontSize = '22px';

Автор: ViktorXP 22.08.09, 16:47
Проблема:
как узнать программно что страница/компонент отображается в редакторе форм

Решение:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if   (($this->ControlState & csDesigning) != csDesigning) ...

Автор: ViktorXP 22.08.09, 16:48
Проблема:
Пустой проект выдает ошибку
Цитата
Warning: Unknown: Failed opening 'C:/Documents and Settings/User/Мои документы/Delphi for PHP Projects/unit1.php'
for inclusion (include_path='.;C:\Program Files\Programming\Delphi for PHP 1.0\' ) in Unknown on line 0

Решение:
Delphi for PHP не любит русские пути. Поэтому сохраняй проект в другом месте.

Кроме этого стоит проверить что:
- имя пользователя под которым Вы установили и используете Delphi For Php содержит только английские буквы и не содержит пробелов
- после создания нового проекта сохраните его в папку, которая содержит только английские буквы и не содержит пробелов
- если проект не запускается и находится на диске отличном от C: попробуйте сохранить его на диск C:

Автор: ViktorXP 22.08.09, 16:48
Проблема:
А каким образом без мышки можно перемещаться по элементам формы?

Решение:
1)
У каждого контрола, который имеет фокус, есть свойства TabOrder (параметр порядка предоставления

фокуса), TabStop (Давать фокус по табу или нет)
2)
Или можно решить это через JavaScript
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Edit2JSKeyUp($sender, $params)
    {
    ?>
      //if (event.keyCode == 13|| event.keyCode == 9)
      if (event.keyCode == 40) // если нажата клавиша "стрелка вниз"
      {
        findObj("Edit1" ).focus();
      }              
      if (event.keyCode == 38) // если нажата клавиша "стрелка вверх"
      {                  
        findObj("Edit3").focus();                  
      }
    <?php
    }

Автор: ViktorXP 22.08.09, 16:49
Проблема:
Какие настройки отвечают за кодировку?

Решение:
IDE/Tools/Options/Default Charset
IDE/Tools/Options/Editor options/Text encoding
Unit1->Encoding
(Unit1 - это имя редактируемого модуля)

Автор: ViktorXP 22.08.09, 16:49
Проблема:
настройки
Unit1->Encoding = Unicode (UTF-8) |utf-8
Unit2->Encoding = Unicode (UTF-8) |utf-8
IDE/Tools/Options/Default Charset = utf-8 (Language = "utf-8")
IDE/Tools/Options/Editor options/Text encoding = utf-8

- ставим panel1 на форму unit1
- в инспекторе пишем panel1->caption = 'Тра-та-та'
- ставим panel2 на форму unit2
- в инспекторе пишем panel2->include = unit1

видим в редакторе краказяблы
а запускаем - нормально
Решение:
добавляется в модуль extctrls.inc.php две процедуры
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function get_include_contents($filename)
    {
      if (is_file($filename))
      {        
        ob_start();        
        include $filename;        
        $contents = ob_get_contents();
        ob_end_clean();        
        return $contents;    
      }    
      return false;
    }
    function GetANSI($str)
    {
      $charset = 'windows-1251';
      $_encoding = mb_detect_encoding($str, "UTF-8, $charset");
      if (strcasecmp($_encoding, 'UTF-8')==0)
      {
        return mb_convert_encoding($str, $charset, $_encoding);
      }
      else    
      {
        return $str;
      }
    }

Потом переписываем кусок
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if ($this->_include!="")
    {
      include($this->_include);
    }

На
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if ($this->_include!="")
    {
      if (($this->ControlState & csDesigning) != csDesigning)
      {        
        include($this->_include);
      }
      else
      {
        $string = get_include_contents($this->_include);
        echo GetANSI($string);
      }
    }

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

Автор: ViktorXP 22.08.09, 16:50
Проблема:
Как изменить кодировку файла?
Решение:
в окне редактирования тыкаеш правую кнопку мыши File Encoding с подпунктами.

Автор: ViktorXP 22.08.09, 16:50
Проблема:
Где ide хранить php.ini?
Решение:
Файл лежит тут:
%Documents and Settings%\{user}\Application Data\CodeGear\Delphi for PHP\2.0\php\php.ini
Но изменять его бесполезно так как среда его изменяет самостоятельно. Правильнее настройки вносить

через саму ide. Если этого мало то тогда можно внести настройки в сам шаблон по которому среда

формирует файл
%Delphi for PHP%\2.0\php\php.ini.template

Автор: ViktorXP 22.08.09, 17:08
Проблема:
Хочу чтобы календать, находящийся в VCL, был по русски.

Решение:
В моделе comctrls.inc.php в класах MonthCalendar и DateTimePicker есть строка
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     $this->_calendar = new DHTML_Calendar(VCL_HTTP_PATH."/jscalendar/", "en", 'calendar-win2k-2', false);

Вот тут и меняй язык 'en' на 'ru'

Автор: ViktorXP 22.08.09, 17:13
Проблема:
Есть проблема с combobox. Не получалось программно определить текущее значение выбранного элемента.

Решение:
Можно воспользоватся такой функцией
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function GetComboSelectKey($Combo,$TypeValue=0)
    /* возвращает значение ключа(key) или текст выбранной записив Combobox $TypeValue=0 - key, =1 - текст*/
    {
      if ($Combo->Count<1) return '';  
      $items=$Combo->Items;  
      reset($items);  
      while(list($key, $val)=each($items))    
      {    
        if ($Combo->readSelected($key))
        {
          if ($TypeValue==0)  { return $key; }
          else  { return $val; }
        }
      }
    }

Автор: ViktorXP 22.08.09, 17:17
Проблема:
Никак не пойму, какой метод или свойство у BDGrid содержит текущую выделенную строку и поле.

Решение:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    document.getElementById('Edit1').value = DBGrid1.getTableModel().getValue(1, DBGrid1.getFocusedRow())
Присваивает едиту значение второго столбца выбранной строки грида.

Автор: ViktorXP 22.08.09, 17:25
Проблема:
Как центрировать форму с компонентами?

Решение:
выставляется параметр "Layout.Type" у формы отличающийся от "ABS_XY_LAYOUT"( например "XY_LAYOUT")
и присваиваем свойству Alignment значение agCenter

Автор: ViktorXP 22.08.09, 17:35
Проблема:
DBGrid показывает все колонки, хотя в некоторых стоит свойство Visible=false

Решение:
1)
Открываем модуль dbgrids.inc.php и ищем там такой код:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                    $dwidth=$value['Width'];
                    $color=$value['Color'];
                    $fontcolor=$value['FontColor'];
                    $alignment=$value['Alignment'];
                    $fname=$value['Fieldname'];
     
                        $props=$this->_datasource->DataSet->readFieldProperties($fname);
                        if ($props)
                        {
                                if (array_key_exists('displaywidth',$props))
                                {
                                        $dwidth=$props['displaywidth'][0];
                                }
                        }
     
                    echo "        $this->Name.getTableColumnModel().setColumnWidth($i,$dwidth);\n";

Добавляем две строки перед или после той строки что я указал последней
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
       $_Visible=$value['Visible']; //Эту
       echo "        $this->Name.getTableColumnModel().setColumnVisible($i,$_Visible);\n"; //и эту
       echo "        $this->Name.getTableColumnModel().setColumnWidth($i,$dwidth);\n"; //Я поставил перед этой
Теперь грид будет реагировать на параметр Visible в свойсве Columns
2)
Ну если вручную менять то можно так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ?>
      DBGrid1.getTableColumnModel().setColumnWidth(1,50) // размер
      DBGrid1.getTableColumnModel().setColumnVisible(1, false) // видимость
    <?php


Добавлено
в компоненте нет свойства Visible для колонок поэтому там пока через JS
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ListViewBank.getTableColumnModel().setColumnVisible(0, false);

Автор: ViktorXP 22.08.09, 17:41
Проблема:
Где dbgrid хранит текстовые константы? (1 of 9 rows selected)
Решение:
в файле %Program Files%\CodeGear\Delphi for PHP\1.0\vcl\qooxdoo\framework\script\qx.js в масиве $=[....] лежит каждое слово по отдельности

Автор: ViktorXP 22.08.09, 18:05
Проблема:
Проект в кодировке windows-1251. Использую ajax. Вместо кириллицы получаю корокзяблы
Решение:
Открываем модуль xajax.inc.php и подправляем строку
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8'); // ставим нужную нам кодировку (в данном случаи windows-1251)

Автор: vicis 25.08.09, 12:22
Проблема:
Если нужно закрыть компонент Window при запуске формы, а потом его по кнопке отобразить с помощью JavaScript
то при установке свойства невидимости оно вообще не генерируется в код
и соотвественно потом не вызывается из JavaScript
Решение:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function PageInfoAfterShow($sender, $params)
                   {
                   echo "<script type=\"text/JavaScript\">
                          Window1.close();
                        </script>";
                   }

Автор: vicis 25.08.09, 12:29
Задача:
Если нужно использовать панель с набором компонентов на ней не в том месте где она
установлена на форме, а в произвольном, определяемом неким порядком генерации страницы
которым мы должны управлять, то есть использовать эту панель как шаблон
Решение:
нужно сделать так
- ставим панель на форму (например с именем PanelNewCode)
- панели устанавливаем в режиме редактирования :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                     $this->PanelNewCode->Visible = false;
                     $this->PanelNewCode->Layout->Type = 'REL_XY_LAYOUT';

- прописываем в то место где хотим вставить панель такой код (например встроить панель в таблицу):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
             $mycodetable = '<table>
                                      <tr><td>здесь встроена моя панель 1-й раз '.$this->PanelNewCode->show(true).'</td></tr>  // вставляем панель первый раз
                                      <tr><td>здесь встроена моя панель 2-й раз '.$this->PanelNewCode->show(true).'</td></tr>  // вставляем панель второй раз
                                       </table>';
             echo $mycodetable;

- однако т.к. PanelNewCode невидимая, то есть проблема
если на этой панели есть компоненты у которых прописаны обработчики событий (например кнопка)
то vcl не сгенерирует их в страницу, т.к. родитель не видимый
решение здесь такое:
прописываем сгенерировать код события принудительно
(например для кнопки Button1, которая находится на невидимой панели и имеет обработчик события)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function zakazinfoAfterShow($sender, $params)
                   {
                   echo "<script type=\"text/JavaScript\">";
                          $this->Button1->dumpJsEvents();
                   echo "</script>";
     
                   }

это событие здесь для формы с названием zakazinfo

Автор: vicis 25.08.09, 12:42
Задача:
Передать параметры из формы в форму
Например: значение первой колонки из выбранной записи DBGrid1
Решение:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function BitBtn4JSClick($sender, $params)
                   {
     
                   ?>
                     if (confirm("Вы уверены, что хотите удалить этого сотрудника?"))
                       {
                       t_id=DBGrid1.getTableModel().getValue(0, DBGrid1.getFocusedRow());
                       location.href="/formdelete.php?act=delete&id="+t_id;
                       }
     
                   <?php
     
                   }


в форме formdelete.php получаем в событии BeforeShow($sender, $params)

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                        $action=$this->input->act;
                        if (is_object($action))
                        {
                            $del_id=$this->input->id;
     
                         ...

Автор: vicis 25.08.09, 12:56
Задача:
Нужно управлять DBGrid (или ListView)

Решение:

1. установка ширины колонок (JavaScript)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                  ListView1.getTableColumnModel().setColumnWidth(0,250);
                  ListView1.getTableColumnModel().setColumnWidth(1,250);
     
                  DBGrid1.getTableColumnModel().setColumnWidth(0,1); // скрывема колонку путём установки ширины=1


2. добавить значения в ListView
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   var rowData = [];
                   rowData = tableModel.getData();
                   rowData.push(['111', '222','333']);
                   tableModel.setData(rowData);
                   ListView1.getTableModel().setColumnEditable(0, true);  // сделать колонку редактируемой
                   ListView1.getTableModel().setColumnEditable(1, true);
                   ListView1.getTableModel().setColumnEditable(2, true);

3. ПОСЧИТАТЬ СУММУ некоторой колонки

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                    var totcases=1*0 ,totsale=1*0
                    var model = dbgrid.getTableModel();
                    var rowCount = model.getRowCount();
                    for(var row = 0; row < rowCount; row ++ )
                       {
                       var order=parseInt(model.getValue(5,row));
                       if (order != model.getValue(5,row)) order=0;
                       var multi=parseInt(model.getValue(10,row));
                       if (multi != model.getValue(10,row)) multi=1;
                       var price=parseFloat(model.getValue(6,row));
                       if (price != model.getValue(6,row)) price=0;
                       totcases+=order;
                       totsale+=parseInt(order*multi*price*100)/100;
                       }


4. ПОЛУЧИТЬ ЗНАЧЕНИЕ ЯЧЕЙКИ
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var row = dbgrid1.getFocusedRow();
    var col = dbgrid1.getFocusedColumn();
    var value=dbgrid1.getTableModel().getValue(col,row);
    alert('col = '+col+' row = '+row+' cell = '+value);


5. ДИНАМИЧЕСКИ ПРОПИСАТЬ КОЛОНКИ
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Unit306BeforeShow($sender, $params)
    {
      $prop=array();
      $prop['products']['products_id']=array('displaylabel'=>array('ID'));
      $prop['products']['products_quantity']=array('displaylabel'=>array('Quantity'));
      $this->dboscommerce1->DictionaryProperties=$prop;
    }

6. ЧАСТО ИСПОЛЬЗУЕМЫЕ МЕТОЫ
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var row = dbgrid.getFocusedRow();
    var column = dbgrid.getFocusedColumn();
    var value=dbgrid.getTableModel().getValue(col,row);
    dbgrid.getTableModel().setValue(col,row,value);
    dbgrid.sortByColumn (col, true);
    dbgrid.setFocusedCell(col, row, true);
    dbgrid.getSelectionModel().setSelectionInterval(row, row);


7. ПРИМЕР ПРОГРАММЫ КОТОРАЯ ДЕЛАЕТ ПОИСК ПО DBGRID
(проверено, работает)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function  jsDBGfindtext(model,thetext,startingRow,column)
      {  //zips thru a dbgrid to find something
         var rowCount = model.getRowCount();
         for(var row = startingRow; row < rowCount; row ++ )
                {
                var desc = model.getValue(column,row);
                if (typeof(desc)=="number") desc=desc.toString();
                if (typeof(thetext)=="number") thetext=thetext.toString();
                desc = desc.toUpperCase();
                thetext = thetext.toUpperCase();
                if ( desc.indexOf(thetext)>=0) return (row);
                }
          return (-1);
       }
    //the calling routine from a basic edit
       function EsearchdbgridJSKeyUp($sender, $params)
                   {
                   ?>
                    var lookfor = findObj('Esearchdbgrid').value;
                    if (lookfor.length < 2) startRow = 0;
                    if (lookfor.indexOf(' ',0)) //use space bar as a look for next occurrence.
                      {
                      var look = lookfor.split(' ');
                      lookfor=look[0];
                      }
                    if (typeof(startRow)=='undefined') startRow=-1;
                    startRow++;
                    startRow=jsDBGfindtext(dbgrid.getTableModel(),lookfor,startRow,4);
                    if (startRow>-1)
                         {
                         dbgrid.setFocusedCell(5, startRow, true);
                         dbgrid.getSelectionModel().setSelectionInterval(startRow, startRow);
                         }
                   <?php
                   }

Автор: vicis 25.08.09, 13:03
Задача:
Передать содержимое панели(или другого элемента) в другую (копировать)
Решение:
- ставим на форму панель с чем то
- ставим компонент Window1
- на Window1 ставим другую панель
и кнопкой в javascripte передаём содержимое в окно Window1

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    document.getElementById("PanelBig_outer").innerHTML = document.getElementById("PanelPowerShow_outer").innerHTML
    Window1.open();

Автор: vicis 25.08.09, 13:27
Проблема:
В 1-й версии DelphiForPhp у компонента Query в редакторе колонок нет кнопок переместить колонки вверх, вниз.
Это неудобно т.к. если нужно поменять их порядок то приходится перенабирать всё по новой.
Решение:
Взять 2-й DelphiForPhp (можно демо)
и заменить у первого папку Program Files\CodeGear\Delphi for PHP\1.0\plugins
на аналогичную от второго
(там эти кнопки есть)
IDE перезапустить

здесь хранятся плагины редакторов свойств компонент,
которые можно писать самостоятельно в Delphi (не на Delphi 7, а нужна версия выше)

Автор: vicis 20.11.09, 08:09
в дополнение к FAQ (сообщение #2344473)
Проблема:
При добавлении в шаблон SmartyTemplate компонент, которые построены на qx
например: TreeView
скролл пропадает и не появляется даже с кодом указанным в сообщении FAQ (сообщение #2344473)
Решение:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
       function mainAfterShow($sender, $params)
       {
          // FIX for Qadram's Scrollbar cockup!!
    ?>
       <script language="JavaScript" type="text/javascript">
        var d = qx.ui.core.ClientDocument.getInstance();
        d.setOverflow("auto");
       </script>
    <?php
       }

Автор: vicis 20.11.09, 08:16
Задача:
В шаблон SmartyTemplate добавить переменную, которая отсутствует как компонент на форме
но которую нужно заполнить каким либо значением
Решение:

вариант шаблона:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <html>
      <head>
        <title>{%$xCaption%}</title>
          <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      </head>
      <body>
        <table id="mytab" cellspacing="1" cellpadding="1" width="100%" border="1">
          <tbody>
            <tr height="66">
              <td> 5678</td>
              <td> {%$xtemp%}</td>
              <td> </td>
            </tr>
            <tr height="15">
              <td> </td>
              <td> </td>
              <td> </td>
            </tr>
          </tbody>
        </table>
      </body>
    </html>



код модуля php (событие onTemplate):

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
           function Unit5Template($sender, $params)
           {
           $template=$params['template'];
           $template->_smarty->assign('xtemp','1234567890');
           $template->_smarty->assign('xCaption','MyTitle');
     
           }

Автор: vicis 20.11.09, 08:41
Проблема:
При подключении к SmartyTemplate некоторых компонент (решение не для всех компонент), например Panel,Label...
нужно что бы они растягивались по контейнеру в который входят, например по размеру тега <td>,
однако, они туда вставляются с шириной и высотой которую имеют на форме в дизайнере форм.
Установка ширины или высоты в инспекторе объектов разрешается только в виде целых чисел, т.е. 100% не проходит.
Как сделать 100% ?
Решения:
1.Решение 1
- форме на которой находятся компоненты установить Layout.Type = FLOW_LAYOUT
- дать команду конкретному компоненту writeAdjustToLayout(True) (по умолчанию там значение False)
в этом случае при генерации компонента подставляются не установленные у него на форме высота и ширина, а height:100%;width:100%;

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function Unit9BeforeShow($sender, $params)
                   {
                   $this->Label1->writeAdjustToLayout(True);
                   $this->Panel1->writeAdjustToLayout(True);
                   $this->Button1->writeAdjustToLayout(True);
                   }


при этом панель растягивается по тегу в котором находится
а Label1 и Button по ширине тега, высота подстраивается под содержимое

файл unit1.tpl
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <html>
    .....
    <body>
           {%$StartForm%}
            <table width=100% border=1>
            <tr><td width="150" height="200">{$Panel1}</td><td></td></tr>
            <tr><td width="150"></td><td></td></tr>
            <tr><td width="150" height="200">{$Label1}</td><td height="200">{$Button1}</td></tr>
     
           {%$EndForm%}
    </body>
    </html>


если посмотреть код html полученной страницы, то видим следующее:
(для вышеприведённого шаблона)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <html>
    <body>
           <form style="margin-bottom: 0" id="Unit9" name="Unit9" method="post"  action="/unit9.php">
            <table width=100% border=1>
            <tr><td width="150" height="200"><div id="Panel1_outer">
    <table id="Panel1_table"  width="100%"   height="100%"  border="0"  cellpadding="0" cellspacing="0"  
    bgcolor="#00FF00"    style=" border: 0px solid ; "   >
    <tr>
    <td style=" font-family: Verdana; font-size: 10px;  "><span style=" font-family: Verdana; font-size: 10px;  ">Panel1</span>
    </td>
    </tr>
    </table>
     
    </div>
    </td><td></td></tr>
            <tr><td width="150"></td><td></td></tr>
            <tr><td width="150" height="200"><div id="Label1_outer">
    <div id="Label1" style=" font-family: Verdana; font-size: 10px;  background-color: #FF0000;height:100%;width:100%;" >
    Label1 seefwse we we twer twer twe wer we rwer w</div>
    </div>
    </td><td height="200"><div id="Button1_outer">
    <input type="submit" id="Button1" name="Button1" value="Button1"  
    onclick="return Button1ClickWrapper(event, document.forms[0].Button1SubmitEvent, 'Button1_Button1Click')"  
    style=" font-family: Verdana; font-size: 10px;  height:100%;width:100%;"   tabindex="0"    />
    <input type="hidden" id="Button1SubmitEvent" name="Button1SubmitEvent" value="" />
    </div>
    </td></tr>
     
           </form>
    </body>
     
    </html>


2.Решение 2
используем стили

файл style.css
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    .xx {
            width: 100%;
            height: 100%;
    }


файл unit1.tpl
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <html>
    <link rel="stylesheet" href="style.css">
    <body>
     
           {%$StartForm%}
            <table width=100% border=1>
            <tr><td width="150" height="200">{$Panel1}</td><td></td></tr>
            <tr><td width="150"></td><td></td></tr>
            <tr><td width="150" height="200">{$Label1}</td><td height="200">{$Button1}</td></tr>
     
           {%$EndForm%}
    </body>
    </html>


форма в файл Unit10.php
на ней
Label1, Panel1, Button1

ставим маленьких размеров (что бы видно было масштабиравание)
в инспекторе:
Label1->Caption = 'Лучше нету того свету, Лучше нету того свету, Лучше нету того свету';
Button1->Style = .xx
Unit10->TemplateEngine=SmartyTemplate
Unit10->TemplateFileName=unit1.tpl

Автор: ViktorXP 20.01.10, 18:10
Если нужно создать простую таблицу с данными то можно воспользоваться компонентом HTML_Table который описан в vcl/PEAR/HTML/Table.php
простой пример использования:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?php
     
     require_once ('HTML/Table.php');
     
     $table = new HTML_Table();
     $table->setAttribute('border', 1);
     for ($x = 1; $x <= 9; $x++)
     {
       for ($y = 1; $y <= 9; $y++)
       {
          $table->setCellContents($x-1, $y-1, $x*$y);
       }
     }
     
     echo $table->toHtml();
     
    ?>

Автор: vicis 11.02.10, 12:35
Проблемы переноса проекта на хостинг проайдера

После создания проекта и его успешной отладки на локальном компьютере могут быть проблемы с переносом этого проета к провайдеру
Приведу некоторые проблемы с которыми столкнулся я и их решения
в основном эти проблемы из за не одинаковой настройки php или apache

1) у провайдера не была подключена библиотека с функциями фильтрации в php
Проявлялось в виде сообщения типа: "The Input Filter PHP extension is not setup on this PHP installation, so the contents returned by Input is *not* filtered"
удалось заставить подключить библиотеку путём предоставления примера, который не работал
По phpinfo это не было видно (вроде бы), а программа выполненная на провайдере говорила, что функции не доступны
на локальной же машине работало

Пример в двух файлах:
example04.php
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?php
    if (!filter_has_var(INPUT_POST, 'submit')) {
        echo "form";
        // include the form.
    }
     
    $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);
    if (is_null($age))
      {
        echo "Вы не ввели ничего(пустая переменная).<br />";
        require_once('index.php');
      }
      elseif ($age === FALSE)
      {
        echo "Введите число.<br />";
        require_once('index.php);
      }
      else
     
      {
        echo "Привет.<br/>";
        echo "<a href='test1.php'>В начало</a>.<br/>";
      }
    ?>


index.php
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <html>
    <head></head>
    <body >
    Проверка ввода числа
     
    <form action="example04.php" method="post" >
        Enter your age: <input name="age" size="2">
        <input type="submit" name="submit" value="Go">
        </form>
    </body>
    </html>


2)У провайдера небыла установлена переменная output_buffering
Проявлялось сообщением об ошибке в связи с тем что header уже послан
это решили созданием в корне папки проекта файла .htaccess и занесением в него следующих строк:
php_flag output_buffering On
php_value output_buffering 4096

Автор: vicis 17.02.10, 09:38
Задача: Открыть из одного окна другое (модально) и вернуть значения из него только по закрытию окна.
Раз модальное окно, то соответственно первое в этот момент будет недоступно.
Решение:
(Проверено в IE) делаем в первом окне
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Unit12AfterShow($sender, $params)
    {
      echo "<script type=\"text/JavaScript\">
      function returnInfo1(p_obr,p_name,p_fam,p_adr,p_city,p_country,p_tlf,p_tlf2)
      {
         document.getElementById('p_obr').value = p_obr;
         document.getElementById('p_name').value = p_name;
         document.getElementById('p_fam').value = p_fam;
         document.getElementById('p_adr').value = p_adr;
         document.getElementById('p_city').value = p_city;
         document.getElementById('p_country').value = p_country;
         document.getElementById('p_tlf').value = p_tlf;
         document.getElementById('p_tlf2').value = p_tlf2;
      }
      </script>";
    }
     
    function Label3JSClick($sender, $params)
    {
      ?>
      res = window.showModalDialog("clientinfoz.php","","dialogHeight:576px; dialogWidth:616px;status=no");
      if(res!=null)
      {
         returnInfo1(res[0],res[1],res[2],res[3],res[4],res[5],res[6],res[7]);
      }
      <?php
    }


Возвращаем из второго окна (при этом закрываем его)
1)вариант с обычным html:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     <input type="button" value="добавить эту информацию о получателе в новый заказ"  
       onClick="window.returnValue = ['555','666','777','888','999','000','111','222'];window.close();">'

2)вариант формы delphiforphp:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function Button4JSClick($sender, $params)
                   {
                   ?>
                   window.returnValue = ['555','666','777','888','999','000','111','222'];
                   window.close();
                   <?php
                   }

Автор: Gluckodrom 03.03.10, 06:22
Проблема:
Как связать D4php и Firebird?

Решение:
Хоть и официально D4php поддерживает FB, но у многих подключиться с помощью компонента Database не получается. Поэтому был применен следующий подход.
0. Если установлен Interbase или иная программа, которая юзает библиотеку GDS32.DLL, то останавливаем ее.
1. Устанавливаем FB с отмеченной галочкой о библиотеке GDS32.DLL
2. Идем по пути %systemroot%\system32\ и копируем библиотеку GDS32.DLL в
2.1 C:\Program Files\CodeGear\Delphi for PHP\2.0\apache2\bin\
2.2 C:\Program Files\CodeGear\Delphi for PHP\2.0\
2.3 C:\Program Files\CodeGear\Delphi for PHP\2.0\packages\
2.4 C:\Program Files\CodeGear\Delphi for PHP\2.0\php\
3. Все готово. Для связки D4php и Firebird используем Interbase компоненты.

Примечание: Решения для использования ролей пока не найдено.

Это сообщение было перенесено сюда или объединено из темы "Firebird + D4php"

Примечание 2: В 3-й версии пишут что Firebird поддерживается

Автор: vicis 25.03.10, 13:01
Задача: Доступ к свойствам компонента OpenGrid
Решение:
1.Получить значение 1-й колонки в текущей строке грида OpenGrid2 при выборе ячейки
если у грида свойство readonly=1


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function OpenGrid2JSCellSelect($sender, $params)
    {
     
      ?>
      //Add your javascript code here
      alert(jQuery('#OpenGrid2').getGridParam('selrow'));
     
      <?php
     
    }



2. Получить значения указанных колонок в текущей (выбранной) строке грида OpenGrid2 при выборе ячейки
Работает это если у гида свойство readonly=1
Здесь вытаскиваются колонки с названием полей PR_ID,PR_DATE

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function OpenGrid2JSCellSelect($sender, $params)
    {
     
      ?>
      //Add your javascript code here
     
      var id = jQuery("#OpenGrid2").getGridParam('selrow');
      if (id)
      {
        var ret = jQuery("#OpenGrid2").getRowData(id);
        alert("column pr_id="+ret.PR_ID+" column pr_date="+ret.PR_DATE+"...");
      }
      else { alert("Please select row");}
     
      <?php
     
    }



3. Ещё несколько функций для доступу к параметрам грида

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     function Button2JSClick($sender, $params)
    {
     
      ?>
      //Add your javascript code here
      alert(jQuery('#OpenGrid2').getGridParam('url'));  // зачем это не понял пока
      alert(jQuery('#OpenGrid2').getGridParam('sortname')); // имя колонки в гриде по которой сейчас отсортированы данные
      alert(jQuery('#OpenGrid2').getGridParam('sortorder')); // порядок сортировки
      alert(jQuery('#OpenGrid2').getGridParam('selrow'));  // значение первой колонки в строке
      alert(jQuery('#OpenGrid2').getGridParam('page'));  // номер отображаемой страницы
      alert(jQuery('#OpenGrid2').getGridParam('rowNum')); // по сколько записей выводится на странице
      alert(jQuery('#OpenGrid2').getGridParam('datatype'));  // тип данных
      alert(jQuery('#OpenGrid2').getGridParam('records'));   // количесто записей в таблице базы данных
     
      <?php
     
    }


4. Реализовать связку master-detail
Описано здесь установить easyGrid, OpenGrid (сообщение #2399428)

5. Раскраска грида по значениям ячеек

исходные данные для примера: таблица с полями TEST_ID (integer), TEST_NAME (varchar(20))
заполнена всякими тестовыми значениями

Раскрашиваем выбранную запись в гриде


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Button1JSClick($sender, $params)
    {
      ?>
     
      //Add your javascript code here
      var id = jQuery('#OpenGrid1').getGridParam('selrow');
      var ret = jQuery('#OpenGrid1').getRowData(id);
      //alert("TEST_ID="+ret.TEST_ID+" TEST_NAME="+ret.TEST_NAME+"...");
     
      //тут надо вставить анализ данных и в зависимости от них окрашивать строку другим цветом
     
      // шрифт в выбранной ячейке красим в нужный цвет
      jQuery("#OpenGrid1").setCell(id,'TEST_NAME','',{'color':'#FF00FF'});    
      // фон в выбранной ячейке красим в нужный цвет
      jQuery("#OpenGrid1").setCell(id,'TEST_ID','',{'background-color': '#999999'});    
      // меняем атрибуты шрифта в выбранной ячейке
      jQuery("#OpenGrid1").setCell(id,'TEST_ID','',{'color':'#FF00FF', 'font-weight':'bold'},{'title': 'это не меняет ничего!'});    
     
      <?php
    }



Пробежать по всем отображаемым строкам в гриде и раскрасить их по нужным критериям можно так

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Button3JSClick($sender, $params)
    {
      ?>
      //Add your javascript code here
      var ids = jQuery("#OpenGrid1").getDataIDs(); // получаем массив ID
      for(var i=0;i < ids.length;i++)   //бежим по всем отображаемым строкам грида
      {
        var id_value = ids[i];    // получаем значение перво колонки очередной строки
        var ret = jQuery("#OpenGrid1").getRowData(id_value);    // получаем объект со значениями полей
        //  alert('Строка№ '+i+', значение перовой колонки='+ id_value+' поле TEST_ID='+ret.TEST_ID+' поле TEST_NAME='+ret.TEST_NAME);
        if (ret.TEST_NAME=='eee') // проверяем на значение = eee
        {
          // фон в выбранной ячейке красим в нужный цвет
          jQuery("#OpenGrid1").setCell(id_value,'TEST_NAME','',{'background-color': '#999999'});    
        }
        if (ret.TEST_ID in [1,5]) // проверяем на значения 1 и 5
        {
          // фон в выбранной ячейке красим в нужный цвет
          jQuery("#OpenGrid1").setCell(id_value,'TEST_NAME','',{'background-color': '#999999'});    
        }
      }
     
      <?php
     
    }



Пробежать по всем отображаемым строкам в гриде и раскрасить их по нужным критериям сразу при отображении грида
можно если предыдущий код вставить в событие OpenGrid1JSGridComplete

6. Получить получить значение ячейки из указанной по имени колонки и строки с указанным значением
описано здесь плучить значение ячейки в OpenGrid (сообщение #2613574)

Автор: vicis 27.03.10, 13:49
Задача: Как сделать чтобы данные в ячейки переносились т.е. высота ячейки менялась в зависимости от длинны данных OpenGrid
Решение: смотрим здесь OpenGrid ,вставка новой записи в Detail Grid (сообщение #2549108)

Автор: vicis 05.04.10, 12:19
Задача: Как сделать что бы при открытии модального окна информация основной страницы затенялась или скрывалась
Решение: (проверялось в IE, в остальных проверяем сами)
1.на форме unit1 компонент Window1 и кнопка Button1
и ещё чего нибудь для демонстрации работы накидай, ну там вторую кнопку, мемо...

2. в инспекторе Winow1->Modal = true;
Button1->ButtonType = btNormal;

3. в коде
вариант с затемнением
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function Button1JSClick($sender, $params)
                   {
     
                   ?>
                   //Add your javascript code here
                    document.getElementById('unit1').style.background = 'gray'; // перекрашиваем форму
                    Window1.show(); // открывем модальное окно (всё остальное блокируется пока окно открыто)
     
                   <?php
     
                   }
     
                   function Window1JSClose($sender, $params)
                   {
     
                   ?>
                   //Add your javascript code here
                    document.getElementById('unit1').style.background = ''; // перекрашиваем форму назад
                    // здесь возможно нужно восстанавличать цвет, а ранее его запоминать в какой то переменной, но в простом случае работает и так
                   <?php
     
                   }



вариант где скрываем основную страницу пока отображаем модальное окно
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
                   function Button1JSClick($sender, $params)
                   {
     
                   ?>
                   //Add your javascript code here
                    document.getElementById('unit1').style.display = 'none';  //block - отображает страницу или элемент, а none прячет
                    Window1.show(); // открывем модальное окно (всё остальное блокируется пока окно открыто)
     
                   <?php
     
                   }
     
                   function Window1JSClose($sender, $params)
                   {
     
                   ?>
                   //Add your javascript code here
                    document.getElementById('unit9').style.display = 'block';  //block - отображает страницу или элемент, а none прячет
                   <?php
     
                   }

Автор: vicis 06.04.10, 09:14
Задача: Нужно в окне Windows1 открыть страницу с другого сайта (или со своего сайта другую форму)
Решение:
нужно поместить на форму окно Window1, на него панель Panel1, а к панели привязать событие

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    .....
            class Unit2 extends Page
            {
                   public $Panel1 = null;
                   public $Window1 = null;
                   function Panel1Show($sender, $params)
                   {
     
                  
                           echo '<iframe src ="http://forums.delphi-php.net/" height="100%" width="100%"></iframe>';
     
                           // а так грузиш свою другую форму
                           //echo '<iframe src ="Unit3.php" height="100%" width="100%"></iframe>';
     
                   }
     
            }
    .....

Автор: vicis 25.05.10, 04:08
Задача: сформировать список в Combobox
Решение:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    public function GetList($TempQuery,$ComboBox,$DataField)
    {
      $TempQuery->close();
      $TempQuery->open();
      $TempQuery->first();
      $ComboBox->Clear();
      while (!$TempQuery->eof)
      {
         $ComboBox->AddItem($TempQuery->$DataField);
         $TempQuery->next();
       }
    }
     
     
    //вызываем так
     
    $this->TempQuery->SQL = 'select Car_RegNum as xName from car order by Car_RegNum';
    GetListAuto($this->TempQuery,$this->ComboBox1, Car_RegNum );


Тема решения: ComboBox

Автор: vicis 25.06.10, 16:24
Задача: очистить свойство Text у всех компонент на форме
Решение: http://blog.onenerd.net/?p=69
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function ClearAllTextBoxes ()
    {
    try {
    foreach($this as $obj) {
    if(substr($obj->name,0,3)==”txt”) {
    $obj->Text = “”;
    }
    }
    } catch (Exception $e) {}
    }


или

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function ClearAllTextBoxes ()
    {
    reset($this->controls->items);
    while(list($key, $obj)=each($this->controls->items)) {
    if ($obj->inheritsFrom(”Edit”)) {
    $obj->Text = “”;
    }
    }
    }

Автор: vicis 28.06.10, 13:55
Задача: добавить ссылку на файл .js в форму
Рещение:
В событие OnShowHeader добавить

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    echo “<script language=\”javascript\” src=\”../_lib/js/validate.js\”></script>”;


Кроме того если у вас есть php библиотека функций, которую вы всегда включаете в страницы формы, добавьте туда следующую функцию:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function JSInclude($js_path_and_filename) {
    echo “<script language=\”javascript\” src=\”{$js_path_and_filename}\”></script>\n”;
    }


вызываем так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    JSInclude(”../lib/js/validate.js”);


Добавлено
Проблема: на одной кнопке висит два обработчика один php, а второй javascript
Событие Javascript срабатывает, но до события php никода не доходим
Решение:
в конец обработчика javascript добавить return true;

неправильно:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Button2Click($sender, $params)
    {
    echo “Мы никогда сюда не попадаем.”;
    }
    function Button2JSClick($sender, $params)
    {
    ?>
    //Add your javascript code here
    alert(”Это видим всегда”);
    <?php
    }


правильно
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function Button2Click($sender, $params)
    {
    echo “И это теперь видим.”;
    }
    function Button2JSClick($sender, $params)
    {
    ?>
    //Add your javascript code here
    alert(”return true;”);
    return true;
    <?php
    }

Автор: vicis 07.07.10, 19:14
Прблема: при переносе на провайдер проект н работает с компонентами ExtJS
Решение: на провайдере обычно нужнот учитывать регистр букв, в отличии от Windows

меняем Ext на ext здесь:
файл vcl/ext/functions.inc.php

было так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/Ext/library/resources/css/ext-all.css" />
    <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/Ext/library/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/Ext/library/ext-all.js"></script>
    <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/Ext/library/examples/examples.js"></script>
    <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/Ext/library/examples/examples.css" />


стало так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/ext/library/resources/css/ext-all.css" />
    <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/ext/library/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/ext/library/ext-all.js"></script>
    <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/ext/library/examples/examples.js"></script>
    <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/ext/library/examples/examples.css" />

Автор: vicis 21.09.10, 07:29
Проблема: не работает SimpleChart - не показывает график после добавления данных
Решение: после добавления компонента на форму проверить:
порядок подключения модулей

нужно так (закоментированное - это неправильно)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    /*
    require_once("rpcl/rpcl.inc.php");
    use_unit("forms.inc.php");
    use_unit("extctrls.inc.php");
    use_unit("stdctrls.inc.php");
    use_unit("chart.inc.php");  // <= это неправильно
    */
    require_once("rpcl/rpcl.inc.php");
    use_unit("chart.inc.php");  // <= это правильно
    use_unit("forms.inc.php");
    use_unit("extctrls.inc.php");
    use_unit("stdctrls.inc.php");

Автор: vicis 03.11.10, 13:15
Задача: Динамически создать объекты на форме и прописать им события
Решение: вариант на примере динамического создания 10 чекбоксов с событием на JS
Примечание: проверено в RadPHP XE, версия rpcl=289
На 2-й версии не сработало, но думаю что если обновить vcl до rpcl должно работать (во накрутили названий...:) )
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?php
    require_once("rpcl/rpcl.inc.php");
    //Includes
    use_unit("forms.inc.php");
    use_unit("extctrls.inc.php");
    use_unit("stdctrls.inc.php");
     
    //Class definition
    class Page2 extends Page
    {
        public $Panel1 = null;
        function Page2StartBody($sender, $params)
        {
          for($i = 1; $i <= 10; $i++)
          {
     
             $xch = new Checkbox($this);
             $xch->Left = 10;
             $xch->Top = $i * 20;
             $xch->Name = 'chb_' . $i;
             $xch->Caption = $xch->Name;
             $xch->setjsOnClick("ChbJSClick($xch->Name)");
             $xch->Parent = $this->Panel1;
            // $xch->show();
          }
        }
        function Page2BeforeShow($sender, $params)
        {
        echo"
         <script type=\"text/JavaScript\">
         function ChbJSClick(thisobject)
         {
         alert(thisobject.name+' отмечено: '+thisobject.checked);
         }
         </script>
        ";
        }
     
    }
     
     
    global $application;
     
    global $Page2;
     
    //Creates the form
    $Page2 = new Page2($application);
     
    //Read from resource file
    $Page2->loadResource(__FILE__);
     
    //Shows the form
    $Page2->show();
     
    ?>

Автор: vicis 08.12.10, 11:55
Задача: выполнить хранимую процедуру MySQL и получить результат в DbGrid
Решение: Хранимая процедура не работает (сообщение #2772214)

Автор: vicis 10.12.10, 16:31
Задача: выполнить цепочку AJAX процедур, когда одна вызывает выполнение другой
Решение:

Рассмотрим на примере двух DBGrid работающих по принципу Master-Detail
При изменении строки в первом гриде вызываем ajax процедуру на фильтрацию данных во втором гриде.
А после перечитывания и отрисовки данных второго грида автоматически вызываем ajax процедуру для вывода сообщений или выполнения других функций на JS.

На форме:
DBGrid1, DBGrid2, Edit1, AjaxScripter1
Оба грида подключены к одной и той же таблице (через соответствующие компоненты), у которой ключевое поле TEST_ID.
При выборе записи в первой таблице возьмём значение TEST_ID этой записи, пропишем его в Edit1 и отфильтруем по нему DBGrid2 (через компонент Table2, к которому подключен грид).
После этого установим фокус на первую строку во второй таблице и выведем сообщение.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      function DBGrid1JSRowChanged($sender, $params)
          {
          ?>
          params = DBGrid1.getTableModel().getValue(0, DBGrid1.getFocusedRow());
     
          <?php
          echo $this->DBGrid1->ajaxCall("xxx",  array("DBGrid1"));
     
          ?>
     
          <?php
     
          }
     
          function xxx($sender, $params)
          {
          $this->Edit1->Text = $params[0];
          $this->Table2->Filter = "TEST_ID=$params[0]";
          $this->Table2->refresh();
          $this->AjaxScripter1->Script = '
                //DBGrid1.getTableColumnModel().setColumnVisible(0, false);  - здесь мы могли бы установить видимость колонки в гриде или сделать другие установки
                var xx =document.getElementById("Edit1").value;
                DBGrid2.getSelectionModel().setSelectionInterval(0, 0);
                ';
          }
     
     
        function Page10AfterShow($sender, $params)
        {
                  echo '
                      <script type="text/JavaScript">
                              DBGrid1.getTableColumnModel().setColumnVisible(0, false);
                              DBGrid2.getTableColumnModel().setColumnVisible(0, false);
                      </script>
                      ';
     
        }
        function DBGrid2JSRowChanged($sender, $params)
          {
          ?>
          params = DBGrid2.getTableModel().getValue(0, DBGrid2.getFocusedRow());
     
          <?php
     
          echo $this->DBGrid1->ajaxCall("yyy",  array("DBGrid2"));
     
          ?>
     
          <?php
     
          }
     
     
     
          function yyy($sender, $params)
          {
          $this->AjaxScripter1->Script = '
                alert(\'Я сработал после обновления грида 2\');
                ';
          }


компонент AjaxScripter не входит в стандартную поставку, но давно описан здесь
Delphi for PHP (RAD PHP XE): Компоненты (сообщение #2410953)

Сообщения были разделены в тему "Пустая вкладка при старте проекта"

Автор: vicis 17.02.11, 10:46
Задача: Получить список методов объекта JS
Решение: используем функцию
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      function Page1BeforeShow($sender, $params)
       {
    echo '
    <script type="text/javascript">
     
    function fnShowProps(obj, objName){
      var result = "";
      for (var i in obj)
          result += objName + "." + i + " = " + obj[i] + "<br />\n";
      document.write(result);
    }
    </script>
    ';
       }
       function Label1JSClick($sender, $params)
       {
           ?>
           //begin js
           //  fnShowProps(window.location, "location");
           //  fnShowProps(Label1, "Label1");
           fnShowProps(LabeledEdit1, "LabeledEdit1");
     
           //end
           <?php
       }


Сообщения были разделены в тему "пытаюсь разместить пробную страничку на хостинге"

Автор: vicis 10.03.11, 15:33
Проблема: Deployment Wizard не всегда копирует нужные файлы в папку rpcl
Решение:

делает это самостоятельно
1. выполняем Deployment Wizard
2. создаём файл copy_rpcl.bat
кидаем его в ту директорию, в которую экспортировали проект
3. выполняем

содержимое copy_rpcl.bat
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    @echo off
     
    rem кидаем файл в нужную папку и запускаем, файлы будут скопированы в подпапку этой папки
     
    set folderRPCLsource=C:\Program Files\Embarcadero\RadPHP\3.0\rpcl
     
    rem папка куда копировать (если rpcl, то скопирует в текущую папку, в подпапку rpcl)
    set folderRPCLdest=rpcl
     
    cls;
    echo 1 - копировать всю папку RPCL (не включая svn)
    echo 2 - копировать только необходимый минимум папок RPCL (не включая svn)
    echo 0 - прекратить это безобразие :)
    echo;
     
    set /P variantcopy="Введите вариант копирования: "
     
        if "%variantcopy%" == "1"  goto all  ELSE goto minimum
        if "%variantcopy%" == "0"  goto end1
    :minimum
     
      rem здесь сами себе задаём минимум необходимых папок
     
      mkdir "%folderRPCLdest%"
      xcopy "%folderRPCLsource%" "%folderRPCLdest%\*.php" /Y
     
      mkdir "%folderRPCLdest%\qooxdoo"
      xcopy "%folderRPCLsource%\qooxdoo" "%folderRPCLdest%\qooxdoo" /R/E/K/Y
     
      mkdir "%folderRPCLdest%\adodb"
      xcopy "%folderRPCLsource%\adodb" "%folderRPCLdest%\adodb" /R/E/K/Y
     
      mkdir "%folderRPCLdest%\js"
      xcopy "%folderRPCLsource%\js" "%folderRPCLdest%\js" /R/E/K/Y
     
      mkdir "%folderRPCLdest%\xajax"
      xcopy "%folderRPCLsource%\xajax" "%folderRPCLdest%\xajax" /R/E/K/Y
     
      mkdir "%folderRPCLdest%\language"
      xcopy "%folderRPCLsource%\language" "%folderRPCLdest%\language" /R/E/K/Y
     
      mkdir "%folderRPCLdest%\smarty"
      xcopy "%folderRPCLsource%\smarty" "%folderRPCLdest%\smarty" /R/E/K/Y
     
      echo 'Скопирован необходимый МИНИМУМ';
      goto end;
     
    :all
      mkdir "%folderRPCLdest%"
      xcopy "%folderRPCLsource%" "%folderRPCLdest%" /R/E/K/Y
      echo 'Скопировано ВСЁ';
      goto end;
     
     
    :end
    pause
    :end1


теперь в папке экспорта находятся нужные файлы для переноса на сервер

Автор: vicis 11.04.11, 12:30
Проблема: QDBGrid1 на QWindow1 не работает, работает когда оба просто на форме
Решение:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
       function QWindow1BeforeShow($sender, $params)
       {
       $this->QDBGrid1->dumpRPC();
     
       }

Автор: vicis 12.04.11, 13:04
Проблема: В RadPhp XE не получается подключится к MSSQL 2000 с помощью DataExplorer
Решение: Качаем новый клиент MSSQL отсюда
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c6c3e9ef-ba29-4a43-8d69-a2bed18fe73c
а конкретно этот: http://go.microsoft.com/fwlink/?LinkId=123717&clcid=0x409

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)