Задать вопрос
  • Как сделать checkbox равным 0 или 1?

    @T_verdisla_V Автор вопроса
    Всеравно itemIsThumb равно либо значению value, либо если его убрать то равняется "on". И еще phpstorm почему-то ругается на let.
  • Как сделать checkbox равным 0 или 1?

    @T_verdisla_V Автор вопроса
    Не могли бы вы показать как это условие вставить в вторую функцию js, я просто с ним вообще не дружу?
  • Как сделать что бы тег li был по ширине экрана?

    @T_verdisla_V Автор вопроса
    Забыл в html вставить этот код
    <script type="text/javascript">
        $(document).ready( function(){
            var buttons = { previous:$('#lofslidecontent45 .lof-previous') ,
                next:$('#lofslidecontent45 .lof-next') };
    
            $obj = $('#lofslidecontent45').lofJSidernews( { interval : 4000,
                direction		: 'opacitys',
                easing			: 'easeOutBounce',
                duration		: 1200,
                auto		 	: true,
                mainWidth       : 980,
                buttons			: buttons} );
        });
    </script>
  • Как сделать что бы тег li был по ширине экрана?

    @T_verdisla_V Автор вопроса
    Никита Дергачев, ссылка на кодmOeR Я что то и забыл про кодепен. Максим Тимофеев, может теперь будет понятно откуда direction = 'opacity'?
  • Как из многомерного массива сделать несколько одномерных?

    @T_verdisla_V Автор вопроса
    Максим Федоров, Извиняюсь, разобрался. Виджет отлично принимает объект. Я просто обращался к нему как к массиву.
  • Как из многомерного массива сделать несколько одномерных?

    @T_verdisla_V Автор вопроса
    Максим Федоров, Для начала, я работаю в ZF3 с подключением к БД через Doctrine.
    При запросе, такого вида, к БД
    function getAllMainCategoriesWithChildren($parentId) {
            $queryBuilder = $this->getEntityManager()->createQueryBuilder();
            $queryBuilder
                ->select('f')
                ->from($this->getClassName(), 'f')
                ->where('f.parentId = :parentId')
                ->setParameter('parentId', $parentId)
                ->orderBy('f.main', 'ASC');
            $categories = $queryBuilder->getQuery()->getResult();
    
            foreach ($categories as $category)
            {
                $rsChildren = $this->ChildrenCategory($category->getMain());
                if($rsChildren){
                    $category->children = $rsChildren;
                }
            }
            return $categories;
        }


    Доктрина возвращает объект Entity. Но для виджета мне необходим массив. Поэтому мне приходится изменять запрос. Указывая те поля которые мне нужны. И тогда я получаю многомерный массив. И для дальнейшей работы мне необходимо разбить его на отдельные массивы.
  • Как из многомерного массива сделать несколько одномерных?

    @T_verdisla_V Автор вопроса
    Алексей Уколов, мне нужно использовать ключи вложенных массивов для дальнейших обращений к БД.
  • Как правильно переделать строку?

    @T_verdisla_V Автор вопроса
    Да не вопрос))
    В IndexController идет запрос к БД на получение всех фото соответствующих критерию.
    namespace Application\Controller;
    
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    
    
    
    class IndexController extends AbstractActionController
    {
        /**
         * Traits.
         */
        use \Fork\Zend\ServiceManager\Traits\ServiceManagerAwareTrait;
        use \Application\Service\Traits\AsutpServiceAwareTrait;
        use \Application\Service\Traits\MenuServiceAwareTrait;
        use \Application\Service\Traits\FotoServiceAwareTrait;
    
    
        public function indexAction()
        {
            $menu = $this->getMenuService()->getMenu();
            $viewModel = new ViewModel(['menu'  => $menu]);
            return $viewModel;
        }
    
        public function asutpAction()
        {
            $menuId = $this->params()->fromRoute('id', -1);
            $foto = $this->getAsutpService()->getFotoByParentId($menuId);
            $menu = $this->getMenuService()->getMenu();
            $files = $this->getFotoService()->getSavedFiles();
          /**$debugObject = $foto;
    // $debugObject = array_keys($debugObject);
            if (is_object($debugObject)) {
                \Zend\Debug\Debug::dump(get_class_vars(get_class($debugObject)) + get_class_methods($debugObject), '<p style="color:blue">' . get_class($debugObject) . '</p>');
            }
            else {
                \Zend\Debug\Debug::dump($debugObject);
            }*/
            $viewModel = new ViewModel(['foto'      => $foto,
                                        'menu'      => $menu,
                                        'files'     => $files]);
    
            return $viewModel;
        }

    Полученный объект возвращаем во вьюху.
    Во вьюхе обрабатываем полученный объект и уже массивом передаем его в виджет
    $thumb = [];
    
        foreach ($foto as $f)
        {
            $thumb[] = $f;
        }
        $this->miniFoto()->setThumb($thumb, $files);
        echo $this->miniFoto()->render();


    Ну и сам виджет.
    namespace Application\View\Helper;
    
    use Zend\View\Helper\AbstractHelper;
    
    
    class Thumb extends AbstractHelper
    {
        /**
         * Menu thumb array.
         * @var array
         */
        protected $thumb;
    
        protected $files;
    
        /**
         * Constructor.
         * @param array $thumb Thumb thumb.
         */
        public function __construct($thumb=[], $files=[])
        {
            $this->thumb = $thumb;
            $this->files = $files;
        }
    
        /**
         * Sets thumb thumb.
         * @param array $thumb Thumb thumb.
         */
        public function setThumb($thumb)
        {
            $this->thumb = $thumb;
    
        }
    
        public function render()
        {
            if (count($this->thumb)==0)
                return ''; // Do nothing if there are no items.
    
            $result = '<div class="col-2">';
            $result .= '<div class="row">';
            $result .= '<div class="col">';
            $result .= '<p class="text-center">Примеры реализованных проектов</p>';
            $result .= '</div>';
            $result .= '</div>';
    
            // Визуализация элементов
    
                foreach ($this->thumb as $item)
                {
                    if (preg_match('/[a-z][0-9]+\.[png]+/i', $item['image'] ))
                    {
                        $result .= $this->renderItem($item);
                    }
                }
    
            $result .= '</div>';
    
            return $result;
        }
    
        protected function renderItem($item)
        {
            $image = isset($item['image']) ? $item['image'] : '';
            $foto = '';
            foreach ($this->files as $file)
            {
                if ($image == $file)
                {
                    $foto = $file;
                }
            }
    var_dump($foto);
            $result = '';
    
            $escapeHtml = $this->getView()->plugin('escapeHtml');
    
            $result .= '<div class="row">';
            $result .= '<div class="col mb-1">';
            $result .= '<img src="'.('application', ['action'=>'file'],
                                    ['query'=>['name'=>$escapeHtml($foto)],  'thumbnail'=>true]).'" alt="" class="d-block w-100" data-toggle="modal" data-target="#exampleModal">';
            $result .= '</div>';
            $result .= '</div>';
    
    
            return $result;
        }
    }
  • Как правильно переделать строку?

    @T_verdisla_V Автор вопроса
    Не существует массива адресов. То что вы предлагаете, я использовал для меню. Посмотрите ссылку на ту же книгу только другой раздел. У меня передается в адрес только название файла.
  • Как правильно переделать строку?

    @T_verdisla_V Автор вопроса
    Мне надо в виджете прописать адрес фотографий.
  • Как правильно переделать строку?

    @T_verdisla_V Автор вопроса
    Используется Zend Framework3.
  • Как сделать выборку файлов по расширению?

    @T_verdisla_V Автор вопроса
    Возможно я неправильно задал вопрос.
    У меня БД есть имена картинок с расширением .jpg и .png, которые будут соответствовать первому условию. Мне нужно, что бы мой запрос к БД выдал мне именно те имена картинок, которые с расширением .png
  • Как правильно прописать класс тегу?

    @T_verdisla_V Автор вопроса
    Спасибо. Как я этого не заметил...
  • Правильно ли выполнено преобразование в twig?

    @T_verdisla_V Автор вопроса
    да.
    Меня интересует правильно ли я в twig написал, то что написано в login.phtml?
  • Как быть с контроллером?

    @T_verdisla_V Автор вопроса
    novrm: Начнем по порядку.
    Мой уровень познания ZF3, в принципе как и PHP, самый нижний из начинающих.
    Нет у меня defaults action index.
    CRUD у меня уже создан для управления category и products, только в другом модуле.
    В базе данных у меня сохраняется только название файла изображения, сам файл сохраняется в папке img. Из-за этого у меня и идет это условие<?php if ($product->getImage() == $file):?>
    С БД я взаимодействую через Doctrine, кстати сам пагинатор тоже ее, только обертка ZF3. Наверно я лучше покажу вам код с контроллера, может тогда вам легче понять меня будет.
    <?php
    
    namespace Shop\Controller;
    
    use Zend\Mvc\Controller\AbstractActionController;
    use Shop\Entity\Category;
    use Shop\Entity\Products;
    use Zend\View\Model\ViewModel;
    
    use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as DoctrineAdapter;
    use Doctrine\ORM\Tools\Pagination\Paginator as ORMPaginator;
    use Zend\Paginator\Paginator;
    
    class CategoryController extends AbstractActionController
    {
        /**
        * Менеджер сущностей.
        * @var Doctrine\ORM\EntityManager
        */
        protected $entityManager;
        
        /**
         * Менеджер продуктов.
         * @var Shop\Service\ProductManager 
         */
        protected $productManager;
      
        // Метод конструктора, используемый для внедрения зависимостей в контроллер.
        public function __construct($entityManager, $productManager) 
        {
            $this->entityManager = $entityManager;
            $this->productManager = $productManager;
        }
        
        public function indexAction()
        {       
            $categories = $this->entityManager->getRepository(Category::class)
                        ->getAllMainCatsWithChildren();
            
            // Получаем ID категории.         
            $categoryId = $this->params()->fromRoute('id', -1);
            
            // Находим существующую категорию в базе данных.    
            $cat = $this->entityManager->getRepository(Category::class)
                    ->ChildrenCategory($categoryId);          
            if ($cat == null) {
                $queries = $this->entityManager->getRepository(Products::class)
                              ->getProductsById($categoryId);                        
            } else {
                $ids = [];            
                foreach ($cat as $c) {
                    $ids[] = $c->getId(); 
                } 
                $queries = $this->entityManager->getRepository(Products::class)
                ->getProductsByCategoryIds($ids);   
            }
            
            // Получаем список уже сохраненных файлов.
            $files = $this->productManager->getSavedFiles();         
            $page = $this->params()->fromRoute('page', 1);
            
            $adapter = new DoctrineAdapter(new ORMPaginator($queries, false));
            $paginator = new Paginator($adapter);        
            $paginator->setDefaultItemCountPerPage(1);        
            $paginator->setCurrentPageNumber($page);
            // Визуализируем шаблон представления.       
            return new ViewModel([
                'categoryId'    => $categoryId,
                'categories'    => $categories,
                'products'      => $paginator,
                'files'         => $files,
            ]);        
        }
        
        public function fileAction() 
        {
            // Получаем имя файла из GET-переменной.
            $fileName = $this->params()->fromQuery('name', '');
    
            // Проверяем, что нужно пользователю: изображение в полном размере или миниатюра.
            $isThumbnail = (bool)$this->params()->fromQuery('thumbnail', false);
        
            // Получаем путь к файлу изображения.
            $fileName = $this->productManager->getImagePathByName($fileName);
            
            if($isThumbnail) {
            
                // Изменяем размер изображения.
                $fileName = $this->productManager->resizeImage($fileName);
            }
                    
            // Получаем информацию файла изображения (размер и MIME-тип).
            $fileInfo = $this->productManager->getImageFileInfo($fileName);        
            if ($fileInfo===false) {
                // Устанавливаем код состояния 404 Not Found
                $this->getResponse()->setStatusCode(404);            
                return;
            }
                    
            // Запсиываем HTTP-заголовки.
            $response = $this->getResponse();
            $headers = $response->getHeaders();
            $headers->addHeaderLine("Content-type: " . $fileInfo['type']);        
            $headers->addHeaderLine("Content-length: " . $fileInfo['size']);
                
            // Записываем содержимое файла.
            $fileContent = $this->productManager->getImageFileContent($fileName);
            if($fileContent!==false) {                
                $response->setContent($fileContent);
            } else {        
                // Устанавливаем код состояния 500 Server Error.
                $this->getResponse()->setStatusCode(500);
                return;
            }
            
            if($isThumbnail) {
                // Удаляем временный файл миниатюры изображения.
                unlink($fileName);
            }
            
            // Возвращаем экземпляр Response, чтобы избежать визуализации представления по умолчанию.
            return $this->getResponse();
        }    
    }


    p.s. Кстати по моему из-за того что
    'may_terminate' => true,
                'child_routes' => [
    
                    /** Configuration of the 'shop/category' routes. */
                    'category' => [
                        'type'    => 'Literal',
                        'options' => [
                            'route'    => 'category/',
                            'defaults' => [
                                'controller' => Controller\CategoryController::class,
                                'action'     => 'index',
                            ],
                        ],
    литеральный, не получается запустить fileaction, у меня уже было такое и мне пришлось переделать его в сегмент, правда у меня после него не было дочерних маршрутов.
  • Как быть с контроллером?

    @T_verdisla_V Автор вопроса
    public function indexAction()
        {    
            // Создаем меню  
            $categories = $this->entityManager->getRepository(Category::class)
                        ->getAllMainCatsWithChildren();
            
            // Получаем ID категории.         
            $categoryId = $this->params()->fromRoute('id', -1);
            
            // Находим существующую категорию в базе данных.    
            $cat = $this->entityManager->getRepository(Category::class)
                    ->ChildrenCategory($categoryId);          
            if ($cat == null) {
                $queries = $this->entityManager->getRepository(Products::class)
                              ->getProductsById($categoryId);                        
            } else {
                $ids = [];            
                foreach ($cat as $c) {
                    $ids[] = $c->getId(); 
                } 
                $queries = $this->entityManager->getRepository(Products::class)
                ->getProductsByCategoryIds($ids);   
            }
            
            // Получаем список уже сохраненных файлов.
            $files = $this->productManager->getSavedFiles();         
            $page = $this->params()->fromRoute('page', 1);
            
            $adapter = new DoctrineAdapter(new ORMPaginator($queries, false));
            $paginator = new Paginator($adapter);        
            $paginator->setDefaultItemCountPerPage(1);        
            $paginator->setCurrentPageNumber($page);
            // Визуализируем шаблон представления.       
            return new ViewModel([
                'categoryId'    => $categoryId,
                'categories'    => $categories,
                'products'      => $paginator,
                'files'         => $files,
            ]);        
        }