Логика symfony
|
|
Upload файлов с помощью ajax (js)
Я создал модуль командой symfony init-module backend upload
В apps/backend/modules/upload/actions/action.class.php пишем такой код
class uploadActions extends sfActions
{
/**
* Executes index action
*
*/
public function executeIndex()
{
// Редирект на 404 если нет параметра claim_id
$this->forward404Unless($this->claim =
ClaimPeer::retrieveByPK($this->getRequest()->getParameter('claim_id')));
// Флаг для использования в шаблоне чтоб решить использовать js или нет
$this->isUploaded = false;
// Если пришли с POST
if($this->getRequest()->getMethod() == sfRequest::POST) {
if($uploaded_file = $this->getRequest()->getFileName('uploaded_file')) {
if(!empty($uploaded_file)) {
// очищаем $uploaded_filename
$this->getRequest()->moveFile('uploaded_file', './uploads/' . $this->claim->getClaimId()
. '/' . $uploaded_file, 0664, true, 0775);
$this->uploaded_webpath = $this->claim->getClaimId() . '/' . $uploaded_file;
$this->isUploaded = true;
// вставляем запись в таблицу
$claimdoc = new Claimdocs;
$claimdoc->setClaimId($this->claim->getClaimId());
$claimdoc->setFilename($uploaded_file);
$claimdoc->save();
}
}
}
}
}
Затем пишем apps/backend/modules/upload/templates/indexSuccess
<?php
use_helper('Upload');
// If we have just uploaded a file then we just run javascript to update the <div>
// Если только что загрузили файл запускаем яваскрипт чтоб обновить див
if($isUploaded == true) {
?>
<html><head><script>
var par = window.parent.document;
var images = par.getElementById('images');
var imgdiv = images.getElementsByTagName('div')[<?=(int)$_POST['imgnum']?>];
// не используем $_POST
var image = imgdiv.getElementsByTagName('img')[0];
imgdiv.removeChild(image);
var image_new = par.createElement('img');
image_new.src = '<?=upload_path($uploaded_webpath)?>';
image_new.className = 'loaded';
imgdiv.appendChild(image_new);
</script></head>
</html>
<?php
exit();
}
?><html><head>
<script language="javascript">
function upload(){
// hide old iframe
var par = window.parent.document;
var num = par.getElementsByTagName('iframe').length - 1;
var iframe = par.getElementsByTagName('iframe')[num];
iframe.className = 'hidden';
// create new iframe
/// Создаем новый фрейм
var new_iframe = par.createElement('iframe');
new_iframe.src = '<?=url_for('upload?claim_id='.$claim->getClaimId())?>';
new_iframe.frameBorder = '0';
par.getElementById('iframe').appendChild(new_iframe);
// добавляем картинку индикатора
var images = par.getElementById('images');
var new_div = par.createElement('div');
var new_img = par.createElement('img');
new_img.src = '<?=image_path('indicator.gif')?>';
new_img.className = 'load';
new_div.appendChild(new_img);
images.appendChild(new_div);
// отсылаем
var imgnum = images.getElementsByTagName('div').length - 1;
document.iform.imgnum.value = imgnum;
document.iform.submit();
}
</script>
<style>
#file {
width: 350px;
}
</style>
<head><body><center>
<form name="iform" action="" method="post" enctype="multipart/form-data">
<input id="file" type="file" name="uploaded_file" onchange="upload()" />
<input type="hidden" name="imgnum" />
<input type="hidden" name="claim_id" value="<?=$claim->getClaimId()?>" />
</form>
</center></html>
Теперь мы можем включить этот модуль в другой модуль.
Например в apps/backend/modules/claim/actions/actions.class.php примерно так
public function executeStep2()
{
// Make sure we have a valid claim_id
$this->forward404Unless($this->claim = ClaimPeer::retrieveByPK(
$this->getRequest()->getParameter('claim_id')));
$this->addStylesheet('upload.css');
// Получаем звязанную запись
$this->claimdocs = ClaimdocsPeer::getClaimdocs($this->claim->getClaimId());
return sfView::SUCCESS;
}
Затем в шаблоне apps/backend/modules/claim/templates/step2Success.php
<?php
use_helper('Upload');
?>
<h1>File Upload</h1>
<div id="iframe">
<iframe src="<?=url_for('upload?claim_id='.$claim->getClaimId())?>" frameborder="0"></iframe>
</div>
<div id="images">
<?php foreach($claimdocs as $claimdoc): ?>
<div><img src="<?=upload_path($claimdoc->getClaimId().'/'.$claimdoc->getFilename())?>"></div>
<?php endforeach ?>
</div>
Here's the 'Upload' helper you see referenced in my code. Put it in apps/backend/lib/helper/UploadHelper.php
Это upload хэлпер, его нужно положить в apps/backend/lib/helper/UploadHelper.php
<?php
use_helper('Asset');
function upload_path($source)
{
return _compute_public_path($source, 'uploads', false);
}
?>
|
9 сентября 2008 г. |
|
|
|
Верстка в symfony
|
|
Вставляем индикатор загрузки формы
Часто при загрузке через форму больших файлов проcят вставить индикатор.
Я его вставляю так в шаблоне:
// вызов ф-ции при submit формы
<?php echo form_tag('Docsfile/save', array(
'multipart' => true,
'onsubmit' =>'upload()'
)) ?>
сама функция
<script language="javascript">
function upload(){
var par = window.parent.document;
var div = par.getElementById('indic');
div.visibility ="visible";
div.style.display = "";
}
</script>
div с картинкой индикатора
<div id="indic" style="display: none">
<?php echo image_tag('/images/indicator.gif') ?>
<font color="red">Загрузка...</font>
</div>
|
9 сентября 2008 г. |
|
|
|
Блог сайта
|
|
Панельки редактирования в блоги
Добавил панельки редактирования в блоги.
в шаблоне проверка на доступность такая
<?php
if($sf_user->hasCredential('admin') or
sfContext::getInstance()- >
getUser()->getAttribute( 'user_id', null, 'sfGuardSecurityUser' )==$blog->getUserId() ):
?>
|
6 сентября 2008 г. |
|
|
|
Блог сайта
|
|
Добавил табы в редактирование статей
Разбил на закладки форму редактирования статей
|
6 сентября 2008 г. |
|
|
|
Логика symfony
|
|
Аплоад (upload) файлов
if (!$this->getRequest()->hasErrors() && $this->getRequest()->getFileSize('file'))
{
$currentFile = sfConfig::get('sf_upload_dir')."//".$ans->getFilePath();
$fileName = md5($this->getRequest()->getFileName('file').time().rand(0, 99999));
$ext = $this->getRequest()->getFileExtension('file');
if (is_file($currentFile))
{
unlink($currentFile);
}
$this->getRequest()->moveFile('file', sfConfig::get('sf_upload_dir')."//".$fileName.$ext);
$ans->setFilePath($fileName.$ext);
}
|
5 сентября 2008 г. |
|
|
|
sfGuardUserPlugin
|
|
Устраняем баг с "запомнить меня"
Для этого в файле lib/zdOnlineFilter.class.php
изменяем:
class zdOnlineFilter extends sfFilter
{ .....
|
5 сентября 2008 г. |
|
|
|
Мультиязычность в symfony
|
|
Использование функции __() в action модуле.
При попытке использовать эту ф-цию предварительно не подгрузив хелпер будет ошибка
Fatal error: Call to undefined function __()
Поэтому нужно подгрузить хэлпер.
sfLoader::loadHelpers('I18N');
И использовать примеро так:
$this->getResponse()->addMeta('title', __('Отзывы работы'));
|
|
|
Конфигурирование symfony
|
|
Как пробежаться по массиву определенному в app.yml
Я поступаю так:
определяем массив
пробегаюсь
$i = 0;
while ( sfConfig::get("app_lang_".$i) )
{
echo sfConfig::get("app_lang_".$i);
$i++;
}
может кто подскажет более изящный пример
|
4 сентября 2008 г. |
|
|
|
Prorel & symfony
|
|
Произвольные сырые запросы
Propel::getConnection()->executeUpdate("TRUNCATE TABLE ".$table);
Propel::getConnection()->executeQuery("TRUNCATE TABLE ".$table);
$connection = Propel::getConnection();
$query = 'SELECT MAX(%s) AS max FROM %s';
$query = sprintf($query, ArticlePeer::CREATED_AT, ArticlePeer::TABLE_NAME);
$statement = $connection->prepareStatement($query);
$resultset = $statement->executeQuery();
$resultset->next();
$max = $resultset->getInt('max');
$crit1=$c->getNewCriterion('subscribe.date_expire', 'TO_DAYS(NOW()) > TO_DAYS(subscribe.date_expire)-6',
Criteria::CUSTOM);
$crit2=$c->getNewCriterion(SubscribePeer::DATE_EXPIRE, '1999-01-01',Criteria::NOT_EQUAL);
|
4 сентября 2008 г. |
|
|
|
Логика symfony
|
|
Фильтр по связанному полю.
Как сделать фильтр в админ модуле по связанному полю.
Я так делаю:
в generator.yml
fields:
link_personage:
filter_criteria_disabled: true
filters: [ _link_personage]
_link_personage.php
<?php if ($type == 'filter'): ?>
<?php echo input_tag('filters[pers]', isset($filters['pers']) ?
$filters['pers'] : null,
array ('size' => 15)) ?>
<?php else: ?>
<?php echo link_to($forum_message->getPersonage()->getName(),
'pers/edit?id='.$forum_message->getPersonage()->getId()) ?>
<?php endif ?>
и в actions
protected function addFiltersCriteria($c)
{
parent::addFiltersCriteria($c);
if (isset($this->filters['pers_is_empty']))
{
$criterion = $c->getNewCriterion(PersonagePeer::NAME, '');
$criterion->addOr($c->getNewCriterion(PersonagePeer::NAME, null, Criteria::ISNULL));
$c->add($criterion);
}
else if (isset($this->filters['pers']) && $this->filters['pers'] !== '')
{
$c->add(PersonagePeer::NAME, strtr($this->filters['pers'], '*', '%'), Criteria::LIKE);
$c->addJoin(TeamsPeer::ID, PersonagePeer::ID_TEAM, Criteria::LEFT_JOIN);
}
}
|
2 сентября 2008 г. |
|
|
|
Верстка в symfony
|
|
Раскрашиваем строки таблицы
В админ модулях это реализовано следующим образом:
В шаблоне
<?php
$n=0;
foreach($result_blog->getResults() as $blog):
$odd = fmod(++$n, 2)
?>
<tr class="tbl_td<?php echo $odd ?>">
в стилях соответственно
.tbl_td0
{
background: #EFF7FF;
}
.tbl_td1
{
background: #DFEEFF;
}
|
2 сентября 2008 г. |
|
|
|