CGI:: Параметр приложения () не установлен

#perl #templates #param #cgi-application #perl-html-template

#perl #шаблоны #параметр #cgi-приложение #perl-html-template

Вопрос:

У меня есть фрагмент кода, который использует CGI::Application в качестве основы, но что-то работает неправильно.

Когда я пытаюсь что-то установить через $Template->param() , это, похоже, не устанавливается. $Template равно $self->load_tmpl($template);

И часть, которую я хочу сохранить, это:

 $Template->param('symbols' => %a_hash_ref);
  

Я знаю, что %a_hash_ref содержит ожидаемое значение. Он имеет похожую форму:

 {'symbol' => 'DTX'},{'symbol' => 'QFLD'}
  

Кроме того, если я сделаю

 $Template->param('Hey!xD' => 'Something');
  

это не сохраняет, но

 $Template->param($Pagination);
  

делает, где $Pagination также является hash_ref .

Я знаю, что все значения такие, какими они должны быть, и я также попробовал это с несколькими простыми строками, которые должны работать, но они не установлены. Я знаю это, потому что, когда я запускаю:

 my @params = $Template->param();
die Dumper @params;
  

он выводит все переменные, которые он должен был установить, но ожидаемые (включая 'Hey!xD' строку) отсутствуют. Я также знаю, что на самом деле он запускает код, потому что этот файл сброса появляется после того, как я пытаюсь установить значения.

Файл шаблона содержит этот фрагмент кода:

$(документ).готово(функция () { mainFunction(‘[%symbol%]’); });

Буду признателен за любую помощь.

Редактировать:

Это то, что присваивается параметру:

[ { ‘date’ => ‘2006-07-05’, ‘avg_gain’ => undef, ‘bollinger_mid’ => ‘32.80000’, ‘symbol’ => ‘BBQ’ }, { ‘date’ => ‘2006-04-04’, ‘avg_gain’ => undef, ‘bollinger_mid’ => ‘34.55656’, ‘symbol’ => ‘AAPL’ } … ]

Ответ №1:

На самом деле это проблема с HTML:: Template, который CGI:: Application использует по умолчанию для создания шаблонов.

Возможно, вы die_on_bad_params установили значение 0 в своем load_tmpl вызове? HTML::Template по умолчанию должен умереть, если вы попытаетесь установить параметр, которого нет в загруженном шаблоне (документы здесь). Когда die_on_bad_params отключен, вы получите описываемое вами поведение, при котором неизвестный параметр шаблона игнорируется и отбрасывается.

Кроме того, согласно документам, TMPL_LOOP принимает arrayref хэш-ссылок в качестве param аргумента. Возможно, это помогло бы передать ваш параметр «symbols» следующим образом:

 my $symbols = [{ symbol => 'DTX' },{ symbol => 'QFLD' }];
$Template->param(symbols => $symbols);
  

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

Комментарии:

1. Да, у меня установлено значение 0! Спасибо! Если он исчезнет, когда я попытаюсь установить параметр, который еще не существует в шаблоне, как я могу тогда установить этот параметр? Я прочитал документы и не понимаю, почему $Template-> param(‘symbols’) не существует. В моем шаблоне у меня есть это: <ИМЯ TMPL_LOOP = «symbols» > fetchQuoteData(‘[%symbol%]’); < /TMPL_LOOP>

2. Привет, я добавил некоторую TMPL_LOOP информацию из документов, которая может помочь.

3. Конечно, большое вам спасибо за вашу помощь. По-видимому, я отправляю arrayref из hashrefs. Я добавлю код в качестве редактирования

4. Ошибка заключалась в том, что у меня были пробелы между < и TMPL_LOOP , поэтому он не обработал это. В любом случае спасибо! Ты потрясающий 😉

5. Рад, что теперь это работает. Я никогда не использовал HTML::Template, но это кажется действительно сложным. Я знаю, что не очень полезно рекомендовать другие пакеты / фреймворки, когда вы уже вложили средства, но рассматривали ли вы возможность использования Template:: Toolkit ? Это проверенная и гибкая система шаблонов, которой я часто пользовался. Также есть плагин для CGI:: App (CGI::Application::Plugin::TT).