1

(6 ответов, оставленных в Symfony 2.0—2.2)

На носу висит новый проект. Не сильно большой, но и не маленький.
Вот думаю, имеет ли смысл подрываться и делать его на 2.0 или всё-таки 1.4 пока в разы надёжней и удобней.

Когда, кстати, нам обещают уже что-нибудь постабильней PR ?

2

(12 ответов, оставленных в Курилка)

http://www.symfony-project.org/jobeet/1_4/Doctrine/ru/

Для начала - идеально. Затем - официальная дока и дока доктрины.

Практика показала, что порой приходится ещё заглядывать ещё и вот сюда - http://www.symfony-project.org/api/1_4/ - но это уже в редких случаях.

3

(13 ответов, оставленных в Курилка)

Selectel? default/smile

Арендую там пару серваков и облако. Полёт отличный.

4

(43 ответов, оставленных в Курилка)

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

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

Всем советую перейти как можно скорее.

5

(5 ответов, оставленных в Плагины)

А смысл его использовать?

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

6

(3 ответов, оставленных в Symfony 1.3, 1.4)

Забыл в апаче переделать виртуал хост под новый проект. В итоге заходил в админку предыдущего, где, понятное дело, такого модуля не было.

Тему закрою.

7

(3 ответов, оставленных в Symfony 1.3, 1.4)

Столкнулся тут сегодня с такой проблемой.

В новом проекте описал модель в schema.yml. Модель отбилдил, вставил в бд. Далее хотел сгенерить админку

symfony doctrine:generate-admin backend Model --module=module

Открываю backend.php/module - вываваливается exeption - Action "module/index" does not exist.. Стал смотреть в чём дело. Из всего модуля создалась лишь пустая папка с классами, в config/generator.yml записей под экшены нет. Кода для реализации CRUD (и всего остального) в кэше не нашёл.

Честно говоря обескуражен. За пару лет работы с symfony первый раз такое. Недавно переполз с Propel на Doctrine, но на доктрине есть уже 3 рабочих проекта - там такой проблемы не было. Скорее всего забыл про какую-нибудь мелочь.

Кэш чистил. Где может быть косяк?

8

(9 ответов, оставленных в Symfony 1.3, 1.4)

Задачу решил. В cache.yml кэширование отключается. Дописываем собственный фильтр, с примерно таким кодом:

foreach ($this->getParameter('pages') as $page)
    {
      if ($page['userbased'])
      {
        $context->getViewCacheManager()->addCache($page['module'],
                                                  $page['action'],
                                                  array(
                                                    'lifeTime' => 86400,
                                                     'vary' => array('uid' => sfContext::getInstance()->getUser()->getId())));
      }
      else
      {
        $context->getViewCacheManager()->addCache($page['module'], $page['action'], array('lifeTime' => 86400));
      }
       
    }

Ну и в filters.yml

rendering: ~
security:  ~

userbasedCacheFilter:
  class: myCacheFilter
  param:
    pages:
      - { module: main, action: action, userbased: 0}
      - { module: main, action: action2, userbased: 0}
      - { module: main, action: action3, userbased: 0}
      - { module: main, action: action4, userbased: 0}
      - { module: main, action: action5, userbased: 0}
      - {module: main, action: action7, userbased: 1}
      - {module: main, action: action6, userbased: 1}
cache:     ~
execution: ~

9

(2 ответов, оставленных в Symfony 1.3, 1.4)

Буквально через неделю запускаем приложение для ВКонтакте и с первых же дней предполагается высокая посещаемость, растущая в практически геометрической прогрессии до некоторой величины. По предварительным оценкам максимальный онлайн - не более 50 000 хостов.

Один из партнёров готов предоставить практически неограниченные вычислительные мощности. Это плюс. Минус в том, что опыта разработки такого рода проектов практически нет. Работал в команде над парой подобных, но там такие задачи были вне моей компетенции.

Хотелось бы получить совет от знающих людей по следующим вопросам:

- Репликация БД. Стоит ли разносить по нескольким серверам, если около 50% запросов - это insert и update. Остальные 50% - выборки, которые тут же кэшируются.

- Горизонтальное масштабирование фронтенда (применительно к symfony). Есть ли подводные камни? Как быть с сессиями (там по сути только user_id хранится). Есть ли возможность задать для них централизованное хранилище? Или лучше использовать альтернативный storage (другую БД или кэш).

Советы, пожелания, вопросы также принимаю с радостью.

10

(9 ответов, оставленных в Symfony 1.3, 1.4)

Добрый день!

У меня в шаблоне часть экшнов генерят разные данные по одному и тому же урлу, так как выборка из БД делается на основе данных, хранящихся в сессии (user_id).

Однако стандартный кэш-менеджер воспринимает эти страницы как одну и ту же, поэтому для всех пользователей в кэше лежит одна и та же страница. Есть способ генерить разные кэши для партиалов (там передаётся ключ), а вот как это сделать для шаблона?

