Задать вопрос
  • Как подружить php и nodejs?

    egor_nullptr
    @egor_nullptr
    Комментировать
  • Как делают браузеры - клоны Google Chrome? Такие как Яндекс браузер, Амиго (от mail.ru), Opera и т.п?

    foxmuldercp
    @foxmuldercp
    Системный администратор, программист, фотограф

    на C# вы себе вполне можете использовать движок IE, готовые контролы предлагаются.
    Можно, в принципе как говорили выше, повозится и сделать свой webkit-based броузер.

    Ответ написан
    3 комментария
  • Как делают браузеры - клоны Google Chrome? Такие как Яндекс браузер, Амиго (от mail.ru), Opera и т.п?

    ExileeD
    @ExileeD
    PHP/Python developer

    Они используют Chromium . там открыт, и интерфейс и движок.
    Eсли вам нужет только двиг то можно использовать Webkit.net. А если интерфейс + двиг . то без С++ не обойтись.

    Ответ написан
    2 комментария
  • Как использовать свою службу в php шаблонизаторе Symfony 2?

    MuXaJIbI4
    @MuXaJIbI4
    так получи свой сервис в контроллере и передай его в шаблон
    Ответ написан
    2 комментария
  • Symfony. Doctrine. Many-to-One. Выбрать одним запросом, коротко?

    Inori
    @Inori
    Правильный ответ:
    «сделать отдельный метод в репозитарии, что-то вроде findPostsJoinAuthors(...), там уже запользовать билдер»

    Скорее всего желаемый ответ: проставить fetch=«EAGER» в конфиге связи вот так.
    Ответ написан
    1 комментарий
  • Bundle для категоризации любой вложенности для Symfony2?

    svscorp
    @svscorp Автор вопроса
    Кстати, собственно реализация решения… вдруг пригодиться:

    1) Создаем Entity:

    <?php
    // src/Acme/DemoBundle/Entity/Category.php
    namespace Acme\DemoBundle\Entity;
    
    use Gedmo\Mapping\Annotation as Gedmo;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @Gedmo\Tree(type="nested")
     * @ORM\Table(name="categories")
     * use repository for handy tree functions
     * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
     */
    class Category
    {
        /**
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        private $id;
    
        /**
         * @Gedmo\Translatable
         * @ORM\Column(name="title", type="string", length=64)
         */
        private $title;
    
        /**
         * @Gedmo\TreeLeft
         * @ORM\Column(name="lft", type="integer")
         */
        private $lft;
    
        /**
         * @Gedmo\TreeLevel
         * @ORM\Column(name="lvl", type="integer")
         */
        private $lvl;
    
        /**
         * @Gedmo\TreeRight
         * @ORM\Column(name="rgt", type="integer")
         */
        private $rgt;
    
        /**
         * @Gedmo\TreeRoot
         * @ORM\Column(name="root", type="integer", nullable=true)
         */
        private $root;
    
        /**
         * @Gedmo\TreeParent
         * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
         * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
         */
        private $parent;
    
        /**
         * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
         * @ORM\OrderBy({"lft" = "ASC"})
         */
        private $children;
    
        /**
         *
    
         * @Gedmo\Translatable
    
         * @Gedmo\Slug(fields={"title"})
    
         * @ORM\Column(name="slug", type="string", length=128)
    
         */
    
        private $slug;
    
        public function getId()
        {
            return $this->id;
        }
    
        public function getSlug()
    
        {
    
            return $this->slug;
    
        }
    
        public function setTitle($title)
        {
            $this->title = $title;
        }
    
        public function getTitle()
        {
            return $this->title;
        }
    
        public function setParent(Category $parent = null)
        {
            $this->parent = $parent;
        }
    
        public function getParent()
        {
            return $this->parent;
        }
    }
    


    2. В контроллере реализуем добавление категорий:

                use Acme\DemoBundle\Entity\Category as CategoryEntity;
    
                // ... your code before
                $em = $this->getDoctrine()->getManager();
                $cat1= new CategoryEntity();
                $cat1->setTitle('Фрукты');
                
                $subcat = new CategoryEntity();
                $subcat->setTitle('Экзотические');
                $subcat->setParent($cat1);
         
                $cat2 = new CategoryEntity();
                $cat2->setTitle('Овощи');
    
                $em->persist($cat1);
                $em->persist($cat2);
                $em->persist($subcat);
                $em->flush();
         
    


    Вы получите меню вида:
    — Фрукты
    — — Экзотические
    — Овощи

    3) Получаем список категорий (в виде массива):

    // ...
    $categoryEntity = $this->em->getRepository('Acme\DemoBundle\Entity\Category');
    $categories = $categoryEntity->childrenHierarchy();
    // ...
    


    Успехов!
    Ответ написан
    1 комментарий
  • Проблема с отображением примененных стилей PHP->Excel

    NikitaTratorov
    @NikitaTratorov Автор вопроса
    CTO
    А ларчик просто открывался.
    Формат ячеек нужно применять только после применения стилей для таблицы.
    Т.е. сначала SetSharedStyle(), и только потом ApplyFormatCell().
    Ответ написан
    1 комментарий
  • Идеальное ТЗ

    @scrivener
    Ну во-первых, я думаю что вы конечно знаете про agile и прочие «гибкие» методологии разработки — в этом случае детализированное ТЗ вообще отсутствует (используются user stories, скетчи и т.п.) — см. например 6 причин, по которым вам не стоит писать функциональные спецификации и множество подобных материалов на Хабре

    Во-вторых, что касается структуры документа, предлагаемого ГОСТ-ом — по моему опыту не совсем удобно — нужно все таки называть вещи своими именами.

    Лучше все это разделить на несколько документов:
    — envisioning (концепция) — обобщенный документ, в котором рассказано что, зачем и какими силами/средствами мы хотим достичь
    — функциональная спецификация (как правило это и называется ТЗ) — что собственно делать система должна, как выглядеть и т.п.
    — техническая спецификация (если необходима) — в основном этот документ для самих девелоперов, но может использоваться для согласования использования фреймворков, СУБД и т.п.
    — если проект может быть разделен на блоки, спецификаций может быть несколько — каждого блока.

    В спецификациях, как правило, применяются UML диаграммы (но опять же, на Хабре некоторые считают что «UML умер»).

    В общем — основная идея спецификации — чтобы заказчик и исполнитель говорили на одном и том же языке (см. ubiquitous language в концепции Domain Driven Design) и одинаково понимали что же нужно сделать.

    Удачи Вам в этом нелегком деле :)
    Ответ написан
    Комментировать
  • Как реализовать блочную струкутру проекта на Symfony?

    Inori
    @Inori
    У Twig есть функция render как раз для таких нужд
    Пример:
    {% render 'AcmeDemoBundle:User:login' %}

    Symfony2 сделает запрос к UserController::loginAction(), который и будет отвечать за подготовку и рендер шаблона с формой логина.

    Пример из реального проекта: github.com/KnpLabs/KnpBundles/blob/master/src/Knp/Bundle/KnpBundlesBundle/Resources/views/layout.html.twig#L35
    github.com/KnpLabs/KnpBundles/blob/master/src/Knp/Bundle/KnpBundlesBundle/Controller/DeveloperController.php#L25-#L33
    Ответ написан
    2 комментария
  • Пришло ли время для CSS3 и HTML5?

    miraage
    @miraage
    Старый прогер
    Помню видел комментарий: «Пользователи IE должны страдать».
    Ответ написан
    Комментировать
  • Insert в событии postPersist?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Я делал так.
    class LogListener implements EventSubscriber
    {
        private $container;
    
        public function __construct(ContainerInterface $container)
        {
            $this->container = $container;
        }
    
        public function getSubscribedEvents()
        {
            return array(Events::postUpdate, Events::postPersist, Events::preRemove);
        }
    
        public function postUpdate(LifecycleEventArgs $eventArgs)
        {
            $this->log($eventArgs, Log::ACTION_UPDATE);
        }
    
        public function postPersist(LifecycleEventArgs $eventArgs)
        {
            $this->log($eventArgs, Log::ACTION_PERSIST);
        }
    
        public function preRemove(LifecycleEventArgs $eventArgs)
        {
            $this->log($eventArgs, Log::ACTION_REMOVE);
        }
    
        private function log(LifecycleEventArgs $eventArgs, $action)
        {
            $token = $this->container->get('security.context')->getToken();
            if (!$token) {
                return;
            }
    
            $user = $token->getUser();
            if (!($user instanceof User)) {
                return;
            }
    
            $entity = $eventArgs->getEntity();
            if ($entity instanceof Log) {
                return;
            }
    
            $request = $this->container->get('request');
    
            $log = new Log();
            $log->setAction($action);
            $log->setUser($user);
            $log->setIp($request->server->get('REMOTE_ADDR'));
            $log->setEntityClass(get_class($entity));
            $log->setEntityId($entity->getId());
    
            $em = $this->container->get('doctrine')->getEntityManager();
    
            $meta = $em->getClassMetadata(get_class($log));
            $conn = $em->getConnection();
    
            foreach ($meta->getReflectionProperties() as $fieldName => $reflProp) {
                if (!$meta->isIdentifier($fieldName)) {
                    $columns[] = $fieldName;
                    $values[] = ':' . $fieldName;
                }
            }
    
            $insertSql = 'INSERT INTO ' . $meta->getQuotedTableName($conn->getDatabasePlatform())
                . ' (' . implode(', ', $columns) . ') '
                . 'VALUES (' . implode(', ', $values) . ')';
    
            $stmt = $conn->prepare($insertSql);
    
            $fields = $meta->getFieldNames();
            $association = $meta->getAssociationNames();
    
            foreach ($meta->getReflectionProperties() as $fieldName => $reflProp) {
                if (!$meta->isIdentifier($fieldName)) {
                    $value = $reflProp->getValue($log);
                    if (in_array($fieldName, $fields)) {
                        $mapping = $meta->getFieldMapping($fieldName);
                        $stmt->bindValue($meta->getColumnName($fieldName), $value, $mapping['type']);
                    } else if (in_array($fieldName, $association)) {
                        $classMeta = $em->getClassMetadata($meta->getAssociationTargetClass($fieldName));
                        list($classId) = $classMeta->getIdentifier();
    
                        $mapping = $classMeta->getFieldMapping($classId);
    
                        $associationIdProperty = $classMeta->getReflectionProperty($classId);
                        $associationValue = $associationIdProperty->getValue($value);
    
                        $stmt->bindValue($meta->getColumnName($fieldName), $associationValue, $mapping['type']);
                    } else {
                        throw new \Exception('Exception in log listener');
                    }
                }
            }
    
            $stmt->execute();
        }
    }
    
    Ответ написан
    Комментировать
  • Как получить куки с другого сайта

    @1nd1go
    находясь на сайте site.ru показать пользователю средствами js куки сайта статистики


    Так не получится в связи с политикой безопасности браузеров. Иначе все бы уже насобирали чужих сессий :) Только если ваш тот сайт будет отвечать по опредленному адресу и рефереру (для надежности) информацию из куки.
    Ответ написан
    1 комментарий