小编Moh*_*yan的帖子

如何根据Symfony2/3中的用户角色自定义表单字段?

是否有正确的方法来自定义表单,具体取决于请求它的用户的角色?

我的场景非常简单:如果用户没有被ROLE_ADMIN授予,我需要隐藏一些字段.我试图避免在Twig上显示字段,但是

  {% if is_granted('ROLE_ADMIN') %}
              {{form_row(form.field)}}
  {% endif %}
Run Code Online (Sandbox Code Playgroud)

不起作用,因为表单生成器绕过此检查.

Symfony版本:2.8.2

编辑

感谢@Rooneyl 建议,我找到了解决方案:

首先,您需要将"角色"键添加到options参数.因此,在configureOptions()$options['role']中始终是ROLE_USER.

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyBundle\Entity\Ticket',
        'role' => 'ROLE_USER'
    ));
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中你必须传递getRoles()数组:

$user_roles = $this->getUser()->getRoles();
$form = $this->createForm('MyBundle\Form\TicketType', $ticket, array('role' => $user_roles));
Run Code Online (Sandbox Code Playgroud)

formbuilder symfony symfony-2.8

11
推荐指数
2
解决办法
7292
查看次数

表单验证忽略空值

FormType:

class BranchFormType extends AbstractType {

 public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('name');
    }

    public function getName() {
        return 'branch';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'My\MainBundle\Entity\Branch',
        ));
    }

}
Run Code Online (Sandbox Code Playgroud)

在实体定义中:

<field name="name" column="name" type="string" length="255"/>
Run Code Online (Sandbox Code Playgroud)

没有nullable = true,并且字段在呈现时具有必需属性.

Validation.yml:

My\MainBundle\Entity\Branch:
    properties:
        name:
            - NotBlank: ~
Run Code Online (Sandbox Code Playgroud)

symfony是自动查找此文件还是必须包含在某处?doc只是声明表单自动使用验证服务.