Документация и обзор API ничего не дали. Решал кто такую проблему?

Решение пришло случайно

Если делать проверку

if($slot->Toy)
  {
    // ...
  }

то лишних вопросов не возникает. А в случае

if($slot->toy_id)
  {
    // ...
  }

они есть. Объясните почему

А на пропеле работало default/smile

Это опять я default/smile. Ситуация следующая.

Был запрос

$r = Doctrine_Core::getTable('Fir')
          ->createQuery('f')
          ->leftJoin('f.slots s')
          ->limit(1)->execute();

Который выбирал из базы несколько записей, гидрировал их и при обращении к $r->slots и при последующем переборе as $slot->id, лишних запросов к бд не возникало.

Но когда я приджойнил ещё одну таблицу

$r = Doctrine_Core::getTable('Fir')
          ->createQuery('f')
          ->leftJoin('f.slots s')
          ->leftJoin('s.Toy t')
          ->limit(1);

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

Что я сделал не так и как сделать чтобы всё работало?

13

(2 ответов, оставленных в Symfony 1.3, 1.4)

Спасибо default/smile

Перешёл работать в sape.ru, а тут в качестве ORM используется доктрина. Постепенно осваиваюсь, благо доков много. Но вот недавно столкнулся с неразрешимой известными мне простыми способами проблемой.

Помнится, в админ генераторе Propel была такая штука

config:
  list:
    peer_method: doSelectJoinBlogArticle

Выборка джойнила то что нужно и в партиале, заменяющем ячейку, можно было обращаться к "приджойненному" классу без лишнего запроса к БД.

Для доктрины есть подобное решение?

Есть некий конфиг, который хранится в БД. Хочу выбирать его с помощью Propel оттуда и потом обращаться как-то так:

sfConfig::getInstance()->getMyConfig();

Есть варианты как это сделать, а то я кучу всего перерыл - и ноль результатов.

Что-то я торможу.

$img = ImageCreateTrueColor( 100, 100);


Как сделать, чтобы $img сохранилось на диск?

17

(1 ответов, оставленных в Symfony 1.3, 1.4)

Никак не могу понять суть проблемы. Указаны верные логин, пароль и хост для БД в databases.yml. В качестве хоста указан  mysql5.caravan.ru

Но выдаётся ошика Unable to open PDO connection [wrapped: could not find driver]

Бьюсь над проблемой уже неделю. В чём может быть проблема?

---
обычно такая ошибка выдаётся, когда неверно указаны параметры для соединения с БД. Но тут всё на 100% верно.

18

(1 ответов, оставленных в Symfony 1.3, 1.4)

С формы вида

<input type="file" name="attachment[0]">
<input type="file" name="attachment[1]">
и.т.п.

на сервер приходят файлы. Вопрос - как это дело грамотно обработать?

foreach ($request->getFiles('attachment') as $loaded_file) {
        
        $filename = $file->getId().$file->getExtension();
        $loaded_file->save(sfConfig::get('sf_upload_dir').'/attachments/'.$filename);
}

Оставил только нужный для топика код.

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

Array ( [name] => Array ( [1] => iconza_16x16_93cc2c.zip [2] => iconza_32x32_93cc2c.zip ) [type] => Array ( [1] => [2] => ) [tmp_name] => Array ( [1] => C:\WINDOWS\Temp\phpAC9C.tmp [2] => C:\WINDOWS\Temp\phpAC9D.tmp ) [error] => Array ( [1] => 0 [2] => 0 ) [size] => Array ( [1] => 68889 [2] => 146055 ) )

Вобщем вопрос: как перебрать пришедшие файлы по очереди?

----

Возможно просто туплю уже - полчетвёртого ночи у меня уже. Так что сильно не ругайте default/smile.

Как вовремя я тут появился. Заодно тебе помогу вот default/smile

http://yabadaba.ru/files/146260 - Держи. Тот глюк о котором писал выше вроде пофиксил в этой версии уже. Но точно не помню - давно дело было. Проверяй.

1.2 использую, старые перевёл на неё же. Удобней )

21

(6 ответов, оставленных в Symfony 1.3, 1.4)

название - в единственном пишу.

А как вы именуете булевые поля? я - по старинке is_***, но иногда тоже неудобно.

22

(22 ответов, оставленных в Symfony 1.3, 1.4)

я один думаю, что автору для начала надо почитать побольше ?

23

(19 ответов, оставленных в Symfony 1.3, 1.4)

Да всё нормально уже - поставил sf на сервер, настроил там APC - теперь всё летает.

--
А слайд в презентации с "Hello World" порадовал default/smile

Не, не доводилось -). Ну вот на текущем заказе и попрактикуюсь ))))))

Вы меня несколько не поняли default/smile
Мне хотелось бы не передавать второй массив опций валидатору - а писать все эти "Поле необходимо к заполнению " в отдельном конфиге. Просто точно помню - видел где-то такое.