控制器:

    $branch = new Branch();
    $form = $this->createForm(new BranchFormType(), $branch);

    if ($request->isMethod('POST')) {

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em->persist($branch);
            $em->flush();

            return $this->redirect($this->generateUrl('view_branch'));
        }
    }

    return $this->render('MyMainBundle:Branch:create.html.twig', array(
                'form' => $form->createView() …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony symfony-2.1

10
推荐指数
1
解决办法
4479
查看次数

如何在transform-origin和scrollbars之间切换

我上面的代码在CSS transform-origin和scale之间切换到CSS宽度和滚动条.

我需要进行此切换,因为我正在缩放我正在我的网站中使用的DIV包装.

我正在使用CSS translateX和translateY和Scale来实现更平滑的缩放缩放,但在进行缩放后,我需要返回宽度和滚动条,以便用户可以在布局中移动.

我在这里有一个例子,说明我是如何进行切换的,并且顶部有一点余地,我无法真正开始思考.

这样做的正确方法是什么?

var isOrigin = false;
        var originX = 500;
        var originY = 200;
        var scale = 1.5;
        var deltaX = 0;
        var deltaY = 0;

        var from_origin_to_scroll = function () {
            if (isOrigin) { from_scroll_to_origin(); return; }

            var wrap = $('.containter .wrap');

            //reset scroll
            const el = document.scrollingElement || document.documentElement;
            $('.containter')[0].scrollLeft = 0;
            el.scrollTop = 0;

            wrap.css({
                transformOrigin: originX + "px " + originY + "px",
                transform: "translate3d(" + deltaX + "px," + deltaY …
Run Code Online (Sandbox Code Playgroud)

html javascript css jquery

10
推荐指数
1
解决办法
338
查看次数

方法redirectToRoute()是否有像render()这样的参数?

我需要从symfony2访问twig中的实体.在控制器内部,我可以做一些事情:

return $this->render('frontendBundle::carrodecompras.html.twig', array(
        'entity' => $entity
));
Run Code Online (Sandbox Code Playgroud)

然后在树枝上我可以用entity.name这样的方式访问实体属性.

我需要完成相同的功能,但功能 redirectToRoute()

return $this->redirectToRoute('frontend_carrodecompras', array(
        'entity' => $entity,
));
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.

我收到以下错误:

第32行的frontendBundle :: carrodecompras.html.twig中不存在变量"entity"

编辑:我正在使用Symfony 2.7

变量$ entity存在(它实际上在应用程序中称为$ cortina我使用$ entity进行简化),就在redirectToRoute函数之前,我这样做是为了测试它

echo "<pre>";
var_dump($cortina);
echo "</pre>";

return $this->redirectToRoute('frontend_carrodecompras', array(
                'cortina' => $cortina,
                ));
Run Code Online (Sandbox Code Playgroud)

结果如下:

object(dexter\backendBundle\Entity\cortina)#373 (16) {
  ["id":"dexter\backendBundle\Entity\cortina":private]=>
  int(3)
  ...
Run Code Online (Sandbox Code Playgroud)

这是Twig代码:

<tr>
    {% set imagentela = "img/telas/" ~ cortina.codInterno ~ ".jpg" %}
    <td><img src="{{ asset(imagentela | lower ) }}" alt="" width="25" height="25">
    </td>
    <td>{{ cortina.nombre }}</td>
    <td>{{ "$" ~ cortina.precio|number_format('0',',','.') …
Run Code Online (Sandbox Code Playgroud)

php redirect routing symfony

7
推荐指数
1
解决办法
3万
查看次数

如何清除Doctrine APC缓存以进行生产?

当我向我的一个实体添加一个列并将其发布用于生产时,我有这个问题我必须重新启动Apache才能清除Doctrine元数据APC/APCU缓存.

我已尝试过以下所有命令,但没有一个对我有用:

php -r "apc_clear_cache();"
php -r "apcu_clear_cache();"

sudo php app/console doctrine:cache:clear-metadata
sudo php app/console doctrine:cache:clear-query
sudo php app/console doctrine:cache:clear-result
Run Code Online (Sandbox Code Playgroud)

我收到了--env = prod的错误消息

sudo php app/console doctrine:cache:clear-metadata  --env=prod
sudo php app/console doctrine:cache:clear-query  --env=prod
sudo php app/console doctrine:cache:clear-result --env=prod

 [LogicException]
  Cannot clear APC Cache from Console, its share in the Web server memory and not accessible from the CLI.
Run Code Online (Sandbox Code Playgroud)

我可以让它刷新Doctrine缓存的唯一方法是重启我的apache服务器,这有时可能是一个问题.

我的Symfony项目中Doctine的缓存设置:

doctrine:
    orm:
        metadata_cache_driver: apc
        result_cache_driver: apc
        query_cache_driver: apc
        second_level_cache:
            enabled: true
            log_enabled: false
            region_cache_driver: apc
Run Code Online (Sandbox Code Playgroud)

在每次向生产发布新架构更新时,如何在不重新启动Apache的情况下清除APC缓存.如果负载均衡器后面有许多服务器,情况会更糟.

caching apc symfony doctrine-orm apcu

5
推荐指数
1
解决办法
4723
查看次数

MacOS和JSVC:SCARD_E_NO_SERVICE:智能卡资源管理器未运行

我有一个需要在MacOS Sierra中作为守护进程运行的JAR文件,我决定使用Apache Commons Daemon和JSVC来达到这个目的.我知道也许JSVC并不是真的需要用于此目的(它似乎只允许在低范围内打开端口)并且可以通过系统/启动实现相同的功能,因此任何有或没有JSVC的帮助/解决方案都是值得赞赏的.

这就是我从命令行运行jar的方法,它运行正常.它使用端口8085打开WebSocket连接,并等待传入​​连接.然后,它连接到智能卡读卡器并从卡中获取一些数据.

java -cp "myjar.jar:jars/*" full_class_name
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用Apache Commons Daemon接口和JSVC运行相同的jar时,jar正常启动并开始在端口8085中侦听.

./jsvc -debug -cp commons-daemon-1.1.0.jar:myjar.jar:jars/* -cwd . -pidfile /tmp/file.pid full_class_name
Run Code Online (Sandbox Code Playgroud)

问题是,出于某种原因,尝试连接智能卡读卡器时会出现异常.

INFORMACIÓN: WebSocket Registered apps: URLs all start with ws://localhost:8085
may 15, 2018 10:04:37 AM org.glassfish.tyrus.server.Server start
INFORMACIÓN: WebSocket server started.
LISTENING
Daemon started successfully
java_start done
Waiting for a signal to be delivered
create_tmp_file: /tmp/541.jsvc_up
jnasmartcardio.Smartcardio$EstablishContextException: jnasmartcardio.Smartcardio$JnaPCSCException: SCardEstablishContext got response 0x8010001d (SCARD_E_NO_SERVICE: The Smart card resource manager is not running.)
    at jnasmartcardio.Smartcardio$JnaTerminalFactorySpi.engineTerminals(Smartcardio.java:81)
    at javax.smartcardio.TerminalFactory.terminals(TerminalFactory.java:351)
    at apdu4j.TerminalManager.getTheReader(TerminalManager.java:228)
    at com.st.middleware.a.a.b.connect(SourceFile:24) …
Run Code Online (Sandbox Code Playgroud)

macos smartcard jsvc

5
推荐指数
1
解决办法
190
查看次数

安装moodle

我想在我的服务器上安装moodle.我在public html文件夹中解压缩了moodle包.此moodle文件夹具有755访问权限集.然后我在同一个文件夹中创建了moodle数据文件夹,public_html并在其中使用777.然后我尝试运行安装,但我总是得到error: Data directory (/home/studentai/***/data) cannot be created by the installer.但我手动创建了它.那问题出在哪里?

installation moodle

4
推荐指数
1
解决办法
3626
查看次数

从String中设置Symfony2中的DateTime和Time

在我的实体中,我有两个字段,一个是DateTime,另一个是Time.

我正在尝试这样做:

$time = "05:45";
$date = "01-09-2015"

$entity = new Entity();
$entity->setDate(new \DateTime($date));
$entity->setTime($time);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,Symfony都告诉我代码格式有问题.

我也尝试过:

->setDate(new Datetime($date));
->setDate(DateTime::createFromFormat($date, 'd-m-Y));
->setTime(strtotime($time));
Run Code Online (Sandbox Code Playgroud)

始终具有相同的结果.

如果有人能帮助我,我会感激的.

谢谢


更新

现在,我试过了

$date = strtotime($date);
$time = strtotime($time);
$entity->setDate(date("d-m-Y", $date));
$entity->setTime(date("H:i",$time));
Run Code Online (Sandbox Code Playgroud)

Symfony告诉我:

错误:在非对象上调用成员函数format()

in vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/TimeType.php at line 53   -
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return ($value !== null)
            ? $value->format($platform->getTimeFormatString()) : null;
    }
    /**
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

$dateObject = new DateTime();
$date = $dateObject->format('d-m-Y');
$time = $dateObject->format('H:i');
$entity->setDate($date);
$entity->setTime($time);
Run Code Online (Sandbox Code Playgroud)

而symfony告诉我:

Attempted to call method "format" on …
Run Code Online (Sandbox Code Playgroud)

php time datetime symfony symfony-2.1

4
推荐指数
1
解决办法
2万
查看次数

将参数传递给所有视图

我想在我的所有Twig视图上显示用户名/最后连接日期/时间和一些其他信息(这些视图都来自常见的Twig布局).

如何在不必将每个控制器的参数显式传递给每个视图的情况下实现这一目标?

我是否必须创建一个Twig扩展,或者调用一个控制器/动作,它将使用渲染从布局中检索用户名/连接/其他信息?

如果可能的话,我想要一个更简单的解决方案.

controller parameter-passing symfony twig

3
推荐指数
1
解决办法
1万
查看次数

即使我安装了PHP7并将其添加为解释器,PhpStorm项目仍然使用PHP5

我试图在项目上运行composer install并收到此错误:

问题1
- 此软件包需要php ^ 7.0.0,但您的PHP版本(5.5.12)不满足该要求.

所以我已经安装从php.net下载了PHP 7 zip然后按照本教程一步一步,直到(并包括)第4步https://www.sitepoint.com/how-to-install-php-on-windows/

然后在步骤5,命令不起作用,我停了下来.我已经在PhpStrom中添加了PHP 7作为解释器,如下图所示,但是当我composer install再次运行它仍然给我同样的错误.

php解释器

请告诉我如何解决这个问题.提前致谢.

php php-ide phpstorm php-7

3
推荐指数
1
解决办法
453
查看次数